on main help sign in
fix: tool calls break the converation if interrupted.
commite76fd5488f9e72ea75784e2c4c90f9350a444b45 authorManolo Santos <manolo.santos@gmail.com> dateThu 28 Aug 2025, 23:11 (1 year ago) parenta2e89c8
3 files changed+29−9
internal/llm/provider/anthropic.go+3 internal/llm/provider/gemini.go+3 internal/llm/provider/openai.go+23−9
internal/llm/provider/anthropic.go+3
@@ -151,6 +151,9 @@ func (a *anthropicClient) convertMessages(messages []message.Message) (anthropic
151151 }
152152
153153 for _, toolCall := range msg.ToolCalls() {
154+ if !toolCall.Finished {
155+ continue
156+ }
154157 var inputMap map[string]any
155158 err := json.Unmarshal([]byte(toolCall.Input), &inputMap)
156159 if err != nil {
internal/llm/provider/gemini.go+3
@@ -81,6 +81,9 @@ func (g *geminiClient) convertMessages(messages []message.Message) []*genai.Cont
8181
8282 if len(msg.ToolCalls()) > 0 {
8383 for _, call := range msg.ToolCalls() {
84+ if !call.Finished {
85+ continue
86+ }
8487 args, _ := parseJSONToMap(call.Input)
8588 assistantParts = append(assistantParts, &genai.Part{
8689 FunctionCall: &genai.FunctionCall{
internal/llm/provider/openai.go+23−9
@@ -125,16 +125,25 @@ func (o *openaiClient) convertMessages(messages []message.Message) (openaiMessag
125125 Role: "assistant",
126126 }
127127
128+ // Only include finished tool calls; interrupted tool calls must not be resent.
128129 if len(msg.ToolCalls()) > 0 {
129− assistantMsg.ToolCalls = make([]openai.ChatCompletionMessageToolCallParam, len(msg.ToolCalls()))
130− for i, call := range msg.ToolCalls() {
131− assistantMsg.ToolCalls[i] = openai.ChatCompletionMessageToolCallParam{
132− ID: call.ID,
133− Type: "function",
134− Function: openai.ChatCompletionMessageToolCallFunctionParam{
135− Name: call.Name,
136− Arguments: call.Input,
137− },
130+ finished := make([]message.ToolCall, 0, len(msg.ToolCalls()))
131+ for _, call := range msg.ToolCalls() {
132+ if call.Finished {
133+ finished = append(finished, call)
134+ }
135+ }
136+ if len(finished) > 0 {
137+ assistantMsg.ToolCalls = make([]openai.ChatCompletionMessageToolCallParam, len(finished))
138+ for i, call := range finished {
139+ assistantMsg.ToolCalls[i] = openai.ChatCompletionMessageToolCallParam{
140+ ID: call.ID,
141+ Type: "function",
142+ Function: openai.ChatCompletionMessageToolCallFunctionParam{
143+ Name: call.Name,
144+ Arguments: call.Input,
145+ },
146+ }
138147 }
139148 }
140149 }
@@ -151,6 +160,11 @@ func (o *openaiClient) convertMessages(messages []message.Message) (openaiMessag
151160 },
152161 })
153162 }
163+ // Skip empty assistant messages (no content and no finished tool calls)
164+ if msg.Content().String() == "" && len(assistantMsg.ToolCalls) == 0 {
165+ continue
166+ }
167+
154168 openaiMessages = append(openaiMessages, openai.ChatCompletionMessageParamUnion{
155169 OfAssistant: &assistantMsg,
156170 })