diff --git a/cmd/agent.go b/cmd/agent.go index 33a62082..06e158d1 100644 --- a/cmd/agent.go +++ b/cmd/agent.go @@ -494,7 +494,7 @@ func (s *AgentSession) buildSDKMessages() []sdk.Message { } if msg.ToolCallID != "" { - sdkMsg.ToolCallId = &msg.ToolCallID + sdkMsg.ToolCallID = &msg.ToolCallID } messages = append(messages, sdkMsg) @@ -635,7 +635,7 @@ func (s *AgentSession) executeToolCallsParallel(toolCalls []sdk.ChatCompletionMe results[index] = ConversationMessage{ Role: "tool", Content: fmt.Sprintf("Tool execution failed: %s", err.Error()), - ToolCallID: tc.Id, + ToolCallID: tc.ID, ToolExecution: errorResult, Timestamp: time.Now(), } @@ -645,7 +645,7 @@ func (s *AgentSession) executeToolCallsParallel(toolCalls []sdk.ChatCompletionMe results[index] = ConversationMessage{ Role: "tool", Content: s.formatToolResult(result), - ToolCallID: tc.Id, + ToolCallID: tc.ID, ToolExecution: result, Timestamp: time.Now(), } @@ -718,7 +718,7 @@ func (s *AgentSession) executeToolCallsWithApproval(toolCalls []sdk.ChatCompleti results[idx] = ConversationMessage{ Role: "tool", Content: fmt.Sprintf("Tool execution failed: %s", err.Error()), - ToolCallID: tc.Id, + ToolCallID: tc.ID, ToolExecution: &domain.ToolExecutionResult{ ToolName: tc.Function.Name, Success: false, @@ -731,7 +731,7 @@ func (s *AgentSession) executeToolCallsWithApproval(toolCalls []sdk.ChatCompleti results[idx] = ConversationMessage{ Role: "tool", Content: s.formatToolResult(result), - ToolCallID: tc.Id, + ToolCallID: tc.ID, ToolExecution: result, Timestamp: time.Now(), } @@ -757,7 +757,7 @@ func (s *AgentSession) executeToolCallsWithApproval(toolCalls []sdk.ChatCompleti results[ic.index] = ConversationMessage{ Role: "tool", Content: fmt.Sprintf("Tool '%s' was rejected by the user.", tc.Function.Name), - ToolCallID: tc.Id, + ToolCallID: tc.ID, ToolExecution: &domain.ToolExecutionResult{ ToolName: tc.Function.Name, Success: false, @@ -774,7 +774,7 @@ func (s *AgentSession) executeToolCallsWithApproval(toolCalls []sdk.ChatCompleti results[ic.index] = ConversationMessage{ Role: "tool", Content: fmt.Sprintf("Tool execution failed: %s", err.Error()), - ToolCallID: tc.Id, + ToolCallID: tc.ID, ToolExecution: &domain.ToolExecutionResult{ ToolName: tc.Function.Name, Success: false, @@ -787,7 +787,7 @@ func (s *AgentSession) executeToolCallsWithApproval(toolCalls []sdk.ChatCompleti results[ic.index] = ConversationMessage{ Role: "tool", Content: s.formatToolResult(result), - ToolCallID: tc.Id, + ToolCallID: tc.ID, ToolExecution: result, Timestamp: time.Now(), } @@ -839,7 +839,7 @@ func (s *AgentSession) outputApprovalRequest(tc sdk.ChatCompletionMessageToolCal Type: "approval_request", ToolName: tc.Function.Name, ToolArgs: tc.Function.Arguments, - ToolCallID: tc.Id, + ToolCallID: tc.ID, } output, err := json.Marshal(req) if err != nil { @@ -883,7 +883,7 @@ func (s *AgentSession) convertToConversationEntry(msg ConversationMessage) domai } if msg.ToolCallID != "" { - sdkMsg.ToolCallId = &msg.ToolCallID + sdkMsg.ToolCallID = &msg.ToolCallID } entry := domain.ConversationEntry{ @@ -926,8 +926,8 @@ func (s *AgentSession) convertFromConversationEntry(entry domain.ConversationEnt msg.ToolCalls = entry.Message.ToolCalls } - if entry.Message.ToolCallId != nil { - msg.ToolCallID = *entry.Message.ToolCallId + if entry.Message.ToolCallID != nil { + msg.ToolCallID = *entry.Message.ToolCallID } if entry.ToolExecution != nil { diff --git a/cmd/agent_test.go b/cmd/agent_test.go index 5d822be3..d48f77e3 100644 --- a/cmd/agent_test.go +++ b/cmd/agent_test.go @@ -244,7 +244,7 @@ func TestExecuteToolCallsParallel(t *testing.T) { name: "single tool call", toolCalls: []sdk.ChatCompletionMessageToolCall{ { - Id: "call_1", + ID: "call_1", Function: sdk.ChatCompletionMessageToolCallFunction{ Name: "Read", Arguments: `{"file_path": "test.txt"}`, @@ -267,21 +267,21 @@ func TestExecuteToolCallsParallel(t *testing.T) { name: "multiple tool calls", toolCalls: []sdk.ChatCompletionMessageToolCall{ { - Id: "call_1", + ID: "call_1", Function: sdk.ChatCompletionMessageToolCallFunction{ Name: "Read", Arguments: `{"file_path": "test1.txt"}`, }, }, { - Id: "call_2", + ID: "call_2", Function: sdk.ChatCompletionMessageToolCallFunction{ Name: "Grep", Arguments: `{"pattern": "func"}`, }, }, { - Id: "call_3", + ID: "call_3", Function: sdk.ChatCompletionMessageToolCallFunction{ Name: "Write", Arguments: `{"file_path": "output.txt", "content": "hello"}`, @@ -302,7 +302,7 @@ func TestExecuteToolCallsParallel(t *testing.T) { name: "tool call with error", toolCalls: []sdk.ChatCompletionMessageToolCall{ { - Id: "call_1", + ID: "call_1", Function: sdk.ChatCompletionMessageToolCallFunction{ Name: "Read", Arguments: `{"file_path": "nonexistent.txt"}`, @@ -388,14 +388,14 @@ func TestProcessSyncResponseParallel(t *testing.T) { Content: "I'll help you with that.", ToolCalls: []sdk.ChatCompletionMessageToolCall{ { - Id: "call_1", + ID: "call_1", Function: sdk.ChatCompletionMessageToolCallFunction{ Name: "Read", Arguments: `{"file_path": "test.txt"}`, }, }, { - Id: "call_2", + ID: "call_2", Function: sdk.ChatCompletionMessageToolCallFunction{ Name: "Grep", Arguments: `{"pattern": "test"}`, @@ -581,7 +581,7 @@ func getAssistantMessageWithToolCallsTestCase() struct { Content: sdk.NewMessageContent(""), ToolCalls: &[]sdk.ChatCompletionMessageToolCall{ { - Id: "call_1", + ID: "call_1", Function: sdk.ChatCompletionMessageToolCallFunction{ Name: "Read", Arguments: `{"file_path":"test.txt"}`, @@ -598,7 +598,7 @@ func getAssistantMessageWithToolCallsTestCase() struct { Timestamp: mockTime(), ToolCalls: &[]sdk.ChatCompletionMessageToolCall{ { - Id: "call_1", + ID: "call_1", Function: sdk.ChatCompletionMessageToolCallFunction{ Name: "Read", Arguments: `{"file_path":"test.txt"}`, @@ -624,7 +624,7 @@ func getToolResponseWithToolCallIDTestCase() struct { Message: sdk.Message{ Role: sdk.Tool, Content: sdk.NewMessageContent("File content here"), - ToolCallId: stringPtr("call_1"), + ToolCallID: stringPtr("call_1"), }, Model: "openai/gpt-4", Time: mockTime(), @@ -723,7 +723,7 @@ func getMessageWithToolExecutionMetadataTestCase() struct { Message: sdk.Message{ Role: sdk.Tool, Content: sdk.NewMessageContent("Result data"), - ToolCallId: stringPtr("call_2"), + ToolCallID: stringPtr("call_2"), }, Model: "openai/gpt-4", Time: mockTime(), @@ -793,7 +793,7 @@ func TestReasoningContentRoundTripSyncPath(t *testing.T) { Content: "", ReasoningContent: reasoning, ToolCalls: []sdk.ChatCompletionMessageToolCall{{ - Id: "call_1", + ID: "call_1", Function: sdk.ChatCompletionMessageToolCallFunction{ Name: "Bash", Arguments: `{"command":"echo hi"}`, @@ -826,7 +826,7 @@ func TestReasoningContentRoundTripSyncPath(t *testing.T) { Content: "", ReasoningContent: reasoning, ToolCalls: &[]sdk.ChatCompletionMessageToolCall{{ - Id: "call_1", + ID: "call_1", Function: sdk.ChatCompletionMessageToolCallFunction{ Name: "Bash", Arguments: `{"command":"echo hi"}`, }, diff --git a/go.mod b/go.mod index af5436ab..65d7f114 100644 --- a/go.mod +++ b/go.mod @@ -19,7 +19,7 @@ require ( github.com/google/uuid v1.6.0 github.com/gorilla/websocket v1.5.3 github.com/inference-gateway/adk v0.17.3 - github.com/inference-gateway/sdk v1.16.2 + github.com/inference-gateway/sdk v1.16.3 github.com/ledongthuc/pdf v0.0.0-20250511090121-5959a4027728 github.com/lib/pq v1.12.3 github.com/metoro-io/mcp-golang v0.16.1 @@ -68,7 +68,7 @@ require ( github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f // indirect github.com/gen2brain/shm v0.2.1 // indirect github.com/go-ole/go-ole v1.3.0 // indirect - github.com/go-resty/resty/v2 v2.16.5 // indirect + github.com/go-resty/resty/v2 v2.17.2 // indirect github.com/go-viper/mapstructure/v2 v2.4.0 // indirect github.com/godbus/dbus/v5 v5.2.2 // indirect github.com/gorilla/css v1.0.1 // indirect @@ -91,7 +91,7 @@ require ( github.com/muesli/cancelreader v0.2.2 // indirect github.com/muesli/termenv v0.16.0 // indirect github.com/ncruces/go-strftime v1.0.0 // indirect - github.com/oapi-codegen/runtime v1.1.2 // indirect + github.com/oapi-codegen/runtime v1.4.0 // indirect github.com/otiai10/gosseract/v2 v2.4.1 // indirect github.com/pelletier/go-toml/v2 v2.2.4 // indirect github.com/pkg/errors v0.9.1 // indirect diff --git a/go.sum b/go.sum index ddd50393..26d7b6f0 100644 --- a/go.sum +++ b/go.sum @@ -106,8 +106,8 @@ github.com/go-playground/validator/v10 v10.24.0 h1:KHQckvo8G6hlWnrPX4NJJ+aBfWNAE github.com/go-playground/validator/v10 v10.24.0/go.mod h1:GGzBIJMuE98Ic/kJsBXbz1x/7cByt++cQ+YOuDM5wus= github.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC0oI= github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo= -github.com/go-resty/resty/v2 v2.16.5 h1:hBKqmWrr7uRc3euHVqmh1HTHcKn99Smr7o5spptdhTM= -github.com/go-resty/resty/v2 v2.16.5/go.mod h1:hkJtXbA2iKHzJheXYvQ8snQES5ZLGKMwQ07xAwp/fiA= +github.com/go-resty/resty/v2 v2.17.2 h1:FQW5oHYcIlkCNrMD2lloGScxcHJ0gkjshV3qcQAyHQk= +github.com/go-resty/resty/v2 v2.17.2/go.mod h1:kCKZ3wWmwJaNc7S29BRtUhJwy7iqmn+2mLtQrOyQlVA= github.com/go-telegram/bot v1.20.0 h1:4Pea/qTidSspr4WBJw9FbHUMNhYeqszBqQUfsQEyFbc= github.com/go-telegram/bot v1.20.0/go.mod h1:i2TRs7fXWIeaceF3z7KzsMt/he0TwkVC680mvdTFYeM= github.com/go-vgo/robotgo v1.0.2 h1:MbhSoJSzv/PNr2dL6H0Z1IUL4Uypsk2b9lQsGQ15hjU= @@ -137,8 +137,8 @@ github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2 github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/inference-gateway/adk v0.17.3 h1:ZZpJBoCn+KbBPnWUUQwp9SFW7fCfsrMWMa0K62VjjN4= github.com/inference-gateway/adk v0.17.3/go.mod h1:UbWW5qTu/VzF3mnGTSOJgbyAy6Rz08GH+zI6zhDQUEs= -github.com/inference-gateway/sdk v1.16.2 h1:9sw/42Icwcsb4cSDx0ELqF4WhU95IRBVNvirDXIv6OY= -github.com/inference-gateway/sdk v1.16.2/go.mod h1:lNTq/c42VviO2pKPXdvEf/cWwFpgQjSX7CUP1F7T+0U= +github.com/inference-gateway/sdk v1.16.3 h1:qIiqYePG4GQyWE92iEPmxQsR0jBJDAG0u9h50CbspcU= +github.com/inference-gateway/sdk v1.16.3/go.mod h1:Qcm7duXS/Hz/xvs8yQhxLUbCUTWN/x88+npRWyeRst4= github.com/invopop/jsonschema v0.12.0 h1:6ovsNSuvn9wEQVOyc72aycBMVQFKz7cPdMJn10CvzRI= github.com/invopop/jsonschema v0.12.0/go.mod h1:ffZ5Km5SWWRAIN6wbDXItl95euhFz2uON45H2qjYt+0= github.com/jezek/xgb v1.3.0 h1:Wa1pn4GVtcmNVAVB6/pnQVJ7xPFZVZ/W1Tc27msDhgI= @@ -199,8 +199,8 @@ github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 h1:zYyBkD/k9seD2A7fsi6 github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= -github.com/oapi-codegen/runtime v1.1.2 h1:P2+CubHq8fO4Q6fV1tqDBZHCwpVpvPg7oKiYzQgXIyI= -github.com/oapi-codegen/runtime v1.1.2/go.mod h1:SK9X900oXmPWilYR5/WKPzt3Kqxn/uS/+lbpREv+eCg= +github.com/oapi-codegen/runtime v1.4.0 h1:KLOSFOp7UzkbS7Cs1ms6NBEKYr0WmH2wZG0KKbd2er4= +github.com/oapi-codegen/runtime v1.4.0/go.mod h1:5sw5fxCDmnOzKNYmkVNF8d34kyUeejJEY8HNT2WaPec= github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= github.com/onsi/gomega v1.37.0 h1:CdEG8g0S133B4OswTDC/5XPSzE1OeP29QOioj2PID2Y= @@ -341,8 +341,8 @@ golang.org/x/term v0.43.0 h1:S4RLU2sB31O/NCl+zFN9Aru9A/Cq2aqKpTZJ6B+DwT4= golang.org/x/term v0.43.0/go.mod h1:lrhlHNdQJHO+1qVYiHfFKVuVioJIheAc3fBSMFYEIsk= golang.org/x/text v0.37.0 h1:Cqjiwd9eSg8e0QAkyCaQTNHFIIzWtidPahFWR83rTrc= golang.org/x/text v0.37.0/go.mod h1:a5sjxXGs9hsn/AJVwuElvCAo9v8QYLzvavO5z2PiM38= -golang.org/x/time v0.6.0 h1:eTDhh4ZXt5Qf0augr54TN6suAUudPcawVZeIAPU7D4U= -golang.org/x/time v0.6.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +golang.org/x/time v0.14.0 h1:MRx4UaLrDotUKUdCIqzPC48t1Y9hANFKIRpNx+Te8PI= +golang.org/x/time v0.14.0/go.mod h1:eL/Oa2bBBK0TkX57Fyni+NgnyQQN4LitPmob2Hjnqw4= golang.org/x/tools v0.44.0 h1:UP4ajHPIcuMjT1GqzDWRlalUEoY+uzoZKnhOjbIPD2c= golang.org/x/tools v0.44.0/go.mod h1:KA0AfVErSdxRZIsOVipbv3rQhVXTnlU6UhKxHd1seDI= google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY= diff --git a/internal/agent/agent.go b/internal/agent/agent.go index 7aea9142..610b6368 100644 --- a/internal/agent/agent.go +++ b/internal/agent/agent.go @@ -120,7 +120,7 @@ func (p *eventPublisher) publishToolsQueued(toolCalls []sdk.ChatCompletionMessag RequestID: p.requestID, Timestamp: time.Now(), }, - ToolCallID: tc.Id, + ToolCallID: tc.ID, ToolName: tc.Function.Name, Arguments: tc.Function.Arguments, Status: "queued", @@ -690,7 +690,7 @@ func (s *AgentServiceImpl) executeToolCallsParallel( // nolint:funlen } } - eventPublisher.publishToolStatusChange(at.tool.Id, at.tool.Function.Name, status, message, images) + eventPublisher.publishToolStatusChange(at.tool.ID, at.tool.Function.Name, status, message, images) results[at.index] = result } @@ -712,7 +712,7 @@ func (s *AgentServiceImpl) executeToolCallsParallel( // nolint:funlen }() eventPublisher.publishToolStatusChange( - toolCall.Id, + toolCall.ID, toolCall.Function.Name, "starting", fmt.Sprintf("Initializing %s...", toolCall.Function.Name), nil, @@ -733,7 +733,7 @@ func (s *AgentServiceImpl) executeToolCallsParallel( // nolint:funlen images = result.ToolExecution.Images } - eventPublisher.publishToolStatusChange(toolCall.Id, toolCall.Function.Name, status, message, images) + eventPublisher.publishToolStatusChange(toolCall.ID, toolCall.Function.Name, status, message, images) resultsChan <- IndexedToolResult{ Index: index, @@ -779,11 +779,11 @@ func (s *AgentServiceImpl) executeTool( approved, err := s.requestToolApproval(ctx, tc, eventPublisher) if err != nil { logger.Error("failed to request tool approval", "tool", tc.Function.Name, "error", err) - s.conversationRepo.RemovePendingToolCallByID(tc.Id) + s.conversationRepo.RemovePendingToolCallByID(tc.ID) return s.createErrorEntry(tc, err, startTime) } if !approved { - s.conversationRepo.RemovePendingToolCallByID(tc.Id) + s.conversationRepo.RemovePendingToolCallByID(tc.ID) return s.createRejectionEntry(tc, startTime) } wasApproved = true @@ -803,7 +803,7 @@ func (s *AgentServiceImpl) executeToolInternal( wasApproved bool, startTime time.Time, ) domain.ConversationEntry { - eventPublisher.publishToolStatusChange(tc.Id, tc.Function.Name, "running", "Executing...", nil) + eventPublisher.publishToolStatusChange(tc.ID, tc.Function.Name, "running", "Executing...", nil) time.Sleep(constants.AgentToolExecutionDelay) @@ -840,7 +840,7 @@ func (s *AgentServiceImpl) executeToolInternal( if tc.Function.Name == "Bash" { bashCallback := func(line string) { - eventPublisher.publishBashOutputChunk(tc.Id, line, false) + eventPublisher.publishBashOutputChunk(tc.ID, line, false) } execCtx = domain.WithBashOutputCallback(execCtx, bashCallback) @@ -883,7 +883,7 @@ func (s *AgentServiceImpl) executeToolInternal( ticker.Stop() resultReceived = true case <-ticker.C: - eventPublisher.publishToolStatusChange(tc.Id, tc.Function.Name, "running", "Processing...", nil) + eventPublisher.publishToolStatusChange(tc.ID, tc.Function.Name, "running", "Processing...", nil) case <-ctx.Done(): logger.Error("tool execution cancelled", "tool", tc.Function.Name) return s.createErrorEntry(tc, ctx.Err(), startTime) @@ -895,7 +895,7 @@ func (s *AgentServiceImpl) executeToolInternal( return s.createErrorEntry(tc, err, startTime) } - eventPublisher.publishToolStatusChange(tc.Id, tc.Function.Name, "saving", "Saving results...", nil) + eventPublisher.publishToolStatusChange(tc.ID, tc.Function.Name, "saving", "Saving results...", nil) time.Sleep(constants.AgentToolExecutionDelay) @@ -929,14 +929,14 @@ func (s *AgentServiceImpl) executeToolInternal( Message: domain.Message{ Role: sdk.Tool, Content: sdk.NewMessageContent(formattedContent), - ToolCallId: &tc.Id, + ToolCallID: &tc.ID, }, Time: time.Now(), ToolExecution: toolExecutionResult, } if wasApproved { - s.conversationRepo.RemovePendingToolCallByID(tc.Id) + s.conversationRepo.RemovePendingToolCallByID(tc.ID) } return entry @@ -989,7 +989,7 @@ func (s *AgentServiceImpl) addToolResultsToConversation(toolResults []domain.Con toolResult := sdk.Message{ Role: sdk.Tool, Content: entry.Message.Content, - ToolCallId: entry.Message.ToolCallId, + ToolCallID: entry.Message.ToolCallID, } *conversation = append(*conversation, toolResult) } @@ -1146,7 +1146,7 @@ func (s *AgentServiceImpl) createErrorEntry(tc sdk.ChatCompletionMessageToolCall Message: domain.Message{ Role: sdk.Tool, Content: sdk.NewMessageContent(fmt.Sprintf("Tool execution failed: %s - %s", tc.Function.Name, err.Error())), - ToolCallId: &tc.Id, + ToolCallID: &tc.ID, }, Time: time.Now(), ToolExecution: &domain.ToolExecutionResult{ @@ -1174,7 +1174,7 @@ func (s *AgentServiceImpl) createRejectionEntry(tc sdk.ChatCompletionMessageTool Message: domain.Message{ Role: sdk.Tool, Content: sdk.NewMessageContent(rejectionMessage), - ToolCallId: &tc.Id, + ToolCallID: &tc.ID, }, Time: time.Now(), ToolExecution: &domain.ToolExecutionResult{ diff --git a/internal/agent/agent_event_driven_test.go b/internal/agent/agent_event_driven_test.go index c24c5b9a..9a062c18 100644 --- a/internal/agent/agent_event_driven_test.go +++ b/internal/agent/agent_event_driven_test.go @@ -255,7 +255,7 @@ func TestHandleStreamingState(t *testing.T) { }, ToolCalls: []*sdk.ChatCompletionMessageToolCall{ { - Id: "call-1", + ID: "call-1", Function: sdk.ChatCompletionMessageToolCallFunction{ Name: "Read", Arguments: `{"file":"test.txt"}`, @@ -378,7 +378,7 @@ func TestHandleEvaluatingToolsState(t *testing.T) { agent.currentToolCalls = []*sdk.ChatCompletionMessageToolCall{ { - Id: "call-1", + ID: "call-1", Function: sdk.ChatCompletionMessageToolCallFunction{ Name: "Write", Arguments: `{"file":"test.txt"}`, @@ -415,7 +415,7 @@ func TestHandleEvaluatingToolsState(t *testing.T) { agent.currentToolCalls = []*sdk.ChatCompletionMessageToolCall{ { - Id: "call-1", + ID: "call-1", Function: sdk.ChatCompletionMessageToolCallFunction{ Name: "Read", Arguments: `{"file":"test.txt"}`, @@ -614,7 +614,7 @@ func TestHandleApprovingToolsState(t *testing.T) { agent.req = &domain.AgentRequest{RequestID: "test-123", Model: "test-model"} toolCall1 := &sdk.ChatCompletionMessageToolCall{ - Id: "call-1", + ID: "call-1", Type: sdk.Function, Function: sdk.ChatCompletionMessageToolCallFunction{ Name: "test_tool", diff --git a/internal/agent/agent_helpers_test.go b/internal/agent/agent_helpers_test.go index bd73d7fd..fea18584 100644 --- a/internal/agent/agent_helpers_test.go +++ b/internal/agent/agent_helpers_test.go @@ -19,7 +19,7 @@ func TestAccumulateToolCalls(t *testing.T) { callID := "call-1" deltas := []sdk.ChatCompletionMessageToolCallChunk{ - {Index: 0, Id: &callID, Function: &sdk.ChatCompletionMessageToolCallFunction{Name: "Read", Arguments: `{"file":`}}, + {Index: 0, ID: &callID, Function: &sdk.ChatCompletionMessageToolCallFunction{Name: "Read", Arguments: `{"file":`}}, {Index: 0, Function: &sdk.ChatCompletionMessageToolCallFunction{Arguments: `"test.txt"}`}}, } @@ -27,7 +27,7 @@ func TestAccumulateToolCalls(t *testing.T) { assert.Equal(t, 1, len(agentService.toolCallsMap)) assert.Contains(t, agentService.toolCallsMap, "0") - assert.Equal(t, "call-1", agentService.toolCallsMap["0"].Id) + assert.Equal(t, "call-1", agentService.toolCallsMap["0"].ID) assert.Equal(t, "Read", agentService.toolCallsMap["0"].Function.Name) assert.Equal(t, `{"file":"test.txt"}`, agentService.toolCallsMap["0"].Function.Arguments) } @@ -36,17 +36,17 @@ func TestAccumulateToolCalls(t *testing.T) { func TestGetAccumulatedToolCalls(t *testing.T) { agentService := &AgentServiceImpl{ toolCallsMap: map[string]*sdk.ChatCompletionMessageToolCall{ - "0": {Id: "call-1", Function: sdk.ChatCompletionMessageToolCallFunction{Name: "Read"}}, - "1": {Id: "call-2", Function: sdk.ChatCompletionMessageToolCallFunction{Name: "Write"}}, + "0": {ID: "call-1", Function: sdk.ChatCompletionMessageToolCallFunction{Name: "Read"}}, + "1": {ID: "call-2", Function: sdk.ChatCompletionMessageToolCallFunction{Name: "Write"}}, }, } result := agentService.getAccumulatedToolCalls() assert.Equal(t, 2, len(result)) - assert.Equal(t, "call-1", result[0].Id) + assert.Equal(t, "call-1", result[0].ID) assert.Equal(t, "Read", result[0].Function.Name) - assert.Equal(t, "call-2", result[1].Id) + assert.Equal(t, "call-2", result[1].ID) assert.Equal(t, "Write", result[1].Function.Name) // Verify map was cleared @@ -57,7 +57,7 @@ func TestGetAccumulatedToolCalls(t *testing.T) { func TestClearToolCallsMap(t *testing.T) { agentService := &AgentServiceImpl{ toolCallsMap: map[string]*sdk.ChatCompletionMessageToolCall{ - "0": {Id: "call-1"}, + "0": {ID: "call-1"}, }, } @@ -234,7 +234,7 @@ func TestAddToolResultsToConversation(t *testing.T) { Message: sdk.Message{ Role: sdk.Tool, Content: sdk.NewMessageContent("result1"), - ToolCallId: &call1, + ToolCallID: &call1, }, ToolExecution: &domain.ToolExecutionResult{ ToolName: "Read", @@ -245,7 +245,7 @@ func TestAddToolResultsToConversation(t *testing.T) { Message: sdk.Message{ Role: sdk.Tool, Content: sdk.NewMessageContent("result2"), - ToolCallId: &call2, + ToolCallID: &call2, }, ToolExecution: &domain.ToolExecutionResult{ ToolName: "Write", @@ -262,11 +262,11 @@ func TestAddToolResultsToConversation(t *testing.T) { assert.Equal(t, 3, len(conversation)) assert.Equal(t, sdk.Tool, conversation[1].Role) - assert.NotNil(t, conversation[1].ToolCallId) - assert.Equal(t, "call-1", *conversation[1].ToolCallId) + assert.NotNil(t, conversation[1].ToolCallID) + assert.Equal(t, "call-1", *conversation[1].ToolCallID) assert.Equal(t, sdk.Tool, conversation[2].Role) - assert.NotNil(t, conversation[2].ToolCallId) - assert.Equal(t, "call-2", *conversation[2].ToolCallId) + assert.NotNil(t, conversation[2].ToolCallID) + assert.Equal(t, "call-2", *conversation[2].ToolCallID) } // TestBatchDrainQueue tests draining queued messages into conversation diff --git a/internal/agent/agent_state_machine_test.go b/internal/agent/agent_state_machine_test.go index 2957a4e1..c0abd6fa 100644 --- a/internal/agent/agent_state_machine_test.go +++ b/internal/agent/agent_state_machine_test.go @@ -186,7 +186,7 @@ func TestGuardConditions(t *testing.T) { ctx.ToolCalls = []*sdk.ChatCompletionMessageToolCall{ { - Id: "test", + ID: "test", Function: sdk.ChatCompletionMessageToolCallFunction{ Name: "test", Arguments: "{}", @@ -380,7 +380,7 @@ func TestGuardFunctions_NeedsApproval(t *testing.T) { ctx.ApprovalPolicy = nil ctx.ToolCalls = []*sdk.ChatCompletionMessageToolCall{ { - Id: "call-1", + ID: "call-1", Function: sdk.ChatCompletionMessageToolCallFunction{ Name: "Write", Arguments: `{}`, @@ -398,7 +398,7 @@ func TestGuardFunctions_NeedsApproval(t *testing.T) { ctx.ApprovalPolicy = fakePolicy ctx.ToolCalls = []*sdk.ChatCompletionMessageToolCall{ { - Id: "call-1", + ID: "call-1", Function: sdk.ChatCompletionMessageToolCallFunction{ Name: "Write", Arguments: `{}`, @@ -416,7 +416,7 @@ func TestGuardFunctions_NeedsApproval(t *testing.T) { ctx.ApprovalPolicy = fakePolicy ctx.ToolCalls = []*sdk.ChatCompletionMessageToolCall{ { - Id: "call-1", + ID: "call-1", Function: sdk.ChatCompletionMessageToolCallFunction{ Name: "Read", Arguments: `{}`, diff --git a/internal/agent/agent_streaming_test.go b/internal/agent/agent_streaming_test.go index 51ca0892..4584c340 100644 --- a/internal/agent/agent_streaming_test.go +++ b/internal/agent/agent_streaming_test.go @@ -10,7 +10,7 @@ import ( func TestBuildAssistantMessage(t *testing.T) { toolCall := &sdk.ChatCompletionMessageToolCall{ - Id: "call_1", + ID: "call_1", Type: sdk.Function, Function: sdk.ChatCompletionMessageToolCallFunction{ Name: "Bash", diff --git a/internal/agent/agent_test.go b/internal/agent/agent_test.go index 2d80de4b..0adf80bb 100644 --- a/internal/agent/agent_test.go +++ b/internal/agent/agent_test.go @@ -710,7 +710,7 @@ func TestAgentServiceImpl_ShouldRequireApproval(t *testing.T) { func TestAgentServiceImpl_CreateErrorEntry(t *testing.T) { toolCall := sdk.ChatCompletionMessageToolCall{ - Id: "call-123", + ID: "call-123", Function: sdk.ChatCompletionMessageToolCallFunction{ Name: "Write", Arguments: `{"file_path": "/test.txt", "content": "test"}`, @@ -724,8 +724,8 @@ func TestAgentServiceImpl_CreateErrorEntry(t *testing.T) { entry := agentService.createErrorEntry(toolCall, testError, startTime) assert.Equal(t, sdk.Tool, entry.Message.Role) - assert.NotNil(t, entry.Message.ToolCallId) - assert.Equal(t, "call-123", *entry.Message.ToolCallId) + assert.NotNil(t, entry.Message.ToolCallID) + assert.Equal(t, "call-123", *entry.Message.ToolCallID) content, err := entry.Message.Content.AsMessageContent0() assert.NoError(t, err) @@ -747,7 +747,7 @@ func makeToolCallChunk(index int, id, name, args string) sdk.ChatCompletionMessa Function: &sdk.ChatCompletionMessageToolCallFunction{Name: name, Arguments: args}, } if id != "" { - chunk.Id = &id + chunk.ID = &id } return chunk } @@ -768,7 +768,7 @@ func TestAgentServiceImpl_AccumulateToolCalls(t *testing.T) { expectedCalls: 1, validateResult: func(t *testing.T, result map[string]*sdk.ChatCompletionMessageToolCall) { assert.Contains(t, result, "0") - assert.Equal(t, "call-1", result["0"].Id) + assert.Equal(t, "call-1", result["0"].ID) assert.Equal(t, "Read", result["0"].Function.Name) assert.Equal(t, `{"file_path":"/test.txt"}`, result["0"].Function.Arguments) }, @@ -783,8 +783,8 @@ func TestAgentServiceImpl_AccumulateToolCalls(t *testing.T) { validateResult: func(t *testing.T, result map[string]*sdk.ChatCompletionMessageToolCall) { assert.Contains(t, result, "0") assert.Contains(t, result, "1") - assert.Equal(t, "call-1", result["0"].Id) - assert.Equal(t, "call-2", result["1"].Id) + assert.Equal(t, "call-1", result["0"].ID) + assert.Equal(t, "call-2", result["1"].ID) }, }, { @@ -818,7 +818,7 @@ func TestAgentServiceImpl_AccumulateToolCalls(t *testing.T) { expectedCalls: 1, validateResult: func(t *testing.T, result map[string]*sdk.ChatCompletionMessageToolCall) { tc := result["0"] - assert.Equal(t, "call-1", tc.Id) + assert.Equal(t, "call-1", tc.ID) assert.Equal(t, `{"agent_url":"http://localhost:8081"}`, tc.Function.Arguments) if assert.NotNil(t, tc.ExtraContent) && assert.NotNil(t, tc.ExtraContent.Google) { assert.NotNil(t, tc.ExtraContent.Google.ThoughtSignature) @@ -847,17 +847,17 @@ func TestAgentServiceImpl_AccumulateToolCalls(t *testing.T) { func TestAgentServiceImpl_GetAccumulatedToolCalls(t *testing.T) { agentService := &AgentServiceImpl{ toolCallsMap: map[string]*sdk.ChatCompletionMessageToolCall{ - "0": {Id: "call-1", Function: sdk.ChatCompletionMessageToolCallFunction{Name: "Read"}}, - "1": {Id: "call-2", Function: sdk.ChatCompletionMessageToolCallFunction{Name: "Write"}}, + "0": {ID: "call-1", Function: sdk.ChatCompletionMessageToolCallFunction{Name: "Read"}}, + "1": {ID: "call-2", Function: sdk.ChatCompletionMessageToolCallFunction{Name: "Write"}}, }, } result := agentService.getAccumulatedToolCalls() assert.Len(t, result, 2) - assert.Equal(t, "call-1", result[0].Id) + assert.Equal(t, "call-1", result[0].ID) assert.Equal(t, "Read", result[0].Function.Name) - assert.Equal(t, "call-2", result[1].Id) + assert.Equal(t, "call-2", result[1].ID) assert.Equal(t, "Write", result[1].Function.Name) assert.Empty(t, agentService.toolCallsMap) @@ -866,8 +866,8 @@ func TestAgentServiceImpl_GetAccumulatedToolCalls(t *testing.T) { func TestAgentServiceImpl_ClearToolCallsMap(t *testing.T) { agentService := &AgentServiceImpl{ toolCallsMap: map[string]*sdk.ChatCompletionMessageToolCall{ - "0": {Id: "call-1"}, - "1": {Id: "call-2"}, + "0": {ID: "call-1"}, + "1": {ID: "call-2"}, }, } @@ -1001,7 +1001,7 @@ func TestEventPublisher_PublishChatComplete(t *testing.T) { publisher := newEventPublisher("request-123", chatEvents) toolCalls := []sdk.ChatCompletionMessageToolCall{ - {Id: "call-1", Function: sdk.ChatCompletionMessageToolCallFunction{Name: "Read"}}, + {ID: "call-1", Function: sdk.ChatCompletionMessageToolCallFunction{Name: "Read"}}, } metrics := &domain.ChatMetrics{ Duration: 2 * time.Second, @@ -1028,7 +1028,7 @@ func TestEventPublisher_PublishChatChunk(t *testing.T) { callID := "call-1" toolCalls := []sdk.ChatCompletionMessageToolCallChunk{ - {Index: 0, Id: &callID}, + {Index: 0, ID: &callID}, } publisher.publishChatChunk("Hello", "thinking...", toolCalls) @@ -1072,8 +1072,8 @@ func TestEventPublisher_PublishToolsQueued(t *testing.T) { publisher := newEventPublisher("request-123", chatEvents) toolCalls := []sdk.ChatCompletionMessageToolCall{ - {Id: "call-1", Function: sdk.ChatCompletionMessageToolCallFunction{Name: "Read", Arguments: "{}"}}, - {Id: "call-2", Function: sdk.ChatCompletionMessageToolCallFunction{Name: "Write", Arguments: "{}"}}, + {ID: "call-1", Function: sdk.ChatCompletionMessageToolCallFunction{Name: "Read", Arguments: "{}"}}, + {ID: "call-2", Function: sdk.ChatCompletionMessageToolCallFunction{Name: "Write", Arguments: "{}"}}, } publisher.publishToolsQueued(toolCalls) @@ -1085,7 +1085,7 @@ func TestEventPublisher_PublishToolsQueued(t *testing.T) { progressEvent, ok := event.(domain.ToolExecutionProgressEvent) assert.True(t, ok, "expected ToolExecutionProgressEvent for tool %d", i) assert.Equal(t, "request-123", progressEvent.RequestID) - assert.Equal(t, tc.Id, progressEvent.ToolCallID) + assert.Equal(t, tc.ID, progressEvent.ToolCallID) assert.Equal(t, tc.Function.Name, progressEvent.ToolName) assert.Equal(t, "queued", progressEvent.Status) default: diff --git a/internal/agent/agent_tools.go b/internal/agent/agent_tools.go index 42e37783..5dee16c9 100644 --- a/internal/agent/agent_tools.go +++ b/internal/agent/agent_tools.go @@ -17,7 +17,7 @@ func (a *EventDrivenAgent) executeTools() { toolCallsSlice := make([]*sdk.ChatCompletionMessageToolCall, 0, len(a.currentToolCalls)) for _, tc := range a.currentToolCalls { toolCallsSlice = append(toolCallsSlice, tc) - logger.Debug("executing tool", "tool", tc.Function.Name, "id", tc.Id) + logger.Debug("executing tool", "tool", tc.Function.Name, "id", tc.ID) } logger.Debug("Running tools in parallel...") diff --git a/internal/agent/agent_utils.go b/internal/agent/agent_utils.go index 53f12fce..2ae925fe 100644 --- a/internal/agent/agent_utils.go +++ b/internal/agent/agent_utils.go @@ -26,13 +26,13 @@ func (s *AgentServiceImpl) accumulateToolCalls(deltas []sdk.ChatCompletionMessag key := fmt.Sprintf("%d", delta.Index) deltaID := "" - if delta.Id != nil { - deltaID = *delta.Id + if delta.ID != nil { + deltaID = *delta.ID } if s.toolCallsMap[key] == nil { s.toolCallsMap[key] = &sdk.ChatCompletionMessageToolCall{ - Id: deltaID, + ID: deltaID, Type: sdk.Function, Function: sdk.ChatCompletionMessageToolCallFunction{ Name: "", @@ -43,7 +43,7 @@ func (s *AgentServiceImpl) accumulateToolCalls(deltas []sdk.ChatCompletionMessag toolCall := s.toolCallsMap[key] if deltaID != "" { - toolCall.Id = deltaID + toolCall.ID = deltaID } if delta.Function != nil && delta.Function.Name != "" && toolCall.Function.Name == "" { toolCall.Function.Name = delta.Function.Name diff --git a/internal/agent/states/approving_tools.go b/internal/agent/states/approving_tools.go index 3d0f7f00..fbd976d4 100644 --- a/internal/agent/states/approving_tools.go +++ b/internal/agent/states/approving_tools.go @@ -132,7 +132,7 @@ func (s *ApprovingToolsState) handleToolRejection(tc sdk.ChatCompletionMessageTo rejectionMessage := sdk.Message{ Role: sdk.Tool, Content: sdk.NewMessageContent(fmt.Sprintf("Tool execution rejected by user: %s", tc.Function.Name)), - ToolCallId: &tc.Id, + ToolCallID: &tc.ID, } *s.ctx.AgentCtx.Conversation = append(*s.ctx.AgentCtx.Conversation, rejectionMessage) diff --git a/internal/agent/states/evaluating_tools.go b/internal/agent/states/evaluating_tools.go index 61b298c6..8610e29f 100644 --- a/internal/agent/states/evaluating_tools.go +++ b/internal/agent/states/evaluating_tools.go @@ -37,7 +37,7 @@ func (s *EvaluatingToolsState) Handle(event domain.AgentEvent) error { completeToolCalls = make([]sdk.ChatCompletionMessageToolCall, 0, len(*s.ctx.CurrentToolCalls)) for _, tc := range *s.ctx.CurrentToolCalls { completeToolCalls = append(completeToolCalls, *tc) - logger.Debug("Tool call", "tool", tc.Function.Name, "id", tc.Id) + logger.Debug("Tool call", "tool", tc.Function.Name, "id", tc.ID) } } s.ctx.PublishChatComplete(*s.ctx.CurrentReasoning, completeToolCalls, s.ctx.GetMetrics(s.ctx.Request.RequestID)) diff --git a/internal/handlers/chat_handler.go b/internal/handlers/chat_handler.go index 698718b3..941af236 100644 --- a/internal/handlers/chat_handler.go +++ b/internal/handlers/chat_handler.go @@ -221,13 +221,13 @@ func buildAgentMessagesFromEntries(entries []domain.ConversationEntry) []sdk.Mes func isUserInitiatedBashEntry(entry domain.ConversationEntry) bool { const userBashPrefix = "user-bash-" - if entry.Message.ToolCallId != nil && strings.HasPrefix(*entry.Message.ToolCallId, userBashPrefix) { + if entry.Message.ToolCallID != nil && strings.HasPrefix(*entry.Message.ToolCallID, userBashPrefix) { return true } if entry.Message.ToolCalls != nil { for _, tc := range *entry.Message.ToolCalls { - if strings.HasPrefix(tc.Id, userBashPrefix) { + if strings.HasPrefix(tc.ID, userBashPrefix) { return true } } @@ -1125,7 +1125,7 @@ func (h *ChatHandler) handleChatComplete( return domain.ToolCallPreviewEvent{ RequestID: msg.RequestID, Timestamp: msg.Timestamp, - ToolCallID: tc.Id, + ToolCallID: tc.ID, ToolName: tc.Function.Name, Arguments: tc.Function.Arguments, Status: domain.ToolCallStreamStatusReady, @@ -1907,7 +1907,7 @@ func (h *ChatHandler) executeBashCommand(commandText, command string) tea.Cmd { _ = h.conversationRepo.AddMessage(userEntry) if err := h.stateManager.StartToolExecution([]sdk.ChatCompletionMessageToolCall{{ - Id: toolCallID, + ID: toolCallID, Function: sdk.ChatCompletionMessageToolCallFunction{Name: "Bash", Arguments: fmt.Sprintf(`{"command":"%s"}`, command)}, }}); err != nil { return func() tea.Msg { @@ -2023,7 +2023,7 @@ func (h *ChatHandler) executeBashCommandAsync(command string, toolCallID string) toolCalls := []sdk.ChatCompletionMessageToolCall{ { - Id: toolCallID, + ID: toolCallID, Type: "function", Function: toolCallFunc, }, @@ -2048,7 +2048,7 @@ func (h *ChatHandler) executeBashCommandAsync(command string, toolCallID string) Message: sdk.Message{ Role: sdk.Tool, Content: sdk.NewMessageContent(formattedContent), - ToolCallId: &toolCallID, + ToolCallID: &toolCallID, }, ToolExecution: result, Time: time.Now(), @@ -2290,7 +2290,7 @@ func (h *ChatHandler) executeToolCommandAsync(toolName, argsJSON, toolCallID str toolCalls := []sdk.ChatCompletionMessageToolCall{ { - Id: toolCallID, + ID: toolCallID, Type: "function", Function: toolCallFunc, }, @@ -2309,7 +2309,7 @@ func (h *ChatHandler) executeToolCommandAsync(toolName, argsJSON, toolCallID str Message: sdk.Message{ Role: sdk.Tool, Content: sdk.NewMessageContent(""), - ToolCallId: &toolCallID, + ToolCallID: &toolCallID, }, ToolExecution: result, Time: time.Now(), diff --git a/internal/handlers/chat_handler_test.go b/internal/handlers/chat_handler_test.go index a6a3fe27..c27284c0 100644 --- a/internal/handlers/chat_handler_test.go +++ b/internal/handlers/chat_handler_test.go @@ -40,7 +40,7 @@ func TestBuildAgentMessagesFromEntries_FiltersPlanEntries(t *testing.T) { Content: sdk.NewMessageContent("Submitting plan"), ToolCalls: &[]sdk.ChatCompletionMessageToolCall{ { - Id: "call_1", + ID: "call_1", Type: sdk.Function, Function: sdk.ChatCompletionMessageToolCallFunction{ Name: "RequestPlanApproval", @@ -57,7 +57,7 @@ func TestBuildAgentMessagesFromEntries_FiltersPlanEntries(t *testing.T) { Message: sdk.Message{ Role: sdk.Tool, Content: sdk.NewMessageContent("Plan approval requested. Plan saved to ..."), - ToolCallId: new("call_1"), + ToolCallID: new("call_1"), }, }, { @@ -160,7 +160,7 @@ func TestBuildAgentMessagesFromEntries_FiltersUserBashEntries(t *testing.T) { Content: sdk.NewMessageContent(""), ToolCalls: &[]sdk.ChatCompletionMessageToolCall{ { - Id: userBashID, + ID: userBashID, Type: sdk.Function, Function: sdk.ChatCompletionMessageToolCallFunction{ Name: "Bash", @@ -174,7 +174,7 @@ func TestBuildAgentMessagesFromEntries_FiltersUserBashEntries(t *testing.T) { Message: sdk.Message{ Role: sdk.Tool, Content: sdk.NewMessageContent("0 issues."), - ToolCallId: &userBashID, + ToolCallID: &userBashID, }, }, {Message: sdk.Message{Role: sdk.User, Content: sdk.NewMessageContent("anything else?")}}, @@ -188,12 +188,12 @@ func TestBuildAgentMessagesFromEntries_FiltersUserBashEntries(t *testing.T) { for i, msg := range out { if msg.ToolCalls != nil { for _, tc := range *msg.ToolCalls { - if strings.HasPrefix(tc.Id, "user-bash-") { + if strings.HasPrefix(tc.ID, "user-bash-") { t.Errorf("user-bash tool call leaked into request at message %d", i) } } } - if msg.ToolCallId != nil && strings.HasPrefix(*msg.ToolCallId, "user-bash-") { + if msg.ToolCallID != nil && strings.HasPrefix(*msg.ToolCallID, "user-bash-") { t.Errorf("user-bash tool result leaked into request at message %d", i) } } @@ -1170,7 +1170,7 @@ func TestChatEventHandler_handleChatComplete(t *testing.T) { Timestamp: time.Now(), ToolCalls: []sdk.ChatCompletionMessageToolCall{ { - Id: "tool-1", + ID: "tool-1", Type: sdk.Function, Function: sdk.ChatCompletionMessageToolCallFunction{ Name: "Read", diff --git a/internal/infra/adapters/claude_code_client.go b/internal/infra/adapters/claude_code_client.go index 1ad833f5..38154acc 100644 --- a/internal/infra/adapters/claude_code_client.go +++ b/internal/infra/adapters/claude_code_client.go @@ -569,7 +569,7 @@ func (c *ClaudeCodeClient) processToolCalls(toolCallsRaw []any, toolCallsMap map toolCall, exists := toolCallsMap[id] if !exists { toolCall = &sdk.ChatCompletionMessageToolCall{ - Id: id, + ID: id, Type: "function", } toolCallsMap[id] = toolCall diff --git a/internal/services/approval_policy_test.go b/internal/services/approval_policy_test.go index 78793a3d..9ecbb3e0 100644 --- a/internal/services/approval_policy_test.go +++ b/internal/services/approval_policy_test.go @@ -29,7 +29,7 @@ func createTestConfig() *config.Config { func createToolCall(toolName string, args string) *sdk.ChatCompletionMessageToolCall { return &sdk.ChatCompletionMessageToolCall{ - Id: "test-call-id", + ID: "test-call-id", Type: sdk.Function, Function: sdk.ChatCompletionMessageToolCallFunction{ Name: toolName, diff --git a/internal/services/conversation.go b/internal/services/conversation.go index 80a1c07d..c617b093 100644 --- a/internal/services/conversation.go +++ b/internal/services/conversation.go @@ -150,7 +150,7 @@ func (r *InMemoryConversationRepository) RemovePendingToolCallByID(toolCallID st defer r.mutex.Unlock() for i := len(r.messages) - 1; i >= 0; i-- { - if r.messages[i].PendingToolCall != nil && r.messages[i].PendingToolCall.Id == toolCallID { + if r.messages[i].PendingToolCall != nil && r.messages[i].PendingToolCall.ID == toolCallID { r.messages = append(r.messages[:i], r.messages[i+1:]...) return } @@ -344,8 +344,8 @@ func (r *InMemoryConversationRepository) exportMarkdown() []byte { } } - if entry.Message.ToolCallId != nil { - fmt.Fprintf(&content, "*Tool Call ID: %s*\n\n", *entry.Message.ToolCallId) + if entry.Message.ToolCallID != nil { + fmt.Fprintf(&content, "*Tool Call ID: %s*\n\n", *entry.Message.ToolCallID) } content.WriteString("---\n\n") diff --git a/internal/services/conversation_optimizer.go b/internal/services/conversation_optimizer.go index ca3b3dc3..0e8d53a7 100644 --- a/internal/services/conversation_optimizer.go +++ b/internal/services/conversation_optimizer.go @@ -216,17 +216,17 @@ func (co *ConversationOptimizer) adjustBoundaryForToolCallsAtStart(messages []sd toolCallIDs := make(map[string]bool) for _, tc := range *lastKeptMsg.ToolCalls { - if tc.Id != "" { - toolCallIDs[tc.Id] = true + if tc.ID != "" { + toolCallIDs[tc.ID] = true } } adjustedBoundary := boundaryIndex for i := boundaryIndex; i < len(messages); i++ { - if messages[i].Role == "tool" && messages[i].ToolCallId != nil { - if toolCallIDs[*messages[i].ToolCallId] { + if messages[i].Role == "tool" && messages[i].ToolCallID != nil { + if toolCallIDs[*messages[i].ToolCallID] { adjustedBoundary = i + 1 - delete(toolCallIDs, *messages[i].ToolCallId) + delete(toolCallIDs, *messages[i].ToolCallID) } } else if messages[i].Role == "assistant" || messages[i].Role == "user" { break diff --git a/internal/services/conversation_optimizer_test.go b/internal/services/conversation_optimizer_test.go index 610db2ba..99ae5eae 100644 --- a/internal/services/conversation_optimizer_test.go +++ b/internal/services/conversation_optimizer_test.go @@ -31,13 +31,13 @@ func getBasicToolCallTestCases() []testCase { Role: "assistant", Content: sdk.NewMessageContent("Let me use two tools"), ToolCalls: &[]sdk.ChatCompletionMessageToolCall{ - {Id: "call_A", Function: sdk.ChatCompletionMessageToolCallFunction{Name: "read"}}, - {Id: "call_B", Function: sdk.ChatCompletionMessageToolCallFunction{Name: "write"}}, + {ID: "call_A", Function: sdk.ChatCompletionMessageToolCallFunction{Name: "read"}}, + {ID: "call_B", Function: sdk.ChatCompletionMessageToolCallFunction{Name: "write"}}, }, }, - {Role: "tool", Content: sdk.NewMessageContent("file content"), ToolCallId: stringPtr("call_A")}, + {Role: "tool", Content: sdk.NewMessageContent("file content"), ToolCallID: stringPtr("call_A")}, {Role: "assistant", Content: sdk.NewMessageContent("Intermediate response")}, // Breaks the loop - {Role: "tool", Content: sdk.NewMessageContent("write success"), ToolCallId: stringPtr("call_B")}, + {Role: "tool", Content: sdk.NewMessageContent("write success"), ToolCallID: stringPtr("call_B")}, {Role: "assistant", Content: sdk.NewMessageContent("All done")}, {Role: "user", Content: sdk.NewMessageContent("Thank you")}, }, @@ -55,12 +55,12 @@ func getBasicToolCallTestCases() []testCase { Role: "assistant", Content: sdk.NewMessageContent("Let me use two tools"), ToolCalls: &[]sdk.ChatCompletionMessageToolCall{ - {Id: "call_A", Function: sdk.ChatCompletionMessageToolCallFunction{Name: "read"}}, - {Id: "call_B", Function: sdk.ChatCompletionMessageToolCallFunction{Name: "write"}}, + {ID: "call_A", Function: sdk.ChatCompletionMessageToolCallFunction{Name: "read"}}, + {ID: "call_B", Function: sdk.ChatCompletionMessageToolCallFunction{Name: "write"}}, }, }, - {Role: "tool", Content: sdk.NewMessageContent("file content"), ToolCallId: stringPtr("call_A")}, - {Role: "tool", Content: sdk.NewMessageContent("write success"), ToolCallId: stringPtr("call_B")}, + {Role: "tool", Content: sdk.NewMessageContent("file content"), ToolCallID: stringPtr("call_A")}, + {Role: "tool", Content: sdk.NewMessageContent("write success"), ToolCallID: stringPtr("call_B")}, {Role: "assistant", Content: sdk.NewMessageContent("All done")}, {Role: "user", Content: sdk.NewMessageContent("Thank you")}, }, @@ -76,21 +76,21 @@ func getBasicToolCallTestCases() []testCase { Role: "assistant", Content: sdk.NewMessageContent("Using tools group 1"), ToolCalls: &[]sdk.ChatCompletionMessageToolCall{ - {Id: "call_1", Function: sdk.ChatCompletionMessageToolCallFunction{Name: "read"}}, + {ID: "call_1", Function: sdk.ChatCompletionMessageToolCallFunction{Name: "read"}}, }, }, - {Role: "tool", Content: sdk.NewMessageContent("file content"), ToolCallId: stringPtr("call_1")}, + {Role: "tool", Content: sdk.NewMessageContent("file content"), ToolCallID: stringPtr("call_1")}, {Role: "user", Content: sdk.NewMessageContent("Request 2")}, { Role: "assistant", Content: sdk.NewMessageContent("Using tools group 2"), ToolCalls: &[]sdk.ChatCompletionMessageToolCall{ - {Id: "call_2", Function: sdk.ChatCompletionMessageToolCallFunction{Name: "write"}}, - {Id: "call_3", Function: sdk.ChatCompletionMessageToolCallFunction{Name: "bash"}}, + {ID: "call_2", Function: sdk.ChatCompletionMessageToolCallFunction{Name: "write"}}, + {ID: "call_3", Function: sdk.ChatCompletionMessageToolCallFunction{Name: "bash"}}, }, }, - {Role: "tool", Content: sdk.NewMessageContent("write success"), ToolCallId: stringPtr("call_2")}, - {Role: "tool", Content: sdk.NewMessageContent("bash output"), ToolCallId: stringPtr("call_3")}, + {Role: "tool", Content: sdk.NewMessageContent("write success"), ToolCallID: stringPtr("call_2")}, + {Role: "tool", Content: sdk.NewMessageContent("bash output"), ToolCallID: stringPtr("call_3")}, {Role: "assistant", Content: sdk.NewMessageContent("All done")}, }, keepFirstMessages: 3, @@ -121,10 +121,10 @@ func getBasicToolCallTestCases() []testCase { Role: "assistant", Content: sdk.NewMessageContent("Using tools"), ToolCalls: &[]sdk.ChatCompletionMessageToolCall{ - {Id: "call_1", Function: sdk.ChatCompletionMessageToolCallFunction{Name: "grep"}}, + {ID: "call_1", Function: sdk.ChatCompletionMessageToolCallFunction{Name: "grep"}}, }, }, - {Role: "tool", Content: sdk.NewMessageContent("search results"), ToolCallId: stringPtr("call_1")}, + {Role: "tool", Content: sdk.NewMessageContent("search results"), ToolCallID: stringPtr("call_1")}, }, keepFirstMessages: 2, expectedValid: true, @@ -138,13 +138,13 @@ func getBasicToolCallTestCases() []testCase { Role: "assistant", Content: sdk.NewMessageContent("Calling multiple tools"), ToolCalls: &[]sdk.ChatCompletionMessageToolCall{ - {Id: "call_1", Function: sdk.ChatCompletionMessageToolCallFunction{Name: "tool1"}}, - {Id: "call_2", Function: sdk.ChatCompletionMessageToolCallFunction{Name: "tool2"}}, + {ID: "call_1", Function: sdk.ChatCompletionMessageToolCallFunction{Name: "tool1"}}, + {ID: "call_2", Function: sdk.ChatCompletionMessageToolCallFunction{Name: "tool2"}}, }, }, - {Role: "tool", Content: sdk.NewMessageContent("result 1"), ToolCallId: stringPtr("call_1")}, + {Role: "tool", Content: sdk.NewMessageContent("result 1"), ToolCallID: stringPtr("call_1")}, {Role: "user", Content: sdk.NewMessageContent("Next request")}, // User interrupts - {Role: "tool", Content: sdk.NewMessageContent("result 2"), ToolCallId: stringPtr("call_2")}, + {Role: "tool", Content: sdk.NewMessageContent("result 2"), ToolCallID: stringPtr("call_2")}, }, keepFirstMessages: 1, expectedValid: true, @@ -160,50 +160,50 @@ func getRealConversationTestCase() testCase { messages: []sdk.Message{ {Role: "user", Content: sdk.NewMessageContent("Request 1")}, {Role: "assistant", Content: sdk.NewMessageContent("Response 1"), ToolCalls: &[]sdk.ChatCompletionMessageToolCall{ - {Id: "call_00_1", Function: sdk.ChatCompletionMessageToolCallFunction{Name: "tool1"}}, + {ID: "call_00_1", Function: sdk.ChatCompletionMessageToolCallFunction{Name: "tool1"}}, }}, - {Role: "tool", Content: sdk.NewMessageContent("result"), ToolCallId: stringPtr("call_00_1")}, + {Role: "tool", Content: sdk.NewMessageContent("result"), ToolCallID: stringPtr("call_00_1")}, {Role: "assistant", Content: sdk.NewMessageContent("Response 2"), ToolCalls: &[]sdk.ChatCompletionMessageToolCall{ - {Id: "call_00_2", Function: sdk.ChatCompletionMessageToolCallFunction{Name: "tool2"}}, + {ID: "call_00_2", Function: sdk.ChatCompletionMessageToolCallFunction{Name: "tool2"}}, }}, - {Role: "tool", Content: sdk.NewMessageContent("result"), ToolCallId: stringPtr("call_00_2")}, + {Role: "tool", Content: sdk.NewMessageContent("result"), ToolCallID: stringPtr("call_00_2")}, {Role: "user", Content: sdk.NewMessageContent("Request 2")}, {Role: "assistant", Content: sdk.NewMessageContent("Response 3"), ToolCalls: &[]sdk.ChatCompletionMessageToolCall{ - {Id: "call_00_3", Function: sdk.ChatCompletionMessageToolCallFunction{Name: "tool3"}}, + {ID: "call_00_3", Function: sdk.ChatCompletionMessageToolCallFunction{Name: "tool3"}}, }}, - {Role: "tool", Content: sdk.NewMessageContent("result"), ToolCallId: stringPtr("call_00_3")}, + {Role: "tool", Content: sdk.NewMessageContent("result"), ToolCallID: stringPtr("call_00_3")}, {Role: "assistant", Content: sdk.NewMessageContent("Response 4"), ToolCalls: &[]sdk.ChatCompletionMessageToolCall{ - {Id: "call_00_4", Function: sdk.ChatCompletionMessageToolCallFunction{Name: "tool4"}}, + {ID: "call_00_4", Function: sdk.ChatCompletionMessageToolCallFunction{Name: "tool4"}}, }}, - {Role: "tool", Content: sdk.NewMessageContent("result"), ToolCallId: stringPtr("call_00_4")}, + {Role: "tool", Content: sdk.NewMessageContent("result"), ToolCallID: stringPtr("call_00_4")}, {Role: "assistant", Content: sdk.NewMessageContent("Response 5"), ToolCalls: &[]sdk.ChatCompletionMessageToolCall{ - {Id: "call_00_5", Function: sdk.ChatCompletionMessageToolCallFunction{Name: "tool5"}}, + {ID: "call_00_5", Function: sdk.ChatCompletionMessageToolCallFunction{Name: "tool5"}}, }}, - {Role: "tool", Content: sdk.NewMessageContent("result"), ToolCallId: stringPtr("call_00_5")}, + {Role: "tool", Content: sdk.NewMessageContent("result"), ToolCallID: stringPtr("call_00_5")}, {Role: "user", Content: sdk.NewMessageContent("Request 3")}, {Role: "assistant", Content: sdk.NewMessageContent("Response 6"), ToolCalls: &[]sdk.ChatCompletionMessageToolCall{ - {Id: "call_00_6", Function: sdk.ChatCompletionMessageToolCallFunction{Name: "tool6"}}, + {ID: "call_00_6", Function: sdk.ChatCompletionMessageToolCallFunction{Name: "tool6"}}, }}, - {Role: "tool", Content: sdk.NewMessageContent("result"), ToolCallId: stringPtr("call_00_6")}, + {Role: "tool", Content: sdk.NewMessageContent("result"), ToolCallID: stringPtr("call_00_6")}, {Role: "assistant", Content: sdk.NewMessageContent("Response 7"), ToolCalls: &[]sdk.ChatCompletionMessageToolCall{ - {Id: "call_00_7", Function: sdk.ChatCompletionMessageToolCallFunction{Name: "tool7"}}, + {ID: "call_00_7", Function: sdk.ChatCompletionMessageToolCallFunction{Name: "tool7"}}, }}, - {Role: "tool", Content: sdk.NewMessageContent("result"), ToolCallId: stringPtr("call_00_7")}, + {Role: "tool", Content: sdk.NewMessageContent("result"), ToolCallID: stringPtr("call_00_7")}, {Role: "user", Content: sdk.NewMessageContent("Request 4")}, {Role: "assistant", Content: sdk.NewMessageContent("Response 8"), ToolCalls: &[]sdk.ChatCompletionMessageToolCall{ - {Id: "call_00_8", Function: sdk.ChatCompletionMessageToolCallFunction{Name: "tool8"}}, + {ID: "call_00_8", Function: sdk.ChatCompletionMessageToolCallFunction{Name: "tool8"}}, }}, - {Role: "tool", Content: sdk.NewMessageContent("result"), ToolCallId: stringPtr("call_00_8")}, + {Role: "tool", Content: sdk.NewMessageContent("result"), ToolCallID: stringPtr("call_00_8")}, {Role: "assistant", Content: sdk.NewMessageContent("Let me use two tools"), ToolCalls: &[]sdk.ChatCompletionMessageToolCall{ - {Id: "call_00_mw22yDQOyJlZQaFT2mmXnyBZ", Function: sdk.ChatCompletionMessageToolCallFunction{Name: "read"}}, - {Id: "call_01_C9gJA1FoL22xfCrTHUWR2KYG", Function: sdk.ChatCompletionMessageToolCallFunction{Name: "write"}}, + {ID: "call_00_mw22yDQOyJlZQaFT2mmXnyBZ", Function: sdk.ChatCompletionMessageToolCallFunction{Name: "read"}}, + {ID: "call_01_C9gJA1FoL22xfCrTHUWR2KYG", Function: sdk.ChatCompletionMessageToolCallFunction{Name: "write"}}, }}, - {Role: "tool", Content: sdk.NewMessageContent("read result"), ToolCallId: stringPtr("call_00_mw22yDQOyJlZQaFT2mmXnyBZ")}, - {Role: "tool", Content: sdk.NewMessageContent("write result"), ToolCallId: stringPtr("call_01_C9gJA1FoL22xfCrTHUWR2KYG")}, + {Role: "tool", Content: sdk.NewMessageContent("read result"), ToolCallID: stringPtr("call_00_mw22yDQOyJlZQaFT2mmXnyBZ")}, + {Role: "tool", Content: sdk.NewMessageContent("write result"), ToolCallID: stringPtr("call_01_C9gJA1FoL22xfCrTHUWR2KYG")}, {Role: "assistant", Content: sdk.NewMessageContent("Response 9"), ToolCalls: &[]sdk.ChatCompletionMessageToolCall{ - {Id: "call_00_9", Function: sdk.ChatCompletionMessageToolCallFunction{Name: "tool9"}}, + {ID: "call_00_9", Function: sdk.ChatCompletionMessageToolCallFunction{Name: "tool9"}}, }}, - {Role: "tool", Content: sdk.NewMessageContent("result"), ToolCallId: stringPtr("call_00_9")}, + {Role: "tool", Content: sdk.NewMessageContent("result"), ToolCallID: stringPtr("call_00_9")}, {Role: "user", Content: sdk.NewMessageContent("Final request")}, }, keepFirstMessages: 2, @@ -243,7 +243,7 @@ func validateOptimizedResult(t *testing.T, result []sdk.Message, description str func collectToolCallIDsFromMessage(msg sdk.Message) map[string]bool { toolCallIDs := make(map[string]bool) for _, tc := range *msg.ToolCalls { - toolCallIDs[tc.Id] = true + toolCallIDs[tc.ID] = true } return toolCallIDs } @@ -251,8 +251,8 @@ func collectToolCallIDsFromMessage(msg sdk.Message) map[string]bool { // removeMatchingToolResponses removes tool call IDs that have responses func removeMatchingToolResponses(result []sdk.Message, assistantIdx int, toolCallIDs map[string]bool) { for j := assistantIdx + 1; j < len(result); j++ { - if result[j].Role == "tool" && result[j].ToolCallId != nil { - delete(toolCallIDs, *result[j].ToolCallId) + if result[j].Role == "tool" && result[j].ToolCallID != nil { + delete(toolCallIDs, *result[j].ToolCallID) } else if result[j].Role == "assistant" || result[j].Role == "user" { break } @@ -502,12 +502,12 @@ func collectToolCallIDs(messages []sdk.Message) (map[string]int, map[string]int) for i, msg := range messages { if msg.Role == "assistant" && msg.ToolCalls != nil { for _, tc := range *msg.ToolCalls { - if tc.Id != "" { - expectedToolCallIDs[tc.Id] = i + if tc.ID != "" { + expectedToolCallIDs[tc.ID] = i } } - } else if msg.Role == "tool" && msg.ToolCallId != nil { - toolResponseIDs[*msg.ToolCallId] = i + } else if msg.Role == "tool" && msg.ToolCallID != nil { + toolResponseIDs[*msg.ToolCallID] = i } } @@ -570,7 +570,7 @@ func validateToolResponsesForAssistant(t *testing.T, messages []sdk.Message, ass break } - if messages[j].Role == "tool" && messages[j].ToolCallId != nil { + if messages[j].Role == "tool" && messages[j].ToolCallID != nil { processToolResponse(t, messages, assistantIdx, j, toolCalls, foundResponses) } } @@ -588,13 +588,13 @@ func processToolResponse(t *testing.T, messages []sdk.Message, assistantIdx, too toolCalls []sdk.ChatCompletionMessageToolCall, foundResponses map[string]bool) { t.Helper() - toolCallID := *messages[toolResponseIdx].ToolCallId + toolCallID := *messages[toolResponseIdx].ToolCallID matchesOurCall := false for _, tc := range toolCalls { - if tc.Id == toolCallID { + if tc.ID == toolCallID { matchesOurCall = true - foundResponses[tc.Id] = true + foundResponses[tc.ID] = true break } } @@ -621,10 +621,10 @@ func verifyAllToolCallsHaveResponses(t *testing.T, toolCalls []sdk.ChatCompletio t.Helper() for _, tc := range toolCalls { - if tc.Id != "" { - assert.True(t, foundResponses[tc.Id], + if tc.ID != "" { + assert.True(t, foundResponses[tc.ID], "Tool call %s from assistant at index %d has no response in the immediate following messages", - tc.Id, assistantIdx) + tc.ID, assistantIdx) } } } diff --git a/internal/services/conversation_test.go b/internal/services/conversation_test.go index 5f65371c..84520772 100644 --- a/internal/services/conversation_test.go +++ b/internal/services/conversation_test.go @@ -20,7 +20,7 @@ func TestInMemoryConversationRepository_RemovePendingToolCallByID(t *testing.T) name: "remove_existing_tool_call", setupToolCalls: []sdk.ChatCompletionMessageToolCall{ { - Id: "tool-call-1", + ID: "tool-call-1", Function: sdk.ChatCompletionMessageToolCallFunction{ Name: "test_function", Arguments: `{"arg": "value"}`, @@ -35,7 +35,7 @@ func TestInMemoryConversationRepository_RemovePendingToolCallByID(t *testing.T) name: "remove_non_existent_tool_call", setupToolCalls: []sdk.ChatCompletionMessageToolCall{ { - Id: "tool-call-1", + ID: "tool-call-1", Function: sdk.ChatCompletionMessageToolCallFunction{ Name: "test_function", Arguments: `{"arg": "value"}`, @@ -50,21 +50,21 @@ func TestInMemoryConversationRepository_RemovePendingToolCallByID(t *testing.T) name: "remove_from_multiple_tool_calls", setupToolCalls: []sdk.ChatCompletionMessageToolCall{ { - Id: "tool-call-1", + ID: "tool-call-1", Function: sdk.ChatCompletionMessageToolCallFunction{ Name: "function_1", Arguments: `{"arg1": "value1"}`, }, }, { - Id: "tool-call-2", + ID: "tool-call-2", Function: sdk.ChatCompletionMessageToolCallFunction{ Name: "function_2", Arguments: `{"arg2": "value2"}`, }, }, { - Id: "tool-call-3", + ID: "tool-call-3", Function: sdk.ChatCompletionMessageToolCallFunction{ Name: "function_3", Arguments: `{"arg3": "value3"}`, @@ -104,7 +104,7 @@ func TestInMemoryConversationRepository_RemovePendingToolCallByID(t *testing.T) for _, removedID := range tt.expectedRemovedIDs { found := false for _, msg := range finalMessages { - if msg.PendingToolCall != nil && msg.PendingToolCall.Id == removedID { + if msg.PendingToolCall != nil && msg.PendingToolCall.ID == removedID { found = true break } @@ -115,7 +115,7 @@ func TestInMemoryConversationRepository_RemovePendingToolCallByID(t *testing.T) remainingIDs := make(map[string]bool) for _, msg := range finalMessages { if msg.PendingToolCall != nil { - remainingIDs[msg.PendingToolCall.Id] = true + remainingIDs[msg.PendingToolCall.ID] = true } } @@ -123,12 +123,12 @@ func TestInMemoryConversationRepository_RemovePendingToolCallByID(t *testing.T) if msg.PendingToolCall != nil { originalFound := false for _, originalToolCall := range tt.setupToolCalls { - if originalToolCall.Id == msg.PendingToolCall.Id { + if originalToolCall.ID == msg.PendingToolCall.ID { originalFound = true break } } - assert.True(t, originalFound, "Tool call with ID %s should be from original setup", msg.PendingToolCall.Id) + assert.True(t, originalFound, "Tool call with ID %s should be from original setup", msg.PendingToolCall.ID) } } }) diff --git a/internal/services/middleware/approval_middleware_test.go b/internal/services/middleware/approval_middleware_test.go index d76c54bf..f8cc8187 100644 --- a/internal/services/middleware/approval_middleware_test.go +++ b/internal/services/middleware/approval_middleware_test.go @@ -43,7 +43,7 @@ func (m *mockApprovalPolicy) ShouldRequireApproval(ctx context.Context, toolCall // Helper to create a tool call func createToolCall(id, name, args string) *sdk.ChatCompletionMessageToolCall { return &sdk.ChatCompletionMessageToolCall{ - Id: id, + ID: id, Type: sdk.Function, Function: sdk.ChatCompletionMessageToolCallFunction{ Name: name, diff --git a/internal/services/model.go b/internal/services/model.go index 5415d893..beb4729d 100644 --- a/internal/services/model.go +++ b/internal/services/model.go @@ -82,7 +82,7 @@ func (s *HTTPModelService) ListModels(ctx context.Context) ([]string, error) { models := make([]string, len(resp.Data)) for i, model := range resp.Data { - models[i] = model.Id + models[i] = model.ID } s.modelsMux.Lock() diff --git a/internal/services/state_manager.go b/internal/services/state_manager.go index 15f3e12b..b3020d7b 100644 --- a/internal/services/state_manager.go +++ b/internal/services/state_manager.go @@ -326,7 +326,7 @@ func (sm *StateManager) StartToolExecution(toolCalls []sdk.ChatCompletionMessage } tools[i] = domain.ToolCall{ - ID: tc.Id, + ID: tc.ID, Name: tc.Function.Name, Arguments: args, Status: domain.ToolCallStatusPending, diff --git a/internal/services/tokenizer.go b/internal/services/tokenizer.go index 8807e946..bb7bcded 100644 --- a/internal/services/tokenizer.go +++ b/internal/services/tokenizer.go @@ -99,8 +99,8 @@ func (t *TokenizerService) EstimateMessageTokens(msg sdk.Message) int { } } - if msg.ToolCallId != nil { - tokens += t.EstimateTokenCount(*msg.ToolCallId) + if msg.ToolCallID != nil { + tokens += t.EstimateTokenCount(*msg.ToolCallID) } if msg.Reasoning != nil { diff --git a/internal/services/tokenizer_test.go b/internal/services/tokenizer_test.go index ab9eb37b..6a5326d5 100644 --- a/internal/services/tokenizer_test.go +++ b/internal/services/tokenizer_test.go @@ -120,7 +120,7 @@ func TestEstimateMessageTokens(t *testing.T) { t.Run("assistant message with tool calls", func(t *testing.T) { toolCalls := []sdk.ChatCompletionMessageToolCall{ { - Id: "call_123", + ID: "call_123", Type: sdk.Function, Function: sdk.ChatCompletionMessageToolCallFunction{ Name: "read_file", @@ -146,7 +146,7 @@ func TestEstimateMessageTokens(t *testing.T) { msg := sdk.Message{ Role: sdk.Tool, Content: sdk.NewMessageContent("File contents: test data"), - ToolCallId: &toolCallId, + ToolCallID: &toolCallId, } result := tokenizer.EstimateMessageTokens(msg) @@ -232,7 +232,7 @@ func TestCalculateUsagePolyfill(t *testing.T) { outputToolCalls := []sdk.ChatCompletionMessageToolCall{ { - Id: "call_123", + ID: "call_123", Type: sdk.Function, Function: sdk.ChatCompletionMessageToolCallFunction{ Name: "read_file",