Skip to content

Commit

Permalink
fix: count tokens from tool definitions when adjusting for context wi…
Browse files Browse the repository at this point in the history
…ndow

Signed-off-by: Grant Linville <[email protected]>
  • Loading branch information
g-linville committed Jan 30, 2025
1 parent 7ee5c80 commit 378eb46
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 6 deletions.
18 changes: 12 additions & 6 deletions pkg/openai/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -331,7 +331,12 @@ func (c *Client) Call(ctx context.Context, messageRequest types.CompletionReques
messageRequest.Messages[len(messageRequest.Messages)-1].Content = types.Text(TooLongMessage)
}

msgs = dropMessagesOverCount(messageRequest.MaxTokens, msgs)
toolsCount, err := countChatCompletionTools(messageRequest.Tools)
if err != nil {
return nil, err
}

msgs = dropMessagesOverCount(messageRequest.MaxTokens-toolsCount, msgs)
}

if len(msgs) == 0 {
Expand Down Expand Up @@ -447,14 +452,15 @@ func (c *Client) Call(ctx context.Context, messageRequest types.CompletionReques
}

func (c *Client) contextLimitRetryLoop(ctx context.Context, request openai.ChatCompletionRequest, id string, env []string, maxTokens int, status chan<- types.CompletionStatus) (types.CompletionMessage, error) {
var (
response types.CompletionMessage
err error
)
toolsCount, err := countOpenAITools(request.Tools)
if err != nil {
return types.CompletionMessage{}, err
}

var response types.CompletionMessage
for range 10 { // maximum 10 tries
// Try to drop older messages again, with a decreased max tokens.
request.Messages = dropMessagesOverCount(maxTokens, request.Messages)
request.Messages = dropMessagesOverCount(maxTokens-toolsCount, request.Messages)
response, err = c.call(ctx, request, id, env, status)
if err == nil {
return response, nil
Expand Down
29 changes: 29 additions & 0 deletions pkg/openai/count.go
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
package openai

import (
"encoding/json"

openai "github.com/gptscript-ai/chat-completion-client"
"github.com/gptscript-ai/gptscript/pkg/types"
)

const DefaultMaxTokens = 128_000
Expand Down Expand Up @@ -73,3 +76,29 @@ func countMessage(msg openai.ChatCompletionMessage) (count int) {
count += len(msg.ToolCallID)
return count / 3
}

func countChatCompletionTools(tools []types.ChatCompletionTool) (count int, err error) {
for _, t := range tools {
count += len(t.Function.Name)
count += len(t.Function.Description)
paramsJSON, err := json.Marshal(t.Function.Parameters)
if err != nil {
return 0, err
}
count += len(paramsJSON)
}
return count / 3, nil
}

func countOpenAITools(tools []openai.Tool) (count int, err error) {
for _, t := range tools {
count += len(t.Function.Name)
count += len(t.Function.Description)
paramsJSON, err := json.Marshal(t.Function.Parameters)
if err != nil {
return 0, err
}
count += len(paramsJSON)
}
return count / 3, nil
}

0 comments on commit 378eb46

Please sign in to comment.