diff --git a/internal/agent/agent.go b/internal/agent/agent.go index 11a87f58554729048cd7a0629979a0c6bb3babd2..c7c96cd42cfce58eab918e9ae2e267ac3f78ad8d 100644 --- a/internal/agent/agent.go +++ b/internal/agent/agent.go @@ -364,7 +364,9 @@ func (a *sessionAgent) Run(ctx context.Context, call SessionAgentCall) (*fantasy Finished: false, } currentAssistant.AddToolCall(toolCall) - return a.messages.Update(genCtx, *currentAssistant) + // Use parent ctx instead of genCtx to ensure the update succeeds + // even if the request is canceled mid-stream + return a.messages.Update(ctx, *currentAssistant) }, OnRetry: func(err *fantasy.ProviderError, delay time.Duration) { // TODO: implement @@ -378,11 +380,15 @@ func (a *sessionAgent) Run(ctx context.Context, call SessionAgentCall) (*fantasy Finished: true, } currentAssistant.AddToolCall(toolCall) - return a.messages.Update(genCtx, *currentAssistant) + // Use parent ctx instead of genCtx to ensure the update succeeds + // even if the request is canceled mid-stream + return a.messages.Update(ctx, *currentAssistant) }, OnToolResult: func(result fantasy.ToolResultContent) error { toolResult := a.convertToToolResult(result) - _, createMsgErr := a.messages.Create(genCtx, currentAssistant.SessionID, message.CreateMessageParams{ + // Use parent ctx instead of genCtx to ensure the message is created + // even if the request is canceled mid-stream + _, createMsgErr := a.messages.Create(ctx, currentAssistant.SessionID, message.CreateMessageParams{ Role: message.Tool, Parts: []message.ContentPart{ toolResult, @@ -485,7 +491,7 @@ func (a *sessionAgent) Run(ctx context.Context, call SessionAgentCall) (*fantasy } content := "There was an error while executing the tool" if isCancelErr { - content = "Tool execution canceled by user" + content = "Error: user cancelled assistant tool calling" } else if isPermissionErr { content = "User denied permission" }