From 7633543aa1cad0d401ffbce36cc6d4cccbe2062a Mon Sep 17 00:00:00 2001 From: Kieran Klukas Date: Tue, 16 Jun 2026 11:06:26 -0400 Subject: [PATCH 001/156] bug(vercel): first reasoning chunk is dropped for unknown formats --- providers/vercel/language_model_hooks.go | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/providers/vercel/language_model_hooks.go b/providers/vercel/language_model_hooks.go index 377dfd094..0d6af5f1d 100644 --- a/providers/vercel/language_model_hooks.go +++ b/providers/vercel/language_model_hooks.go @@ -338,12 +338,16 @@ func languageModelStreamExtra(chunk openaisdk.ChatCompletionChunk, yield func(fa ctx[reasoningStartedCtx] = currentState delta := reasoningData.Reasoning if len(reasoningData.ReasoningDetails) > 0 { - delta = reasoningData.ReasoningDetails[0].Summary - if strings.HasPrefix(reasoningData.ReasoningDetails[0].Format, "google-gemini") { - delta = reasoningData.ReasoningDetails[0].Text - } - if strings.HasPrefix(reasoningData.ReasoningDetails[0].Format, "anthropic-claude") { - delta = reasoningData.ReasoningDetails[0].Text + detail := reasoningData.ReasoningDetails[0] + switch { + case strings.HasPrefix(detail.Format, "google-gemini"): + delta = detail.Text + case strings.HasPrefix(detail.Format, "anthropic-claude"): + delta = detail.Text + case detail.Summary != "": + delta = detail.Summary + default: + delta = detail.Text } } return ctx, yield(fantasy.StreamPart{ From 47c7123c8e42059ab70cdc13c9fdf9f58135b8d7 Mon Sep 17 00:00:00 2001 From: Kieran Klukas Date: Mon, 15 Jun 2026 15:58:50 -0400 Subject: [PATCH 002/156] fix(agent): use last text step as AgentResult.Response When the agent's final step was tool-only (no text content), AgentResult.Response copied that empty step, causing callers to see no output even though earlier steps produced text. finalResponse now walks backwards to find the most recent step with non-blank text. Also clarifies that Text() returns the first text block. --- agent.go | 40 ++++++++++++- agent_test.go | 161 ++++++++++++++++++++++++++++++++++++++++++++++++++ model.go | 2 +- retry_test.go | 1 - 4 files changed, 199 insertions(+), 5 deletions(-) diff --git a/agent.go b/agent.go index 2ce313577..c426db166 100644 --- a/agent.go +++ b/agent.go @@ -9,6 +9,7 @@ import ( "fmt" "maps" "slices" + "strings" "sync" "charm.land/fantasy/jsonrepair" @@ -300,11 +301,44 @@ type AgentStreamCall struct { // AgentResult represents the result of an agent execution. type AgentResult struct { Steps []StepResult - // Final response + // Final response. When the last step is tool-only (no text content), + // this is the response from the most recent step that contained text, + // so callers always see meaningful output without walking Steps manually. Response Response TotalUsage Usage } +// finalResponse picks the best Response from a slice of steps. It walks +// backwards to find the most recent step with non-blank text content. If no +// step has text content (e.g. all steps were tool calls), the last step's +// response is returned as-is. +func finalResponse(steps []StepResult) Response { + for i := len(steps) - 1; i >= 0; i-- { + if hasNonBlankText(steps[i].Content) { + return steps[i].Response + } + } + if len(steps) > 0 { + return steps[len(steps)-1].Response + } + return Response{} +} + +// hasNonBlankText reports whether content contains at least one text block +// with non-whitespace characters. +func hasNonBlankText(content ResponseContent) bool { + for _, c := range content { + if c.GetType() == ContentTypeText { + if tc, ok := AsContentType[TextContent](c); ok { + if strings.TrimSpace(tc.Text) != "" { + return true + } + } + } + } + return false +} + // Agent represents an AI agent that can generate responses and stream responses. type Agent interface { Generate(context.Context, AgentCall) (*AgentResult, error) @@ -555,7 +589,7 @@ func (a *agent) Generate(ctx context.Context, opts AgentCall) (*AgentResult, err agentResult := &AgentResult{ Steps: steps, - Response: steps[len(steps)-1].Response, + Response: finalResponse(steps), TotalUsage: totalUsage, } return agentResult, nil @@ -954,7 +988,7 @@ func (a *agent) Stream(ctx context.Context, opts AgentStreamCall) (*AgentResult, // Finish agent stream agentResult := &AgentResult{ Steps: steps, - Response: steps[len(steps)-1].Response, + Response: finalResponse(steps), TotalUsage: totalUsage, } diff --git a/agent_test.go b/agent_test.go index da10747cd..6b626754a 100644 --- a/agent_test.go +++ b/agent_test.go @@ -850,6 +850,167 @@ func TestResponseContent_Getters_MultipleItems(t *testing.T) { require.Equal(t, "image/png", files[1].MediaType) } +func TestHasNonBlankText(t *testing.T) { + t.Parallel() + + t.Run("single text block", func(t *testing.T) { + content := ResponseContent{TextContent{Text: "hello"}} + require.True(t, hasNonBlankText(content)) + }) + + t.Run("text among tool calls", func(t *testing.T) { + content := ResponseContent{ + TextContent{Text: "preamble"}, + ToolCallContent{ToolCallID: "c1", ToolName: "t", Input: "{}"}, + TextContent{Text: "final answer"}, + } + require.True(t, hasNonBlankText(content)) + }) + + t.Run("whitespace-only is blank", func(t *testing.T) { + content := ResponseContent{ + TextContent{Text: " "}, + } + require.False(t, hasNonBlankText(content)) + }) + + t.Run("mixed whitespace and real text", func(t *testing.T) { + content := ResponseContent{ + TextContent{Text: " "}, + TextContent{Text: "real"}, + } + require.True(t, hasNonBlankText(content)) + }) + + t.Run("empty content", func(t *testing.T) { + require.False(t, hasNonBlankText(ResponseContent{})) + }) + + t.Run("no text blocks", func(t *testing.T) { + content := ResponseContent{ + ToolCallContent{ToolCallID: "c1", ToolName: "t", Input: "{}"}, + } + require.False(t, hasNonBlankText(content)) + }) +} + +func TestFinalResponse(t *testing.T) { + t.Parallel() + + t.Run("last step has text", func(t *testing.T) { + steps := []StepResult{ + {Response: Response{Content: ResponseContent{TextContent{Text: "earlier"}}}}, + {Response: Response{Content: ResponseContent{TextContent{Text: "final"}}}}, + } + resp := finalResponse(steps) + require.Equal(t, "final", resp.Content.Text()) + }) + + t.Run("last step tool-only falls back to earlier text", func(t *testing.T) { + steps := []StepResult{ + {Response: Response{Content: ResponseContent{TextContent{Text: "has text"}}}}, + {Response: Response{Content: ResponseContent{ + ToolCallContent{ToolCallID: "c1", ToolName: "t", Input: "{}"}, + }}}, + } + resp := finalResponse(steps) + require.Equal(t, "has text", resp.Content.Text()) + }) + + t.Run("all steps tool-only returns last", func(t *testing.T) { + steps := []StepResult{ + {Response: Response{Content: ResponseContent{ + ToolCallContent{ToolCallID: "c1", ToolName: "t1", Input: "{}"}, + }}}, + {Response: Response{Content: ResponseContent{ + ToolCallContent{ToolCallID: "c2", ToolName: "t2", Input: "{}"}, + }}}, + } + resp := finalResponse(steps) + toolCalls := resp.Content.ToolCalls() + require.Len(t, toolCalls, 1) + require.Equal(t, "c2", toolCalls[0].ToolCallID) + }) + + t.Run("empty steps", func(t *testing.T) { + resp := finalResponse(nil) + require.Equal(t, "", resp.Content.Text()) + }) + + t.Run("single step with text", func(t *testing.T) { + steps := []StepResult{ + {Response: Response{Content: ResponseContent{TextContent{Text: "only"}}}}, + } + resp := finalResponse(steps) + require.Equal(t, "only", resp.Content.Text()) + }) + + t.Run("skips whitespace-only steps", func(t *testing.T) { + steps := []StepResult{ + {Response: Response{Content: ResponseContent{TextContent{Text: "real"}}}}, + {Response: Response{Content: ResponseContent{TextContent{Text: " "}}}}, + } + resp := finalResponse(steps) + require.Equal(t, "real", resp.Content.Text()) + }) +} + +func TestAgent_Generate_ToolOnlyFinalStep_PreservesEarlierText(t *testing.T) { + t.Parallel() + + type TestInput struct { + Value string `json:"value" description:"Test value"` + } + + tool := NewAgentTool( + "mytool", + "A test tool", + func(ctx context.Context, input TestInput, _ ToolCall) (ToolResponse, error) { + return ToolResponse{Content: "done", IsError: false}, nil + }, + ) + + callCount := 0 + model := &mockLanguageModel{ + generateFunc: func(ctx context.Context, call Call) (*Response, error) { + callCount++ + switch callCount { + case 1: + // First step: text + tool call (model explains then acts). + return &Response{ + Content: []Content{ + TextContent{Text: "Let me check that."}, + ToolCallContent{ + ToolCallID: "call-1", + ToolName: "mytool", + Input: `{"value":"x"}`, + }, + }, + FinishReason: FinishReasonToolCalls, + }, nil + case 2: + // Second step: tool result only, no text. Model stops here. + return &Response{ + Content: []Content{}, + FinishReason: FinishReasonStop, + }, nil + default: + t.Fatalf("unexpected call count: %d", callCount) + return nil, nil + } + }, + } + + agent := NewAgent(model, WithTools(tool)) + result, err := agent.Generate(context.Background(), AgentCall{Prompt: "test"}) + require.NoError(t, err) + require.NotNil(t, result) + require.Len(t, result.Steps, 2) + + // Response should carry text from step 1 even though step 2 is empty. + require.Equal(t, "Let me check that.", result.Response.Content.Text()) +} + func TestStopConditions(t *testing.T) { t.Parallel() diff --git a/model.go b/model.go index 16980da10..2811a4d04 100644 --- a/model.go +++ b/model.go @@ -31,7 +31,7 @@ func (u Usage) String() string { // ResponseContent represents the content of a model response. type ResponseContent []Content -// Text returns the text content of the response. +// Text returns the first text content of the response. func (r ResponseContent) Text() string { for _, c := range r { if c.GetType() == ContentTypeText { diff --git a/retry_test.go b/retry_test.go index 81dce507c..e6a26da8a 100644 --- a/retry_test.go +++ b/retry_test.go @@ -87,7 +87,6 @@ func TestRetryWithExponentialBackoff_ConnectionErrors(t *testing.T) { } return 42, nil }) - if err != nil { t.Fatalf("expected no error, got %v", err) } From 04233bdea5e8235cab72d630eb5033024aff08fa Mon Sep 17 00:00:00 2001 From: Kieran Klukas Date: Tue, 16 Jun 2026 13:24:41 -0400 Subject: [PATCH 003/156] v0.31.1 --- version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.txt b/version.txt index 26bea73e8..f176c9441 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -0.31.0 +0.31.1 From 5c9015a8802c828754130c7d832810c69008c944 Mon Sep 17 00:00:00 2001 From: Amolith Date: Wed, 17 Jun 2026 06:29:46 -0600 Subject: [PATCH 004/156] feat(openai): support max reasoning effort Add ReasoningEffortMax constant and handle it in both the openai and openaicompat provider hooks. Without this, models that accept "max" (e.g. GLM-5.2 via Neuralwatt) error with "reasoning model `max` not supported" before the request reaches the API. Assisted-by: Crush:glm-5.2 --- go.mod | 2 +- go.sum | 4 ++-- providers/openai/language_model_hooks.go | 2 ++ providers/openai/provider_options.go | 2 ++ providers/openaicompat/language_model_hooks.go | 2 ++ 5 files changed, 9 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 3a23194e4..bd3dad5f9 100644 --- a/go.mod +++ b/go.mod @@ -10,7 +10,7 @@ require ( github.com/aws/aws-sdk-go-v2/config v1.32.25 github.com/aws/smithy-go v1.27.2 github.com/charmbracelet/anthropic-sdk-go v0.0.0-20260223140439-63879b0b8dab - github.com/charmbracelet/openai-go v0.0.0-20260319145158-d0740cc34266 + github.com/charmbracelet/openai-go v0.0.0-20260617131321-5e4b9c18c4be github.com/charmbracelet/x/exp/slice v0.0.0-20250904123553-b4e2667e5ad5 github.com/charmbracelet/x/exp/strings v0.1.0 github.com/charmbracelet/x/json v0.2.0 diff --git a/go.sum b/go.sum index cecbcadc5..fcd7554f4 100644 --- a/go.sum +++ b/go.sum @@ -88,8 +88,8 @@ github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UF github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/charmbracelet/anthropic-sdk-go v0.0.0-20260223140439-63879b0b8dab h1:J7XQLgl9sefgTnTGrmX3xqvp5o6MCiBzEjGv5igAlc4= github.com/charmbracelet/anthropic-sdk-go v0.0.0-20260223140439-63879b0b8dab/go.mod h1:hqlYqR7uPKOKfnNeicUbZp0Ps0GeYFlKYtwh5HGDCx8= -github.com/charmbracelet/openai-go v0.0.0-20260319145158-d0740cc34266 h1:BW/sZtyd1JyYy0h5adMm3tzpNyL857LWjuTRET6OhpY= -github.com/charmbracelet/openai-go v0.0.0-20260319145158-d0740cc34266/go.mod h1:1DahUaExbUZx/jD+FNT2PKP4L9rLE5+ZBRuI8mZjd/E= +github.com/charmbracelet/openai-go v0.0.0-20260617131321-5e4b9c18c4be h1:pg+OWlIkk9HOe/8P5J95aKe2wGDzFUiiyFOUpwR30B4= +github.com/charmbracelet/openai-go v0.0.0-20260617131321-5e4b9c18c4be/go.mod h1:1DahUaExbUZx/jD+FNT2PKP4L9rLE5+ZBRuI8mZjd/E= github.com/charmbracelet/x/exp/slice v0.0.0-20250904123553-b4e2667e5ad5 h1:DTSZxdV9qQagD4iGcAt9RgaRBZtJl01bfKgdLzUzUPI= github.com/charmbracelet/x/exp/slice v0.0.0-20250904123553-b4e2667e5ad5/go.mod h1:vI5nDVMWi6veaYH+0Fmvpbe/+cv/iJfMntdh+N0+Tms= github.com/charmbracelet/x/exp/strings v0.1.0 h1:i69S2XI7uG1u4NLGeJPSYU++Nmjvpo9nwd6aoEm7gkA= diff --git a/providers/openai/language_model_hooks.go b/providers/openai/language_model_hooks.go index 7da22c9dc..26516e27b 100644 --- a/providers/openai/language_model_hooks.go +++ b/providers/openai/language_model_hooks.go @@ -123,6 +123,8 @@ func DefaultPrepareCallFunc(model fantasy.LanguageModel, params *openai.ChatComp params.ReasoningEffort = shared.ReasoningEffortHigh case ReasoningEffortXHigh: params.ReasoningEffort = shared.ReasoningEffortXhigh + case ReasoningEffortMax: + params.ReasoningEffort = shared.ReasoningEffortMax default: return nil, fmt.Errorf("reasoning model `%s` not supported", *providerOptions.ReasoningEffort) } diff --git a/providers/openai/provider_options.go b/providers/openai/provider_options.go index 0e5e8336f..27109199b 100644 --- a/providers/openai/provider_options.go +++ b/providers/openai/provider_options.go @@ -24,6 +24,8 @@ const ( ReasoningEffortHigh ReasoningEffort = "high" // ReasoningEffortXHigh represents extra-high reasoning effort. ReasoningEffortXHigh ReasoningEffort = "xhigh" + // ReasoningEffortMax represents maximum reasoning effort. + ReasoningEffortMax ReasoningEffort = "max" ) // Global type identifiers for OpenAI-specific provider data. diff --git a/providers/openaicompat/language_model_hooks.go b/providers/openaicompat/language_model_hooks.go index 5ffefb692..4bbdd2c03 100644 --- a/providers/openaicompat/language_model_hooks.go +++ b/providers/openaicompat/language_model_hooks.go @@ -39,6 +39,8 @@ func PrepareCallFunc(model fantasy.LanguageModel, params *openaisdk.ChatCompleti params.ReasoningEffort = shared.ReasoningEffortHigh case openai.ReasoningEffortXHigh: params.ReasoningEffort = shared.ReasoningEffortXhigh + case openai.ReasoningEffortMax: + params.ReasoningEffort = shared.ReasoningEffortMax default: return nil, fmt.Errorf("reasoning model `%s` not supported", *providerOptions.ReasoningEffort) } From 59d8f7a7fcf7e8fd3cc7d2edaa68f47b3f6658e5 Mon Sep 17 00:00:00 2001 From: Kieran Klukas Date: Wed, 17 Jun 2026 11:26:06 -0400 Subject: [PATCH 005/156] fix(vercel,openrouter): emit empty ReasoningStart for streaming reasoning ReasoningStart was carrying the first reasoning token in its Delta field, which broke consumers that treat Start as a pure signal (matching TextStart convention). Split into empty Start + separate ReasoningDelta. Encrypted single-shot blocks still use atomic Start+Delta+End since they don't stream. Assisted-by: Crush:qwen3.7-max --- providers/openrouter/language_model_hooks.go | 17 +++++++++++++---- providers/vercel/language_model_hooks.go | 17 +++++++++++++---- 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/providers/openrouter/language_model_hooks.go b/providers/openrouter/language_model_hooks.go index 18218322f..265c0c098 100644 --- a/providers/openrouter/language_model_hooks.go +++ b/providers/openrouter/language_model_hooks.go @@ -295,15 +295,24 @@ func languageModelStreamExtra(chunk openaisdk.ChatCompletionChunk, yield func(fa currentState.format = detail.Format ctx[reasoningStartedCtx] = currentState + if !yield(fantasy.StreamPart{ + Type: fantasy.StreamPartTypeReasoningStart, + ID: fmt.Sprintf("%d", inx), + ProviderMetadata: metadata, + }) { + return ctx, false + } delta := detail.Summary if xstrings.ContainsAnyOf(detail.Format, "google-gemini", "anthropic-claude") { delta = detail.Text } + if delta == "" { + return ctx, true + } return ctx, yield(fantasy.StreamPart{ - Type: fantasy.StreamPartTypeReasoningStart, - ID: fmt.Sprintf("%d", inx), - Delta: delta, - ProviderMetadata: metadata, + Type: fantasy.StreamPartTypeReasoningDelta, + ID: fmt.Sprintf("%d", inx), + Delta: delta, }) } if len(reasoningData.ReasoningDetails) == 0 { diff --git a/providers/vercel/language_model_hooks.go b/providers/vercel/language_model_hooks.go index 0d6af5f1d..e01ed1aaa 100644 --- a/providers/vercel/language_model_hooks.go +++ b/providers/vercel/language_model_hooks.go @@ -336,6 +336,13 @@ func languageModelStreamExtra(chunk openaisdk.ChatCompletionChunk, yield func(fa } ctx[reasoningStartedCtx] = currentState + if !yield(fantasy.StreamPart{ + Type: fantasy.StreamPartTypeReasoningStart, + ID: fmt.Sprintf("%d", inx), + ProviderMetadata: metadata, + }) { + return ctx, false + } delta := reasoningData.Reasoning if len(reasoningData.ReasoningDetails) > 0 { detail := reasoningData.ReasoningDetails[0] @@ -350,11 +357,13 @@ func languageModelStreamExtra(chunk openaisdk.ChatCompletionChunk, yield func(fa delta = detail.Text } } + if delta == "" { + return ctx, true + } return ctx, yield(fantasy.StreamPart{ - Type: fantasy.StreamPartTypeReasoningStart, - ID: fmt.Sprintf("%d", inx), - Delta: delta, - ProviderMetadata: metadata, + Type: fantasy.StreamPartTypeReasoningDelta, + ID: fmt.Sprintf("%d", inx), + Delta: delta, }) } From fafadf59333157fcb49949a97f155a905aa851a0 Mon Sep 17 00:00:00 2001 From: Kieran Klukas Date: Wed, 17 Jun 2026 12:38:05 -0400 Subject: [PATCH 006/156] v0.32.0 --- version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.txt b/version.txt index f176c9441..9eb2aa3f1 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -0.31.1 +0.32.0 From 13774e96ce01f74332eb60071608246569e8f708 Mon Sep 17 00:00:00 2001 From: Kieran Klukas Date: Mon, 1 Jun 2026 14:20:06 -0400 Subject: [PATCH 007/156] feat(openai): expose extra usage fields in ProviderMetadata --- providers/openai/language_model_hooks.go | 3 ++ providers/openai/provider_options.go | 35 ++++++++++++++++++++++++ providers/openaicompat/openaicompat.go | 9 ++++++ 3 files changed, 47 insertions(+) diff --git a/providers/openai/language_model_hooks.go b/providers/openai/language_model_hooks.go index 26516e27b..4d2ab5f2d 100644 --- a/providers/openai/language_model_hooks.go +++ b/providers/openai/language_model_hooks.go @@ -219,6 +219,7 @@ func DefaultUsageFunc(response openai.ChatCompletion) (fantasy.Usage, fantasy.Pr } // OpenAI reports prompt_tokens INCLUDING cached tokens. Subtract to avoid double-counting. inputTokens := max(response.Usage.PromptTokens-promptTokenDetails.CachedTokens, 0) + providerMetadata.ExtraFields = ExtractExtraFields(response.Usage.JSON.ExtraFields) return fantasy.Usage{ InputTokens: inputTokens, OutputTokens: response.Usage.CompletionTokens, @@ -265,6 +266,8 @@ func DefaultStreamUsageFunc(chunk openai.ChatCompletionChunk, _ map[string]any, } } + streamProviderMetadata.ExtraFields = ExtractExtraFields(chunk.Usage.JSON.ExtraFields) + return usage, fantasy.ProviderMetadata{ Name: streamProviderMetadata, } diff --git a/providers/openai/provider_options.go b/providers/openai/provider_options.go index 27109199b..2aa482fce 100644 --- a/providers/openai/provider_options.go +++ b/providers/openai/provider_options.go @@ -6,6 +6,7 @@ import ( "charm.land/fantasy" "github.com/charmbracelet/openai-go" + "github.com/charmbracelet/openai-go/packages/respjson" ) // ReasoningEffort represents the reasoning effort level for OpenAI models. @@ -65,6 +66,40 @@ type ProviderMetadata struct { Logprobs []openai.ChatCompletionTokenLogprob `json:"logprobs"` AcceptedPredictionTokens int64 `json:"accepted_prediction_tokens"` RejectedPredictionTokens int64 `json:"rejected_prediction_tokens"` + // ExtraFields captures non-standard fields from the usage object. + // Keys are field names, values are raw JSON. + ExtraFields map[string]json.RawMessage `json:"extra_fields,omitempty"` +} + +// ExtraField parses an extra usage field into the provided target. +// Returns false if the field is not present or cannot be parsed. +func (m *ProviderMetadata) ExtraField(key string, target any) bool { + if m == nil || m.ExtraFields == nil { + return false + } + raw, ok := m.ExtraFields[key] + if !ok { + return false + } + return json.Unmarshal(raw, target) == nil +} + +// ExtractExtraFields reads non-standard fields from the SDK's +// ExtraFields map and returns them as a map of raw JSON values. +func ExtractExtraFields(extraFields map[string]respjson.Field) map[string]json.RawMessage { + if len(extraFields) == 0 { + return nil + } + ext := make(map[string]json.RawMessage, len(extraFields)) + for k, f := range extraFields { + if raw := f.Raw(); raw != "" && raw != "null" { + ext[k] = json.RawMessage(raw) + } + } + if len(ext) == 0 { + return nil + } + return ext } // Options implements the ProviderOptions interface. diff --git a/providers/openaicompat/openaicompat.go b/providers/openaicompat/openaicompat.go index 4e9894462..9bd9a13b2 100644 --- a/providers/openaicompat/openaicompat.go +++ b/providers/openaicompat/openaicompat.go @@ -129,3 +129,12 @@ func WithResponsesAPIFunc(fn func(modelID string) bool) Option { o.openaiOptions = append(o.openaiOptions, openai.WithResponsesAPIFunc(fn)) } } + +// WithLanguageModelOptions appends language model options to the provider. +// This allows callers to customize usage extraction, stream handling, and +// other language model behaviors. +func WithLanguageModelOptions(opts ...openai.LanguageModelOption) Option { + return func(o *options) { + o.languageModelOptions = append(o.languageModelOptions, opts...) + } +} From a13a1b3c4688b53949a5dc992f8d91601a5bec69 Mon Sep 17 00:00:00 2001 From: Kieran Klukas Date: Thu, 18 Jun 2026 22:24:35 -0400 Subject: [PATCH 008/156] v0.33.0 --- version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.txt b/version.txt index 9eb2aa3f1..be386c9ed 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -0.32.0 +0.33.0 From 6b4e9b20b7302ff5b0a0b44aa3a963edc3eb3e6d Mon Sep 17 00:00:00 2001 From: Kieran Klukas Date: Thu, 18 Jun 2026 23:25:50 -0400 Subject: [PATCH 009/156] fix(openai): allow tools and content in the same delta --- providers/openai/language_model.go | 6 +-- providers/openai/openai_test.go | 80 ++++++++++++++++++++++++++++++ 2 files changed, 83 insertions(+), 3 deletions(-) diff --git a/providers/openai/language_model.go b/providers/openai/language_model.go index 231a77213..f614a460a 100644 --- a/providers/openai/language_model.go +++ b/providers/openai/language_model.go @@ -349,8 +349,7 @@ func (o languageModel) Stream(ctx context.Context, call fantasy.Call) (fantasy.S if choice.FinishReason != "" { finishReason = choice.FinishReason } - switch { - case choice.Delta.Content != "": + if choice.Delta.Content != "" { if !isActiveText { isActiveText = true if !yield(fantasy.StreamPart{ @@ -367,7 +366,8 @@ func (o languageModel) Stream(ctx context.Context, call fantasy.Call) (fantasy.S }) { return } - case len(choice.Delta.ToolCalls) > 0: + } + if len(choice.Delta.ToolCalls) > 0 { if isActiveText { isActiveText = false if !yield(fantasy.StreamPart{ diff --git a/providers/openai/openai_test.go b/providers/openai/openai_test.go index 17d4af015..94eb1f849 100644 --- a/providers/openai/openai_test.go +++ b/providers/openai/openai_test.go @@ -2288,6 +2288,24 @@ func (sms *streamingMockServer) prepareToolStreamResponse() { sms.chunks = chunks } +func (sms *streamingMockServer) prepareMixedContentAndToolStreamResponse() { + chunks := []string{ + // Chunk with both content and tool_calls in the same delta + `data: {"id":"chatcmpl-mixed","object":"chat.completion.chunk","created":1711357598,"model":"gpt-3.5-turbo-0125","system_fingerprint":"fp_3bc1b5746c","choices":[{"index":0,"delta":{"role":"assistant","content":"thinking before tool","tool_calls":[{"index":0,"id":"call_mixed","type":"function","function":{"name":"test-tool","arguments":""}}]},"logprobs":null,"finish_reason":null}]}` + "\n\n", + // Tool call argument deltas + `data: {"id":"chatcmpl-mixed","object":"chat.completion.chunk","created":1711357598,"model":"gpt-3.5-turbo-0125","system_fingerprint":"fp_3bc1b5746c","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"{\""}}]},"logprobs":null,"finish_reason":null}]}` + "\n\n", + `data: {"id":"chatcmpl-mixed","object":"chat.completion.chunk","created":1711357598,"model":"gpt-3.5-turbo-0125","system_fingerprint":"fp_3bc1b5746c","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"value"}}]},"logprobs":null,"finish_reason":null}]}` + "\n\n", + `data: {"id":"chatcmpl-mixed","object":"chat.completion.chunk","created":1711357598,"model":"gpt-3.5-turbo-0125","system_fingerprint":"fp_3bc1b5746c","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"\":\""}}]},"logprobs":null,"finish_reason":null}]}` + "\n\n", + `data: {"id":"chatcmpl-mixed","object":"chat.completion.chunk","created":1711357598,"model":"gpt-3.5-turbo-0125","system_fingerprint":"fp_3bc1b5746c","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"hello"}}]},"logprobs":null,"finish_reason":null}]}` + "\n\n", + `data: {"id":"chatcmpl-mixed","object":"chat.completion.chunk","created":1711357598,"model":"gpt-3.5-turbo-0125","system_fingerprint":"fp_3bc1b5746c","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"\"}"}}]},"logprobs":null,"finish_reason":null}]}` + "\n\n", + // Finish + `data: {"id":"chatcmpl-mixed","object":"chat.completion.chunk","created":1711357598,"model":"gpt-3.5-turbo-0125","system_fingerprint":"fp_3bc1b5746c","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"tool_calls"}]}` + "\n\n", + `data: {"id":"chatcmpl-mixed","object":"chat.completion.chunk","created":1711357598,"model":"gpt-3.5-turbo-0125","system_fingerprint":"fp_3bc1b5746c","choices":[],"usage":{"prompt_tokens":53,"completion_tokens":17,"total_tokens":70}}` + "\n\n", + "data: [DONE]\n\n", + } + sms.chunks = chunks +} + func (sms *streamingMockServer) prepareErrorStreamResponse() { chunks := []string{ `data: {"error":{"message": "The server had an error processing your request. Sorry about that! You can retry your request, or contact us through our help center at help.openai.com if you keep seeing this error.","type":"server_error","param":null,"code":null}}` + "\n\n", @@ -2566,6 +2584,68 @@ func TestDoStream(t *testing.T) { require.Equal(t, `{"value":"Sparkle Day"}`, fullInput.String()) }) + t.Run("should handle mixed content and tool calls in same chunk", func(t *testing.T) { + t.Parallel() + + server := newStreamingMockServer() + defer server.close() + + server.prepareMixedContentAndToolStreamResponse() + + provider, err := New( + WithAPIKey("test-api-key"), + WithBaseURL(server.server.URL), + ) + require.NoError(t, err) + model, _ := provider.LanguageModel(t.Context(), "gpt-3.5-turbo") + + stream, err := model.Stream(context.Background(), fantasy.Call{ + Prompt: testPrompt, + Tools: []fantasy.Tool{ + fantasy.FunctionTool{ + Name: "test-tool", + InputSchema: map[string]any{ + "type": "object", + "properties": map[string]any{ + "value": map[string]any{ + "type": "string", + }, + }, + "required": []string{"value"}, + "additionalProperties": false, + "$schema": "http://json-schema.org/draft-07/schema#", + }, + }, + }, + }) + + require.NoError(t, err) + + parts, err := collectStreamParts(stream) + require.NoError(t, err) + + // Verify both text and tool call parts are present + hasTextDelta := false + toolCall := -1 + + for i, part := range parts { + switch part.Type { + case fantasy.StreamPartTypeTextDelta: + if part.Delta == "thinking before tool" { + hasTextDelta = true + } + case fantasy.StreamPartTypeToolCall: + toolCall = i + require.Equal(t, "call_mixed", part.ID) + require.Equal(t, "test-tool", part.ToolCallName) + require.Equal(t, `{"value":"hello"}`, part.ToolCallInput) + } + } + + require.True(t, hasTextDelta, "expected text delta from mixed chunk") + require.NotEqual(t, -1, toolCall, "expected tool call from mixed chunk") + }) + t.Run("should handle tool calls with empty arguments", func(t *testing.T) { t.Parallel() From 5bcdd5bc3f60d85186a6cb8d35d2114032df2cf6 Mon Sep 17 00:00:00 2001 From: Dustin Lagoy Date: Fri, 19 Jun 2026 12:22:02 -0700 Subject: [PATCH 010/156] fix(openai): make latest azure gpt models work (#288) --- providers/openai/language_model.go | 13 ++++++++----- providers/openai/responses_language_model.go | 16 ++++++++-------- providers/openai/responses_options.go | 9 +++++++-- 3 files changed, 23 insertions(+), 15 deletions(-) diff --git a/providers/openai/language_model.go b/providers/openai/language_model.go index f614a460a..7456e9f6a 100644 --- a/providers/openai/language_model.go +++ b/providers/openai/language_model.go @@ -600,7 +600,7 @@ func isReasoningModel(modelID string) bool { strings.HasPrefix(modelID, "o3") || strings.Contains(modelID, "-o3") || strings.HasPrefix(modelID, "o4") || strings.Contains(modelID, "-o4") || strings.HasPrefix(modelID, "oss") || strings.Contains(modelID, "-oss") || - strings.Contains(modelID, "gpt-5") || strings.Contains(modelID, "gpt-5-chat") + strings.Contains(strings.ToLower(modelID), "gpt-5") } func isSearchPreviewModel(modelID string) bool { @@ -609,13 +609,16 @@ func isSearchPreviewModel(modelID string) bool { func supportsFlexProcessing(modelID string) bool { return strings.HasPrefix(modelID, "o3") || strings.Contains(modelID, "-o3") || - strings.Contains(modelID, "o4-mini") || strings.Contains(modelID, "gpt-5") + strings.Contains(modelID, "o4-mini") || + strings.Contains(strings.ToLower(modelID), "gpt-5") } func supportsPriorityProcessing(modelID string) bool { - return strings.Contains(modelID, "gpt-4") || strings.Contains(modelID, "gpt-5") || - strings.Contains(modelID, "gpt-5-mini") || strings.HasPrefix(modelID, "o3") || - strings.Contains(modelID, "-o3") || strings.Contains(modelID, "o4-mini") + return strings.Contains(strings.ToLower(modelID), "gpt-4") || + strings.Contains(strings.ToLower(modelID), "gpt-5") || + strings.HasPrefix(modelID, "o3") || + strings.Contains(modelID, "-o3") || + strings.Contains(modelID, "o4-mini") } func toOpenAiTools(tools []fantasy.Tool, toolChoice *fantasy.ToolChoice) (openAiTools []openai.ChatCompletionToolUnionParam, openAiToolChoice *openai.ChatCompletionToolChoiceOptionUnionParam, warnings []fantasy.CallWarning) { diff --git a/providers/openai/responses_language_model.go b/providers/openai/responses_language_model.go index 9d9771360..c1d4d4142 100644 --- a/providers/openai/responses_language_model.go +++ b/providers/openai/responses_language_model.go @@ -60,11 +60,11 @@ func getResponsesModelConfig(modelID string) responsesModelConfig { strings.Contains(modelID, "-o3") || strings.Contains(modelID, "o4-mini") || (strings.Contains(modelID, "gpt-5") && !strings.Contains(modelID, "gpt-5-chat")) - supportsPriorityProcessing := strings.Contains(modelID, "gpt-4") || - strings.Contains(modelID, "gpt-5-mini") || - (strings.Contains(modelID, "gpt-5") && - !strings.Contains(modelID, "gpt-5-nano") && - !strings.Contains(modelID, "gpt-5-chat")) || + supportsPriorityProcessing := strings.Contains(strings.ToLower(modelID), "gpt-4") || + strings.Contains(strings.ToLower(modelID), "gpt-5-mini") || + (strings.Contains(strings.ToLower(modelID), "gpt-5") && + !strings.Contains(strings.ToLower(modelID), "gpt-5-nano") && + !strings.Contains(strings.ToLower(modelID), "gpt-5-chat")) || strings.HasPrefix(modelID, "o3") || strings.Contains(modelID, "-o3") || strings.Contains(modelID, "o4-mini") @@ -76,7 +76,7 @@ func getResponsesModelConfig(modelID string) responsesModelConfig { supportsPriorityProcessing: supportsPriorityProcessing, } - if strings.Contains(modelID, "gpt-5-chat") { + if strings.Contains(strings.ToLower(modelID), "gpt-5-chat") { return responsesModelConfig{ isReasoningModel: false, systemMessageMode: defaults.systemMessageMode, @@ -90,8 +90,8 @@ func getResponsesModelConfig(modelID string) responsesModelConfig { strings.HasPrefix(modelID, "o3") || strings.Contains(modelID, "-o3") || strings.HasPrefix(modelID, "o4") || strings.Contains(modelID, "-o4") || strings.HasPrefix(modelID, "oss") || strings.Contains(modelID, "-oss") || - strings.Contains(modelID, "gpt-5") || strings.Contains(modelID, "codex-") || - strings.Contains(modelID, "computer-use") { + strings.Contains(strings.ToLower(modelID), "gpt-5") || + strings.Contains(modelID, "codex-") || strings.Contains(modelID, "computer-use") { if strings.Contains(modelID, "o1-mini") || strings.Contains(modelID, "o1-preview") { return responsesModelConfig{ isReasoningModel: true, diff --git a/providers/openai/responses_options.go b/providers/openai/responses_options.go index 42cdf984c..a06e948af 100644 --- a/providers/openai/responses_options.go +++ b/providers/openai/responses_options.go @@ -4,6 +4,7 @@ package openai import ( "encoding/json" "slices" + "strings" "charm.land/fantasy" ) @@ -272,12 +273,16 @@ func ParseResponsesOptions(data map[string]any) (*ResponsesProviderOptions, erro // IsResponsesModel checks if a model ID is a Responses API model for OpenAI. func IsResponsesModel(modelID string) bool { - return slices.Contains(responsesModelIDs, modelID) + return slices.Contains(responsesModelIDs, modelID) || + strings.Contains(strings.ToLower(modelID), "gpt-4") || + strings.Contains(strings.ToLower(modelID), "gpt-5") } // IsResponsesReasoningModel checks if a model ID is a Responses API reasoning model for OpenAI. func IsResponsesReasoningModel(modelID string) bool { - return slices.Contains(responsesReasoningModelIDs, modelID) + return slices.Contains(responsesReasoningModelIDs, modelID) || + strings.Contains(strings.ToLower(modelID), "gpt-4") || + strings.Contains(strings.ToLower(modelID), "gpt-5") } // SearchContextSize controls how much context window space the From 5ff510190a1233c6ff155fbfc3abb450537d0a11 Mon Sep 17 00:00:00 2001 From: Kieran Klukas Date: Fri, 19 Jun 2026 14:28:21 -0400 Subject: [PATCH 011/156] fix(openai): defer streaming tool call finalization to end-of-stream MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Providers that stream tool call arguments across many fragments (e.g. GLM 5.2) can produce a valid JSON prefix before the full payload arrives. The old code finalized on the first valid JSON, truncating the remaining fragments and producing malformed arguments that caused API rejections and session crashes on the next turn. Now deltas flow through incrementally for progress visibility, but ToolInputEnd and ToolCall are emitted only after the stream completes. Also fixes a stale delta bug in the new-tool-call branch and adds deterministic index-sorted finalization for parallel tool calls. 💘 Generated with Crush Assisted-by: Crush:qwen3.7-max --- providers/openai/language_model.go | 72 +++++++----------------------- 1 file changed, 16 insertions(+), 56 deletions(-) diff --git a/providers/openai/language_model.go b/providers/openai/language_model.go index 7456e9f6a..77df7a4a1 100644 --- a/providers/openai/language_model.go +++ b/providers/openai/language_model.go @@ -8,6 +8,7 @@ import ( "fmt" "io" "reflect" + "slices" "strings" "charm.land/fantasy" @@ -16,7 +17,6 @@ import ( "github.com/charmbracelet/openai-go" "github.com/charmbracelet/openai-go/packages/param" "github.com/charmbracelet/openai-go/shared" - xjson "github.com/charmbracelet/x/json" "github.com/google/uuid" ) @@ -380,39 +380,17 @@ func (o languageModel) Stream(ctx context.Context, call fantasy.Call) (fantasy.S for _, toolCallDelta := range choice.Delta.ToolCalls { if existingToolCall, ok := toolCalls[toolCallDelta.Index]; ok { - if existingToolCall.hasFinished { - continue - } if toolCallDelta.Function.Arguments != "" { existingToolCall.arguments += toolCallDelta.Function.Arguments - } - if !yield(fantasy.StreamPart{ - Type: fantasy.StreamPartTypeToolInputDelta, - ID: existingToolCall.id, - Delta: toolCallDelta.Function.Arguments, - }) { - return - } - toolCalls[toolCallDelta.Index] = existingToolCall - if xjson.IsValid(existingToolCall.arguments) { - if !yield(fantasy.StreamPart{ - Type: fantasy.StreamPartTypeToolInputEnd, - ID: existingToolCall.id, - }) { - return - } - if !yield(fantasy.StreamPart{ - Type: fantasy.StreamPartTypeToolCall, - ID: existingToolCall.id, - ToolCallName: existingToolCall.name, - ToolCallInput: existingToolCall.arguments, + Type: fantasy.StreamPartTypeToolInputDelta, + ID: existingToolCall.id, + Delta: toolCallDelta.Function.Arguments, }) { return } - existingToolCall.hasFinished = true - toolCalls[toolCallDelta.Index] = existingToolCall } + toolCalls[toolCallDelta.Index] = existingToolCall } else { // Some provider like Ollama may send empty tool calls or miss some fields. // We'll skip when we don't have enough info and also assume sane defaults. @@ -443,34 +421,14 @@ func (o languageModel) Stream(ctx context.Context, call fantasy.Call) (fantasy.S arguments: toolCallDelta.Function.Arguments, } - exTc := toolCalls[toolCallDelta.Index] - if exTc.arguments != "" { + if toolCallDelta.Function.Arguments != "" { if !yield(fantasy.StreamPart{ Type: fantasy.StreamPartTypeToolInputDelta, - ID: exTc.id, - Delta: exTc.arguments, + ID: toolCallDelta.ID, + Delta: toolCallDelta.Function.Arguments, }) { return } - if xjson.IsValid(toolCalls[toolCallDelta.Index].arguments) { - if !yield(fantasy.StreamPart{ - Type: fantasy.StreamPartTypeToolInputEnd, - ID: exTc.id, - }) { - return - } - - if !yield(fantasy.StreamPart{ - Type: fantasy.StreamPartTypeToolCall, - ID: exTc.id, - ToolCallName: exTc.name, - ToolCallInput: exTc.arguments, - }) { - return - } - exTc.hasFinished = true - toolCalls[toolCallDelta.Index] = exTc - } } continue } @@ -516,12 +474,14 @@ func (o languageModel) Stream(ctx context.Context, call fantasy.Call) (fantasy.S } } - // Handle tool calls that finish with empty arguments (e.g., Copilot). - // Normalize empty args to "{}" and emit the tool call. - // If the arguments are invalid JSON, we still yield the tool call - // so the consumer (agent) can handle the error rather than - // silently dropping it. - for idx, tc := range toolCalls { + // Finalize tool calls in index order after the stream completes. + indices := make([]int64, 0, len(toolCalls)) + for idx := range toolCalls { + indices = append(indices, idx) + } + slices.Sort(indices) + for _, idx := range indices { + tc := toolCalls[idx] if tc.hasFinished { continue } From f018b24a8f46dfe3c897f2bab3692d11a9e157c4 Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Fri, 19 Jun 2026 16:37:08 -0300 Subject: [PATCH 012/156] fix: include available tool names in "tool not found" errors (#290) When a model generates an invalid tool name (e.g. Kimi putting call IDs in the function name field), the error message now lists all available tools so the model can self-correct on the next turn. Assisted-by: Crush:claude-opus-4-6 --- agent.go | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/agent.go b/agent.go index c426db166..ad43fbef1 100644 --- a/agent.go +++ b/agent.go @@ -1122,7 +1122,14 @@ func (a *agent) validateToolCall(toolCall ToolCallContent, availableTools []Agen return nil } } - return fmt.Errorf("tool not found: %s", toolCall.ToolName) + names := make([]string, 0, len(availableTools)+len(execProviderTools)) + for _, t := range availableTools { + names = append(names, t.Info().Name) + } + for _, ept := range execProviderTools { + names = append(names, ept.GetName()) + } + return fmt.Errorf("tool not found: %s. Available tools: %s", toolCall.ToolName, strings.Join(names, ", ")) } // Validate JSON parsing From e057614c404a9dfe1f703b0c42685c4c8d56027a Mon Sep 17 00:00:00 2001 From: Eswar Dudi Date: Sat, 20 Jun 2026 01:09:49 +0530 Subject: [PATCH 013/156] fix(google): omit function call id for vertex ai to prevent error 400 (#278) --- providers/google/google.go | 42 +++++++++++++------ .../vertex-gemini-2-5-flash/multi_tool.yaml | 2 +- .../multi_tool_streaming.yaml | 2 +- .../vertex-gemini-2-5-flash/tool.yaml | 2 +- .../tool_streaming.yaml | 2 +- .../vertex-gemini-2-5-pro/multi_tool.yaml | 2 +- .../multi_tool_streaming.yaml | 2 +- .../vertex-gemini-2-5-pro/tool.yaml | 2 +- .../vertex-gemini-2-5-pro/tool_streaming.yaml | 2 +- 9 files changed, 38 insertions(+), 20 deletions(-) diff --git a/providers/google/google.go b/providers/google/google.go index 6fb1e3e20..f82314102 100644 --- a/providers/google/google.go +++ b/providers/google/google.go @@ -235,7 +235,8 @@ func (g languageModel) prepareParams(call fantasy.Call) (*genai.GenerateContentC } } - systemInstructions, content, warnings := toGooglePrompt(call.Prompt) + isVertexAI := g.providerOptions.backend == genai.BackendVertexAI + systemInstructions, content, warnings := toGooglePrompt(call.Prompt, isVertexAI) if providerOptions.ThinkingConfig != nil { if providerOptions.ThinkingConfig.IncludeThoughts != nil && @@ -347,7 +348,7 @@ func (g languageModel) prepareParams(call fantasy.Call) (*genai.GenerateContentC return config, content, warnings, nil } -func toGooglePrompt(prompt fantasy.Prompt) (*genai.Content, []*genai.Content, []fantasy.CallWarning) { //nolint: unparam +func toGooglePrompt(prompt fantasy.Prompt, isVertexAI bool) (*genai.Content, []*genai.Content, []fantasy.CallWarning) { //nolint: unparam var systemInstructions *genai.Content var content []*genai.Content var warnings []fantasy.CallWarning @@ -462,6 +463,11 @@ func toGooglePrompt(prompt fantasy.Prompt) (*genai.Content, []*genai.Content, [] Args: result, }, } + + // Vertex breaks with a 400 if this field be present. + if isVertexAI { + geminiPart.FunctionCall.ID = "" + } if currentReasoningMetadata != nil { geminiPart.ThoughtSignature = []byte(currentReasoningMetadata.Signature) currentReasoningMetadata = nil @@ -506,12 +512,18 @@ func toGooglePrompt(prompt fantasy.Prompt) (*genai.Content, []*genai.Content, [] continue } response := map[string]any{"result": content.Text} + functionResponse := &genai.FunctionResponse{ + ID: result.ToolCallID, + Response: response, + Name: toolCall.ToolName, + } + + // Vertex breaks with a 400 if this field be present. + if isVertexAI { + functionResponse.ID = "" + } parts = append(parts, &genai.Part{ - FunctionResponse: &genai.FunctionResponse{ - ID: result.ToolCallID, - Response: response, - Name: toolCall.ToolName, - }, + FunctionResponse: functionResponse, }) case fantasy.ToolResultContentTypeError: @@ -520,12 +532,18 @@ func toGooglePrompt(prompt fantasy.Prompt) (*genai.Content, []*genai.Content, [] continue } response := map[string]any{"result": content.Error.Error()} + functionResponse := &genai.FunctionResponse{ + ID: result.ToolCallID, + Response: response, + Name: toolCall.ToolName, + } + + // Vertex breaks with a 400 if this field be present. + if isVertexAI { + functionResponse.ID = "" + } parts = append(parts, &genai.Part{ - FunctionResponse: &genai.FunctionResponse{ - ID: result.ToolCallID, - Response: response, - Name: toolCall.ToolName, - }, + FunctionResponse: functionResponse, }) } } diff --git a/providertests/testdata/TestGoogleCommon/vertex-gemini-2-5-flash/multi_tool.yaml b/providertests/testdata/TestGoogleCommon/vertex-gemini-2-5-flash/multi_tool.yaml index 46966288b..a9dc94946 100644 --- a/providertests/testdata/TestGoogleCommon/vertex-gemini-2-5-flash/multi_tool.yaml +++ b/providertests/testdata/TestGoogleCommon/vertex-gemini-2-5-flash/multi_tool.yaml @@ -93,7 +93,7 @@ interactions: content_length: 1549 host: us-east5-aiplatform.googleapis.com body: | - {"contents":[{"parts":[{"text":"Add and multiply the number 2 and 3"}],"role":"user"},{"parts":[{"functionCall":{"args":{"a":2,"b":3},"id":"1","name":"add"},"thoughtSignature":"CpICAY89a1+Gm+gqy5KEfxpOLwsLfsZBhMovtwfzDW0gEBgOw+bpm9YTJExW/7mXnG4xCDgpd8nOmWA92HX3KWO9umiAKQc6u+TQRe7xqOvAyCdNFjxBVUbzVh8pRroWFnwr3ceqt4+4vMSONorj6Agki5CZ0wl3XHlgxr7kEAMiVuka9Mdi2dYSBB2zfaKSZMHznl8uetDyUXnGvZj4GWPHsayBrFUqYeDko8GyzlqfpN2ZB3SjqobwjWw6L3QpABB613LYDHy52QaSbX3AFyr0YEE38lujZXqDtUmEyRs9v3I7fJ6jsTDUH9tmQ7vdvpp/pNzsfE/qnEP8PF0cGnkQg04x4nOcpK1oGzzhrs6seGYDVQ=="},{"functionCall":{"args":{"a":2,"b":3},"id":"2","name":"multiply"}}],"role":"model"},{"parts":[{"functionResponse":{"id":"1","name":"add","response":{"result":"5"}}},{"functionResponse":{"id":"2","name":"multiply","response":{"result":"6"}}}],"role":"user"}],"generationConfig":{"maxOutputTokens":4000},"systemInstruction":{"parts":[{"text":"You are a helpful assistant. CRITICAL: Always use both add and multiply at the same time ALWAYS."}],"role":"user"},"toolConfig":{"functionCallingConfig":{"mode":"AUTO"}},"tools":[{"functionDeclarations":[{"description":"Add two numbers","name":"add","parameters":{"properties":{"a":{"description":"first number","type":"INTEGER"},"b":{"description":"second number","type":"INTEGER"}},"required":["a","b"],"type":"OBJECT"}},{"description":"Multiply two numbers","name":"multiply","parameters":{"properties":{"a":{"description":"first number","type":"INTEGER"},"b":{"description":"second number","type":"INTEGER"}},"required":["a","b"],"type":"OBJECT"}}]}]} + {"contents":[{"parts":[{"text":"Add and multiply the number 2 and 3"}],"role":"user"},{"parts":[{"functionCall":{"args":{"a":2,"b":3},"name":"add"},"thoughtSignature":"CpICAY89a1+Gm+gqy5KEfxpOLwsLfsZBhMovtwfzDW0gEBgOw+bpm9YTJExW/7mXnG4xCDgpd8nOmWA92HX3KWO9umiAKQc6u+TQRe7xqOvAyCdNFjxBVUbzVh8pRroWFnwr3ceqt4+4vMSONorj6Agki5CZ0wl3XHlgxr7kEAMiVuka9Mdi2dYSBB2zfaKSZMHznl8uetDyUXnGvZj4GWPHsayBrFUqYeDko8GyzlqfpN2ZB3SjqobwjWw6L3QpABB613LYDHy52QaSbX3AFyr0YEE38lujZXqDtUmEyRs9v3I7fJ6jsTDUH9tmQ7vdvpp/pNzsfE/qnEP8PF0cGnkQg04x4nOcpK1oGzzhrs6seGYDVQ=="},{"functionCall":{"args":{"a":2,"b":3},"name":"multiply"}}],"role":"model"},{"parts":[{"functionResponse":{"name":"add","response":{"result":"5"}}},{"functionResponse":{"name":"multiply","response":{"result":"6"}}}],"role":"user"}],"generationConfig":{"maxOutputTokens":4000},"systemInstruction":{"parts":[{"text":"You are a helpful assistant. CRITICAL: Always use both add and multiply at the same time ALWAYS."}],"role":"user"},"toolConfig":{"functionCallingConfig":{"mode":"AUTO"}},"tools":[{"functionDeclarations":[{"description":"Add two numbers","name":"add","parameters":{"properties":{"a":{"description":"first number","type":"INTEGER"},"b":{"description":"second number","type":"INTEGER"}},"required":["a","b"],"type":"OBJECT"}},{"description":"Multiply two numbers","name":"multiply","parameters":{"properties":{"a":{"description":"first number","type":"INTEGER"},"b":{"description":"second number","type":"INTEGER"}},"required":["a","b"],"type":"OBJECT"}}]}]} headers: Content-Type: - application/json diff --git a/providertests/testdata/TestGoogleCommon/vertex-gemini-2-5-flash/multi_tool_streaming.yaml b/providertests/testdata/TestGoogleCommon/vertex-gemini-2-5-flash/multi_tool_streaming.yaml index 402d8b1ee..e3f389007 100644 --- a/providertests/testdata/TestGoogleCommon/vertex-gemini-2-5-flash/multi_tool_streaming.yaml +++ b/providertests/testdata/TestGoogleCommon/vertex-gemini-2-5-flash/multi_tool_streaming.yaml @@ -41,7 +41,7 @@ interactions: content_length: 1580 host: us-east5-aiplatform.googleapis.com body: | - {"contents":[{"parts":[{"text":"Add and multiply the number 2 and 3"}],"role":"user"},{"parts":[{"functionCall":{"args":{"a":2,"b":3},"id":"1","name":"add"},"thoughtSignature":"Ci8Bjz1rXzqIUO4hDWx0cIAcS3Hli+/00t0xZ4R9333aTdPmmlba6GoelrnrKuw/5QpYAY89a1+iCNlnCLeZt0CFSSVel5kXqgPJj48xE+/YrJEhlVDNA03z0nIXONvDkvD+rzRU6eVqyqW/DXnkzlDMZfPtb+fkfZAbxATyw7AZKiLraxgziRvSgAp3AY89a19GL62f0CVqxq8XDq1IDLBlTjD225ayNTwB8S84TC6uBdF/KD8K9qz5o3Zcu8F4cqUuA0b8jvyuMrjS8Wyv5ZNuUgruWTbdjpuZV+JkjU74hDoom9EwIdI3A8AavPrGZiLXAdAkKQfAksXiEQOjlPiFwGYKNAGPPWtf/eKZatmuUApeWonkTgVe57SlMCNW/afNRK3Iw/inXuM2Y5IFJV0ogxj9SUEUsT0="},{"functionCall":{"args":{"a":2,"b":3},"id":"2","name":"multiply"}}],"role":"model"},{"parts":[{"functionResponse":{"id":"1","name":"add","response":{"result":"5"}}},{"functionResponse":{"id":"2","name":"multiply","response":{"result":"6"}}}],"role":"user"}],"generationConfig":{"maxOutputTokens":4000},"systemInstruction":{"parts":[{"text":"You are a helpful assistant. Always use both add and multiply at the same time."}],"role":"user"},"toolConfig":{"functionCallingConfig":{"mode":"AUTO"}},"tools":[{"functionDeclarations":[{"description":"Add two numbers","name":"add","parameters":{"properties":{"a":{"description":"first number","type":"INTEGER"},"b":{"description":"second number","type":"INTEGER"}},"required":["a","b"],"type":"OBJECT"}},{"description":"Multiply two numbers","name":"multiply","parameters":{"properties":{"a":{"description":"first number","type":"INTEGER"},"b":{"description":"second number","type":"INTEGER"}},"required":["a","b"],"type":"OBJECT"}}]}]} + {"contents":[{"parts":[{"text":"Add and multiply the number 2 and 3"}],"role":"user"},{"parts":[{"functionCall":{"args":{"a":2,"b":3},"name":"add"},"thoughtSignature":"Ci8Bjz1rXzqIUO4hDWx0cIAcS3Hli+/00t0xZ4R9333aTdPmmlba6GoelrnrKuw/5QpYAY89a1+iCNlnCLeZt0CFSSVel5kXqgPJj48xE+/YrJEhlVDNA03z0nIXONvDkvD+rzRU6eVqyqW/DXnkzlDMZfPtb+fkfZAbxATyw7AZKiLraxgziRvSgAp3AY89a19GL62f0CVqxq8XDq1IDLBlTjD225ayNTwB8S84TC6uBdF/KD8K9qz5o3Zcu8F4cqUuA0b8jvyuMrjS8Wyv5ZNuUgruWTbdjpuZV+JkjU74hDoom9EwIdI3A8AavPrGZiLXAdAkKQfAksXiEQOjlPiFwGYKNAGPPWtf/eKZatmuUApeWonkTgVe57SlMCNW/afNRK3Iw/inXuM2Y5IFJV0ogxj9SUEUsT0="},{"functionCall":{"args":{"a":2,"b":3},"name":"multiply"}}],"role":"model"},{"parts":[{"functionResponse":{"name":"add","response":{"result":"5"}}},{"functionResponse":{"name":"multiply","response":{"result":"6"}}}],"role":"user"}],"generationConfig":{"maxOutputTokens":4000},"systemInstruction":{"parts":[{"text":"You are a helpful assistant. Always use both add and multiply at the same time."}],"role":"user"},"toolConfig":{"functionCallingConfig":{"mode":"AUTO"}},"tools":[{"functionDeclarations":[{"description":"Add two numbers","name":"add","parameters":{"properties":{"a":{"description":"first number","type":"INTEGER"},"b":{"description":"second number","type":"INTEGER"}},"required":["a","b"],"type":"OBJECT"}},{"description":"Multiply two numbers","name":"multiply","parameters":{"properties":{"a":{"description":"first number","type":"INTEGER"},"b":{"description":"second number","type":"INTEGER"}},"required":["a","b"],"type":"OBJECT"}}]}]} form: alt: - sse diff --git a/providertests/testdata/TestGoogleCommon/vertex-gemini-2-5-flash/tool.yaml b/providertests/testdata/TestGoogleCommon/vertex-gemini-2-5-flash/tool.yaml index 3882020a9..8d8a42408 100644 --- a/providertests/testdata/TestGoogleCommon/vertex-gemini-2-5-flash/tool.yaml +++ b/providertests/testdata/TestGoogleCommon/vertex-gemini-2-5-flash/tool.yaml @@ -83,7 +83,7 @@ interactions: content_length: 1100 host: us-east5-aiplatform.googleapis.com body: | - {"contents":[{"parts":[{"text":"What's the weather in Florence,Italy?"}],"role":"user"},{"parts":[{"functionCall":{"args":{"location":"Florence,Italy"},"id":"1","name":"weather"},"thoughtSignature":"CogCAY89a18llPaHtTc0RYmJYfqVzv67knJ0LLYW0uvvORLIbJ1go3t6f8qRUiA9NNmQPcujynZUv2T+UE/FdtglMNc4+tdvkjKNGp3YGstAa8NRco+/eUOWLdiYI793P8hzr2XCRmu7kPt6nQiLOauQseZ7Ldf/eYAHVZRVYmO1GcMtQYIpUI2n6w5eO1HIDdkB74FgZujPNJHICHGMt7nuI1M1t2yNkLh1v12Iht1NJEhu1JdkCGXQtrE9P1k6B2qlVG0+IL7el9ZsQKMs7Z0Cjqx8nIkjJnMGoBP8MQbP+mHxyNs6ClqGxQcy4gCtktP0/BB2Kh2ebnQA8Nu+W3bzKZxlx+G2IfoK"}],"role":"model"},{"parts":[{"functionResponse":{"id":"1","name":"weather","response":{"result":"40 C"}}}],"role":"user"}],"generationConfig":{"maxOutputTokens":4000},"systemInstruction":{"parts":[{"text":"You are a helpful assistant"}],"role":"user"},"toolConfig":{"functionCallingConfig":{"mode":"AUTO"}},"tools":[{"functionDeclarations":[{"description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"STRING"}},"required":["location"],"type":"OBJECT"}}]}]} + {"contents":[{"parts":[{"text":"What's the weather in Florence,Italy?"}],"role":"user"},{"parts":[{"functionCall":{"args":{"location":"Florence,Italy"},"name":"weather"},"thoughtSignature":"CogCAY89a18llPaHtTc0RYmJYfqVzv67knJ0LLYW0uvvORLIbJ1go3t6f8qRUiA9NNmQPcujynZUv2T+UE/FdtglMNc4+tdvkjKNGp3YGstAa8NRco+/eUOWLdiYI793P8hzr2XCRmu7kPt6nQiLOauQseZ7Ldf/eYAHVZRVYmO1GcMtQYIpUI2n6w5eO1HIDdkB74FgZujPNJHICHGMt7nuI1M1t2yNkLh1v12Iht1NJEhu1JdkCGXQtrE9P1k6B2qlVG0+IL7el9ZsQKMs7Z0Cjqx8nIkjJnMGoBP8MQbP+mHxyNs6ClqGxQcy4gCtktP0/BB2Kh2ebnQA8Nu+W3bzKZxlx+G2IfoK"}],"role":"model"},{"parts":[{"functionResponse":{"name":"weather","response":{"result":"40 C"}}}],"role":"user"}],"generationConfig":{"maxOutputTokens":4000},"systemInstruction":{"parts":[{"text":"You are a helpful assistant"}],"role":"user"},"toolConfig":{"functionCallingConfig":{"mode":"AUTO"}},"tools":[{"functionDeclarations":[{"description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"STRING"}},"required":["location"],"type":"OBJECT"}}]}]} headers: Content-Type: - application/json diff --git a/providertests/testdata/TestGoogleCommon/vertex-gemini-2-5-flash/tool_streaming.yaml b/providertests/testdata/TestGoogleCommon/vertex-gemini-2-5-flash/tool_streaming.yaml index 5fb36de3d..b5c4e8e8f 100644 --- a/providertests/testdata/TestGoogleCommon/vertex-gemini-2-5-flash/tool_streaming.yaml +++ b/providertests/testdata/TestGoogleCommon/vertex-gemini-2-5-flash/tool_streaming.yaml @@ -41,7 +41,7 @@ interactions: content_length: 1236 host: us-east5-aiplatform.googleapis.com body: | - {"contents":[{"parts":[{"text":"What's the weather in Florence,Italy?"}],"role":"user"},{"parts":[{"functionCall":{"args":{"location":"Florence,Italy"},"id":"1","name":"weather"},"thoughtSignature":"CiwBjz1rX5J0Jni1UwQkH3SeTysS4TF4kGuzSS99EDy6+inHVbJu1Xo0pYpXeQprAY89a18NHhloDuIj0yld57PAo2oNpG6rOh/35G9rcOwGsXkiTJHGjRY2kvEit3Re266ZMK2YpihBVAkZllpxOWlb/QZN7Cial15OT3HGih3VCgpPirbUHnr1W3xjYncuUEWiboS9GunS2foKegGPPWtfqxLOOBCOHYMB1vAbHSWDwTHtlQmKO8gOjjB+E7rIAvoI5c/zje1zY9TIePouZwvtbh4hW0W0RkY1X0JqcVVCsdoxAa177NpMX32OsBI4ADKGIJWKfyUxHqYVTWqRPQCUm+vMMcCBkhEpQl1e4h+elfClBEXzClYBjz1rX3o0PFc+JJWTsLa7RFOQY12RaETWEvaTPmkUSJjWK0s+pMC6adOFzZMC/3NY4wPGdqSA/P5xnES40TQMQNvL9zL7G8O1sU6LExlHc9wVoyeOcw=="}],"role":"model"},{"parts":[{"functionResponse":{"id":"1","name":"weather","response":{"result":"40 C"}}}],"role":"user"}],"generationConfig":{"maxOutputTokens":4000},"systemInstruction":{"parts":[{"text":"You are a helpful assistant"}],"role":"user"},"toolConfig":{"functionCallingConfig":{"mode":"AUTO"}},"tools":[{"functionDeclarations":[{"description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"STRING"}},"required":["location"],"type":"OBJECT"}}]}]} + {"contents":[{"parts":[{"text":"What's the weather in Florence,Italy?"}],"role":"user"},{"parts":[{"functionCall":{"args":{"location":"Florence,Italy"},"name":"weather"},"thoughtSignature":"CiwBjz1rX5J0Jni1UwQkH3SeTysS4TF4kGuzSS99EDy6+inHVbJu1Xo0pYpXeQprAY89a18NHhloDuIj0yld57PAo2oNpG6rOh/35G9rcOwGsXkiTJHGjRY2kvEit3Re266ZMK2YpihBVAkZllpxOWlb/QZN7Cial15OT3HGih3VCgpPirbUHnr1W3xjYncuUEWiboS9GunS2foKegGPPWtfqxLOOBCOHYMB1vAbHSWDwTHtlQmKO8gOjjB+E7rIAvoI5c/zje1zY9TIePouZwvtbh4hW0W0RkY1X0JqcVVCsdoxAa177NpMX32OsBI4ADKGIJWKfyUxHqYVTWqRPQCUm+vMMcCBkhEpQl1e4h+elfClBEXzClYBjz1rX3o0PFc+JJWTsLa7RFOQY12RaETWEvaTPmkUSJjWK0s+pMC6adOFzZMC/3NY4wPGdqSA/P5xnES40TQMQNvL9zL7G8O1sU6LExlHc9wVoyeOcw=="}],"role":"model"},{"parts":[{"functionResponse":{"name":"weather","response":{"result":"40 C"}}}],"role":"user"}],"generationConfig":{"maxOutputTokens":4000},"systemInstruction":{"parts":[{"text":"You are a helpful assistant"}],"role":"user"},"toolConfig":{"functionCallingConfig":{"mode":"AUTO"}},"tools":[{"functionDeclarations":[{"description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"STRING"}},"required":["location"],"type":"OBJECT"}}]}]} form: alt: - sse diff --git a/providertests/testdata/TestGoogleCommon/vertex-gemini-2-5-pro/multi_tool.yaml b/providertests/testdata/TestGoogleCommon/vertex-gemini-2-5-pro/multi_tool.yaml index 7881deac2..e07beedd9 100644 --- a/providertests/testdata/TestGoogleCommon/vertex-gemini-2-5-pro/multi_tool.yaml +++ b/providertests/testdata/TestGoogleCommon/vertex-gemini-2-5-pro/multi_tool.yaml @@ -93,7 +93,7 @@ interactions: content_length: 1541 host: us-east5-aiplatform.googleapis.com body: | - {"contents":[{"parts":[{"text":"Add and multiply the number 2 and 3"}],"role":"user"},{"parts":[{"functionCall":{"args":{"a":2,"b":3},"id":"1","name":"add"},"thoughtSignature":"CowCAY89a1/vAaqniXrmhElp8qu3tCETdO3UfyX6GAedsXE7vdfpKTvda4xMGK9wFBEmw0aN24fmJRBi5AmBiHSc9Vo9JMEjyusxOednzWJCXbVjmyyz2e7L8Y2XN4azmNC2YVxOIP00SBFByCBSz2Ev1cqQY1UYl+u9mtAC5PvlPx6gOTGFZdnN+0C8j9DkPpTgPqE4M/tD0NVZU7kVLk25+Bz+WvGUAhdstMDl2LZQ3NiTyeMr+QUu/e5BB8ePV/BbKIlMbQFOwKPmna4kOCaQPO31HfWGA0tJ2ZT4SyQEYj7vLrgQ4TyTfBG/NPFT7Ud37LZpSFY29312jvmR3aArX4nztAlsG6hpoAGFRg=="},{"functionCall":{"args":{"a":2,"b":3},"id":"2","name":"multiply"}}],"role":"model"},{"parts":[{"functionResponse":{"id":"1","name":"add","response":{"result":"5"}}},{"functionResponse":{"id":"2","name":"multiply","response":{"result":"6"}}}],"role":"user"}],"generationConfig":{"maxOutputTokens":4000},"systemInstruction":{"parts":[{"text":"You are a helpful assistant. CRITICAL: Always use both add and multiply at the same time ALWAYS."}],"role":"user"},"toolConfig":{"functionCallingConfig":{"mode":"AUTO"}},"tools":[{"functionDeclarations":[{"description":"Add two numbers","name":"add","parameters":{"properties":{"a":{"description":"first number","type":"INTEGER"},"b":{"description":"second number","type":"INTEGER"}},"required":["a","b"],"type":"OBJECT"}},{"description":"Multiply two numbers","name":"multiply","parameters":{"properties":{"a":{"description":"first number","type":"INTEGER"},"b":{"description":"second number","type":"INTEGER"}},"required":["a","b"],"type":"OBJECT"}}]}]} + {"contents":[{"parts":[{"text":"Add and multiply the number 2 and 3"}],"role":"user"},{"parts":[{"functionCall":{"args":{"a":2,"b":3},"name":"add"},"thoughtSignature":"CowCAY89a1/vAaqniXrmhElp8qu3tCETdO3UfyX6GAedsXE7vdfpKTvda4xMGK9wFBEmw0aN24fmJRBi5AmBiHSc9Vo9JMEjyusxOednzWJCXbVjmyyz2e7L8Y2XN4azmNC2YVxOIP00SBFByCBSz2Ev1cqQY1UYl+u9mtAC5PvlPx6gOTGFZdnN+0C8j9DkPpTgPqE4M/tD0NVZU7kVLk25+Bz+WvGUAhdstMDl2LZQ3NiTyeMr+QUu/e5BB8ePV/BbKIlMbQFOwKPmna4kOCaQPO31HfWGA0tJ2ZT4SyQEYj7vLrgQ4TyTfBG/NPFT7Ud37LZpSFY29312jvmR3aArX4nztAlsG6hpoAGFRg=="},{"functionCall":{"args":{"a":2,"b":3},"name":"multiply"}}],"role":"model"},{"parts":[{"functionResponse":{"name":"add","response":{"result":"5"}}},{"functionResponse":{"name":"multiply","response":{"result":"6"}}}],"role":"user"}],"generationConfig":{"maxOutputTokens":4000},"systemInstruction":{"parts":[{"text":"You are a helpful assistant. CRITICAL: Always use both add and multiply at the same time ALWAYS."}],"role":"user"},"toolConfig":{"functionCallingConfig":{"mode":"AUTO"}},"tools":[{"functionDeclarations":[{"description":"Add two numbers","name":"add","parameters":{"properties":{"a":{"description":"first number","type":"INTEGER"},"b":{"description":"second number","type":"INTEGER"}},"required":["a","b"],"type":"OBJECT"}},{"description":"Multiply two numbers","name":"multiply","parameters":{"properties":{"a":{"description":"first number","type":"INTEGER"},"b":{"description":"second number","type":"INTEGER"}},"required":["a","b"],"type":"OBJECT"}}]}]} headers: Content-Type: - application/json diff --git a/providertests/testdata/TestGoogleCommon/vertex-gemini-2-5-pro/multi_tool_streaming.yaml b/providertests/testdata/TestGoogleCommon/vertex-gemini-2-5-pro/multi_tool_streaming.yaml index c4a944cfd..bc288f712 100644 --- a/providertests/testdata/TestGoogleCommon/vertex-gemini-2-5-pro/multi_tool_streaming.yaml +++ b/providertests/testdata/TestGoogleCommon/vertex-gemini-2-5-pro/multi_tool_streaming.yaml @@ -41,7 +41,7 @@ interactions: content_length: 1704 host: us-east5-aiplatform.googleapis.com body: | - {"contents":[{"parts":[{"text":"Add and multiply the number 2 and 3"}],"role":"user"},{"parts":[{"functionCall":{"args":{"a":2,"b":3},"id":"1","name":"add"},"thoughtSignature":"CiQBjz1rX9vXzx2kuVvHI7K1og7PRomR1HnReMQI5SRJMSPzcAIKXgGPPWtfnWtXrgO5+AzYP5pnrCj2zZQuYQN0+s8HD4ukcOblaIEB1+ol370baALNpJqz131WB7VTe7FEKvlvrDglcKIAp9nu+AFphYHm4M1jyYxVoWtN2SmsDrBzWbgKZwGPPWtfbCiEax2Ys/D5UxclK7OD6tuXVaguLSieWuIZbMLU1yx9Q1Z611Uf6Gw/IQHGuYR/muyUGA74rs7AXi+cJ38x7djHGaQR3AOaLOotrGqyGbtbrGu6hCqf1Acp/jDPLdMhnukKdgGPPWtfw7FXMbV6/HUhP8gPUid+InjyPPe7Y6yxaPYEt13mNS8LGh85JJrF6v6LyW8QlR+EnGoQxHWJzAKo1Da46RmjiSqftdKOWWFux+S5eULdHwSSp+YsdgMcEmp1I/HeqT13UiOLtlRHj3iXGAZWshN5rjwKLwGPPWtfCFqQYyE6rXmQXNrcKMx4VdDSMTkXfdt7Cz4P6h75QRfLYlBcupiVk7GR"},{"functionCall":{"args":{"a":2,"b":3},"id":"2","name":"multiply"}}],"role":"model"},{"parts":[{"functionResponse":{"id":"1","name":"add","response":{"result":"5"}}},{"functionResponse":{"id":"2","name":"multiply","response":{"result":"6"}}}],"role":"user"}],"generationConfig":{"maxOutputTokens":4000},"systemInstruction":{"parts":[{"text":"You are a helpful assistant. Always use both add and multiply at the same time."}],"role":"user"},"toolConfig":{"functionCallingConfig":{"mode":"AUTO"}},"tools":[{"functionDeclarations":[{"description":"Add two numbers","name":"add","parameters":{"properties":{"a":{"description":"first number","type":"INTEGER"},"b":{"description":"second number","type":"INTEGER"}},"required":["a","b"],"type":"OBJECT"}},{"description":"Multiply two numbers","name":"multiply","parameters":{"properties":{"a":{"description":"first number","type":"INTEGER"},"b":{"description":"second number","type":"INTEGER"}},"required":["a","b"],"type":"OBJECT"}}]}]} + {"contents":[{"parts":[{"text":"Add and multiply the number 2 and 3"}],"role":"user"},{"parts":[{"functionCall":{"args":{"a":2,"b":3},"name":"add"},"thoughtSignature":"CiQBjz1rX9vXzx2kuVvHI7K1og7PRomR1HnReMQI5SRJMSPzcAIKXgGPPWtfnWtXrgO5+AzYP5pnrCj2zZQuYQN0+s8HD4ukcOblaIEB1+ol370baALNpJqz131WB7VTe7FEKvlvrDglcKIAp9nu+AFphYHm4M1jyYxVoWtN2SmsDrBzWbgKZwGPPWtfbCiEax2Ys/D5UxclK7OD6tuXVaguLSieWuIZbMLU1yx9Q1Z611Uf6Gw/IQHGuYR/muyUGA74rs7AXi+cJ38x7djHGaQR3AOaLOotrGqyGbtbrGu6hCqf1Acp/jDPLdMhnukKdgGPPWtfw7FXMbV6/HUhP8gPUid+InjyPPe7Y6yxaPYEt13mNS8LGh85JJrF6v6LyW8QlR+EnGoQxHWJzAKo1Da46RmjiSqftdKOWWFux+S5eULdHwSSp+YsdgMcEmp1I/HeqT13UiOLtlRHj3iXGAZWshN5rjwKLwGPPWtfCFqQYyE6rXmQXNrcKMx4VdDSMTkXfdt7Cz4P6h75QRfLYlBcupiVk7GR"},{"functionCall":{"args":{"a":2,"b":3},"name":"multiply"}}],"role":"model"},{"parts":[{"functionResponse":{"name":"add","response":{"result":"5"}}},{"functionResponse":{"name":"multiply","response":{"result":"6"}}}],"role":"user"}],"generationConfig":{"maxOutputTokens":4000},"systemInstruction":{"parts":[{"text":"You are a helpful assistant. Always use both add and multiply at the same time."}],"role":"user"},"toolConfig":{"functionCallingConfig":{"mode":"AUTO"}},"tools":[{"functionDeclarations":[{"description":"Add two numbers","name":"add","parameters":{"properties":{"a":{"description":"first number","type":"INTEGER"},"b":{"description":"second number","type":"INTEGER"}},"required":["a","b"],"type":"OBJECT"}},{"description":"Multiply two numbers","name":"multiply","parameters":{"properties":{"a":{"description":"first number","type":"INTEGER"},"b":{"description":"second number","type":"INTEGER"}},"required":["a","b"],"type":"OBJECT"}}]}]} form: alt: - sse diff --git a/providertests/testdata/TestGoogleCommon/vertex-gemini-2-5-pro/tool.yaml b/providertests/testdata/TestGoogleCommon/vertex-gemini-2-5-pro/tool.yaml index e86fdab20..65e92953a 100644 --- a/providertests/testdata/TestGoogleCommon/vertex-gemini-2-5-pro/tool.yaml +++ b/providertests/testdata/TestGoogleCommon/vertex-gemini-2-5-pro/tool.yaml @@ -83,7 +83,7 @@ interactions: content_length: 1445 host: us-east5-aiplatform.googleapis.com body: | - {"contents":[{"parts":[{"text":"What's the weather in Florence,Italy?"}],"role":"user"},{"parts":[{"functionCall":{"args":{"location":"Florence, Italy"},"id":"1","name":"weather"},"thoughtSignature":"CogEAY89a18AxcmSDT2p07Co1JRtGBB7Agd75Vj9UZkgbukirUDDeNDjpGrNB9hCvNnkXEp6Cmi1w/XoCg9ucdiWUcB3XBygzRsHEopx6+pLGO7QPFK8N+js2l+iH2YF6xjA9nTI7CAhtMS78tEdlMykkwe4tU6e1wyEDmRLYwema/Q9oaV6ziqkbYOKPix6IjZhgkJSz0rmwMXN1S1whHKC4Qd7IhOodVIp7TaNzLAxMAij6EkusUjLsCYMpuDm2NvdjlwQWsYjiZSYRDU5KNWuc6P+RgrozZj4n3bLp9g29QzPAd2qnJW8CjMsGBDVx0bTzfy2EdMkX5P0ZZre1EvkOyMTA64hDz1o4wChM6BcMKBMgs2z5Hl/yRN4eAjrC4NO/MM57kS1Lg836onZVfE5Te8vn9W0nv4M+o0NnF79xeeIXVdg9csNnfrhxlFFU300fgAk+EEQ4keVn/r4EdSsaUqdV/WUMr3GS2sbQZvP6PNJuOoc0lmLrJVpy6BEdlrofphYcFlOObgkUeYw6x9/u6zRke7PQbOiU/w2D41e0AIhrnItM3gvrQnFmjjJhj2J8aV+/MD7Vxc0OY+2DcJMhty3VUGgTvhUkTJ5gu65/waRYZcQI53hejjnmAjrmKPJzfbypYf8LLZGmNHbP88nXoEPxdL28k/2AmXq/hg7bIisyk2Q+POUhQ=="}],"role":"model"},{"parts":[{"functionResponse":{"id":"1","name":"weather","response":{"result":"40 C"}}}],"role":"user"}],"generationConfig":{"maxOutputTokens":4000},"systemInstruction":{"parts":[{"text":"You are a helpful assistant"}],"role":"user"},"toolConfig":{"functionCallingConfig":{"mode":"AUTO"}},"tools":[{"functionDeclarations":[{"description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"STRING"}},"required":["location"],"type":"OBJECT"}}]}]} + {"contents":[{"parts":[{"text":"What's the weather in Florence,Italy?"}],"role":"user"},{"parts":[{"functionCall":{"args":{"location":"Florence, Italy"},"name":"weather"},"thoughtSignature":"CogEAY89a18AxcmSDT2p07Co1JRtGBB7Agd75Vj9UZkgbukirUDDeNDjpGrNB9hCvNnkXEp6Cmi1w/XoCg9ucdiWUcB3XBygzRsHEopx6+pLGO7QPFK8N+js2l+iH2YF6xjA9nTI7CAhtMS78tEdlMykkwe4tU6e1wyEDmRLYwema/Q9oaV6ziqkbYOKPix6IjZhgkJSz0rmwMXN1S1whHKC4Qd7IhOodVIp7TaNzLAxMAij6EkusUjLsCYMpuDm2NvdjlwQWsYjiZSYRDU5KNWuc6P+RgrozZj4n3bLp9g29QzPAd2qnJW8CjMsGBDVx0bTzfy2EdMkX5P0ZZre1EvkOyMTA64hDz1o4wChM6BcMKBMgs2z5Hl/yRN4eAjrC4NO/MM57kS1Lg836onZVfE5Te8vn9W0nv4M+o0NnF79xeeIXVdg9csNnfrhxlFFU300fgAk+EEQ4keVn/r4EdSsaUqdV/WUMr3GS2sbQZvP6PNJuOoc0lmLrJVpy6BEdlrofphYcFlOObgkUeYw6x9/u6zRke7PQbOiU/w2D41e0AIhrnItM3gvrQnFmjjJhj2J8aV+/MD7Vxc0OY+2DcJMhty3VUGgTvhUkTJ5gu65/waRYZcQI53hejjnmAjrmKPJzfbypYf8LLZGmNHbP88nXoEPxdL28k/2AmXq/hg7bIisyk2Q+POUhQ=="}],"role":"model"},{"parts":[{"functionResponse":{"name":"weather","response":{"result":"40 C"}}}],"role":"user"}],"generationConfig":{"maxOutputTokens":4000},"systemInstruction":{"parts":[{"text":"You are a helpful assistant"}],"role":"user"},"toolConfig":{"functionCallingConfig":{"mode":"AUTO"}},"tools":[{"functionDeclarations":[{"description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"STRING"}},"required":["location"],"type":"OBJECT"}}]}]} headers: Content-Type: - application/json diff --git a/providertests/testdata/TestGoogleCommon/vertex-gemini-2-5-pro/tool_streaming.yaml b/providertests/testdata/TestGoogleCommon/vertex-gemini-2-5-pro/tool_streaming.yaml index 1e70c3038..29fdf67e6 100644 --- a/providertests/testdata/TestGoogleCommon/vertex-gemini-2-5-pro/tool_streaming.yaml +++ b/providertests/testdata/TestGoogleCommon/vertex-gemini-2-5-pro/tool_streaming.yaml @@ -41,7 +41,7 @@ interactions: content_length: 1677 host: us-east5-aiplatform.googleapis.com body: | - {"contents":[{"parts":[{"text":"What's the weather in Florence,Italy?"}],"role":"user"},{"parts":[{"functionCall":{"args":{"location":"Florence, Italy"},"id":"1","name":"weather"},"thoughtSignature":"CiIBjz1rXyc3Jt0wjS9Mp9TZrLGwfhh2I4z86q6IZHflISCYCmcBjz1rXx+KC1eUkDiRSogUY8M9UnL2bbN9IL9BFB99rjNJ8jKqVtrTC5SncrQnBBqYo8EuWgvrv1+5FSI9Cr2nhvTwyyTpoiqxks9Xz4OTzqCTha5hpdTkLT846P9pER0Xf5aVPOXtCmEBjz1rXwxN0lNIdN5KMrHQmICcs0vijgyfM9OW6oEZIVB3mMx8vGktc9TmDsrA2+CwjcR2l49yFw35r7XPxk/Ng0DRvD3DxUrB/okaGO/ZD4hxM3c2OrFup+zFvfHd/XCcCqcBAY89a1+CIQmUJvHDk2M4F+N7Fs0l3b3lZ9iWGGM/co8kDRr54mxTDiyfwqQ8aDUwwh9glTbmvAjoUvkf8UTN22Bhvv7wdSD31CCBpIsxs6Cdio0H3rP926aZqJBVDKDok8lxfUmDZeJjnQ0o2aIHJefPfibnqzcUhEisidSiOB6ykdSnJUc1wrCqntx0g9UTuF1+rqGk2kDQMiw7OYBl9tdBdtdJerYKqAEBjz1rX+ztDgupxPgCbZALhEbGh9rxJf+DYlYGm5Me0BtIKtOzaol4Mhmn/TeoFz+uzJuK70YK5HFCj82q2aEDNza9W5jO7aYoceFhS4YCyNFTMRIg6IEWVJxS3sUe78ELLsDtGz4/wwwmz5R7ewdNgAY3++XEMwWmNcur6M+kJo8A0Rdd05lcqI9x7bIeHK26JSFNKP0q92ueLb+nFwHj6tv0wWQixz0KdAGPPWtfJWCT44joV6wQkimuxiqvNYu/QESgs3eTypb23NNIgfv49xVM0VW7RHiqw/OXFXtxl5V9VST5DCLK8ShuRYYGDvCVtsGhK75pwJqLWMG/B781gSh9LChcF/n74RT6e21GTFtKGvMGywQTkZrYJVEe"}],"role":"model"},{"parts":[{"functionResponse":{"id":"1","name":"weather","response":{"result":"40 C"}}}],"role":"user"}],"generationConfig":{"maxOutputTokens":4000},"systemInstruction":{"parts":[{"text":"You are a helpful assistant"}],"role":"user"},"toolConfig":{"functionCallingConfig":{"mode":"AUTO"}},"tools":[{"functionDeclarations":[{"description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"STRING"}},"required":["location"],"type":"OBJECT"}}]}]} + {"contents":[{"parts":[{"text":"What's the weather in Florence,Italy?"}],"role":"user"},{"parts":[{"functionCall":{"args":{"location":"Florence, Italy"},"name":"weather"},"thoughtSignature":"CiIBjz1rXyc3Jt0wjS9Mp9TZrLGwfhh2I4z86q6IZHflISCYCmcBjz1rXx+KC1eUkDiRSogUY8M9UnL2bbN9IL9BFB99rjNJ8jKqVtrTC5SncrQnBBqYo8EuWgvrv1+5FSI9Cr2nhvTwyyTpoiqxks9Xz4OTzqCTha5hpdTkLT846P9pER0Xf5aVPOXtCmEBjz1rXwxN0lNIdN5KMrHQmICcs0vijgyfM9OW6oEZIVB3mMx8vGktc9TmDsrA2+CwjcR2l49yFw35r7XPxk/Ng0DRvD3DxUrB/okaGO/ZD4hxM3c2OrFup+zFvfHd/XCcCqcBAY89a1+CIQmUJvHDk2M4F+N7Fs0l3b3lZ9iWGGM/co8kDRr54mxTDiyfwqQ8aDUwwh9glTbmvAjoUvkf8UTN22Bhvv7wdSD31CCBpIsxs6Cdio0H3rP926aZqJBVDKDok8lxfUmDZeJjnQ0o2aIHJefPfibnqzcUhEisidSiOB6ykdSnJUc1wrCqntx0g9UTuF1+rqGk2kDQMiw7OYBl9tdBdtdJerYKqAEBjz1rX+ztDgupxPgCbZALhEbGh9rxJf+DYlYGm5Me0BtIKtOzaol4Mhmn/TeoFz+uzJuK70YK5HFCj82q2aEDNza9W5jO7aYoceFhS4YCyNFTMRIg6IEWVJxS3sUe78ELLsDtGz4/wwwmz5R7ewdNgAY3++XEMwWmNcur6M+kJo8A0Rdd05lcqI9x7bIeHK26JSFNKP0q92ueLb+nFwHj6tv0wWQixz0KdAGPPWtfJWCT44joV6wQkimuxiqvNYu/QESgs3eTypb23NNIgfv49xVM0VW7RHiqw/OXFXtxl5V9VST5DCLK8ShuRYYGDvCVtsGhK75pwJqLWMG/B781gSh9LChcF/n74RT6e21GTFtKGvMGywQTkZrYJVEe"}],"role":"model"},{"parts":[{"functionResponse":{"name":"weather","response":{"result":"40 C"}}}],"role":"user"}],"generationConfig":{"maxOutputTokens":4000},"systemInstruction":{"parts":[{"text":"You are a helpful assistant"}],"role":"user"},"toolConfig":{"functionCallingConfig":{"mode":"AUTO"}},"tools":[{"functionDeclarations":[{"description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"STRING"}},"required":["location"],"type":"OBJECT"}}]}]} form: alt: - sse From 7dacdda522fc6d5aa7ad91319f1db6aa8365f3e5 Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Fri, 19 Jun 2026 16:44:08 -0300 Subject: [PATCH 014/156] v0.33.1 --- version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.txt b/version.txt index be386c9ed..8df3f4592 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -0.33.0 +0.33.1 From 0c784b827d2d713047bcf155dc8f954049c7f6cc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 22 Jun 2026 09:28:00 +0000 Subject: [PATCH 015/156] chore(deps): bump the all group with 2 updates (#291) Bumps the all group with 2 updates: [github.com/kaptinlin/jsonschema](https://github.com/kaptinlin/jsonschema) and [google.golang.org/genai](https://github.com/googleapis/go-genai). Updates `github.com/kaptinlin/jsonschema` from 0.8.0 to 0.9.2 - [Release notes](https://github.com/kaptinlin/jsonschema/releases) - [Commits](https://github.com/kaptinlin/jsonschema/compare/v0.8.0...v0.9.2) Updates `google.golang.org/genai` from 1.60.0 to 1.61.0 - [Release notes](https://github.com/googleapis/go-genai/releases) - [Changelog](https://github.com/googleapis/go-genai/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/go-genai/compare/v1.60.0...v1.61.0) --- updated-dependencies: - dependency-name: github.com/kaptinlin/jsonschema dependency-version: 0.9.2 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: all - dependency-name: google.golang.org/genai dependency-version: 1.61.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: all ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 4 ++-- go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index bd3dad5f9..e903b890e 100644 --- a/go.mod +++ b/go.mod @@ -17,10 +17,10 @@ require ( github.com/go-viper/mapstructure/v2 v2.5.0 github.com/google/uuid v1.6.0 github.com/joho/godotenv v1.5.1 - github.com/kaptinlin/jsonschema v0.8.0 + github.com/kaptinlin/jsonschema v0.9.2 github.com/stretchr/testify v1.11.1 golang.org/x/oauth2 v0.36.0 - google.golang.org/genai v1.60.0 + google.golang.org/genai v1.61.0 ) require ( diff --git a/go.sum b/go.sum index fcd7554f4..fb6845eb3 100644 --- a/go.sum +++ b/go.sum @@ -163,8 +163,8 @@ github.com/jupiterrider/ffi v0.7.0 h1:RKsl6Ascal+3kyAqR5Qcbp83LceQMLc1VZbPfHWoNz github.com/jupiterrider/ffi v0.7.0/go.mod h1:9dauhpOfNqrqk28fxuu0kkdeFtT9Qr4vbfigiuIXN7c= github.com/kaptinlin/jsonpointer v0.4.26 h1:tw616yszHek+B3/GtDSia+uzBa3sLXGpmo4tYeMhBZw= github.com/kaptinlin/jsonpointer v0.4.26/go.mod h1:wVOBaXGGnP42YsMb6zev/3W5POTvspdNfh8DXzf8XS8= -github.com/kaptinlin/jsonschema v0.8.0 h1:GhY966O2q3ZQsg1zkQj988KF2MADJ6EA7pKBMpGmb9A= -github.com/kaptinlin/jsonschema v0.8.0/go.mod h1:dxt7s98W5NEuWEwCnAwGrhYGQdaRLqXZImR28DuxcMU= +github.com/kaptinlin/jsonschema v0.9.2 h1:zqowDnBkpg80OeIt4Bl1bOyfKY1/KVVzst1m3MCsxd4= +github.com/kaptinlin/jsonschema v0.9.2/go.mod h1:mCH2W5lXd29tdDjvoFfY32nedPORnlk7pCVrrcs/NkQ= github.com/klauspost/compress v1.18.6 h1:2jupLlAwFm95+YDR+NwD2MEfFO9d4z4Prjl1XXDjuao= github.com/klauspost/compress v1.18.6/go.mod h1:cwPg85FWrGar70rWktvGQj8/hthj3wpl0PGDogxkrSQ= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= @@ -263,8 +263,8 @@ gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4= gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E= google.golang.org/api v0.284.0 h1:i+cKTgeQRcRySkP7QTl5PDO7/pAm8EcMFIUMlNbk4Vc= google.golang.org/api v0.284.0/go.mod h1:AU44fU+XVZOCcd8uLaBIa/ZgzgPf/0qqY3+m7lQaado= -google.golang.org/genai v1.60.0 h1:uAkea4tYhCz1LlUmxdiOFAmlrLFaLs8PbXucgZHqHVo= -google.golang.org/genai v1.60.0/go.mod h1:mDdPDFXo1Ats7f1WXVyZgWb/CkMzFWTWJruIMy7hGIU= +google.golang.org/genai v1.61.0 h1:wCyNGiaC9q5A59B80zuEtNBhq3ypEvICFkZYOfK7IO0= +google.golang.org/genai v1.61.0/go.mod h1:mDdPDFXo1Ats7f1WXVyZgWb/CkMzFWTWJruIMy7hGIU= google.golang.org/genproto v0.0.0-20260610212136-7ab31c22f7ad h1:cYL1DPJAQr4JMvhfGao0PDXoaf03ifMljAuDyrbMBd0= google.golang.org/genproto v0.0.0-20260610212136-7ab31c22f7ad/go.mod h1:cVHIikDNAdx8ISZeW+2rYkEMf3xn0GSaBYmVnWXQBUo= google.golang.org/genproto/googleapis/api v0.0.0-20260610212136-7ab31c22f7ad h1:3iLyITS/sySRwbUKoC7ogfj2Yr1Cjs0pfaRKj5U5HEw= From 5d47177f0d6cec58eb9f2c82f259bcf641d5698d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 22 Jun 2026 09:29:22 +0000 Subject: [PATCH 016/156] chore(deps): bump github.com/ardanlabs/kronk in the kronk group (#292) Bumps the kronk group with 1 update: [github.com/ardanlabs/kronk](https://github.com/ardanlabs/kronk). Updates `github.com/ardanlabs/kronk` from 1.27.9 to 1.28.0 - [Release notes](https://github.com/ardanlabs/kronk/releases) - [Commits](https://github.com/ardanlabs/kronk/compare/v1.27.9...v1.28.0) --- updated-dependencies: - dependency-name: github.com/ardanlabs/kronk dependency-version: 1.28.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: kronk ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index e903b890e..b3b9c33a9 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.26.4 require ( charm.land/x/vcr v0.1.1 cloud.google.com/go/auth v0.20.0 - github.com/ardanlabs/kronk v1.27.9 + github.com/ardanlabs/kronk v1.28.0 github.com/aws/aws-sdk-go-v2 v1.42.0 github.com/aws/aws-sdk-go-v2/config v1.32.25 github.com/aws/smithy-go v1.27.2 diff --git a/go.sum b/go.sum index fb6845eb3..66b0a4780 100644 --- a/go.sum +++ b/go.sum @@ -40,8 +40,8 @@ github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapp github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.57.0/go.mod h1:YqwkQPrWSC7+byyc1VlKbWLBF5JsW5IoL6xUkemYSXk= github.com/ardanlabs/jinja v1.4.0 h1:9iE0/wF4zhcws1CYZCWqJTQP8YuhC4FjycBGzCTuOFw= github.com/ardanlabs/jinja v1.4.0/go.mod h1:aXXzlJfjA+T3XNKA/YT5ZtDq2VJxt5a5siZ8cl9B35Q= -github.com/ardanlabs/kronk v1.27.9 h1:ZQXfWq86eq19dHOBvOm9dVUIyevV60hdZy2S5Bp/+mY= -github.com/ardanlabs/kronk v1.27.9/go.mod h1:dLd1F38v+1URf5Vsa/P4ENS9VhZw4vwX7EEhHFAAdkA= +github.com/ardanlabs/kronk v1.28.0 h1:Jx0gqJqeL615ToFSuV48h8Uubo49zoAQ2cHOsliP1NQ= +github.com/ardanlabs/kronk v1.28.0/go.mod h1:dLd1F38v+1URf5Vsa/P4ENS9VhZw4vwX7EEhHFAAdkA= github.com/aws/aws-sdk-go-v2 v1.42.0 h1:XvXMJTkFQtpBKIWZnmr9ZEOc2InWM2yldjXEJ/bymhA= github.com/aws/aws-sdk-go-v2 v1.42.0/go.mod h1:27+ACypSLljLAEKsCYOmrjKh83vuTRkuAe9Uv/3A4bg= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.13 h1:p1BBrg/Hhp6uK7zpejeI8QFXHJeC/mynzi04Sl03k9g= From 107d612b965af8fbe3bbced06fc0fd2e57e9d77f Mon Sep 17 00:00:00 2001 From: Kieran Klukas Date: Mon, 22 Jun 2026 15:01:43 -0400 Subject: [PATCH 017/156] fix(openai): keep parallel tool calls separate while streaming When a model returns more than one tool call in a single turn, the streamed output stopped marking where one call ended and the next began. Anything reading the stream as it arrived would merge the calls together, producing malformed arguments that the provider rejected on the next turn (seen with GLM 5.2 on Fireworks). Each tool call is now fully delimited as it streams, so a reader can tell the calls apart without waiting for the whole response. The final result of every call is unchanged. --- providers/openai/language_model.go | 47 +++++++++++--- providers/openai/openai_test.go | 99 ++++++++++++++++++++++++++++++ 2 files changed, 137 insertions(+), 9 deletions(-) diff --git a/providers/openai/language_model.go b/providers/openai/language_model.go index 77df7a4a1..c73d14253 100644 --- a/providers/openai/language_model.go +++ b/providers/openai/language_model.go @@ -380,6 +380,9 @@ func (o languageModel) Stream(ctx context.Context, call fantasy.Call) (fantasy.S for _, toolCallDelta := range choice.Delta.ToolCalls { if existingToolCall, ok := toolCalls[toolCallDelta.Index]; ok { + if existingToolCall.hasFinished { + continue + } if toolCallDelta.Function.Arguments != "" { existingToolCall.arguments += toolCallDelta.Function.Arguments if !yield(fantasy.StreamPart{ @@ -408,6 +411,33 @@ func (o languageModel) Stream(ctx context.Context, call fantasy.Call) (fantasy.S return } + // A new tool call index means any previously opened + // calls are complete. Emit ToolInputEnd for each to + // preserve per-call framing during streaming so that + // consumers can reconstruct parallel tool calls from + // the stream order without buffering. Close them in + // index order for deterministic output. + priorIndices := make([]int64, 0, len(toolCalls)) + for idx := range toolCalls { + priorIndices = append(priorIndices, idx) + } + slices.Sort(priorIndices) + for _, idx := range priorIndices { + tc := toolCalls[idx] + if idx >= toolCallDelta.Index || tc.hasFinished { + continue + } + if tc.arguments == "" { + tc.arguments = "{}" + toolCalls[idx] = tc + } + if !yield(fantasy.StreamPart{Type: fantasy.StreamPartTypeToolInputEnd, ID: tc.id}) { + return + } + tc.hasFinished = true + toolCalls[idx] = tc + } + if !yield(fantasy.StreamPart{ Type: fantasy.StreamPartTypeToolInputStart, ID: toolCallDelta.ID, @@ -482,15 +512,14 @@ func (o languageModel) Stream(ctx context.Context, call fantasy.Call) (fantasy.S slices.Sort(indices) for _, idx := range indices { tc := toolCalls[idx] - if tc.hasFinished { - continue - } - if tc.arguments == "" { - tc.arguments = "{}" - toolCalls[idx] = tc - } - if !yield(fantasy.StreamPart{Type: fantasy.StreamPartTypeToolInputEnd, ID: tc.id}) { - return + if !tc.hasFinished { + if tc.arguments == "" { + tc.arguments = "{}" + toolCalls[idx] = tc + } + if !yield(fantasy.StreamPart{Type: fantasy.StreamPartTypeToolInputEnd, ID: tc.id}) { + return + } } if !yield(fantasy.StreamPart{Type: fantasy.StreamPartTypeToolCall, ID: tc.id, ToolCallName: tc.name, ToolCallInput: tc.arguments}) { return diff --git a/providers/openai/openai_test.go b/providers/openai/openai_test.go index 94eb1f849..7663a0405 100644 --- a/providers/openai/openai_test.go +++ b/providers/openai/openai_test.go @@ -2288,6 +2288,29 @@ func (sms *streamingMockServer) prepareToolStreamResponse() { sms.chunks = chunks } +// prepareParallelToolStreamResponse streams two tool calls (index 0 and +// index 1) the way OpenAI-compatible providers do: each call's fragments +// arrive sequentially by index, and finish_reason only comes at the end. +func (sms *streamingMockServer) prepareParallelToolStreamResponse() { + chunk := func(body string) string { + return `data: {"id":"chatcmpl-parallel","object":"chat.completion.chunk","created":1711357598,"model":"gpt-3.5-turbo-0125","choices":[{"index":0,"delta":` + body + `,"finish_reason":null}]}` + "\n\n" + } + chunks := []string{ + // Tool call 0 (get_weather) + chunk(`{"role":"assistant","content":null,"tool_calls":[{"index":0,"id":"call_weather","type":"function","function":{"name":"get_weather","arguments":""}}]}`), + chunk(`{"tool_calls":[{"index":0,"function":{"arguments":"{\"city\":"}}]}`), + chunk(`{"tool_calls":[{"index":0,"function":{"arguments":"\"NYC\"}"}}]}`), + // Tool call 1 (get_time) — appearance of index 1 closes call 0 + chunk(`{"tool_calls":[{"index":1,"id":"call_time","type":"function","function":{"name":"get_time","arguments":""}}]}`), + chunk(`{"tool_calls":[{"index":1,"function":{"arguments":"{\"tz\":"}}]}`), + chunk(`{"tool_calls":[{"index":1,"function":{"arguments":"\"EST\"}"}}]}`), + `data: {"id":"chatcmpl-parallel","object":"chat.completion.chunk","created":1711357598,"model":"gpt-3.5-turbo-0125","choices":[{"index":0,"delta":{},"finish_reason":"tool_calls"}]}` + "\n\n", + `data: {"id":"chatcmpl-parallel","object":"chat.completion.chunk","created":1711357598,"model":"gpt-3.5-turbo-0125","choices":[],"usage":{"prompt_tokens":53,"completion_tokens":17,"total_tokens":70}}` + "\n\n", + "data: [DONE]\n\n", + } + sms.chunks = chunks +} + func (sms *streamingMockServer) prepareMixedContentAndToolStreamResponse() { chunks := []string{ // Chunk with both content and tool_calls in the same delta @@ -2584,6 +2607,82 @@ func TestDoStream(t *testing.T) { require.Equal(t, `{"value":"Sparkle Day"}`, fullInput.String()) }) + t.Run("should frame parallel tool calls during streaming", func(t *testing.T) { + t.Parallel() + + server := newStreamingMockServer() + defer server.close() + + server.prepareParallelToolStreamResponse() + + provider, err := New( + WithAPIKey("test-api-key"), + WithBaseURL(server.server.URL), + ) + require.NoError(t, err) + model, _ := provider.LanguageModel(t.Context(), "gpt-3.5-turbo") + + stream, err := model.Stream(context.Background(), fantasy.Call{ + Prompt: testPrompt, + Tools: []fantasy.Tool{ + fantasy.FunctionTool{Name: "get_weather"}, + fantasy.FunctionTool{Name: "get_time"}, + }, + }) + require.NoError(t, err) + + parts, err := collectStreamParts(stream) + require.NoError(t, err) + + // The framing contract: a tool call must be fully delimited + // (Start -> Deltas -> End) before the next one opens. No two calls + // may be open at once, and no delta may arrive for an already-ended + // call. This is what lets an order/index-keyed consumer reconstruct + // parallel calls without buffering the whole stream. + var openID string // currently open tool call, "" if none + ended := map[string]bool{} + seenStart := map[string]bool{} + argsByID := map[string]*strings.Builder{} + nameByID := map[string]string{} + var order []string + + for _, part := range parts { + switch part.Type { + case fantasy.StreamPartTypeToolInputStart: + require.Empty(t, openID, + "tool call %s opened while %s still open (interleaved framing)", part.ID, openID) + require.False(t, seenStart[part.ID], "duplicate start for %s", part.ID) + openID = part.ID + seenStart[part.ID] = true + nameByID[part.ID] = part.ToolCallName + argsByID[part.ID] = &strings.Builder{} + order = append(order, part.ID) + case fantasy.StreamPartTypeToolInputDelta: + require.Equal(t, openID, part.ID, + "delta for %s but open call is %q", part.ID, openID) + require.False(t, ended[part.ID], "delta after end for %s", part.ID) + argsByID[part.ID].WriteString(part.Delta) + case fantasy.StreamPartTypeToolInputEnd: + require.Equal(t, openID, part.ID, + "end for %s but open call is %q", part.ID, openID) + ended[part.ID] = true + openID = "" + case fantasy.StreamPartTypeToolCall: + require.True(t, ended[part.ID], "tool call %s finalized before end", part.ID) + nameByID[part.ID] = part.ToolCallName + argsByID[part.ID].Reset() + argsByID[part.ID].WriteString(part.ToolCallInput) + } + } + + require.Equal(t, []string{"call_weather", "call_time"}, order, + "expected two distinct calls framed in order") + require.Equal(t, "get_weather", nameByID["call_weather"]) + require.JSONEq(t, `{"city":"NYC"}`, argsByID["call_weather"].String()) + require.Equal(t, "get_time", nameByID["call_time"]) + require.JSONEq(t, `{"tz":"EST"}`, argsByID["call_time"].String()) + }) + t.Run("should handle mixed content and tool calls in same chunk", func(t *testing.T) { t.Parallel() From 49edd14c39ea362861fa0cce23414d7dc312fba8 Mon Sep 17 00:00:00 2001 From: Kieran Klukas Date: Mon, 22 Jun 2026 16:21:55 -0400 Subject: [PATCH 018/156] v0.33.2 --- version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.txt b/version.txt index 8df3f4592..c9ec1d542 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -0.33.1 +0.33.2 From 81aa4e83d6100958e3a18ca6fd7f1964d83768f5 Mon Sep 17 00:00:00 2001 From: Kieran Klukas Date: Mon, 22 Jun 2026 11:53:50 -0400 Subject: [PATCH 019/156] fix(openai): don't double marshel responses api --- providers/openai/responses_language_model.go | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/providers/openai/responses_language_model.go b/providers/openai/responses_language_model.go index c1d4d4142..0be05f693 100644 --- a/providers/openai/responses_language_model.go +++ b/providers/openai/responses_language_model.go @@ -3,7 +3,6 @@ package openai import ( "context" "encoding/base64" - "encoding/json" "errors" "fmt" "io" @@ -551,16 +550,7 @@ func toResponsesPrompt(prompt fantasy.Prompt, systemMessageMode string, store bo continue } - inputJSON, err := json.Marshal(toolCallPart.Input) - if err != nil { - warnings = append(warnings, fantasy.CallWarning{ - Type: fantasy.CallWarningTypeOther, - Message: fmt.Sprintf("failed to marshal tool call input: %v", err), - }) - continue - } - - input = append(input, responses.ResponseInputItemParamOfFunctionCall(string(inputJSON), toolCallPart.ToolCallID, toolCallPart.ToolName)) + input = append(input, responses.ResponseInputItemParamOfFunctionCall(toolCallPart.Input, toolCallPart.ToolCallID, toolCallPart.ToolName)) case fantasy.ContentTypeSource: // Source citations from web search are not a // recognised Responses API input type; skip. From 4816e035e355d4caccdf8daefe38aab19cc686b3 Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Wed, 24 Jun 2026 14:41:52 -0300 Subject: [PATCH 020/156] ci: re-record some vcr cassettes --- providertests/azure_test.go | 14 - .../azure-gpt-5-mini/simple.yaml | 8 +- .../azure-gpt-5-mini/simple_streaming.yaml | 14 +- .../azure-gpt-5-mini/tool.yaml | 18 +- .../azure-gpt-5-mini/tool_streaming.yaml | 146 +- .../azure-grok-3-mini/simple.yaml | 33 - .../azure-grok-3-mini/simple_streaming.yaml | 32 - .../azure-grok-3-mini/tool.yaml | 65 - .../azure-grok-3-mini/tool_streaming.yaml | 1581 ----------------- .../TestAzureCommon/azure-o4-mini/simple.yaml | 8 +- .../azure-o4-mini/simple_streaming.yaml | 16 +- .../TestAzureCommon/azure-o4-mini/tool.yaml | 18 +- .../azure-o4-mini/tool_streaming.yaml | 140 +- .../azure-gpt-5-mini/simple.yaml | 48 +- .../azure-gpt-5-mini/simple_streaming.yaml | 28 +- .../azure-gpt-5-mini/tool.yaml | 76 +- .../azure-gpt-5-mini/tool_streaming.yaml | 134 +- .../azure-o4-mini/simple.yaml | 46 +- .../azure-o4-mini/simple_streaming.yaml | 28 +- .../azure-o4-mini/tool.yaml | 111 +- .../azure-o4-mini/tool_streaming.yaml | 210 +-- .../azure-gpt-5-mini/thinking-streaming.yaml | 1136 ++++++++---- .../azure-gpt-5-mini/thinking.yaml | 92 +- .../azure-gpt-5-mini/thinking-streaming.yaml | 274 +-- .../azure-gpt-5-mini/thinking.yaml | 18 +- .../azure-grok-3-mini/thinking-streaming.yaml | 1495 ---------------- .../azure-grok-3-mini/thinking.yaml | 65 - .../openai-gpt-4o-mini/multi_tool.yaml | 32 +- .../multi_tool_streaming.yaml | 92 +- .../openai-gpt-4o-mini/simple.yaml | 10 +- .../openai-gpt-4o-mini/simple_streaming.yaml | 14 +- .../openai-gpt-4o-mini/tool.yaml | 26 +- .../openai-gpt-4o-mini/tool_streaming.yaml | 66 +- .../openai-gpt-4o/multi_tool.yaml | 26 +- .../openai-gpt-4o/multi_tool_streaming.yaml | 80 +- .../openai-gpt-4o/simple.yaml | 12 +- .../openai-gpt-4o/simple_streaming.yaml | 14 +- .../TestOpenAICommon/openai-gpt-4o/tool.yaml | 30 +- .../openai-gpt-4o/tool_streaming.yaml | 62 +- .../openai-gpt-5/multi_tool.yaml | 28 +- .../openai-gpt-5/multi_tool_streaming.yaml | 88 +- .../TestOpenAICommon/openai-gpt-5/simple.yaml | 16 +- .../openai-gpt-5/simple_streaming.yaml | 14 +- .../TestOpenAICommon/openai-gpt-5/tool.yaml | 28 +- .../openai-gpt-5/tool_streaming.yaml | 92 +- .../openai-o4-mini/simple.yaml | 8 +- .../openai-o4-mini/simple_streaming.yaml | 14 +- .../TestOpenAICommon/openai-o4-mini/tool.yaml | 32 +- .../openai-o4-mini/tool_streaming.yaml | 124 +- .../openai-gpt-4o-mini/multi_tool.yaml | 50 +- .../multi_tool_streaming.yaml | 102 +- .../openai-gpt-4o-mini/simple.yaml | 18 +- .../openai-gpt-4o-mini/simple_streaming.yaml | 34 +- .../openai-gpt-4o-mini/tool.yaml | 46 +- .../openai-gpt-4o-mini/tool_streaming.yaml | 121 +- .../openai-gpt-4o/multi_tool.yaml | 50 +- .../openai-gpt-4o/multi_tool_streaming.yaml | 88 +- .../openai-gpt-4o/simple.yaml | 18 +- .../openai-gpt-4o/simple_streaming.yaml | 24 +- .../openai-gpt-4o/tool.yaml | 42 +- .../openai-gpt-4o/tool_streaming.yaml | 80 +- .../openai-gpt-5/multi_tool.yaml | 55 +- .../openai-gpt-5/multi_tool_streaming.yaml | 120 +- .../openai-gpt-5/simple.yaml | 23 +- .../openai-gpt-5/simple_streaming.yaml | 28 +- .../openai-gpt-5/tool.yaml | 56 +- .../openai-gpt-5/tool_streaming.yaml | 143 +- .../openai-o4-mini/simple.yaml | 25 +- .../openai-o4-mini/simple_streaming.yaml | 28 +- .../openai-o4-mini/tool.yaml | 55 +- .../openai-o4-mini/tool_streaming.yaml | 177 +- .../openai-gpt-5/thinking-streaming.yaml | 594 +++++-- .../openai-gpt-5/thinking.yaml | 72 +- .../openai-o4-mini/thinking-streaming.yaml | 480 ++++- .../openai-o4-mini/thinking.yaml | 69 +- .../TestOpenAIWebSearch/generate.yaml | 66 +- .../testdata/TestOpenAIWebSearch/stream.yaml | 106 +- 77 files changed, 3506 insertions(+), 6026 deletions(-) delete mode 100644 providertests/testdata/TestAzureCommon/azure-grok-3-mini/simple.yaml delete mode 100644 providertests/testdata/TestAzureCommon/azure-grok-3-mini/simple_streaming.yaml delete mode 100644 providertests/testdata/TestAzureCommon/azure-grok-3-mini/tool.yaml delete mode 100644 providertests/testdata/TestAzureCommon/azure-grok-3-mini/tool_streaming.yaml delete mode 100644 providertests/testdata/TestAzureThinking/azure-grok-3-mini/thinking-streaming.yaml delete mode 100644 providertests/testdata/TestAzureThinking/azure-grok-3-mini/thinking.yaml diff --git a/providertests/azure_test.go b/providertests/azure_test.go index 198b8dc1c..2c152f41f 100644 --- a/providertests/azure_test.go +++ b/providertests/azure_test.go @@ -19,7 +19,6 @@ func TestAzureCommon(t *testing.T) { testCommon(t, []builderPair{ {"azure-o4-mini", builderAzureO4Mini, nil, nil}, {"azure-gpt-5-mini", builderAzureGpt5Mini, nil, nil}, - {"azure-grok-3-mini", builderAzureGrok3Mini, nil, nil}, }) } @@ -31,7 +30,6 @@ func TestAzureThinking(t *testing.T) { } testThinking(t, []builderPair{ {"azure-gpt-5-mini", builderAzureGpt5Mini, opts, nil}, - {"azure-grok-3-mini", builderAzureGrok3Mini, opts, nil}, }, testAzureThinking) } @@ -62,15 +60,3 @@ func builderAzureGpt5Mini(t *testing.T, r *vcr.Recorder) (fantasy.LanguageModel, } return provider.LanguageModel(t.Context(), "gpt-5-mini") } - -func builderAzureGrok3Mini(t *testing.T, r *vcr.Recorder) (fantasy.LanguageModel, error) { - provider, err := azure.New( - azure.WithBaseURL(cmp.Or(os.Getenv("FANTASY_AZURE_BASE_URL"), defaultBaseURL)), - azure.WithAPIKey(cmp.Or(os.Getenv("FANTASY_AZURE_API_KEY"), "(missing)")), - azure.WithHTTPClient(&http.Client{Transport: r}), - ) - if err != nil { - return nil, err - } - return provider.LanguageModel(t.Context(), "grok-3-mini") -} diff --git a/providertests/testdata/TestAzureCommon/azure-gpt-5-mini/simple.yaml b/providertests/testdata/TestAzureCommon/azure-gpt-5-mini/simple.yaml index 38493646a..0531e1c48 100644 --- a/providertests/testdata/TestAzureCommon/azure-gpt-5-mini/simple.yaml +++ b/providertests/testdata/TestAzureCommon/azure-gpt-5-mini/simple.yaml @@ -15,19 +15,19 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://fantasy-playground-resource.openai.azure.com/openai/v1/chat/completions method: POST response: proto: HTTP/2.0 proto_major: 2 proto_minor: 0 - content_length: 1237 + content_length: 1454 body: | - {"choices":[{"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"protected_material_code":{"detected":false,"filtered":false},"protected_material_text":{"detected":false,"filtered":false},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}},"finish_reason":"stop","index":0,"logprobs":null,"message":{"annotations":[],"content":"Olá! (Também pode dizer \"Oi!\")","refusal":null,"role":"assistant"}}],"created":1773338551,"id":"chatcmpl-DIeedLK38HDSQxHhwI3VIErqbd4qK","model":"gpt-5-mini-2025-08-07","object":"chat.completion","prompt_filter_results":[{"prompt_index":0,"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"jailbreak":{"detected":false,"filtered":false},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}}}],"system_fingerprint":null,"usage":{"completion_tokens":147,"completion_tokens_details":{"accepted_prediction_tokens":0,"audio_tokens":0,"reasoning_tokens":128,"rejected_prediction_tokens":0},"prompt_tokens":19,"prompt_tokens_details":{"audio_tokens":0,"cached_tokens":0},"total_tokens":166}} + {"choices":[{"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"protected_material_code":{"detected":false,"filtered":false},"protected_material_text":{"detected":false,"filtered":false},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}},"finish_reason":"stop","index":0,"logprobs":null,"message":{"annotations":[],"content":"Olá!","refusal":null,"role":"assistant"}}],"created":1782321611,"id":"chatcmpl-DuLYhiZehlyeMI3MQ9ixLY8FX1NBq","model":"gpt-5-mini-2025-08-07","object":"chat.completion","prompt_filter_results":[{"prompt_index":0,"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"jailbreak":{"detected":false,"filtered":false},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}}}],"service_tier":"default","system_fingerprint":null,"usage":{"completion_tokens":76,"completion_tokens_details":{"accepted_prediction_tokens":0,"audio_tokens":0,"reasoning_tokens":64,"rejected_prediction_tokens":0},"latency_checkpoint":{"engine_tbt_ms":12,"engine_ttft_ms":42,"engine_ttlt_ms":1604,"pre_inference_ms":221,"service_tbt_ms":12,"service_ttft_ms":341,"service_ttlt_ms":1872,"total_duration_ms":1661,"user_visible_ttft_ms":120},"prompt_tokens":19,"prompt_tokens_details":{"audio_tokens":0,"cached_tokens":0},"total_tokens":95}} headers: Content-Type: - application/json status: 200 OK code: 200 - duration: 3.189707208s + duration: 2.495024042s diff --git a/providertests/testdata/TestAzureCommon/azure-gpt-5-mini/simple_streaming.yaml b/providertests/testdata/TestAzureCommon/azure-gpt-5-mini/simple_streaming.yaml index 55cb75e62..d3dac268f 100644 --- a/providertests/testdata/TestAzureCommon/azure-gpt-5-mini/simple_streaming.yaml +++ b/providertests/testdata/TestAzureCommon/azure-gpt-5-mini/simple_streaming.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://fantasy-playground-resource.openai.azure.com/openai/v1/chat/completions method: POST response: @@ -26,15 +26,15 @@ interactions: body: |+ data: {"choices":[],"created":0,"id":"","model":"","object":"","prompt_filter_results":[{"prompt_index":0,"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"jailbreak":{"detected":false,"filtered":false},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}}}]} - data: {"choices":[{"content_filter_results":{},"delta":{"content":"","refusal":null,"role":"assistant"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338554,"id":"chatcmpl-DIeegIrNy9WWawejS4BxAWXvSfvYD","model":"gpt-5-mini-2025-08-07","obfuscation":"EhAqKil2ZE9b9t","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":"","refusal":null,"role":"assistant"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321614,"id":"chatcmpl-DuLYkWnz0OixBh4yGRX57RgoH5wVP","model":"gpt-5-mini-2025-08-07","obfuscation":"ZKaqV","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":"Olá"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338554,"id":"chatcmpl-DIeegIrNy9WWawejS4BxAWXvSfvYD","model":"gpt-5-mini-2025-08-07","obfuscation":"ZoWpqohbaOh0u","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{"protected_material_text":{"detected":false,"filtered":false}},"delta":{"content":"Oi"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321614,"id":"chatcmpl-DuLYkWnz0OixBh4yGRX57RgoH5wVP","model":"gpt-5-mini-2025-08-07","obfuscation":"fYkxq","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":"!"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338554,"id":"chatcmpl-DIeegIrNy9WWawejS4BxAWXvSfvYD","model":"gpt-5-mini-2025-08-07","obfuscation":"5hv4pnP8HC9jryK","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{"protected_material_text":{"detected":false,"filtered":false}},"delta":{"content":"!"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321614,"id":"chatcmpl-DuLYkWnz0OixBh4yGRX57RgoH5wVP","model":"gpt-5-mini-2025-08-07","obfuscation":"Ymhvbc","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{},"finish_reason":"stop","index":0,"logprobs":null}],"created":1773338554,"id":"chatcmpl-DIeegIrNy9WWawejS4BxAWXvSfvYD","model":"gpt-5-mini-2025-08-07","obfuscation":"7vERe2IKtr","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{},"finish_reason":"stop","index":0,"logprobs":null}],"created":1782321614,"id":"chatcmpl-DuLYkWnz0OixBh4yGRX57RgoH5wVP","model":"gpt-5-mini-2025-08-07","obfuscation":"G","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[],"created":1773338554,"id":"chatcmpl-DIeegIrNy9WWawejS4BxAWXvSfvYD","model":"gpt-5-mini-2025-08-07","obfuscation":"EwDY3uVnpJy","object":"chat.completion.chunk","system_fingerprint":null,"usage":{"completion_tokens":140,"completion_tokens_details":{"accepted_prediction_tokens":0,"audio_tokens":0,"reasoning_tokens":128,"rejected_prediction_tokens":0},"prompt_tokens":19,"prompt_tokens_details":{"audio_tokens":0,"cached_tokens":0},"total_tokens":159}} + data: {"choices":[],"created":1782321614,"id":"chatcmpl-DuLYkWnz0OixBh4yGRX57RgoH5wVP","latency_checkpoint":{"engine_tbt_ms":14,"engine_ttft_ms":33,"engine_ttlt_ms":1879,"pre_inference_ms":152,"service_tbt_ms":14,"service_ttft_ms":230,"service_ttlt_ms":2074,"total_duration_ms":1928,"user_visible_ttft_ms":78},"model":"gpt-5-mini-2025-08-07","obfuscation":"j2MAjf","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":{"completion_tokens":76,"completion_tokens_details":{"accepted_prediction_tokens":0,"audio_tokens":0,"reasoning_tokens":64,"rejected_prediction_tokens":0},"prompt_tokens":19,"prompt_tokens_details":{"audio_tokens":0,"cached_tokens":0},"total_tokens":95}} data: [DONE] @@ -43,4 +43,4 @@ interactions: - text/event-stream; charset=utf-8 status: 200 OK code: 200 - duration: 2.195586958s + duration: 2.197034583s diff --git a/providertests/testdata/TestAzureCommon/azure-gpt-5-mini/tool.yaml b/providertests/testdata/TestAzureCommon/azure-gpt-5-mini/tool.yaml index b0edc83e3..524cf87da 100644 --- a/providertests/testdata/TestAzureCommon/azure-gpt-5-mini/tool.yaml +++ b/providertests/testdata/TestAzureCommon/azure-gpt-5-mini/tool.yaml @@ -15,22 +15,22 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://fantasy-playground-resource.openai.azure.com/openai/v1/chat/completions method: POST response: proto: HTTP/2.0 proto_major: 2 proto_minor: 0 - content_length: 1050 + content_length: 1299 body: | - {"choices":[{"content_filter_results":{},"finish_reason":"tool_calls","index":0,"logprobs":null,"message":{"annotations":[],"content":null,"refusal":null,"role":"assistant","tool_calls":[{"function":{"arguments":"{\"location\":\"Florence, Italy\"}","name":"weather"},"id":"call_edU4N20ezA2f2AsnHNqoYiLu","type":"function"}]}}],"created":1773338556,"id":"chatcmpl-DIeeiYz1XOQPCPMnuXEBGDSFAyy29","model":"gpt-5-mini-2025-08-07","object":"chat.completion","prompt_filter_results":[{"prompt_index":0,"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"jailbreak":{"detected":false,"filtered":false},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}}}],"system_fingerprint":null,"usage":{"completion_tokens":26,"completion_tokens_details":{"accepted_prediction_tokens":0,"audio_tokens":0,"reasoning_tokens":0,"rejected_prediction_tokens":0},"prompt_tokens":145,"prompt_tokens_details":{"audio_tokens":0,"cached_tokens":0},"total_tokens":171}} + {"choices":[{"content_filter_results":{},"finish_reason":"tool_calls","index":0,"logprobs":null,"message":{"annotations":[],"content":null,"refusal":null,"role":"assistant","tool_calls":[{"function":{"arguments":"{\"location\":\"Florence, Italy\"}","name":"weather"},"id":"call_mbWCiHb6eF0qjzWrYgK52fWS","type":"function"}]}}],"created":1782321616,"id":"chatcmpl-DuLYmgf20hGu0QAyj7XLR7WSNqeW0","model":"gpt-5-mini-2025-08-07","object":"chat.completion","prompt_filter_results":[{"prompt_index":0,"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"jailbreak":{"detected":false,"filtered":false},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}}}],"service_tier":"default","system_fingerprint":null,"usage":{"completion_tokens":26,"completion_tokens_details":{"accepted_prediction_tokens":0,"audio_tokens":0,"reasoning_tokens":0,"rejected_prediction_tokens":0},"latency_checkpoint":{"engine_tbt_ms":11,"engine_ttft_ms":67,"engine_ttlt_ms":1042,"pre_inference_ms":162,"service_tbt_ms":11,"service_ttft_ms":615,"service_ttlt_ms":1584,"total_duration_ms":1432,"user_visible_ttft_ms":453},"prompt_tokens":145,"prompt_tokens_details":{"audio_tokens":0,"cached_tokens":0},"total_tokens":171}} headers: Content-Type: - application/json status: 200 OK code: 200 - duration: 1.998598583s + duration: 1.886590167s - id: 1 request: proto: HTTP/1.1 @@ -38,26 +38,26 @@ interactions: proto_minor: 1 content_length: 715 host: "" - body: '{"messages":[{"content":"You are a helpful assistant","role":"system"},{"content":"What''s the weather in Florence,Italy?","role":"user"},{"tool_calls":[{"id":"call_edU4N20ezA2f2AsnHNqoYiLu","function":{"arguments":"{\"location\":\"Florence, Italy\"}","name":"weather"},"type":"function"}],"role":"assistant"},{"content":"40 C","tool_call_id":"call_edU4N20ezA2f2AsnHNqoYiLu","role":"tool"}],"model":"gpt-5-mini","max_completion_tokens":4000,"tool_choice":"auto","tools":[{"function":{"name":"weather","strict":false,"description":"Get weather information for a location","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"}},"type":"function"}]}' + body: '{"messages":[{"content":"You are a helpful assistant","role":"system"},{"content":"What''s the weather in Florence,Italy?","role":"user"},{"tool_calls":[{"id":"call_mbWCiHb6eF0qjzWrYgK52fWS","function":{"arguments":"{\"location\":\"Florence, Italy\"}","name":"weather"},"type":"function"}],"role":"assistant"},{"content":"40 C","tool_call_id":"call_mbWCiHb6eF0qjzWrYgK52fWS","role":"tool"}],"model":"gpt-5-mini","max_completion_tokens":4000,"tool_choice":"auto","tools":[{"function":{"name":"weather","strict":false,"description":"Get weather information for a location","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"}},"type":"function"}]}' headers: Accept: - application/json Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://fantasy-playground-resource.openai.azure.com/openai/v1/chat/completions method: POST response: proto: HTTP/2.0 proto_major: 2 proto_minor: 0 - content_length: 1255 + content_length: 1581 body: | - {"choices":[{"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"protected_material_code":{"detected":false,"filtered":false},"protected_material_text":{"detected":false,"filtered":false},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}},"finish_reason":"stop","index":0,"logprobs":null,"message":{"annotations":[],"content":"Current temperature in Florence, Italy is about 40°C (104°F). That's very hot — stay hydrated, avoid prolonged sun exposure during midday, wear light clothing and sunscreen, and seek air-conditioned or shaded places. Would you like an hourly forecast or the next few days' outlook?","refusal":null,"role":"assistant"}}],"created":1773338558,"id":"chatcmpl-DIeekTBGgEbhq9sATnlEa4NSsW3WQ","model":"gpt-5-mini-2025-08-07","object":"chat.completion","prompt_filter_results":[{"prompt_index":0,"content_filter_results":{}}],"system_fingerprint":null,"usage":{"completion_tokens":259,"completion_tokens_details":{"accepted_prediction_tokens":0,"audio_tokens":0,"reasoning_tokens":192,"rejected_prediction_tokens":0},"prompt_tokens":176,"prompt_tokens_details":{"audio_tokens":0,"cached_tokens":0},"total_tokens":435}} + {"choices":[{"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"protected_material_code":{"detected":false,"filtered":false},"protected_material_text":{"detected":false,"filtered":false},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}},"finish_reason":"stop","index":0,"logprobs":null,"message":{"annotations":[],"content":"Current temperature in Florence, Italy: 40 °C (104 °F).\n\nThat’s quite hot — recommendations: stay hydrated, avoid strenuous outdoor activity during midday, seek shade or air-conditioned places, wear light clothing and sunscreen, and check for local heat advisories. Would you like an hourly forecast, the next few days, or details like humidity and wind?","refusal":null,"role":"assistant"}}],"created":1782321618,"id":"chatcmpl-DuLYopOLgCaC41qFg4mR61lgZ1JgH","model":"gpt-5-mini-2025-08-07","object":"chat.completion","prompt_filter_results":[{"prompt_index":0,"content_filter_results":{}}],"service_tier":"default","system_fingerprint":null,"usage":{"completion_tokens":339,"completion_tokens_details":{"accepted_prediction_tokens":0,"audio_tokens":0,"reasoning_tokens":256,"rejected_prediction_tokens":0},"latency_checkpoint":{"engine_tbt_ms":11,"engine_ttft_ms":39,"engine_ttlt_ms":4111,"pre_inference_ms":232,"service_tbt_ms":11,"service_ttft_ms":675,"service_ttlt_ms":4729,"total_duration_ms":4505,"user_visible_ttft_ms":442},"prompt_tokens":176,"prompt_tokens_details":{"audio_tokens":0,"cached_tokens":0},"total_tokens":515}} headers: Content-Type: - application/json status: 200 OK code: 200 - duration: 3.48047525s + duration: 5.154820917s diff --git a/providertests/testdata/TestAzureCommon/azure-gpt-5-mini/tool_streaming.yaml b/providertests/testdata/TestAzureCommon/azure-gpt-5-mini/tool_streaming.yaml index d3310ee6d..051de432e 100644 --- a/providertests/testdata/TestAzureCommon/azure-gpt-5-mini/tool_streaming.yaml +++ b/providertests/testdata/TestAzureCommon/azure-gpt-5-mini/tool_streaming.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://fantasy-playground-resource.openai.azure.com/openai/v1/chat/completions method: POST response: @@ -26,27 +26,27 @@ interactions: body: |+ data: {"choices":[],"created":0,"id":"","model":"","object":"","prompt_filter_results":[{"prompt_index":0,"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"jailbreak":{"detected":false,"filtered":false},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}}}]} - data: {"choices":[{"content_filter_results":{},"delta":{"content":null,"refusal":null,"role":"assistant","tool_calls":[{"function":{"arguments":"","name":"weather"},"id":"call_Uun1CuQcKMnJaasyIjDRSvNA","index":0,"type":"function"}]},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338562,"id":"chatcmpl-DIeeoJOzj2DC8PUCkMyDf8yzUi3dE","model":"gpt-5-mini-2025-08-07","obfuscation":"KzUkXudQz5RDs","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":null,"refusal":null,"role":"assistant","tool_calls":[{"function":{"arguments":"","name":"weather"},"id":"call_tWA8BJziGlCyhQEXhEHn6eXK","index":0,"type":"function"}]},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321623,"id":"chatcmpl-DuLYtUePDgoybMkZrAI7utkb2fiRp","model":"gpt-5-mini-2025-08-07","obfuscation":"BRHU","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"tool_calls":[{"function":{"arguments":"{\""},"index":0}]},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338562,"id":"chatcmpl-DIeeoJOzj2DC8PUCkMyDf8yzUi3dE","model":"gpt-5-mini-2025-08-07","obfuscation":"kLe","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"tool_calls":[{"function":{"arguments":"{\""},"index":0}]},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321623,"id":"chatcmpl-DuLYtUePDgoybMkZrAI7utkb2fiRp","model":"gpt-5-mini-2025-08-07","obfuscation":"Xj8lw887mg","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"tool_calls":[{"function":{"arguments":"location"},"index":0}]},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338562,"id":"chatcmpl-DIeeoJOzj2DC8PUCkMyDf8yzUi3dE","model":"gpt-5-mini-2025-08-07","obfuscation":"WDT4pDqVpis4rM","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"tool_calls":[{"function":{"arguments":"location"},"index":0}]},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321623,"id":"chatcmpl-DuLYtUePDgoybMkZrAI7utkb2fiRp","model":"gpt-5-mini-2025-08-07","obfuscation":"ZuupD","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"tool_calls":[{"function":{"arguments":"\":\""},"index":0}]},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338562,"id":"chatcmpl-DIeeoJOzj2DC8PUCkMyDf8yzUi3dE","model":"gpt-5-mini-2025-08-07","obfuscation":"5","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"tool_calls":[{"function":{"arguments":"\":\""},"index":0}]},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321623,"id":"chatcmpl-DuLYtUePDgoybMkZrAI7utkb2fiRp","model":"gpt-5-mini-2025-08-07","obfuscation":"aelgHDyC","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"tool_calls":[{"function":{"arguments":"Flor"},"index":0}]},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338562,"id":"chatcmpl-DIeeoJOzj2DC8PUCkMyDf8yzUi3dE","model":"gpt-5-mini-2025-08-07","obfuscation":"CO","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"tool_calls":[{"function":{"arguments":"Flor"},"index":0}]},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321623,"id":"chatcmpl-DuLYtUePDgoybMkZrAI7utkb2fiRp","model":"gpt-5-mini-2025-08-07","obfuscation":"bcGsOx5pR","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"tool_calls":[{"function":{"arguments":"ence"},"index":0}]},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338562,"id":"chatcmpl-DIeeoJOzj2DC8PUCkMyDf8yzUi3dE","model":"gpt-5-mini-2025-08-07","obfuscation":"At","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"tool_calls":[{"function":{"arguments":"ence"},"index":0}]},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321623,"id":"chatcmpl-DuLYtUePDgoybMkZrAI7utkb2fiRp","model":"gpt-5-mini-2025-08-07","obfuscation":"mhsHoDd0B","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"tool_calls":[{"function":{"arguments":","},"index":0}]},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338562,"id":"chatcmpl-DIeeoJOzj2DC8PUCkMyDf8yzUi3dE","model":"gpt-5-mini-2025-08-07","obfuscation":"bKrJc","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"tool_calls":[{"function":{"arguments":","},"index":0}]},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321623,"id":"chatcmpl-DuLYtUePDgoybMkZrAI7utkb2fiRp","model":"gpt-5-mini-2025-08-07","obfuscation":"l7JiDL3oM6rQ","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"tool_calls":[{"function":{"arguments":" Italy"},"index":0}]},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338562,"id":"chatcmpl-DIeeoJOzj2DC8PUCkMyDf8yzUi3dE","model":"gpt-5-mini-2025-08-07","obfuscation":"","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"tool_calls":[{"function":{"arguments":" Italy"},"index":0}]},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321623,"id":"chatcmpl-DuLYtUePDgoybMkZrAI7utkb2fiRp","model":"gpt-5-mini-2025-08-07","obfuscation":"faZSzEQ","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"tool_calls":[{"function":{"arguments":"\"}"},"index":0}]},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338562,"id":"chatcmpl-DIeeoJOzj2DC8PUCkMyDf8yzUi3dE","model":"gpt-5-mini-2025-08-07","obfuscation":"LrA","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"tool_calls":[{"function":{"arguments":"\"}"},"index":0}]},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321623,"id":"chatcmpl-DuLYtUePDgoybMkZrAI7utkb2fiRp","model":"gpt-5-mini-2025-08-07","obfuscation":"HyAggmy7f5","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{},"finish_reason":"tool_calls","index":0,"logprobs":null}],"created":1773338562,"id":"chatcmpl-DIeeoJOzj2DC8PUCkMyDf8yzUi3dE","model":"gpt-5-mini-2025-08-07","obfuscation":"yOL4","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{},"finish_reason":"tool_calls","index":0,"logprobs":null}],"created":1782321623,"id":"chatcmpl-DuLYtUePDgoybMkZrAI7utkb2fiRp","model":"gpt-5-mini-2025-08-07","obfuscation":"kZv1Ls5KFhu","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[],"created":1773338562,"id":"chatcmpl-DIeeoJOzj2DC8PUCkMyDf8yzUi3dE","model":"gpt-5-mini-2025-08-07","obfuscation":"mkQFM6Mxl6iWl","object":"chat.completion.chunk","system_fingerprint":null,"usage":{"completion_tokens":26,"completion_tokens_details":{"accepted_prediction_tokens":0,"audio_tokens":0,"reasoning_tokens":0,"rejected_prediction_tokens":0},"prompt_tokens":145,"prompt_tokens_details":{"audio_tokens":0,"cached_tokens":0},"total_tokens":171}} + data: {"choices":[],"created":1782321623,"id":"chatcmpl-DuLYtUePDgoybMkZrAI7utkb2fiRp","latency_checkpoint":{"engine_tbt_ms":10,"engine_ttft_ms":42,"engine_ttlt_ms":1736,"pre_inference_ms":127,"service_tbt_ms":10,"service_ttft_ms":554,"service_ttlt_ms":2243,"total_duration_ms":2123,"user_visible_ttft_ms":427},"model":"gpt-5-mini-2025-08-07","obfuscation":"R","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":{"completion_tokens":154,"completion_tokens_details":{"accepted_prediction_tokens":0,"audio_tokens":0,"reasoning_tokens":128,"rejected_prediction_tokens":0},"prompt_tokens":145,"prompt_tokens_details":{"audio_tokens":0,"cached_tokens":0},"total_tokens":299}} data: [DONE] @@ -55,7 +55,7 @@ interactions: - text/event-stream; charset=utf-8 status: 200 OK code: 200 - duration: 1.535163416s + duration: 2.319673917s - id: 1 request: proto: HTTP/1.1 @@ -63,14 +63,14 @@ interactions: proto_minor: 1 content_length: 769 host: "" - body: '{"messages":[{"content":"You are a helpful assistant","role":"system"},{"content":"What''s the weather in Florence,Italy?","role":"user"},{"tool_calls":[{"id":"call_Uun1CuQcKMnJaasyIjDRSvNA","function":{"arguments":"{\"location\":\"Florence, Italy\"}","name":"weather"},"type":"function"}],"role":"assistant"},{"content":"40 C","tool_call_id":"call_Uun1CuQcKMnJaasyIjDRSvNA","role":"tool"}],"model":"gpt-5-mini","max_completion_tokens":4000,"stream_options":{"include_usage":true},"tool_choice":"auto","tools":[{"function":{"name":"weather","strict":false,"description":"Get weather information for a location","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"}},"type":"function"}],"stream":true}' + body: '{"messages":[{"content":"You are a helpful assistant","role":"system"},{"content":"What''s the weather in Florence,Italy?","role":"user"},{"tool_calls":[{"id":"call_tWA8BJziGlCyhQEXhEHn6eXK","function":{"arguments":"{\"location\":\"Florence, Italy\"}","name":"weather"},"type":"function"}],"role":"assistant"},{"content":"40 C","tool_call_id":"call_tWA8BJziGlCyhQEXhEHn6eXK","role":"tool"}],"model":"gpt-5-mini","max_completion_tokens":4000,"stream_options":{"include_usage":true},"tool_choice":"auto","tools":[{"function":{"name":"weather","strict":false,"description":"Get weather information for a location","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"}},"type":"function"}],"stream":true}' headers: Accept: - application/json Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://fantasy-playground-resource.openai.azure.com/openai/v1/chat/completions method: POST response: @@ -81,109 +81,119 @@ interactions: body: |+ data: {"choices":[],"created":0,"id":"","model":"","object":"","prompt_filter_results":[{"prompt_index":0,"content_filter_results":{}}]} - data: {"choices":[{"content_filter_results":{},"delta":{"content":"","refusal":null,"role":"assistant"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338563,"id":"chatcmpl-DIeepvwHUPC8RnAnTQe8YvtXfdsON","model":"gpt-5-mini-2025-08-07","obfuscation":"YjanfjgBl3EHUt","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":"","refusal":null,"role":"assistant"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321626,"id":"chatcmpl-DuLYwZ1HseuIZItghoKIrUbk69X6t","model":"gpt-5-mini-2025-08-07","obfuscation":"kAj8z","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":"Current"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338563,"id":"chatcmpl-DIeepvwHUPC8RnAnTQe8YvtXfdsON","model":"gpt-5-mini-2025-08-07","obfuscation":"meHYjwp4i","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":"Right"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321626,"id":"chatcmpl-DuLYwZ1HseuIZItghoKIrUbk69X6t","model":"gpt-5-mini-2025-08-07","obfuscation":"JH","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":" temperature"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338563,"id":"chatcmpl-DIeepvwHUPC8RnAnTQe8YvtXfdsON","model":"gpt-5-mini-2025-08-07","obfuscation":"dc4w","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":" now"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321626,"id":"chatcmpl-DuLYwZ1HseuIZItghoKIrUbk69X6t","model":"gpt-5-mini-2025-08-07","obfuscation":"aUF","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":" in"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338563,"id":"chatcmpl-DIeepvwHUPC8RnAnTQe8YvtXfdsON","model":"gpt-5-mini-2025-08-07","obfuscation":"k8WF6Yjpim42U","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":" in"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321626,"id":"chatcmpl-DuLYwZ1HseuIZItghoKIrUbk69X6t","model":"gpt-5-mini-2025-08-07","obfuscation":"rPYq","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":" Florence"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338563,"id":"chatcmpl-DIeepvwHUPC8RnAnTQe8YvtXfdsON","model":"gpt-5-mini-2025-08-07","obfuscation":"bQGurnM","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":" Florence"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321626,"id":"chatcmpl-DuLYwZ1HseuIZItghoKIrUbk69X6t","model":"gpt-5-mini-2025-08-07","obfuscation":"do410W3THpD2yL","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":","},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338563,"id":"chatcmpl-DIeepvwHUPC8RnAnTQe8YvtXfdsON","model":"gpt-5-mini-2025-08-07","obfuscation":"F6vDCajis1n2rq0","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":" it's"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321626,"id":"chatcmpl-DuLYwZ1HseuIZItghoKIrUbk69X6t","model":"gpt-5-mini-2025-08-07","obfuscation":"9q","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":" Italy"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338563,"id":"chatcmpl-DIeepvwHUPC8RnAnTQe8YvtXfdsON","model":"gpt-5-mini-2025-08-07","obfuscation":"gYnT1tMHK3","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":" about"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321626,"id":"chatcmpl-DuLYwZ1HseuIZItghoKIrUbk69X6t","model":"gpt-5-mini-2025-08-07","obfuscation":"b","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":" is"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338563,"id":"chatcmpl-DIeepvwHUPC8RnAnTQe8YvtXfdsON","model":"gpt-5-mini-2025-08-07","obfuscation":"ts5qAGHVgwOIx","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":" "},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321626,"id":"chatcmpl-DuLYwZ1HseuIZItghoKIrUbk69X6t","model":"gpt-5-mini-2025-08-07","obfuscation":"nAeAbv","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":" "},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338563,"id":"chatcmpl-DIeepvwHUPC8RnAnTQe8YvtXfdsON","model":"gpt-5-mini-2025-08-07","obfuscation":"IBUWjJWuWfEbHkX","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":"40"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321626,"id":"chatcmpl-DuLYwZ1HseuIZItghoKIrUbk69X6t","model":"gpt-5-mini-2025-08-07","obfuscation":"yD3rI","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":"40"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338563,"id":"chatcmpl-DIeepvwHUPC8RnAnTQe8YvtXfdsON","model":"gpt-5-mini-2025-08-07","obfuscation":"MNLd49779ZY7NZ","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":" °"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321626,"id":"chatcmpl-DuLYwZ1HseuIZItghoKIrUbk69X6t","model":"gpt-5-mini-2025-08-07","obfuscation":"mp6c9","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":"°C"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338563,"id":"chatcmpl-DIeepvwHUPC8RnAnTQe8YvtXfdsON","model":"gpt-5-mini-2025-08-07","obfuscation":"RWYlqCn69d0s0c","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":"C"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321626,"id":"chatcmpl-DuLYwZ1HseuIZItghoKIrUbk69X6t","model":"gpt-5-mini-2025-08-07","obfuscation":"OYDuEP","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":"."},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338563,"id":"chatcmpl-DIeepvwHUPC8RnAnTQe8YvtXfdsON","model":"gpt-5-mini-2025-08-07","obfuscation":"TWUycSrcklgTeqW","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":" ("},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321626,"id":"chatcmpl-DuLYwZ1HseuIZItghoKIrUbk69X6t","model":"gpt-5-mini-2025-08-07","obfuscation":"abPVS","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":" That"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338563,"id":"chatcmpl-DIeepvwHUPC8RnAnTQe8YvtXfdsON","model":"gpt-5-mini-2025-08-07","obfuscation":"nZV2WuJ1lEy","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":"104"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321626,"id":"chatcmpl-DuLYwZ1HseuIZItghoKIrUbk69X6t","model":"gpt-5-mini-2025-08-07","obfuscation":"shQw","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":"’s"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338563,"id":"chatcmpl-DIeepvwHUPC8RnAnTQe8YvtXfdsON","model":"gpt-5-mini-2025-08-07","obfuscation":"xoUjDl8XKypPOP","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":" °"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321626,"id":"chatcmpl-DuLYwZ1HseuIZItghoKIrUbk69X6t","model":"gpt-5-mini-2025-08-07","obfuscation":"5XhMG","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":" very"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338563,"id":"chatcmpl-DIeepvwHUPC8RnAnTQe8YvtXfdsON","model":"gpt-5-mini-2025-08-07","obfuscation":"1eOnBfdrSKO","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":"F"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321626,"id":"chatcmpl-DuLYwZ1HseuIZItghoKIrUbk69X6t","model":"gpt-5-mini-2025-08-07","obfuscation":"EZV0aT","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":" hot"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338563,"id":"chatcmpl-DIeepvwHUPC8RnAnTQe8YvtXfdsON","model":"gpt-5-mini-2025-08-07","obfuscation":"As9iA0A586WA","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":")"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321626,"id":"chatcmpl-DuLYwZ1HseuIZItghoKIrUbk69X6t","model":"gpt-5-mini-2025-08-07","obfuscation":"d6cXHh","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":" —"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338563,"id":"chatcmpl-DIeepvwHUPC8RnAnTQe8YvtXfdsON","model":"gpt-5-mini-2025-08-07","obfuscation":"KtbiBy6taA0AEk","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":" —"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321626,"id":"chatcmpl-DuLYwZ1HseuIZItghoKIrUbk69X6t","model":"gpt-5-mini-2025-08-07","obfuscation":"d1OTq","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":" stay"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338563,"id":"chatcmpl-DIeepvwHUPC8RnAnTQe8YvtXfdsON","model":"gpt-5-mini-2025-08-07","obfuscation":"ZThtHJc7gUw","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":" very"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321626,"id":"chatcmpl-DuLYwZ1HseuIZItghoKIrUbk69X6t","model":"gpt-5-mini-2025-08-07","obfuscation":"G9","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":" hydrated"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338563,"id":"chatcmpl-DIeepvwHUPC8RnAnTQe8YvtXfdsON","model":"gpt-5-mini-2025-08-07","obfuscation":"4QDJMs7","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":" hot"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321626,"id":"chatcmpl-DuLYwZ1HseuIZItghoKIrUbk69X6t","model":"gpt-5-mini-2025-08-07","obfuscation":"zLz","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":","},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338563,"id":"chatcmpl-DIeepvwHUPC8RnAnTQe8YvtXfdsON","model":"gpt-5-mini-2025-08-07","obfuscation":"x371RvpP7MgzmB1","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":"."},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321626,"id":"chatcmpl-DuLYwZ1HseuIZItghoKIrUbk69X6t","model":"gpt-5-mini-2025-08-07","obfuscation":"pW5dzs","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":" avoid"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338563,"id":"chatcmpl-DIeepvwHUPC8RnAnTQe8YvtXfdsON","model":"gpt-5-mini-2025-08-07","obfuscation":"QVbbbt23zG","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":" Stay"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321626,"id":"chatcmpl-DuLYwZ1HseuIZItghoKIrUbk69X6t","model":"gpt-5-mini-2025-08-07","obfuscation":"Q8","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":" prolonged"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338563,"id":"chatcmpl-DIeepvwHUPC8RnAnTQe8YvtXfdsON","model":"gpt-5-mini-2025-08-07","obfuscation":"ogjtwg","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":" hydrated"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321626,"id":"chatcmpl-DuLYwZ1HseuIZItghoKIrUbk69X6t","model":"gpt-5-mini-2025-08-07","obfuscation":"sRcy6ek9DCAjWT","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":" sun"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338563,"id":"chatcmpl-DIeepvwHUPC8RnAnTQe8YvtXfdsON","model":"gpt-5-mini-2025-08-07","obfuscation":"IER1Q4tYzJdd","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":","},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321626,"id":"chatcmpl-DuLYwZ1HseuIZItghoKIrUbk69X6t","model":"gpt-5-mini-2025-08-07","obfuscation":"gImTyJ","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":" exposure"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338563,"id":"chatcmpl-DIeepvwHUPC8RnAnTQe8YvtXfdsON","model":"gpt-5-mini-2025-08-07","obfuscation":"BvOQS6L","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":" avoid"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321626,"id":"chatcmpl-DuLYwZ1HseuIZItghoKIrUbk69X6t","model":"gpt-5-mini-2025-08-07","obfuscation":"U","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":","},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338563,"id":"chatcmpl-DIeepvwHUPC8RnAnTQe8YvtXfdsON","model":"gpt-5-mini-2025-08-07","obfuscation":"P49FWiFOtltAYGU","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":" prolonged"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321626,"id":"chatcmpl-DuLYwZ1HseuIZItghoKIrUbk69X6t","model":"gpt-5-mini-2025-08-07","obfuscation":"wLjPd1AbCgHCh","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":" and"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338563,"id":"chatcmpl-DIeepvwHUPC8RnAnTQe8YvtXfdsON","model":"gpt-5-mini-2025-08-07","obfuscation":"vZYByDq7TJrt","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":" sun"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321626,"id":"chatcmpl-DuLYwZ1HseuIZItghoKIrUbk69X6t","model":"gpt-5-mini-2025-08-07","obfuscation":"imu","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":" seek"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338563,"id":"chatcmpl-DIeepvwHUPC8RnAnTQe8YvtXfdsON","model":"gpt-5-mini-2025-08-07","obfuscation":"NFb9ZyqGytJ","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":" exposure"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321626,"id":"chatcmpl-DuLYwZ1HseuIZItghoKIrUbk69X6t","model":"gpt-5-mini-2025-08-07","obfuscation":"8mJvbeonhhCaL0","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":" cool"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338563,"id":"chatcmpl-DIeepvwHUPC8RnAnTQe8YvtXfdsON","model":"gpt-5-mini-2025-08-07","obfuscation":"hzj4e5K51bq","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":"/m"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321626,"id":"chatcmpl-DuLYwZ1HseuIZItghoKIrUbk69X6t","model":"gpt-5-mini-2025-08-07","obfuscation":"vL6p0","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":"/sh"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338563,"id":"chatcmpl-DIeepvwHUPC8RnAnTQe8YvtXfdsON","model":"gpt-5-mini-2025-08-07","obfuscation":"jIZJPr0uM4K4s","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":"id"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321626,"id":"chatcmpl-DuLYwZ1HseuIZItghoKIrUbk69X6t","model":"gpt-5-mini-2025-08-07","obfuscation":"fAMoo","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":"aded"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338563,"id":"chatcmpl-DIeepvwHUPC8RnAnTQe8YvtXfdsON","model":"gpt-5-mini-2025-08-07","obfuscation":"UXR8Nv7cXnxs","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":"day"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321626,"id":"chatcmpl-DuLYwZ1HseuIZItghoKIrUbk69X6t","model":"gpt-5-mini-2025-08-07","obfuscation":"1as4","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":" places"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338563,"id":"chatcmpl-DIeepvwHUPC8RnAnTQe8YvtXfdsON","model":"gpt-5-mini-2025-08-07","obfuscation":"YkGIs8cli","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":" outdoors"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321626,"id":"chatcmpl-DuLYwZ1HseuIZItghoKIrUbk69X6t","model":"gpt-5-mini-2025-08-07","obfuscation":"lQwDmVB6ze3E8N","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":"."},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338563,"id":"chatcmpl-DIeepvwHUPC8RnAnTQe8YvtXfdsON","model":"gpt-5-mini-2025-08-07","obfuscation":"5RzmCbbm30GfiiI","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":","},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321626,"id":"chatcmpl-DuLYwZ1HseuIZItghoKIrUbk69X6t","model":"gpt-5-mini-2025-08-07","obfuscation":"mYtSSB","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":" Would"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338563,"id":"chatcmpl-DIeepvwHUPC8RnAnTQe8YvtXfdsON","model":"gpt-5-mini-2025-08-07","obfuscation":"PjR5PHsk0J","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":" wear"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321626,"id":"chatcmpl-DuLYwZ1HseuIZItghoKIrUbk69X6t","model":"gpt-5-mini-2025-08-07","obfuscation":"1r","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":" you"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338563,"id":"chatcmpl-DIeepvwHUPC8RnAnTQe8YvtXfdsON","model":"gpt-5-mini-2025-08-07","obfuscation":"nB6vDr6RzESm","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":" light"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321626,"id":"chatcmpl-DuLYwZ1HseuIZItghoKIrUbk69X6t","model":"gpt-5-mini-2025-08-07","obfuscation":"W","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":" like"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338563,"id":"chatcmpl-DIeepvwHUPC8RnAnTQe8YvtXfdsON","model":"gpt-5-mini-2025-08-07","obfuscation":"E7D2D2fMuP2","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":" clothing"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321626,"id":"chatcmpl-DuLYwZ1HseuIZItghoKIrUbk69X6t","model":"gpt-5-mini-2025-08-07","obfuscation":"x1mXQHLDAQu2ZM","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}},"delta":{"content":" the"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338563,"id":"chatcmpl-DIeepvwHUPC8RnAnTQe8YvtXfdsON","model":"gpt-5-mini-2025-08-07","obfuscation":"KJIF57lgh2jY","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":" and"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321626,"id":"chatcmpl-DuLYwZ1HseuIZItghoKIrUbk69X6t","model":"gpt-5-mini-2025-08-07","obfuscation":"843","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":" hourly"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338563,"id":"chatcmpl-DIeepvwHUPC8RnAnTQe8YvtXfdsON","model":"gpt-5-mini-2025-08-07","obfuscation":"CFRI0BzNI","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":" sunscreen"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321626,"id":"chatcmpl-DuLYwZ1HseuIZItghoKIrUbk69X6t","model":"gpt-5-mini-2025-08-07","obfuscation":"kijd67lEUBFeR","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":" forecast"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338563,"id":"chatcmpl-DIeepvwHUPC8RnAnTQe8YvtXfdsON","model":"gpt-5-mini-2025-08-07","obfuscation":"5GNi7lj","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":","},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321626,"id":"chatcmpl-DuLYwZ1HseuIZItghoKIrUbk69X6t","model":"gpt-5-mini-2025-08-07","obfuscation":"wnCPdC","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":","},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338563,"id":"chatcmpl-DIeepvwHUPC8RnAnTQe8YvtXfdsON","model":"gpt-5-mini-2025-08-07","obfuscation":"5HWh89WutsKzRIW","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":" and"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321626,"id":"chatcmpl-DuLYwZ1HseuIZItghoKIrUbk69X6t","model":"gpt-5-mini-2025-08-07","obfuscation":"BvW","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":" the"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338563,"id":"chatcmpl-DIeepvwHUPC8RnAnTQe8YvtXfdsON","model":"gpt-5-mini-2025-08-07","obfuscation":"Rsv68YvmAnHw","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":" seek"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321626,"id":"chatcmpl-DuLYwZ1HseuIZItghoKIrUbk69X6t","model":"gpt-5-mini-2025-08-07","obfuscation":"GR","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":" next"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338563,"id":"chatcmpl-DIeepvwHUPC8RnAnTQe8YvtXfdsON","model":"gpt-5-mini-2025-08-07","obfuscation":"rFwjUvbmmwm","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":" air"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321626,"id":"chatcmpl-DuLYwZ1HseuIZItghoKIrUbk69X6t","model":"gpt-5-mini-2025-08-07","obfuscation":"irQ","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":" few"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338563,"id":"chatcmpl-DIeepvwHUPC8RnAnTQe8YvtXfdsON","model":"gpt-5-mini-2025-08-07","obfuscation":"jimSaMsxOq3c","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":" conditioning"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321626,"id":"chatcmpl-DuLYwZ1HseuIZItghoKIrUbk69X6t","model":"gpt-5-mini-2025-08-07","obfuscation":"phhFsFHfeP","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":" days"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338563,"id":"chatcmpl-DIeepvwHUPC8RnAnTQe8YvtXfdsON","model":"gpt-5-mini-2025-08-07","obfuscation":"hrPLTltgQR9","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":" or"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321626,"id":"chatcmpl-DuLYwZ1HseuIZItghoKIrUbk69X6t","model":"gpt-5-mini-2025-08-07","obfuscation":"gpxe","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":","},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338563,"id":"chatcmpl-DIeepvwHUPC8RnAnTQe8YvtXfdsON","model":"gpt-5-mini-2025-08-07","obfuscation":"tvhofxefaSRSN38","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":" shade"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321626,"id":"chatcmpl-DuLYwZ1HseuIZItghoKIrUbk69X6t","model":"gpt-5-mini-2025-08-07","obfuscation":"Q","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":" or"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338563,"id":"chatcmpl-DIeepvwHUPC8RnAnTQe8YvtXfdsON","model":"gpt-5-mini-2025-08-07","obfuscation":"hIhoDECV5m92f","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":"."},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321626,"id":"chatcmpl-DuLYwZ1HseuIZItghoKIrUbk69X6t","model":"gpt-5-mini-2025-08-07","obfuscation":"Y3zMlY","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":" heat"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338563,"id":"chatcmpl-DIeepvwHUPC8RnAnTQe8YvtXfdsON","model":"gpt-5-mini-2025-08-07","obfuscation":"T13o2E5W5YA","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":" Want"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321626,"id":"chatcmpl-DuLYwZ1HseuIZItghoKIrUbk69X6t","model":"gpt-5-mini-2025-08-07","obfuscation":"35","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":"-s"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338563,"id":"chatcmpl-DIeepvwHUPC8RnAnTQe8YvtXfdsON","model":"gpt-5-mini-2025-08-07","obfuscation":"ddpyVshiqOX73G","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":" an"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321626,"id":"chatcmpl-DuLYwZ1HseuIZItghoKIrUbk69X6t","model":"gpt-5-mini-2025-08-07","obfuscation":"5uwH","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":"afety"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338563,"id":"chatcmpl-DIeepvwHUPC8RnAnTQe8YvtXfdsON","model":"gpt-5-mini-2025-08-07","obfuscation":"ZVptHp7yM6S","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":" hourly"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321626,"id":"chatcmpl-DuLYwZ1HseuIZItghoKIrUbk69X6t","model":"gpt-5-mini-2025-08-07","obfuscation":"","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":" tips"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338563,"id":"chatcmpl-DIeepvwHUPC8RnAnTQe8YvtXfdsON","model":"gpt-5-mini-2025-08-07","obfuscation":"As8OS3Rb6DA","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":" forecast"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321626,"id":"chatcmpl-DuLYwZ1HseuIZItghoKIrUbk69X6t","model":"gpt-5-mini-2025-08-07","obfuscation":"0UfGA6kO27DVLc","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":"?"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338563,"id":"chatcmpl-DIeepvwHUPC8RnAnTQe8YvtXfdsON","model":"gpt-5-mini-2025-08-07","obfuscation":"dRoyHgiaMYSaAjU","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":" or"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321626,"id":"chatcmpl-DuLYwZ1HseuIZItghoKIrUbk69X6t","model":"gpt-5-mini-2025-08-07","obfuscation":"FeLl","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{},"finish_reason":"stop","index":0,"logprobs":null}],"created":1773338563,"id":"chatcmpl-DIeepvwHUPC8RnAnTQe8YvtXfdsON","model":"gpt-5-mini-2025-08-07","obfuscation":"8tG4B7dqpJ","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":" the"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321626,"id":"chatcmpl-DuLYwZ1HseuIZItghoKIrUbk69X6t","model":"gpt-5-mini-2025-08-07","obfuscation":"Zmr","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[],"created":1773338563,"id":"chatcmpl-DIeepvwHUPC8RnAnTQe8YvtXfdsON","model":"gpt-5-mini-2025-08-07","obfuscation":"AiLL4Gq8sn","object":"chat.completion.chunk","system_fingerprint":null,"usage":{"completion_tokens":187,"completion_tokens_details":{"accepted_prediction_tokens":0,"audio_tokens":0,"reasoning_tokens":128,"rejected_prediction_tokens":0},"prompt_tokens":176,"prompt_tokens_details":{"audio_tokens":0,"cached_tokens":0},"total_tokens":363}} + data: {"choices":[{"content_filter_results":{},"delta":{"content":" next"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321626,"id":"chatcmpl-DuLYwZ1HseuIZItghoKIrUbk69X6t","model":"gpt-5-mini-2025-08-07","obfuscation":"5j","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} + + data: {"choices":[{"content_filter_results":{},"delta":{"content":" few"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321626,"id":"chatcmpl-DuLYwZ1HseuIZItghoKIrUbk69X6t","model":"gpt-5-mini-2025-08-07","obfuscation":"Z0E","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} + + data: {"choices":[{"content_filter_results":{},"delta":{"content":" days"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321626,"id":"chatcmpl-DuLYwZ1HseuIZItghoKIrUbk69X6t","model":"gpt-5-mini-2025-08-07","obfuscation":"IQ","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} + + data: {"choices":[{"content_filter_results":{},"delta":{"content":"?"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321626,"id":"chatcmpl-DuLYwZ1HseuIZItghoKIrUbk69X6t","model":"gpt-5-mini-2025-08-07","obfuscation":"QHSGx8","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} + + data: {"choices":[{"content_filter_results":{},"delta":{},"finish_reason":"stop","index":0,"logprobs":null}],"created":1782321626,"id":"chatcmpl-DuLYwZ1HseuIZItghoKIrUbk69X6t","model":"gpt-5-mini-2025-08-07","obfuscation":"6","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} + + data: {"choices":[],"created":1782321626,"id":"chatcmpl-DuLYwZ1HseuIZItghoKIrUbk69X6t","latency_checkpoint":{"engine_tbt_ms":12,"engine_ttft_ms":33,"engine_ttlt_ms":2712,"pre_inference_ms":259,"service_tbt_ms":12,"service_ttft_ms":686,"service_ttlt_ms":3364,"total_duration_ms":3113,"user_visible_ttft_ms":428},"model":"gpt-5-mini-2025-08-07","obfuscation":"r","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":{"completion_tokens":192,"completion_tokens_details":{"accepted_prediction_tokens":0,"audio_tokens":0,"reasoning_tokens":128,"rejected_prediction_tokens":0},"prompt_tokens":176,"prompt_tokens_details":{"audio_tokens":0,"cached_tokens":0},"total_tokens":368}} data: [DONE] @@ -192,4 +202,4 @@ interactions: - text/event-stream; charset=utf-8 status: 200 OK code: 200 - duration: 2.131473625s + duration: 3.068785792s diff --git a/providertests/testdata/TestAzureCommon/azure-grok-3-mini/simple.yaml b/providertests/testdata/TestAzureCommon/azure-grok-3-mini/simple.yaml deleted file mode 100644 index 2655a9cb4..000000000 --- a/providertests/testdata/TestAzureCommon/azure-grok-3-mini/simple.yaml +++ /dev/null @@ -1,33 +0,0 @@ ---- -version: 2 -interactions: -- id: 0 - request: - proto: HTTP/1.1 - proto_major: 1 - proto_minor: 1 - content_length: 161 - host: "" - body: '{"messages":[{"content":"You are a helpful assistant","role":"system"},{"content":"Say hi in Portuguese","role":"user"}],"model":"grok-3-mini","max_tokens":4000}' - headers: - Accept: - - application/json - Content-Type: - - application/json - User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) - url: https://fantasy-playground-resource.openai.azure.com/openai/v1/chat/completions - method: POST - response: - proto: HTTP/2.0 - proto_major: 2 - proto_minor: 0 - content_length: -1 - uncompressed: true - body: "{\"choices\":[{\"content_filter_results\":{\"hate\":{\"filtered\":false,\"severity\":\"safe\"},\"protected_material_code\":{\"filtered\":false,\"detected\":false},\"protected_material_text\":{\"filtered\":false,\"detected\":false},\"self_harm\":{\"filtered\":false,\"severity\":\"safe\"},\"sexual\":{\"filtered\":false,\"severity\":\"safe\"},\"violence\":{\"filtered\":false,\"severity\":\"safe\"}},\"finish_reason\":\"stop\",\"index\":0,\"logprobs\":null,\"message\":{\"content\":\"Oi! That's \\\"hi\\\" in Portuguese. \U0001F60A\",\"reasoning_content\":\"First, the user asked me to \\\"Say hi in Portuguese.\\\" So, I need to respond in a helpful and friendly manner, as per my system prompt.\\n\\nThe translation of \\\"hi\\\" in Portuguese is \\\"oi\\\" or \\\"olá\\\". \\\"Oi\\\" is more informal, like \\\"hi\\\", and \\\"olá\\\" is more formal, like \\\"hello\\\". Since the user said \\\"hi\\\", which is casual, I should use \\\"oi\\\" to match the tone.\\n\\nTo be more engaging, I could say something like \\\"Hi in Portuguese is 'oi'!\\\" or just directly say \\\"Oi!\\\" But since the user said \\\"Say hi in Portuguese\\\", they might want me to greet them in Portuguese.\\n\\nRe-reading the query: \\\"Say hi in Portuguese.\\\" This could mean two things:\\n\\n1. Translate \\\"hi\\\" to Portuguese and tell them what it is.\\n\\n2. Greet them by saying \\\"hi\\\" in Portuguese.\\n\\nGiven that it's a direct command, I think the best response is to greet them in Portuguese. So, I could start with \\\"Oi!\\\" or \\\"Olá!\\\".\\n\\nTo be more helpful, I could combine both: greet them and then explain if needed. But I should keep it simple.\\n\\nMy response should be in English unless specified, but since they're asking to say something in Portuguese, I can include that.\\n\\nPossible responses:\\n\\n- \\\"Oi!\\\" (simple and direct)\\n\\n- \\\"Hi in Portuguese is 'oi'.\\\"\\n\\n- \\\"Olá! That's how you say hi in Portuguese.\\\"\\n\\nTo make it more conversational: \\\"Sure, in Portuguese, 'hi' is 'oi'! Oi!\\\"\\n\\nRemember, I'm an AI assistant, so I should be polite and engaging.\\n\\nFinalizing my response: I'll greet them in Portuguese and then confirm in English to ensure clarity.\\n\\nSo, something like: \\\"Oi! That means 'hi' in Portuguese.\\\"\\n\\nOr, to keep it concise: \\\"Oi!\\\"\\n\\nBut adding a bit more might be better for helpfulness.\",\"refusal\":null,\"role\":\"assistant\",\"tool_calls\":null},\"stop_reason\":null}],\"created\":1773338566,\"id\":\"98198c66-3ec6-46f9-92d3-bbc2dd8cfdca_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion\",\"prompt_filter_results\":[{\"prompt_index\":0,\"content_filter_results\":{\"hate\":{\"filtered\":false,\"severity\":\"safe\"},\"jailbreak\":{\"filtered\":false,\"detected\":false},\"self_harm\":{\"filtered\":false,\"severity\":\"safe\"},\"sexual\":{\"filtered\":false,\"severity\":\"safe\"},\"violence\":{\"filtered\":false,\"severity\":\"safe\"}}}],\"usage\":{\"audio_prompt_tokens\":0,\"completion_tokens\":11,\"completion_tokens_details\":{\"accepted_prediction_tokens\":0,\"audio_tokens\":0,\"reasoning_tokens\":396,\"rejected_prediction_tokens\":0},\"num_sources_used\":0,\"prompt_tokens\":20,\"prompt_tokens_details\":{\"audio_tokens\":0,\"cached_tokens\":0,\"image_tokens\":0,\"text_tokens\":20},\"total_tokens\":427}}\n" - headers: - Content-Type: - - application/json - status: 200 OK - code: 200 - duration: 2.597864042s diff --git a/providertests/testdata/TestAzureCommon/azure-grok-3-mini/simple_streaming.yaml b/providertests/testdata/TestAzureCommon/azure-grok-3-mini/simple_streaming.yaml deleted file mode 100644 index 6a0ee05e1..000000000 --- a/providertests/testdata/TestAzureCommon/azure-grok-3-mini/simple_streaming.yaml +++ /dev/null @@ -1,32 +0,0 @@ ---- -version: 2 -interactions: -- id: 0 - request: - proto: HTTP/1.1 - proto_major: 1 - proto_minor: 1 - content_length: 215 - host: "" - body: '{"messages":[{"content":"You are a helpful assistant","role":"system"},{"content":"Say hi in Portuguese","role":"user"}],"model":"grok-3-mini","max_tokens":4000,"stream_options":{"include_usage":true},"stream":true}' - headers: - Accept: - - application/json - Content-Type: - - application/json - User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) - url: https://fantasy-playground-resource.openai.azure.com/openai/v1/chat/completions - method: POST - response: - proto: HTTP/2.0 - proto_major: 2 - proto_minor: 0 - content_length: -1 - body: "data: {\"choices\":[],\"created\":0,\"id\":\"\",\"model\":\"\",\"object\":\"\",\"prompt_filter_results\":[{\"prompt_index\":0,\"content_filter_results\":{\"hate\":{\"filtered\":false,\"severity\":\"safe\"},\"jailbreak\":{\"filtered\":false,\"detected\":false},\"self_harm\":{\"filtered\":false,\"severity\":\"safe\"},\"sexual\":{\"filtered\":false,\"severity\":\"safe\"},\"violence\":{\"filtered\":false,\"severity\":\"safe\"}}}]}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\"First\",\"role\":\"assistant\"},\"index\":0}],\"created\":1773338568,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\",\"},\"index\":0}],\"created\":1773338568,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" the\"},\"index\":0}],\"created\":1773338568,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" user\"},\"index\":0}],\"created\":1773338568,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" asked\"},\"index\":0}],\"created\":1773338568,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" me\"},\"index\":0}],\"created\":1773338568,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" to\"},\"index\":0}],\"created\":1773338568,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" \\\"\"},\"index\":0}],\"created\":1773338568,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\"Say\"},\"index\":0}],\"created\":1773338568,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" hi\"},\"index\":0}],\"created\":1773338568,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" in\"},\"index\":0}],\"created\":1773338568,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" Portuguese\"},\"index\":0}],\"created\":1773338568,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\".\\\"\"},\"index\":0}],\"created\":1773338568,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" I\"},\"index\":0}],\"created\":1773338568,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" need\"},\"index\":0}],\"created\":1773338568,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" to\"},\"index\":0}],\"created\":1773338568,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" respond\"},\"index\":0}],\"created\":1773338568,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" in\"},\"index\":0}],\"created\":1773338568,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" a\"},\"index\":0}],\"created\":1773338568,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" helpful\"},\"index\":0}],\"created\":1773338568,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" and\"},\"index\":0}],\"created\":1773338568,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" accurate\"},\"index\":0}],\"created\":1773338568,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" way\"},\"index\":0}],\"created\":1773338568,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\".\\n\\n\"},\"index\":0}],\"created\":1773338568,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\"The\"},\"index\":0}],\"created\":1773338568,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" phrase\"},\"index\":0}],\"created\":1773338568,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" \\\"\"},\"index\":0}],\"created\":1773338568,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\"hi\"},\"index\":0}],\"created\":1773338568,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\"\\\"\"},\"index\":0}],\"created\":1773338568,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" in\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" English\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" is\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" a\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" casual\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" greeting\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\".\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" In\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" Portuguese\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\",\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" the\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" equivalent\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" casual\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" greeting\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" is\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" \\\"\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\"oi\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\"\\\"\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" or\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" \\\"\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\"ol\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\"á\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\"\\\".\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" \\\"\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\"Oi\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\"\\\"\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" is\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" more\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" informal\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\",\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" like\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" \\\"\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\"hi\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\"\\\",\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" while\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" \\\"\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\"ol\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\"á\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\"\\\"\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" is\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" a\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" bit\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" more\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" formal\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\",\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" like\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" \\\"\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\"hello\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\"\\\".\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" Since\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" the\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" user\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" said\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" \\\"\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\"hi\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\"\\\",\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" I\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" should\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" use\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" the\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" informal\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" version\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" to\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" match\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" the\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" tone\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\".\\n\\n\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\"I\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" should\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" confirm\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" the\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" language\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\":\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" Portuguese\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\".\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" There\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" are\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" two\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" main\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" variants\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\":\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" European\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" Portuguese\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" and\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" Brazilian\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" Portuguese\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\".\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" \\\"\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\"Oi\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\"\\\"\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" and\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" \\\"\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\"ol\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\"á\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\"\\\"\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" are\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" used\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" in\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" both\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\",\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" but\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" \\\"\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\"oi\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\"\\\"\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" is\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" very\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" common\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" in\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" Brazil\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\",\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" and\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" \\\"\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\"ol\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\"á\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\"\\\"\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" might\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" be\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" used\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" more\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" formally\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" in\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" Europe\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\".\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" Since\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" the\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" user\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" didn't\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" specify\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\",\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" I'll\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" go\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" with\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" a\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" general\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" response\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\".\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" Perhaps\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" I\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" can\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" use\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" \\\"\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\"oi\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\"\\\"\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" as\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" it's\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" widely\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" understood\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\".\\n\\n\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\"As\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" a\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" helpful\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" assistant\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\",\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" I\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" should\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" provide\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" the\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" translation\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" directly\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" and\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" maybe\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" add\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" a\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" bit\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" more\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" context\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" to\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" make\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" it\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" educational\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\".\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" For\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" example\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\",\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" I\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" could\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" say\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\",\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" \\\"\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\"Hi\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" in\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" Portuguese\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" is\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" '\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\"oi\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\"'\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\".\\\"\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" Or\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" to\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" make\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" it\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" more\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" engaging\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\",\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" \\\"\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\"Olá\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\"!\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" That's\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" '\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\"hi\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\"'\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" in\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" Portuguese\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\".\\\"\\n\\n\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\"The\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" user\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" said\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" \\\"\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\"Say\"},\"index\":0}],\"created\":1773338569,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" hi\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" in\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" Portuguese\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\",\\\"\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" which\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" is\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" an\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" imperative\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\",\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" so\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" they\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" might\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" want\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" me\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" to\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" greet\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" them\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" in\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" Portuguese\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\".\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" So\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\",\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" instead\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" of\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" just\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" stating\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" the\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" word\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\",\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" I\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" should\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" use\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" it\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" in\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" a\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" sentence\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\".\\n\\n\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\"Possible\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" responses\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\":\\n\\n\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\"-\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" Simply\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\":\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" \\\"\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\"Oi\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\"!\\\"\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" (\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\"which\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" means\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" \\\"\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\"Hi\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\"!\\\")\\n\\n\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\"-\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" Or\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\":\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" \\\"\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\"Hi\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\"!\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" In\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" Portuguese\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\",\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" it's\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" '\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\"oi\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\"'\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\".\\\"\\n\\n\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\"To\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" be\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" more\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" interactive\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\":\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" \\\"\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\"Olá\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\"!\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" I'm\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" saying\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" hi\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" in\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" Portuguese\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\".\\\"\\n\\n\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\"Since\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" my\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" system\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" prompt\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" is\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" to\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" be\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" a\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" helpful\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" assistant\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\",\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" I\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" should\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" ensure\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" the\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" response\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" is\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" clear\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" and\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" directly\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" addresses\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" the\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" query\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\".\\n\\n\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\"Finally\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\",\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" keep\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" it\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" concise\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" and\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" friendly\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\".\\n\\n\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\"Response\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" idea\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\":\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" Start\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" with\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" the\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" greeting\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" in\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" Portuguese\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" and\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" then\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" confirm\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" in\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\" English\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{\"reasoning_content\":\".\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{\"hate\":{\"filtered\":false,\"severity\":\"safe\"},\"self_harm\":{\"filtered\":false,\"severity\":\"safe\"},\"sexual\":{\"filtered\":false,\"severity\":\"safe\"},\"violence\":{\"filtered\":false,\"severity\":\"safe\"}},\"delta\":{\"content\":\"Oi\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{\"hate\":{\"filtered\":false,\"severity\":\"safe\"},\"self_harm\":{\"filtered\":false,\"severity\":\"safe\"},\"sexual\":{\"filtered\":false,\"severity\":\"safe\"},\"violence\":{\"filtered\":false,\"severity\":\"safe\"}},\"delta\":{\"content\":\"!\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{\"hate\":{\"filtered\":false,\"severity\":\"safe\"},\"self_harm\":{\"filtered\":false,\"severity\":\"safe\"},\"sexual\":{\"filtered\":false,\"severity\":\"safe\"},\"violence\":{\"filtered\":false,\"severity\":\"safe\"}},\"delta\":{\"content\":\" That's\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{\"hate\":{\"filtered\":false,\"severity\":\"safe\"},\"self_harm\":{\"filtered\":false,\"severity\":\"safe\"},\"sexual\":{\"filtered\":false,\"severity\":\"safe\"},\"violence\":{\"filtered\":false,\"severity\":\"safe\"}},\"delta\":{\"content\":\" \\\"\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{\"hate\":{\"filtered\":false,\"severity\":\"safe\"},\"self_harm\":{\"filtered\":false,\"severity\":\"safe\"},\"sexual\":{\"filtered\":false,\"severity\":\"safe\"},\"violence\":{\"filtered\":false,\"severity\":\"safe\"}},\"delta\":{\"content\":\"hi\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{\"hate\":{\"filtered\":false,\"severity\":\"safe\"},\"self_harm\":{\"filtered\":false,\"severity\":\"safe\"},\"sexual\":{\"filtered\":false,\"severity\":\"safe\"},\"violence\":{\"filtered\":false,\"severity\":\"safe\"}},\"delta\":{\"content\":\"\\\"\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{\"hate\":{\"filtered\":false,\"severity\":\"safe\"},\"self_harm\":{\"filtered\":false,\"severity\":\"safe\"},\"sexual\":{\"filtered\":false,\"severity\":\"safe\"},\"violence\":{\"filtered\":false,\"severity\":\"safe\"}},\"delta\":{\"content\":\" in\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{\"hate\":{\"filtered\":false,\"severity\":\"safe\"},\"self_harm\":{\"filtered\":false,\"severity\":\"safe\"},\"sexual\":{\"filtered\":false,\"severity\":\"safe\"},\"violence\":{\"filtered\":false,\"severity\":\"safe\"}},\"delta\":{\"content\":\" Portuguese\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{\"hate\":{\"filtered\":false,\"severity\":\"safe\"},\"self_harm\":{\"filtered\":false,\"severity\":\"safe\"},\"sexual\":{\"filtered\":false,\"severity\":\"safe\"},\"violence\":{\"filtered\":false,\"severity\":\"safe\"}},\"delta\":{\"content\":\".\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{\"hate\":{\"filtered\":false,\"severity\":\"safe\"},\"self_harm\":{\"filtered\":false,\"severity\":\"safe\"},\"sexual\":{\"filtered\":false,\"severity\":\"safe\"},\"violence\":{\"filtered\":false,\"severity\":\"safe\"}},\"delta\":{\"content\":\" \"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{\"hate\":{\"filtered\":false,\"severity\":\"safe\"},\"self_harm\":{\"filtered\":false,\"severity\":\"safe\"},\"sexual\":{\"filtered\":false,\"severity\":\"safe\"},\"violence\":{\"filtered\":false,\"severity\":\"safe\"}},\"delta\":{\"content\":\"\U0001F60A\"},\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[{\"content_filter_results\":{},\"delta\":{},\"finish_reason\":\"stop\",\"index\":0}],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\"}\n\ndata: {\"choices\":[],\"created\":1773338570,\"id\":\"aff67c9b-9a3a-4030-9b6c-696ac1afb1d5_sidecar\",\"model\":\"grok-3-mini-high\",\"object\":\"chat.completion.chunk\",\"system_fingerprint\":\"fp_d33f0040b9\",\"usage\":{\"completion_tokens\":11,\"completion_tokens_details\":{\"accepted_prediction_tokens\":0,\"audio_tokens\":0,\"reasoning_tokens\":365,\"rejected_prediction_tokens\":0},\"num_sources_used\":0,\"prompt_tokens\":20,\"prompt_tokens_details\":{\"audio_tokens\":0,\"cached_tokens\":0,\"image_tokens\":0,\"text_tokens\":20},\"total_tokens\":396}}\n\ndata: [DONE]\n\n" - headers: - Content-Type: - - text/event-stream - status: 200 OK - code: 200 - duration: 446.548583ms diff --git a/providertests/testdata/TestAzureCommon/azure-grok-3-mini/tool.yaml b/providertests/testdata/TestAzureCommon/azure-grok-3-mini/tool.yaml deleted file mode 100644 index 36f47dbad..000000000 --- a/providertests/testdata/TestAzureCommon/azure-grok-3-mini/tool.yaml +++ /dev/null @@ -1,65 +0,0 @@ ---- -version: 2 -interactions: -- id: 0 - request: - proto: HTTP/1.1 - proto_major: 1 - proto_minor: 1 - content_length: 453 - host: "" - body: '{"messages":[{"content":"You are a helpful assistant","role":"system"},{"content":"What''s the weather in Florence,Italy?","role":"user"}],"model":"grok-3-mini","max_tokens":4000,"tool_choice":"auto","tools":[{"function":{"name":"weather","strict":false,"description":"Get weather information for a location","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"}},"type":"function"}]}' - headers: - Accept: - - application/json - Content-Type: - - application/json - User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) - url: https://fantasy-playground-resource.openai.azure.com/openai/v1/chat/completions - method: POST - response: - proto: HTTP/2.0 - proto_major: 2 - proto_minor: 0 - content_length: -1 - uncompressed: true - body: | - {"choices":[{"content_filter_results":{},"finish_reason":"tool_calls","index":0,"logprobs":null,"message":{"content":"","reasoning_content":"First, the user is asking for the weather in Florence, Italy. I have an available function called \"weather\" that can get weather information for a location.\n\nThe function description is: \"Get weather information for a location\". The parameters require a \"location\" which is a string, described as \"the city\".\n\nThe user provided \"Florence, Italy\". This seems to specify both the city and the country, which should be fine since the parameter is just \"location\" and it's a string. I can use \"Florence, Italy\" as the location string.\n\nAll required parameters are provided: the location is given. No missing or unclear parts.\n\nI should call the function if it can address the query. Here, it directly matches, so I need to trigger a function call.\n\nThe function call format is: \u003cfunction_call\u003e{\"action\": \"function_name\", \"action_input\": {\"parameter\": \"argument\"}}\u003c/function_call\u003e\n\nFor this, the action is \"weather\", and the action_input should have \"location\" with the value \"Florence, Italy\".\n\nSo, the function call should be: \u003cfunction_call\u003e{\"action\": \"weather\", \"action_input\": {\"location\": \"Florence, Italy\"}}\u003c/function_call\u003e\n\nMy response should only contain this function call if I'm deciding to call a function. The instructions say: \"You are only permitted to use the \u003cfunction_call\u003e tag in your response only if you have made the decision to call a function.\" And in this case, I have.\n\nI shouldn't add any other text unless necessary, like if I need clarification, but here I don't.\n\nFinally, after calling the function, in a multi-turn conversation, I might need to handle the response, but for now, this is the first step to advance the request.","refusal":null,"role":"assistant","tool_calls":[{"function":{"arguments":"{\"location\":\"Florence, Italy\"}","call_id":null,"name":"weather"},"id":"call_88313407","type":"function"}]},"stop_reason":null}],"created":1773338570,"id":"0814c38b-a2e1-445c-8112-276b69d68a3a_sidecar","model":"grok-3-mini-high","object":"chat.completion","prompt_filter_results":[{"prompt_index":0,"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"jailbreak":{"filtered":false,"detected":false},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}}}],"usage":{"audio_prompt_tokens":0,"completion_tokens":27,"completion_tokens_details":{"accepted_prediction_tokens":0,"audio_tokens":0,"reasoning_tokens":356,"rejected_prediction_tokens":0},"num_sources_used":0,"prompt_tokens":288,"prompt_tokens_details":{"audio_tokens":0,"cached_tokens":0,"image_tokens":0,"text_tokens":288},"total_tokens":671}} - headers: - Content-Type: - - application/json - status: 200 OK - code: 200 - duration: 2.533727166s -- id: 1 - request: - proto: HTTP/1.1 - proto_major: 1 - proto_minor: 1 - content_length: 673 - host: "" - body: '{"messages":[{"content":"You are a helpful assistant","role":"system"},{"content":"What''s the weather in Florence,Italy?","role":"user"},{"tool_calls":[{"id":"call_88313407","function":{"arguments":"{\"location\":\"Florence, Italy\"}","name":"weather"},"type":"function"}],"role":"assistant"},{"content":"40 C","tool_call_id":"call_88313407","role":"tool"}],"model":"grok-3-mini","max_tokens":4000,"tool_choice":"auto","tools":[{"function":{"name":"weather","strict":false,"description":"Get weather information for a location","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"}},"type":"function"}]}' - headers: - Accept: - - application/json - Content-Type: - - application/json - User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) - url: https://fantasy-playground-resource.openai.azure.com/openai/v1/chat/completions - method: POST - response: - proto: HTTP/2.0 - proto_major: 2 - proto_minor: 0 - content_length: -1 - uncompressed: true - body: | - {"choices":[{"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"protected_material_code":{"filtered":false,"detected":false},"protected_material_text":{"filtered":false,"detected":false},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}},"finish_reason":"stop","index":0,"logprobs":null,"message":{"content":"The weather in Florence, Italy is 40°C.","reasoning_content":"First, the user asked about the weather in Florence, Italy. I have an available function called \"weather\" that can retrieve weather information for a location.\n\nThe function requires a \"location\" parameter, which is a string. The user provided \"Florence, Italy\", which clearly specifies the city and country, so all required parameters are present and inferable.\n\nI should call the function if it can advance the user's request. In this case, calling the \"weather\" function directly addresses the query.\n\nThe response format specifies that I should use \u003cfunction_call\u003e tags with JSON if I'm calling a function. I did that in my initial response.\n\nNow, in this simulation, after I call the function, there's a response: \"Function: 40 C\". This seems to be the result from the function call.\n\nAs the assistant, I need to handle the conversation. Since the function call was made, and now I have the result, I should provide a clear, non-verbose response to the user with the information.\n\nThe system prompt says: \"Keep your response to user clear; please do not make your response verbose!\" So, I should directly answer the user with the weather information.\n\nThis is a multi-turn conversation. I called the function in the first response, and now I have the result. I need to continue by providing the result to the user.\n\nMy response should not include another function call unless more is needed, but here the request is fulfilled with the weather data.\n\nFinal response should be clear: e.g., \"The weather in Florence, Italy is 40°C.\"\n\nThe function response is \"40 C\", which I assume means 40 degrees Celsius. I should present it nicely.\n\nI shouldn't add extra verbosity, so keep it straightforward.","refusal":null,"role":"assistant","tool_calls":null},"stop_reason":null}],"created":1773338573,"id":"de80fb5e-e706-4433-b3da-a978c83ddae2_sidecar","model":"grok-3-mini-high","object":"chat.completion","prompt_filter_results":[{"prompt_index":0,"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"jailbreak":{"filtered":false,"detected":false},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}}}],"usage":{"audio_prompt_tokens":0,"completion_tokens":11,"completion_tokens_details":{"accepted_prediction_tokens":0,"audio_tokens":0,"reasoning_tokens":352,"rejected_prediction_tokens":0},"num_sources_used":0,"prompt_tokens":332,"prompt_tokens_details":{"audio_tokens":0,"cached_tokens":0,"image_tokens":0,"text_tokens":332},"total_tokens":695}} - headers: - Content-Type: - - application/json - status: 200 OK - code: 200 - duration: 2.235902458s diff --git a/providertests/testdata/TestAzureCommon/azure-grok-3-mini/tool_streaming.yaml b/providertests/testdata/TestAzureCommon/azure-grok-3-mini/tool_streaming.yaml deleted file mode 100644 index 0c04d77e2..000000000 --- a/providertests/testdata/TestAzureCommon/azure-grok-3-mini/tool_streaming.yaml +++ /dev/null @@ -1,1581 +0,0 @@ ---- -version: 2 -interactions: -- id: 0 - request: - proto: HTTP/1.1 - proto_major: 1 - proto_minor: 1 - content_length: 507 - host: "" - body: '{"messages":[{"content":"You are a helpful assistant","role":"system"},{"content":"What''s the weather in Florence,Italy?","role":"user"}],"model":"grok-3-mini","max_tokens":4000,"stream_options":{"include_usage":true},"tool_choice":"auto","tools":[{"function":{"name":"weather","strict":false,"description":"Get weather information for a location","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"}},"type":"function"}],"stream":true}' - headers: - Accept: - - application/json - Content-Type: - - application/json - User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) - url: https://fantasy-playground-resource.openai.azure.com/openai/v1/chat/completions - method: POST - response: - proto: HTTP/2.0 - proto_major: 2 - proto_minor: 0 - content_length: -1 - body: |+ - data: {"choices":[],"created":0,"id":"","model":"","object":"","prompt_filter_results":[{"prompt_index":0,"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"jailbreak":{"filtered":false,"detected":false},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}}}]} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"First","role":"assistant"},"index":0}],"created":1773338575,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":","},"index":0}],"created":1773338575,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" the"},"index":0}],"created":1773338575,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" user"},"index":0}],"created":1773338575,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" is"},"index":0}],"created":1773338575,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" asking"},"index":0}],"created":1773338575,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" about"},"index":0}],"created":1773338575,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" the"},"index":0}],"created":1773338575,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" weather"},"index":0}],"created":1773338575,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" in"},"index":0}],"created":1773338575,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" Florence"},"index":0}],"created":1773338575,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":","},"index":0}],"created":1773338575,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" Italy"},"index":0}],"created":1773338575,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"."},"index":0}],"created":1773338575,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" I"},"index":0}],"created":1773338575,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" have"},"index":0}],"created":1773338575,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" an"},"index":0}],"created":1773338575,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" available"},"index":0}],"created":1773338575,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" function"},"index":0}],"created":1773338575,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" called"},"index":0}],"created":1773338575,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" \""},"index":0}],"created":1773338575,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"weather"},"index":0}],"created":1773338575,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"\""},"index":0}],"created":1773338575,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" that"},"index":0}],"created":1773338575,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" can"},"index":0}],"created":1773338575,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" get"},"index":0}],"created":1773338575,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" weather"},"index":0}],"created":1773338575,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" information"},"index":0}],"created":1773338575,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" for"},"index":0}],"created":1773338575,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" a"},"index":0}],"created":1773338575,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" location"},"index":0}],"created":1773338575,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"."},"index":0}],"created":1773338575,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" The"},"index":0}],"created":1773338575,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" function"},"index":0}],"created":1773338575,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" requires"},"index":0}],"created":1773338575,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" a"},"index":0}],"created":1773338575,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" \""},"index":0}],"created":1773338575,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"location"},"index":0}],"created":1773338575,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"\""},"index":0}],"created":1773338575,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" parameter"},"index":0}],"created":1773338575,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":","},"index":0}],"created":1773338575,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" which"},"index":0}],"created":1773338575,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" is"},"index":0}],"created":1773338575,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" described"},"index":0}],"created":1773338575,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" as"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" \""},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"the"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" city"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"\".\n\n"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"The"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" user's"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" query"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" specifies"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" \""},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"Florence"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":","},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" Italy"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"\"."},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" This"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" provides"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" both"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" the"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" city"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" and"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" the"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" country"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":","},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" which"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" should"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" be"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" sufficient"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" to"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" identify"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" the"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" location"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"."},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" The"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" function"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" parameter"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" is"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" just"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" \""},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"location"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"\""},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" and"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" it's"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" a"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" string"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":","},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" so"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" I"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" can"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" pass"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" \""},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"Florence"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":","},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" Italy"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"\""},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" as"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" the"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" location"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" to"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" make"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" it"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" clear"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":".\n\n"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"All"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" required"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" parameters"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" are"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" provided"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":":"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" the"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" location"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" is"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" given"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"."},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" So"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":","},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" I"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" should"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" call"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" the"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" weather"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" function"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":".\n\n"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"I"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" need"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" to"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" call"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" the"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" function"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" in"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" the"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" specified"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" JSON"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" format"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" within"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" \u003c"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"function"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"_call"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"\u003e"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" tags"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"."},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" The"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" format"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" should"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" be"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":":"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" \u003c"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"function"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"_call"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"\u003e{\""},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"action"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"\":"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" \""},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"function"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"_name"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"\","},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" \""},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"action"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"_input"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"\":"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" {\""},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"parameter"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"\":"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" \""},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"argument"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"\""},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"}}\u003c/"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"function"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"_call"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"\u003e\n\n"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"For"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" this"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" case"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":","},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" action"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" is"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" \""},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"weather"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"\","},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" and"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" action"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"_input"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" should"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" have"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" \""},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"location"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"\""},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" with"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" the"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" value"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" \""},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"Florence"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":","},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" Italy"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"\".\n\n"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"After"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" calling"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" the"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" function"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":","},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" I"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" shouldn't"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" provide"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" any"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" additional"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" response"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" unless"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" needed"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":","},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" but"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" since"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" this"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" is"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" a"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" function"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" call"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":","},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" the"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" system"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" will"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" handle"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" the"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" response"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"."},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" My"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" response"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" should"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" only"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" contain"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" the"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" function"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" call"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" if"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" I'm"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" deciding"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" to"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" call"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" it"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":".\n\n"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"The"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" instructions"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" say"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":":"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" \""},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"Keep"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" your"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" response"},"index":0}],"created":1773338576,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" to"},"index":0}],"created":1773338577,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" user"},"index":0}],"created":1773338577,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" clear"},"index":0}],"created":1773338577,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":";"},"index":0}],"created":1773338577,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" please"},"index":0}],"created":1773338577,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" do"},"index":0}],"created":1773338577,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" not"},"index":0}],"created":1773338577,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" make"},"index":0}],"created":1773338577,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" your"},"index":0}],"created":1773338577,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" response"},"index":0}],"created":1773338577,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" verbose"},"index":0}],"created":1773338577,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"!\""},"index":0}],"created":1773338577,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" So"},"index":0}],"created":1773338577,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":","},"index":0}],"created":1773338577,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" I"},"index":0}],"created":1773338577,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" should"},"index":0}],"created":1773338577,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" not"},"index":0}],"created":1773338577,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" add"},"index":0}],"created":1773338577,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" extra"},"index":0}],"created":1773338577,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" text"},"index":0}],"created":1773338577,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":";"},"index":0}],"created":1773338577,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" just"},"index":0}],"created":1773338577,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" the"},"index":0}],"created":1773338577,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" function"},"index":0}],"created":1773338577,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" call"},"index":0}],"created":1773338577,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":".\n\n"},"index":0}],"created":1773338577,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"This"},"index":0}],"created":1773338577,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" seems"},"index":0}],"created":1773338577,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" like"},"index":0}],"created":1773338577,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" a"},"index":0}],"created":1773338577,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" direct"},"index":0}],"created":1773338577,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" match"},"index":0}],"created":1773338577,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":","},"index":0}],"created":1773338577,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" so"},"index":0}],"created":1773338577,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" no"},"index":0}],"created":1773338577,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" need"},"index":0}],"created":1773338577,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" to"},"index":0}],"created":1773338577,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" ask"},"index":0}],"created":1773338577,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" for"},"index":0}],"created":1773338577,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" clarification"},"index":0}],"created":1773338577,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":".\n\n"},"index":0}],"created":1773338577,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"Final"},"index":0}],"created":1773338577,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" decision"},"index":0}],"created":1773338577,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":":"},"index":0}],"created":1773338577,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" Call"},"index":0}],"created":1773338577,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" the"},"index":0}],"created":1773338577,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" weather"},"index":0}],"created":1773338577,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" function"},"index":0}],"created":1773338577,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" with"},"index":0}],"created":1773338577,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" location"},"index":0}],"created":1773338577,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" \""},"index":0}],"created":1773338577,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"Florence"},"index":0}],"created":1773338577,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":","},"index":0}],"created":1773338577,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" Italy"},"index":0}],"created":1773338577,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"\"."},"index":0}],"created":1773338577,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"tool_calls":[{"function":{"arguments":"{\"location\":\"Florence, Italy\"}","name":"weather"},"id":"call_25530119","index":0,"type":"function"}]},"index":0}],"created":1773338577,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{},"finish_reason":"tool_calls","index":0}],"created":1773338577,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[],"created":1773338577,"id":"bcedd212-f2c9-4775-9386-418aa49f4445_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9","usage":{"completion_tokens":27,"completion_tokens_details":{"accepted_prediction_tokens":0,"audio_tokens":0,"reasoning_tokens":305,"rejected_prediction_tokens":0},"num_sources_used":0,"prompt_tokens":288,"prompt_tokens_details":{"audio_tokens":0,"cached_tokens":0,"image_tokens":0,"text_tokens":288},"total_tokens":620}} - - data: [DONE] - - headers: - Content-Type: - - text/event-stream - status: 200 OK - code: 200 - duration: 424.850541ms -- id: 1 - request: - proto: HTTP/1.1 - proto_major: 1 - proto_minor: 1 - content_length: 727 - host: "" - body: '{"messages":[{"content":"You are a helpful assistant","role":"system"},{"content":"What''s the weather in Florence,Italy?","role":"user"},{"tool_calls":[{"id":"call_25530119","function":{"arguments":"{\"location\":\"Florence, Italy\"}","name":"weather"},"type":"function"}],"role":"assistant"},{"content":"40 C","tool_call_id":"call_25530119","role":"tool"}],"model":"grok-3-mini","max_tokens":4000,"stream_options":{"include_usage":true},"tool_choice":"auto","tools":[{"function":{"name":"weather","strict":false,"description":"Get weather information for a location","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"}},"type":"function"}],"stream":true}' - headers: - Accept: - - application/json - Content-Type: - - application/json - User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) - url: https://fantasy-playground-resource.openai.azure.com/openai/v1/chat/completions - method: POST - response: - proto: HTTP/2.0 - proto_major: 2 - proto_minor: 0 - content_length: -1 - body: |+ - data: {"choices":[],"created":0,"id":"","model":"","object":"","prompt_filter_results":[{"prompt_index":0,"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"jailbreak":{"filtered":false,"detected":false},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}}}]} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"First","role":"assistant"},"index":0}],"created":1773338579,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":","},"index":0}],"created":1773338579,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" the"},"index":0}],"created":1773338579,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" user"},"index":0}],"created":1773338579,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" asked"},"index":0}],"created":1773338579,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" about"},"index":0}],"created":1773338579,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" the"},"index":0}],"created":1773338579,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" weather"},"index":0}],"created":1773338579,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" in"},"index":0}],"created":1773338579,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" Florence"},"index":0}],"created":1773338579,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":","},"index":0}],"created":1773338579,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" Italy"},"index":0}],"created":1773338579,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"."},"index":0}],"created":1773338579,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" I"},"index":0}],"created":1773338579,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" have"},"index":0}],"created":1773338579,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" an"},"index":0}],"created":1773338579,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" available"},"index":0}],"created":1773338579,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" function"},"index":0}],"created":1773338579,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" called"},"index":0}],"created":1773338579,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" \""},"index":0}],"created":1773338579,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"weather"},"index":0}],"created":1773338579,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"\""},"index":0}],"created":1773338579,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" that"},"index":0}],"created":1773338579,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" can"},"index":0}],"created":1773338579,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" get"},"index":0}],"created":1773338579,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" weather"},"index":0}],"created":1773338579,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" information"},"index":0}],"created":1773338579,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" for"},"index":0}],"created":1773338579,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" a"},"index":0}],"created":1773338579,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" location"},"index":0}],"created":1773338579,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":".\n\n"},"index":0}],"created":1773338579,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"The"},"index":0}],"created":1773338579,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" function"},"index":0}],"created":1773338579,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" requires"},"index":0}],"created":1773338579,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" a"},"index":0}],"created":1773338579,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" \""},"index":0}],"created":1773338579,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"location"},"index":0}],"created":1773338579,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"\""},"index":0}],"created":1773338579,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" parameter"},"index":0}],"created":1773338579,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":","},"index":0}],"created":1773338579,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" which"},"index":0}],"created":1773338579,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" is"},"index":0}],"created":1773338579,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" a"},"index":0}],"created":1773338579,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" string"},"index":0}],"created":1773338579,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"."},"index":0}],"created":1773338579,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" The"},"index":0}],"created":1773338579,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" user"},"index":0}],"created":1773338579,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" provided"},"index":0}],"created":1773338579,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" \""},"index":0}],"created":1773338579,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"Florence"},"index":0}],"created":1773338579,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":","},"index":0}],"created":1773338579,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" Italy"},"index":0}],"created":1773338579,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"\","},"index":0}],"created":1773338579,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" which"},"index":0}],"created":1773338579,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" clearly"},"index":0}],"created":1773338579,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" specifies"},"index":0}],"created":1773338579,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" the"},"index":0}],"created":1773338579,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" city"},"index":0}],"created":1773338579,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" and"},"index":0}],"created":1773338579,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" country"},"index":0}],"created":1773338579,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":","},"index":0}],"created":1773338579,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" so"},"index":0}],"created":1773338579,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" all"},"index":0}],"created":1773338579,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" required"},"index":0}],"created":1773338579,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" parameters"},"index":0}],"created":1773338579,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" are"},"index":0}],"created":1773338579,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" present"},"index":0}],"created":1773338579,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" and"},"index":0}],"created":1773338579,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" infer"},"index":0}],"created":1773338579,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"able"},"index":0}],"created":1773338579,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":".\n\n"},"index":0}],"created":1773338579,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"According"},"index":0}],"created":1773338579,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" to"},"index":0}],"created":1773338579,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" the"},"index":0}],"created":1773338579,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" instructions"},"index":0}],"created":1773338579,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":","},"index":0}],"created":1773338579,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" if"},"index":0}],"created":1773338579,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" the"},"index":0}],"created":1773338579,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" user's"},"index":0}],"created":1773338579,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" query"},"index":0}],"created":1773338579,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" can"},"index":0}],"created":1773338579,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" be"},"index":0}],"created":1773338579,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" addressed"},"index":0}],"created":1773338579,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" using"},"index":0}],"created":1773338579,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" an"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" available"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" function"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" and"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" all"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" required"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" parameters"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" are"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" provided"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":","},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" I"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" should"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" trigger"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" a"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" function"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" call"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" in"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" the"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" specified"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" JSON"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" format"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" within"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" \u003c"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"function"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"_call"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"\u003e"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" tags"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":".\n\n"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"I"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" already"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" made"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" a"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" function"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" call"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" in"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" my"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" initial"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" response"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":":"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" \u003c"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"function"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"_call"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"\u003e{\""},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"action"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"\":"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" \""},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"weather"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"\","},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" \""},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"action"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"_input"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"\":"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" {\""},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"location"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"\":"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" \""},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"Florence"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":","},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" Italy"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"\""},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"}}\u003c/"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"function"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"_call"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"\u003e\n\n"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"Now"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":","},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" in"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" this"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" response"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":","},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" I'm"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" seeing"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" a"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" \""},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"Function"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":":"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" "},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"40"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" C"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"\""},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" which"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" seems"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" to"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" be"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" the"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" result"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" of"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" that"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" function"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" call"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"."},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" This"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" is"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" likely"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" simulated"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" or"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" provided"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" in"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" the"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" conversation"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" history"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":".\n\n"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"My"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" role"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" is"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" to"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" respond"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" help"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"fully"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"."},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" After"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" a"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" function"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" call"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":","},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" I"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" should"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" use"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" the"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" result"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" to"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" answer"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" the"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" user"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"."},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" The"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" instructions"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" say"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":":"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" \""},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"continue"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" calling"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" relevant"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" functions"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" to"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" advance"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" the"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" user's"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" request"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" until"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" either"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" the"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" user's"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" request"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" is"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" fully"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" fulfilled"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" or"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" you"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" need"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" more"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" information"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":".\"\n\n"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"In"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" this"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" case"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":","},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" the"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" function"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" call"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" has"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" been"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" made"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":","},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" and"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" I"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" have"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" the"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" result"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" \""},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"40"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" C"},"index":0}],"created":1773338580,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"\"."},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" This"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" probably"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" means"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" the"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" temperature"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" is"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" "},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"40"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" degrees"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" Celsius"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"."},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" Since"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" the"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" user's"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" request"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" was"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" for"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" weather"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" information"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":","},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" and"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" I"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" now"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" have"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" this"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" data"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":","},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" I"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" can"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" provide"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" it"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" directly"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" to"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" the"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" user"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":".\n\n"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"I"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" don't"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" need"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" to"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" call"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" another"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" function"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" because"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" the"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" request"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" seems"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" fulfilled"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" with"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" this"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" information"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"."},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" The"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" function"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" \""},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"weather"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"\""},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" was"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" called"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":","},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" and"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" it"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" returned"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" a"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" simple"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" response"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":","},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" so"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" I"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" should"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" format"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" a"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" clear"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":","},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" non"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"-"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"verbose"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" response"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" to"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" the"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" user"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":".\n\n"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"Final"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" response"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" should"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" be"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" helpful"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" and"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" directly"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" answer"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" the"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" query"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"."},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" So"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":","},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" I"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" can"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" say"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" something"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" like"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":":"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" \""},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"The"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" weather"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" in"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" Florence"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":","},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" Italy"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" is"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" "},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"40"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" degrees"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" Celsius"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":".\"\n\n"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"The"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" function"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" response"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" is"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" just"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" \""},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"40"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" C"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"\","},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" which"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" might"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" be"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" incomplete"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" ("},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"e"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":".g"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":".,"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" no"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" description"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" of"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" conditions"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"),"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" but"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" based"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" on"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" what's"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" given"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":","},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" I"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" should"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" use"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" this"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" information"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":".\n\n"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"Ensure"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" the"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" response"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" is"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" not"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" verbose"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":":"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" keep"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" it"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" clear"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" and"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" concise"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":".\n\n"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"So"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":","},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" my"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" response"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" should"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" be"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":":"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" A"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" direct"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" answer"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" using"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" the"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" function"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"'s"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" output"},"index":0}],"created":1773338581,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"."},"index":0}],"created":1773338582,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}},"delta":{"content":"The"},"index":0}],"created":1773338582,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}},"delta":{"content":" weather"},"index":0}],"created":1773338582,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}},"delta":{"content":" in"},"index":0}],"created":1773338582,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}},"delta":{"content":" Florence"},"index":0}],"created":1773338582,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}},"delta":{"content":","},"index":0}],"created":1773338582,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}},"delta":{"content":" Italy"},"index":0}],"created":1773338582,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}},"delta":{"content":" is"},"index":0}],"created":1773338582,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}},"delta":{"content":" currently"},"index":0}],"created":1773338582,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}},"delta":{"content":" "},"index":0}],"created":1773338582,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}},"delta":{"content":"40"},"index":0}],"created":1773338582,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}},"delta":{"content":"°C"},"index":0}],"created":1773338582,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}},"delta":{"content":"."},"index":0}],"created":1773338582,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{},"finish_reason":"stop","index":0}],"created":1773338582,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[],"created":1773338582,"id":"93b493ad-7d36-4444-a4c5-a50805fb5ebe_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9","usage":{"completion_tokens":12,"completion_tokens_details":{"accepted_prediction_tokens":0,"audio_tokens":0,"reasoning_tokens":434,"rejected_prediction_tokens":0},"num_sources_used":0,"prompt_tokens":332,"prompt_tokens_details":{"audio_tokens":0,"cached_tokens":0,"image_tokens":0,"text_tokens":332},"total_tokens":778}} - - data: [DONE] - - headers: - Content-Type: - - text/event-stream - status: 200 OK - code: 200 - duration: 301.040708ms diff --git a/providertests/testdata/TestAzureCommon/azure-o4-mini/simple.yaml b/providertests/testdata/TestAzureCommon/azure-o4-mini/simple.yaml index 3c3d25bf8..afb73b35f 100644 --- a/providertests/testdata/TestAzureCommon/azure-o4-mini/simple.yaml +++ b/providertests/testdata/TestAzureCommon/azure-o4-mini/simple.yaml @@ -15,19 +15,19 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://fantasy-playground-resource.openai.azure.com/openai/v1/chat/completions method: POST response: proto: HTTP/2.0 proto_major: 2 proto_minor: 0 - content_length: 1203 + content_length: 1449 body: | - {"choices":[{"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"protected_material_code":{"filtered":false,"detected":false},"protected_material_text":{"filtered":false,"detected":false},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}},"finish_reason":"stop","index":0,"logprobs":null,"message":{"annotations":[],"content":"Oi!","refusal":null,"role":"assistant"}}],"created":1773338539,"id":"chatcmpl-DIeeRVJFpvxQKwMQA6YkG9ItFCDQC","model":"o4-mini-2025-04-16","object":"chat.completion","prompt_filter_results":[{"prompt_index":0,"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"jailbreak":{"filtered":false,"detected":false},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}}}],"system_fingerprint":null,"usage":{"completion_tokens":213,"completion_tokens_details":{"accepted_prediction_tokens":0,"audio_tokens":0,"reasoning_tokens":192,"rejected_prediction_tokens":0},"prompt_tokens":19,"prompt_tokens_details":{"audio_tokens":0,"cached_tokens":0},"total_tokens":232}} + {"choices":[{"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"protected_material_code":{"detected":false,"filtered":false},"protected_material_text":{"detected":false,"filtered":false},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}},"finish_reason":"stop","index":0,"logprobs":null,"message":{"annotations":[],"content":"Olá!","refusal":null,"role":"assistant"}}],"created":1782321589,"id":"chatcmpl-DuLYL9NqtyU4FOZkK2sHhVE5ZamlF","model":"o4-mini-2025-04-16","object":"chat.completion","prompt_filter_results":[{"prompt_index":0,"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"jailbreak":{"detected":false,"filtered":false},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}}}],"service_tier":"default","system_fingerprint":null,"usage":{"completion_tokens":85,"completion_tokens_details":{"accepted_prediction_tokens":0,"audio_tokens":0,"reasoning_tokens":64,"rejected_prediction_tokens":0},"latency_checkpoint":{"engine_tbt_ms":7,"engine_ttft_ms":31,"engine_ttlt_ms":853,"pre_inference_ms":238,"service_tbt_ms":7,"service_ttft_ms":776,"service_ttlt_ms":1584,"total_duration_ms":1355,"user_visible_ttft_ms":538},"prompt_tokens":19,"prompt_tokens_details":{"audio_tokens":0,"cached_tokens":0},"total_tokens":104}} headers: Content-Type: - application/json status: 200 OK code: 200 - duration: 2.688390208s + duration: 2.433662084s diff --git a/providertests/testdata/TestAzureCommon/azure-o4-mini/simple_streaming.yaml b/providertests/testdata/TestAzureCommon/azure-o4-mini/simple_streaming.yaml index 2c1e9f2e8..7559413c9 100644 --- a/providertests/testdata/TestAzureCommon/azure-o4-mini/simple_streaming.yaml +++ b/providertests/testdata/TestAzureCommon/azure-o4-mini/simple_streaming.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://fantasy-playground-resource.openai.azure.com/openai/v1/chat/completions method: POST response: @@ -24,17 +24,17 @@ interactions: proto_minor: 0 content_length: -1 body: |+ - data: {"choices":[],"created":0,"id":"","model":"","object":"","prompt_filter_results":[{"prompt_index":0,"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"jailbreak":{"filtered":false,"detected":false},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}}}]} + data: {"choices":[],"created":0,"id":"","model":"","object":"","prompt_filter_results":[{"prompt_index":0,"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"jailbreak":{"detected":false,"filtered":false},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}}}]} - data: {"choices":[{"content_filter_results":{},"delta":{"content":"","refusal":null,"role":"assistant"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338541,"id":"chatcmpl-DIeeTmPomcxhV2SV0x5hDm9Hh2ndB","model":"o4-mini-2025-04-16","obfuscation":"1","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":"","refusal":null,"role":"assistant"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321591,"id":"chatcmpl-DuLYNq9zQCWkfZBDEt4z6GynL1HVU","model":"o4-mini-2025-04-16","obfuscation":"vhvkxFOo","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}},"delta":{"content":"Oi"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338541,"id":"chatcmpl-DIeeTmPomcxhV2SV0x5hDm9Hh2ndB","model":"o4-mini-2025-04-16","obfuscation":"p","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":"Oi"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321591,"id":"chatcmpl-DuLYNq9zQCWkfZBDEt4z6GynL1HVU","model":"o4-mini-2025-04-16","obfuscation":"q1ghfWRQ","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}},"delta":{"content":"!"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338541,"id":"chatcmpl-DIeeTmPomcxhV2SV0x5hDm9Hh2ndB","model":"o4-mini-2025-04-16","obfuscation":"35","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":"!"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321591,"id":"chatcmpl-DuLYNq9zQCWkfZBDEt4z6GynL1HVU","model":"o4-mini-2025-04-16","obfuscation":"pk3SK2jdZ","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{},"finish_reason":"stop","index":0,"logprobs":null}],"created":1773338541,"id":"chatcmpl-DIeeTmPomcxhV2SV0x5hDm9Hh2ndB","model":"o4-mini-2025-04-16","obfuscation":"FwcDNyPYzGB5E","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{},"finish_reason":"stop","index":0,"logprobs":null}],"created":1782321591,"id":"chatcmpl-DuLYNq9zQCWkfZBDEt4z6GynL1HVU","model":"o4-mini-2025-04-16","obfuscation":"MXif","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[],"created":1773338541,"id":"chatcmpl-DIeeTmPomcxhV2SV0x5hDm9Hh2ndB","model":"o4-mini-2025-04-16","obfuscation":"Sg5cKxcc8KwwQ9","object":"chat.completion.chunk","system_fingerprint":null,"usage":{"completion_tokens":149,"completion_tokens_details":{"accepted_prediction_tokens":0,"audio_tokens":0,"reasoning_tokens":128,"rejected_prediction_tokens":0},"prompt_tokens":19,"prompt_tokens_details":{"audio_tokens":0,"cached_tokens":0},"total_tokens":168}} + data: {"choices":[],"created":1782321591,"id":"chatcmpl-DuLYNq9zQCWkfZBDEt4z6GynL1HVU","latency_checkpoint":{"engine_tbt_ms":40,"engine_ttft_ms":30,"engine_ttlt_ms":7227,"pre_inference_ms":128,"service_tbt_ms":40,"service_ttft_ms":690,"service_ttlt_ms":7913,"total_duration_ms":7841,"user_visible_ttft_ms":562},"model":"o4-mini-2025-04-16","obfuscation":"Iasv2","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":{"completion_tokens":149,"completion_tokens_details":{"accepted_prediction_tokens":0,"audio_tokens":0,"reasoning_tokens":128,"rejected_prediction_tokens":0},"prompt_tokens":19,"prompt_tokens_details":{"audio_tokens":0,"cached_tokens":0},"total_tokens":168}} data: [DONE] @@ -43,4 +43,4 @@ interactions: - text/event-stream; charset=utf-8 status: 200 OK code: 200 - duration: 1.750472792s + duration: 7.798665417s diff --git a/providertests/testdata/TestAzureCommon/azure-o4-mini/tool.yaml b/providertests/testdata/TestAzureCommon/azure-o4-mini/tool.yaml index 673e6d0c1..ac59332a8 100644 --- a/providertests/testdata/TestAzureCommon/azure-o4-mini/tool.yaml +++ b/providertests/testdata/TestAzureCommon/azure-o4-mini/tool.yaml @@ -15,22 +15,22 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://fantasy-playground-resource.openai.azure.com/openai/v1/chat/completions method: POST response: proto: HTTP/2.0 proto_major: 2 proto_minor: 0 - content_length: 1047 + content_length: 1300 body: | - {"choices":[{"content_filter_results":{},"finish_reason":"tool_calls","index":0,"logprobs":null,"message":{"annotations":[],"content":null,"refusal":null,"role":"assistant","tool_calls":[{"function":{"arguments":"{\"location\":\"Florence, Italy\"}","name":"weather"},"id":"call_PS2XApMMnhtJH39VU3brisjo","type":"function"}]}}],"created":1773338543,"id":"chatcmpl-DIeeV6G509dNNT3vm5vehkTC3FkQH","model":"o4-mini-2025-04-16","object":"chat.completion","prompt_filter_results":[{"prompt_index":0,"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"jailbreak":{"filtered":false,"detected":false},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}}}],"system_fingerprint":null,"usage":{"completion_tokens":87,"completion_tokens_details":{"accepted_prediction_tokens":0,"audio_tokens":0,"reasoning_tokens":64,"rejected_prediction_tokens":0},"prompt_tokens":64,"prompt_tokens_details":{"audio_tokens":0,"cached_tokens":0},"total_tokens":151}} + {"choices":[{"content_filter_results":{},"finish_reason":"tool_calls","index":0,"logprobs":null,"message":{"annotations":[],"content":null,"refusal":null,"role":"assistant","tool_calls":[{"function":{"arguments":"{\"location\":\"Florence, Italy\"}","name":"weather"},"id":"call_GkznHW5HPVnubv5R7iyby8af","type":"function"}]}}],"created":1782321600,"id":"chatcmpl-DuLYW61AfKdSRPs5NpYIQ0tsqKs70","model":"o4-mini-2025-04-16","object":"chat.completion","prompt_filter_results":[{"prompt_index":0,"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"jailbreak":{"detected":false,"filtered":false},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}}}],"service_tier":"default","system_fingerprint":null,"usage":{"completion_tokens":151,"completion_tokens_details":{"accepted_prediction_tokens":0,"audio_tokens":0,"reasoning_tokens":128,"rejected_prediction_tokens":0},"latency_checkpoint":{"engine_tbt_ms":22,"engine_ttft_ms":97,"engine_ttlt_ms":4428,"pre_inference_ms":263,"service_tbt_ms":22,"service_ttft_ms":1616,"service_ttlt_ms":5942,"total_duration_ms":5686,"user_visible_ttft_ms":1353},"prompt_tokens":64,"prompt_tokens_details":{"audio_tokens":0,"cached_tokens":0},"total_tokens":215}} headers: Content-Type: - application/json status: 200 OK code: 200 - duration: 1.776087s + duration: 6.513006791s - id: 1 request: proto: HTTP/1.1 @@ -38,26 +38,26 @@ interactions: proto_minor: 1 content_length: 712 host: "" - body: '{"messages":[{"content":"You are a helpful assistant","role":"system"},{"content":"What''s the weather in Florence,Italy?","role":"user"},{"tool_calls":[{"id":"call_PS2XApMMnhtJH39VU3brisjo","function":{"arguments":"{\"location\":\"Florence, Italy\"}","name":"weather"},"type":"function"}],"role":"assistant"},{"content":"40 C","tool_call_id":"call_PS2XApMMnhtJH39VU3brisjo","role":"tool"}],"model":"o4-mini","max_completion_tokens":4000,"tool_choice":"auto","tools":[{"function":{"name":"weather","strict":false,"description":"Get weather information for a location","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"}},"type":"function"}]}' + body: '{"messages":[{"content":"You are a helpful assistant","role":"system"},{"content":"What''s the weather in Florence,Italy?","role":"user"},{"tool_calls":[{"id":"call_GkznHW5HPVnubv5R7iyby8af","function":{"arguments":"{\"location\":\"Florence, Italy\"}","name":"weather"},"type":"function"}],"role":"assistant"},{"content":"40 C","tool_call_id":"call_GkznHW5HPVnubv5R7iyby8af","role":"tool"}],"model":"o4-mini","max_completion_tokens":4000,"tool_choice":"auto","tools":[{"function":{"name":"weather","strict":false,"description":"Get weather information for a location","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"}},"type":"function"}]}' headers: Accept: - application/json Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://fantasy-playground-resource.openai.azure.com/openai/v1/chat/completions method: POST response: proto: HTTP/2.0 proto_major: 2 proto_minor: 0 - content_length: 1249 + content_length: 1260 body: | - {"choices":[{"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"protected_material_code":{"filtered":false,"detected":false},"protected_material_text":{"filtered":false,"detected":false},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}},"finish_reason":"stop","index":0,"logprobs":null,"message":{"annotations":[],"content":"The current temperature in Florence, Italy is 40°C.","refusal":null,"role":"assistant"}}],"created":1773338545,"id":"chatcmpl-DIeeX6i7bQhpcohuzFoeaeTX9k6s7","model":"o4-mini-2025-04-16","object":"chat.completion","prompt_filter_results":[{"prompt_index":0,"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"jailbreak":{"filtered":false,"detected":false},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}}}],"system_fingerprint":null,"usage":{"completion_tokens":25,"completion_tokens_details":{"accepted_prediction_tokens":0,"audio_tokens":0,"reasoning_tokens":0,"rejected_prediction_tokens":0},"prompt_tokens":92,"prompt_tokens_details":{"audio_tokens":0,"cached_tokens":0},"total_tokens":117}} + {"choices":[{"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"protected_material_code":{"detected":false,"filtered":false},"protected_material_text":{"detected":false,"filtered":false},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}},"finish_reason":"stop","index":0,"logprobs":null,"message":{"annotations":[],"content":"The current temperature in Florence, Italy is 40°C.","refusal":null,"role":"assistant"}}],"created":1782321606,"id":"chatcmpl-DuLYc2g9mCcsAXYbDIUBtGPE78aML","model":"o4-mini-2025-04-16","object":"chat.completion","prompt_filter_results":[{"prompt_index":0,"content_filter_results":{}}],"service_tier":"default","system_fingerprint":null,"usage":{"completion_tokens":25,"completion_tokens_details":{"accepted_prediction_tokens":0,"audio_tokens":0,"reasoning_tokens":0,"rejected_prediction_tokens":0},"latency_checkpoint":{"engine_tbt_ms":9,"engine_ttft_ms":36,"engine_ttlt_ms":249,"pre_inference_ms":166,"service_tbt_ms":10,"service_ttft_ms":707,"service_ttlt_ms":950,"total_duration_ms":797,"user_visible_ttft_ms":541},"prompt_tokens":92,"prompt_tokens_details":{"audio_tokens":0,"cached_tokens":0},"total_tokens":117}} headers: Content-Type: - application/json status: 200 OK code: 200 - duration: 2.17099975s + duration: 1.508746708s diff --git a/providertests/testdata/TestAzureCommon/azure-o4-mini/tool_streaming.yaml b/providertests/testdata/TestAzureCommon/azure-o4-mini/tool_streaming.yaml index e52d6896d..31ae4dee1 100644 --- a/providertests/testdata/TestAzureCommon/azure-o4-mini/tool_streaming.yaml +++ b/providertests/testdata/TestAzureCommon/azure-o4-mini/tool_streaming.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://fantasy-playground-resource.openai.azure.com/openai/v1/chat/completions method: POST response: @@ -24,29 +24,29 @@ interactions: proto_minor: 0 content_length: -1 body: |+ - data: {"choices":[],"created":0,"id":"","model":"","object":"","prompt_filter_results":[{"prompt_index":0,"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"jailbreak":{"filtered":false,"detected":false},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}}}]} + data: {"choices":[],"created":0,"id":"","model":"","object":"","prompt_filter_results":[{"prompt_index":0,"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"jailbreak":{"detected":false,"filtered":false},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}}}]} - data: {"choices":[{"content_filter_results":{},"delta":{"content":null,"refusal":null,"role":"assistant","tool_calls":[{"function":{"arguments":"","name":"weather"},"id":"call_iiw9Wq0nlQXSuCdsjuZohmSP","index":0,"type":"function"}]},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338547,"id":"chatcmpl-DIeeZX5AuruGS5aAk1Ya1vHUrkRZf","model":"o4-mini-2025-04-16","obfuscation":"","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":null,"refusal":null,"role":"assistant","tool_calls":[{"function":{"arguments":"","name":"weather"},"id":"call_n1TZAnAlhuLNeb1FaV1XCDuD","index":0,"type":"function"}]},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321608,"id":"chatcmpl-DuLYecA4fG184HnHvxnbcPLOFMYxY","model":"o4-mini-2025-04-16","obfuscation":"RMPT8kI","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"tool_calls":[{"function":{"arguments":"{\""},"index":0}]},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338547,"id":"chatcmpl-DIeeZX5AuruGS5aAk1Ya1vHUrkRZf","model":"o4-mini-2025-04-16","obfuscation":"wJMLYC","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"tool_calls":[{"function":{"arguments":"{\""},"index":0}]},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321608,"id":"chatcmpl-DuLYecA4fG184HnHvxnbcPLOFMYxY","model":"o4-mini-2025-04-16","obfuscation":"40w1EImsQBaFX","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"tool_calls":[{"function":{"arguments":"location"},"index":0}]},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338547,"id":"chatcmpl-DIeeZX5AuruGS5aAk1Ya1vHUrkRZf","model":"o4-mini-2025-04-16","obfuscation":"L","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"tool_calls":[{"function":{"arguments":"location"},"index":0}]},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321608,"id":"chatcmpl-DuLYecA4fG184HnHvxnbcPLOFMYxY","model":"o4-mini-2025-04-16","obfuscation":"q5b0UwUh","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"tool_calls":[{"function":{"arguments":"\":\""},"index":0}]},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338547,"id":"chatcmpl-DIeeZX5AuruGS5aAk1Ya1vHUrkRZf","model":"o4-mini-2025-04-16","obfuscation":"m9U9","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"tool_calls":[{"function":{"arguments":"\":\""},"index":0}]},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321608,"id":"chatcmpl-DuLYecA4fG184HnHvxnbcPLOFMYxY","model":"o4-mini-2025-04-16","obfuscation":"16GsrAiCYbZ","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"tool_calls":[{"function":{"arguments":"Flor"},"index":0}]},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338547,"id":"chatcmpl-DIeeZX5AuruGS5aAk1Ya1vHUrkRZf","model":"o4-mini-2025-04-16","obfuscation":"mWggA","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"tool_calls":[{"function":{"arguments":"Flor"},"index":0}]},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321608,"id":"chatcmpl-DuLYecA4fG184HnHvxnbcPLOFMYxY","model":"o4-mini-2025-04-16","obfuscation":"OqKkykiZtgY5","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"tool_calls":[{"function":{"arguments":"ence"},"index":0}]},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338547,"id":"chatcmpl-DIeeZX5AuruGS5aAk1Ya1vHUrkRZf","model":"o4-mini-2025-04-16","obfuscation":"atKKr","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"tool_calls":[{"function":{"arguments":"ence"},"index":0}]},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321608,"id":"chatcmpl-DuLYecA4fG184HnHvxnbcPLOFMYxY","model":"o4-mini-2025-04-16","obfuscation":"6krNVx0o1GoG","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"tool_calls":[{"function":{"arguments":","},"index":0}]},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338547,"id":"chatcmpl-DIeeZX5AuruGS5aAk1Ya1vHUrkRZf","model":"o4-mini-2025-04-16","obfuscation":"RSnQ5qrm","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"tool_calls":[{"function":{"arguments":","},"index":0}]},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321608,"id":"chatcmpl-DuLYecA4fG184HnHvxnbcPLOFMYxY","model":"o4-mini-2025-04-16","obfuscation":"MdyliRiCr2loF7z","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"tool_calls":[{"function":{"arguments":" Italy"},"index":0}]},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338547,"id":"chatcmpl-DIeeZX5AuruGS5aAk1Ya1vHUrkRZf","model":"o4-mini-2025-04-16","obfuscation":"8HI","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"tool_calls":[{"function":{"arguments":" Italy"},"index":0}]},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321608,"id":"chatcmpl-DuLYecA4fG184HnHvxnbcPLOFMYxY","model":"o4-mini-2025-04-16","obfuscation":"D05eLteJL8","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"tool_calls":[{"function":{"arguments":"\"}"},"index":0}]},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338547,"id":"chatcmpl-DIeeZX5AuruGS5aAk1Ya1vHUrkRZf","model":"o4-mini-2025-04-16","obfuscation":"lD6ecF","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"tool_calls":[{"function":{"arguments":"\"}"},"index":0}]},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321608,"id":"chatcmpl-DuLYecA4fG184HnHvxnbcPLOFMYxY","model":"o4-mini-2025-04-16","obfuscation":"tuxnVGIZA57dR","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{},"finish_reason":"tool_calls","index":0,"logprobs":null}],"created":1773338547,"id":"chatcmpl-DIeeZX5AuruGS5aAk1Ya1vHUrkRZf","model":"o4-mini-2025-04-16","obfuscation":"BELzgtZ","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{},"finish_reason":"tool_calls","index":0,"logprobs":null}],"created":1782321608,"id":"chatcmpl-DuLYecA4fG184HnHvxnbcPLOFMYxY","model":"o4-mini-2025-04-16","obfuscation":"CrkfP9lmBjxmTc","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[],"created":1773338547,"id":"chatcmpl-DIeeZX5AuruGS5aAk1Ya1vHUrkRZf","model":"o4-mini-2025-04-16","obfuscation":"ocunNAuOFDV9mA","object":"chat.completion.chunk","system_fingerprint":null,"usage":{"completion_tokens":151,"completion_tokens_details":{"accepted_prediction_tokens":0,"audio_tokens":0,"reasoning_tokens":128,"rejected_prediction_tokens":0},"prompt_tokens":64,"prompt_tokens_details":{"audio_tokens":0,"cached_tokens":0},"total_tokens":215}} + data: {"choices":[],"created":1782321608,"id":"chatcmpl-DuLYecA4fG184HnHvxnbcPLOFMYxY","latency_checkpoint":{"engine_tbt_ms":9,"engine_ttft_ms":33,"engine_ttlt_ms":922,"pre_inference_ms":206,"service_tbt_ms":10,"service_ttft_ms":780,"service_ttlt_ms":1684,"total_duration_ms":1562,"user_visible_ttft_ms":574},"model":"o4-mini-2025-04-16","obfuscation":"3DL7Cegei","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":{"completion_tokens":87,"completion_tokens_details":{"accepted_prediction_tokens":0,"audio_tokens":0,"reasoning_tokens":64,"rejected_prediction_tokens":0},"prompt_tokens":64,"prompt_tokens_details":{"audio_tokens":0,"cached_tokens":0},"total_tokens":151}} data: [DONE] @@ -55,7 +55,7 @@ interactions: - text/event-stream; charset=utf-8 status: 200 OK code: 200 - duration: 2.110832125s + duration: 1.748455125s - id: 1 request: proto: HTTP/1.1 @@ -63,14 +63,14 @@ interactions: proto_minor: 1 content_length: 766 host: "" - body: '{"messages":[{"content":"You are a helpful assistant","role":"system"},{"content":"What''s the weather in Florence,Italy?","role":"user"},{"tool_calls":[{"id":"call_iiw9Wq0nlQXSuCdsjuZohmSP","function":{"arguments":"{\"location\":\"Florence, Italy\"}","name":"weather"},"type":"function"}],"role":"assistant"},{"content":"40 C","tool_call_id":"call_iiw9Wq0nlQXSuCdsjuZohmSP","role":"tool"}],"model":"o4-mini","max_completion_tokens":4000,"stream_options":{"include_usage":true},"tool_choice":"auto","tools":[{"function":{"name":"weather","strict":false,"description":"Get weather information for a location","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"}},"type":"function"}],"stream":true}' + body: '{"messages":[{"content":"You are a helpful assistant","role":"system"},{"content":"What''s the weather in Florence,Italy?","role":"user"},{"tool_calls":[{"id":"call_n1TZAnAlhuLNeb1FaV1XCDuD","function":{"arguments":"{\"location\":\"Florence, Italy\"}","name":"weather"},"type":"function"}],"role":"assistant"},{"content":"40 C","tool_call_id":"call_n1TZAnAlhuLNeb1FaV1XCDuD","role":"tool"}],"model":"o4-mini","max_completion_tokens":4000,"stream_options":{"include_usage":true},"tool_choice":"auto","tools":[{"function":{"name":"weather","strict":false,"description":"Get weather information for a location","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"}},"type":"function"}],"stream":true}' headers: Accept: - application/json Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://fantasy-playground-resource.openai.azure.com/openai/v1/chat/completions method: POST response: @@ -79,111 +79,99 @@ interactions: proto_minor: 0 content_length: -1 body: |+ - data: {"choices":[],"created":0,"id":"","model":"","object":"","prompt_filter_results":[{"prompt_index":0,"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"jailbreak":{"filtered":false,"detected":false},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}}}]} + data: {"choices":[],"created":0,"id":"","model":"","object":"","prompt_filter_results":[{"prompt_index":0,"content_filter_results":{}}]} - data: {"choices":[{"content_filter_results":{},"delta":{"content":"","refusal":null,"role":"assistant"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338549,"id":"chatcmpl-DIeeblbntTcRQClCutPKE6HkUQcwK","model":"o4-mini-2025-04-16","obfuscation":"D","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":"","refusal":null,"role":"assistant"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321610,"id":"chatcmpl-DuLYgHdphKUoYyVeqilLgVm11lP25","model":"o4-mini-2025-04-16","obfuscation":"FdawHA6q","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}},"delta":{"content":"The"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338549,"id":"chatcmpl-DIeeblbntTcRQClCutPKE6HkUQcwK","model":"o4-mini-2025-04-16","obfuscation":"","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{"protected_material_code":{"detected":false,"filtered":false}},"delta":{"content":"The"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321610,"id":"chatcmpl-DuLYgHdphKUoYyVeqilLgVm11lP25","model":"o4-mini-2025-04-16","obfuscation":"mlyxofE","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}},"delta":{"content":" current"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338549,"id":"chatcmpl-DIeeblbntTcRQClCutPKE6HkUQcwK","model":"o4-mini-2025-04-16","obfuscation":"wKSw9yGoM1y","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{"protected_material_code":{"detected":false,"filtered":false}},"delta":{"content":" current"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321610,"id":"chatcmpl-DuLYgHdphKUoYyVeqilLgVm11lP25","model":"o4-mini-2025-04-16","obfuscation":"tS","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}},"delta":{"content":" temperature"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338549,"id":"chatcmpl-DIeeblbntTcRQClCutPKE6HkUQcwK","model":"o4-mini-2025-04-16","obfuscation":"qEkMPjP","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{"protected_material_code":{"detected":false,"filtered":false}},"delta":{"content":" temperature"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321610,"id":"chatcmpl-DuLYgHdphKUoYyVeqilLgVm11lP25","model":"o4-mini-2025-04-16","obfuscation":"G43Qy2g4u5yq3V","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}},"delta":{"content":" in"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338549,"id":"chatcmpl-DIeeblbntTcRQClCutPKE6HkUQcwK","model":"o4-mini-2025-04-16","obfuscation":"","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{"protected_material_code":{"detected":false,"filtered":false}},"delta":{"content":" in"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321610,"id":"chatcmpl-DuLYgHdphKUoYyVeqilLgVm11lP25","model":"o4-mini-2025-04-16","obfuscation":"kvInXug","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}},"delta":{"content":" Florence"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338549,"id":"chatcmpl-DIeeblbntTcRQClCutPKE6HkUQcwK","model":"o4-mini-2025-04-16","obfuscation":"H6qs0DP9vM","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{"protected_material_code":{"detected":false,"filtered":false}},"delta":{"content":" Florence"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321610,"id":"chatcmpl-DuLYgHdphKUoYyVeqilLgVm11lP25","model":"o4-mini-2025-04-16","obfuscation":"H","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}},"delta":{"content":","},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338549,"id":"chatcmpl-DIeeblbntTcRQClCutPKE6HkUQcwK","model":"o4-mini-2025-04-16","obfuscation":"Mv","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{"protected_material_code":{"detected":false,"filtered":false}},"delta":{"content":","},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321610,"id":"chatcmpl-DuLYgHdphKUoYyVeqilLgVm11lP25","model":"o4-mini-2025-04-16","obfuscation":"nuWJDsjP9","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}},"delta":{"content":" Italy"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338549,"id":"chatcmpl-DIeeblbntTcRQClCutPKE6HkUQcwK","model":"o4-mini-2025-04-16","obfuscation":"1SKud6BSHDoS6","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{"protected_material_code":{"detected":false,"filtered":false}},"delta":{"content":" Italy"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321610,"id":"chatcmpl-DuLYgHdphKUoYyVeqilLgVm11lP25","model":"o4-mini-2025-04-16","obfuscation":"nn1q","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}},"delta":{"content":" is"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338549,"id":"chatcmpl-DIeeblbntTcRQClCutPKE6HkUQcwK","model":"o4-mini-2025-04-16","obfuscation":"","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{"protected_material_code":{"detected":false,"filtered":false}},"delta":{"content":" is"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321610,"id":"chatcmpl-DuLYgHdphKUoYyVeqilLgVm11lP25","model":"o4-mini-2025-04-16","obfuscation":"QvBcWUR","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}},"delta":{"content":" "},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338549,"id":"chatcmpl-DIeeblbntTcRQClCutPKE6HkUQcwK","model":"o4-mini-2025-04-16","obfuscation":"5w","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{"protected_material_code":{"detected":false,"filtered":false}},"delta":{"content":" "},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321610,"id":"chatcmpl-DuLYgHdphKUoYyVeqilLgVm11lP25","model":"o4-mini-2025-04-16","obfuscation":"u3nUshWKO","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}},"delta":{"content":"40"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338549,"id":"chatcmpl-DIeeblbntTcRQClCutPKE6HkUQcwK","model":"o4-mini-2025-04-16","obfuscation":"z","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{"protected_material_code":{"detected":false,"filtered":false}},"delta":{"content":"40"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321610,"id":"chatcmpl-DuLYgHdphKUoYyVeqilLgVm11lP25","model":"o4-mini-2025-04-16","obfuscation":"sB57A7Et","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}},"delta":{"content":"°C"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338549,"id":"chatcmpl-DIeeblbntTcRQClCutPKE6HkUQcwK","model":"o4-mini-2025-04-16","obfuscation":"S","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{"protected_material_code":{"detected":false,"filtered":false}},"delta":{"content":"°C"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321610,"id":"chatcmpl-DuLYgHdphKUoYyVeqilLgVm11lP25","model":"o4-mini-2025-04-16","obfuscation":"f9hv8yrs","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}},"delta":{"content":"."},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338549,"id":"chatcmpl-DIeeblbntTcRQClCutPKE6HkUQcwK","model":"o4-mini-2025-04-16","obfuscation":"Sn","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{"protected_material_code":{"detected":false,"filtered":false}},"delta":{"content":"."},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321610,"id":"chatcmpl-DuLYgHdphKUoYyVeqilLgVm11lP25","model":"o4-mini-2025-04-16","obfuscation":"pIUa5jv7s","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}},"delta":{"content":" That's"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338549,"id":"chatcmpl-DIeeblbntTcRQClCutPKE6HkUQcwK","model":"o4-mini-2025-04-16","obfuscation":"gbhzgNx3aaAQ","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{"protected_material_code":{"detected":false,"filtered":false}},"delta":{"content":" It"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321610,"id":"chatcmpl-DuLYgHdphKUoYyVeqilLgVm11lP25","model":"o4-mini-2025-04-16","obfuscation":"3XgaR1o","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}},"delta":{"content":" quite"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338549,"id":"chatcmpl-DIeeblbntTcRQClCutPKE6HkUQcwK","model":"o4-mini-2025-04-16","obfuscation":"Bx2TM5D3aStVI","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{"protected_material_code":{"detected":false,"filtered":false}},"delta":{"content":"’s"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321610,"id":"chatcmpl-DuLYgHdphKUoYyVeqilLgVm11lP25","model":"o4-mini-2025-04-16","obfuscation":"C5wpTsTm","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}},"delta":{"content":" hot"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338549,"id":"chatcmpl-DIeeblbntTcRQClCutPKE6HkUQcwK","model":"o4-mini-2025-04-16","obfuscation":"Y6wUERC0CdFR2qj","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{"protected_material_code":{"detected":false,"filtered":false}},"delta":{"content":" quite"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321610,"id":"chatcmpl-DuLYgHdphKUoYyVeqilLgVm11lP25","model":"o4-mini-2025-04-16","obfuscation":"qn2S","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}},"delta":{"content":"!"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338549,"id":"chatcmpl-DIeeblbntTcRQClCutPKE6HkUQcwK","model":"o4-mini-2025-04-16","obfuscation":"Jr","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{"protected_material_code":{"detected":false,"filtered":false}},"delta":{"content":" hot"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321610,"id":"chatcmpl-DuLYgHdphKUoYyVeqilLgVm11lP25","model":"o4-mini-2025-04-16","obfuscation":"6FXX4F","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}},"delta":{"content":" Make"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338549,"id":"chatcmpl-DIeeblbntTcRQClCutPKE6HkUQcwK","model":"o4-mini-2025-04-16","obfuscation":"89ZchtQrIbl8e0","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{"protected_material_code":{"detected":false,"filtered":false}},"delta":{"content":","},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321610,"id":"chatcmpl-DuLYgHdphKUoYyVeqilLgVm11lP25","model":"o4-mini-2025-04-16","obfuscation":"YkqOkfzK4","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}},"delta":{"content":" sure"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338549,"id":"chatcmpl-DIeeblbntTcRQClCutPKE6HkUQcwK","model":"o4-mini-2025-04-16","obfuscation":"zV4RmvV7leWL5Q","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{"protected_material_code":{"detected":false,"filtered":false}},"delta":{"content":" so"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321610,"id":"chatcmpl-DuLYgHdphKUoYyVeqilLgVm11lP25","model":"o4-mini-2025-04-16","obfuscation":"8gVLft4","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}},"delta":{"content":" to"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338549,"id":"chatcmpl-DIeeblbntTcRQClCutPKE6HkUQcwK","model":"o4-mini-2025-04-16","obfuscation":"","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{"protected_material_code":{"detected":false,"filtered":false}},"delta":{"content":" if"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321610,"id":"chatcmpl-DuLYgHdphKUoYyVeqilLgVm11lP25","model":"o4-mini-2025-04-16","obfuscation":"K09x6vm","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}},"delta":{"content":" stay"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338549,"id":"chatcmpl-DIeeblbntTcRQClCutPKE6HkUQcwK","model":"o4-mini-2025-04-16","obfuscation":"Refq2Fb4Vqkr19","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{"protected_material_code":{"detected":false,"filtered":false}},"delta":{"content":" you"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321610,"id":"chatcmpl-DuLYgHdphKUoYyVeqilLgVm11lP25","model":"o4-mini-2025-04-16","obfuscation":"L2V2zo","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}},"delta":{"content":" hydrated"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338549,"id":"chatcmpl-DIeeblbntTcRQClCutPKE6HkUQcwK","model":"o4-mini-2025-04-16","obfuscation":"lCNu0trIsy","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{"protected_material_code":{"detected":false,"filtered":false}},"delta":{"content":"’re"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321610,"id":"chatcmpl-DuLYgHdphKUoYyVeqilLgVm11lP25","model":"o4-mini-2025-04-16","obfuscation":"9czC8DV","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}},"delta":{"content":" and"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338549,"id":"chatcmpl-DIeeblbntTcRQClCutPKE6HkUQcwK","model":"o4-mini-2025-04-16","obfuscation":"imGcN68d3A5LwUT","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{"protected_material_code":{"detected":false,"filtered":false}},"delta":{"content":" heading"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321610,"id":"chatcmpl-DuLYgHdphKUoYyVeqilLgVm11lP25","model":"o4-mini-2025-04-16","obfuscation":"UH","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}},"delta":{"content":" avoid"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338549,"id":"chatcmpl-DIeeblbntTcRQClCutPKE6HkUQcwK","model":"o4-mini-2025-04-16","obfuscation":"9NFbdW57fxDJ0","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{"protected_material_code":{"detected":false,"filtered":false}},"delta":{"content":" out"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321610,"id":"chatcmpl-DuLYgHdphKUoYyVeqilLgVm11lP25","model":"o4-mini-2025-04-16","obfuscation":"aXJfQd","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}},"delta":{"content":" direct"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338549,"id":"chatcmpl-DIeeblbntTcRQClCutPKE6HkUQcwK","model":"o4-mini-2025-04-16","obfuscation":"vlzFDsFXlveK","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{"protected_material_code":{"detected":false,"filtered":false}},"delta":{"content":","},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321610,"id":"chatcmpl-DuLYgHdphKUoYyVeqilLgVm11lP25","model":"o4-mini-2025-04-16","obfuscation":"KhsGHzZHe","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}},"delta":{"content":" sun"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338549,"id":"chatcmpl-DIeeblbntTcRQClCutPKE6HkUQcwK","model":"o4-mini-2025-04-16","obfuscation":"694hh2xRiKJbW2P","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{"protected_material_code":{"detected":false,"filtered":false}},"delta":{"content":" consider"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321610,"id":"chatcmpl-DuLYgHdphKUoYyVeqilLgVm11lP25","model":"o4-mini-2025-04-16","obfuscation":"4","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}},"delta":{"content":" exposure"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338549,"id":"chatcmpl-DIeeblbntTcRQClCutPKE6HkUQcwK","model":"o4-mini-2025-04-16","obfuscation":"T8z4gUMTZl","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{"protected_material_code":{"detected":false,"filtered":false}},"delta":{"content":" wearing"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321610,"id":"chatcmpl-DuLYgHdphKUoYyVeqilLgVm11lP25","model":"o4-mini-2025-04-16","obfuscation":"Sc","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}},"delta":{"content":" during"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338549,"id":"chatcmpl-DIeeblbntTcRQClCutPKE6HkUQcwK","model":"o4-mini-2025-04-16","obfuscation":"8vKTjwpuK1uu","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{"protected_material_code":{"detected":false,"filtered":false}},"delta":{"content":" light"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321610,"id":"chatcmpl-DuLYgHdphKUoYyVeqilLgVm11lP25","model":"o4-mini-2025-04-16","obfuscation":"YVgP","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}},"delta":{"content":" the"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338549,"id":"chatcmpl-DIeeblbntTcRQClCutPKE6HkUQcwK","model":"o4-mini-2025-04-16","obfuscation":"l0oIBDMSpZIT2Ki","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{"protected_material_code":{"detected":false,"filtered":false}},"delta":{"content":","},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321610,"id":"chatcmpl-DuLYgHdphKUoYyVeqilLgVm11lP25","model":"o4-mini-2025-04-16","obfuscation":"BSqNu0P8o","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}},"delta":{"content":" hottest"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338549,"id":"chatcmpl-DIeeblbntTcRQClCutPKE6HkUQcwK","model":"o4-mini-2025-04-16","obfuscation":"oxNMkMh0ioZ","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{"protected_material_code":{"detected":false,"filtered":false}},"delta":{"content":" breathable"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321610,"id":"chatcmpl-DuLYgHdphKUoYyVeqilLgVm11lP25","model":"o4-mini-2025-04-16","obfuscation":"ztjy0YxnweNATag","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}},"delta":{"content":" parts"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338549,"id":"chatcmpl-DIeeblbntTcRQClCutPKE6HkUQcwK","model":"o4-mini-2025-04-16","obfuscation":"VdJxznVQ5hnl3","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{"protected_material_code":{"detected":false,"filtered":false}},"delta":{"content":" clothing"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321610,"id":"chatcmpl-DuLYgHdphKUoYyVeqilLgVm11lP25","model":"o4-mini-2025-04-16","obfuscation":"f","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}},"delta":{"content":" of"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338549,"id":"chatcmpl-DIeeblbntTcRQClCutPKE6HkUQcwK","model":"o4-mini-2025-04-16","obfuscation":"","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{"protected_material_code":{"detected":false,"filtered":false}},"delta":{"content":","},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321610,"id":"chatcmpl-DuLYgHdphKUoYyVeqilLgVm11lP25","model":"o4-mini-2025-04-16","obfuscation":"sQDj1RVH7","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}},"delta":{"content":" the"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338549,"id":"chatcmpl-DIeeblbntTcRQClCutPKE6HkUQcwK","model":"o4-mini-2025-04-16","obfuscation":"ax7k5OC4HhAiNvn","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{"protected_material_code":{"detected":false,"filtered":false}},"delta":{"content":" staying"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321610,"id":"chatcmpl-DuLYgHdphKUoYyVeqilLgVm11lP25","model":"o4-mini-2025-04-16","obfuscation":"WV","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}},"delta":{"content":" day"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338549,"id":"chatcmpl-DIeeblbntTcRQClCutPKE6HkUQcwK","model":"o4-mini-2025-04-16","obfuscation":"RtmDkJZBlxiED4Y","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{"protected_material_code":{"detected":false,"filtered":false}},"delta":{"content":" hydrated"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321610,"id":"chatcmpl-DuLYgHdphKUoYyVeqilLgVm11lP25","model":"o4-mini-2025-04-16","obfuscation":"d","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}},"delta":{"content":"."},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338549,"id":"chatcmpl-DIeeblbntTcRQClCutPKE6HkUQcwK","model":"o4-mini-2025-04-16","obfuscation":"qL","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{"protected_material_code":{"detected":false,"filtered":false}},"delta":{"content":","},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321610,"id":"chatcmpl-DuLYgHdphKUoYyVeqilLgVm11lP25","model":"o4-mini-2025-04-16","obfuscation":"UzmJhCtVz","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}},"delta":{"content":" If"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338549,"id":"chatcmpl-DIeeblbntTcRQClCutPKE6HkUQcwK","model":"o4-mini-2025-04-16","obfuscation":"","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{"protected_material_code":{"detected":false,"filtered":false}},"delta":{"content":" and"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321610,"id":"chatcmpl-DuLYgHdphKUoYyVeqilLgVm11lP25","model":"o4-mini-2025-04-16","obfuscation":"1ChgNd","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}},"delta":{"content":" you"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338549,"id":"chatcmpl-DIeeblbntTcRQClCutPKE6HkUQcwK","model":"o4-mini-2025-04-16","obfuscation":"U0cvH6EyKMVx4vH","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{"protected_material_code":{"detected":false,"filtered":false}},"delta":{"content":" seeking"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321610,"id":"chatcmpl-DuLYgHdphKUoYyVeqilLgVm11lP25","model":"o4-mini-2025-04-16","obfuscation":"Wa","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}},"delta":{"content":" have"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338549,"id":"chatcmpl-DIeeblbntTcRQClCutPKE6HkUQcwK","model":"o4-mini-2025-04-16","obfuscation":"7jREPca3Jk3CEe","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{"protected_material_code":{"detected":false,"filtered":false}},"delta":{"content":" shade"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321610,"id":"chatcmpl-DuLYgHdphKUoYyVeqilLgVm11lP25","model":"o4-mini-2025-04-16","obfuscation":"8pQx","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}},"delta":{"content":" any"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338549,"id":"chatcmpl-DIeeblbntTcRQClCutPKE6HkUQcwK","model":"o4-mini-2025-04-16","obfuscation":"NN18PkwZx2VNjfT","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{"protected_material_code":{"detected":false,"filtered":false}},"delta":{"content":" during"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321610,"id":"chatcmpl-DuLYgHdphKUoYyVeqilLgVm11lP25","model":"o4-mini-2025-04-16","obfuscation":"9kZ","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}},"delta":{"content":" more"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338549,"id":"chatcmpl-DIeeblbntTcRQClCutPKE6HkUQcwK","model":"o4-mini-2025-04-16","obfuscation":"hcUiH6veEQwOjl","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{"protected_material_code":{"detected":false,"filtered":false}},"delta":{"content":" the"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321610,"id":"chatcmpl-DuLYgHdphKUoYyVeqilLgVm11lP25","model":"o4-mini-2025-04-16","obfuscation":"Itsqzu","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}},"delta":{"content":" questions"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338549,"id":"chatcmpl-DIeeblbntTcRQClCutPKE6HkUQcwK","model":"o4-mini-2025-04-16","obfuscation":"PCYTFqdLf","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{"protected_material_code":{"detected":false,"filtered":false}},"delta":{"content":" peak"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321610,"id":"chatcmpl-DuLYgHdphKUoYyVeqilLgVm11lP25","model":"o4-mini-2025-04-16","obfuscation":"3Ndar","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}},"delta":{"content":" or"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338549,"id":"chatcmpl-DIeeblbntTcRQClCutPKE6HkUQcwK","model":"o4-mini-2025-04-16","obfuscation":"","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{"protected_material_code":{"detected":false,"filtered":false}},"delta":{"content":" sun"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321610,"id":"chatcmpl-DuLYgHdphKUoYyVeqilLgVm11lP25","model":"o4-mini-2025-04-16","obfuscation":"8kfbTR","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}},"delta":{"content":" need"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338549,"id":"chatcmpl-DIeeblbntTcRQClCutPKE6HkUQcwK","model":"o4-mini-2025-04-16","obfuscation":"KXM3KVmL4m2FRk","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{"protected_material_code":{"detected":false,"filtered":false}},"delta":{"content":" hours"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321610,"id":"chatcmpl-DuLYgHdphKUoYyVeqilLgVm11lP25","model":"o4-mini-2025-04-16","obfuscation":"0egz","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}},"delta":{"content":" further"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338549,"id":"chatcmpl-DIeeblbntTcRQClCutPKE6HkUQcwK","model":"o4-mini-2025-04-16","obfuscation":"JumuGLZJzID","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{"protected_material_code":{"detected":false,"filtered":false}},"delta":{"content":"."},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321610,"id":"chatcmpl-DuLYgHdphKUoYyVeqilLgVm11lP25","model":"o4-mini-2025-04-16","obfuscation":"yrXltaCDJ","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}},"delta":{"content":" details"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338549,"id":"chatcmpl-DIeeblbntTcRQClCutPKE6HkUQcwK","model":"o4-mini-2025-04-16","obfuscation":"Nc2l7ZTcoZO","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{},"finish_reason":"stop","index":0,"logprobs":null}],"created":1782321610,"id":"chatcmpl-DuLYgHdphKUoYyVeqilLgVm11lP25","model":"o4-mini-2025-04-16","obfuscation":"6Sxd","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}},"delta":{"content":","},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338549,"id":"chatcmpl-DIeeblbntTcRQClCutPKE6HkUQcwK","model":"o4-mini-2025-04-16","obfuscation":"j2","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} - - data: {"choices":[{"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}},"delta":{"content":" let"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338549,"id":"chatcmpl-DIeeblbntTcRQClCutPKE6HkUQcwK","model":"o4-mini-2025-04-16","obfuscation":"d8ZoQNpGsXmV4Pc","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} - - data: {"choices":[{"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}},"delta":{"content":" me"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338549,"id":"chatcmpl-DIeeblbntTcRQClCutPKE6HkUQcwK","model":"o4-mini-2025-04-16","obfuscation":"","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} - - data: {"choices":[{"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}},"delta":{"content":" know"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338549,"id":"chatcmpl-DIeeblbntTcRQClCutPKE6HkUQcwK","model":"o4-mini-2025-04-16","obfuscation":"hdo0Umxp5E45fA","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} - - data: {"choices":[{"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}},"delta":{"content":"!"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338549,"id":"chatcmpl-DIeeblbntTcRQClCutPKE6HkUQcwK","model":"o4-mini-2025-04-16","obfuscation":"sT","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} - - data: {"choices":[{"content_filter_results":{},"delta":{},"finish_reason":"stop","index":0,"logprobs":null}],"created":1773338549,"id":"chatcmpl-DIeeblbntTcRQClCutPKE6HkUQcwK","model":"o4-mini-2025-04-16","obfuscation":"r5XgmI3PANPfy","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} - - data: {"choices":[],"created":1773338549,"id":"chatcmpl-DIeeblbntTcRQClCutPKE6HkUQcwK","model":"o4-mini-2025-04-16","obfuscation":"8","object":"chat.completion.chunk","system_fingerprint":null,"usage":{"completion_tokens":62,"completion_tokens_details":{"accepted_prediction_tokens":0,"audio_tokens":0,"reasoning_tokens":0,"rejected_prediction_tokens":0},"prompt_tokens":92,"prompt_tokens_details":{"audio_tokens":0,"cached_tokens":0},"total_tokens":154}} + data: {"choices":[],"created":1782321610,"id":"chatcmpl-DuLYgHdphKUoYyVeqilLgVm11lP25","latency_checkpoint":{"engine_tbt_ms":9,"engine_ttft_ms":35,"engine_ttlt_ms":533,"pre_inference_ms":218,"service_tbt_ms":10,"service_ttft_ms":784,"service_ttlt_ms":1335,"total_duration_ms":1121,"user_visible_ttft_ms":567},"model":"o4-mini-2025-04-16","obfuscation":"TUGyJavQAi","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":{"completion_tokens":56,"completion_tokens_details":{"accepted_prediction_tokens":0,"audio_tokens":0,"reasoning_tokens":0,"rejected_prediction_tokens":0},"prompt_tokens":92,"prompt_tokens_details":{"audio_tokens":0,"cached_tokens":0},"total_tokens":148}} data: [DONE] @@ -192,4 +180,4 @@ interactions: - text/event-stream; charset=utf-8 status: 200 OK code: 200 - duration: 568.503791ms + duration: 1.020053875s diff --git a/providertests/testdata/TestAzureResponsesCommon/azure-gpt-5-mini/simple.yaml b/providertests/testdata/TestAzureResponsesCommon/azure-gpt-5-mini/simple.yaml index 818480c33..315214262 100644 --- a/providertests/testdata/TestAzureResponsesCommon/azure-gpt-5-mini/simple.yaml +++ b/providertests/testdata/TestAzureResponsesCommon/azure-gpt-5-mini/simple.yaml @@ -15,22 +15,22 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://fantasy-playground-resource.openai.azure.com/openai/v1/responses method: POST response: proto: HTTP/2.0 proto_major: 2 proto_minor: 0 - content_length: 3194 + content_length: 3279 body: |- { - "id": "resp_07781033bdb3b0150169b2ff64410c8195840d5e5463a5edea", + "id": "resp_07f7b191c92ba150016a3c117b1cf081978145cbcb940b8a9c", "object": "response", - "created_at": 1773338468, + "created_at": 1782321531, "status": "completed", "background": false, - "completed_at": 1773338471, + "completed_at": 1782321534, "content_filters": [ { "blocked": false, @@ -60,7 +60,7 @@ interactions: }, "content_filter_offsets": { "start_offset": 0, - "end_offset": 53, + "end_offset": 1153, "check_offset": 0 } }, @@ -69,6 +69,14 @@ interactions: "source_type": "completion", "content_filter_raw": [], "content_filter_results": { + "protected_material_text": { + "detected": false, + "filtered": false + }, + "protected_material_code": { + "detected": false, + "filtered": false + }, "hate": { "filtered": false, "severity": "safe" @@ -84,19 +92,11 @@ interactions: "self_harm": { "filtered": false, "severity": "safe" - }, - "protected_material_code": { - "detected": false, - "filtered": false - }, - "protected_material_text": { - "detected": false, - "filtered": false } }, "content_filter_offsets": { "start_offset": 0, - "end_offset": 409, + "end_offset": 635, "check_offset": 0 } } @@ -108,14 +108,15 @@ interactions: "max_output_tokens": 4000, "max_tool_calls": null, "model": "gpt-5-mini", + "moderation": null, "output": [ { - "id": "rs_07781033bdb3b0150169b2ff64cc648195856b2ada86d22dea", + "id": "rs_07f7b191c92ba150016a3c117b65c88197990fb91a1733bebc", "type": "reasoning", "summary": [] }, { - "id": "msg_07781033bdb3b0150169b2ff660a1c8195ae505f9842f3f5f2", + "id": "msg_07f7b191c92ba150016a3c117dc5bc819784ae68696a8cce14", "type": "message", "status": "completed", "content": [ @@ -123,7 +124,7 @@ interactions: "type": "output_text", "annotations": [], "logprobs": [], - "text": "Ol\u00e1!" + "text": "Oi! (Tamb\u00e9m pode usar \"Ol\u00e1!\")" } ], "role": "assistant" @@ -133,8 +134,9 @@ interactions: "presence_penalty": 0.0, "previous_response_id": null, "prompt_cache_key": null, - "prompt_cache_retention": null, + "prompt_cache_retention": "in_memory", "reasoning": { + "context": null, "effort": "medium", "summary": null }, @@ -158,11 +160,11 @@ interactions: "input_tokens_details": { "cached_tokens": 0 }, - "output_tokens": 112, + "output_tokens": 164, "output_tokens_details": { - "reasoning_tokens": 64 + "reasoning_tokens": 128 }, - "total_tokens": 131 + "total_tokens": 183 }, "user": null, "metadata": {} @@ -172,4 +174,4 @@ interactions: - application/json status: 200 OK code: 200 - duration: 4.049976875s + duration: 3.879503334s diff --git a/providertests/testdata/TestAzureResponsesCommon/azure-gpt-5-mini/simple_streaming.yaml b/providertests/testdata/TestAzureResponsesCommon/azure-gpt-5-mini/simple_streaming.yaml index b627e9edf..88223b819 100644 --- a/providertests/testdata/TestAzureResponsesCommon/azure-gpt-5-mini/simple_streaming.yaml +++ b/providertests/testdata/TestAzureResponsesCommon/azure-gpt-5-mini/simple_streaming.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://fantasy-playground-resource.openai.azure.com/openai/v1/responses method: POST response: @@ -25,44 +25,44 @@ interactions: content_length: -1 body: |+ event: response.created - data: {"type":"response.created","response":{"id":"resp_0cc665730fb33c420169b2ff67a3e8819494bb7f11d4d3fd29","object":"response","created_at":1773338471,"status":"in_progress","background":false,"completed_at":null,"content_filters":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-5-mini","output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":"medium","summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":0} + data: {"type":"response.created","response":{"id":"resp_019d0fbf74a564d6016a3c117e5b1c819382d1cf29a3ef79ce","object":"response","created_at":1782321534,"status":"in_progress","background":false,"completed_at":null,"content_filters":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-5-mini","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":null,"effort":"medium","summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":0} event: response.in_progress - data: {"type":"response.in_progress","response":{"id":"resp_0cc665730fb33c420169b2ff67a3e8819494bb7f11d4d3fd29","object":"response","created_at":1773338471,"status":"in_progress","background":false,"completed_at":null,"content_filters":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-5-mini","output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":"medium","summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":1} + data: {"type":"response.in_progress","response":{"id":"resp_019d0fbf74a564d6016a3c117e5b1c819382d1cf29a3ef79ce","object":"response","created_at":1782321534,"status":"in_progress","background":false,"completed_at":null,"content_filters":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-5-mini","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":null,"effort":"medium","summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":1} event: response.output_item.added - data: {"type":"response.output_item.added","item":{"id":"rs_0cc665730fb33c420169b2ff68d3dc8194b77e20590bd047af","type":"reasoning","summary":[]},"output_index":0,"sequence_number":2} + data: {"type":"response.output_item.added","item":{"id":"rs_019d0fbf74a564d6016a3c117ec7f48193aa6caffcec1b7c3a","type":"reasoning","summary":[]},"output_index":0,"sequence_number":2} event: response.output_item.done - data: {"type":"response.output_item.done","item":{"id":"rs_0cc665730fb33c420169b2ff68d3dc8194b77e20590bd047af","type":"reasoning","summary":[]},"output_index":0,"sequence_number":3} + data: {"type":"response.output_item.done","item":{"id":"rs_019d0fbf74a564d6016a3c117ec7f48193aa6caffcec1b7c3a","type":"reasoning","summary":[]},"output_index":0,"sequence_number":3} event: response.output_item.added - data: {"type":"response.output_item.added","item":{"id":"msg_0cc665730fb33c420169b2ff6a0d80819488ab542d9bbfef0c","type":"message","status":"in_progress","content":[],"role":"assistant"},"output_index":1,"sequence_number":4} + data: {"type":"response.output_item.added","item":{"id":"msg_019d0fbf74a564d6016a3c1181bdbc819384667dfe8e7de5c4","type":"message","status":"in_progress","content":[],"role":"assistant"},"output_index":1,"sequence_number":4} event: response.content_part.added - data: {"type":"response.content_part.added","content_index":0,"item_id":"msg_0cc665730fb33c420169b2ff6a0d80819488ab542d9bbfef0c","output_index":1,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":""},"sequence_number":5} + data: {"type":"response.content_part.added","content_index":0,"item_id":"msg_019d0fbf74a564d6016a3c1181bdbc819384667dfe8e7de5c4","output_index":1,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":""},"sequence_number":5} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":"Olá","item_id":"msg_0cc665730fb33c420169b2ff6a0d80819488ab542d9bbfef0c","logprobs":[],"obfuscation":"uMdqAkmtvsKdc","output_index":1,"sequence_number":6} + data: {"type":"response.output_text.delta","content_index":0,"delta":"Olá","item_id":"msg_019d0fbf74a564d6016a3c1181bdbc819384667dfe8e7de5c4","logprobs":[],"obfuscation":"CsGoBBsuRWFDB","output_index":1,"sequence_number":6} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":"!","item_id":"msg_0cc665730fb33c420169b2ff6a0d80819488ab542d9bbfef0c","logprobs":[],"obfuscation":"wMMKr7VHxEPzV3h","output_index":1,"sequence_number":7} + data: {"type":"response.output_text.delta","content_index":0,"delta":"!","item_id":"msg_019d0fbf74a564d6016a3c1181bdbc819384667dfe8e7de5c4","logprobs":[],"obfuscation":"NRSUgCX1cOTTjJs","output_index":1,"sequence_number":7} event: response.output_text.done - data: {"type":"response.output_text.done","content_index":0,"item_id":"msg_0cc665730fb33c420169b2ff6a0d80819488ab542d9bbfef0c","logprobs":[],"output_index":1,"sequence_number":8,"text":"Olá!"} + data: {"type":"response.output_text.done","content_index":0,"item_id":"msg_019d0fbf74a564d6016a3c1181bdbc819384667dfe8e7de5c4","logprobs":[],"output_index":1,"sequence_number":8,"text":"Olá!"} event: response.content_part.done - data: {"type":"response.content_part.done","content_index":0,"item_id":"msg_0cc665730fb33c420169b2ff6a0d80819488ab542d9bbfef0c","output_index":1,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":"Olá!"},"sequence_number":9} + data: {"type":"response.content_part.done","content_index":0,"item_id":"msg_019d0fbf74a564d6016a3c1181bdbc819384667dfe8e7de5c4","output_index":1,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":"Olá!"},"sequence_number":9} event: response.output_item.done - data: {"type":"response.output_item.done","item":{"id":"msg_0cc665730fb33c420169b2ff6a0d80819488ab542d9bbfef0c","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"Olá!"}],"role":"assistant"},"output_index":1,"sequence_number":10} + data: {"type":"response.output_item.done","item":{"id":"msg_019d0fbf74a564d6016a3c1181bdbc819384667dfe8e7de5c4","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"Olá!"}],"role":"assistant"},"output_index":1,"sequence_number":10} event: response.completed - data: {"type":"response.completed","response":{"id":"resp_0cc665730fb33c420169b2ff67a3e8819494bb7f11d4d3fd29","object":"response","created_at":1773338471,"status":"completed","background":false,"completed_at":1773338474,"content_filters":[{"blocked":false,"source_type":"prompt","content_filter_raw":[],"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"jailbreak":{"detected":false,"filtered":false}},"content_filter_offsets":{"start_offset":0,"end_offset":53,"check_offset":0}},{"blocked":false,"source_type":"completion","content_filter_raw":[],"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"protected_material_code":{"detected":false,"filtered":false},"protected_material_text":{"detected":false,"filtered":false}},"content_filter_offsets":{"start_offset":0,"end_offset":507,"check_offset":0}}],"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-5-mini","output":[{"id":"rs_0cc665730fb33c420169b2ff68d3dc8194b77e20590bd047af","type":"reasoning","summary":[]},{"id":"msg_0cc665730fb33c420169b2ff6a0d80819488ab542d9bbfef0c","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"Olá!"}],"role":"assistant"}],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":"medium","summary":null},"safety_identifier":null,"service_tier":"default","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":{"input_tokens":19,"input_tokens_details":{"cached_tokens":0},"output_tokens":132,"output_tokens_details":{"reasoning_tokens":64},"total_tokens":151},"user":null,"metadata":{}},"sequence_number":11} + data: {"type":"response.completed","response":{"id":"resp_019d0fbf74a564d6016a3c117e5b1c819382d1cf29a3ef79ce","object":"response","created_at":1782321534,"status":"completed","background":false,"completed_at":1782321537,"content_filters":[{"blocked":false,"source_type":"prompt","content_filter_raw":[],"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"jailbreak":{"detected":false,"filtered":false}},"content_filter_offsets":{"start_offset":0,"end_offset":1153,"check_offset":0}},{"blocked":false,"source_type":"completion","content_filter_raw":[],"content_filter_results":{"protected_material_text":{"detected":false,"filtered":false},"protected_material_code":{"detected":false,"filtered":false},"hate":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"}},"content_filter_offsets":{"start_offset":0,"end_offset":806,"check_offset":0}}],"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-5-mini","moderation":null,"output":[{"id":"rs_019d0fbf74a564d6016a3c117ec7f48193aa6caffcec1b7c3a","type":"reasoning","summary":[]},{"id":"msg_019d0fbf74a564d6016a3c1181bdbc819384667dfe8e7de5c4","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"Olá!"}],"role":"assistant"}],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":null,"effort":"medium","summary":null},"safety_identifier":null,"service_tier":"default","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":{"input_tokens":19,"input_tokens_details":{"cached_tokens":0},"output_tokens":208,"output_tokens_details":{"reasoning_tokens":192},"total_tokens":227},"user":null,"metadata":{}},"sequence_number":11} headers: Content-Type: - text/event-stream; charset=utf-8 status: 200 OK code: 200 - duration: 656.864916ms + duration: 596.923792ms diff --git a/providertests/testdata/TestAzureResponsesCommon/azure-gpt-5-mini/tool.yaml b/providertests/testdata/TestAzureResponsesCommon/azure-gpt-5-mini/tool.yaml index 61334fcc2..5de0aa829 100644 --- a/providertests/testdata/TestAzureResponsesCommon/azure-gpt-5-mini/tool.yaml +++ b/providertests/testdata/TestAzureResponsesCommon/azure-gpt-5-mini/tool.yaml @@ -15,22 +15,22 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://fantasy-playground-resource.openai.azure.com/openai/v1/responses method: POST response: proto: HTTP/2.0 proto_major: 2 proto_minor: 0 - content_length: 3537 + content_length: 3588 body: |- { - "id": "resp_01732c78a43466ae0169b2ff6aa4d88194822bbea5c052ca9f", + "id": "resp_00e5a268bd4f498e016a3c11823910819387c4785f9425ba40", "object": "response", - "created_at": 1773338474, + "created_at": 1782321538, "status": "completed", "background": false, - "completed_at": 1773338481, + "completed_at": 1782321539, "content_filters": [ { "blocked": false, @@ -60,7 +60,7 @@ interactions: }, "content_filter_offsets": { "start_offset": 0, - "end_offset": 70, + "end_offset": 1258, "check_offset": 0 } }, @@ -96,7 +96,7 @@ interactions: }, "content_filter_offsets": { "start_offset": 0, - "end_offset": 1395, + "end_offset": 302, "check_offset": 0 } } @@ -108,18 +108,19 @@ interactions: "max_output_tokens": 4000, "max_tool_calls": null, "model": "gpt-5-mini", + "moderation": null, "output": [ { - "id": "rs_01732c78a43466ae0169b2ff7005048194875b5d3f92871d49", + "id": "rs_00e5a268bd4f498e016a3c118290cc8193ab6b25eefe0bb53c", "type": "reasoning", "summary": [] }, { - "id": "fc_01732c78a43466ae0169b2ff70e3948194a75b7cb3ef8e0d55", + "id": "fc_00e5a268bd4f498e016a3c11837d748193871672cbe1407d2c", "type": "function_call", "status": "completed", "arguments": "{\"location\":\"Florence, Italy\"}", - "call_id": "call_yTCy7OpPv0Z8Y7VNP0LiMnqv", + "call_id": "call_z1COPRxqJjjzIcXQ8ghwnioC", "name": "weather" } ], @@ -127,8 +128,9 @@ interactions: "presence_penalty": 0.0, "previous_response_id": null, "prompt_cache_key": null, - "prompt_cache_retention": null, + "prompt_cache_retention": "in_memory", "reasoning": { + "context": null, "effort": "medium", "summary": null }, @@ -167,15 +169,15 @@ interactions: "top_p": 1.0, "truncation": "disabled", "usage": { - "input_tokens": 66, + "input_tokens": 63, "input_tokens_details": { "cached_tokens": 0 }, - "output_tokens": 85, + "output_tokens": 81, "output_tokens_details": { "reasoning_tokens": 0 }, - "total_tokens": 151 + "total_tokens": 144 }, "user": null, "metadata": {} @@ -185,37 +187,37 @@ interactions: - application/json status: 200 OK code: 200 - duration: 7.532447083s + duration: 1.841573875s - id: 1 request: proto: HTTP/1.1 proto_major: 1 proto_minor: 1 - content_length: 726 + content_length: 714 host: "" - body: '{"max_output_tokens":4000,"store":false,"input":[{"content":"You are a helpful assistant","role":"developer"},{"content":[{"text":"What''s the weather in Florence,Italy?","type":"input_text"}],"role":"user"},{"arguments":"\"{\\\"location\\\":\\\"Florence, Italy\\\"}\"","call_id":"call_yTCy7OpPv0Z8Y7VNP0LiMnqv","name":"weather","type":"function_call"},{"call_id":"call_yTCy7OpPv0Z8Y7VNP0LiMnqv","output":"40 C","type":"function_call_output"}],"model":"gpt-5-mini","tool_choice":"auto","tools":[{"strict":false,"parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"name":"weather","description":"Get weather information for a location","type":"function"}]}' + body: '{"max_output_tokens":4000,"store":false,"input":[{"content":"You are a helpful assistant","role":"developer"},{"content":[{"text":"What''s the weather in Florence,Italy?","type":"input_text"}],"role":"user"},{"arguments":"{\"location\":\"Florence, Italy\"}","call_id":"call_z1COPRxqJjjzIcXQ8ghwnioC","name":"weather","type":"function_call"},{"call_id":"call_z1COPRxqJjjzIcXQ8ghwnioC","output":"40 C","type":"function_call_output"}],"model":"gpt-5-mini","tool_choice":"auto","tools":[{"strict":false,"parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"name":"weather","description":"Get weather information for a location","type":"function"}]}' headers: Accept: - application/json Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://fantasy-playground-resource.openai.azure.com/openai/v1/responses method: POST response: proto: HTTP/2.0 proto_major: 2 proto_minor: 0 - content_length: 3333 + content_length: 3058 body: |- { - "id": "resp_0a4fc6712b6ac6210169b2ff72107c8197a726423119c97bf5", + "id": "resp_033e3c100fa2fc6e016a3c1184092c81949de8f93e90391a98", "object": "response", - "created_at": 1773338482, + "created_at": 1782321540, "status": "completed", "background": false, - "completed_at": 1773338488, + "completed_at": 1782321543, "content_filters": [ { "blocked": false, @@ -226,6 +228,10 @@ interactions: "detected": false, "filtered": false }, + "protected_material_text": { + "detected": false, + "filtered": false + }, "hate": { "filtered": false, "severity": "safe" @@ -241,15 +247,11 @@ interactions: "self_harm": { "filtered": false, "severity": "safe" - }, - "protected_material_text": { - "detected": false, - "filtered": false } }, "content_filter_offsets": { "start_offset": 0, - "end_offset": 2664, + "end_offset": 920, "check_offset": 0 } } @@ -261,14 +263,15 @@ interactions: "max_output_tokens": 4000, "max_tool_calls": null, "model": "gpt-5-mini", + "moderation": null, "output": [ { - "id": "rs_0a4fc6712b6ac6210169b2ff737f6c81978d25f7f4335790c0", + "id": "rs_033e3c100fa2fc6e016a3c11849d2c81949f004eabe29324b2", "type": "reasoning", "summary": [] }, { - "id": "msg_0a4fc6712b6ac6210169b2ff7654948197a45f97f3435a9e82", + "id": "msg_033e3c100fa2fc6e016a3c11871c3481949980e2cf1ab4e8e9", "type": "message", "status": "completed", "content": [ @@ -276,7 +279,7 @@ interactions: "type": "output_text", "annotations": [], "logprobs": [], - "text": "Current temperature in Florence, Italy: 40 \u00b0C (104 \u00b0F).\n\nIt's very hot \u2014 tips:\n- Stay hydrated and avoid prolonged sun exposure.\n- Wear light, breathable clothing and sunscreen.\n- Take breaks in air-conditioned or shaded places; avoid strenuous outdoor activity around midday.\n- Check for local heat advisories if you\u2019ll be outside long.\n\nWould you like an hourly forecast, a multi-day outlook, or weather for a different location?" + "text": "Current temperature in Florence, Italy: 40\u00b0C (104\u00b0F).\n\nWould you like a forecast, or more details (humidity, wind, hourly)?" } ], "role": "assistant" @@ -286,8 +289,9 @@ interactions: "presence_penalty": 0.0, "previous_response_id": null, "prompt_cache_key": null, - "prompt_cache_retention": null, + "prompt_cache_retention": "in_memory", "reasoning": { + "context": null, "effort": "medium", "summary": null }, @@ -326,15 +330,15 @@ interactions: "top_p": 1.0, "truncation": "disabled", "usage": { - "input_tokens": 97, + "input_tokens": 92, "input_tokens_details": { "cached_tokens": 0 }, - "output_tokens": 333, + "output_tokens": 223, "output_tokens_details": { - "reasoning_tokens": 192 + "reasoning_tokens": 128 }, - "total_tokens": 430 + "total_tokens": 315 }, "user": null, "metadata": {} @@ -344,4 +348,4 @@ interactions: - application/json status: 200 OK code: 200 - duration: 6.493260459s + duration: 3.952764125s diff --git a/providertests/testdata/TestAzureResponsesCommon/azure-gpt-5-mini/tool_streaming.yaml b/providertests/testdata/TestAzureResponsesCommon/azure-gpt-5-mini/tool_streaming.yaml index d9d1d092d..198f1a117 100644 --- a/providertests/testdata/TestAzureResponsesCommon/azure-gpt-5-mini/tool_streaming.yaml +++ b/providertests/testdata/TestAzureResponsesCommon/azure-gpt-5-mini/tool_streaming.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://fantasy-playground-resource.openai.azure.com/openai/v1/responses method: POST response: @@ -25,74 +25,74 @@ interactions: content_length: -1 body: |+ event: response.created - data: {"type":"response.created","response":{"id":"resp_00be770fd95642780169b2ff787a04819381df824383b37927","object":"response","created_at":1773338488,"status":"in_progress","background":false,"completed_at":null,"content_filters":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-5-mini","output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":"medium","summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":0} + data: {"type":"response.created","response":{"id":"resp_08521e071015afca016a3c1187fce481958fc22ce99a25e892","object":"response","created_at":1782321544,"status":"in_progress","background":false,"completed_at":null,"content_filters":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-5-mini","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":null,"effort":"medium","summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":0} event: response.in_progress - data: {"type":"response.in_progress","response":{"id":"resp_00be770fd95642780169b2ff787a04819381df824383b37927","object":"response","created_at":1773338488,"status":"in_progress","background":false,"completed_at":null,"content_filters":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-5-mini","output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":"medium","summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":1} + data: {"type":"response.in_progress","response":{"id":"resp_08521e071015afca016a3c1187fce481958fc22ce99a25e892","object":"response","created_at":1782321544,"status":"in_progress","background":false,"completed_at":null,"content_filters":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-5-mini","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":null,"effort":"medium","summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":1} event: response.output_item.added - data: {"type":"response.output_item.added","item":{"id":"rs_00be770fd95642780169b2ff7962948193a17e31f1d9f67c59","type":"reasoning","summary":[]},"output_index":0,"sequence_number":2} + data: {"type":"response.output_item.added","item":{"id":"rs_08521e071015afca016a3c11885604819587b10e1f52513bb5","type":"reasoning","summary":[]},"output_index":0,"sequence_number":2} event: response.output_item.done - data: {"type":"response.output_item.done","item":{"id":"rs_00be770fd95642780169b2ff7962948193a17e31f1d9f67c59","type":"reasoning","summary":[]},"output_index":0,"sequence_number":3} + data: {"type":"response.output_item.done","item":{"id":"rs_08521e071015afca016a3c11885604819587b10e1f52513bb5","type":"reasoning","summary":[]},"output_index":0,"sequence_number":3} event: response.output_item.added - data: {"type":"response.output_item.added","item":{"id":"fc_00be770fd95642780169b2ff7a431c8193bf98e343743fe0ad","type":"function_call","status":"in_progress","arguments":"","call_id":"call_orP7YgV13UgdVbsOUIkjr0db","name":"weather"},"output_index":1,"sequence_number":4} + data: {"type":"response.output_item.added","item":{"id":"fc_08521e071015afca016a3c118a75a081958ecd832ff0e67b25","type":"function_call","status":"in_progress","arguments":"","call_id":"call_zLPcxu60T5jzGjuiRIvlkoSt","name":"weather"},"output_index":1,"sequence_number":4} event: response.function_call_arguments.delta - data: {"type":"response.function_call_arguments.delta","delta":"{\"","item_id":"fc_00be770fd95642780169b2ff7a431c8193bf98e343743fe0ad","obfuscation":"ibQc4gr05OdpPB","output_index":1,"sequence_number":5} + data: {"type":"response.function_call_arguments.delta","delta":"{\"","item_id":"fc_08521e071015afca016a3c118a75a081958ecd832ff0e67b25","obfuscation":"0oyNP2YxeAzf6N","output_index":1,"sequence_number":5} event: response.function_call_arguments.delta - data: {"type":"response.function_call_arguments.delta","delta":"location","item_id":"fc_00be770fd95642780169b2ff7a431c8193bf98e343743fe0ad","obfuscation":"7HclfyVz","output_index":1,"sequence_number":6} + data: {"type":"response.function_call_arguments.delta","delta":"location","item_id":"fc_08521e071015afca016a3c118a75a081958ecd832ff0e67b25","obfuscation":"TZX2ompx","output_index":1,"sequence_number":6} event: response.function_call_arguments.delta - data: {"type":"response.function_call_arguments.delta","delta":"\":\"","item_id":"fc_00be770fd95642780169b2ff7a431c8193bf98e343743fe0ad","obfuscation":"L3hJDsqLl6FZ8","output_index":1,"sequence_number":7} + data: {"type":"response.function_call_arguments.delta","delta":"\":\"","item_id":"fc_08521e071015afca016a3c118a75a081958ecd832ff0e67b25","obfuscation":"DjU6vrQgW7LUQ","output_index":1,"sequence_number":7} event: response.function_call_arguments.delta - data: {"type":"response.function_call_arguments.delta","delta":"Flor","item_id":"fc_00be770fd95642780169b2ff7a431c8193bf98e343743fe0ad","obfuscation":"AUxsdGrxciBD","output_index":1,"sequence_number":8} + data: {"type":"response.function_call_arguments.delta","delta":"Flor","item_id":"fc_08521e071015afca016a3c118a75a081958ecd832ff0e67b25","obfuscation":"p54qQDqzKWSn","output_index":1,"sequence_number":8} event: response.function_call_arguments.delta - data: {"type":"response.function_call_arguments.delta","delta":"ence","item_id":"fc_00be770fd95642780169b2ff7a431c8193bf98e343743fe0ad","obfuscation":"v5wa1wf3w0uY","output_index":1,"sequence_number":9} + data: {"type":"response.function_call_arguments.delta","delta":"ence","item_id":"fc_08521e071015afca016a3c118a75a081958ecd832ff0e67b25","obfuscation":"Mm87DRgH6Ptq","output_index":1,"sequence_number":9} event: response.function_call_arguments.delta - data: {"type":"response.function_call_arguments.delta","delta":",","item_id":"fc_00be770fd95642780169b2ff7a431c8193bf98e343743fe0ad","obfuscation":"3fAC4XKe7mAEtmI","output_index":1,"sequence_number":10} + data: {"type":"response.function_call_arguments.delta","delta":",","item_id":"fc_08521e071015afca016a3c118a75a081958ecd832ff0e67b25","obfuscation":"G2471WoiWFCKSCu","output_index":1,"sequence_number":10} event: response.function_call_arguments.delta - data: {"type":"response.function_call_arguments.delta","delta":" Italy","item_id":"fc_00be770fd95642780169b2ff7a431c8193bf98e343743fe0ad","obfuscation":"O9m2eblvIH","output_index":1,"sequence_number":11} + data: {"type":"response.function_call_arguments.delta","delta":" Italy","item_id":"fc_08521e071015afca016a3c118a75a081958ecd832ff0e67b25","obfuscation":"bYipnOAhqN","output_index":1,"sequence_number":11} event: response.function_call_arguments.delta - data: {"type":"response.function_call_arguments.delta","delta":"\"}","item_id":"fc_00be770fd95642780169b2ff7a431c8193bf98e343743fe0ad","obfuscation":"gj70jyPgZhxiac","output_index":1,"sequence_number":12} + data: {"type":"response.function_call_arguments.delta","delta":"\"}","item_id":"fc_08521e071015afca016a3c118a75a081958ecd832ff0e67b25","obfuscation":"E9B8KXuPtzFTcg","output_index":1,"sequence_number":12} event: response.function_call_arguments.done - data: {"type":"response.function_call_arguments.done","arguments":"{\"location\":\"Florence, Italy\"}","item_id":"fc_00be770fd95642780169b2ff7a431c8193bf98e343743fe0ad","output_index":1,"sequence_number":13} + data: {"type":"response.function_call_arguments.done","arguments":"{\"location\":\"Florence, Italy\"}","item_id":"fc_08521e071015afca016a3c118a75a081958ecd832ff0e67b25","output_index":1,"sequence_number":13} event: response.output_item.done - data: {"type":"response.output_item.done","item":{"id":"fc_00be770fd95642780169b2ff7a431c8193bf98e343743fe0ad","type":"function_call","status":"completed","arguments":"{\"location\":\"Florence, Italy\"}","call_id":"call_orP7YgV13UgdVbsOUIkjr0db","name":"weather"},"output_index":1,"sequence_number":14} + data: {"type":"response.output_item.done","item":{"id":"fc_08521e071015afca016a3c118a75a081958ecd832ff0e67b25","type":"function_call","status":"completed","arguments":"{\"location\":\"Florence, Italy\"}","call_id":"call_zLPcxu60T5jzGjuiRIvlkoSt","name":"weather"},"output_index":1,"sequence_number":14} event: response.completed - data: {"type":"response.completed","response":{"id":"resp_00be770fd95642780169b2ff787a04819381df824383b37927","object":"response","created_at":1773338488,"status":"completed","background":false,"completed_at":1773338490,"content_filters":[{"blocked":false,"source_type":"prompt","content_filter_raw":[],"content_filter_results":{"jailbreak":{"detected":false,"filtered":false},"hate":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"}},"content_filter_offsets":{"start_offset":0,"end_offset":70,"check_offset":0}},{"blocked":false,"source_type":"completion","content_filter_raw":[],"content_filter_results":{"protected_material_text":{"detected":false,"filtered":false},"protected_material_code":{"detected":false,"filtered":false},"hate":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"}},"content_filter_offsets":{"start_offset":0,"end_offset":1501,"check_offset":0}}],"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-5-mini","output":[{"id":"rs_00be770fd95642780169b2ff7962948193a17e31f1d9f67c59","type":"reasoning","summary":[]},{"id":"fc_00be770fd95642780169b2ff7a431c8193bf98e343743fe0ad","type":"function_call","status":"completed","arguments":"{\"location\":\"Florence, Italy\"}","call_id":"call_orP7YgV13UgdVbsOUIkjr0db","name":"weather"}],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":"medium","summary":null},"safety_identifier":null,"service_tier":"default","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":{"input_tokens":66,"input_tokens_details":{"cached_tokens":0},"output_tokens":97,"output_tokens_details":{"reasoning_tokens":64},"total_tokens":163},"user":null,"metadata":{}},"sequence_number":15} + data: {"type":"response.completed","response":{"id":"resp_08521e071015afca016a3c1187fce481958fc22ce99a25e892","object":"response","created_at":1782321544,"status":"completed","background":false,"completed_at":1782321546,"content_filters":[{"blocked":false,"source_type":"prompt","content_filter_raw":[],"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"jailbreak":{"detected":false,"filtered":false}},"content_filter_offsets":{"start_offset":0,"end_offset":1258,"check_offset":0}},{"blocked":false,"source_type":"completion","content_filter_raw":[],"content_filter_results":{"protected_material_code":{"detected":false,"filtered":false},"protected_material_text":{"detected":false,"filtered":false},"hate":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"}},"content_filter_offsets":{"start_offset":0,"end_offset":395,"check_offset":0}}],"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-5-mini","moderation":null,"output":[{"id":"rs_08521e071015afca016a3c11885604819587b10e1f52513bb5","type":"reasoning","summary":[]},{"id":"fc_08521e071015afca016a3c118a75a081958ecd832ff0e67b25","type":"function_call","status":"completed","arguments":"{\"location\":\"Florence, Italy\"}","call_id":"call_zLPcxu60T5jzGjuiRIvlkoSt","name":"weather"}],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":null,"effort":"medium","summary":null},"safety_identifier":null,"service_tier":"default","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":{"input_tokens":63,"input_tokens_details":{"cached_tokens":0},"output_tokens":101,"output_tokens_details":{"reasoning_tokens":64},"total_tokens":164},"user":null,"metadata":{}},"sequence_number":15} headers: Content-Type: - text/event-stream; charset=utf-8 status: 200 OK code: 200 - duration: 405.6985ms + duration: 295.36425ms - id: 1 request: proto: HTTP/1.1 proto_major: 1 proto_minor: 1 - content_length: 740 + content_length: 728 host: "" - body: '{"max_output_tokens":4000,"store":false,"input":[{"content":"You are a helpful assistant","role":"developer"},{"content":[{"text":"What''s the weather in Florence,Italy?","type":"input_text"}],"role":"user"},{"arguments":"\"{\\\"location\\\":\\\"Florence, Italy\\\"}\"","call_id":"call_orP7YgV13UgdVbsOUIkjr0db","name":"weather","type":"function_call"},{"call_id":"call_orP7YgV13UgdVbsOUIkjr0db","output":"40 C","type":"function_call_output"}],"model":"gpt-5-mini","tool_choice":"auto","tools":[{"strict":false,"parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"name":"weather","description":"Get weather information for a location","type":"function"}],"stream":true}' + body: '{"max_output_tokens":4000,"store":false,"input":[{"content":"You are a helpful assistant","role":"developer"},{"content":[{"text":"What''s the weather in Florence,Italy?","type":"input_text"}],"role":"user"},{"arguments":"{\"location\":\"Florence, Italy\"}","call_id":"call_zLPcxu60T5jzGjuiRIvlkoSt","name":"weather","type":"function_call"},{"call_id":"call_zLPcxu60T5jzGjuiRIvlkoSt","output":"40 C","type":"function_call_output"}],"model":"gpt-5-mini","tool_choice":"auto","tools":[{"strict":false,"parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"name":"weather","description":"Get weather information for a location","type":"function"}],"stream":true}' headers: Accept: - application/json Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://fantasy-playground-resource.openai.azure.com/openai/v1/responses method: POST response: @@ -102,140 +102,134 @@ interactions: content_length: -1 body: |+ event: response.created - data: {"type":"response.created","response":{"id":"resp_0cd9063ccaae2df50169b2ff7ad6308195980a84d94df7acd4","object":"response","created_at":1773338490,"status":"in_progress","background":false,"completed_at":null,"content_filters":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-5-mini","output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":"medium","summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":0} + data: {"type":"response.created","response":{"id":"resp_020b171792fe1e11016a3c118aff548197ab04e6eb17ffaf2f","object":"response","created_at":1782321547,"status":"in_progress","background":false,"completed_at":null,"content_filters":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-5-mini","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":null,"effort":"medium","summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":0} event: response.in_progress - data: {"type":"response.in_progress","response":{"id":"resp_0cd9063ccaae2df50169b2ff7ad6308195980a84d94df7acd4","object":"response","created_at":1773338490,"status":"in_progress","background":false,"completed_at":null,"content_filters":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-5-mini","output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":"medium","summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":1} + data: {"type":"response.in_progress","response":{"id":"resp_020b171792fe1e11016a3c118aff548197ab04e6eb17ffaf2f","object":"response","created_at":1782321547,"status":"in_progress","background":false,"completed_at":null,"content_filters":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-5-mini","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":null,"effort":"medium","summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":1} event: response.output_item.added - data: {"type":"response.output_item.added","item":{"id":"rs_0cd9063ccaae2df50169b2ff7c75e48195991e1d4b2139dbcf","type":"reasoning","summary":[]},"output_index":0,"sequence_number":2} + data: {"type":"response.output_item.added","item":{"id":"rs_020b171792fe1e11016a3c118b52e081978f5e763ecb2c5956","type":"reasoning","summary":[]},"output_index":0,"sequence_number":2} event: response.output_item.done - data: {"type":"response.output_item.done","item":{"id":"rs_0cd9063ccaae2df50169b2ff7c75e48195991e1d4b2139dbcf","type":"reasoning","summary":[]},"output_index":0,"sequence_number":3} + data: {"type":"response.output_item.done","item":{"id":"rs_020b171792fe1e11016a3c118b52e081978f5e763ecb2c5956","type":"reasoning","summary":[]},"output_index":0,"sequence_number":3} event: response.output_item.added - data: {"type":"response.output_item.added","item":{"id":"msg_0cd9063ccaae2df50169b2ff7ecf788195b8853eff14d96f97","type":"message","status":"in_progress","content":[],"role":"assistant"},"output_index":1,"sequence_number":4} + data: {"type":"response.output_item.added","item":{"id":"msg_020b171792fe1e11016a3c118dd8b88197859d60931f13838c","type":"message","status":"in_progress","content":[],"role":"assistant"},"output_index":1,"sequence_number":4} event: response.content_part.added - data: {"type":"response.content_part.added","content_index":0,"item_id":"msg_0cd9063ccaae2df50169b2ff7ecf788195b8853eff14d96f97","output_index":1,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":""},"sequence_number":5} + data: {"type":"response.content_part.added","content_index":0,"item_id":"msg_020b171792fe1e11016a3c118dd8b88197859d60931f13838c","output_index":1,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":""},"sequence_number":5} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":"It's","item_id":"msg_0cd9063ccaae2df50169b2ff7ecf788195b8853eff14d96f97","logprobs":[],"obfuscation":"BJRPqakG1lqy","output_index":1,"sequence_number":6} + data: {"type":"response.output_text.delta","content_index":0,"delta":"Right","item_id":"msg_020b171792fe1e11016a3c118dd8b88197859d60931f13838c","logprobs":[],"obfuscation":"spy0146YTvT","output_index":1,"sequence_number":6} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" about","item_id":"msg_0cd9063ccaae2df50169b2ff7ecf788195b8853eff14d96f97","logprobs":[],"obfuscation":"CvjaKfe0io","output_index":1,"sequence_number":7} + data: {"type":"response.output_text.delta","content_index":0,"delta":" now","item_id":"msg_020b171792fe1e11016a3c118dd8b88197859d60931f13838c","logprobs":[],"obfuscation":"Z09uTddInKtr","output_index":1,"sequence_number":7} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" ","item_id":"msg_0cd9063ccaae2df50169b2ff7ecf788195b8853eff14d96f97","logprobs":[],"obfuscation":"UtxxBwDSpELi4to","output_index":1,"sequence_number":8} + data: {"type":"response.output_text.delta","content_index":0,"delta":" in","item_id":"msg_020b171792fe1e11016a3c118dd8b88197859d60931f13838c","logprobs":[],"obfuscation":"Jou0ZdffVQbLw","output_index":1,"sequence_number":8} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":"40","item_id":"msg_0cd9063ccaae2df50169b2ff7ecf788195b8853eff14d96f97","logprobs":[],"obfuscation":"bq5Ckz9WJxVlbk","output_index":1,"sequence_number":9} + data: {"type":"response.output_text.delta","content_index":0,"delta":" Florence","item_id":"msg_020b171792fe1e11016a3c118dd8b88197859d60931f13838c","logprobs":[],"obfuscation":"1PFwXRa","output_index":1,"sequence_number":9} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":"°C","item_id":"msg_0cd9063ccaae2df50169b2ff7ecf788195b8853eff14d96f97","logprobs":[],"obfuscation":"v8xn6RJ3u3P2YA","output_index":1,"sequence_number":10} + data: {"type":"response.output_text.delta","content_index":0,"delta":",","item_id":"msg_020b171792fe1e11016a3c118dd8b88197859d60931f13838c","logprobs":[],"obfuscation":"4UtAK6k1fcbbcOV","output_index":1,"sequence_number":10} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" (","item_id":"msg_0cd9063ccaae2df50169b2ff7ecf788195b8853eff14d96f97","logprobs":[],"obfuscation":"sZX6lE4g2P8irb","output_index":1,"sequence_number":11} + data: {"type":"response.output_text.delta","content_index":0,"delta":" Italy","item_id":"msg_020b171792fe1e11016a3c118dd8b88197859d60931f13838c","logprobs":[],"obfuscation":"jPwETzaRNp","output_index":1,"sequence_number":11} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":"104","item_id":"msg_0cd9063ccaae2df50169b2ff7ecf788195b8853eff14d96f97","logprobs":[],"obfuscation":"iAILT2sUEdzmO","output_index":1,"sequence_number":12} + data: {"type":"response.output_text.delta","content_index":0,"delta":" it","item_id":"msg_020b171792fe1e11016a3c118dd8b88197859d60931f13838c","logprobs":[],"obfuscation":"L1BVxQbce0QYd","output_index":1,"sequence_number":12} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":"°F","item_id":"msg_0cd9063ccaae2df50169b2ff7ecf788195b8853eff14d96f97","logprobs":[],"obfuscation":"dK7qgHlVIlQJst","output_index":1,"sequence_number":13} + data: {"type":"response.output_text.delta","content_index":0,"delta":"’s","item_id":"msg_020b171792fe1e11016a3c118dd8b88197859d60931f13838c","logprobs":[],"obfuscation":"7LfZ0GDz60nI4a","output_index":1,"sequence_number":13} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":")","item_id":"msg_0cd9063ccaae2df50169b2ff7ecf788195b8853eff14d96f97","logprobs":[],"obfuscation":"M9wn0IA0GrkBfdn","output_index":1,"sequence_number":14} + data: {"type":"response.output_text.delta","content_index":0,"delta":" ","item_id":"msg_020b171792fe1e11016a3c118dd8b88197859d60931f13838c","logprobs":[],"obfuscation":"wUUhUGenEKClfu3","output_index":1,"sequence_number":14} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" in","item_id":"msg_0cd9063ccaae2df50169b2ff7ecf788195b8853eff14d96f97","logprobs":[],"obfuscation":"UyRSBRdfsoMlT","output_index":1,"sequence_number":15} + data: {"type":"response.output_text.delta","content_index":0,"delta":"40","item_id":"msg_020b171792fe1e11016a3c118dd8b88197859d60931f13838c","logprobs":[],"obfuscation":"N6L6tkm7YBovkQ","output_index":1,"sequence_number":15} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" Florence","item_id":"msg_0cd9063ccaae2df50169b2ff7ecf788195b8853eff14d96f97","logprobs":[],"obfuscation":"hQ1raxr","output_index":1,"sequence_number":16} + data: {"type":"response.output_text.delta","content_index":0,"delta":"°C","item_id":"msg_020b171792fe1e11016a3c118dd8b88197859d60931f13838c","logprobs":[],"obfuscation":"j2bbN2qIVO02cr","output_index":1,"sequence_number":16} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":",","item_id":"msg_0cd9063ccaae2df50169b2ff7ecf788195b8853eff14d96f97","logprobs":[],"obfuscation":"5A3hiw9RGEL0sDS","output_index":1,"sequence_number":17} + data: {"type":"response.output_text.delta","content_index":0,"delta":" (","item_id":"msg_020b171792fe1e11016a3c118dd8b88197859d60931f13838c","logprobs":[],"obfuscation":"4QeStp0TvqB2T0","output_index":1,"sequence_number":17} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" Italy","item_id":"msg_0cd9063ccaae2df50169b2ff7ecf788195b8853eff14d96f97","logprobs":[],"obfuscation":"By7qr41e4q","output_index":1,"sequence_number":18} + data: {"type":"response.output_text.delta","content_index":0,"delta":"104","item_id":"msg_020b171792fe1e11016a3c118dd8b88197859d60931f13838c","logprobs":[],"obfuscation":"oZWSGIKMb4eHX","output_index":1,"sequence_number":18} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" right","item_id":"msg_0cd9063ccaae2df50169b2ff7ecf788195b8853eff14d96f97","logprobs":[],"obfuscation":"FQvm6pMcjw","output_index":1,"sequence_number":19} + data: {"type":"response.output_text.delta","content_index":0,"delta":"°F","item_id":"msg_020b171792fe1e11016a3c118dd8b88197859d60931f13838c","logprobs":[],"obfuscation":"PV7QlQx0QqkHSw","output_index":1,"sequence_number":19} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" now","item_id":"msg_0cd9063ccaae2df50169b2ff7ecf788195b8853eff14d96f97","logprobs":[],"obfuscation":"dVTJea0XGHeF","output_index":1,"sequence_number":20} + data: {"type":"response.output_text.delta","content_index":0,"delta":").","item_id":"msg_020b171792fe1e11016a3c118dd8b88197859d60931f13838c","logprobs":[],"obfuscation":"jZeUOJseXRND8a","output_index":1,"sequence_number":20} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":".","item_id":"msg_0cd9063ccaae2df50169b2ff7ecf788195b8853eff14d96f97","logprobs":[],"obfuscation":"iokyOWqwhrFh3G1","output_index":1,"sequence_number":21} + data: {"type":"response.output_text.delta","content_index":0,"delta":" Would","item_id":"msg_020b171792fe1e11016a3c118dd8b88197859d60931f13838c","logprobs":[],"obfuscation":"OM0Xmtddvz","output_index":1,"sequence_number":21} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" Would","item_id":"msg_0cd9063ccaae2df50169b2ff7ecf788195b8853eff14d96f97","logprobs":[],"obfuscation":"wa7FS9MsHP","output_index":1,"sequence_number":22} + data: {"type":"response.output_text.delta","content_index":0,"delta":" you","item_id":"msg_020b171792fe1e11016a3c118dd8b88197859d60931f13838c","logprobs":[],"obfuscation":"HSHZZxaxle01","output_index":1,"sequence_number":22} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" you","item_id":"msg_0cd9063ccaae2df50169b2ff7ecf788195b8853eff14d96f97","logprobs":[],"obfuscation":"6H9nBUUeXwB4","output_index":1,"sequence_number":23} + data: {"type":"response.output_text.delta","content_index":0,"delta":" like","item_id":"msg_020b171792fe1e11016a3c118dd8b88197859d60931f13838c","logprobs":[],"obfuscation":"dcAOocIfQeS","output_index":1,"sequence_number":23} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" like","item_id":"msg_0cd9063ccaae2df50169b2ff7ecf788195b8853eff14d96f97","logprobs":[],"obfuscation":"G1bHpCWBPaw","output_index":1,"sequence_number":24} + data: {"type":"response.output_text.delta","content_index":0,"delta":" an","item_id":"msg_020b171792fe1e11016a3c118dd8b88197859d60931f13838c","logprobs":[],"obfuscation":"3rsrPFmhi8FCE","output_index":1,"sequence_number":24} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" a","item_id":"msg_0cd9063ccaae2df50169b2ff7ecf788195b8853eff14d96f97","logprobs":[],"obfuscation":"8tsw2dulCrMRBl","output_index":1,"sequence_number":25} + data: {"type":"response.output_text.delta","content_index":0,"delta":" hourly","item_id":"msg_020b171792fe1e11016a3c118dd8b88197859d60931f13838c","logprobs":[],"obfuscation":"hhE1weOrZ","output_index":1,"sequence_number":25} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" forecast","item_id":"msg_0cd9063ccaae2df50169b2ff7ecf788195b8853eff14d96f97","logprobs":[],"obfuscation":"Zz6nJjA","output_index":1,"sequence_number":26} + data: {"type":"response.output_text.delta","content_index":0,"delta":" forecast","item_id":"msg_020b171792fe1e11016a3c118dd8b88197859d60931f13838c","logprobs":[],"obfuscation":"BBJL18v","output_index":1,"sequence_number":26} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":",","item_id":"msg_0cd9063ccaae2df50169b2ff7ecf788195b8853eff14d96f97","logprobs":[],"obfuscation":"c7nabKErXoDGR34","output_index":1,"sequence_number":27} + data: {"type":"response.output_text.delta","content_index":0,"delta":",","item_id":"msg_020b171792fe1e11016a3c118dd8b88197859d60931f13838c","logprobs":[],"obfuscation":"tUeTjJbuYYaxOul","output_index":1,"sequence_number":27} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" humidity","item_id":"msg_0cd9063ccaae2df50169b2ff7ecf788195b8853eff14d96f97","logprobs":[],"obfuscation":"Z6a7QXe","output_index":1,"sequence_number":28} + data: {"type":"response.output_text.delta","content_index":0,"delta":" the","item_id":"msg_020b171792fe1e11016a3c118dd8b88197859d60931f13838c","logprobs":[],"obfuscation":"FTvVdIDQxU0P","output_index":1,"sequence_number":28} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":"/w","item_id":"msg_0cd9063ccaae2df50169b2ff7ecf788195b8853eff14d96f97","logprobs":[],"obfuscation":"1wSxByh55RvFUF","output_index":1,"sequence_number":29} + data: {"type":"response.output_text.delta","content_index":0,"delta":" next","item_id":"msg_020b171792fe1e11016a3c118dd8b88197859d60931f13838c","logprobs":[],"obfuscation":"IjXhz6eCsyi","output_index":1,"sequence_number":29} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":"ind","item_id":"msg_0cd9063ccaae2df50169b2ff7ecf788195b8853eff14d96f97","logprobs":[],"obfuscation":"Lb24ZTVSdHdPl","output_index":1,"sequence_number":30} + data: {"type":"response.output_text.delta","content_index":0,"delta":" few","item_id":"msg_020b171792fe1e11016a3c118dd8b88197859d60931f13838c","logprobs":[],"obfuscation":"U35O1bmFgp3a","output_index":1,"sequence_number":30} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" details","item_id":"msg_0cd9063ccaae2df50169b2ff7ecf788195b8853eff14d96f97","logprobs":[],"obfuscation":"DWwfzrPD","output_index":1,"sequence_number":31} + data: {"type":"response.output_text.delta","content_index":0,"delta":" days","item_id":"msg_020b171792fe1e11016a3c118dd8b88197859d60931f13838c","logprobs":[],"obfuscation":"H2x0GGZnUdW","output_index":1,"sequence_number":31} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":",","item_id":"msg_0cd9063ccaae2df50169b2ff7ecf788195b8853eff14d96f97","logprobs":[],"obfuscation":"LCp7KBd4TqWaSvf","output_index":1,"sequence_number":32} + data: {"type":"response.output_text.delta","content_index":0,"delta":",","item_id":"msg_020b171792fe1e11016a3c118dd8b88197859d60931f13838c","logprobs":[],"obfuscation":"s5VLaHw1AmtwWiW","output_index":1,"sequence_number":32} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" or","item_id":"msg_0cd9063ccaae2df50169b2ff7ecf788195b8853eff14d96f97","logprobs":[],"obfuscation":"dIKmmIa7E44fc","output_index":1,"sequence_number":33} + data: {"type":"response.output_text.delta","content_index":0,"delta":" or","item_id":"msg_020b171792fe1e11016a3c118dd8b88197859d60931f13838c","logprobs":[],"obfuscation":"SQXOfYaslUWHg","output_index":1,"sequence_number":33} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" safety","item_id":"msg_0cd9063ccaae2df50169b2ff7ecf788195b8853eff14d96f97","logprobs":[],"obfuscation":"PU8nPBkVu","output_index":1,"sequence_number":34} + data: {"type":"response.output_text.delta","content_index":0,"delta":" any","item_id":"msg_020b171792fe1e11016a3c118dd8b88197859d60931f13838c","logprobs":[],"obfuscation":"jOKcwELgGr99","output_index":1,"sequence_number":34} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" tips","item_id":"msg_0cd9063ccaae2df50169b2ff7ecf788195b8853eff14d96f97","logprobs":[],"obfuscation":"O0gnUymFHmE","output_index":1,"sequence_number":35} + data: {"type":"response.output_text.delta","content_index":0,"delta":" weather","item_id":"msg_020b171792fe1e11016a3c118dd8b88197859d60931f13838c","logprobs":[],"obfuscation":"xhd430ft","output_index":1,"sequence_number":35} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" for","item_id":"msg_0cd9063ccaae2df50169b2ff7ecf788195b8853eff14d96f97","logprobs":[],"obfuscation":"ChQ6YKS4V1HW","output_index":1,"sequence_number":36} + data: {"type":"response.output_text.delta","content_index":0,"delta":" alerts","item_id":"msg_020b171792fe1e11016a3c118dd8b88197859d60931f13838c","logprobs":[],"obfuscation":"fusbsYHIG","output_index":1,"sequence_number":36} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" the","item_id":"msg_0cd9063ccaae2df50169b2ff7ecf788195b8853eff14d96f97","logprobs":[],"obfuscation":"YzOFSusFC1aX","output_index":1,"sequence_number":37} - - event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" heat","item_id":"msg_0cd9063ccaae2df50169b2ff7ecf788195b8853eff14d96f97","logprobs":[],"obfuscation":"TAohXyOJHWY","output_index":1,"sequence_number":38} - - event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":"?","item_id":"msg_0cd9063ccaae2df50169b2ff7ecf788195b8853eff14d96f97","logprobs":[],"obfuscation":"GbUlgpPg0Az2PTY","output_index":1,"sequence_number":39} + data: {"type":"response.output_text.delta","content_index":0,"delta":"?","item_id":"msg_020b171792fe1e11016a3c118dd8b88197859d60931f13838c","logprobs":[],"obfuscation":"eneCPGelv2sYhtP","output_index":1,"sequence_number":37} event: response.output_text.done - data: {"type":"response.output_text.done","content_index":0,"item_id":"msg_0cd9063ccaae2df50169b2ff7ecf788195b8853eff14d96f97","logprobs":[],"output_index":1,"sequence_number":40,"text":"It's about 40°C (104°F) in Florence, Italy right now. Would you like a forecast, humidity/wind details, or safety tips for the heat?"} + data: {"type":"response.output_text.done","content_index":0,"item_id":"msg_020b171792fe1e11016a3c118dd8b88197859d60931f13838c","logprobs":[],"output_index":1,"sequence_number":38,"text":"Right now in Florence, Italy it’s 40°C (104°F). Would you like an hourly forecast, the next few days, or any weather alerts?"} event: response.content_part.done - data: {"type":"response.content_part.done","content_index":0,"item_id":"msg_0cd9063ccaae2df50169b2ff7ecf788195b8853eff14d96f97","output_index":1,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":"It's about 40°C (104°F) in Florence, Italy right now. Would you like a forecast, humidity/wind details, or safety tips for the heat?"},"sequence_number":41} + data: {"type":"response.content_part.done","content_index":0,"item_id":"msg_020b171792fe1e11016a3c118dd8b88197859d60931f13838c","output_index":1,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":"Right now in Florence, Italy it’s 40°C (104°F). Would you like an hourly forecast, the next few days, or any weather alerts?"},"sequence_number":39} event: response.output_item.done - data: {"type":"response.output_item.done","item":{"id":"msg_0cd9063ccaae2df50169b2ff7ecf788195b8853eff14d96f97","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"It's about 40°C (104°F) in Florence, Italy right now. Would you like a forecast, humidity/wind details, or safety tips for the heat?"}],"role":"assistant"},"output_index":1,"sequence_number":42} + data: {"type":"response.output_item.done","item":{"id":"msg_020b171792fe1e11016a3c118dd8b88197859d60931f13838c","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"Right now in Florence, Italy it’s 40°C (104°F). Would you like an hourly forecast, the next few days, or any weather alerts?"}],"role":"assistant"},"output_index":1,"sequence_number":40} event: response.completed - data: {"type":"response.completed","response":{"id":"resp_0cd9063ccaae2df50169b2ff7ad6308195980a84d94df7acd4","object":"response","created_at":1773338490,"status":"completed","background":false,"completed_at":1773338495,"content_filters":[{"blocked":false,"source_type":"completion","content_filter_raw":[],"content_filter_results":{"protected_material_code":{"detected":false,"filtered":false},"hate":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"protected_material_text":{"detected":false,"filtered":false}},"content_filter_offsets":{"start_offset":0,"end_offset":2077,"check_offset":0}}],"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-5-mini","output":[{"id":"rs_0cd9063ccaae2df50169b2ff7c75e48195991e1d4b2139dbcf","type":"reasoning","summary":[]},{"id":"msg_0cd9063ccaae2df50169b2ff7ecf788195b8853eff14d96f97","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"It's about 40°C (104°F) in Florence, Italy right now. Would you like a forecast, humidity/wind details, or safety tips for the heat?"}],"role":"assistant"}],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":"medium","summary":null},"safety_identifier":null,"service_tier":"default","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":{"input_tokens":97,"input_tokens_details":{"cached_tokens":0},"output_tokens":231,"output_tokens_details":{"reasoning_tokens":128},"total_tokens":328},"user":null,"metadata":{}},"sequence_number":43} + data: {"type":"response.completed","response":{"id":"resp_020b171792fe1e11016a3c118aff548197ab04e6eb17ffaf2f","object":"response","created_at":1782321547,"status":"completed","background":false,"completed_at":1782321550,"content_filters":[{"blocked":false,"source_type":"completion","content_filter_raw":[],"content_filter_results":{"protected_material_code":{"detected":false,"filtered":false},"protected_material_text":{"detected":false,"filtered":false},"hate":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"}},"content_filter_offsets":{"start_offset":0,"end_offset":955,"check_offset":0}}],"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-5-mini","moderation":null,"output":[{"id":"rs_020b171792fe1e11016a3c118b52e081978f5e763ecb2c5956","type":"reasoning","summary":[]},{"id":"msg_020b171792fe1e11016a3c118dd8b88197859d60931f13838c","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"Right now in Florence, Italy it’s 40°C (104°F). Would you like an hourly forecast, the next few days, or any weather alerts?"}],"role":"assistant"}],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":null,"effort":"medium","summary":null},"safety_identifier":null,"service_tier":"default","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":{"input_tokens":92,"input_tokens_details":{"cached_tokens":0},"output_tokens":230,"output_tokens_details":{"reasoning_tokens":192},"total_tokens":322},"user":null,"metadata":{}},"sequence_number":41} headers: Content-Type: - text/event-stream; charset=utf-8 status: 200 OK code: 200 - duration: 477.693542ms + duration: 285.59675ms diff --git a/providertests/testdata/TestAzureResponsesCommon/azure-o4-mini/simple.yaml b/providertests/testdata/TestAzureResponsesCommon/azure-o4-mini/simple.yaml index 0b55fda1f..af160ce4a 100644 --- a/providertests/testdata/TestAzureResponsesCommon/azure-o4-mini/simple.yaml +++ b/providertests/testdata/TestAzureResponsesCommon/azure-o4-mini/simple.yaml @@ -15,22 +15,22 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://fantasy-playground-resource.openai.azure.com/openai/v1/responses method: POST response: proto: HTTP/2.0 proto_major: 2 proto_minor: 0 - content_length: 3190 + content_length: 3235 body: |- { - "id": "resp_0f4e883cc905fc1e0169b2ff7fc1e48193b221a8039d45d7f5", + "id": "resp_0a58856642efb43f016a3c118ee2f88190ba0dbd3f7d288993", "object": "response", - "created_at": 1773338495, + "created_at": 1782321550, "status": "completed", "background": false, - "completed_at": 1773338497, + "completed_at": 1782321552, "content_filters": [ { "blocked": false, @@ -60,7 +60,7 @@ interactions: }, "content_filter_offsets": { "start_offset": 0, - "end_offset": 53, + "end_offset": 624, "check_offset": 0 } }, @@ -69,6 +69,14 @@ interactions: "source_type": "completion", "content_filter_raw": [], "content_filter_results": { + "protected_material_code": { + "detected": false, + "filtered": false + }, + "protected_material_text": { + "detected": false, + "filtered": false + }, "hate": { "filtered": false, "severity": "safe" @@ -84,19 +92,11 @@ interactions: "self_harm": { "filtered": false, "severity": "safe" - }, - "protected_material_code": { - "detected": false, - "filtered": false - }, - "protected_material_text": { - "detected": false, - "filtered": false } }, "content_filter_offsets": { "start_offset": 0, - "end_offset": 258, + "end_offset": 289, "check_offset": 0 } } @@ -108,14 +108,15 @@ interactions: "max_output_tokens": 4000, "max_tool_calls": null, "model": "o4-mini", + "moderation": null, "output": [ { - "id": "rs_0f4e883cc905fc1e0169b2ff80a02c8193ae05ac582273c1a1", + "id": "rs_0a58856642efb43f016a3c118fa2188190af1762536f86bde1", "type": "reasoning", "summary": [] }, { - "id": "msg_0f4e883cc905fc1e0169b2ff813c888193b2f274ebc8bfff99", + "id": "msg_0a58856642efb43f016a3c11904448819098abb7f2f49a5464", "type": "message", "status": "completed", "content": [ @@ -123,7 +124,7 @@ interactions: "type": "output_text", "annotations": [], "logprobs": [], - "text": "Ol\u00e1!" + "text": "Oi!" } ], "role": "assistant" @@ -133,8 +134,9 @@ interactions: "presence_penalty": 0.0, "previous_response_id": null, "prompt_cache_key": null, - "prompt_cache_retention": null, + "prompt_cache_retention": "in_memory", "reasoning": { + "context": null, "effort": "medium", "summary": null }, @@ -158,11 +160,11 @@ interactions: "input_tokens_details": { "cached_tokens": 0 }, - "output_tokens": 83, + "output_tokens": 88, "output_tokens_details": { "reasoning_tokens": 64 }, - "total_tokens": 102 + "total_tokens": 107 }, "user": null, "metadata": {} @@ -172,4 +174,4 @@ interactions: - application/json status: 200 OK code: 200 - duration: 2.021153417s + duration: 1.907833417s diff --git a/providertests/testdata/TestAzureResponsesCommon/azure-o4-mini/simple_streaming.yaml b/providertests/testdata/TestAzureResponsesCommon/azure-o4-mini/simple_streaming.yaml index 36f2646ed..fc7e109e6 100644 --- a/providertests/testdata/TestAzureResponsesCommon/azure-o4-mini/simple_streaming.yaml +++ b/providertests/testdata/TestAzureResponsesCommon/azure-o4-mini/simple_streaming.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://fantasy-playground-resource.openai.azure.com/openai/v1/responses method: POST response: @@ -25,44 +25,44 @@ interactions: content_length: -1 body: |+ event: response.created - data: {"type":"response.created","response":{"id":"resp_04fc898e14d0ea490169b2ff81bc3c81949764e3e1c83e9211","object":"response","created_at":1773338497,"status":"in_progress","background":false,"completed_at":null,"content_filters":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"o4-mini","output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":"medium","summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":0} + data: {"type":"response.created","response":{"id":"resp_0294ec2b2874383a016a3c1190a2588193a058fa3754f8363a","object":"response","created_at":1782321552,"status":"in_progress","background":false,"completed_at":null,"content_filters":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"o4-mini","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":null,"effort":"medium","summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":0} event: response.in_progress - data: {"type":"response.in_progress","response":{"id":"resp_04fc898e14d0ea490169b2ff81bc3c81949764e3e1c83e9211","object":"response","created_at":1773338497,"status":"in_progress","background":false,"completed_at":null,"content_filters":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"o4-mini","output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":"medium","summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":1} + data: {"type":"response.in_progress","response":{"id":"resp_0294ec2b2874383a016a3c1190a2588193a058fa3754f8363a","object":"response","created_at":1782321552,"status":"in_progress","background":false,"completed_at":null,"content_filters":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"o4-mini","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":null,"effort":"medium","summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":1} event: response.output_item.added - data: {"type":"response.output_item.added","item":{"id":"rs_04fc898e14d0ea490169b2ff8274d88194822a9151c093580d","type":"reasoning","summary":[]},"output_index":0,"sequence_number":2} + data: {"type":"response.output_item.added","item":{"id":"rs_0294ec2b2874383a016a3c1191552c8193a6cd3f877a998475","type":"reasoning","summary":[]},"output_index":0,"sequence_number":2} event: response.output_item.done - data: {"type":"response.output_item.done","item":{"id":"rs_04fc898e14d0ea490169b2ff8274d88194822a9151c093580d","type":"reasoning","summary":[]},"output_index":0,"sequence_number":3} + data: {"type":"response.output_item.done","item":{"id":"rs_0294ec2b2874383a016a3c1191552c8193a6cd3f877a998475","type":"reasoning","summary":[]},"output_index":0,"sequence_number":3} event: response.output_item.added - data: {"type":"response.output_item.added","item":{"id":"msg_04fc898e14d0ea490169b2ff83ded88194bff5ae050886c4c5","type":"message","status":"in_progress","content":[],"role":"assistant"},"output_index":1,"sequence_number":4} + data: {"type":"response.output_item.added","item":{"id":"msg_0294ec2b2874383a016a3c1192175881938404a7efcbaa1d8d","type":"message","status":"in_progress","content":[],"role":"assistant"},"output_index":1,"sequence_number":4} event: response.content_part.added - data: {"type":"response.content_part.added","content_index":0,"item_id":"msg_04fc898e14d0ea490169b2ff83ded88194bff5ae050886c4c5","output_index":1,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":""},"sequence_number":5} + data: {"type":"response.content_part.added","content_index":0,"item_id":"msg_0294ec2b2874383a016a3c1192175881938404a7efcbaa1d8d","output_index":1,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":""},"sequence_number":5} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":"Oi","item_id":"msg_04fc898e14d0ea490169b2ff83ded88194bff5ae050886c4c5","logprobs":[],"obfuscation":"Ka4mU0T5g6sMHB","output_index":1,"sequence_number":6} + data: {"type":"response.output_text.delta","content_index":0,"delta":"Olá","item_id":"msg_0294ec2b2874383a016a3c1192175881938404a7efcbaa1d8d","logprobs":[],"obfuscation":"GTsTlJhI9pxQ7","output_index":1,"sequence_number":6} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":"!","item_id":"msg_04fc898e14d0ea490169b2ff83ded88194bff5ae050886c4c5","logprobs":[],"obfuscation":"NFiL17IUyRMMYJX","output_index":1,"sequence_number":7} + data: {"type":"response.output_text.delta","content_index":0,"delta":"!","item_id":"msg_0294ec2b2874383a016a3c1192175881938404a7efcbaa1d8d","logprobs":[],"obfuscation":"yqA7PrYarcSFrLM","output_index":1,"sequence_number":7} event: response.output_text.done - data: {"type":"response.output_text.done","content_index":0,"item_id":"msg_04fc898e14d0ea490169b2ff83ded88194bff5ae050886c4c5","logprobs":[],"output_index":1,"sequence_number":8,"text":"Oi!"} + data: {"type":"response.output_text.done","content_index":0,"item_id":"msg_0294ec2b2874383a016a3c1192175881938404a7efcbaa1d8d","logprobs":[],"output_index":1,"sequence_number":8,"text":"Olá!"} event: response.content_part.done - data: {"type":"response.content_part.done","content_index":0,"item_id":"msg_04fc898e14d0ea490169b2ff83ded88194bff5ae050886c4c5","output_index":1,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":"Oi!"},"sequence_number":9} + data: {"type":"response.content_part.done","content_index":0,"item_id":"msg_0294ec2b2874383a016a3c1192175881938404a7efcbaa1d8d","output_index":1,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":"Olá!"},"sequence_number":9} event: response.output_item.done - data: {"type":"response.output_item.done","item":{"id":"msg_04fc898e14d0ea490169b2ff83ded88194bff5ae050886c4c5","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"Oi!"}],"role":"assistant"},"output_index":1,"sequence_number":10} + data: {"type":"response.output_item.done","item":{"id":"msg_0294ec2b2874383a016a3c1192175881938404a7efcbaa1d8d","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"Olá!"}],"role":"assistant"},"output_index":1,"sequence_number":10} event: response.completed - data: {"type":"response.completed","response":{"id":"resp_04fc898e14d0ea490169b2ff81bc3c81949764e3e1c83e9211","object":"response","created_at":1773338497,"status":"completed","background":false,"completed_at":1773338500,"content_filters":[{"blocked":false,"source_type":"prompt","content_filter_raw":[],"content_filter_results":{"jailbreak":{"detected":false,"filtered":false},"hate":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"}},"content_filter_offsets":{"start_offset":0,"end_offset":53,"check_offset":0}},{"blocked":false,"source_type":"completion","content_filter_raw":[],"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"protected_material_code":{"detected":false,"filtered":false},"protected_material_text":{"detected":false,"filtered":false}},"content_filter_offsets":{"start_offset":0,"end_offset":618,"check_offset":0}}],"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"o4-mini","output":[{"id":"rs_04fc898e14d0ea490169b2ff8274d88194822a9151c093580d","type":"reasoning","summary":[]},{"id":"msg_04fc898e14d0ea490169b2ff83ded88194bff5ae050886c4c5","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"Oi!"}],"role":"assistant"}],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":"medium","summary":null},"safety_identifier":null,"service_tier":"default","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":{"input_tokens":19,"input_tokens_details":{"cached_tokens":0},"output_tokens":187,"output_tokens_details":{"reasoning_tokens":128},"total_tokens":206},"user":null,"metadata":{}},"sequence_number":11} + data: {"type":"response.completed","response":{"id":"resp_0294ec2b2874383a016a3c1190a2588193a058fa3754f8363a","object":"response","created_at":1782321552,"status":"completed","background":false,"completed_at":1782321554,"content_filters":[{"blocked":false,"source_type":"prompt","content_filter_raw":[],"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"jailbreak":{"detected":false,"filtered":false}},"content_filter_offsets":{"start_offset":0,"end_offset":624,"check_offset":0}},{"blocked":false,"source_type":"completion","content_filter_raw":[],"content_filter_results":{"protected_material_code":{"detected":false,"filtered":false},"protected_material_text":{"detected":false,"filtered":false},"hate":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"}},"content_filter_offsets":{"start_offset":0,"end_offset":328,"check_offset":0}}],"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"o4-mini","moderation":null,"output":[{"id":"rs_0294ec2b2874383a016a3c1191552c8193a6cd3f877a998475","type":"reasoning","summary":[]},{"id":"msg_0294ec2b2874383a016a3c1192175881938404a7efcbaa1d8d","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"Olá!"}],"role":"assistant"}],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":null,"effort":"medium","summary":null},"safety_identifier":null,"service_tier":"default","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":{"input_tokens":19,"input_tokens_details":{"cached_tokens":0},"output_tokens":102,"output_tokens_details":{"reasoning_tokens":64},"total_tokens":121},"user":null,"metadata":{}},"sequence_number":11} headers: Content-Type: - text/event-stream; charset=utf-8 status: 200 OK code: 200 - duration: 312.682959ms + duration: 299.991375ms diff --git a/providertests/testdata/TestAzureResponsesCommon/azure-o4-mini/tool.yaml b/providertests/testdata/TestAzureResponsesCommon/azure-o4-mini/tool.yaml index 650837a44..a7d7f7bd7 100644 --- a/providertests/testdata/TestAzureResponsesCommon/azure-o4-mini/tool.yaml +++ b/providertests/testdata/TestAzureResponsesCommon/azure-o4-mini/tool.yaml @@ -15,32 +15,28 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://fantasy-playground-resource.openai.azure.com/openai/v1/responses method: POST response: proto: HTTP/2.0 proto_major: 2 proto_minor: 0 - content_length: 3536 + content_length: 3584 body: |- { - "id": "resp_0d5a3f5fc3c510f50169b2ff847220819693f7f8870c970a80", + "id": "resp_019ff363f9805048016a3c119295bc81958013ee3edd24b8bb", "object": "response", - "created_at": 1773338500, + "created_at": 1782321554, "status": "completed", "background": false, - "completed_at": 1773338503, + "completed_at": 1782321555, "content_filters": [ { "blocked": false, "source_type": "prompt", "content_filter_raw": [], "content_filter_results": { - "jailbreak": { - "detected": false, - "filtered": false - }, "hate": { "filtered": false, "severity": "safe" @@ -56,6 +52,10 @@ interactions: "self_harm": { "filtered": false, "severity": "safe" + }, + "jailbreak": { + "detected": false, + "filtered": false } }, "content_filter_offsets": { @@ -69,6 +69,14 @@ interactions: "source_type": "completion", "content_filter_raw": [], "content_filter_results": { + "protected_material_code": { + "detected": false, + "filtered": false + }, + "protected_material_text": { + "detected": false, + "filtered": false + }, "hate": { "filtered": false, "severity": "safe" @@ -84,19 +92,11 @@ interactions: "self_harm": { "filtered": false, "severity": "safe" - }, - "protected_material_code": { - "detected": false, - "filtered": false - }, - "protected_material_text": { - "detected": false, - "filtered": false } }, "content_filter_offsets": { "start_offset": 0, - "end_offset": 924, + "end_offset": 219, "check_offset": 0 } } @@ -108,18 +108,19 @@ interactions: "max_output_tokens": 4000, "max_tool_calls": null, "model": "o4-mini", + "moderation": null, "output": [ { - "id": "rs_0d5a3f5fc3c510f50169b2ff854c9c81969c28992fd9d7fbf5", + "id": "rs_019ff363f9805048016a3c11934d188195bc5a9bafbdee1a69", "type": "reasoning", "summary": [] }, { - "id": "fc_0d5a3f5fc3c510f50169b2ff8648ac81968ee858470612f8fb", + "id": "fc_019ff363f9805048016a3c1193bff081958dc43c8c346f97cd", "type": "function_call", "status": "completed", "arguments": "{\"location\":\"Florence, Italy\"}", - "call_id": "call_oRbm1gocfCvhluvIleM1B7gS", + "call_id": "call_IGW3vuAPuvzl8LXGlagSAxaT", "name": "weather" } ], @@ -127,8 +128,9 @@ interactions: "presence_penalty": 0.0, "previous_response_id": null, "prompt_cache_key": null, - "prompt_cache_retention": null, + "prompt_cache_retention": "in_memory", "reasoning": { + "context": null, "effort": "medium", "summary": null }, @@ -167,15 +169,15 @@ interactions: "top_p": 1.0, "truncation": "disabled", "usage": { - "input_tokens": 61, + "input_tokens": 60, "input_tokens_details": { "cached_tokens": 0 }, - "output_tokens": 135, + "output_tokens": 63, "output_tokens_details": { - "reasoning_tokens": 64 + "reasoning_tokens": 0 }, - "total_tokens": 196 + "total_tokens": 123 }, "user": null, "metadata": {} @@ -185,43 +187,51 @@ interactions: - application/json status: 200 OK code: 200 - duration: 3.199884959s + duration: 1.468080625s - id: 1 request: proto: HTTP/1.1 proto_major: 1 proto_minor: 1 - content_length: 723 + content_length: 711 host: "" - body: '{"max_output_tokens":4000,"store":false,"input":[{"content":"You are a helpful assistant","role":"developer"},{"content":[{"text":"What''s the weather in Florence,Italy?","type":"input_text"}],"role":"user"},{"arguments":"\"{\\\"location\\\":\\\"Florence, Italy\\\"}\"","call_id":"call_oRbm1gocfCvhluvIleM1B7gS","name":"weather","type":"function_call"},{"call_id":"call_oRbm1gocfCvhluvIleM1B7gS","output":"40 C","type":"function_call_output"}],"model":"o4-mini","tool_choice":"auto","tools":[{"strict":false,"parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"name":"weather","description":"Get weather information for a location","type":"function"}]}' + body: '{"max_output_tokens":4000,"store":false,"input":[{"content":"You are a helpful assistant","role":"developer"},{"content":[{"text":"What''s the weather in Florence,Italy?","type":"input_text"}],"role":"user"},{"arguments":"{\"location\":\"Florence, Italy\"}","call_id":"call_IGW3vuAPuvzl8LXGlagSAxaT","name":"weather","type":"function_call"},{"call_id":"call_IGW3vuAPuvzl8LXGlagSAxaT","output":"40 C","type":"function_call_output"}],"model":"o4-mini","tool_choice":"auto","tools":[{"strict":false,"parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"name":"weather","description":"Get weather information for a location","type":"function"}]}' headers: Accept: - application/json Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://fantasy-playground-resource.openai.azure.com/openai/v1/responses method: POST response: proto: HTTP/2.0 proto_major: 2 proto_minor: 0 - content_length: 2889 + content_length: 3151 body: |- { - "id": "resp_065b7e7b1587e20e0169b2ff87c14c8190b2868ef14a41003c", + "id": "resp_03a2815a6f4c20c0016a3c11941e208197b12b1fc83be2b4c6", "object": "response", - "created_at": 1773338503, + "created_at": 1782321556, "status": "completed", "background": false, - "completed_at": 1773338504, + "completed_at": 1782321557, "content_filters": [ { "blocked": false, "source_type": "completion", "content_filter_raw": [], "content_filter_results": { + "protected_material_code": { + "detected": false, + "filtered": false + }, + "protected_material_text": { + "detected": false, + "filtered": false + }, "hate": { "filtered": false, "severity": "safe" @@ -237,19 +247,11 @@ interactions: "self_harm": { "filtered": false, "severity": "safe" - }, - "protected_material_code": { - "detected": false, - "filtered": false - }, - "protected_material_text": { - "detected": false, - "filtered": false } }, "content_filter_offsets": { "start_offset": 0, - "end_offset": 514, + "end_offset": 724, "check_offset": 0 } } @@ -261,9 +263,15 @@ interactions: "max_output_tokens": 4000, "max_tool_calls": null, "model": "o4-mini", + "moderation": null, "output": [ { - "id": "msg_065b7e7b1587e20e0169b2ff8881a881908702d31895cc8a8e", + "id": "rs_03a2815a6f4c20c0016a3c119492688197b527a8dd992b87be", + "type": "reasoning", + "summary": [] + }, + { + "id": "msg_03a2815a6f4c20c0016a3c1195459c8197b3dfa450f26fa2e6", "type": "message", "status": "completed", "content": [ @@ -271,7 +279,7 @@ interactions: "type": "output_text", "annotations": [], "logprobs": [], - "text": "The current temperature in Florence, Italy is 40\u00b0C. It's quite hot! Make sure to stay hydrated and seek shade during the hottest parts of the day." + "text": "Right now it\u2019s 40 \u00b0C (about 104 \u00b0F) in Florence \u2013 quite hot! Make sure to stay hydrated, seek shade or air\u2010conditioned spots when you can, and wear light, breathable clothing if you\u2019re heading outdoors." } ], "role": "assistant" @@ -281,8 +289,9 @@ interactions: "presence_penalty": 0.0, "previous_response_id": null, "prompt_cache_key": null, - "prompt_cache_retention": null, + "prompt_cache_retention": "in_memory", "reasoning": { + "context": null, "effort": "medium", "summary": null }, @@ -321,15 +330,15 @@ interactions: "top_p": 1.0, "truncation": "disabled", "usage": { - "input_tokens": 92, + "input_tokens": 89, "input_tokens_details": { "cached_tokens": 0 }, - "output_tokens": 36, + "output_tokens": 184, "output_tokens_details": { - "reasoning_tokens": 0 + "reasoning_tokens": 64 }, - "total_tokens": 128 + "total_tokens": 273 }, "user": null, "metadata": {} @@ -339,4 +348,4 @@ interactions: - application/json status: 200 OK code: 200 - duration: 1.600062084s + duration: 1.988858541s diff --git a/providertests/testdata/TestAzureResponsesCommon/azure-o4-mini/tool_streaming.yaml b/providertests/testdata/TestAzureResponsesCommon/azure-o4-mini/tool_streaming.yaml index 6a643c27f..ca72382e4 100644 --- a/providertests/testdata/TestAzureResponsesCommon/azure-o4-mini/tool_streaming.yaml +++ b/providertests/testdata/TestAzureResponsesCommon/azure-o4-mini/tool_streaming.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://fantasy-playground-resource.openai.azure.com/openai/v1/responses method: POST response: @@ -25,74 +25,74 @@ interactions: content_length: -1 body: |+ event: response.created - data: {"type":"response.created","response":{"id":"resp_00bdb7b5e1faa51e0169b2ff894b54819488edf7aa12c48d1e","object":"response","created_at":1773338505,"status":"in_progress","background":false,"completed_at":null,"content_filters":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"o4-mini","output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":"medium","summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":0} + data: {"type":"response.created","response":{"id":"resp_050d33cc59b578f5016a3c11960d7081948fe70da94210b401","object":"response","created_at":1782321558,"status":"in_progress","background":false,"completed_at":null,"content_filters":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"o4-mini","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":null,"effort":"medium","summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":0} event: response.in_progress - data: {"type":"response.in_progress","response":{"id":"resp_00bdb7b5e1faa51e0169b2ff894b54819488edf7aa12c48d1e","object":"response","created_at":1773338505,"status":"in_progress","background":false,"completed_at":null,"content_filters":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"o4-mini","output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":"medium","summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":1} + data: {"type":"response.in_progress","response":{"id":"resp_050d33cc59b578f5016a3c11960d7081948fe70da94210b401","object":"response","created_at":1782321558,"status":"in_progress","background":false,"completed_at":null,"content_filters":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"o4-mini","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":null,"effort":"medium","summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":1} event: response.output_item.added - data: {"type":"response.output_item.added","item":{"id":"rs_00bdb7b5e1faa51e0169b2ff8a3a4c819498c8a88763802872","type":"reasoning","summary":[]},"output_index":0,"sequence_number":2} + data: {"type":"response.output_item.added","item":{"id":"rs_050d33cc59b578f5016a3c119783388194b04a43ce21dc5e21","type":"reasoning","summary":[]},"output_index":0,"sequence_number":2} event: response.output_item.done - data: {"type":"response.output_item.done","item":{"id":"rs_00bdb7b5e1faa51e0169b2ff8a3a4c819498c8a88763802872","type":"reasoning","summary":[]},"output_index":0,"sequence_number":3} + data: {"type":"response.output_item.done","item":{"id":"rs_050d33cc59b578f5016a3c119783388194b04a43ce21dc5e21","type":"reasoning","summary":[]},"output_index":0,"sequence_number":3} event: response.output_item.added - data: {"type":"response.output_item.added","item":{"id":"fc_00bdb7b5e1faa51e0169b2ff8b6d4c8194b637b8b0276a38e5","type":"function_call","status":"in_progress","arguments":"","call_id":"call_NXYsTGpzv13eQ9OObBiFDEoq","name":"weather"},"output_index":1,"sequence_number":4} + data: {"type":"response.output_item.added","item":{"id":"fc_050d33cc59b578f5016a3c119914a88194951101cfa0446ab6","type":"function_call","status":"in_progress","arguments":"","call_id":"call_iYO0n3telKobYKUdU5SVySH6","name":"weather"},"output_index":1,"sequence_number":4} event: response.function_call_arguments.delta - data: {"type":"response.function_call_arguments.delta","delta":"{\"","item_id":"fc_00bdb7b5e1faa51e0169b2ff8b6d4c8194b637b8b0276a38e5","obfuscation":"OWmEGyBIWJYnFX","output_index":1,"sequence_number":5} + data: {"type":"response.function_call_arguments.delta","delta":"{\"","item_id":"fc_050d33cc59b578f5016a3c119914a88194951101cfa0446ab6","obfuscation":"2HXWXMikwSBFwd","output_index":1,"sequence_number":5} event: response.function_call_arguments.delta - data: {"type":"response.function_call_arguments.delta","delta":"location","item_id":"fc_00bdb7b5e1faa51e0169b2ff8b6d4c8194b637b8b0276a38e5","obfuscation":"mSflz90d","output_index":1,"sequence_number":6} + data: {"type":"response.function_call_arguments.delta","delta":"location","item_id":"fc_050d33cc59b578f5016a3c119914a88194951101cfa0446ab6","obfuscation":"W8MoIFoh","output_index":1,"sequence_number":6} event: response.function_call_arguments.delta - data: {"type":"response.function_call_arguments.delta","delta":"\":\"","item_id":"fc_00bdb7b5e1faa51e0169b2ff8b6d4c8194b637b8b0276a38e5","obfuscation":"uJzzs2YUl9hJw","output_index":1,"sequence_number":7} + data: {"type":"response.function_call_arguments.delta","delta":"\":\"","item_id":"fc_050d33cc59b578f5016a3c119914a88194951101cfa0446ab6","obfuscation":"XletCiiSYG9YS","output_index":1,"sequence_number":7} event: response.function_call_arguments.delta - data: {"type":"response.function_call_arguments.delta","delta":"Flor","item_id":"fc_00bdb7b5e1faa51e0169b2ff8b6d4c8194b637b8b0276a38e5","obfuscation":"8syOPdgvJ2bT","output_index":1,"sequence_number":8} + data: {"type":"response.function_call_arguments.delta","delta":"Flor","item_id":"fc_050d33cc59b578f5016a3c119914a88194951101cfa0446ab6","obfuscation":"fO2kbBwYZbJB","output_index":1,"sequence_number":8} event: response.function_call_arguments.delta - data: {"type":"response.function_call_arguments.delta","delta":"ence","item_id":"fc_00bdb7b5e1faa51e0169b2ff8b6d4c8194b637b8b0276a38e5","obfuscation":"92Kj3IwboyCu","output_index":1,"sequence_number":9} + data: {"type":"response.function_call_arguments.delta","delta":"ence","item_id":"fc_050d33cc59b578f5016a3c119914a88194951101cfa0446ab6","obfuscation":"NWmi40uJKigz","output_index":1,"sequence_number":9} event: response.function_call_arguments.delta - data: {"type":"response.function_call_arguments.delta","delta":",","item_id":"fc_00bdb7b5e1faa51e0169b2ff8b6d4c8194b637b8b0276a38e5","obfuscation":"04WqviHHCUj8vLH","output_index":1,"sequence_number":10} + data: {"type":"response.function_call_arguments.delta","delta":",","item_id":"fc_050d33cc59b578f5016a3c119914a88194951101cfa0446ab6","obfuscation":"28Naj4yTyVT6vrr","output_index":1,"sequence_number":10} event: response.function_call_arguments.delta - data: {"type":"response.function_call_arguments.delta","delta":" Italy","item_id":"fc_00bdb7b5e1faa51e0169b2ff8b6d4c8194b637b8b0276a38e5","obfuscation":"3feKgeRIgy","output_index":1,"sequence_number":11} + data: {"type":"response.function_call_arguments.delta","delta":" Italy","item_id":"fc_050d33cc59b578f5016a3c119914a88194951101cfa0446ab6","obfuscation":"5Wct1Wivce","output_index":1,"sequence_number":11} event: response.function_call_arguments.delta - data: {"type":"response.function_call_arguments.delta","delta":"\"}","item_id":"fc_00bdb7b5e1faa51e0169b2ff8b6d4c8194b637b8b0276a38e5","obfuscation":"LbqoqFyWMzpWWN","output_index":1,"sequence_number":12} + data: {"type":"response.function_call_arguments.delta","delta":"\"}","item_id":"fc_050d33cc59b578f5016a3c119914a88194951101cfa0446ab6","obfuscation":"CDvCKe5qFEHphc","output_index":1,"sequence_number":12} event: response.function_call_arguments.done - data: {"type":"response.function_call_arguments.done","arguments":"{\"location\":\"Florence, Italy\"}","item_id":"fc_00bdb7b5e1faa51e0169b2ff8b6d4c8194b637b8b0276a38e5","output_index":1,"sequence_number":13} + data: {"type":"response.function_call_arguments.done","arguments":"{\"location\":\"Florence, Italy\"}","item_id":"fc_050d33cc59b578f5016a3c119914a88194951101cfa0446ab6","output_index":1,"sequence_number":13} event: response.output_item.done - data: {"type":"response.output_item.done","item":{"id":"fc_00bdb7b5e1faa51e0169b2ff8b6d4c8194b637b8b0276a38e5","type":"function_call","status":"completed","arguments":"{\"location\":\"Florence, Italy\"}","call_id":"call_NXYsTGpzv13eQ9OObBiFDEoq","name":"weather"},"output_index":1,"sequence_number":14} + data: {"type":"response.output_item.done","item":{"id":"fc_050d33cc59b578f5016a3c119914a88194951101cfa0446ab6","type":"function_call","status":"completed","arguments":"{\"location\":\"Florence, Italy\"}","call_id":"call_iYO0n3telKobYKUdU5SVySH6","name":"weather"},"output_index":1,"sequence_number":14} event: response.completed - data: {"type":"response.completed","response":{"id":"resp_00bdb7b5e1faa51e0169b2ff894b54819488edf7aa12c48d1e","object":"response","created_at":1773338505,"status":"completed","background":false,"completed_at":1773338507,"content_filters":[{"blocked":false,"source_type":"prompt","content_filter_raw":[],"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"jailbreak":{"detected":false,"filtered":false}},"content_filter_offsets":{"start_offset":0,"end_offset":70,"check_offset":0}},{"blocked":false,"source_type":"completion","content_filter_raw":[],"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"protected_material_code":{"detected":false,"filtered":false},"protected_material_text":{"detected":false,"filtered":false}},"content_filter_offsets":{"start_offset":0,"end_offset":1011,"check_offset":0}}],"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"o4-mini","output":[{"id":"rs_00bdb7b5e1faa51e0169b2ff8a3a4c819498c8a88763802872","type":"reasoning","summary":[]},{"id":"fc_00bdb7b5e1faa51e0169b2ff8b6d4c8194b637b8b0276a38e5","type":"function_call","status":"completed","arguments":"{\"location\":\"Florence, Italy\"}","call_id":"call_NXYsTGpzv13eQ9OObBiFDEoq","name":"weather"}],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":"medium","summary":null},"safety_identifier":null,"service_tier":"default","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":{"input_tokens":61,"input_tokens_details":{"cached_tokens":0},"output_tokens":165,"output_tokens_details":{"reasoning_tokens":128},"total_tokens":226},"user":null,"metadata":{}},"sequence_number":15} + data: {"type":"response.completed","response":{"id":"resp_050d33cc59b578f5016a3c11960d7081948fe70da94210b401","object":"response","created_at":1782321558,"status":"completed","background":false,"completed_at":1782321561,"content_filters":[{"blocked":false,"source_type":"prompt","content_filter_raw":[],"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"jailbreak":{"detected":false,"filtered":false}},"content_filter_offsets":{"start_offset":0,"end_offset":70,"check_offset":0}},{"blocked":false,"source_type":"completion","content_filter_raw":[],"content_filter_results":{"protected_material_code":{"detected":false,"filtered":false},"protected_material_text":{"detected":false,"filtered":false},"hate":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"}},"content_filter_offsets":{"start_offset":0,"end_offset":985,"check_offset":0}}],"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"o4-mini","moderation":null,"output":[{"id":"rs_050d33cc59b578f5016a3c119783388194b04a43ce21dc5e21","type":"reasoning","summary":[]},{"id":"fc_050d33cc59b578f5016a3c119914a88194951101cfa0446ab6","type":"function_call","status":"completed","arguments":"{\"location\":\"Florence, Italy\"}","call_id":"call_iYO0n3telKobYKUdU5SVySH6","name":"weather"}],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":null,"effort":"medium","summary":null},"safety_identifier":null,"service_tier":"default","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":{"input_tokens":60,"input_tokens_details":{"cached_tokens":0},"output_tokens":219,"output_tokens_details":{"reasoning_tokens":192},"total_tokens":279},"user":null,"metadata":{}},"sequence_number":15} headers: Content-Type: - text/event-stream; charset=utf-8 status: 200 OK code: 200 - duration: 594.581ms + duration: 336.471083ms - id: 1 request: proto: HTTP/1.1 proto_major: 1 proto_minor: 1 - content_length: 737 + content_length: 725 host: "" - body: '{"max_output_tokens":4000,"store":false,"input":[{"content":"You are a helpful assistant","role":"developer"},{"content":[{"text":"What''s the weather in Florence,Italy?","type":"input_text"}],"role":"user"},{"arguments":"\"{\\\"location\\\":\\\"Florence, Italy\\\"}\"","call_id":"call_NXYsTGpzv13eQ9OObBiFDEoq","name":"weather","type":"function_call"},{"call_id":"call_NXYsTGpzv13eQ9OObBiFDEoq","output":"40 C","type":"function_call_output"}],"model":"o4-mini","tool_choice":"auto","tools":[{"strict":false,"parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"name":"weather","description":"Get weather information for a location","type":"function"}],"stream":true}' + body: '{"max_output_tokens":4000,"store":false,"input":[{"content":"You are a helpful assistant","role":"developer"},{"content":[{"text":"What''s the weather in Florence,Italy?","type":"input_text"}],"role":"user"},{"arguments":"{\"location\":\"Florence, Italy\"}","call_id":"call_iYO0n3telKobYKUdU5SVySH6","name":"weather","type":"function_call"},{"call_id":"call_iYO0n3telKobYKUdU5SVySH6","output":"40 C","type":"function_call_output"}],"model":"o4-mini","tool_choice":"auto","tools":[{"strict":false,"parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"name":"weather","description":"Get weather information for a location","type":"function"}],"stream":true}' headers: Accept: - application/json Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://fantasy-playground-resource.openai.azure.com/openai/v1/responses method: POST response: @@ -102,194 +102,68 @@ interactions: content_length: -1 body: |+ event: response.created - data: {"type":"response.created","response":{"id":"resp_04677a9552abf9510169b2ff8c0e9c81908a881db0873439a0","object":"response","created_at":1773338508,"status":"in_progress","background":false,"completed_at":null,"content_filters":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"o4-mini","output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":"medium","summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":0} + data: {"type":"response.created","response":{"id":"resp_0029b8094bd4daa7016a3c11999e608197a0468d28bd11774f","object":"response","created_at":1782321561,"status":"in_progress","background":false,"completed_at":null,"content_filters":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"o4-mini","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":null,"effort":"medium","summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":0} event: response.in_progress - data: {"type":"response.in_progress","response":{"id":"resp_04677a9552abf9510169b2ff8c0e9c81908a881db0873439a0","object":"response","created_at":1773338508,"status":"in_progress","background":false,"completed_at":null,"content_filters":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"o4-mini","output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":"medium","summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":1} + data: {"type":"response.in_progress","response":{"id":"resp_0029b8094bd4daa7016a3c11999e608197a0468d28bd11774f","object":"response","created_at":1782321561,"status":"in_progress","background":false,"completed_at":null,"content_filters":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"o4-mini","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":null,"effort":"medium","summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":1} event: response.output_item.added - data: {"type":"response.output_item.added","item":{"id":"msg_04677a9552abf9510169b2ff8ce14c81908a025066f0e1db71","type":"message","status":"in_progress","content":[],"role":"assistant"},"output_index":0,"sequence_number":2} + data: {"type":"response.output_item.added","item":{"id":"msg_0029b8094bd4daa7016a3c119a127481979b757a6bf15f6299","type":"message","status":"in_progress","content":[],"role":"assistant"},"output_index":0,"sequence_number":2} event: response.content_part.added - data: {"type":"response.content_part.added","content_index":0,"item_id":"msg_04677a9552abf9510169b2ff8ce14c81908a025066f0e1db71","output_index":0,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":""},"sequence_number":3} + data: {"type":"response.content_part.added","content_index":0,"item_id":"msg_0029b8094bd4daa7016a3c119a127481979b757a6bf15f6299","output_index":0,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":""},"sequence_number":3} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":"The","item_id":"msg_04677a9552abf9510169b2ff8ce14c81908a025066f0e1db71","logprobs":[],"obfuscation":"UcEU7xMjzTGge","output_index":0,"sequence_number":4} + data: {"type":"response.output_text.delta","content_index":0,"delta":"The","item_id":"msg_0029b8094bd4daa7016a3c119a127481979b757a6bf15f6299","logprobs":[],"obfuscation":"EPY0cRGhLYo2t","output_index":0,"sequence_number":4} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" current","item_id":"msg_04677a9552abf9510169b2ff8ce14c81908a025066f0e1db71","logprobs":[],"obfuscation":"TQmF2uem","output_index":0,"sequence_number":5} + data: {"type":"response.output_text.delta","content_index":0,"delta":" current","item_id":"msg_0029b8094bd4daa7016a3c119a127481979b757a6bf15f6299","logprobs":[],"obfuscation":"2DBtwrfx","output_index":0,"sequence_number":5} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" temperature","item_id":"msg_04677a9552abf9510169b2ff8ce14c81908a025066f0e1db71","logprobs":[],"obfuscation":"00De","output_index":0,"sequence_number":6} + data: {"type":"response.output_text.delta","content_index":0,"delta":" temperature","item_id":"msg_0029b8094bd4daa7016a3c119a127481979b757a6bf15f6299","logprobs":[],"obfuscation":"i08y","output_index":0,"sequence_number":6} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" in","item_id":"msg_04677a9552abf9510169b2ff8ce14c81908a025066f0e1db71","logprobs":[],"obfuscation":"BQ7zFM7eUXrnd","output_index":0,"sequence_number":7} + data: {"type":"response.output_text.delta","content_index":0,"delta":" in","item_id":"msg_0029b8094bd4daa7016a3c119a127481979b757a6bf15f6299","logprobs":[],"obfuscation":"v2BbUC0kWG3rV","output_index":0,"sequence_number":7} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" Florence","item_id":"msg_04677a9552abf9510169b2ff8ce14c81908a025066f0e1db71","logprobs":[],"obfuscation":"CHLF13R","output_index":0,"sequence_number":8} + data: {"type":"response.output_text.delta","content_index":0,"delta":" Florence","item_id":"msg_0029b8094bd4daa7016a3c119a127481979b757a6bf15f6299","logprobs":[],"obfuscation":"SHpMbGe","output_index":0,"sequence_number":8} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":",","item_id":"msg_04677a9552abf9510169b2ff8ce14c81908a025066f0e1db71","logprobs":[],"obfuscation":"2ghWe7JZ8CCYkta","output_index":0,"sequence_number":9} + data: {"type":"response.output_text.delta","content_index":0,"delta":",","item_id":"msg_0029b8094bd4daa7016a3c119a127481979b757a6bf15f6299","logprobs":[],"obfuscation":"GWcraCZZUd0xEPe","output_index":0,"sequence_number":9} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" Italy","item_id":"msg_04677a9552abf9510169b2ff8ce14c81908a025066f0e1db71","logprobs":[],"obfuscation":"Q9K97vNfY3","output_index":0,"sequence_number":10} + data: {"type":"response.output_text.delta","content_index":0,"delta":" Italy","item_id":"msg_0029b8094bd4daa7016a3c119a127481979b757a6bf15f6299","logprobs":[],"obfuscation":"iz18exnOgS","output_index":0,"sequence_number":10} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" is","item_id":"msg_04677a9552abf9510169b2ff8ce14c81908a025066f0e1db71","logprobs":[],"obfuscation":"141M2fzSrEn2g","output_index":0,"sequence_number":11} + data: {"type":"response.output_text.delta","content_index":0,"delta":" is","item_id":"msg_0029b8094bd4daa7016a3c119a127481979b757a6bf15f6299","logprobs":[],"obfuscation":"wyMcJsUhKImt3","output_index":0,"sequence_number":11} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" ","item_id":"msg_04677a9552abf9510169b2ff8ce14c81908a025066f0e1db71","logprobs":[],"obfuscation":"R93DFKflefldQQd","output_index":0,"sequence_number":12} + data: {"type":"response.output_text.delta","content_index":0,"delta":" ","item_id":"msg_0029b8094bd4daa7016a3c119a127481979b757a6bf15f6299","logprobs":[],"obfuscation":"MwJfBZash4uuHob","output_index":0,"sequence_number":12} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":"40","item_id":"msg_04677a9552abf9510169b2ff8ce14c81908a025066f0e1db71","logprobs":[],"obfuscation":"cBHHFR0UZJ1NT6","output_index":0,"sequence_number":13} + data: {"type":"response.output_text.delta","content_index":0,"delta":"40","item_id":"msg_0029b8094bd4daa7016a3c119a127481979b757a6bf15f6299","logprobs":[],"obfuscation":"LY7Um0awVpPJMp","output_index":0,"sequence_number":13} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":"°C","item_id":"msg_04677a9552abf9510169b2ff8ce14c81908a025066f0e1db71","logprobs":[],"obfuscation":"qccGeI7wUqRNZB","output_index":0,"sequence_number":14} + data: {"type":"response.output_text.delta","content_index":0,"delta":"°C","item_id":"msg_0029b8094bd4daa7016a3c119a127481979b757a6bf15f6299","logprobs":[],"obfuscation":"JtcM5WBL6gf3zi","output_index":0,"sequence_number":14} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":".","item_id":"msg_04677a9552abf9510169b2ff8ce14c81908a025066f0e1db71","logprobs":[],"obfuscation":"1BsRTdkhpStjy6e","output_index":0,"sequence_number":15} - - event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" It","item_id":"msg_04677a9552abf9510169b2ff8ce14c81908a025066f0e1db71","logprobs":[],"obfuscation":"KY5m0ThrZ250a","output_index":0,"sequence_number":16} - - event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":"’s","item_id":"msg_04677a9552abf9510169b2ff8ce14c81908a025066f0e1db71","logprobs":[],"obfuscation":"82lkule1pN4V8x","output_index":0,"sequence_number":17} - - event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" quite","item_id":"msg_04677a9552abf9510169b2ff8ce14c81908a025066f0e1db71","logprobs":[],"obfuscation":"MwDIapjkGB","output_index":0,"sequence_number":18} - - event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" hot","item_id":"msg_04677a9552abf9510169b2ff8ce14c81908a025066f0e1db71","logprobs":[],"obfuscation":"lWw9Q8zHkKVc","output_index":0,"sequence_number":19} - - event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":"—","item_id":"msg_04677a9552abf9510169b2ff8ce14c81908a025066f0e1db71","logprobs":[],"obfuscation":"g9Mp06thsbgZRWi","output_index":0,"sequence_number":20} - - event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":"make","item_id":"msg_04677a9552abf9510169b2ff8ce14c81908a025066f0e1db71","logprobs":[],"obfuscation":"pDNQSTkAjRsj","output_index":0,"sequence_number":21} - - event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" sure","item_id":"msg_04677a9552abf9510169b2ff8ce14c81908a025066f0e1db71","logprobs":[],"obfuscation":"H8K6djY0WtI","output_index":0,"sequence_number":22} - - event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" to","item_id":"msg_04677a9552abf9510169b2ff8ce14c81908a025066f0e1db71","logprobs":[],"obfuscation":"DeZtScM2UmlDo","output_index":0,"sequence_number":23} - - event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" stay","item_id":"msg_04677a9552abf9510169b2ff8ce14c81908a025066f0e1db71","logprobs":[],"obfuscation":"t4xbTMNbzrj","output_index":0,"sequence_number":24} - - event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" hydrated","item_id":"msg_04677a9552abf9510169b2ff8ce14c81908a025066f0e1db71","logprobs":[],"obfuscation":"mIbVJ1A","output_index":0,"sequence_number":25} - - event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" and","item_id":"msg_04677a9552abf9510169b2ff8ce14c81908a025066f0e1db71","logprobs":[],"obfuscation":"Xl7de3laFrSy","output_index":0,"sequence_number":26} - - event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" seek","item_id":"msg_04677a9552abf9510169b2ff8ce14c81908a025066f0e1db71","logprobs":[],"obfuscation":"b1vKcJMUMIp","output_index":0,"sequence_number":27} - - event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" shade","item_id":"msg_04677a9552abf9510169b2ff8ce14c81908a025066f0e1db71","logprobs":[],"obfuscation":"aDsqOSxFPq","output_index":0,"sequence_number":28} - - event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" or","item_id":"msg_04677a9552abf9510169b2ff8ce14c81908a025066f0e1db71","logprobs":[],"obfuscation":"Dhm9pmeuFDJ0B","output_index":0,"sequence_number":29} - - event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" air","item_id":"msg_04677a9552abf9510169b2ff8ce14c81908a025066f0e1db71","logprobs":[],"obfuscation":"iTKgDd8Hd29H","output_index":0,"sequence_number":30} - - event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":"-conditioned","item_id":"msg_04677a9552abf9510169b2ff8ce14c81908a025066f0e1db71","logprobs":[],"obfuscation":"TKv0","output_index":0,"sequence_number":31} - - event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" areas","item_id":"msg_04677a9552abf9510169b2ff8ce14c81908a025066f0e1db71","logprobs":[],"obfuscation":"hDDrZMT743","output_index":0,"sequence_number":32} - - event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" if","item_id":"msg_04677a9552abf9510169b2ff8ce14c81908a025066f0e1db71","logprobs":[],"obfuscation":"9XpESOejU5KpU","output_index":0,"sequence_number":33} - - event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" you","item_id":"msg_04677a9552abf9510169b2ff8ce14c81908a025066f0e1db71","logprobs":[],"obfuscation":"h0CrgzsY3EW7","output_index":0,"sequence_number":34} - - event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":"’re","item_id":"msg_04677a9552abf9510169b2ff8ce14c81908a025066f0e1db71","logprobs":[],"obfuscation":"25bM8MeHz6Hx6","output_index":0,"sequence_number":35} - - event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" outdoors","item_id":"msg_04677a9552abf9510169b2ff8ce14c81908a025066f0e1db71","logprobs":[],"obfuscation":"MLgY0ST","output_index":0,"sequence_number":36} - - event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":".","item_id":"msg_04677a9552abf9510169b2ff8ce14c81908a025066f0e1db71","logprobs":[],"obfuscation":"0Ymx1vETtqPOTVA","output_index":0,"sequence_number":37} - - event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" Let","item_id":"msg_04677a9552abf9510169b2ff8ce14c81908a025066f0e1db71","logprobs":[],"obfuscation":"zysyHNhN4yxC","output_index":0,"sequence_number":38} - - event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" me","item_id":"msg_04677a9552abf9510169b2ff8ce14c81908a025066f0e1db71","logprobs":[],"obfuscation":"2zFNY3Uj3aimY","output_index":0,"sequence_number":39} - - event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" know","item_id":"msg_04677a9552abf9510169b2ff8ce14c81908a025066f0e1db71","logprobs":[],"obfuscation":"xWZA92f0g6O","output_index":0,"sequence_number":40} - - event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" if","item_id":"msg_04677a9552abf9510169b2ff8ce14c81908a025066f0e1db71","logprobs":[],"obfuscation":"TyMuhxCCYj3qg","output_index":0,"sequence_number":41} - - event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" you","item_id":"msg_04677a9552abf9510169b2ff8ce14c81908a025066f0e1db71","logprobs":[],"obfuscation":"nlGtS83gEhdn","output_index":0,"sequence_number":42} - - event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":"’d","item_id":"msg_04677a9552abf9510169b2ff8ce14c81908a025066f0e1db71","logprobs":[],"obfuscation":"e82hGUi7eiajPd","output_index":0,"sequence_number":43} - - event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" like","item_id":"msg_04677a9552abf9510169b2ff8ce14c81908a025066f0e1db71","logprobs":[],"obfuscation":"xyn3lh9LTCx","output_index":0,"sequence_number":44} - - event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" more","item_id":"msg_04677a9552abf9510169b2ff8ce14c81908a025066f0e1db71","logprobs":[],"obfuscation":"hSNiJeGwN0d","output_index":0,"sequence_number":45} - - event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" details","item_id":"msg_04677a9552abf9510169b2ff8ce14c81908a025066f0e1db71","logprobs":[],"obfuscation":"2NJMpjpT","output_index":0,"sequence_number":46} - - event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" such","item_id":"msg_04677a9552abf9510169b2ff8ce14c81908a025066f0e1db71","logprobs":[],"obfuscation":"FETL3tblL9j","output_index":0,"sequence_number":47} - - event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" as","item_id":"msg_04677a9552abf9510169b2ff8ce14c81908a025066f0e1db71","logprobs":[],"obfuscation":"R5VUVJ11BNqZP","output_index":0,"sequence_number":48} - - event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" humidity","item_id":"msg_04677a9552abf9510169b2ff8ce14c81908a025066f0e1db71","logprobs":[],"obfuscation":"uB0jwtV","output_index":0,"sequence_number":49} - - event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":",","item_id":"msg_04677a9552abf9510169b2ff8ce14c81908a025066f0e1db71","logprobs":[],"obfuscation":"RlhboIhSSi6SR3D","output_index":0,"sequence_number":50} - - event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" wind","item_id":"msg_04677a9552abf9510169b2ff8ce14c81908a025066f0e1db71","logprobs":[],"obfuscation":"kZYo6MrSx4a","output_index":0,"sequence_number":51} - - event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" speed","item_id":"msg_04677a9552abf9510169b2ff8ce14c81908a025066f0e1db71","logprobs":[],"obfuscation":"z9TT3OcZih","output_index":0,"sequence_number":52} - - event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":",","item_id":"msg_04677a9552abf9510169b2ff8ce14c81908a025066f0e1db71","logprobs":[],"obfuscation":"9hTV2YGOmBkJDHl","output_index":0,"sequence_number":53} - - event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" or","item_id":"msg_04677a9552abf9510169b2ff8ce14c81908a025066f0e1db71","logprobs":[],"obfuscation":"FfsNxdZ5m2VDN","output_index":0,"sequence_number":54} - - event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" a","item_id":"msg_04677a9552abf9510169b2ff8ce14c81908a025066f0e1db71","logprobs":[],"obfuscation":"fwT53Dr1D4u8SO","output_index":0,"sequence_number":55} - - event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" forecast","item_id":"msg_04677a9552abf9510169b2ff8ce14c81908a025066f0e1db71","logprobs":[],"obfuscation":"LqF7j1G","output_index":0,"sequence_number":56} - - event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":".","item_id":"msg_04677a9552abf9510169b2ff8ce14c81908a025066f0e1db71","logprobs":[],"obfuscation":"SZqM8GuJmhxmiGl","output_index":0,"sequence_number":57} + data: {"type":"response.output_text.delta","content_index":0,"delta":".","item_id":"msg_0029b8094bd4daa7016a3c119a127481979b757a6bf15f6299","logprobs":[],"obfuscation":"ftaTkS83Pgbo7aL","output_index":0,"sequence_number":15} event: response.output_text.done - data: {"type":"response.output_text.done","content_index":0,"item_id":"msg_04677a9552abf9510169b2ff8ce14c81908a025066f0e1db71","logprobs":[],"output_index":0,"sequence_number":58,"text":"The current temperature in Florence, Italy is 40°C. It’s quite hot—make sure to stay hydrated and seek shade or air-conditioned areas if you’re outdoors. Let me know if you’d like more details such as humidity, wind speed, or a forecast."} + data: {"type":"response.output_text.done","content_index":0,"item_id":"msg_0029b8094bd4daa7016a3c119a127481979b757a6bf15f6299","logprobs":[],"output_index":0,"sequence_number":16,"text":"The current temperature in Florence, Italy is 40°C."} event: response.content_part.done - data: {"type":"response.content_part.done","content_index":0,"item_id":"msg_04677a9552abf9510169b2ff8ce14c81908a025066f0e1db71","output_index":0,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":"The current temperature in Florence, Italy is 40°C. It’s quite hot—make sure to stay hydrated and seek shade or air-conditioned areas if you’re outdoors. Let me know if you’d like more details such as humidity, wind speed, or a forecast."},"sequence_number":59} + data: {"type":"response.content_part.done","content_index":0,"item_id":"msg_0029b8094bd4daa7016a3c119a127481979b757a6bf15f6299","output_index":0,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":"The current temperature in Florence, Italy is 40°C."},"sequence_number":17} event: response.output_item.done - data: {"type":"response.output_item.done","item":{"id":"msg_04677a9552abf9510169b2ff8ce14c81908a025066f0e1db71","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"The current temperature in Florence, Italy is 40°C. It’s quite hot—make sure to stay hydrated and seek shade or air-conditioned areas if you’re outdoors. Let me know if you’d like more details such as humidity, wind speed, or a forecast."}],"role":"assistant"},"output_index":0,"sequence_number":60} + data: {"type":"response.output_item.done","item":{"id":"msg_0029b8094bd4daa7016a3c119a127481979b757a6bf15f6299","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"The current temperature in Florence, Italy is 40°C."}],"role":"assistant"},"output_index":0,"sequence_number":18} event: response.completed - data: {"type":"response.completed","response":{"id":"resp_04677a9552abf9510169b2ff8c0e9c81908a881db0873439a0","object":"response","created_at":1773338508,"status":"completed","background":false,"completed_at":1773338509,"content_filters":[{"blocked":false,"source_type":"completion","content_filter_raw":[],"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"protected_material_code":{"detected":false,"filtered":false},"protected_material_text":{"detected":false,"filtered":false}},"content_filter_offsets":{"start_offset":0,"end_offset":605,"check_offset":0}}],"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"o4-mini","output":[{"id":"msg_04677a9552abf9510169b2ff8ce14c81908a025066f0e1db71","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"The current temperature in Florence, Italy is 40°C. It’s quite hot—make sure to stay hydrated and seek shade or air-conditioned areas if you’re outdoors. Let me know if you’d like more details such as humidity, wind speed, or a forecast."}],"role":"assistant"}],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":"medium","summary":null},"safety_identifier":null,"service_tier":"default","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":{"input_tokens":92,"input_tokens_details":{"cached_tokens":0},"output_tokens":58,"output_tokens_details":{"reasoning_tokens":0},"total_tokens":150},"user":null,"metadata":{}},"sequence_number":61} + data: {"type":"response.completed","response":{"id":"resp_0029b8094bd4daa7016a3c11999e608197a0468d28bd11774f","object":"response","created_at":1782321561,"status":"completed","background":false,"completed_at":1782321562,"content_filters":[{"blocked":false,"source_type":"completion","content_filter_raw":[],"content_filter_results":{"protected_material_code":{"detected":false,"filtered":false},"protected_material_text":{"detected":false,"filtered":false},"hate":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"}},"content_filter_offsets":{"start_offset":0,"end_offset":55,"check_offset":0}}],"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"o4-mini","moderation":null,"output":[{"id":"msg_0029b8094bd4daa7016a3c119a127481979b757a6bf15f6299","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"The current temperature in Florence, Italy is 40°C."}],"role":"assistant"}],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":null,"effort":"medium","summary":null},"safety_identifier":null,"service_tier":"default","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":{"input_tokens":89,"input_tokens_details":{"cached_tokens":0},"output_tokens":16,"output_tokens_details":{"reasoning_tokens":0},"total_tokens":105},"user":null,"metadata":{}},"sequence_number":19} headers: Content-Type: - text/event-stream; charset=utf-8 status: 200 OK code: 200 - duration: 434.499208ms + duration: 405.946958ms diff --git a/providertests/testdata/TestAzureResponsesWithSummaryThinking/azure-gpt-5-mini/thinking-streaming.yaml b/providertests/testdata/TestAzureResponsesWithSummaryThinking/azure-gpt-5-mini/thinking-streaming.yaml index 7bd039f16..810ea565a 100644 --- a/providertests/testdata/TestAzureResponsesWithSummaryThinking/azure-gpt-5-mini/thinking-streaming.yaml +++ b/providertests/testdata/TestAzureResponsesWithSummaryThinking/azure-gpt-5-mini/thinking-streaming.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://fantasy-playground-resource.openai.azure.com/openai/v1/responses method: POST response: @@ -25,350 +25,344 @@ interactions: content_length: -1 body: |+ event: response.created - data: {"type":"response.created","response":{"id":"resp_04fcf497c9f5b8760169b2ff9ff27081959917b8d19daecc20","object":"response","created_at":1773338527,"status":"in_progress","background":false,"completed_at":null,"content_filters":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":null,"max_tool_calls":null,"model":"gpt-5-mini","output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":"high","summary":"detailed"},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":0} + data: {"type":"response.created","response":{"id":"resp_06c839edbdd88254016a3c11a88b2c819088dec76bd24ec72b","object":"response","created_at":1782321576,"status":"in_progress","background":false,"completed_at":null,"content_filters":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":null,"max_tool_calls":null,"model":"gpt-5-mini","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":null,"effort":"high","summary":"detailed"},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":0} event: response.in_progress - data: {"type":"response.in_progress","response":{"id":"resp_04fcf497c9f5b8760169b2ff9ff27081959917b8d19daecc20","object":"response","created_at":1773338527,"status":"in_progress","background":false,"completed_at":null,"content_filters":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":null,"max_tool_calls":null,"model":"gpt-5-mini","output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":"high","summary":"detailed"},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":1} + data: {"type":"response.in_progress","response":{"id":"resp_06c839edbdd88254016a3c11a88b2c819088dec76bd24ec72b","object":"response","created_at":1782321576,"status":"in_progress","background":false,"completed_at":null,"content_filters":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":null,"max_tool_calls":null,"model":"gpt-5-mini","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":null,"effort":"high","summary":"detailed"},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":1} event: response.output_item.added - data: {"type":"response.output_item.added","item":{"id":"rs_04fcf497c9f5b8760169b2ffa108888195ba649a92a2f17e92","type":"reasoning","encrypted_content":"gAAAAABpsv-hvjC3ll56K8M8nnWZrQ-hbWQLb5b_X52f7q23IBmVXDU0nN6VSIiV-o358MizEILazwWUyq79OIOkNK1okzmE7rhJseAha9MK_tchfBJKuhQjm6SyIHK8DHCKOJgI1EIxzcOVflMKmgAJPXLDxRQss9fK_3gJCAGeFh_wy5Ok9BgdJ106wJGU9Jn4LrE17vdXWDfrsCLDscLiVa1jMBV9G_Qmw0m0iquamPG-K492beGN3ISA40E1qln74_dcHjKoxzIL7-wrKnUPHewKWW3MaivcnCjY6OPlxsalOTBUng18_Xzh-Xin5cN5BRDpCbUgl16hMKpq8yUnyzkJa-3joOHbETytktwBhq_4fOhTzWsRogx_uw5Yz2yFvYSVtJFXB9xA64jMaTA3jxpdMyuDRPWXZ5x7h4exGddbP_ED0qqd_zCe3f1nWEywA7U-_KaRQjk1zG54FRWiqZ6nWsOnNWKtOttPUWzQBXU17pg3KyuDidX07RSRXFa-Qs3RtgUuwqRhfp1dmmCkDdct-W4QlT-F-bAf-Pq7dXpVGSZ4cUUQk1uBktBqjs_agHPgn6m7Lap4ALe08HM4lYsj3FUPPSn6pUmRbzEK85HNVhXcSX8JuE8yu0AeIGKIrKYcD4BAdo01DFzUjAQJCXTA4QVoJzCeDPoPFU8uZxVHiN7fW1V-UmqOv_isC2uySwEYdy-hCMH20bjxMIAAH0wX2YzeJtIYE0pqNeCIhxng6tOcZmBGT7GOXMzkycjPvEOSrBJ6MawLCfxpSVeeGMADWPMqkPQfW-AlMH5ogMnDWk_PXm4=","summary":[]},"output_index":0,"sequence_number":2} + data: {"type":"response.output_item.added","item":{"id":"rs_06c839edbdd88254016a3c11a93e1481908acf9bbba9834b75","type":"reasoning","encrypted_content":"gAAAAABqPBGp1gY4mRRuui8GAPlKmsnAO0Q5vGBCs9T0oKlNt3_wWpahKZi2_93I0X-ynwx1DkwQqpx8dygZYKPk23K6DoH-nqJe3CroaVshef6m1iFAfUHewBMpvuhx2AX1DAF8636xfK5xZ8wBpPnh5zD7fjAZYPk_wtaTY1MpByprrsGfMxvOui5WGIFXaDVFvZRvqiiPlQ6At_dpCfC2CLt2Q7AGk0U-ZJ9l_2yCcMFNA_zJdGj4KVOMlEI0fSRoJHJdIRtDR7duYqK6ERFe1QHIYJieKl9dx-C-JA65Nufcc0_RG5FyHtQtolqy-v-1I8Kugbr6IcV5Trd8z_I4U3U_Gk_nlzaR6Wr30De5GZUZsGHYGFHlvJmMzTALvHD_t7OZw8Jd9hKxWyBj70B4w8RimXfkh43Fj8CxqvNWTWq7yuuHelKeGj6nEt7aLPWQJ2phy8HlejqIKmU5ytX4SakPmbXOGnVx5Rvz7YhC0IOpYsCzDHT5uUcnUQ0I_qzMAl6bTZqLuOaU2Z1EYE26LJ-mXyNmChP7JPSCRInXvsWd1dB1_4NP-h67QWbAcnRLqVT7esbRcjJ8wCYaiPLY8S6-sJ2A6mImu2kFpEsMVwu_Bq16wAsAF3LeCUk_rIS4qMKhYCANTy989EQr48i4bYivnjGWll1tPClQFDkchKlZK6yeRbJ8uPlnLvIZQ8j-hiFgSWQl2UpfIakmR2RiQa12kz1gTRU9T_9YJwZmNFZHvYSY65qk7ZtdJz7h-T4HTT_KCNAF_0jbRBcjibFSeRW_4cq3bbrHlUNdYVNV69_rC-BQhapqBvUdIuQyf1NT4hSUZw7nwZEocOvm1hX4_SfUo-Hk20QYMIb-PydZwtLutPS0Evt27twG_dmCy7zc6Ei4BOjG","summary":[]},"output_index":0,"sequence_number":2} event: response.reasoning_summary_part.added - data: {"type":"response.reasoning_summary_part.added","item_id":"rs_04fcf497c9f5b8760169b2ffa108888195ba649a92a2f17e92","output_index":0,"part":{"type":"summary_text","text":""},"sequence_number":3,"summary_index":0} + data: {"type":"response.reasoning_summary_part.added","item_id":"rs_06c839edbdd88254016a3c11a93e1481908acf9bbba9834b75","output_index":0,"part":{"type":"summary_text","text":""},"sequence_number":3,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":"**Getting","item_id":"rs_04fcf497c9f5b8760169b2ffa108888195ba649a92a2f17e92","obfuscation":"qWCdeCA","output_index":0,"sequence_number":4,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":"**Getting weather for Florence**\n\nThe","item_id":"rs_06c839edbdd88254016a3c11a93e1481908acf9bbba9834b75","obfuscation":"6UfUlvnVAt5","output_index":0,"sequence_number":4,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" weather","item_id":"rs_04fcf497c9f5b8760169b2ffa108888195ba649a92a2f17e92","obfuscation":"T4PfmQ2f","output_index":0,"sequence_number":5,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" user","item_id":"rs_06c839edbdd88254016a3c11a93e1481908acf9bbba9834b75","obfuscation":"0T9dF7CpcH5","output_index":0,"sequence_number":5,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" for","item_id":"rs_04fcf497c9f5b8760169b2ffa108888195ba649a92a2f17e92","obfuscation":"c6YyfOlYgiBY","output_index":0,"sequence_number":6,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" wants","item_id":"rs_06c839edbdd88254016a3c11a93e1481908acf9bbba9834b75","obfuscation":"ePjBTfxOUW","output_index":0,"sequence_number":6,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" Florence","item_id":"rs_04fcf497c9f5b8760169b2ffa108888195ba649a92a2f17e92","obfuscation":"0hXRmWv","output_index":0,"sequence_number":7,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" to","item_id":"rs_06c839edbdd88254016a3c11a93e1481908acf9bbba9834b75","obfuscation":"tVn6R8HEPlxtd","output_index":0,"sequence_number":7,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":"**\n\nThe","item_id":"rs_04fcf497c9f5b8760169b2ffa108888195ba649a92a2f17e92","obfuscation":"vaYyITNsF","output_index":0,"sequence_number":8,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" know","item_id":"rs_06c839edbdd88254016a3c11a93e1481908acf9bbba9834b75","obfuscation":"pipUKKum7lT","output_index":0,"sequence_number":8,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" user","item_id":"rs_04fcf497c9f5b8760169b2ffa108888195ba649a92a2f17e92","obfuscation":"ehXL8sTXut3","output_index":0,"sequence_number":9,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" the","item_id":"rs_06c839edbdd88254016a3c11a93e1481908acf9bbba9834b75","obfuscation":"gwVt4SzxBQxZ","output_index":0,"sequence_number":9,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" wants","item_id":"rs_04fcf497c9f5b8760169b2ffa108888195ba649a92a2f17e92","obfuscation":"NQXHF7jVJ7","output_index":0,"sequence_number":10,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" current","item_id":"rs_06c839edbdd88254016a3c11a93e1481908acf9bbba9834b75","obfuscation":"uDcjiAH3","output_index":0,"sequence_number":10,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" to","item_id":"rs_04fcf497c9f5b8760169b2ffa108888195ba649a92a2f17e92","obfuscation":"ut4cDOeIRAh7k","output_index":0,"sequence_number":11,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" weather","item_id":"rs_06c839edbdd88254016a3c11a93e1481908acf9bbba9834b75","obfuscation":"Qd0ROFcn","output_index":0,"sequence_number":11,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" know","item_id":"rs_04fcf497c9f5b8760169b2ffa108888195ba649a92a2f17e92","obfuscation":"IrmD5w5bWUD","output_index":0,"sequence_number":12,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" in","item_id":"rs_06c839edbdd88254016a3c11a93e1481908acf9bbba9834b75","obfuscation":"qE88vokj0WrWo","output_index":0,"sequence_number":12,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" the","item_id":"rs_04fcf497c9f5b8760169b2ffa108888195ba649a92a2f17e92","obfuscation":"rPAe9zufbVSj","output_index":0,"sequence_number":13,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" Florence","item_id":"rs_06c839edbdd88254016a3c11a93e1481908acf9bbba9834b75","obfuscation":"FcO6r6h","output_index":0,"sequence_number":13,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" weather","item_id":"rs_04fcf497c9f5b8760169b2ffa108888195ba649a92a2f17e92","obfuscation":"so7jN40r","output_index":0,"sequence_number":14,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":",","item_id":"rs_06c839edbdd88254016a3c11a93e1481908acf9bbba9834b75","obfuscation":"sVof2GiZ2uPI2kg","output_index":0,"sequence_number":14,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" in","item_id":"rs_04fcf497c9f5b8760169b2ffa108888195ba649a92a2f17e92","obfuscation":"fj7oZKUUIIMki","output_index":0,"sequence_number":15,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" Italy","item_id":"rs_06c839edbdd88254016a3c11a93e1481908acf9bbba9834b75","obfuscation":"689jOGxTQP","output_index":0,"sequence_number":15,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" Florence","item_id":"rs_04fcf497c9f5b8760169b2ffa108888195ba649a92a2f17e92","obfuscation":"S8sMt98","output_index":0,"sequence_number":16,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":".","item_id":"rs_06c839edbdd88254016a3c11a93e1481908acf9bbba9834b75","obfuscation":"pD8e1Gu1savJTt7","output_index":0,"sequence_number":16,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":",","item_id":"rs_04fcf497c9f5b8760169b2ffa108888195ba649a92a2f17e92","obfuscation":"VFmsUpr1VKgFiCa","output_index":0,"sequence_number":17,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" I","item_id":"rs_06c839edbdd88254016a3c11a93e1481908acf9bbba9834b75","obfuscation":"2xd6Qya1cBReEa","output_index":0,"sequence_number":17,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" Italy","item_id":"rs_04fcf497c9f5b8760169b2ffa108888195ba649a92a2f17e92","obfuscation":"xEQX1dCgll","output_index":0,"sequence_number":18,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":"’ll","item_id":"rs_06c839edbdd88254016a3c11a93e1481908acf9bbba9834b75","obfuscation":"yP632pQJIjcR5","output_index":0,"sequence_number":18,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":".","item_id":"rs_04fcf497c9f5b8760169b2ffa108888195ba649a92a2f17e92","obfuscation":"hdqgpqnLrsmKgW3","output_index":0,"sequence_number":19,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" use","item_id":"rs_06c839edbdd88254016a3c11a93e1481908acf9bbba9834b75","obfuscation":"ffw83hbL8kTt","output_index":0,"sequence_number":19,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" I","item_id":"rs_04fcf497c9f5b8760169b2ffa108888195ba649a92a2f17e92","obfuscation":"0VSwVPGVbeZjiy","output_index":0,"sequence_number":20,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" the","item_id":"rs_06c839edbdd88254016a3c11a93e1481908acf9bbba9834b75","obfuscation":"eN8P6V9WNaBi","output_index":0,"sequence_number":20,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" see","item_id":"rs_04fcf497c9f5b8760169b2ffa108888195ba649a92a2f17e92","obfuscation":"bujcjk4m8WBB","output_index":0,"sequence_number":21,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" functions","item_id":"rs_06c839edbdd88254016a3c11a93e1481908acf9bbba9834b75","obfuscation":"giAaGD","output_index":0,"sequence_number":21,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" that","item_id":"rs_04fcf497c9f5b8760169b2ffa108888195ba649a92a2f17e92","obfuscation":"f1Ca1cYR8hB","output_index":0,"sequence_number":22,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":".weather","item_id":"rs_06c839edbdd88254016a3c11a93e1481908acf9bbba9834b75","obfuscation":"TyMmGP5r","output_index":0,"sequence_number":22,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" we","item_id":"rs_04fcf497c9f5b8760169b2ffa108888195ba649a92a2f17e92","obfuscation":"8Jy9Adq0tLCVj","output_index":0,"sequence_number":23,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" tool","item_id":"rs_06c839edbdd88254016a3c11a93e1481908acf9bbba9834b75","obfuscation":"rTqv0kiCax5","output_index":0,"sequence_number":23,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" have","item_id":"rs_04fcf497c9f5b8760169b2ffa108888195ba649a92a2f17e92","obfuscation":"QI4JvzBo233","output_index":0,"sequence_number":24,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" to","item_id":"rs_06c839edbdd88254016a3c11a93e1481908acf9bbba9834b75","obfuscation":"bbvUMxj9Jqnnb","output_index":0,"sequence_number":24,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" a","item_id":"rs_04fcf497c9f5b8760169b2ffa108888195ba649a92a2f17e92","obfuscation":"LFiRia1ogHTg1L","output_index":0,"sequence_number":25,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" get","item_id":"rs_06c839edbdd88254016a3c11a93e1481908acf9bbba9834b75","obfuscation":"Rmo1s7MXFtPe","output_index":0,"sequence_number":25,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" tool","item_id":"rs_04fcf497c9f5b8760169b2ffa108888195ba649a92a2f17e92","obfuscation":"84wM7PMev5Y","output_index":0,"sequence_number":26,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" that","item_id":"rs_06c839edbdd88254016a3c11a93e1481908acf9bbba9834b75","obfuscation":"g93kdU9j61w","output_index":0,"sequence_number":26,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" to","item_id":"rs_04fcf497c9f5b8760169b2ffa108888195ba649a92a2f17e92","obfuscation":"LxOIHM9wu4NcB","output_index":0,"sequence_number":27,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" information","item_id":"rs_06c839edbdd88254016a3c11a93e1481908acf9bbba9834b75","obfuscation":"98KO","output_index":0,"sequence_number":27,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" retrieve","item_id":"rs_04fcf497c9f5b8760169b2ffa108888195ba649a92a2f17e92","obfuscation":"rqaY5OK","output_index":0,"sequence_number":28,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":".","item_id":"rs_06c839edbdd88254016a3c11a93e1481908acf9bbba9834b75","obfuscation":"I901JhXaFH1jPjj","output_index":0,"sequence_number":28,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" weather","item_id":"rs_04fcf497c9f5b8760169b2ffa108888195ba649a92a2f17e92","obfuscation":"WSi2o76q","output_index":0,"sequence_number":29,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" No","item_id":"rs_06c839edbdd88254016a3c11a93e1481908acf9bbba9834b75","obfuscation":"XOIklH8GiLUfN","output_index":0,"sequence_number":29,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" data","item_id":"rs_04fcf497c9f5b8760169b2ffa108888195ba649a92a2f17e92","obfuscation":"6SdhVtOAAjR","output_index":0,"sequence_number":30,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" need","item_id":"rs_06c839edbdd88254016a3c11a93e1481908acf9bbba9834b75","obfuscation":"RSbY70dhSay","output_index":0,"sequence_number":30,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":".","item_id":"rs_04fcf497c9f5b8760169b2ffa108888195ba649a92a2f17e92","obfuscation":"X5cO4fXeXOrZVhZ","output_index":0,"sequence_number":31,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" for","item_id":"rs_06c839edbdd88254016a3c11a93e1481908acf9bbba9834b75","obfuscation":"aGS4tXp6jyWr","output_index":0,"sequence_number":31,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" I","item_id":"rs_04fcf497c9f5b8760169b2ffa108888195ba649a92a2f17e92","obfuscation":"0JPQnFY0hmzeLc","output_index":0,"sequence_number":32,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" complex","item_id":"rs_06c839edbdd88254016a3c11a93e1481908acf9bbba9834b75","obfuscation":"4e9c9lru","output_index":0,"sequence_number":32,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":"’ll","item_id":"rs_04fcf497c9f5b8760169b2ffa108888195ba649a92a2f17e92","obfuscation":"jzxGqJHusBmco","output_index":0,"sequence_number":33,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" multi","item_id":"rs_06c839edbdd88254016a3c11a93e1481908acf9bbba9834b75","obfuscation":"iQKdioYc27","output_index":0,"sequence_number":33,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" call","item_id":"rs_04fcf497c9f5b8760169b2ffa108888195ba649a92a2f17e92","obfuscation":"D58DRKSnhYu","output_index":0,"sequence_number":34,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":"-tool","item_id":"rs_06c839edbdd88254016a3c11a93e1481908acf9bbba9834b75","obfuscation":"Silo2Q1yRRa","output_index":0,"sequence_number":34,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" the","item_id":"rs_04fcf497c9f5b8760169b2ffa108888195ba649a92a2f17e92","obfuscation":"mG6K2EhaRsEP","output_index":0,"sequence_number":35,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" usage","item_id":"rs_06c839edbdd88254016a3c11a93e1481908acf9bbba9834b75","obfuscation":"iJCX7qKrwL","output_index":0,"sequence_number":35,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" function","item_id":"rs_04fcf497c9f5b8760169b2ffa108888195ba649a92a2f17e92","obfuscation":"pSXWDLc","output_index":0,"sequence_number":36,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" here","item_id":"rs_06c839edbdd88254016a3c11a93e1481908acf9bbba9834b75","obfuscation":"ukYCcaLhNTr","output_index":0,"sequence_number":36,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" directly","item_id":"rs_04fcf497c9f5b8760169b2ffa108888195ba649a92a2f17e92","obfuscation":"3VGEHIG","output_index":0,"sequence_number":37,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":".","item_id":"rs_06c839edbdd88254016a3c11a93e1481908acf9bbba9834b75","obfuscation":"v8dz9OsryjYkDil","output_index":0,"sequence_number":37,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" with","item_id":"rs_04fcf497c9f5b8760169b2ffa108888195ba649a92a2f17e92","obfuscation":"6z5u1xksox5","output_index":0,"sequence_number":38,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" I","item_id":"rs_06c839edbdd88254016a3c11a93e1481908acf9bbba9834b75","obfuscation":"2yGV5lLiuPOyLD","output_index":0,"sequence_number":38,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" the","item_id":"rs_04fcf497c9f5b8760169b2ffa108888195ba649a92a2f17e92","obfuscation":"StybTL4U7S0y","output_index":0,"sequence_number":39,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":"’ll","item_id":"rs_06c839edbdd88254016a3c11a93e1481908acf9bbba9834b75","obfuscation":"6VA2nUVVdLIbv","output_index":0,"sequence_number":39,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" location","item_id":"rs_04fcf497c9f5b8760169b2ffa108888195ba649a92a2f17e92","obfuscation":"fpg7yMG","output_index":0,"sequence_number":40,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" present","item_id":"rs_06c839edbdd88254016a3c11a93e1481908acf9bbba9834b75","obfuscation":"hJdTrDxG","output_index":0,"sequence_number":40,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" specified","item_id":"rs_04fcf497c9f5b8760169b2ffa108888195ba649a92a2f17e92","obfuscation":"ZcsBaJ","output_index":0,"sequence_number":41,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" the","item_id":"rs_06c839edbdd88254016a3c11a93e1481908acf9bbba9834b75","obfuscation":"HmDStqzqXENl","output_index":0,"sequence_number":41,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" as","item_id":"rs_04fcf497c9f5b8760169b2ffa108888195ba649a92a2f17e92","obfuscation":"4rD2twR8Y1xDB","output_index":0,"sequence_number":42,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" data","item_id":"rs_06c839edbdd88254016a3c11a93e1481908acf9bbba9834b75","obfuscation":"LADnBdNWcfC","output_index":0,"sequence_number":42,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" \"","item_id":"rs_04fcf497c9f5b8760169b2ffa108888195ba649a92a2f17e92","obfuscation":"bbYlCLQPmZRdSP","output_index":0,"sequence_number":43,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" in","item_id":"rs_06c839edbdd88254016a3c11a93e1481908acf9bbba9834b75","obfuscation":"lEZJRIku6b9KA","output_index":0,"sequence_number":43,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":"Flor","item_id":"rs_04fcf497c9f5b8760169b2ffa108888195ba649a92a2f17e92","obfuscation":"z3FtFuABMjT4","output_index":0,"sequence_number":44,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" a","item_id":"rs_06c839edbdd88254016a3c11a93e1481908acf9bbba9834b75","obfuscation":"WaiM9BlNDxKfMj","output_index":0,"sequence_number":44,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":"ence","item_id":"rs_04fcf497c9f5b8760169b2ffa108888195ba649a92a2f17e92","obfuscation":"cJVUZFnkwsep","output_index":0,"sequence_number":45,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" concise","item_id":"rs_06c839edbdd88254016a3c11a93e1481908acf9bbba9834b75","obfuscation":"EPKrfNlm","output_index":0,"sequence_number":45,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":",","item_id":"rs_04fcf497c9f5b8760169b2ffa108888195ba649a92a2f17e92","obfuscation":"G7me6gn7AEBcbTA","output_index":0,"sequence_number":46,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" way","item_id":"rs_06c839edbdd88254016a3c11a93e1481908acf9bbba9834b75","obfuscation":"lBJP3gevgPex","output_index":0,"sequence_number":46,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" Italy","item_id":"rs_04fcf497c9f5b8760169b2ffa108888195ba649a92a2f17e92","obfuscation":"UTUXRE9phA","output_index":0,"sequence_number":47,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":",","item_id":"rs_06c839edbdd88254016a3c11a93e1481908acf9bbba9834b75","obfuscation":"mADaniy7F93XcEP","output_index":0,"sequence_number":47,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":".\"","item_id":"rs_04fcf497c9f5b8760169b2ffa108888195ba649a92a2f17e92","obfuscation":"mX28WNfna1CDTW","output_index":0,"sequence_number":48,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" including","item_id":"rs_06c839edbdd88254016a3c11a93e1481908acf9bbba9834b75","obfuscation":"YAEc5O","output_index":0,"sequence_number":48,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" Since","item_id":"rs_04fcf497c9f5b8760169b2ffa108888195ba649a92a2f17e92","obfuscation":"XoTFci9ws0","output_index":0,"sequence_number":49,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" temperature","item_id":"rs_06c839edbdd88254016a3c11a93e1481908acf9bbba9834b75","obfuscation":"dya7","output_index":0,"sequence_number":49,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" we","item_id":"rs_04fcf497c9f5b8760169b2ffa108888195ba649a92a2f17e92","obfuscation":"coOYAK4iPUCve","output_index":0,"sequence_number":50,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":",","item_id":"rs_06c839edbdd88254016a3c11a93e1481908acf9bbba9834b75","obfuscation":"SBRD6odaukNP7iX","output_index":0,"sequence_number":50,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" only","item_id":"rs_04fcf497c9f5b8760169b2ffa108888195ba649a92a2f17e92","obfuscation":"TOhWPtanJ2m","output_index":0,"sequence_number":51,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" conditions","item_id":"rs_06c839edbdd88254016a3c11a93e1481908acf9bbba9834b75","obfuscation":"eOTYt","output_index":0,"sequence_number":51,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" need","item_id":"rs_04fcf497c9f5b8760169b2ffa108888195ba649a92a2f17e92","obfuscation":"aXbzfLoaOSY","output_index":0,"sequence_number":52,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":",","item_id":"rs_06c839edbdd88254016a3c11a93e1481908acf9bbba9834b75","obfuscation":"klmmfsef9njRFsT","output_index":0,"sequence_number":52,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" one","item_id":"rs_04fcf497c9f5b8760169b2ffa108888195ba649a92a2f17e92","obfuscation":"50hZkZxdl4De","output_index":0,"sequence_number":53,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" humidity","item_id":"rs_06c839edbdd88254016a3c11a93e1481908acf9bbba9834b75","obfuscation":"YSIDwZu","output_index":0,"sequence_number":53,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" tool","item_id":"rs_04fcf497c9f5b8760169b2ffa108888195ba649a92a2f17e92","obfuscation":"AB42OVpt9Jy","output_index":0,"sequence_number":54,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":",","item_id":"rs_06c839edbdd88254016a3c11a93e1481908acf9bbba9834b75","obfuscation":"lizdSvJj6psXXvt","output_index":0,"sequence_number":54,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" for","item_id":"rs_04fcf497c9f5b8760169b2ffa108888195ba649a92a2f17e92","obfuscation":"XHAzNy0FEbae","output_index":0,"sequence_number":55,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" wind","item_id":"rs_06c839edbdd88254016a3c11a93e1481908acf9bbba9834b75","obfuscation":"53bGr4oi6U2","output_index":0,"sequence_number":55,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" this","item_id":"rs_04fcf497c9f5b8760169b2ffa108888195ba649a92a2f17e92","obfuscation":"WLjH1Ym4eAO","output_index":0,"sequence_number":56,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":",","item_id":"rs_06c839edbdd88254016a3c11a93e1481908acf9bbba9834b75","obfuscation":"6GSJJoBLRGc72WR","output_index":0,"sequence_number":56,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" request","item_id":"rs_04fcf497c9f5b8760169b2ffa108888195ba649a92a2f17e92","obfuscation":"lR1AkNg2","output_index":0,"sequence_number":57,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" and","item_id":"rs_06c839edbdd88254016a3c11a93e1481908acf9bbba9834b75","obfuscation":"94L6hxOVC53S","output_index":0,"sequence_number":57,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":",","item_id":"rs_04fcf497c9f5b8760169b2ffa108888195ba649a92a2f17e92","obfuscation":"JLZJWxaN7awUi3w","output_index":0,"sequence_number":58,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" maybe","item_id":"rs_06c839edbdd88254016a3c11a93e1481908acf9bbba9834b75","obfuscation":"F9K7HUHPKb","output_index":0,"sequence_number":58,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" I","item_id":"rs_04fcf497c9f5b8760169b2ffa108888195ba649a92a2f17e92","obfuscation":"UOUGDcA571cuq8","output_index":0,"sequence_number":59,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" time","item_id":"rs_06c839edbdd88254016a3c11a93e1481908acf9bbba9834b75","obfuscation":"P8tXRpUNb8p","output_index":0,"sequence_number":59,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" don","item_id":"rs_04fcf497c9f5b8760169b2ffa108888195ba649a92a2f17e92","obfuscation":"NeUTjXvbpRr8","output_index":0,"sequence_number":60,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" of","item_id":"rs_06c839edbdd88254016a3c11a93e1481908acf9bbba9834b75","obfuscation":"8988QtcTnmjBw","output_index":0,"sequence_number":60,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":"’t","item_id":"rs_04fcf497c9f5b8760169b2ffa108888195ba649a92a2f17e92","obfuscation":"wng0C359r6uDm1","output_index":0,"sequence_number":61,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" observation","item_id":"rs_06c839edbdd88254016a3c11a93e1481908acf9bbba9834b75","obfuscation":"Dv4m","output_index":0,"sequence_number":61,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" need","item_id":"rs_04fcf497c9f5b8760169b2ffa108888195ba649a92a2f17e92","obfuscation":"eCrxS3ZW8bQ","output_index":0,"sequence_number":62,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":",","item_id":"rs_06c839edbdd88254016a3c11a93e1481908acf9bbba9834b75","obfuscation":"adHzbJQBcPbDLVA","output_index":0,"sequence_number":62,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" to","item_id":"rs_04fcf497c9f5b8760169b2ffa108888195ba649a92a2f17e92","obfuscation":"G9qj9WnUjUniV","output_index":0,"sequence_number":63,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" while","item_id":"rs_06c839edbdd88254016a3c11a93e1481908acf9bbba9834b75","obfuscation":"8DKGoX5Sfz","output_index":0,"sequence_number":63,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" worry","item_id":"rs_04fcf497c9f5b8760169b2ffa108888195ba649a92a2f17e92","obfuscation":"882iUYQUBY","output_index":0,"sequence_number":64,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" indicating","item_id":"rs_06c839edbdd88254016a3c11a93e1481908acf9bbba9834b75","obfuscation":"P21Ia","output_index":0,"sequence_number":64,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" about","item_id":"rs_04fcf497c9f5b8760169b2ffa108888195ba649a92a2f17e92","obfuscation":"oOntKVB9IW","output_index":0,"sequence_number":65,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" the","item_id":"rs_06c839edbdd88254016a3c11a93e1481908acf9bbba9834b75","obfuscation":"FmeX4KulKf71","output_index":0,"sequence_number":65,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" running","item_id":"rs_04fcf497c9f5b8760169b2ffa108888195ba649a92a2f17e92","obfuscation":"ELwUWZDK","output_index":0,"sequence_number":66,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" units","item_id":"rs_06c839edbdd88254016a3c11a93e1481908acf9bbba9834b75","obfuscation":"MF9WXFY9P1","output_index":0,"sequence_number":66,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" multiple","item_id":"rs_04fcf497c9f5b8760169b2ffa108888195ba649a92a2f17e92","obfuscation":"g61kP6i","output_index":0,"sequence_number":67,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":".","item_id":"rs_06c839edbdd88254016a3c11a93e1481908acf9bbba9834b75","obfuscation":"dYnNPgQ0t02IMRw","output_index":0,"sequence_number":67,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" tools","item_id":"rs_04fcf497c9f5b8760169b2ffa108888195ba649a92a2f17e92","obfuscation":"5f9KwgE0aR","output_index":0,"sequence_number":68,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" I","item_id":"rs_06c839edbdd88254016a3c11a93e1481908acf9bbba9834b75","obfuscation":"rh9dMlA4qf6iyD","output_index":0,"sequence_number":68,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" simultaneously","item_id":"rs_04fcf497c9f5b8760169b2ffa108888195ba649a92a2f17e92","obfuscation":"M","output_index":0,"sequence_number":69,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" should","item_id":"rs_06c839edbdd88254016a3c11a93e1481908acf9bbba9834b75","obfuscation":"m2EraKEYT","output_index":0,"sequence_number":69,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":".","item_id":"rs_04fcf497c9f5b8760169b2ffa108888195ba649a92a2f17e92","obfuscation":"vF6nhUAb8wuvPeu","output_index":0,"sequence_number":70,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" also","item_id":"rs_06c839edbdd88254016a3c11a93e1481908acf9bbba9834b75","obfuscation":"q89XB4gVgiD","output_index":0,"sequence_number":70,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" I","item_id":"rs_04fcf497c9f5b8760169b2ffa108888195ba649a92a2f17e92","obfuscation":"shBGeDsEdE3JaV","output_index":0,"sequence_number":71,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" check","item_id":"rs_06c839edbdd88254016a3c11a93e1481908acf9bbba9834b75","obfuscation":"WffnOObGIz","output_index":0,"sequence_number":71,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":"’ll","item_id":"rs_04fcf497c9f5b8760169b2ffa108888195ba649a92a2f17e92","obfuscation":"XjaV18OeFaeo7","output_index":0,"sequence_number":72,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" with","item_id":"rs_06c839edbdd88254016a3c11a93e1481908acf9bbba9834b75","obfuscation":"loq7xKpkmO9","output_index":0,"sequence_number":72,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" make","item_id":"rs_04fcf497c9f5b8760169b2ffa108888195ba649a92a2f17e92","obfuscation":"PhOBGcdnp17","output_index":0,"sequence_number":73,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" the","item_id":"rs_06c839edbdd88254016a3c11a93e1481908acf9bbba9834b75","obfuscation":"rrDpAwK1utLW","output_index":0,"sequence_number":73,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" sure","item_id":"rs_04fcf497c9f5b8760169b2ffa108888195ba649a92a2f17e92","obfuscation":"0024BgFNds5","output_index":0,"sequence_number":74,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" user","item_id":"rs_06c839edbdd88254016a3c11a93e1481908acf9bbba9834b75","obfuscation":"2eOiiEzIvMq","output_index":0,"sequence_number":74,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" the","item_id":"rs_04fcf497c9f5b8760169b2ffa108888195ba649a92a2f17e92","obfuscation":"LdIMyglckry1","output_index":0,"sequence_number":75,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" if","item_id":"rs_06c839edbdd88254016a3c11a93e1481908acf9bbba9834b75","obfuscation":"AgXToVjbv8qV4","output_index":0,"sequence_number":75,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" parameters","item_id":"rs_04fcf497c9f5b8760169b2ffa108888195ba649a92a2f17e92","obfuscation":"wfs2k","output_index":0,"sequence_number":76,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" they","item_id":"rs_06c839edbdd88254016a3c11a93e1481908acf9bbba9834b75","obfuscation":"mfaYEMEi1Lo","output_index":0,"sequence_number":76,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" are","item_id":"rs_04fcf497c9f5b8760169b2ffa108888195ba649a92a2f17e92","obfuscation":"CTTCjhZlZp0T","output_index":0,"sequence_number":77,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" want","item_id":"rs_06c839edbdd88254016a3c11a93e1481908acf9bbba9834b75","obfuscation":"DudPB1LdhlB","output_index":0,"sequence_number":77,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" formatted","item_id":"rs_04fcf497c9f5b8760169b2ffa108888195ba649a92a2f17e92","obfuscation":"i2Rsd4","output_index":0,"sequence_number":78,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" the","item_id":"rs_06c839edbdd88254016a3c11a93e1481908acf9bbba9834b75","obfuscation":"s4SSZjWnamxA","output_index":0,"sequence_number":78,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" correctly","item_id":"rs_04fcf497c9f5b8760169b2ffa108888195ba649a92a2f17e92","obfuscation":"GopIfg","output_index":0,"sequence_number":79,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" forecast","item_id":"rs_06c839edbdd88254016a3c11a93e1481908acf9bbba9834b75","obfuscation":"ibVLgsS","output_index":0,"sequence_number":79,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" before","item_id":"rs_04fcf497c9f5b8760169b2ffa108888195ba649a92a2f17e92","obfuscation":"GwaiQDSrz","output_index":0,"sequence_number":80,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" or","item_id":"rs_06c839edbdd88254016a3c11a93e1481908acf9bbba9834b75","obfuscation":"VdfdLn4iYogy5","output_index":0,"sequence_number":80,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" calling","item_id":"rs_04fcf497c9f5b8760169b2ffa108888195ba649a92a2f17e92","obfuscation":"z9XLGa6O","output_index":0,"sequence_number":81,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" hourly","item_id":"rs_06c839edbdd88254016a3c11a93e1481908acf9bbba9834b75","obfuscation":"f60ZG87Mb","output_index":0,"sequence_number":81,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" the","item_id":"rs_04fcf497c9f5b8760169b2ffa108888195ba649a92a2f17e92","obfuscation":"W6z5avP60X6g","output_index":0,"sequence_number":82,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" details","item_id":"rs_06c839edbdd88254016a3c11a93e1481908acf9bbba9834b75","obfuscation":"y5b6PO4F","output_index":0,"sequence_number":82,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" function","item_id":"rs_04fcf497c9f5b8760169b2ffa108888195ba649a92a2f17e92","obfuscation":"01nyced","output_index":0,"sequence_number":83,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":".","item_id":"rs_06c839edbdd88254016a3c11a93e1481908acf9bbba9834b75","obfuscation":"k4MzWLTTa9DUTAx","output_index":0,"sequence_number":83,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" to","item_id":"rs_04fcf497c9f5b8760169b2ffa108888195ba649a92a2f17e92","obfuscation":"LWRMOigFdOkMu","output_index":0,"sequence_number":84,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" Let","item_id":"rs_06c839edbdd88254016a3c11a93e1481908acf9bbba9834b75","obfuscation":"12nmAOTngUEl","output_index":0,"sequence_number":84,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" get","item_id":"rs_04fcf497c9f5b8760169b2ffa108888195ba649a92a2f17e92","obfuscation":"C60vGpZuOAFg","output_index":0,"sequence_number":85,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":"’s","item_id":"rs_06c839edbdd88254016a3c11a93e1481908acf9bbba9834b75","obfuscation":"10QWmmWN78aF4T","output_index":0,"sequence_number":85,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" the","item_id":"rs_04fcf497c9f5b8760169b2ffa108888195ba649a92a2f17e92","obfuscation":"ZJnmWEFyvAfb","output_index":0,"sequence_number":86,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" call","item_id":"rs_06c839edbdd88254016a3c11a93e1481908acf9bbba9834b75","obfuscation":"lSC3ynpcY5K","output_index":0,"sequence_number":86,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" weather","item_id":"rs_04fcf497c9f5b8760169b2ffa108888195ba649a92a2f17e92","obfuscation":"0n1INf1F","output_index":0,"sequence_number":87,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" functions","item_id":"rs_06c839edbdd88254016a3c11a93e1481908acf9bbba9834b75","obfuscation":"MwtxGC","output_index":0,"sequence_number":87,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" information","item_id":"rs_04fcf497c9f5b8760169b2ffa108888195ba649a92a2f17e92","obfuscation":"ATfU","output_index":0,"sequence_number":88,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":".weather","item_id":"rs_06c839edbdd88254016a3c11a93e1481908acf9bbba9834b75","obfuscation":"3Pz9Ajop","output_index":0,"sequence_number":88,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" for","item_id":"rs_04fcf497c9f5b8760169b2ffa108888195ba649a92a2f17e92","obfuscation":"4eW36M82TANU","output_index":0,"sequence_number":89,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" now","item_id":"rs_06c839edbdd88254016a3c11a93e1481908acf9bbba9834b75","obfuscation":"v3bHQAxAiV5L","output_index":0,"sequence_number":89,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" the","item_id":"rs_04fcf497c9f5b8760169b2ffa108888195ba649a92a2f17e92","obfuscation":"OrltIY8atna0","output_index":0,"sequence_number":90,"summary_index":0} - - event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" user","item_id":"rs_04fcf497c9f5b8760169b2ffa108888195ba649a92a2f17e92","obfuscation":"13PvkpcDXRG","output_index":0,"sequence_number":91,"summary_index":0} - - event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":".","item_id":"rs_04fcf497c9f5b8760169b2ffa108888195ba649a92a2f17e92","obfuscation":"zbqk5UVXNUVyW90","output_index":0,"sequence_number":92,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":"!","item_id":"rs_06c839edbdd88254016a3c11a93e1481908acf9bbba9834b75","obfuscation":"3PgcGVeBKshDJU1","output_index":0,"sequence_number":90,"summary_index":0} event: response.reasoning_summary_text.done - data: {"type":"response.reasoning_summary_text.done","item_id":"rs_04fcf497c9f5b8760169b2ffa108888195ba649a92a2f17e92","output_index":0,"sequence_number":93,"summary_index":0,"text":"**Getting weather for Florence**\n\nThe user wants to know the weather in Florence, Italy. I see that we have a tool to retrieve weather data. I’ll call the function directly with the location specified as \"Florence, Italy.\" Since we only need one tool for this request, I don’t need to worry about running multiple tools simultaneously. I’ll make sure the parameters are formatted correctly before calling the function to get the weather information for the user."} + data: {"type":"response.reasoning_summary_text.done","item_id":"rs_06c839edbdd88254016a3c11a93e1481908acf9bbba9834b75","output_index":0,"sequence_number":91,"summary_index":0,"text":"**Getting weather for Florence**\n\nThe user wants to know the current weather in Florence, Italy. I’ll use the functions.weather tool to get that information. No need for complex multi-tool usage here. I’ll present the data in a concise way, including temperature, conditions, humidity, wind, and maybe time of observation, while indicating the units. I should also check with the user if they want the forecast or hourly details. Let’s call functions.weather now!"} event: response.reasoning_summary_part.done - data: {"type":"response.reasoning_summary_part.done","item_id":"rs_04fcf497c9f5b8760169b2ffa108888195ba649a92a2f17e92","output_index":0,"part":{"type":"summary_text","text":"**Getting weather for Florence**\n\nThe user wants to know the weather in Florence, Italy. I see that we have a tool to retrieve weather data. I’ll call the function directly with the location specified as \"Florence, Italy.\" Since we only need one tool for this request, I don’t need to worry about running multiple tools simultaneously. I’ll make sure the parameters are formatted correctly before calling the function to get the weather information for the user."},"sequence_number":94,"summary_index":0} + data: {"type":"response.reasoning_summary_part.done","item_id":"rs_06c839edbdd88254016a3c11a93e1481908acf9bbba9834b75","output_index":0,"part":{"type":"summary_text","text":"**Getting weather for Florence**\n\nThe user wants to know the current weather in Florence, Italy. I’ll use the functions.weather tool to get that information. No need for complex multi-tool usage here. I’ll present the data in a concise way, including temperature, conditions, humidity, wind, and maybe time of observation, while indicating the units. I should also check with the user if they want the forecast or hourly details. Let’s call functions.weather now!"},"sequence_number":92,"summary_index":0} event: response.output_item.done - data: {"type":"response.output_item.done","item":{"id":"rs_04fcf497c9f5b8760169b2ffa108888195ba649a92a2f17e92","type":"reasoning","encrypted_content":"gAAAAABpsv-jnw-8k8joGbz9prEL9dInrQvwbBWXW0nxP4nK5UOuxwv18bg-W6PX9ub5V8zZPTj2oCgLEE-oAaysTT-9mJDXjQx5BwgZ4wAvS2_GqNjRbC8oBeZrPCrDhph7vW-iUMmIoNo8b4Nlw3OjQucXwKrOxFVsBLhG4dOuSs2qd5TGo5JUdNT-JPHJpT4HMQaHR2oIDr_jlrrnEn9GwGBpSclxtki0TYtUe1TEDVHaZBdt5Z9cnvWNmRmMDfyzgpqNgfymkZHMaix3lQmIWfAcGDj0kxrkwr30sgXeCrIainT1He1dlsSpn9la5B-XgbB8o7qJBYUQ1R5Ij4T2lfQZLprUkAwuQCqyU5MGsTOKGW0FtrY2J9emu00RMzZK3cHk7HlqZZIgurPs02JkuKDQwQuzuzk_EYLpCHUcRxbPbRhA8hwl2iYk0teY8pzczaWUa1wqSTZc8C5f9OufDwgbhDr5TELmG15kEIyHAhmDKfg53EkB0DwXWq7DBmzRM9HdDJxLzgFH2Fx0VCCwC74OnWLa7dB-FRtd-qCyNL26kmXXcqxZRLyxu9-3xZ_aDtlslwTSvt-xRlFeOChBYqQXGoNefSXBPHf-vLfE0fZoefNkUrSZz9K-9kSjd6weQTcUlyW9RdFdKMqWr-F9lXA0mAeT3GZ8SGr3_sX84TwkBqN1nkeXIszNvYJJ5dl3Piz-USPwrL9IuTf5LjYgEhu6b37yWLjReCa5H95WAv2vQ-V9i5E-Md9P1JVb7MOJ88VUaL-QlOuUXIx-1hxE_nJq1AoIeQo2WUfHz-txaOrr6URrl6XZXCdJCfMkrpQnX4AUlAR1iktFa2a5BICu0edcx5uu2Gr8xWSVIGgA4G2ptKiqaw7an3qy4Ax1Frdo7nCtoWHFRGmz3eLgdHBx0-pKlgRGYf9pA_I4pFLeoUv9GcBpkOSJUiS8Oz654LjBhm6vGUqeO4-lV1dymdHosYohhwaRofpkBM7ifvw8f_4YJVlq7vu-SLjIiGpmYCIrsoQiiFOz5cgxfakxq2jnO7GGTRuQk-GoazyieNSY81M1GLucxcBhGpp-UVQheY2h6jD92xabhqumBsvfjYmpHHrEnPk7kx62-eruaxNV9vxAiFCN7diCTrz6YdRF-KDkPaD9mSrSlorh7jOFVOlBOxIXcLCqkg-am4OeJ52oDbGDsQAZFSiNXryQ4FrC5c516Lt4I4KpH-Q4pVvbYwsWygIIWwkAum_SuY-ZxgEFB-ActdIqagx66ercXNw--rkkgM0YNX13BntoWYj4VS1bQIy7UHTwT1WWcW0H0wxE4YJCjq8dcxzojw4KzreHmn7uPZJqjrh_VqYoiMMew-8kgunmKzW7vD7-rNWJTVEiOnMHWId04ojT49qaMes0yE0eb9SB79nSFLZavsskel-3Yro8JNBjqUiXNCYT2EUk0sau8PhUkVyleTLTuPvxXI6Azo-okOOBmUxYYanxeNkae-5gu9u2JshdYY7k1c8aupW62zvuMR4poDCjCoPLpTUjeV_It5e1XHtc8FNmsMenpwsL3xFzman8wwYW_MZ__OYNmeDoLkt8TkHdyNN7Ne5UhiqMYL_1uZV1RHzB2l5X-WAjI48ZF5blgM-2rQsWNQXCyPJpBE1Fg1c26iED1TLlbwEax2Q2","summary":[{"type":"summary_text","text":"**Getting weather for Florence**\n\nThe user wants to know the weather in Florence, Italy. I see that we have a tool to retrieve weather data. I’ll call the function directly with the location specified as \"Florence, Italy.\" Since we only need one tool for this request, I don’t need to worry about running multiple tools simultaneously. I’ll make sure the parameters are formatted correctly before calling the function to get the weather information for the user."}]},"output_index":0,"sequence_number":95} + data: {"type":"response.output_item.done","item":{"id":"rs_06c839edbdd88254016a3c11a93e1481908acf9bbba9834b75","type":"reasoning","encrypted_content":"gAAAAABqPBGr7nnEI4VIL9-IqFeO9pgvdt1Ka9HR0SFBoMVyCmLOv1ucLR5ImX-wNBUjoJ-kHw-7k-yBEm-ipXOd-nerxErWjTIDIMe9Txt7uVA4XnkPZuMNE1dw7cE6cffDvkmDhDPsAPTxWX6umBEucuvuPtW8ZWxnllKmeo5O_qj1q26hC_Oy8zXuyauOCw9IRhWtDvVePPLSDVY34ZXnxw-YL34Lnry0vBndPGHdFPThr4N-a9UNF3rupFZ3XrZG4PpjLC7pr4CWbCKTYsy1hNbiFiGqsA-DbEE8QdgMHLxcSD3l9-quBBDzo361DPJt013NVkKr2xSzoEXSVxKMFZYJURbpq8d4IVmruekC6TKO5AmqxeX-wL49RVZMDKmclf4eXyNIBSr41FXs1z4tRf5JdTqai2ZHU6h3pqa93-zQcM4R-muroaUKyxCp-HjpBQ2VtN-cvNy5x1XJovabzu5liAkdieGyqrWNELmWGO0ZHiw6PjlA5f6sFvDTOsNFqWdsWZI1k2y_16RmEKL5lCYHABKTx1Og_uahmwnblv72TWZZCgRo-0mJT7zshJUf_Qp_kgeDeETQly1JzGbsNRTYr8lQ3CZHmt_mZIGgJyXuv3A_9ms41XP1RkwMRdpFRF8qReZ3gTto1Ama0TZ3ciVHDEL83QW57soHeE-htKEDNFGVAJ47FPjyZ9GwvUu86SY3q-wC_NMgQ7PPlkRfW-3xmhWDS3etgYiru1AyPz_fEexOeNtbjB7Q9jfp_-RjJ32IIvNJPPT08cej5rJ58tHz6Di3b0nuVC1VprBQMVExfICI2n0kvxCPNYmz3mn4iOHdMYgFNURdI4OV6B8X-o1hLOSsQqn2hkDTlj5RuuI4H8SFw-8CAhrb4tHjzaVKvglSEJUtWJlgR1lkA-GQiO5CktJAK6GsOxye58pbUk6ZJMzNAQjKnT7M95_HkVZpjGaZhZBVFhvuUI357Fzp1ImYxscMkb3kAIVzZLNNHu8ida3oY4qdPHPtYDMezadSn6CPPdJ_M-JRlC9uWmqL__hCeRj90qkc8NCkRL7tTHsYMfGwvEkcCDDeN8p3R6Q2kBjm0m9bKJDqf1mF8L4jASdm6WrdaI3cDTFo0lS_9XLnXeWMPTI8kMZ4ml-LOa0ZMD6YgxlOn3VTGRrJ6Zk3tzik7a4JRJjS2VtgX-5FRfhSGcwluhSCHP_rgcFKgtU3AyzX1u0UUXuP3ePpWQ6M1jSo-ViavjaGLk1YO8CyriR6U07ITrbyHMeXJjgGc_a8M3wrg35i7SkhVGlGLyY242I7VNxebEvEjvIhBaeqa5wUlmGCd5_gk4Ay0MOi94csvigzWVwNe0LasWOGaB4Y9mgF1UX0urgfjkGO1gxZQe4Nn-EyGbPC9Kez5MLu2nzrFNloDtEBwHhp9ULj6JldiDy5H-5A1HWrSQZanHpTQSfp7DoXUoULrOEnVpSL_VM5jOP4NX_A6FwCj-dJfmVy-T2SavJb4WOQbrZOnCbZJn-f66DClWbUgHAfYezQ5jE6voP-vPBu1tWwatxrXeB5IHyckfE6GcS3KLIICchmYy3zyuIOtUOD2VhxEYNxPXnlooK4fBbwTU1yEBZ94jk4H_RYpOaROaWKrAStQ4pb5GtsAhI1ehMd8kybgwrzE-rzhKhE-vp-mlydvzWNyS9v0sRrQauQpS2ihRyU0-s3CnMp_HZZvmE=","summary":[{"type":"summary_text","text":"**Getting weather for Florence**\n\nThe user wants to know the current weather in Florence, Italy. I’ll use the functions.weather tool to get that information. No need for complex multi-tool usage here. I’ll present the data in a concise way, including temperature, conditions, humidity, wind, and maybe time of observation, while indicating the units. I should also check with the user if they want the forecast or hourly details. Let’s call functions.weather now!"}]},"output_index":0,"sequence_number":93} event: response.output_item.added - data: {"type":"response.output_item.added","item":{"id":"fc_04fcf497c9f5b8760169b2ffa378c08195bcc5eb704165237e","type":"function_call","status":"in_progress","arguments":"","call_id":"call_XjLMCgd17m2E4EOiIVoc4J91","name":"weather"},"output_index":1,"sequence_number":96} + data: {"type":"response.output_item.added","item":{"id":"fc_06c839edbdd88254016a3c11ab9f1c819084fd5aef02a61a57","type":"function_call","status":"in_progress","arguments":"","call_id":"call_ylSv4Nh5Sjuh7A6vOintVfwF","name":"weather"},"output_index":1,"sequence_number":94} event: response.function_call_arguments.delta - data: {"type":"response.function_call_arguments.delta","delta":"{\"","item_id":"fc_04fcf497c9f5b8760169b2ffa378c08195bcc5eb704165237e","obfuscation":"nmq10hgv4z0jCI","output_index":1,"sequence_number":97} + data: {"type":"response.function_call_arguments.delta","delta":"{\"","item_id":"fc_06c839edbdd88254016a3c11ab9f1c819084fd5aef02a61a57","obfuscation":"nL1VUcitmhDapN","output_index":1,"sequence_number":95} event: response.function_call_arguments.delta - data: {"type":"response.function_call_arguments.delta","delta":"location","item_id":"fc_04fcf497c9f5b8760169b2ffa378c08195bcc5eb704165237e","obfuscation":"5gOII4M6","output_index":1,"sequence_number":98} + data: {"type":"response.function_call_arguments.delta","delta":"location","item_id":"fc_06c839edbdd88254016a3c11ab9f1c819084fd5aef02a61a57","obfuscation":"8jGLy1kg","output_index":1,"sequence_number":96} event: response.function_call_arguments.delta - data: {"type":"response.function_call_arguments.delta","delta":"\":\"","item_id":"fc_04fcf497c9f5b8760169b2ffa378c08195bcc5eb704165237e","obfuscation":"gibBvxVc5aK3b","output_index":1,"sequence_number":99} + data: {"type":"response.function_call_arguments.delta","delta":"\":\"","item_id":"fc_06c839edbdd88254016a3c11ab9f1c819084fd5aef02a61a57","obfuscation":"3cmlHIuuwz7Ys","output_index":1,"sequence_number":97} event: response.function_call_arguments.delta - data: {"type":"response.function_call_arguments.delta","delta":"Flor","item_id":"fc_04fcf497c9f5b8760169b2ffa378c08195bcc5eb704165237e","obfuscation":"h4dICw59Jwtu","output_index":1,"sequence_number":100} + data: {"type":"response.function_call_arguments.delta","delta":"Flor","item_id":"fc_06c839edbdd88254016a3c11ab9f1c819084fd5aef02a61a57","obfuscation":"WBOdjQxpvJx4","output_index":1,"sequence_number":98} event: response.function_call_arguments.delta - data: {"type":"response.function_call_arguments.delta","delta":"ence","item_id":"fc_04fcf497c9f5b8760169b2ffa378c08195bcc5eb704165237e","obfuscation":"5KaojRMDvKNj","output_index":1,"sequence_number":101} + data: {"type":"response.function_call_arguments.delta","delta":"ence","item_id":"fc_06c839edbdd88254016a3c11ab9f1c819084fd5aef02a61a57","obfuscation":"O2mC2ZR9pKVr","output_index":1,"sequence_number":99} event: response.function_call_arguments.delta - data: {"type":"response.function_call_arguments.delta","delta":",","item_id":"fc_04fcf497c9f5b8760169b2ffa378c08195bcc5eb704165237e","obfuscation":"MuePvpyKek9OoK0","output_index":1,"sequence_number":102} + data: {"type":"response.function_call_arguments.delta","delta":",","item_id":"fc_06c839edbdd88254016a3c11ab9f1c819084fd5aef02a61a57","obfuscation":"iJ83rL8HkXl122S","output_index":1,"sequence_number":100} event: response.function_call_arguments.delta - data: {"type":"response.function_call_arguments.delta","delta":" Italy","item_id":"fc_04fcf497c9f5b8760169b2ffa378c08195bcc5eb704165237e","obfuscation":"4l8OvQJrZk","output_index":1,"sequence_number":103} + data: {"type":"response.function_call_arguments.delta","delta":" Italy","item_id":"fc_06c839edbdd88254016a3c11ab9f1c819084fd5aef02a61a57","obfuscation":"DGeoRPZZvu","output_index":1,"sequence_number":101} event: response.function_call_arguments.delta - data: {"type":"response.function_call_arguments.delta","delta":"\"}","item_id":"fc_04fcf497c9f5b8760169b2ffa378c08195bcc5eb704165237e","obfuscation":"Szejg8HJQHOQ2S","output_index":1,"sequence_number":104} + data: {"type":"response.function_call_arguments.delta","delta":"\"}","item_id":"fc_06c839edbdd88254016a3c11ab9f1c819084fd5aef02a61a57","obfuscation":"3Jjie5Q2arP8HT","output_index":1,"sequence_number":102} event: response.function_call_arguments.done - data: {"type":"response.function_call_arguments.done","arguments":"{\"location\":\"Florence, Italy\"}","item_id":"fc_04fcf497c9f5b8760169b2ffa378c08195bcc5eb704165237e","output_index":1,"sequence_number":105} + data: {"type":"response.function_call_arguments.done","arguments":"{\"location\":\"Florence, Italy\"}","item_id":"fc_06c839edbdd88254016a3c11ab9f1c819084fd5aef02a61a57","output_index":1,"sequence_number":103} event: response.output_item.done - data: {"type":"response.output_item.done","item":{"id":"fc_04fcf497c9f5b8760169b2ffa378c08195bcc5eb704165237e","type":"function_call","status":"completed","arguments":"{\"location\":\"Florence, Italy\"}","call_id":"call_XjLMCgd17m2E4EOiIVoc4J91","name":"weather"},"output_index":1,"sequence_number":106} + data: {"type":"response.output_item.done","item":{"id":"fc_06c839edbdd88254016a3c11ab9f1c819084fd5aef02a61a57","type":"function_call","status":"completed","arguments":"{\"location\":\"Florence, Italy\"}","call_id":"call_ylSv4Nh5Sjuh7A6vOintVfwF","name":"weather"},"output_index":1,"sequence_number":104} event: response.completed - data: {"type":"response.completed","response":{"id":"resp_04fcf497c9f5b8760169b2ff9ff27081959917b8d19daecc20","object":"response","created_at":1773338527,"status":"completed","background":false,"completed_at":1773338531,"content_filters":[{"blocked":false,"source_type":"prompt","content_filter_raw":[],"content_filter_results":{"jailbreak":{"detected":false,"filtered":false},"hate":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"}},"content_filter_offsets":{"start_offset":0,"end_offset":71,"check_offset":0}},{"blocked":false,"source_type":"completion","content_filter_raw":[],"content_filter_results":{"protected_material_code":{"detected":false,"filtered":false},"protected_material_text":{"detected":false,"filtered":false},"hate":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"}},"content_filter_offsets":{"start_offset":0,"end_offset":1768,"check_offset":0}}],"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":null,"max_tool_calls":null,"model":"gpt-5-mini","output":[{"id":"rs_04fcf497c9f5b8760169b2ffa108888195ba649a92a2f17e92","type":"reasoning","encrypted_content":"gAAAAABpsv-jBrQ4LVAC5zkrS3m_r00gmzK5Q_jjvymogbm0AhYvxWAB1U_bPm_VD-Hv-yDATwzPCxFMLGG4zHyU8pDWcK-qkmPCZVRzPtDIKxM1ZpvznQ-DdluoITRXf1OiH08HpjPmj15qlksMZTTiX3mwabpENCI_ZISGc3kBO-55bn4g5kPxXYirkrD5pNSIvqNkqA3TvrDmf2aEEBB2pMlO9U7MAyZQtZNr2p625yneHEqo_l8MAu5SvUP1WNEA4-TPWebRzvMReAIecbT_jNFmaZzZWZMnma_l6dkkZ6g7KbrG4F_wk_4McVxdde8vSRuLzxttatIEe0YF8zWiazBVJdTj3paF71ot8IQBfHJluGpzxGRSRA-Rd0S99KNlKa2-qbAuN7PkLrcNcBlcKE6t4mDDX4OU5jdNfCWpPI1quAd6y1nw7kgUS-fbtAO82VMlhHcbuaFhifjEVvKPiAGM9dXYho4IIxQylnAv3Uf1N2oiVm_LVgyEguPRUzP4dOUGAhKjHfqVziPzKQnG51ceduGxJKibcZhsEUltOcvhVr5uiQtIUMdF_AnldZB5Mo-rrDni16vzFTZ9A7cfHx7qIpCl1JuZ1LmIYdmI22uavQvXB9le5Sjb76m7zBXLR8akmxhkcq76G1JqglnG_DH-FT0dOlpm0vB0miqEIKlRhlsL4BxmxGOIqiiSkZGKEuMYKoluSCSxFVsroh1KTILwToRdU3MI27MfW9FbH3-7-feESZAOlbsPor6sqlaAsVNZB7lFXsxqLt3l_RQmkoUDXOhmWkdVHVRd2nefHyzzaf7oTpD3JQ7PO573WOWRBvAbK8SSKVha4D7ga47JHV2goKhxvPe_wqy1WSw7z_FKnOuYYMQA5tsiy5_98nPBHwCvOufmWwafInyquU2t4hJ6z63s9chFPjC_6WIYj0HsBs610LjWR_PfHs9jGTIkE66wVtA48KgQOItYL1Fyy9nKEpe7rJ-v9kvM5utTSrDqXuasTmLXQBSWHkPEG95gBeim3SVd1TkaPaJntSG1kozVKbRiBate7JH-kM6CyBNod8I2adX_bMInCZl5aLIGgGMsNO6M5WA5Xfi3BK_hej1-Dz2vfDi6PXf8CYysHNJmmhQmz7TYg8gZnoBvhBj_3Zfq_EJcooO0cl8tWFjlpXBidvZhfSg1yCpsHOwhccxfNMKyLu8rK1cIoV7RkTfM6m01cCIgI_Ovh64it8RQrx6L47edwwRSm3cHHCCiGolm4t9j-ncf6WPD9mNHDVV5zCjb3CFlrDjCQKJH0o8NhNEDLT4X6VDeXEIu3rcn6E3ddhmZw_7VPESit99IsSqiyEYeQAJBEFN6AqpWiGKl26tEGRKGToI2P_f0bL1d7aVAHwN7e6WRXrvj5NUmgCHWpysBE0vMbXbYxt5LqPu9HWwqOTvKFfjgLnWGKO2RwHy9G-i23j2SFFwwsdIokMS9RXYwJ8csSl1JVz1pEINBc1G-_8-5gbhWi-Fnkw4SCVSw6R15xy28GdCiRVsA7CTYXd26sVSGxj7YToQWmb1q5LDeR2xQKl2ggFS4zL62_5ASmyaTgyFzCz0TKA70mhmKVZh8NwYj7f6HLKMPTdzd8Mja5Fxa6VbxC7OZYQNrbJ-P_idjU6lJr0Ir1L0Ju1KNRGrByJgH","summary":[{"type":"summary_text","text":"**Getting weather for Florence**\n\nThe user wants to know the weather in Florence, Italy. I see that we have a tool to retrieve weather data. I’ll call the function directly with the location specified as \"Florence, Italy.\" Since we only need one tool for this request, I don’t need to worry about running multiple tools simultaneously. I’ll make sure the parameters are formatted correctly before calling the function to get the weather information for the user."}]},{"id":"fc_04fcf497c9f5b8760169b2ffa378c08195bcc5eb704165237e","type":"function_call","status":"completed","arguments":"{\"location\":\"Florence, Italy\"}","call_id":"call_XjLMCgd17m2E4EOiIVoc4J91","name":"weather"}],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":"high","summary":"detailed"},"safety_identifier":null,"service_tier":"default","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":{"input_tokens":66,"input_tokens_details":{"cached_tokens":0},"output_tokens":148,"output_tokens_details":{"reasoning_tokens":64},"total_tokens":214},"user":null,"metadata":{}},"sequence_number":107} + data: {"type":"response.completed","response":{"id":"resp_06c839edbdd88254016a3c11a88b2c819088dec76bd24ec72b","object":"response","created_at":1782321576,"status":"completed","background":false,"completed_at":1782321579,"content_filters":[{"blocked":false,"source_type":"prompt","content_filter_raw":[],"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"jailbreak":{"detected":false,"filtered":false}},"content_filter_offsets":{"start_offset":0,"end_offset":71,"check_offset":0}},{"blocked":false,"source_type":"completion","content_filter_raw":[],"content_filter_results":{"protected_material_code":{"detected":false,"filtered":false},"protected_material_text":{"detected":false,"filtered":false},"hate":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"}},"content_filter_offsets":{"start_offset":0,"end_offset":616,"check_offset":0}}],"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":null,"max_tool_calls":null,"model":"gpt-5-mini","moderation":null,"output":[{"id":"rs_06c839edbdd88254016a3c11a93e1481908acf9bbba9834b75","type":"reasoning","encrypted_content":"gAAAAABqPBGrKjD01kd8LMXKPzrpUQYsnwVjal8SpqEIhimpPhoChqmxgLH8L2RLWNMSy37RyUyU9iIJKYtt8Mn7uN6qV7EUb8lgs156Wi_vZ4X-n-YM2m0_DWFCbhINqe6e5apwQyYulZ_I1pxU81uYZyzPJTDpttS3TOTMZCyhHgtbV603M6B2_V-ybYqw5yDw9iR_Nuzfe1TcuQz7vsFyUyoRBzjFXHlSFNiIPkwiz96UYwvnCgeMyaQtws1xm6VaafJtgUG-pdc5xIjyHEMVzSo0H6O9bFksSrH-pghZuuH3Hy8m-FFvc7IeQ5wDmj-H0XlNYlc9stt8uA859JrhYBfBldcDJiAGyMJxFschDh6YsuS11n5nsxK7UC7Tv6lqePofW2AJCTl59iapVyN3efokT1eAFRCl5B5OJ2qqEbeC_eb2iIjKlsczf1V-Mk4tbe3UOQfTGl1-VzQ4oyBvLGGBLSycOpskN27pmJA8e4X935_avrLvBA18FEt4GRZjxI43KcXoaemmbhBzH8Lz8TozvbNPu3L9NRdUtu17S-O2hsRSfVmRdr6oNiIxgwDQedNXnNLkCCXyrQxqi2j8iUxxHVF37HqTh-klUQal6Nca7WO1EEBZvIgz-Hb6M0TSuU4H72I4m-n4dSzvJWPKmXNwjTZBsj0tF01bXJWQoMgFTSjGdyOquoD8yCm_lo6ecToGvKFIsqS8Td5eXZzND73avrQbTWPWR6MWSbMDX0s2VptE86CJr0D5mvxsbtD2KSCSsILbsujUeUddQrbFgx5sa0OrccyCv2xpxVVU32OChACmJycuWz5k-qNKN4jXVRPfnqZ3-ypK0dxw12J3pwqVHCvHq-ZDNSvh1_2ZeQvkQuU5NTSM6LUYkwevx2K7JNpLnZja2R0QoINWL5x0L2uct-BwaMH8K5N7J4YLNTF30g6TAcpYs-riH1TlH39IjPLEgg7xXKdFT19oa8rgfHONIU7T4oxsif-JQrNKW3J23OoyTklW1W3fR19ogd-r8QrnrKKF6wJYoQy9Q5hzzrw4xRjESh8jPvb8Pl8AINWlWD6gXtmrpaC3_HUHCjZGcPqOWrlUfcQ5l8JViZRRW6LZWczbIwb_vmoPacHGV9NdKJGHH9AplK1DbHKXGESHkgkTmOJBvoTIKyTY4CCSZ39Ds595yvLgHtsOcaSJvN3PC_BiWOXGoH7JoIrg3lfCPAF1bQ1xlwZ9n5QisKTnfH2MjpZ-x_C7DldtxYhOMKjhp05JRyS294p4up8dnyI-4mV5Kvsw9qxwPR9gznNxZ5yYHrU3z2gmLCoP5eKEFdmGii7xnV1CnzNeNvGKf8cjAcGeYpTuHbxSuHA2Gqq0DbgNqKjhSTKlmeIXRgwu1V9VncI7f6-XbFsik5JRxJjzfzWUf-WTE21f583gwHpIx0eWpxtLza2Y8a_uY4rN00k4IcjwyXmSHNCcR1rP04SEAf_68YjkgrKnNgZErcC-_iwYpaAcAW3HjKBDW_BryOMDe5SUkWOWl8flEwCXvSuhNPBEVjckSQb9NeoEeciyhb9fCdVMZLiyxr_ku0yqNm-q5NrKgzB48wVkMo99iFrb-nzkQOmLK2ddq28Sf-NHiVXALjmIo2IfN9l61YpsNews3TfH5X8aI69pY2-YCQaw_x5c_HI1uHKVpAyH7wXoywLG9s0OjwydRxJVC4ukxs2MKtzaKxk=","summary":[{"type":"summary_text","text":"**Getting weather for Florence**\n\nThe user wants to know the current weather in Florence, Italy. I’ll use the functions.weather tool to get that information. No need for complex multi-tool usage here. I’ll present the data in a concise way, including temperature, conditions, humidity, wind, and maybe time of observation, while indicating the units. I should also check with the user if they want the forecast or hourly details. Let’s call functions.weather now!"}]},{"id":"fc_06c839edbdd88254016a3c11ab9f1c819084fd5aef02a61a57","type":"function_call","status":"completed","arguments":"{\"location\":\"Florence, Italy\"}","call_id":"call_ylSv4Nh5Sjuh7A6vOintVfwF","name":"weather"}],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":null,"effort":"high","summary":"detailed"},"safety_identifier":null,"service_tier":"default","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":{"input_tokens":63,"input_tokens_details":{"cached_tokens":0},"output_tokens":139,"output_tokens_details":{"reasoning_tokens":64},"total_tokens":202},"user":null,"metadata":{}},"sequence_number":105} headers: Content-Type: - text/event-stream; charset=utf-8 status: 200 OK code: 200 - duration: 329.587375ms + duration: 347.126875ms - id: 1 request: proto: HTTP/1.1 proto_major: 1 proto_minor: 1 - content_length: 805 + content_length: 793 host: "" - body: '{"store":false,"include":["reasoning.encrypted_content"],"input":[{"content":"You are a helpful assistant","role":"developer"},{"content":[{"text":"What''s the weather in Florence, Italy?","type":"input_text"}],"role":"user"},{"arguments":"\"{\\\"location\\\":\\\"Florence, Italy\\\"}\"","call_id":"call_XjLMCgd17m2E4EOiIVoc4J91","name":"weather","type":"function_call"},{"call_id":"call_XjLMCgd17m2E4EOiIVoc4J91","output":"40 C","type":"function_call_output"}],"model":"gpt-5-mini","reasoning":{"effort":"high","summary":"auto"},"tool_choice":"auto","tools":[{"strict":false,"parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"name":"weather","description":"Get weather information for a location","type":"function"}],"stream":true}' + body: '{"store":false,"include":["reasoning.encrypted_content"],"input":[{"content":"You are a helpful assistant","role":"developer"},{"content":[{"text":"What''s the weather in Florence, Italy?","type":"input_text"}],"role":"user"},{"arguments":"{\"location\":\"Florence, Italy\"}","call_id":"call_ylSv4Nh5Sjuh7A6vOintVfwF","name":"weather","type":"function_call"},{"call_id":"call_ylSv4Nh5Sjuh7A6vOintVfwF","output":"40 C","type":"function_call_output"}],"model":"gpt-5-mini","reasoning":{"effort":"high","summary":"auto"},"tool_choice":"auto","tools":[{"strict":false,"parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"name":"weather","description":"Get weather information for a location","type":"function"}],"stream":true}' headers: Accept: - application/json Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://fantasy-playground-resource.openai.azure.com/openai/v1/responses method: POST response: @@ -378,800 +372,1172 @@ interactions: content_length: -1 body: |+ event: response.created - data: {"type":"response.created","response":{"id":"resp_04fcf497c9f5b8760169b2ffa40e7c8195ae65d7c591fdc71e","object":"response","created_at":1773338532,"status":"in_progress","background":false,"completed_at":null,"content_filters":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":null,"max_tool_calls":null,"model":"gpt-5-mini","output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":"high","summary":"detailed"},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":0} + data: {"type":"response.created","response":{"id":"resp_060b1ce986da3b18016a3c11ac16088196b02990b9d9ba5934","object":"response","created_at":1782321580,"status":"in_progress","background":false,"completed_at":null,"content_filters":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":null,"max_tool_calls":null,"model":"gpt-5-mini","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":null,"effort":"high","summary":"detailed"},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":0} event: response.in_progress - data: {"type":"response.in_progress","response":{"id":"resp_04fcf497c9f5b8760169b2ffa40e7c8195ae65d7c591fdc71e","object":"response","created_at":1773338532,"status":"in_progress","background":false,"completed_at":null,"content_filters":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":null,"max_tool_calls":null,"model":"gpt-5-mini","output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":"high","summary":"detailed"},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":1} + data: {"type":"response.in_progress","response":{"id":"resp_060b1ce986da3b18016a3c11ac16088196b02990b9d9ba5934","object":"response","created_at":1782321580,"status":"in_progress","background":false,"completed_at":null,"content_filters":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":null,"max_tool_calls":null,"model":"gpt-5-mini","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":null,"effort":"high","summary":"detailed"},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":1} event: response.output_item.added - data: {"type":"response.output_item.added","item":{"id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","type":"reasoning","encrypted_content":"gAAAAABpsv-k1nGYEw1BYCakjhhW3k6pi8eN7_hmaW3BhFclJn8JepxztXuN2IjpvuuD8EcMFTo6gurwhiC507CZ-0ZlBZ1fVcUaVZMTfCj--OpGg9kFpy9utCH-R3PqtfzVcuIQzIN8UuN5QtXHnqnEq-GhhL7qEir9EO8CgHsMY6LyCo2DHDrMeabp7wZMQudyCo5H1DLLQLFx6XdOZAZxvaE6IGW7yCImzpxb8y61Ft_D0oWEKVNoXAgqczxZz2XuTfbgSotNwH058S2wHFYHrHUdYouPU9hP3KInWZ28nREeD71oyxmGhDz8ZQacH2ZalI0hwbhZFX3RD_SyXXMiZkasHOcWMafnkbUnf60ux8_Eb3MgcamjlNLsbz7-N_3BP22xYd0CeDlSu48Rf1jpfYoRaCquw59Meg99LPmJVVG_9LHzb_DJU4ma3DDd6reu-fzVfwhB9nBQjkLV0zA6dRWe4_ZiPLx_HW9mva_kZhvTr4noizN7mg3Lvk2q6wbqfPu2bvyYXjd0_UKaqsepo-1hyO6ZZUfoQIApKEhttd6n3exVULCImwWWL1T7UD4aRMSVhvuDy1jXqo_LwQPJNdsxsuo5Tlhj7aPlEfQmzuJ8MxcuKL_KUuu8pb7Xf3ytSjfBWKFGwbpml2xEzt5r6C-V5TCTBAc-U1OPVL5mt-gHHuul23Ag6GwsxWZsy1Bi3F1NtptbeIsZd5gj6oj8IesFeHsoiziHGRlW9Rsz6jnBfRRwjXNBeoMAtmf2WshsQn91El2E-HjIrHFHZAQ_yWnn7oMZGUj-2KzQzuPqVUzwmAB1Dw0=","summary":[]},"output_index":0,"sequence_number":2} + data: {"type":"response.output_item.added","item":{"id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","type":"reasoning","encrypted_content":"gAAAAABqPBGsQ7o-UumUlNuYz1ac4CuvJNgMl-CW4bqlE4ECoZjFRewShEcbzRQcxF83elqVTHB6FmNexiPXq_f6-JOhCXSBkTjUyXWAjPcfdp79jlzLVhGdkFj9KHSdJqPbwFhiRXO0o6rL93x3kjjcT9TskMkmW1U2Jd9UWl-Bx9khYtj0uF10zeTxbnWW3efh6iQVgBurSJPQMNeDN1aAkOQoqVt_s2blTEio4gQOil1Bj3h94DjoE8DpqfTESu755mwcWIEEN83RmspNubaB8xsGDc61029X9YJauACc7uGVueC_AUMaEch-nb6GHbEnRpKPYY-j8kNcIRINKbNcr2N_VZJ003GishALWrem0GoMt5rwn8b3VnEha4T6eM3W7_b8ucoOS2ApKIKilSqICO9duLIfVIddZpslrpdUcLeOZZk3VIvqFswk2AzmM7x8Qb-kjVofQWzV7iRCZyZiAp0OrH2DhCrr65CWbrFavl43NB3JkluJqkKkamRGWtvnfalwSHAtrDgN0uxtGlceB-qKoYVrUqbv8BBE4QXiwAUaNQyqohOCtwah2UoDNUEJtNy83Bvhl8i140qsF2vwOnHRfjFk8G8oCNqGI1kzsRZGy4UFhn0L2GRYjvzXS8o7DE-h_oWCH-_WODgzqe2Z3vKeajEUvDB-AFFHinrsmYgexlaHHo0iEw4uuuNnlGacwSmRj83cxoOHBlkX-ZXjz4dUg2ZdbBU0idLjH8q505C7B1nIdX4ZeuC9BtpKaO14PMtziOtxhdzNxDaUUoPL6SxrbomESeKgReBvwJn7Ec0kSLO2FkK7976KnCD9Uv1SdnyPZaDm7kl2SKiU-tT1uadUmS-UHonUfs3kfb-X70pC8IQKo2cvxPuPapLpbHBaXUmC7c2Z","summary":[]},"output_index":0,"sequence_number":2} event: response.reasoning_summary_part.added - data: {"type":"response.reasoning_summary_part.added","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","output_index":0,"part":{"type":"summary_text","text":""},"sequence_number":3,"summary_index":0} + data: {"type":"response.reasoning_summary_part.added","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","output_index":0,"part":{"type":"summary_text","text":""},"sequence_number":3,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":"**Analy","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"wK1fUrSZm","output_index":0,"sequence_number":4,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":"**Providing weather update**\n\nThe","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"7baylMhh0xZ1gQh","output_index":0,"sequence_number":4,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":"zing","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"SwitDHo6RB0j","output_index":0,"sequence_number":5,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" user","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"tvqTAJ0KQSi","output_index":0,"sequence_number":5,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" weather","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"atmWUDnm","output_index":0,"sequence_number":6,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" asked","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"IPDGTmxiKh","output_index":0,"sequence_number":6,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" response","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"YqMb6mZ","output_index":0,"sequence_number":7,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" about","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"R3LrkR3tX5","output_index":0,"sequence_number":7,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":"**\n\nI've","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"Glr60kHw","output_index":0,"sequence_number":8,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" the","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"jzcaOtOPHCMR","output_index":0,"sequence_number":8,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" called","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"akxD8WC0l","output_index":0,"sequence_number":9,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" weather","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"t0Vl0dTa","output_index":0,"sequence_number":9,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" the","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"pEkrlw9rb4SK","output_index":0,"sequence_number":10,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" in","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"54rwVKR06x3tl","output_index":0,"sequence_number":10,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" weather","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"sqn10j8w","output_index":0,"sequence_number":11,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" Florence","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"ZvR5YX2","output_index":0,"sequence_number":11,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" function","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"zLL0ebC","output_index":0,"sequence_number":12,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":",","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"0wjQvjk1frOWmrY","output_index":0,"sequence_number":12,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":",","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"DewsYPRaUOmdEE2","output_index":0,"sequence_number":13,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" Italy","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"pLDyhpnHeE","output_index":0,"sequence_number":13,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" and","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"ffGfvIsPdEtK","output_index":0,"sequence_number":14,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":".","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"4ASaOB68pXGCAFx","output_index":0,"sequence_number":14,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" it","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"ZiGvRyydUrS2M","output_index":0,"sequence_number":15,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" After","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"F0tkahHxTv","output_index":0,"sequence_number":15,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" returned","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"d9jWFsc","output_index":0,"sequence_number":16,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" calling","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"JES6cVB5","output_index":0,"sequence_number":16,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" \"","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"1uG330J3PZqiA7","output_index":0,"sequence_number":17,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" the","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"p6j4ODDFWeSf","output_index":0,"sequence_number":17,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":"40","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"LILlrV8Gyzy84f","output_index":0,"sequence_number":18,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" weather","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"SEOf7MWK","output_index":0,"sequence_number":18,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" C","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"eeAXMqe3UT5GTH","output_index":0,"sequence_number":19,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" tool","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"gneKv3E5Ume","output_index":0,"sequence_number":19,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":"\"","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"uqB0Qsb9ot3QEMr","output_index":0,"sequence_number":20,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":",","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"iK9tz637hIB5Av1","output_index":0,"sequence_number":20,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" which","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"O8TxX3t5UG","output_index":0,"sequence_number":21,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" I","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"1pzz6YKaJsX8q9","output_index":0,"sequence_number":21,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" seems","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"rthfykcbdU","output_index":0,"sequence_number":22,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" received","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"uIfSluk","output_index":0,"sequence_number":22,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" to","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"f29hsgmrU5NrD","output_index":0,"sequence_number":23,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" a","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"XapuFfsCwzGDLK","output_index":0,"sequence_number":23,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" be","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"qQlO3K0P9o5jZ","output_index":0,"sequence_number":24,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" response","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"Sim1IKU","output_index":0,"sequence_number":24,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" the","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"Ho3Vc5rbB2YY","output_index":0,"sequence_number":25,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" of","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"RQo34HvnUqE2c","output_index":0,"sequence_number":25,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" temperature","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"ZnqJ","output_index":0,"sequence_number":26,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" 40","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"Yso9ovV6g0rI0","output_index":0,"sequence_number":26,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":".","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"Gokx09epE12SDB3","output_index":0,"sequence_number":27,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":"°C","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"o5hKl44tPV9JxV","output_index":0,"sequence_number":27,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" Since","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"3EK2ELWSVz","output_index":0,"sequence_number":28,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":".","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"PQBDyM4BsEic3Fh","output_index":0,"sequence_number":28,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" it","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"rFriyQXq1euTf","output_index":0,"sequence_number":29,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" I","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"iMD5Q43OedOqYF","output_index":0,"sequence_number":29,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" only","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"wQJV2SHEWNE","output_index":0,"sequence_number":30,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" should","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"wxaMZua40","output_index":0,"sequence_number":30,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" provided","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"MuPDE7w","output_index":0,"sequence_number":31,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" keep","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"QSFV0kJKpBi","output_index":0,"sequence_number":31,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" that","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"vfv5glsdzMB","output_index":0,"sequence_number":32,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" my","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"26BJvBtuGmVu0","output_index":0,"sequence_number":32,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":",","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"iRKfYbOuxHKF6LU","output_index":0,"sequence_number":33,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" reply","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"0YTQZaFnOb","output_index":0,"sequence_number":33,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" I","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"4o7Y5uiRqFAOgB","output_index":0,"sequence_number":34,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" concise","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"MDvIliow","output_index":0,"sequence_number":34,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" need","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"69rOfsET4hr","output_index":0,"sequence_number":35,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":",","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"C7fCKfWiuC5dOLK","output_index":0,"sequence_number":35,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" to","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"MrlmIYRMhpVdy","output_index":0,"sequence_number":36,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" mentioning","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"hfYYF","output_index":0,"sequence_number":36,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" clarify","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"LWH1kdoO","output_index":0,"sequence_number":37,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" that","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"FTIs4GvBx25","output_index":0,"sequence_number":37,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" that","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"JCrCarRZfJC","output_index":0,"sequence_number":38,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" it's","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"sqOta4e69ek","output_index":0,"sequence_number":38,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" it's","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"5bI5kGTjpwQ","output_index":0,"sequence_number":39,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" quite","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"uRqbEOEJPg","output_index":0,"sequence_number":39,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" in","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"8vKS1uOLjZOAY","output_index":0,"sequence_number":40,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" hot","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"FCIDAPPLT2XO","output_index":0,"sequence_number":40,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" Celsius","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"Gq2L8tHp","output_index":0,"sequence_number":41,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":".","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"x5Xj46rh5LkBC4G","output_index":0,"sequence_number":41,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":",","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"vDZ7PR2CgPTIpVJ","output_index":0,"sequence_number":42,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" I","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"qqzH8RNw3qmNSQ","output_index":0,"sequence_number":42,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" and","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"Gb6OEgmdriLN","output_index":0,"sequence_number":43,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" could","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"5HSI9ehfXj","output_index":0,"sequence_number":43,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" I","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"0shYzJ75WKqhVT","output_index":0,"sequence_number":44,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" say","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"5G6QyLuDqojO","output_index":0,"sequence_number":44,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" should","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"Ki8fOnsla","output_index":0,"sequence_number":45,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" something","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"bWTQW9","output_index":0,"sequence_number":45,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" let","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"cvk1pGKoHoQX","output_index":0,"sequence_number":46,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" like","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"ZxX7ZPBbuNZ","output_index":0,"sequence_number":46,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" the","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"NmFj4yyBftmI","output_index":0,"sequence_number":47,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":":","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"6FfG5Vd3DzO4uwN","output_index":0,"sequence_number":47,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" user","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"AfmMAWNgH0d","output_index":0,"sequence_number":48,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" \"","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"NTIFn69y2DvCJK","output_index":0,"sequence_number":48,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" know","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"o5YiGhlCRTp","output_index":0,"sequence_number":49,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":"Current","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"glicVRc1C","output_index":0,"sequence_number":49,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" that","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"46cLFQActJz","output_index":0,"sequence_number":50,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" temperature","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"96s9","output_index":0,"sequence_number":50,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" it","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"Qu1d5nVOjjrIW","output_index":0,"sequence_number":51,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" in","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"lDfDTR4IzGMBn","output_index":0,"sequence_number":51,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":"’s","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"xo1xC6SYYcdtEq","output_index":0,"sequence_number":52,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" Florence","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"nCCwMcv","output_index":0,"sequence_number":52,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" quite","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"b9jOG3z5HF","output_index":0,"sequence_number":53,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":":","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"x3KQW0T7Ntf6g78","output_index":0,"sequence_number":53,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" hot","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"WRDL8I4rmV3D","output_index":0,"sequence_number":54,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" 40","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"QulnmrYmH1U2E","output_index":0,"sequence_number":54,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":".","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"vfpB9TeM67GOYPQ","output_index":0,"sequence_number":55,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":"°C","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"yDd7txCuelWesH","output_index":0,"sequence_number":55,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" I","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"IP2b1l90F16hgs","output_index":0,"sequence_number":56,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" (","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"5cRXdzE9sHlDnR","output_index":0,"sequence_number":56,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" could","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"gE0pTcrEWT","output_index":0,"sequence_number":57,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":"104","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"QJ8MM8uKRLwDB","output_index":0,"sequence_number":57,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" offer","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"WpueygSK8A","output_index":0,"sequence_number":58,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":"°F","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"OtabPrGRvFNq85","output_index":0,"sequence_number":58,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" to","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"H78TY21x5Exdq","output_index":0,"sequence_number":59,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":").\"","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"PDo8SBEwGDMTK","output_index":0,"sequence_number":59,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" provide","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"HXXMc68C","output_index":0,"sequence_number":60,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" It","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"86Ztqx44MG6Pn","output_index":0,"sequence_number":60,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" more","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"dxKAlMYACYD","output_index":0,"sequence_number":61,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" might","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"tAxLK2Scyx","output_index":0,"sequence_number":61,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" details","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"SndUTnuv","output_index":0,"sequence_number":62,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" be","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"0ihZ0H0oCfxGE","output_index":0,"sequence_number":62,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" such","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"jSZ4rMWsTSm","output_index":0,"sequence_number":63,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" good","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"Xrkwy9XOEcI","output_index":0,"sequence_number":63,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" as","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"pM6rUgM5T9Lj4","output_index":0,"sequence_number":64,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" to","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"bZXducNbIxu0i","output_index":0,"sequence_number":64,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" humidity","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"lub8GaB","output_index":0,"sequence_number":65,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" add","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"nYSvbT9qtcPy","output_index":0,"sequence_number":65,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" or","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"Fx7awQ2b1wpVz","output_index":0,"sequence_number":66,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" advice","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"sFxHszR4d","output_index":0,"sequence_number":66,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" wind","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"63AL80PrbnT","output_index":0,"sequence_number":67,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" about","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"vtrRZLJl5Y","output_index":0,"sequence_number":67,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":",","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"U5J4ayXBo1E6bs6","output_index":0,"sequence_number":68,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" hydration","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"hblHWQ","output_index":0,"sequence_number":68,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" and","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"ec3aaI7Sr0oH","output_index":0,"sequence_number":69,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":",","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"KNBQIeGE0qYwJ8o","output_index":0,"sequence_number":69,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" I","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"TPJprDLvsoiqsx","output_index":0,"sequence_number":70,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" sun","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"4lFrbsLSBuJr","output_index":0,"sequence_number":70,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" can","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"kzYMoosMC4gm","output_index":0,"sequence_number":71,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" protection","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"r0PJB","output_index":0,"sequence_number":71,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" convert","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"7EV3xiyF","output_index":0,"sequence_number":72,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":",","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"OfiF5xSZjGCgByJ","output_index":0,"sequence_number":72,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" that","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"QzVhOCnfHfC","output_index":0,"sequence_number":73,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" and","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"nk5eLKVzyLsz","output_index":0,"sequence_number":73,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" to","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"dGDTmXJXMW6IT","output_index":0,"sequence_number":74,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" light","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"m1YYl7a8ND","output_index":0,"sequence_number":74,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" Fahrenheit","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"kQIQJ","output_index":0,"sequence_number":75,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" clothing","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"uSxHgDJ","output_index":0,"sequence_number":75,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":",","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"mk93v17PuMxTJlM","output_index":0,"sequence_number":76,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":",","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"ha1eafFBf4COeFo","output_index":0,"sequence_number":76,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" which","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"HgwTxpuhG4","output_index":0,"sequence_number":77,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" and","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"Jqqw254O9KFw","output_index":0,"sequence_number":77,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" is","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"aY404Q7VuFN2z","output_index":0,"sequence_number":78,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" ask","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"i6QivlL2gRYD","output_index":0,"sequence_number":78,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" 104","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"xSqPhdG88OgM","output_index":0,"sequence_number":79,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" if","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"CPPx5dm8w3w3u","output_index":0,"sequence_number":79,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":"°F","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"QPYPeBno8C18kw","output_index":0,"sequence_number":80,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" they'd","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"Zsll8CHTW","output_index":0,"sequence_number":80,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":".","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"MNlJaBAR1QNIARH","output_index":0,"sequence_number":81,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" like","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"q8IiQKDvesg","output_index":0,"sequence_number":81,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" I","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"059SIUQ9QeQsNj","output_index":0,"sequence_number":82,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" additional","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"MNpbt","output_index":0,"sequence_number":82,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" need","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"mgnVakWPgjZ","output_index":0,"sequence_number":83,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" details","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"8LYcvHW2","output_index":0,"sequence_number":83,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" to","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"gfYRuigoNIBIX","output_index":0,"sequence_number":84,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" like","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"nNrkaCJSGsQ","output_index":0,"sequence_number":84,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" mention","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"1zpHlURe","output_index":0,"sequence_number":85,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" humidity","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"RHVbpam","output_index":0,"sequence_number":85,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" the","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"sQazXastqNSR","output_index":0,"sequence_number":86,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" or","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"qkBMb1Q0wREyz","output_index":0,"sequence_number":86,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" current","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"Ar7ZzjBW","output_index":0,"sequence_number":87,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" a","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"H1nM7G4CTr4JDh","output_index":0,"sequence_number":87,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" temperature","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"U0vv","output_index":0,"sequence_number":88,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" forecast","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"JUbKtPi","output_index":0,"sequence_number":88,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" but","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"4PXoJmqA2d1D","output_index":0,"sequence_number":89,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":".","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"tlJnuN0eDXmKHGY","output_index":0,"sequence_number":89,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" avoid","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"DzSvfjl6Mw","output_index":0,"sequence_number":90,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" Keeping","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"Fc90vEnk","output_index":0,"sequence_number":90,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" invent","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"MTJxl4gE5","output_index":0,"sequence_number":91,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" it","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"Y47dphUquYBjW","output_index":0,"sequence_number":91,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":"ing","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"a1FjshaPWjI1e","output_index":0,"sequence_number":92,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" clear","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"E0yrQciBi8","output_index":0,"sequence_number":92,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" any","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"4aP9eRi3nmbk","output_index":0,"sequence_number":93,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" is","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"gsATEHYH1uN6k","output_index":0,"sequence_number":93,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" other","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"NmQQmrRLbW","output_index":0,"sequence_number":94,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" key","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"xFMCBiG30E8U","output_index":0,"sequence_number":94,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" details","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"ZvgWT0Sf","output_index":0,"sequence_number":95,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":"!","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"UOV2d3ECjpbbTf4","output_index":0,"sequence_number":95,"summary_index":0} + + event: response.reasoning_summary_text.done + data: {"type":"response.reasoning_summary_text.done","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","output_index":0,"sequence_number":96,"summary_index":0,"text":"**Providing weather update**\n\nThe user asked about the weather in Florence, Italy. After calling the weather tool, I received a response of 40°C. I should keep my reply concise, mentioning that it's quite hot. I could say something like: \"Current temperature in Florence: 40°C (104°F).\" It might be good to add advice about hydration, sun protection, and light clothing, and ask if they'd like additional details like humidity or a forecast. Keeping it clear is key!"} + + event: response.reasoning_summary_part.done + data: {"type":"response.reasoning_summary_part.done","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","output_index":0,"part":{"type":"summary_text","text":"**Providing weather update**\n\nThe user asked about the weather in Florence, Italy. After calling the weather tool, I received a response of 40°C. I should keep my reply concise, mentioning that it's quite hot. I could say something like: \"Current temperature in Florence: 40°C (104°F).\" It might be good to add advice about hydration, sun protection, and light clothing, and ask if they'd like additional details like humidity or a forecast. Keeping it clear is key!"},"sequence_number":97,"summary_index":0} + + event: response.reasoning_summary_part.added + data: {"type":"response.reasoning_summary_part.added","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","output_index":0,"part":{"type":"summary_text","text":""},"sequence_number":98,"summary_index":1} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":".","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"mWI9vWZ17LDvAGL","output_index":0,"sequence_number":96,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":"**Conveying weather advice**\n\nI","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"P","output_index":0,"sequence_number":99,"summary_index":1} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" I'll","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"DTzBejqgiVj","output_index":0,"sequence_number":97,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" need","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"SYLpWTE3FHI","output_index":0,"sequence_number":100,"summary_index":1} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" ask","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"dmcVB5UNIWV8","output_index":0,"sequence_number":98,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" to","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"bTg9MTqxKKjAn","output_index":0,"sequence_number":101,"summary_index":1} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" if","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"r7FMXtVlWtJLw","output_index":0,"sequence_number":99,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" address","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"frY5UdSQ","output_index":0,"sequence_number":102,"summary_index":1} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" they","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"s8JlJhzJvAo","output_index":0,"sequence_number":100,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" the","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"KKxN4QWXIulc","output_index":0,"sequence_number":103,"summary_index":1} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" want","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"ZfdSIjZ73vi","output_index":0,"sequence_number":101,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" current","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"HlUM5BHw","output_index":0,"sequence_number":104,"summary_index":1} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" the","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"jo9rLrQee5QA","output_index":0,"sequence_number":102,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" temperature","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"rSNH","output_index":0,"sequence_number":105,"summary_index":1} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" forecast","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"nplWiR7","output_index":0,"sequence_number":103,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" in","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"SsJKym00CAFhI","output_index":0,"sequence_number":106,"summary_index":1} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" or","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"qZg6bjJXVRh5r","output_index":0,"sequence_number":104,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" Florence","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"5us5F9c","output_index":0,"sequence_number":107,"summary_index":1} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" more","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"VDw4qhpBJ34","output_index":0,"sequence_number":105,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":",","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"wLeId4zkqm0lr9q","output_index":0,"sequence_number":108,"summary_index":1} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" information","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"f5Bq","output_index":0,"sequence_number":106,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" Italy","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"9Qn5Q0uDRu","output_index":0,"sequence_number":109,"summary_index":1} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":".","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"semuSUSU7rqUUVY","output_index":0,"sequence_number":107,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":",","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"VoFrowhun6QyXcu","output_index":0,"sequence_number":110,"summary_index":1} - event: response.reasoning_summary_text.done - data: {"type":"response.reasoning_summary_text.done","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","output_index":0,"sequence_number":108,"summary_index":0,"text":"**Analyzing weather response**\n\nI've called the weather function, and it returned \"40 C\" which seems to be the temperature. Since it only provided that, I need to clarify that it's in Celsius, and I should let the user know that it’s quite hot. I could offer to provide more details such as humidity or wind, and I can convert that to Fahrenheit, which is 104°F. I need to mention the current temperature but avoid inventing any other details. I'll ask if they want the forecast or more information."} + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" which","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"abezkMUk6D","output_index":0,"sequence_number":111,"summary_index":1} - event: response.reasoning_summary_part.done - data: {"type":"response.reasoning_summary_part.done","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","output_index":0,"part":{"type":"summary_text","text":"**Analyzing weather response**\n\nI've called the weather function, and it returned \"40 C\" which seems to be the temperature. Since it only provided that, I need to clarify that it's in Celsius, and I should let the user know that it’s quite hot. I could offer to provide more details such as humidity or wind, and I can convert that to Fahrenheit, which is 104°F. I need to mention the current temperature but avoid inventing any other details. I'll ask if they want the forecast or more information."},"sequence_number":109,"summary_index":0} + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" is","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"wISfeA0yJ26Vn","output_index":0,"sequence_number":112,"summary_index":1} - event: response.reasoning_summary_part.added - data: {"type":"response.reasoning_summary_part.added","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","output_index":0,"part":{"type":"summary_text","text":""},"sequence_number":110,"summary_index":1} + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" 40","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"Lt8sVxNwjidf0","output_index":0,"sequence_number":113,"summary_index":1} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":"°C","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"3LOn0zCGjC4tba","output_index":0,"sequence_number":114,"summary_index":1} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":".","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"w1cYu2NhnmaQiOY","output_index":0,"sequence_number":115,"summary_index":1} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" After","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"K3ARaOKAku","output_index":0,"sequence_number":116,"summary_index":1} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" converting","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"1Pe2g","output_index":0,"sequence_number":117,"summary_index":1} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" that","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"DxODxNpl3w6","output_index":0,"sequence_number":118,"summary_index":1} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" to","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"FPh6lqQqof1Hf","output_index":0,"sequence_number":119,"summary_index":1} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" Fahrenheit","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"IQDb4","output_index":0,"sequence_number":120,"summary_index":1} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":",","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"T4VJqjK6lsblXQK","output_index":0,"sequence_number":121,"summary_index":1} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" it","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"NQ8N6BDKs5qQ3","output_index":0,"sequence_number":122,"summary_index":1} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" equ","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"0BSiLOg5Gzk4","output_index":0,"sequence_number":123,"summary_index":1} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":"ates","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"9JGoKBBQL0Ir","output_index":0,"sequence_number":124,"summary_index":1} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" to","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"2rVtjLcNCkhaW","output_index":0,"sequence_number":125,"summary_index":1} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" 104","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"Bi3pFw55RDob","output_index":0,"sequence_number":126,"summary_index":1} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":"°F","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"j3s1eLIcDLuJD1","output_index":0,"sequence_number":127,"summary_index":1} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":".","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"mzQywpbGymqSfbt","output_index":0,"sequence_number":128,"summary_index":1} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" I","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"xo8zk14Wu3n6gQ","output_index":0,"sequence_number":129,"summary_index":1} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" want","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"Gf5aD59rdXc","output_index":0,"sequence_number":130,"summary_index":1} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" to","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"03vK4raTHy1Qb","output_index":0,"sequence_number":131,"summary_index":1} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" stress","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"BB6zHGJx5","output_index":0,"sequence_number":132,"summary_index":1} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" that","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"LxuYTOAo702","output_index":0,"sequence_number":133,"summary_index":1} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" it's","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"eczylZREaYP","output_index":0,"sequence_number":134,"summary_index":1} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" very","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"ZGZEnmUYVAC","output_index":0,"sequence_number":135,"summary_index":1} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" hot","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"STgf8L4vPuUh","output_index":0,"sequence_number":136,"summary_index":1} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" and","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"Rz2urxnhoMpM","output_index":0,"sequence_number":137,"summary_index":1} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" suggest","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"mfdqrYkB","output_index":0,"sequence_number":138,"summary_index":1} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" precautions","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"WTei","output_index":0,"sequence_number":139,"summary_index":1} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" like","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"DPI7YBypIzq","output_index":0,"sequence_number":140,"summary_index":1} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" staying","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"66nsoCmA","output_index":0,"sequence_number":141,"summary_index":1} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" hydrated","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"VWZw2Wl","output_index":0,"sequence_number":142,"summary_index":1} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":",","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"P1iQFOInHcKbvKO","output_index":0,"sequence_number":143,"summary_index":1} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" limiting","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"uDzlkGI","output_index":0,"sequence_number":144,"summary_index":1} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" sun","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"5KuBQpQNTMMN","output_index":0,"sequence_number":145,"summary_index":1} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" exposure","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"vNkfKGX","output_index":0,"sequence_number":146,"summary_index":1} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":",","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"qx32QzjEwGLXgpZ","output_index":0,"sequence_number":147,"summary_index":1} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" using","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"qzLrXYWhqR","output_index":0,"sequence_number":148,"summary_index":1} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" sunscreen","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"mbZO0m","output_index":0,"sequence_number":149,"summary_index":1} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":",","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"Kj7V44oZPmANbD0","output_index":0,"sequence_number":150,"summary_index":1} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" and","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"fGd3J8l8gUvU","output_index":0,"sequence_number":151,"summary_index":1} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" avoiding","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"pn4j6X1","output_index":0,"sequence_number":152,"summary_index":1} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" strenuous","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"3MRto9","output_index":0,"sequence_number":153,"summary_index":1} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" activities","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"9JVbg","output_index":0,"sequence_number":154,"summary_index":1} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":".","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"493vCCFB6KvLtME","output_index":0,"sequence_number":155,"summary_index":1} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" I","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"1ZO3ou1HYuXDtG","output_index":0,"sequence_number":156,"summary_index":1} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" should","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"N1VBo9GvY","output_index":0,"sequence_number":157,"summary_index":1} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" also","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"jjNnxUnTcds","output_index":0,"sequence_number":158,"summary_index":1} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" ask","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"fybJZMYjSvt7","output_index":0,"sequence_number":159,"summary_index":1} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" if","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"1fflEf6zQFogl","output_index":0,"sequence_number":160,"summary_index":1} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" the","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"DW5QyG93ZuWq","output_index":0,"sequence_number":161,"summary_index":1} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" user","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"HBswyogHHdj","output_index":0,"sequence_number":162,"summary_index":1} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" wants","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"dnE7fCLpqT","output_index":0,"sequence_number":163,"summary_index":1} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" an","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"XGLDehpiyFIMJ","output_index":0,"sequence_number":164,"summary_index":1} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" hourly","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"mlgvQGxD1","output_index":0,"sequence_number":165,"summary_index":1} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" forecast","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"ElSI61F","output_index":0,"sequence_number":166,"summary_index":1} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" or","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"iJB7Uvg0dRdMN","output_index":0,"sequence_number":167,"summary_index":1} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" tomorrow","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"AtlVRue","output_index":0,"sequence_number":168,"summary_index":1} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":"'s","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"XrSTDtDV3ayGLI","output_index":0,"sequence_number":169,"summary_index":1} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" weather","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"yLGgQmLq","output_index":0,"sequence_number":170,"summary_index":1} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":".","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"2EgKAtkM0tkSWuO","output_index":0,"sequence_number":171,"summary_index":1} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" I","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"pc42DzgULNnwtq","output_index":0,"sequence_number":172,"summary_index":1} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" could","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"0NfBOHNUkW","output_index":0,"sequence_number":173,"summary_index":1} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" frame","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"I37kLNpOcM","output_index":0,"sequence_number":174,"summary_index":1} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" my","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"MOGRYO2ShhnpP","output_index":0,"sequence_number":175,"summary_index":1} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" response","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"4K82VFi","output_index":0,"sequence_number":176,"summary_index":1} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" like","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"2vRVmWQf1GJ","output_index":0,"sequence_number":177,"summary_index":1} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" this","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"skuso3z7aG3","output_index":0,"sequence_number":178,"summary_index":1} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":"**Craft","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"i537Zs6EK","output_index":0,"sequence_number":111,"summary_index":1} + data: {"type":"response.reasoning_summary_text.delta","delta":":","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"jjs8yj3sVT25dL8","output_index":0,"sequence_number":179,"summary_index":1} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":"ing","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"78m4bA40B3eHw","output_index":0,"sequence_number":112,"summary_index":1} + data: {"type":"response.reasoning_summary_text.delta","delta":" \"","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"9FoWhHCGMgwjom","output_index":0,"sequence_number":180,"summary_index":1} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" weather","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"2VlSms28","output_index":0,"sequence_number":113,"summary_index":1} + data: {"type":"response.reasoning_summary_text.delta","delta":"Current","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"V6kalMYcB","output_index":0,"sequence_number":181,"summary_index":1} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" response","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"4YldZDO","output_index":0,"sequence_number":114,"summary_index":1} + data: {"type":"response.reasoning_summary_text.delta","delta":" temperature","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"3GR5","output_index":0,"sequence_number":182,"summary_index":1} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":"**\n\nI","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"Z8hBuHtSstW","output_index":0,"sequence_number":115,"summary_index":1} + data: {"type":"response.reasoning_summary_text.delta","delta":" in","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"GEivT7o1pteOK","output_index":0,"sequence_number":183,"summary_index":1} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" want","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"rR94rkEAAnA","output_index":0,"sequence_number":116,"summary_index":1} + data: {"type":"response.reasoning_summary_text.delta","delta":" Florence","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"5R8bR40","output_index":0,"sequence_number":184,"summary_index":1} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" to","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"Qfwryg6Wox2ap","output_index":0,"sequence_number":117,"summary_index":1} + data: {"type":"response.reasoning_summary_text.delta","delta":":","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"NrB6vXzFvUPDppt","output_index":0,"sequence_number":185,"summary_index":1} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" keep","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"VDlCC9QGjg2","output_index":0,"sequence_number":118,"summary_index":1} + data: {"type":"response.reasoning_summary_text.delta","delta":" 40","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"nWwpWxhsgA5q5","output_index":0,"sequence_number":186,"summary_index":1} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" my","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"9cePE89fLdtx8","output_index":0,"sequence_number":119,"summary_index":1} + data: {"type":"response.reasoning_summary_text.delta","delta":"°C","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"vqVCk0i8piQQ3l","output_index":0,"sequence_number":187,"summary_index":1} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" message","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"oJzWZ6Av","output_index":0,"sequence_number":120,"summary_index":1} + data: {"type":"response.reasoning_summary_text.delta","delta":" (","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"V2m9ec8xTNzVDm","output_index":0,"sequence_number":188,"summary_index":1} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" concise","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"qTHLItdT","output_index":0,"sequence_number":121,"summary_index":1} + data: {"type":"response.reasoning_summary_text.delta","delta":"104","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"dKy7T16ynVCRk","output_index":0,"sequence_number":189,"summary_index":1} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" and","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"HLVOzzcVyoob","output_index":0,"sequence_number":122,"summary_index":1} + data: {"type":"response.reasoning_summary_text.delta","delta":"°F","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"upGC0XZ1BhCVny","output_index":0,"sequence_number":190,"summary_index":1} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" clear","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"FdSnkHOEuA","output_index":0,"sequence_number":123,"summary_index":1} + data: {"type":"response.reasoning_summary_text.delta","delta":").","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"Ga12k0IVrG3D3e","output_index":0,"sequence_number":191,"summary_index":1} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":".","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"W3gnxuTPP3940vg","output_index":0,"sequence_number":124,"summary_index":1} + data: {"type":"response.reasoning_summary_text.delta","delta":" It's","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"Z6lJQmLEG6r","output_index":0,"sequence_number":192,"summary_index":1} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" I'll","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"WzfZGrgfM4R","output_index":0,"sequence_number":125,"summary_index":1} + data: {"type":"response.reasoning_summary_text.delta","delta":" very","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"AB0MiiqgEZn","output_index":0,"sequence_number":193,"summary_index":1} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" hot","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"JgPuNUNfnyPP","output_index":0,"sequence_number":194,"summary_index":1} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":"—","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"s4iJyBHtbeWNQGh","output_index":0,"sequence_number":195,"summary_index":1} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":"stay","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"Rgqg2FTOaBWB","output_index":0,"sequence_number":196,"summary_index":1} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" hydrated","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"UgD8sI9","output_index":0,"sequence_number":197,"summary_index":1} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":"!\"","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"CoZo0hO1rvmYcr","output_index":0,"sequence_number":198,"summary_index":1} + + event: response.reasoning_summary_text.done + data: {"type":"response.reasoning_summary_text.done","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","output_index":0,"sequence_number":199,"summary_index":1,"text":"**Conveying weather advice**\n\nI need to address the current temperature in Florence, Italy, which is 40°C. After converting that to Fahrenheit, it equates to 104°F. I want to stress that it's very hot and suggest precautions like staying hydrated, limiting sun exposure, using sunscreen, and avoiding strenuous activities. I should also ask if the user wants an hourly forecast or tomorrow's weather. I could frame my response like this: \"Current temperature in Florence: 40°C (104°F). It's very hot—stay hydrated!\""} + + event: response.reasoning_summary_part.done + data: {"type":"response.reasoning_summary_part.done","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","output_index":0,"part":{"type":"summary_text","text":"**Conveying weather advice**\n\nI need to address the current temperature in Florence, Italy, which is 40°C. After converting that to Fahrenheit, it equates to 104°F. I want to stress that it's very hot and suggest precautions like staying hydrated, limiting sun exposure, using sunscreen, and avoiding strenuous activities. I should also ask if the user wants an hourly forecast or tomorrow's weather. I could frame my response like this: \"Current temperature in Florence: 40°C (104°F). It's very hot—stay hydrated!\""},"sequence_number":200,"summary_index":1} + + event: response.reasoning_summary_part.added + data: {"type":"response.reasoning_summary_part.added","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","output_index":0,"part":{"type":"summary_text","text":""},"sequence_number":201,"summary_index":2} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" state","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"gsegsP8V5T","output_index":0,"sequence_number":126,"summary_index":1} + data: {"type":"response.reasoning_summary_text.delta","delta":"**Drafting heat safety response**\n\nI","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"QMb0k1v89yWu","output_index":0,"sequence_number":202,"summary_index":2} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" the","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"YqNBcYgtJj2U","output_index":0,"sequence_number":127,"summary_index":1} + data: {"type":"response.reasoning_summary_text.delta","delta":" want","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"WqjHWQuX9wA","output_index":0,"sequence_number":203,"summary_index":2} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" current","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"eLR5U8jj","output_index":0,"sequence_number":128,"summary_index":1} + data: {"type":"response.reasoning_summary_text.delta","delta":" to","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"HCNR1EF3nAsTG","output_index":0,"sequence_number":204,"summary_index":2} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" temperature","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"Rp3O","output_index":0,"sequence_number":129,"summary_index":1} + data: {"type":"response.reasoning_summary_text.delta","delta":" make","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"8NfjJFISVRa","output_index":0,"sequence_number":205,"summary_index":2} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" in","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"ThUBELrGROqrZ","output_index":0,"sequence_number":130,"summary_index":1} + data: {"type":"response.reasoning_summary_text.delta","delta":" sure","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"URGxjhpwZct","output_index":0,"sequence_number":206,"summary_index":2} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" Florence","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"IibS32n","output_index":0,"sequence_number":131,"summary_index":1} + data: {"type":"response.reasoning_summary_text.delta","delta":" I","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"KXp4LFXdXWEmmi","output_index":0,"sequence_number":207,"summary_index":2} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":",","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"wylYFl8Q9s7Cwbj","output_index":0,"sequence_number":132,"summary_index":1} + data: {"type":"response.reasoning_summary_text.delta","delta":" address","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"urbNx5cc","output_index":0,"sequence_number":208,"summary_index":2} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" Italy","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"zJHaeiblbC","output_index":0,"sequence_number":133,"summary_index":1} + data: {"type":"response.reasoning_summary_text.delta","delta":" heat","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"F9BBFezgakM","output_index":0,"sequence_number":209,"summary_index":2} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":",","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"uJ1saFaPZSjtEKl","output_index":0,"sequence_number":134,"summary_index":1} + data: {"type":"response.reasoning_summary_text.delta","delta":" safety","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"kLgPezkHV","output_index":0,"sequence_number":210,"summary_index":2} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" which","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"A44MbSlxT4","output_index":0,"sequence_number":135,"summary_index":1} + data: {"type":"response.reasoning_summary_text.delta","delta":" effectively","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"ab1W","output_index":0,"sequence_number":211,"summary_index":2} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" is","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"qCBT3kvsL8aG9","output_index":0,"sequence_number":136,"summary_index":1} + data: {"type":"response.reasoning_summary_text.delta","delta":".","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"YyMQDb821yKF1KD","output_index":0,"sequence_number":212,"summary_index":2} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" 40","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"xRcdtgoIGXmgb","output_index":0,"sequence_number":137,"summary_index":1} + data: {"type":"response.reasoning_summary_text.delta","delta":" The","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"5KhMo56Q19NS","output_index":0,"sequence_number":213,"summary_index":2} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":"°C","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"VOKCHKvf4Cde4F","output_index":0,"sequence_number":138,"summary_index":1} + data: {"type":"response.reasoning_summary_text.delta","delta":" current","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"16XTsnjp","output_index":0,"sequence_number":214,"summary_index":2} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" (","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"9DAgv7q8uufG20","output_index":0,"sequence_number":139,"summary_index":1} + data: {"type":"response.reasoning_summary_text.delta","delta":" temperature","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"JDGc","output_index":0,"sequence_number":215,"summary_index":2} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":"104","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"O5cLzEvmfWB1w","output_index":0,"sequence_number":140,"summary_index":1} + data: {"type":"response.reasoning_summary_text.delta","delta":" is","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"Tv7wS8NHbivsl","output_index":0,"sequence_number":216,"summary_index":2} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":"°F","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"tF7x7wdtUgkFD9","output_index":0,"sequence_number":141,"summary_index":1} + data: {"type":"response.reasoning_summary_text.delta","delta":" 40","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"pHIb7s6FwypOz","output_index":0,"sequence_number":217,"summary_index":2} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":"),","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"qXXDzRTa2MA8lV","output_index":0,"sequence_number":142,"summary_index":1} + data: {"type":"response.reasoning_summary_text.delta","delta":"°C","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"GIDQNwiYZRxMr7","output_index":0,"sequence_number":218,"summary_index":2} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" and","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"42fCPaCRQJiP","output_index":0,"sequence_number":143,"summary_index":1} + data: {"type":"response.reasoning_summary_text.delta","delta":" (","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"ZjHgauMzPnlvl1","output_index":0,"sequence_number":219,"summary_index":2} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" let","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"cxnP7dzjkHyS","output_index":0,"sequence_number":144,"summary_index":1} + data: {"type":"response.reasoning_summary_text.delta","delta":"104","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"zaGLLQ8tydbQn","output_index":0,"sequence_number":220,"summary_index":2} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" the","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"nPNHjyygMRFw","output_index":0,"sequence_number":145,"summary_index":1} + data: {"type":"response.reasoning_summary_text.delta","delta":"°F","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"WgCzIntl5BZIk4","output_index":0,"sequence_number":221,"summary_index":2} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" user","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"cC9HadSMl7f","output_index":0,"sequence_number":146,"summary_index":1} + data: {"type":"response.reasoning_summary_text.delta","delta":"),","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"VLbqGdS8CImaOv","output_index":0,"sequence_number":222,"summary_index":2} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" know","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"Xivz8zwuCeL","output_index":0,"sequence_number":147,"summary_index":1} + data: {"type":"response.reasoning_summary_text.delta","delta":" which","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"wNOHayQnKV","output_index":0,"sequence_number":223,"summary_index":2} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" I","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"nfo2OV7fplFu1v","output_index":0,"sequence_number":148,"summary_index":1} + data: {"type":"response.reasoning_summary_text.delta","delta":" is","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"qwwX7nZUe5Q4S","output_index":0,"sequence_number":224,"summary_index":2} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" don","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"nPhiDoRvBrN6","output_index":0,"sequence_number":149,"summary_index":1} + data: {"type":"response.reasoning_summary_text.delta","delta":" very","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"W5BgiQP96fp","output_index":0,"sequence_number":225,"summary_index":2} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":"’t","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"jb0OUEg72EUoNe","output_index":0,"sequence_number":150,"summary_index":1} + data: {"type":"response.reasoning_summary_text.delta","delta":" hot","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"6L2pvXJ6xLnI","output_index":0,"sequence_number":226,"summary_index":2} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" have","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"c3q9S4uy5xo","output_index":0,"sequence_number":151,"summary_index":1} + data: {"type":"response.reasoning_summary_text.delta","delta":".","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"GnopSYfaNwrfJlL","output_index":0,"sequence_number":227,"summary_index":2} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" additional","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"c3x3d","output_index":0,"sequence_number":152,"summary_index":1} + data: {"type":"response.reasoning_summary_text.delta","delta":" I'll","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"Hwz8iHAMa5c","output_index":0,"sequence_number":228,"summary_index":2} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" details","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"kGSO3Kcu","output_index":0,"sequence_number":153,"summary_index":1} + data: {"type":"response.reasoning_summary_text.delta","delta":" provide","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"9WpD67yW","output_index":0,"sequence_number":229,"summary_index":2} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" like","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"WbamPPCjau6","output_index":0,"sequence_number":154,"summary_index":1} + data: {"type":"response.reasoning_summary_text.delta","delta":" three","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"LuICSZACbT","output_index":0,"sequence_number":230,"summary_index":2} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" precipitation","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"4U","output_index":0,"sequence_number":155,"summary_index":1} + data: {"type":"response.reasoning_summary_text.delta","delta":" key","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"Lz0TptrbXhPw","output_index":0,"sequence_number":231,"summary_index":2} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" or","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"Zc62q6QODW7j5","output_index":0,"sequence_number":156,"summary_index":1} + data: {"type":"response.reasoning_summary_text.delta","delta":" suggestions","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"fWdk","output_index":0,"sequence_number":232,"summary_index":2} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" wind","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"0722dyHStBt","output_index":0,"sequence_number":157,"summary_index":1} + data: {"type":"response.reasoning_summary_text.delta","delta":":","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"N268foRj3ROEot8","output_index":0,"sequence_number":233,"summary_index":2} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":".","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"FMeXdaT9t9ANju7","output_index":0,"sequence_number":158,"summary_index":1} + data: {"type":"response.reasoning_summary_text.delta","delta":" stay","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"6xoq7fLgjSK","output_index":0,"sequence_number":234,"summary_index":2} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" I","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"H0QmsNqB23voMw","output_index":0,"sequence_number":159,"summary_index":1} + data: {"type":"response.reasoning_summary_text.delta","delta":" hydrated","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"I8nt28g","output_index":0,"sequence_number":235,"summary_index":2} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" should","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"3RnBpLL9v","output_index":0,"sequence_number":160,"summary_index":1} + data: {"type":"response.reasoning_summary_text.delta","delta":",","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"uwyNdt1mNcUcAkz","output_index":0,"sequence_number":236,"summary_index":2} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" offer","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"vQaJMwnfj9","output_index":0,"sequence_number":161,"summary_index":1} + data: {"type":"response.reasoning_summary_text.delta","delta":" seek","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"HBcoFd8vDV4","output_index":0,"sequence_number":237,"summary_index":2} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" options","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"b1kFYeqq","output_index":0,"sequence_number":162,"summary_index":1} + data: {"type":"response.reasoning_summary_text.delta","delta":" shade","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"ImcuR6tZNa","output_index":0,"sequence_number":238,"summary_index":2} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" for","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"FriOzmWykMQP","output_index":0,"sequence_number":163,"summary_index":1} + data: {"type":"response.reasoning_summary_text.delta","delta":" or","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"yTmeYTlV2hCnU","output_index":0,"sequence_number":239,"summary_index":2} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" more","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"giwSO34wKFe","output_index":0,"sequence_number":164,"summary_index":1} + data: {"type":"response.reasoning_summary_text.delta","delta":" air","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"4qZjuMYAcPg7","output_index":0,"sequence_number":240,"summary_index":2} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" information","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"TrPz","output_index":0,"sequence_number":165,"summary_index":1} + data: {"type":"response.reasoning_summary_text.delta","delta":" conditioning","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"8b3","output_index":0,"sequence_number":241,"summary_index":2} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":",","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"Y4Z8Jle5Ibp37JQ","output_index":0,"sequence_number":166,"summary_index":1} + data: {"type":"response.reasoning_summary_text.delta","delta":",","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"NFOpKz2MljBfTfy","output_index":0,"sequence_number":242,"summary_index":2} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" such","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"Qu7jny02j0S","output_index":0,"sequence_number":167,"summary_index":1} + data: {"type":"response.reasoning_summary_text.delta","delta":" and","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"5UhfYoF8msW7","output_index":0,"sequence_number":243,"summary_index":2} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" as","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"Xod4NsgvjlorN","output_index":0,"sequence_number":168,"summary_index":1} + data: {"type":"response.reasoning_summary_text.delta","delta":" avoid","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"rpJh7hHk3T","output_index":0,"sequence_number":244,"summary_index":2} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" today","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"rrcqEeYsJ0","output_index":0,"sequence_number":169,"summary_index":1} + data: {"type":"response.reasoning_summary_text.delta","delta":" heavy","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"66iie6Muf1","output_index":0,"sequence_number":245,"summary_index":2} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":"’s","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"J0ds8TPFTyqO4u","output_index":0,"sequence_number":170,"summary_index":1} + data: {"type":"response.reasoning_summary_text.delta","delta":" exercise","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"dmZo3I3","output_index":0,"sequence_number":246,"summary_index":2} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" forecast","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"3ZuDDzJ","output_index":0,"sequence_number":171,"summary_index":1} + data: {"type":"response.reasoning_summary_text.delta","delta":" during","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"SiwbSN4nl","output_index":0,"sequence_number":247,"summary_index":2} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":",","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"GOTyG7eHhKfCDQn","output_index":0,"sequence_number":172,"summary_index":1} + data: {"type":"response.reasoning_summary_text.delta","delta":" the","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"O57f1ffzzx8Q","output_index":0,"sequence_number":248,"summary_index":2} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" an","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"f3wgneOnXapGo","output_index":0,"sequence_number":173,"summary_index":1} + data: {"type":"response.reasoning_summary_text.delta","delta":" midday","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"qSSrBz03p","output_index":0,"sequence_number":249,"summary_index":2} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" hourly","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"Eg8fiKfMg","output_index":0,"sequence_number":174,"summary_index":1} + data: {"type":"response.reasoning_summary_text.delta","delta":" heat","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"MoClj84Z01m","output_index":0,"sequence_number":250,"summary_index":2} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" breakdown","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"yAZc40","output_index":0,"sequence_number":175,"summary_index":1} + data: {"type":"response.reasoning_summary_text.delta","delta":".","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"fuZNvvU52N8WtKx","output_index":0,"sequence_number":251,"summary_index":2} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":",","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"IXZSoJhCjfiUmTm","output_index":0,"sequence_number":176,"summary_index":1} + data: {"type":"response.reasoning_summary_text.delta","delta":" I'll","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"odCDxDg4zuU","output_index":0,"sequence_number":252,"summary_index":2} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" or","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"tV50zA43UPOLO","output_index":0,"sequence_number":177,"summary_index":1} + data: {"type":"response.reasoning_summary_text.delta","delta":" also","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"CDGElMNq6oh","output_index":0,"sequence_number":253,"summary_index":2} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" humidity","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"4mnLvDJ","output_index":0,"sequence_number":178,"summary_index":1} + data: {"type":"response.reasoning_summary_text.delta","delta":" include","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"cPWOgXu9","output_index":0,"sequence_number":254,"summary_index":2} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" and","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"Nt01NAa2uNGB","output_index":0,"sequence_number":179,"summary_index":1} + data: {"type":"response.reasoning_summary_text.delta","delta":" a","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"Bqj4Bk7JpCb0uu","output_index":0,"sequence_number":255,"summary_index":2} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" wind","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"h660HjrtH5F","output_index":0,"sequence_number":180,"summary_index":1} + data: {"type":"response.reasoning_summary_text.delta","delta":" note","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"r5rIXquPg0Q","output_index":0,"sequence_number":256,"summary_index":2} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" details","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"H2mzV4Gs","output_index":0,"sequence_number":181,"summary_index":1} + data: {"type":"response.reasoning_summary_text.delta","delta":" about","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"4lL1y0BR7Z","output_index":0,"sequence_number":257,"summary_index":2} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":".","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"iCqyRdolq8p1EJp","output_index":0,"sequence_number":182,"summary_index":1} + data: {"type":"response.reasoning_summary_text.delta","delta":" being","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"mFpCSigDRp","output_index":0,"sequence_number":258,"summary_index":2} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" Additionally","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"vTe","output_index":0,"sequence_number":183,"summary_index":1} + data: {"type":"response.reasoning_summary_text.delta","delta":" cautious","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"jgwbrtx","output_index":0,"sequence_number":259,"summary_index":2} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":",","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"EjlT0ZpjcqthGqK","output_index":0,"sequence_number":184,"summary_index":1} + data: {"type":"response.reasoning_summary_text.delta","delta":" with","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"rLmkBdSKATG","output_index":0,"sequence_number":260,"summary_index":2} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" I","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"DobM1GSrRg4AWx","output_index":0,"sequence_number":185,"summary_index":1} + data: {"type":"response.reasoning_summary_text.delta","delta":" vulnerable","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"K1LqS","output_index":0,"sequence_number":261,"summary_index":2} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" might","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"sZqkA0AmeV","output_index":0,"sequence_number":186,"summary_index":1} + data: {"type":"response.reasoning_summary_text.delta","delta":" individuals","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"RtBy","output_index":0,"sequence_number":262,"summary_index":2} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" include","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"fwe5GeJE","output_index":0,"sequence_number":187,"summary_index":1} + data: {"type":"response.reasoning_summary_text.delta","delta":" who","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"tjkz9CNXbDUA","output_index":0,"sequence_number":263,"summary_index":2} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" a","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"OGZqYz5dOXPdRJ","output_index":0,"sequence_number":188,"summary_index":1} + data: {"type":"response.reasoning_summary_text.delta","delta":" might","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"QMqkECfBeG","output_index":0,"sequence_number":264,"summary_index":2} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" friendly","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"Ktte47j","output_index":0,"sequence_number":189,"summary_index":1} + data: {"type":"response.reasoning_summary_text.delta","delta":" be","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"Pa4qX9yzXIMVR","output_index":0,"sequence_number":265,"summary_index":2} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" note","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"iFkCBVbHVHh","output_index":0,"sequence_number":190,"summary_index":1} + data: {"type":"response.reasoning_summary_text.delta","delta":" more","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"4V9cZrWVv58","output_index":0,"sequence_number":266,"summary_index":2} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" about","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"IfUIQD2CXk","output_index":0,"sequence_number":191,"summary_index":1} + data: {"type":"response.reasoning_summary_text.delta","delta":" affected","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"HBaU7KE","output_index":0,"sequence_number":267,"summary_index":2} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" extreme","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"xiWvVGJ0","output_index":0,"sequence_number":192,"summary_index":1} + data: {"type":"response.reasoning_summary_text.delta","delta":".","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"WspzUjQ6g2CB1QD","output_index":0,"sequence_number":268,"summary_index":2} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" heat","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"cZsSsn1zVBd","output_index":0,"sequence_number":193,"summary_index":1} + data: {"type":"response.reasoning_summary_text.delta","delta":" To","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"anGTwVXZDDY84","output_index":0,"sequence_number":269,"summary_index":2} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":".","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"TD0IbFRxuTxuKu7","output_index":0,"sequence_number":194,"summary_index":1} + data: {"type":"response.reasoning_summary_text.delta","delta":" keep","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"u6wlZsP3Mr2","output_index":0,"sequence_number":270,"summary_index":2} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" I","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"CR55Lvsv0e4NMC","output_index":0,"sequence_number":195,"summary_index":1} + data: {"type":"response.reasoning_summary_text.delta","delta":" it","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"tP0MymSLf3epX","output_index":0,"sequence_number":271,"summary_index":2} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":"’ll","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"zNpxVrDXvTfDs","output_index":0,"sequence_number":196,"summary_index":1} + data: {"type":"response.reasoning_summary_text.delta","delta":" friendly","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"RDAiM63","output_index":0,"sequence_number":272,"summary_index":2} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" ask","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"xGgVr8bgaVh9","output_index":0,"sequence_number":197,"summary_index":1} + data: {"type":"response.reasoning_summary_text.delta","delta":",","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"83R1j8vWwMbOaJz","output_index":0,"sequence_number":273,"summary_index":2} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" if","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"7TtPMtzB40gTL","output_index":0,"sequence_number":198,"summary_index":1} + data: {"type":"response.reasoning_summary_text.delta","delta":" I","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"xlJna3goEONawT","output_index":0,"sequence_number":274,"summary_index":2} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" they","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"84N7Ln9WAd2","output_index":0,"sequence_number":199,"summary_index":1} + data: {"type":"response.reasoning_summary_text.delta","delta":" could","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"PDLHLF3csV","output_index":0,"sequence_number":275,"summary_index":2} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":"’d","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"HRXeH77oMEZuwY","output_index":0,"sequence_number":200,"summary_index":1} + data: {"type":"response.reasoning_summary_text.delta","delta":" say","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"t4SvkDKPx1Ao","output_index":0,"sequence_number":276,"summary_index":2} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" like","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"cdkPqeBGO9Y","output_index":0,"sequence_number":201,"summary_index":1} + data: {"type":"response.reasoning_summary_text.delta","delta":",","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"VZQmuiGmtCSO5Cr","output_index":0,"sequence_number":277,"summary_index":2} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" me","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"XpL7GJSTBUoBU","output_index":0,"sequence_number":202,"summary_index":1} + data: {"type":"response.reasoning_summary_text.delta","delta":" \"","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"9NZ4geq9msLWID","output_index":0,"sequence_number":278,"summary_index":2} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" to","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"PY58ZzGIAaDaO","output_index":0,"sequence_number":203,"summary_index":1} + data: {"type":"response.reasoning_summary_text.delta","delta":"Would","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"sNnRuTKlpW9","output_index":0,"sequence_number":279,"summary_index":2} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" fetch","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"a6uFa765MG","output_index":0,"sequence_number":204,"summary_index":1} + data: {"type":"response.reasoning_summary_text.delta","delta":" you","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"AanfdeGUWAjd","output_index":0,"sequence_number":280,"summary_index":2} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" more","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"8CDyIhKSWvJ","output_index":0,"sequence_number":205,"summary_index":1} + data: {"type":"response.reasoning_summary_text.delta","delta":" like","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"HvwDiRtz4JK","output_index":0,"sequence_number":281,"summary_index":2} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" information","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"QmMd","output_index":0,"sequence_number":206,"summary_index":1} + data: {"type":"response.reasoning_summary_text.delta","delta":" more","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"N8aq8rORlAe","output_index":0,"sequence_number":282,"summary_index":2} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" or","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"9KTSzSLHxYs43","output_index":0,"sequence_number":207,"summary_index":1} + data: {"type":"response.reasoning_summary_text.delta","delta":" details","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"L7KUx0Lz","output_index":0,"sequence_number":283,"summary_index":2} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" convert","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"ZfBo8lPO","output_index":0,"sequence_number":208,"summary_index":1} + data: {"type":"response.reasoning_summary_text.delta","delta":" about","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"P4tHAq3THY","output_index":0,"sequence_number":284,"summary_index":2} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" units","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"G69iOi6RM1","output_index":0,"sequence_number":209,"summary_index":1} + data: {"type":"response.reasoning_summary_text.delta","delta":" wind","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"dCa0zAkfcXw","output_index":0,"sequence_number":285,"summary_index":2} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":".","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","obfuscation":"Lbj3FxjNQ99W01P","output_index":0,"sequence_number":210,"summary_index":1} + data: {"type":"response.reasoning_summary_text.delta","delta":",","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"tMqKuLBmoZhcypr","output_index":0,"sequence_number":286,"summary_index":2} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" precipitation","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"oj","output_index":0,"sequence_number":287,"summary_index":2} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":",","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"bHEkcqZoLC6xTVv","output_index":0,"sequence_number":288,"summary_index":2} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" or","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"DTtwABE8anfQL","output_index":0,"sequence_number":289,"summary_index":2} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" an","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"oLCZ16Vf8Rge5","output_index":0,"sequence_number":290,"summary_index":2} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" hourly","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"ZWgHyQ2ki","output_index":0,"sequence_number":291,"summary_index":2} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" forecast","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"QifLPYm","output_index":0,"sequence_number":292,"summary_index":2} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":"?\"","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"xAGXBrr6Sdichk","output_index":0,"sequence_number":293,"summary_index":2} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" I","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"lMtGING6eDMI0a","output_index":0,"sequence_number":294,"summary_index":2} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":"’ll","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"8TjrRU2mUtVns","output_index":0,"sequence_number":295,"summary_index":2} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" keep","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"tEZvXxjYjnY","output_index":0,"sequence_number":296,"summary_index":2} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" everything","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"WZlvN","output_index":0,"sequence_number":297,"summary_index":2} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" concise","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"Y1m6C33U","output_index":0,"sequence_number":298,"summary_index":2} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":"!","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","obfuscation":"HylvGU6qjx8oG5N","output_index":0,"sequence_number":299,"summary_index":2} event: response.reasoning_summary_text.done - data: {"type":"response.reasoning_summary_text.done","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","output_index":0,"sequence_number":211,"summary_index":1,"text":"**Crafting weather response**\n\nI want to keep my message concise and clear. I'll state the current temperature in Florence, Italy, which is 40°C (104°F), and let the user know I don’t have additional details like precipitation or wind. I should offer options for more information, such as today’s forecast, an hourly breakdown, or humidity and wind details. Additionally, I might include a friendly note about extreme heat. I’ll ask if they’d like me to fetch more information or convert units."} + data: {"type":"response.reasoning_summary_text.done","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","output_index":0,"sequence_number":300,"summary_index":2,"text":"**Drafting heat safety response**\n\nI want to make sure I address heat safety effectively. The current temperature is 40°C (104°F), which is very hot. I'll provide three key suggestions: stay hydrated, seek shade or air conditioning, and avoid heavy exercise during the midday heat. I'll also include a note about being cautious with vulnerable individuals who might be more affected. To keep it friendly, I could say, \"Would you like more details about wind, precipitation, or an hourly forecast?\" I’ll keep everything concise!"} event: response.reasoning_summary_part.done - data: {"type":"response.reasoning_summary_part.done","item_id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","output_index":0,"part":{"type":"summary_text","text":"**Crafting weather response**\n\nI want to keep my message concise and clear. I'll state the current temperature in Florence, Italy, which is 40°C (104°F), and let the user know I don’t have additional details like precipitation or wind. I should offer options for more information, such as today’s forecast, an hourly breakdown, or humidity and wind details. Additionally, I might include a friendly note about extreme heat. I’ll ask if they’d like me to fetch more information or convert units."},"sequence_number":212,"summary_index":1} + data: {"type":"response.reasoning_summary_part.done","item_id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","output_index":0,"part":{"type":"summary_text","text":"**Drafting heat safety response**\n\nI want to make sure I address heat safety effectively. The current temperature is 40°C (104°F), which is very hot. I'll provide three key suggestions: stay hydrated, seek shade or air conditioning, and avoid heavy exercise during the midday heat. I'll also include a note about being cautious with vulnerable individuals who might be more affected. To keep it friendly, I could say, \"Would you like more details about wind, precipitation, or an hourly forecast?\" I’ll keep everything concise!"},"sequence_number":301,"summary_index":2} event: response.output_item.done - data: {"type":"response.output_item.done","item":{"id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","type":"reasoning","encrypted_content":"gAAAAABpsv-qWrPMw25jrq-yOZjzZPOSEdM4Fx1vNS7BJv3a6IProsJhWgqbNo4eq23Set3zIhr3KsVAQ-a0ksXbsyGtjOBElXqevu_GtNSdQYvizWwaeXUSOCR_o4bFfCYp2TllWq2nPGgO25ilSOAfLN5ncBoa8Um7_dZ5GPGRtue6hYDAyqSXiQJZmCRqBV71Dn1vxVuPk-_B0OryttoxVrDyQxu1Upp0igqJVmD2cCQIQvN9O9v7v1mrgf4MGWMKks0NXz26X-4ue80kaXKbsJdvGyWe3SvaSrbzh1zlpzX_sN6vgUDmKgeMD37NMIMcWDWQEuECZ2EwrgcytGZTh0EXV4Wgyrqt8M9SqThoPCVLggoi9W1VtB4Tb0w5zf9931BnpbdVQMHbCKn7mMLHkNc9rdb9EQ0-VKpUQYknZxDX7VzOdUmJs2FdtA5OtnXnkNnqwMyUtQhaHxzA6tG1iCnLCjErur729OeDMg_C-a0gjHUgjMPQvpJjGhr-cFltqqxLZvmxVvQs6D-gXdteOY3qmfSquIQXF5c7D6cvMzR9gTJszX70SBPrqp3y-JCauyoAo9RusfPlT7_AJB-wkA3mToYVEH5DRcaSZBiM0h_JpA5cM6t1ucYny1dX9w7Oub6MY0RlHGI_f6mcLBuaMFgVBYUvA2sF9KqRkmYbfevoaPHh_cDS8Nkdiwgdat1LJgq994OhYOO02gBrK7iWLuaEQ4bSE_AXLUUbQ4HYgjOgYxIw2BfEgvVF8KLlJHrjOK9yrO59a74ravV2tumnzwXF0abl8ne8FPrIYyAXJqL0eD-LTpWEP3ADarRsn2Ub_Zwbmd2pRKDUs-grULpYYHD_i-tjnuX8j0gQGlP6rgerDkUUnN8sUT6eftWrrtVyqFpEGqohvErUkKOebkewALpzTcyifmCd8qGJEkh-0mQL0CHCZapvHjTyGImCIxtSrpfYjCPmaw6BrEYfJ_CeG6vXBALXrGGa7Ej2e0byHPFEHR7hWmvKMEBQb-r6puV-1qHtW56W2GUb_khMQRbQwMkPOKqPELiC86YFtsXMkQ6qdxKaPWIeHGMOU7tOGXreAv6K1FiobypqXuI8kijAAZE6NdXKNQSceGz8ZjF8emZMfnlzu8EZfgQ9sQShrYXFx6qTMoIUNkMNGWuQoMTLWGoaunp_NWvk_HqdQ7V9c_QJUbcL-bJ-bSlvtfLwwS3WVX5GDXlDsS9Ljvy84D9E8VKGTBCcRzN4MAe4_gyYO54MkLPugDcKmw1SD8XjmPX_A58PZlTMEAfQB4v6yY5QvCvImZ-DaK64Nx0CDInoSyXLQM_TRHoycN4EQ3DxDIaXStEiHp-pqCj40zNmvwjHXLPqEwJhxf3b-1q-XocIbm1H1dhUsYOunHne1yhaFrITU8O_jXd1FdOAuy7MhOqhbjylrfLp3bkEK0jKqNBW3RN4YQwFZpXsWEZtebLeaiYF7dqRKTz2XUc3FdOcAuzWtG3n-DknhWXxseCC1wg2AQPQou6uYfQ9EaZ47nLv59lSgiN3DRDd4og0sI5oJmNwd1aolgLK6xtHIOqH6tohazoZEsvLnvKJs3Bjy7n3bizYSZx3y-1U-RI6AXDXrGRLIAPS6ZZhukqYEq4C2eTVrj5tWWJOqzB_kUF6N99oAX0CVhqCgNlQU2qSQ1x5zEJZUNTRnWAhJ3uhF-iiJtM1PfBq7_gel1bQ-O7a-5mW_--8XWuyh7HEVpkfvbQLUV8Q6Eh-DPKxZLK_XC87jDePOY1v3au84mzAUBg7AUg6fKC3xpMBrEsdhvho5FWXjoNzSvZXYWbNoVFPn4sRiu-uvHlCIZVv-Xik4slqdtoCR0UDaHnT9wDr-cQaeCztSXrxoNde4BI4xj6YFnASsAAblWyEMdy0Y1mWlJuL_XIPgUFJCJ5UtEA5mNOkyyH-a88_a-lji2I-PuACWpWeI6JScUk6xx9yt8MYIYEosV3Wxv5NP6Hi377Vni_OiV_NpWgqokRmf5XOOuGddsbp2E0_m8ZSyJCyCr0Gqg5DnXvaLxarTTgo39vnkagpsv9lCZKl1JR3tiUItNZVkKeApkc_8GOJu-M4GBFBf134Tpa3qjLi4t9ETR_mmIKEZ--K3fovXEd6vhxbyOABnT--1WMG4PzWyZj8exN-9j-e7ytivc0tpS9Pvl2tvKMl7Pd9hnjvo7MH0K17ErLAJNcTtLAY8XFS6vGyl3iy-NI44mMoyJPsEXAtCPMr8tQHc-oYGFB7Qg4qMAMPVOk5yeg-nnCrqdWdgSW_E3bVXAqSz7UlISqI3DZ85u1nsrLADfQLTDvb5OERcNhG-eBjNxyHsUOfhdatOHQaOA6xTaFSnfoNaxXmbqxA4k_3hYsQmhLslljMuFABpEn6LI2wJdnNkfSICZHwrIIBD5mokd_m_YS6njKonqqZjt2kkGRySWYEbLKkqOXTtjlsgzXHLXi9w3IWP6AUA5a_VR4A0Ec0XhANO-lvR6F4Y4FK1ox9HxDUExqFMImBUWYLp60aQPEzfZtyOTtE4-FSeiJqvp2FNS6VCQ4lnZ27eUr2lzoLh6DYNhh6BD3X3aQGp8NOYt60X6muJKxZMxVvlS7jwg0mMZirpkLrXsiKU2kiZ0WJ4fIM9XCXrI-OTGyUEbjnlvg94PAj82gHEqUXZuE4B_G99XIlK004Y1FMEuHTVS68Mw2eiTCEQtO9lxC65buBgetDe1ypBGkHH7jRD0BQcVC4KmnlEDGOzBJilibIVXsnN_vml4JQFSDssJOz3OG30ta4p7500LDdEexrezqwGqL8mbjj5z8aQf5ylkYFXLop_bFL4bPK8eyo6EDavWbJFgvSQCrOjSYT1oU-QKTq1T9IKWeZSXy3k7YS9j-5v_7pc9T9qNxtU-gvePz-xeZ28zsF1u2wwRVtNgDSL76-MO9auL-oLRk3sJq57k73o8h7xOQWutBLTdps8SZ81vOPxffy43k0mJYZrMc9CBICb0SPSpGT5zbi9TKjxpBzh-Ypokc0lCFysgSVjoEfhyRTSsWwP-KX5FgtLjvkM8KXo1a5a3TxnfUb2JiqeY-Pc8lfiZxes_nza3d_VJ1jFM3szODxaqfIZ2SV9egqs_mV29lNRaL6IdhHhoYIyMp-","summary":[{"type":"summary_text","text":"**Analyzing weather response**\n\nI've called the weather function, and it returned \"40 C\" which seems to be the temperature. Since it only provided that, I need to clarify that it's in Celsius, and I should let the user know that it’s quite hot. I could offer to provide more details such as humidity or wind, and I can convert that to Fahrenheit, which is 104°F. I need to mention the current temperature but avoid inventing any other details. I'll ask if they want the forecast or more information."},{"type":"summary_text","text":"**Crafting weather response**\n\nI want to keep my message concise and clear. I'll state the current temperature in Florence, Italy, which is 40°C (104°F), and let the user know I don’t have additional details like precipitation or wind. I should offer options for more information, such as today’s forecast, an hourly breakdown, or humidity and wind details. Additionally, I might include a friendly note about extreme heat. I’ll ask if they’d like me to fetch more information or convert units."}]},"output_index":0,"sequence_number":213} + data: {"type":"response.output_item.done","item":{"id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","type":"reasoning","encrypted_content":"gAAAAABqPBG01yOC8Njn2CRivxiSDJh3locWJxz5h441d0E4w1AKNcCnwSDKwnjgDdWM0g5GH_Wjg9ZWGl2HbjoZRA6e4PvnIVH6yCgXgHVdBECpeiwPVhIl4Z1POOQovUKD8boOc60bI35fyKDmx_Bwh3L9LHCVh2HDMlkbYxwVaYk_2HFW-jYuEKQb3rkzpXZjJ9GA3lVI9vbYf4fpCWkFS2jXPuC1AKvDsnvSEAmS4JoUp72BIW6I1gCOZLxIDl6hTt1-AaAXakmpr70o6iyoigy6C7v7pX0W_k4oz2VVVPYqlWce-_lyC_VDZn0lQS4muhHKQ9VTjMqrnC7acJWIJUJSutuzGlGHONjAHZGdxkpTDHD-YnXA0qRG1pnV2w8stDT6XXYHwzV6kzQiKrtsONMBkViouhwaqmFalUP-UBcB9xHzHAdofFn4EG0M9i5BNGIOVB2CYG7N8i4y7xWrk_IrudabIoXPrcT_pDa9P0qhFszM8zitGXYr5G2BbZAg5nbCavIGFrdESzd1s6hsDeOb1Ng3WoOB9Ai0J37ig213wwMVQRJ7d28JDB4vE6C-f7HFIqm66BTW-Ij_-tZ8bWMG0CZAGIIYv6Au7_wtgzwf54uFw4TC9aJQmHoiJpWT9qWWMzOfB9FkjlcfB8QA3k5YkD0FkyhY24xZi520bfc8BjoVCoQU-HT7NhaMzw5W1ZEb3aa64IuPfPFIBUWf06DRcFqAANXfwyBCD7cfTiFUUHHrJa5d4__5FJPMvpbCU1ogwiVavuK5ndhBkeuaYgCzwVaHOFWvodNjBTW4y0z7W7twlkbom2EvBmQxmEKQ5YR7iR3wl9Dq-4MqZ6ExL_SBL4UBa4QkjZ0cnYMcMN-kdmhDB-d-r9-UakS_qJ-dTvIBXp46aRH5wOZy5WhFdJwvVHdgoIHjqGt_JpRyMvSMTrJypEb9ucciaInSjdUvhOtyRulZtWF_yXPAiJcSvIBoIJ_5G0EhYA1oLBBIQiVR_ilC2_N80wqApzJrze_69kRNGcZxIrDJpZdjXE937yFsmUZy5QWffMjHxkrruoibE2Z4Bk5RISzxbxIN7C7oQZE2QEu8qTXTe8jFfhRoUWEpNx63BnfUn_Tifi7e16xtG3r6dYhOkt5_4mWulCOduVbIOMTSZERv3IA_TZnlH5ZiNBcGkAZ_0GUmIBoPZA4YqwOmT2HusBdgQycHvZrIc4C6EPsiNktL4qYs7Ilme8lzSHHlYFVHeljktdL-SGTk-zHCBBGCnmk6FTnZ61ffFjFqQc4X9iO67LtILjEJslfEG8X16GRV4wPHu0jh0o4jpl9HPa1dTqk3QjxK6FNXPGOxHGbeGpCn3W6-s_gN3Myj7Jmqa8kqMQ-yCTtUdjlQ_f639AwIUlNXtsJajojgIthteWvN0bqZDK8Debe4fwgCE2QnBVUXQ7K4ZpWQkN1PBN6CxW4Y_XEX5dsiJFPKHaboYPUpW9IvHjAjqHH37jcjJr1WUBRDOTjWBhq3IpK3cntnbnInj6SKOFKsEqm1BRLJzFqmFoQ6jTLMVVr-uwk5WD5QeloEpbHl-QcUmHir-FPZd5xB9r1G1pigVfiwVc7i5as7ZlVAprzCuYlVcgd_yIg6Ds9LGvOe5D43U5-NxaBJ5jNwHxVZ2755OMyRfbCXPKSw5q0q28l5mSPTUZuq4qETxeweNqVjaOmpevEUmtcu_6cjXo-N629BmbwBh1-doInPRg23UHD4wYH5qlQ90GmB3ckwha5oH-qwdOi6ZFO07Tf1OiWrFRJBE4o3lkzEvjRNP6dQ1iLP8b1wA7x864VgAdMrZhlb9M0DHNzM1wngHpiexifD9jkyOvLZbuiI3oWARZkoTkIcZXjhUXkKDq-_gmrX26WlJ3H8B6Nf5SPU3EKcX8a9AuzOgydgWJImw3UIJcTffoqx_AuPWiVh1grxsbriz-rwp4NSCvq2BjiVl-NpA01px6ks7oG1JvgMeyQY_sBPYCvAIW-pHe9aYCHH-5_LMLqj3w8X7ff-2EEWSDRVUDZMrVFxz5gztpPY9cDN8PyMiw-Sl-bA4U137VYzOhRVYTuRuq8jAg0NjmFenwGetkqhLdsT7ZAdysVKxb5IxVf_2WGSXuQ0MuLgR-e1tT3a0rex05mZo-q-Xur81bpARB-wmAa8xKx7VSuFFtBjlnF44JbijLEz-6bG5I34Z3eZ0rAggbmf5wIjSanst5csVOLzwx9_wTj0fXiiW0lb3iRdw9ZIGvl5zKjcYu5jUKduZGWCAt_7s3nDb2ksSMA1uvnEieK1MIRLqtSbHCiOsGNqsoPk40p7O5ii8QqGU0MkiiWTqoTMpkSxXrPlGK4K_Sw2DL7fWAjvIv-Q963oYVLil3ddmgOa8nmKchbyLFkQyekWJRFibdSJ5pl1_Y74VFHhjLQ-SDCgTlzbn3P6BkaDL1us0XxNZRRDUoaUrFDV98NJlc31-IQ06e6bgnoNjV2XkpukxAXw2Op6XvVFYyQMAz80cfWujWn2x0gIyi37TnDUPgvJsYAnTS7iQ694lYfhFd0GhpIYHtD2b8_kqdv-6qcXCm-Y3QGVnDxg14ZTcoPnNJ8K_pW3y3hxxb-SVDIQnlQaS8RWC3rcXyKeS-USkJhG8dG0-dbOKz0yQjLGVyOEtHom9v9kZmKdnHAYBwTgLdRFYUSf4Lfsc6ZwCB-_BnJeHBxDD6pi77WXV1cjVMtiuxv1IWrqURCrWuOPHp9m4cQnUIcURCDn4-ZkYe8N6WsBo3i0pqDplSTZPH_CU1cK2bGjgUfilyIW-Aq7MvRk8zh-lOZvUu95VyTUWKhFAmq9vcDpRZxbMVuUg-DP3yVFYw7awSXwBsEemcs8q62s7la32b2rFYZ5lbh4GRdDu6zBu0AQkZSQZ_boAg1mU7Zsj7UxZbcYpFJTmU1-61lvBs4i-UTjVB6TVFd1i6RPwb2-2_WR2hVpp9ish1AfZoweQneizwEujxbE2S0BTQgQYjcDO3LlbjyU0A7XACI1poM5BVLUx0NYSCcgEl8BNGWIosQbjeRSrN-Jm5erfgXPeEEVudtIpvztgvaxig3Z3EBK_iPdta9ituLnGbrZAxSQtyz5hL744IkKbpYqbdhpFPYXLjuRXlveyjoppa8Rnz4-M9MaEp8UrXt7W8Y5Da5puvO8V31Ltt4TD0fwZe7ue9VEX-zd6vrCszoqKqi2Udd9yfGIXD3VNbRiEWmjCHVnDDEehfXtbCxr5UySJZlFt08gnKbGKUUv9Ony1usvk0FekHg_KnK4__QfCUiI-V8XEgAsneWw_N1V3sfBU77k35z4ZvuXmNL7ZlL7C7UPYqU_kSLW9Q4dcaliGTszc6d3PccRFY7TZAj0ZZsEJEm4tCzo-6e71-0FxdwfGi6T-Ysy2398KlFfbVX_W05iCR3L_yJtw9WwH2its-qfBgaVb5OWPzp60PI21IynhMxVmMx0G6ViQUMN4llB_5a-OMKnVO87WLuMFoxBIpOUwsPzIFG73zJEnWNQpmLtmbPElBDVe3iyFndQCQrg_SbeEcIZIqTMoeiXzN1ZWhRnRzQUYdBaruMCmL3PRCCR6V_b-ijFEAarMwbuhb7QMwL-mNZmfKooCCvTejG6EsB0NJexJ3mtscPX_xcqm-kYDVv2503SuE4L28zYqwhIH3aamkfzspAGbmJxMI9Nd4D48NBD43yNnDxkT7TmPCnz84fZQJay7jThvpAaHQHsiPtF3ud2v1GZSXqorCI5J5-tWs5d5MM76_qt0E3Z0mvxRwmK8SscLhZ1O3eIEh7kq0Oq0USMytU6k-oAtyqX4novcThX_9QdnuuZOhpDlDPKnkZVFS0HRG5n4Ml_gd0QTUjZIQjqHPcSluf_7EG2CH-JkUqEclBXXX_eWWJxHaQxfXSCM2Epjco0Sd7F6ehc_3azs8YpJHZLn8W_oqbZX0U96QTCAfnKR24n8aW24c7ecdMPGMb59hTT9hwz7J0uYo5_E3LhFmggu3__7mhNEA2Ty3UP2MhU7sIGKrWwNlJG6GreH6svrar2Jqh8boqMjw==","summary":[{"type":"summary_text","text":"**Providing weather update**\n\nThe user asked about the weather in Florence, Italy. After calling the weather tool, I received a response of 40°C. I should keep my reply concise, mentioning that it's quite hot. I could say something like: \"Current temperature in Florence: 40°C (104°F).\" It might be good to add advice about hydration, sun protection, and light clothing, and ask if they'd like additional details like humidity or a forecast. Keeping it clear is key!"},{"type":"summary_text","text":"**Conveying weather advice**\n\nI need to address the current temperature in Florence, Italy, which is 40°C. After converting that to Fahrenheit, it equates to 104°F. I want to stress that it's very hot and suggest precautions like staying hydrated, limiting sun exposure, using sunscreen, and avoiding strenuous activities. I should also ask if the user wants an hourly forecast or tomorrow's weather. I could frame my response like this: \"Current temperature in Florence: 40°C (104°F). It's very hot—stay hydrated!\""},{"type":"summary_text","text":"**Drafting heat safety response**\n\nI want to make sure I address heat safety effectively. The current temperature is 40°C (104°F), which is very hot. I'll provide three key suggestions: stay hydrated, seek shade or air conditioning, and avoid heavy exercise during the midday heat. I'll also include a note about being cautious with vulnerable individuals who might be more affected. To keep it friendly, I could say, \"Would you like more details about wind, precipitation, or an hourly forecast?\" I’ll keep everything concise!"}]},"output_index":0,"sequence_number":302} event: response.output_item.added - data: {"type":"response.output_item.added","item":{"id":"msg_04fcf497c9f5b8760169b2ffaa75ac8195a37db9aea667c071","type":"message","status":"in_progress","content":[],"role":"assistant"},"output_index":1,"sequence_number":214} + data: {"type":"response.output_item.added","item":{"id":"msg_060b1ce986da3b18016a3c11b48c9481968f9ce89e269388f3","type":"message","status":"in_progress","content":[],"role":"assistant"},"output_index":1,"sequence_number":303} event: response.content_part.added - data: {"type":"response.content_part.added","content_index":0,"item_id":"msg_04fcf497c9f5b8760169b2ffaa75ac8195a37db9aea667c071","output_index":1,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":""},"sequence_number":215} + data: {"type":"response.content_part.added","content_index":0,"item_id":"msg_060b1ce986da3b18016a3c11b48c9481968f9ce89e269388f3","output_index":1,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":""},"sequence_number":304} + + event: response.output_text.delta + data: {"type":"response.output_text.delta","content_index":0,"delta":"Current","item_id":"msg_060b1ce986da3b18016a3c11b48c9481968f9ce89e269388f3","logprobs":[],"obfuscation":"LGTWGf1Lj","output_index":1,"sequence_number":305} + + event: response.output_text.delta + data: {"type":"response.output_text.delta","content_index":0,"delta":" temperature","item_id":"msg_060b1ce986da3b18016a3c11b48c9481968f9ce89e269388f3","logprobs":[],"obfuscation":"6g8h","output_index":1,"sequence_number":306} + + event: response.output_text.delta + data: {"type":"response.output_text.delta","content_index":0,"delta":" in","item_id":"msg_060b1ce986da3b18016a3c11b48c9481968f9ce89e269388f3","logprobs":[],"obfuscation":"RjcYlVHh5f7Ca","output_index":1,"sequence_number":307} + + event: response.output_text.delta + data: {"type":"response.output_text.delta","content_index":0,"delta":" Florence","item_id":"msg_060b1ce986da3b18016a3c11b48c9481968f9ce89e269388f3","logprobs":[],"obfuscation":"IbRq5wy","output_index":1,"sequence_number":308} + + event: response.output_text.delta + data: {"type":"response.output_text.delta","content_index":0,"delta":",","item_id":"msg_060b1ce986da3b18016a3c11b48c9481968f9ce89e269388f3","logprobs":[],"obfuscation":"UaEtg2xyydRlPgX","output_index":1,"sequence_number":309} + + event: response.output_text.delta + data: {"type":"response.output_text.delta","content_index":0,"delta":" Italy","item_id":"msg_060b1ce986da3b18016a3c11b48c9481968f9ce89e269388f3","logprobs":[],"obfuscation":"xQpa5RPjPk","output_index":1,"sequence_number":310} + + event: response.output_text.delta + data: {"type":"response.output_text.delta","content_index":0,"delta":":","item_id":"msg_060b1ce986da3b18016a3c11b48c9481968f9ce89e269388f3","logprobs":[],"obfuscation":"xqN5oe68NYdale8","output_index":1,"sequence_number":311} + + event: response.output_text.delta + data: {"type":"response.output_text.delta","content_index":0,"delta":" ","item_id":"msg_060b1ce986da3b18016a3c11b48c9481968f9ce89e269388f3","logprobs":[],"obfuscation":"0RFvDFILzZqiep5","output_index":1,"sequence_number":312} + + event: response.output_text.delta + data: {"type":"response.output_text.delta","content_index":0,"delta":"40","item_id":"msg_060b1ce986da3b18016a3c11b48c9481968f9ce89e269388f3","logprobs":[],"obfuscation":"uwb4gzcG6a3vA8","output_index":1,"sequence_number":313} + + event: response.output_text.delta + data: {"type":"response.output_text.delta","content_index":0,"delta":"°C","item_id":"msg_060b1ce986da3b18016a3c11b48c9481968f9ce89e269388f3","logprobs":[],"obfuscation":"tecG8a0pcOAUkO","output_index":1,"sequence_number":314} + + event: response.output_text.delta + data: {"type":"response.output_text.delta","content_index":0,"delta":" (","item_id":"msg_060b1ce986da3b18016a3c11b48c9481968f9ce89e269388f3","logprobs":[],"obfuscation":"oJmweiusxIRT5b","output_index":1,"sequence_number":315} + + event: response.output_text.delta + data: {"type":"response.output_text.delta","content_index":0,"delta":"104","item_id":"msg_060b1ce986da3b18016a3c11b48c9481968f9ce89e269388f3","logprobs":[],"obfuscation":"J44YLIFqurJat","output_index":1,"sequence_number":316} + + event: response.output_text.delta + data: {"type":"response.output_text.delta","content_index":0,"delta":"°F","item_id":"msg_060b1ce986da3b18016a3c11b48c9481968f9ce89e269388f3","logprobs":[],"obfuscation":"p4tg57HhTd1XGX","output_index":1,"sequence_number":317} + + event: response.output_text.delta + data: {"type":"response.output_text.delta","content_index":0,"delta":").\n\n","item_id":"msg_060b1ce986da3b18016a3c11b48c9481968f9ce89e269388f3","logprobs":[],"obfuscation":"EopyZYcouDQz","output_index":1,"sequence_number":318} + + event: response.output_text.delta + data: {"type":"response.output_text.delta","content_index":0,"delta":"That","item_id":"msg_060b1ce986da3b18016a3c11b48c9481968f9ce89e269388f3","logprobs":[],"obfuscation":"lR4sJrKBUve9","output_index":1,"sequence_number":319} + + event: response.output_text.delta + data: {"type":"response.output_text.delta","content_index":0,"delta":"’s","item_id":"msg_060b1ce986da3b18016a3c11b48c9481968f9ce89e269388f3","logprobs":[],"obfuscation":"bnoSiICa2qzMsc","output_index":1,"sequence_number":320} + + event: response.output_text.delta + data: {"type":"response.output_text.delta","content_index":0,"delta":" very","item_id":"msg_060b1ce986da3b18016a3c11b48c9481968f9ce89e269388f3","logprobs":[],"obfuscation":"24Fx0cX1WTW","output_index":1,"sequence_number":321} + + event: response.output_text.delta + data: {"type":"response.output_text.delta","content_index":0,"delta":" hot","item_id":"msg_060b1ce986da3b18016a3c11b48c9481968f9ce89e269388f3","logprobs":[],"obfuscation":"sBTMIVwiUgYW","output_index":1,"sequence_number":322} + + event: response.output_text.delta + data: {"type":"response.output_text.delta","content_index":0,"delta":" —","item_id":"msg_060b1ce986da3b18016a3c11b48c9481968f9ce89e269388f3","logprobs":[],"obfuscation":"y2xO49VCmNxb9b","output_index":1,"sequence_number":323} + + event: response.output_text.delta + data: {"type":"response.output_text.delta","content_index":0,"delta":" suggestions","item_id":"msg_060b1ce986da3b18016a3c11b48c9481968f9ce89e269388f3","logprobs":[],"obfuscation":"TwZy","output_index":1,"sequence_number":324} + + event: response.output_text.delta + data: {"type":"response.output_text.delta","content_index":0,"delta":":\n","item_id":"msg_060b1ce986da3b18016a3c11b48c9481968f9ce89e269388f3","logprobs":[],"obfuscation":"6jdc5a7z66HpKJ","output_index":1,"sequence_number":325} + + event: response.output_text.delta + data: {"type":"response.output_text.delta","content_index":0,"delta":"-","item_id":"msg_060b1ce986da3b18016a3c11b48c9481968f9ce89e269388f3","logprobs":[],"obfuscation":"riF9diPCXgiBtFn","output_index":1,"sequence_number":326} + + event: response.output_text.delta + data: {"type":"response.output_text.delta","content_index":0,"delta":" Stay","item_id":"msg_060b1ce986da3b18016a3c11b48c9481968f9ce89e269388f3","logprobs":[],"obfuscation":"Zlvb187e1lq","output_index":1,"sequence_number":327} + + event: response.output_text.delta + data: {"type":"response.output_text.delta","content_index":0,"delta":" hydrated","item_id":"msg_060b1ce986da3b18016a3c11b48c9481968f9ce89e269388f3","logprobs":[],"obfuscation":"s0XJAJ9","output_index":1,"sequence_number":328} + + event: response.output_text.delta + data: {"type":"response.output_text.delta","content_index":0,"delta":" and","item_id":"msg_060b1ce986da3b18016a3c11b48c9481968f9ce89e269388f3","logprobs":[],"obfuscation":"ACGAbbI0K7Mc","output_index":1,"sequence_number":329} + + event: response.output_text.delta + data: {"type":"response.output_text.delta","content_index":0,"delta":" avoid","item_id":"msg_060b1ce986da3b18016a3c11b48c9481968f9ce89e269388f3","logprobs":[],"obfuscation":"4MdIpHUmcQ","output_index":1,"sequence_number":330} + + event: response.output_text.delta + data: {"type":"response.output_text.delta","content_index":0,"delta":" prolonged","item_id":"msg_060b1ce986da3b18016a3c11b48c9481968f9ce89e269388f3","logprobs":[],"obfuscation":"SGorDi","output_index":1,"sequence_number":331} + + event: response.output_text.delta + data: {"type":"response.output_text.delta","content_index":0,"delta":" sun","item_id":"msg_060b1ce986da3b18016a3c11b48c9481968f9ce89e269388f3","logprobs":[],"obfuscation":"sOs0cfwNLKOB","output_index":1,"sequence_number":332} + + event: response.output_text.delta + data: {"type":"response.output_text.delta","content_index":0,"delta":" exposure","item_id":"msg_060b1ce986da3b18016a3c11b48c9481968f9ce89e269388f3","logprobs":[],"obfuscation":"pvUBjFA","output_index":1,"sequence_number":333} + + event: response.output_text.delta + data: {"type":"response.output_text.delta","content_index":0,"delta":".\n","item_id":"msg_060b1ce986da3b18016a3c11b48c9481968f9ce89e269388f3","logprobs":[],"obfuscation":"F8Os0DDfpS9ncV","output_index":1,"sequence_number":334} + + event: response.output_text.delta + data: {"type":"response.output_text.delta","content_index":0,"delta":"-","item_id":"msg_060b1ce986da3b18016a3c11b48c9481968f9ce89e269388f3","logprobs":[],"obfuscation":"bIbHGwb85G0afjo","output_index":1,"sequence_number":335} + + event: response.output_text.delta + data: {"type":"response.output_text.delta","content_index":0,"delta":" Seek","item_id":"msg_060b1ce986da3b18016a3c11b48c9481968f9ce89e269388f3","logprobs":[],"obfuscation":"48DMN0YnkFV","output_index":1,"sequence_number":336} + + event: response.output_text.delta + data: {"type":"response.output_text.delta","content_index":0,"delta":" air","item_id":"msg_060b1ce986da3b18016a3c11b48c9481968f9ce89e269388f3","logprobs":[],"obfuscation":"4EwnKifX02Hp","output_index":1,"sequence_number":337} + + event: response.output_text.delta + data: {"type":"response.output_text.delta","content_index":0,"delta":" conditioning","item_id":"msg_060b1ce986da3b18016a3c11b48c9481968f9ce89e269388f3","logprobs":[],"obfuscation":"fKW","output_index":1,"sequence_number":338} + + event: response.output_text.delta + data: {"type":"response.output_text.delta","content_index":0,"delta":" or","item_id":"msg_060b1ce986da3b18016a3c11b48c9481968f9ce89e269388f3","logprobs":[],"obfuscation":"aIW3NwPCAwcHe","output_index":1,"sequence_number":339} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":"Current","item_id":"msg_04fcf497c9f5b8760169b2ffaa75ac8195a37db9aea667c071","logprobs":[],"obfuscation":"nAosHlYzN","output_index":1,"sequence_number":216} + data: {"type":"response.output_text.delta","content_index":0,"delta":" shade","item_id":"msg_060b1ce986da3b18016a3c11b48c9481968f9ce89e269388f3","logprobs":[],"obfuscation":"PkLcQHg3My","output_index":1,"sequence_number":340} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" temperature","item_id":"msg_04fcf497c9f5b8760169b2ffaa75ac8195a37db9aea667c071","logprobs":[],"obfuscation":"exVn","output_index":1,"sequence_number":217} + data: {"type":"response.output_text.delta","content_index":0,"delta":";","item_id":"msg_060b1ce986da3b18016a3c11b48c9481968f9ce89e269388f3","logprobs":[],"obfuscation":"ACi0cxeV4vfWwk6","output_index":1,"sequence_number":341} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" in","item_id":"msg_04fcf497c9f5b8760169b2ffaa75ac8195a37db9aea667c071","logprobs":[],"obfuscation":"Qfl5dTuCzQseh","output_index":1,"sequence_number":218} + data: {"type":"response.output_text.delta","content_index":0,"delta":" wear","item_id":"msg_060b1ce986da3b18016a3c11b48c9481968f9ce89e269388f3","logprobs":[],"obfuscation":"YOyl9qIsbvZ","output_index":1,"sequence_number":342} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" Florence","item_id":"msg_04fcf497c9f5b8760169b2ffaa75ac8195a37db9aea667c071","logprobs":[],"obfuscation":"g1Pp7jm","output_index":1,"sequence_number":219} + data: {"type":"response.output_text.delta","content_index":0,"delta":" light","item_id":"msg_060b1ce986da3b18016a3c11b48c9481968f9ce89e269388f3","logprobs":[],"obfuscation":"2dNLywkjs4","output_index":1,"sequence_number":343} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":",","item_id":"msg_04fcf497c9f5b8760169b2ffaa75ac8195a37db9aea667c071","logprobs":[],"obfuscation":"nEFxTMfwcczgQSs","output_index":1,"sequence_number":220} + data: {"type":"response.output_text.delta","content_index":0,"delta":",","item_id":"msg_060b1ce986da3b18016a3c11b48c9481968f9ce89e269388f3","logprobs":[],"obfuscation":"Oo7z5br9VXBfDzK","output_index":1,"sequence_number":344} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" Italy","item_id":"msg_04fcf497c9f5b8760169b2ffaa75ac8195a37db9aea667c071","logprobs":[],"obfuscation":"NPoPe6A1x1","output_index":1,"sequence_number":221} + data: {"type":"response.output_text.delta","content_index":0,"delta":" loose","item_id":"msg_060b1ce986da3b18016a3c11b48c9481968f9ce89e269388f3","logprobs":[],"obfuscation":"f7rlD7XYBw","output_index":1,"sequence_number":345} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":":","item_id":"msg_04fcf497c9f5b8760169b2ffaa75ac8195a37db9aea667c071","logprobs":[],"obfuscation":"rAk3sMO8yfJ1ElE","output_index":1,"sequence_number":222} + data: {"type":"response.output_text.delta","content_index":0,"delta":" clothing","item_id":"msg_060b1ce986da3b18016a3c11b48c9481968f9ce89e269388f3","logprobs":[],"obfuscation":"qIncZIK","output_index":1,"sequence_number":346} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" ","item_id":"msg_04fcf497c9f5b8760169b2ffaa75ac8195a37db9aea667c071","logprobs":[],"obfuscation":"hvVbGzVqlBZrUsH","output_index":1,"sequence_number":223} + data: {"type":"response.output_text.delta","content_index":0,"delta":" and","item_id":"msg_060b1ce986da3b18016a3c11b48c9481968f9ce89e269388f3","logprobs":[],"obfuscation":"u5cGqQQ4YITc","output_index":1,"sequence_number":347} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":"40","item_id":"msg_04fcf497c9f5b8760169b2ffaa75ac8195a37db9aea667c071","logprobs":[],"obfuscation":"Nk9T0ERmzDC992","output_index":1,"sequence_number":224} + data: {"type":"response.output_text.delta","content_index":0,"delta":" sunscreen","item_id":"msg_060b1ce986da3b18016a3c11b48c9481968f9ce89e269388f3","logprobs":[],"obfuscation":"2SFooh","output_index":1,"sequence_number":348} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":"°C","item_id":"msg_04fcf497c9f5b8760169b2ffaa75ac8195a37db9aea667c071","logprobs":[],"obfuscation":"XiWJwaROWvhwj1","output_index":1,"sequence_number":225} + data: {"type":"response.output_text.delta","content_index":0,"delta":".\n","item_id":"msg_060b1ce986da3b18016a3c11b48c9481968f9ce89e269388f3","logprobs":[],"obfuscation":"yNtX3P0ywXxGmg","output_index":1,"sequence_number":349} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" (","item_id":"msg_04fcf497c9f5b8760169b2ffaa75ac8195a37db9aea667c071","logprobs":[],"obfuscation":"5CJ6LWDbnh9Oqq","output_index":1,"sequence_number":226} + data: {"type":"response.output_text.delta","content_index":0,"delta":"-","item_id":"msg_060b1ce986da3b18016a3c11b48c9481968f9ce89e269388f3","logprobs":[],"obfuscation":"OW3ZKJQMfFiQ8JV","output_index":1,"sequence_number":350} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":"104","item_id":"msg_04fcf497c9f5b8760169b2ffaa75ac8195a37db9aea667c071","logprobs":[],"obfuscation":"nwRGiMplfTHwe","output_index":1,"sequence_number":227} + data: {"type":"response.output_text.delta","content_index":0,"delta":" Avoid","item_id":"msg_060b1ce986da3b18016a3c11b48c9481968f9ce89e269388f3","logprobs":[],"obfuscation":"fnaw1gKDFI","output_index":1,"sequence_number":351} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":"°F","item_id":"msg_04fcf497c9f5b8760169b2ffaa75ac8195a37db9aea667c071","logprobs":[],"obfuscation":"yz4lJaWMc976wL","output_index":1,"sequence_number":228} + data: {"type":"response.output_text.delta","content_index":0,"delta":" strenuous","item_id":"msg_060b1ce986da3b18016a3c11b48c9481968f9ce89e269388f3","logprobs":[],"obfuscation":"1snWgK","output_index":1,"sequence_number":352} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":").\n\n","item_id":"msg_04fcf497c9f5b8760169b2ffaa75ac8195a37db9aea667c071","logprobs":[],"obfuscation":"r0p4QyKe38Pu","output_index":1,"sequence_number":229} + data: {"type":"response.output_text.delta","content_index":0,"delta":" outdoor","item_id":"msg_060b1ce986da3b18016a3c11b48c9481968f9ce89e269388f3","logprobs":[],"obfuscation":"aKRWsMhX","output_index":1,"sequence_number":353} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":"I","item_id":"msg_04fcf497c9f5b8760169b2ffaa75ac8195a37db9aea667c071","logprobs":[],"obfuscation":"7QI7YlXFElRYaE6","output_index":1,"sequence_number":230} + data: {"type":"response.output_text.delta","content_index":0,"delta":" activity","item_id":"msg_060b1ce986da3b18016a3c11b48c9481968f9ce89e269388f3","logprobs":[],"obfuscation":"qO8h5b0","output_index":1,"sequence_number":354} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" don't","item_id":"msg_04fcf497c9f5b8760169b2ffaa75ac8195a37db9aea667c071","logprobs":[],"obfuscation":"OmbjHMgZdJ","output_index":1,"sequence_number":231} + data: {"type":"response.output_text.delta","content_index":0,"delta":" during","item_id":"msg_060b1ce986da3b18016a3c11b48c9481968f9ce89e269388f3","logprobs":[],"obfuscation":"nZqhruI3h","output_index":1,"sequence_number":355} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" have","item_id":"msg_04fcf497c9f5b8760169b2ffaa75ac8195a37db9aea667c071","logprobs":[],"obfuscation":"WpncIZGjE4f","output_index":1,"sequence_number":232} + data: {"type":"response.output_text.delta","content_index":0,"delta":" peak","item_id":"msg_060b1ce986da3b18016a3c11b48c9481968f9ce89e269388f3","logprobs":[],"obfuscation":"LRahHs4XMix","output_index":1,"sequence_number":356} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" more","item_id":"msg_04fcf497c9f5b8760169b2ffaa75ac8195a37db9aea667c071","logprobs":[],"obfuscation":"HDdE9s2mE0g","output_index":1,"sequence_number":233} + data: {"type":"response.output_text.delta","content_index":0,"delta":" heat","item_id":"msg_060b1ce986da3b18016a3c11b48c9481968f9ce89e269388f3","logprobs":[],"obfuscation":"eieeEUY6nuq","output_index":1,"sequence_number":357} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" details","item_id":"msg_04fcf497c9f5b8760169b2ffaa75ac8195a37db9aea667c071","logprobs":[],"obfuscation":"5V873l2G","output_index":1,"sequence_number":234} + data: {"type":"response.output_text.delta","content_index":0,"delta":";","item_id":"msg_060b1ce986da3b18016a3c11b48c9481968f9ce89e269388f3","logprobs":[],"obfuscation":"3qgMhwQ6RSi81Kk","output_index":1,"sequence_number":358} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" (","item_id":"msg_04fcf497c9f5b8760169b2ffaa75ac8195a37db9aea667c071","logprobs":[],"obfuscation":"sRoLpuZ9Awc5TD","output_index":1,"sequence_number":235} + data: {"type":"response.output_text.delta","content_index":0,"delta":" check","item_id":"msg_060b1ce986da3b18016a3c11b48c9481968f9ce89e269388f3","logprobs":[],"obfuscation":"jZ0BrBP3gl","output_index":1,"sequence_number":359} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":"conditions","item_id":"msg_04fcf497c9f5b8760169b2ffaa75ac8195a37db9aea667c071","logprobs":[],"obfuscation":"AGN0iL","output_index":1,"sequence_number":236} + data: {"type":"response.output_text.delta","content_index":0,"delta":" on","item_id":"msg_060b1ce986da3b18016a3c11b48c9481968f9ce89e269388f3","logprobs":[],"obfuscation":"eQFcyZYJIabau","output_index":1,"sequence_number":360} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":",","item_id":"msg_04fcf497c9f5b8760169b2ffaa75ac8195a37db9aea667c071","logprobs":[],"obfuscation":"pRGDyv2HRRarftf","output_index":1,"sequence_number":237} + data: {"type":"response.output_text.delta","content_index":0,"delta":" vulnerable","item_id":"msg_060b1ce986da3b18016a3c11b48c9481968f9ce89e269388f3","logprobs":[],"obfuscation":"NVTJs","output_index":1,"sequence_number":361} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" wind","item_id":"msg_04fcf497c9f5b8760169b2ffaa75ac8195a37db9aea667c071","logprobs":[],"obfuscation":"EJCqi5I4hvU","output_index":1,"sequence_number":238} + data: {"type":"response.output_text.delta","content_index":0,"delta":" people","item_id":"msg_060b1ce986da3b18016a3c11b48c9481968f9ce89e269388f3","logprobs":[],"obfuscation":"fKpneSNgg","output_index":1,"sequence_number":362} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":",","item_id":"msg_04fcf497c9f5b8760169b2ffaa75ac8195a37db9aea667c071","logprobs":[],"obfuscation":"h102QZqehM21whT","output_index":1,"sequence_number":239} + data: {"type":"response.output_text.delta","content_index":0,"delta":".\n\n","item_id":"msg_060b1ce986da3b18016a3c11b48c9481968f9ce89e269388f3","logprobs":[],"obfuscation":"eTpnCLKJuGRj0","output_index":1,"sequence_number":363} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" humidity","item_id":"msg_04fcf497c9f5b8760169b2ffaa75ac8195a37db9aea667c071","logprobs":[],"obfuscation":"C0nk6xc","output_index":1,"sequence_number":240} + data: {"type":"response.output_text.delta","content_index":0,"delta":"Would","item_id":"msg_060b1ce986da3b18016a3c11b48c9481968f9ce89e269388f3","logprobs":[],"obfuscation":"N0wKt4W1E12","output_index":1,"sequence_number":364} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":")","item_id":"msg_04fcf497c9f5b8760169b2ffaa75ac8195a37db9aea667c071","logprobs":[],"obfuscation":"2gKfgwLN159vD7d","output_index":1,"sequence_number":241} + data: {"type":"response.output_text.delta","content_index":0,"delta":" you","item_id":"msg_060b1ce986da3b18016a3c11b48c9481968f9ce89e269388f3","logprobs":[],"obfuscation":"SLiSYoJ3PrE5","output_index":1,"sequence_number":365} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" from","item_id":"msg_04fcf497c9f5b8760169b2ffaa75ac8195a37db9aea667c071","logprobs":[],"obfuscation":"hyBdW4S446H","output_index":1,"sequence_number":242} + data: {"type":"response.output_text.delta","content_index":0,"delta":" like","item_id":"msg_060b1ce986da3b18016a3c11b48c9481968f9ce89e269388f3","logprobs":[],"obfuscation":"yoL2tZlbQan","output_index":1,"sequence_number":366} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" this","item_id":"msg_04fcf497c9f5b8760169b2ffaa75ac8195a37db9aea667c071","logprobs":[],"obfuscation":"skwzyUxG9Uj","output_index":1,"sequence_number":243} + data: {"type":"response.output_text.delta","content_index":0,"delta":" an","item_id":"msg_060b1ce986da3b18016a3c11b48c9481968f9ce89e269388f3","logprobs":[],"obfuscation":"gRGGabKOVElQH","output_index":1,"sequence_number":367} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" query","item_id":"msg_04fcf497c9f5b8760169b2ffaa75ac8195a37db9aea667c071","logprobs":[],"obfuscation":"p71WeUjoPP","output_index":1,"sequence_number":244} + data: {"type":"response.output_text.delta","content_index":0,"delta":" hourly","item_id":"msg_060b1ce986da3b18016a3c11b48c9481968f9ce89e269388f3","logprobs":[],"obfuscation":"vj0WlklB7","output_index":1,"sequence_number":368} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" —","item_id":"msg_04fcf497c9f5b8760169b2ffaa75ac8195a37db9aea667c071","logprobs":[],"obfuscation":"QRRW3OGGmzDr1z","output_index":1,"sequence_number":245} + data: {"type":"response.output_text.delta","content_index":0,"delta":" forecast","item_id":"msg_060b1ce986da3b18016a3c11b48c9481968f9ce89e269388f3","logprobs":[],"obfuscation":"58WoF1S","output_index":1,"sequence_number":369} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" would","item_id":"msg_04fcf497c9f5b8760169b2ffaa75ac8195a37db9aea667c071","logprobs":[],"obfuscation":"k2tfclecke","output_index":1,"sequence_number":246} + data: {"type":"response.output_text.delta","content_index":0,"delta":",","item_id":"msg_060b1ce986da3b18016a3c11b48c9481968f9ce89e269388f3","logprobs":[],"obfuscation":"vkCb89P2zilrNEC","output_index":1,"sequence_number":370} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" you","item_id":"msg_04fcf497c9f5b8760169b2ffaa75ac8195a37db9aea667c071","logprobs":[],"obfuscation":"UEYnJVSchrie","output_index":1,"sequence_number":247} + data: {"type":"response.output_text.delta","content_index":0,"delta":" tomorrow","item_id":"msg_060b1ce986da3b18016a3c11b48c9481968f9ce89e269388f3","logprobs":[],"obfuscation":"AobF3GL","output_index":1,"sequence_number":371} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" like","item_id":"msg_04fcf497c9f5b8760169b2ffaa75ac8195a37db9aea667c071","logprobs":[],"obfuscation":"KhOV4fhoR5Z","output_index":1,"sequence_number":248} + data: {"type":"response.output_text.delta","content_index":0,"delta":"’s","item_id":"msg_060b1ce986da3b18016a3c11b48c9481968f9ce89e269388f3","logprobs":[],"obfuscation":"V3Jmh6VEmfsQiy","output_index":1,"sequence_number":372} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" a","item_id":"msg_04fcf497c9f5b8760169b2ffaa75ac8195a37db9aea667c071","logprobs":[],"obfuscation":"tFiDpAmcjeHABX","output_index":1,"sequence_number":249} + data: {"type":"response.output_text.delta","content_index":0,"delta":" outlook","item_id":"msg_060b1ce986da3b18016a3c11b48c9481968f9ce89e269388f3","logprobs":[],"obfuscation":"2WnU9fXL","output_index":1,"sequence_number":373} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" forecast","item_id":"msg_04fcf497c9f5b8760169b2ffaa75ac8195a37db9aea667c071","logprobs":[],"obfuscation":"F4Zwv7m","output_index":1,"sequence_number":250} + data: {"type":"response.output_text.delta","content_index":0,"delta":",","item_id":"msg_060b1ce986da3b18016a3c11b48c9481968f9ce89e269388f3","logprobs":[],"obfuscation":"F7XvtTp1Ug2nFB6","output_index":1,"sequence_number":374} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":",","item_id":"msg_04fcf497c9f5b8760169b2ffaa75ac8195a37db9aea667c071","logprobs":[],"obfuscation":"PKvBrjfLYml68gq","output_index":1,"sequence_number":251} + data: {"type":"response.output_text.delta","content_index":0,"delta":" or","item_id":"msg_060b1ce986da3b18016a3c11b48c9481968f9ce89e269388f3","logprobs":[],"obfuscation":"kR7DxOww92Fwq","output_index":1,"sequence_number":375} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" an","item_id":"msg_04fcf497c9f5b8760169b2ffaa75ac8195a37db9aea667c071","logprobs":[],"obfuscation":"yQRoMoFyJd0zg","output_index":1,"sequence_number":252} + data: {"type":"response.output_text.delta","content_index":0,"delta":" heat","item_id":"msg_060b1ce986da3b18016a3c11b48c9481968f9ce89e269388f3","logprobs":[],"obfuscation":"B0WWfwOInhY","output_index":1,"sequence_number":376} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" hourly","item_id":"msg_04fcf497c9f5b8760169b2ffaa75ac8195a37db9aea667c071","logprobs":[],"obfuscation":"tZrcAmp4l","output_index":1,"sequence_number":253} + data: {"type":"response.output_text.delta","content_index":0,"delta":"‑","item_id":"msg_060b1ce986da3b18016a3c11b48c9481968f9ce89e269388f3","logprobs":[],"obfuscation":"zh4I7bbpIPN4IRT","output_index":1,"sequence_number":377} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" breakdown","item_id":"msg_04fcf497c9f5b8760169b2ffaa75ac8195a37db9aea667c071","logprobs":[],"obfuscation":"Qrq5px","output_index":1,"sequence_number":254} + data: {"type":"response.output_text.delta","content_index":0,"delta":"ad","item_id":"msg_060b1ce986da3b18016a3c11b48c9481968f9ce89e269388f3","logprobs":[],"obfuscation":"AXz2aGzbMFe4G4","output_index":1,"sequence_number":378} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":",","item_id":"msg_04fcf497c9f5b8760169b2ffaa75ac8195a37db9aea667c071","logprobs":[],"obfuscation":"VTd8fKxq8DVu5yw","output_index":1,"sequence_number":255} + data: {"type":"response.output_text.delta","content_index":0,"delta":"vice","item_id":"msg_060b1ce986da3b18016a3c11b48c9481968f9ce89e269388f3","logprobs":[],"obfuscation":"0xb7sx0Jdm2b","output_index":1,"sequence_number":379} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" or","item_id":"msg_04fcf497c9f5b8760169b2ffaa75ac8195a37db9aea667c071","logprobs":[],"obfuscation":"NdH2bF1vVmDpl","output_index":1,"sequence_number":256} + data: {"type":"response.output_text.delta","content_index":0,"delta":" for","item_id":"msg_060b1ce986da3b18016a3c11b48c9481968f9ce89e269388f3","logprobs":[],"obfuscation":"gHINWIyaUEAu","output_index":1,"sequence_number":380} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" other","item_id":"msg_04fcf497c9f5b8760169b2ffaa75ac8195a37db9aea667c071","logprobs":[],"obfuscation":"dqFTsfqApo","output_index":1,"sequence_number":257} + data: {"type":"response.output_text.delta","content_index":0,"delta":" specific","item_id":"msg_060b1ce986da3b18016a3c11b48c9481968f9ce89e269388f3","logprobs":[],"obfuscation":"IQ3nU1M","output_index":1,"sequence_number":381} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" details","item_id":"msg_04fcf497c9f5b8760169b2ffaa75ac8195a37db9aea667c071","logprobs":[],"obfuscation":"OEwN1xMZ","output_index":1,"sequence_number":258} + data: {"type":"response.output_text.delta","content_index":0,"delta":" activities","item_id":"msg_060b1ce986da3b18016a3c11b48c9481968f9ce89e269388f3","logprobs":[],"obfuscation":"L74rr","output_index":1,"sequence_number":382} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":"?","item_id":"msg_04fcf497c9f5b8760169b2ffaa75ac8195a37db9aea667c071","logprobs":[],"obfuscation":"KCwIzZp4r8bCGnj","output_index":1,"sequence_number":259} + data: {"type":"response.output_text.delta","content_index":0,"delta":"?","item_id":"msg_060b1ce986da3b18016a3c11b48c9481968f9ce89e269388f3","logprobs":[],"obfuscation":"MwpwvA1MkLoDKRk","output_index":1,"sequence_number":383} event: response.output_text.done - data: {"type":"response.output_text.done","content_index":0,"item_id":"msg_04fcf497c9f5b8760169b2ffaa75ac8195a37db9aea667c071","logprobs":[],"output_index":1,"sequence_number":260,"text":"Current temperature in Florence, Italy: 40°C (104°F).\n\nI don't have more details (conditions, wind, humidity) from this query — would you like a forecast, an hourly breakdown, or other details?"} + data: {"type":"response.output_text.done","content_index":0,"item_id":"msg_060b1ce986da3b18016a3c11b48c9481968f9ce89e269388f3","logprobs":[],"output_index":1,"sequence_number":384,"text":"Current temperature in Florence, Italy: 40°C (104°F).\n\nThat’s very hot — suggestions:\n- Stay hydrated and avoid prolonged sun exposure.\n- Seek air conditioning or shade; wear light, loose clothing and sunscreen.\n- Avoid strenuous outdoor activity during peak heat; check on vulnerable people.\n\nWould you like an hourly forecast, tomorrow’s outlook, or heat‑advice for specific activities?"} event: response.content_part.done - data: {"type":"response.content_part.done","content_index":0,"item_id":"msg_04fcf497c9f5b8760169b2ffaa75ac8195a37db9aea667c071","output_index":1,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":"Current temperature in Florence, Italy: 40°C (104°F).\n\nI don't have more details (conditions, wind, humidity) from this query — would you like a forecast, an hourly breakdown, or other details?"},"sequence_number":261} + data: {"type":"response.content_part.done","content_index":0,"item_id":"msg_060b1ce986da3b18016a3c11b48c9481968f9ce89e269388f3","output_index":1,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":"Current temperature in Florence, Italy: 40°C (104°F).\n\nThat’s very hot — suggestions:\n- Stay hydrated and avoid prolonged sun exposure.\n- Seek air conditioning or shade; wear light, loose clothing and sunscreen.\n- Avoid strenuous outdoor activity during peak heat; check on vulnerable people.\n\nWould you like an hourly forecast, tomorrow’s outlook, or heat‑advice for specific activities?"},"sequence_number":385} event: response.output_item.done - data: {"type":"response.output_item.done","item":{"id":"msg_04fcf497c9f5b8760169b2ffaa75ac8195a37db9aea667c071","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"Current temperature in Florence, Italy: 40°C (104°F).\n\nI don't have more details (conditions, wind, humidity) from this query — would you like a forecast, an hourly breakdown, or other details?"}],"role":"assistant"},"output_index":1,"sequence_number":262} + data: {"type":"response.output_item.done","item":{"id":"msg_060b1ce986da3b18016a3c11b48c9481968f9ce89e269388f3","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"Current temperature in Florence, Italy: 40°C (104°F).\n\nThat’s very hot — suggestions:\n- Stay hydrated and avoid prolonged sun exposure.\n- Seek air conditioning or shade; wear light, loose clothing and sunscreen.\n- Avoid strenuous outdoor activity during peak heat; check on vulnerable people.\n\nWould you like an hourly forecast, tomorrow’s outlook, or heat‑advice for specific activities?"}],"role":"assistant"},"output_index":1,"sequence_number":386} event: response.completed - data: {"type":"response.completed","response":{"id":"resp_04fcf497c9f5b8760169b2ffa40e7c8195ae65d7c591fdc71e","object":"response","created_at":1773338532,"status":"completed","background":false,"completed_at":1773338538,"content_filters":[{"blocked":false,"source_type":"completion","content_filter_raw":[],"content_filter_results":{"protected_material_code":{"detected":false,"filtered":false},"protected_material_text":{"detected":false,"filtered":false},"hate":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"}},"content_filter_offsets":{"start_offset":0,"end_offset":3004,"check_offset":0}}],"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":null,"max_tool_calls":null,"model":"gpt-5-mini","output":[{"id":"rs_04fcf497c9f5b8760169b2ffa4f7708195b2fbc0daff5a67dd","type":"reasoning","encrypted_content":"gAAAAABpsv-q_vM1mq_LC1CX8r25D-T78AoedRiYpHcuRsULJyV90WzEJD-ePvBCt8KJaomWclCqN3i712xUVhuxfCvU4FcbYX0WcFD7KXm39pMT60ToQa0gaDfdQgoIYiDyeZoiqjG_fIoZMiCcAMUKjucu0FGbTvBb0Ly8q4m7rSsKC6tgjkmiMAuPv0hheDnSNcvVTP3_vDbJGToqULJ3Hc4SPg41k6Dj5BE_aOhWwh9ZS_aVrU7b0gZ6-dm4zvevBe8Mf6ZUN6DWEPqetr06vsjvP09gUmg5qNQGSdPo-0Q2cF7AxFXSkqK6QLHV2zEURM6mVABUFXkQYcESdel23fndkpaRuGqkShovIjDh77bRGTNWmqfKS1vY-afbNG2eHc_HNXv4sCaBLFs2bUSed9U5FuFmyxYS8vHTkHE_Wl-NhOKtivOJ7J6lg5mvARc5KjWfBeKP0ZItiUmAzTenaBqWnXVrg-Qoq8jtNZEVYmoU82XWOHHvFfq5fo3e9-XkC8-c6Nz4aAEkCBXau243npoq0-DpXd3yO5CWARXFrfuKEtHJSHXykzAuAZMFpZ5tDbeHd63mGZWvqQ3EksutR_VvT6k52JixNLNDyDMl7gOm_CNZURrUpW1SiGBl7jDNp2mGGVu1sg9StAt1S9fBnyRCxMvsP54Y4T7jFmgjJkh9ker9x7Tv6_KugtOuYuDH_pWxlPzdP78cFJ63GEWz2uUV0yIQqiqcD5tG33OmbmBzlnIhg5ZgMrZKfXdmPW4X4Xp3vnZbeCYGDWdDiZOb_vekPmcgOHmRXmOQo7091qnH_5bLxZidhMQ1xbVp8qGBTWUq3tSCwpuqJHeRlcRieWYXKWOTmjv2X6tIGed5FVF6qqEHK3blp8QOW31X2c80hVn4SlfORj-BR0fwVy97-3nPprmrDvhuaL6mW960PugToIElQgk3XTQLaoqh5qliTfKWla7TZLj1oSN38xwIh-lrtsMnyYagvBO8f0G9giaA7jOGjUDs70_rc2MGJb96fhZRPA9EyFERjEDKqNVIZCcLzD79lEvGfoFqueeEomFnveRr_FIo8i4sxNcX6cs_S4qwChORu3lfvvoH4NjRH4OjYW_fDRsqjY5p-3A-ZT3S5JXDY-edtinDGadb_XDJrDg9HXPqIYagcIT1e-eR_5LNuHDNrxoHGsELytss4ExTCbNBO0pekgSC4msF-YD7TZuTxHoKR5DBPEKG8SlKD-OnsG-xd2z9JjADnVeGSawLeRZBK0dvbjIXpBkCzoI6WhOlfZmMJjesbcvLyG4apMWC-K_qFm6YN6kH9xY_9nSLyT-WqGv3zR0slR8OgZFJ95QNYJ9ZwStvIZoCB0W_A8x0QOl2JOZ8KdsV9yYomYc7i44nxOYJaXwnQjIMkhdq9wDHeyQAggYOEhz3YukW6Ag87cJfb1G_VBB8k9I_xiHbSZHEJme5gIk88uq5Le5D0SiFvvjtYMtL-EtlZ2Wb3OZqbrdHJwaWbqpJzr9_UjwvS6V1GizN9M5qAAtz_jpzTffKDyvvTIwIqbupukasJsbPhbXBR4w3dPhEamAzNP4lnIsNXUWAYc2iZs3vswch_LtzuwoeMvIJFO-ZJc0JaOaEe9UnOC6cGbVnp5TYtzHwkX-hfDfMhHj21BbrO9E_6BdpQPzhWYHG8r7M5ADFFjiw-XabMLwlsle6ycJoylX0W5saL0eGi3Ch4Hm9ntVLhibx_NSmSjymei4NjLUJ33OWS79oR0d4Jf09tHfSgKjUkANbZGQwdeaUgSlv6tKzzYLiB5ckHklV8PplBsSUYDKeetH-IqC8bv4cHF9brKH_MK1abT1ePmAqLujx7dLLQBa5MZVKFuDEd9_qrTI-Zx_NTnXWIKeNsIVGI-x0NOsgtMKFuzlmV3nHTDFbAmGQmXCXxDGg6Tj_NlmNwqTkMOiY91VI8SaQoi3yiKGE8YfxI7XSie64_U3T3-QMWPNvlr-biItdjH4F7xz_bcU7RBOM5p3SOrtVVh2B36sNzi_hcf1YbVdBv2al7zKwuGkIfJt9oxj4_YSMnKW5IcPjEUc-oB7kyLRj_aDfIN-ohWxMn-OAJDmS-7daYhTrd8na8jBoQkxKMbWj4JIL9WYq8hXdKgdXsPYXv5p58plEwuo3f45VRxyHEJekfG-yhZR3RCSdckfpbOLlPp0nLK39VcGyrDwXWqcLwvgAlniG1EMGu02vjNWTU9KHWOS5bI23Kb3Qsd42Te36mCFMcCcYMT3ELY7dMQQbTM1THALjsGqrfxwGVpqGKc-GDrsd2aLRLcg3EDXm3JMVORDD-P6kgrg1jo-FhNX9C4Z5sg702ZZwbKkTz9z_6FKuiayRzmsjlsX_Xt2qOTKP_2tk0QZ3gihDWCljb0W-btdmjlZ_E2it7w29sBFUniypLjAn0pex5fuzTHfjig2vzmniPwpjHgYO3KHe0GBmyfEnNptA0wpcxrezLA-LPgWCqy112LFTahApfAgfAJ3nmElix4Gnpq1YmoJKpy65KujBeOzVqIhKr2QPwIvHgEVKmLqeoD_U9HFCMEkvyAc7IWoj5mR23xGgxrH95kFU7wMzXvSXxY1D9270qkpkdyBaQWZS7ljGGUv6-K35hkTWwFJzmCYWtad7pIxA0fVhD7gAHW03_FsFyW5OUEMDW4GgPn8LZRbYFqsH9mN7tfUSyffh_a5VtO2Cg04sIkMyG4W2FRtEK6RoYO-bLvcdJo2F5Oguz3JyCKvHGJXC8_gImHVOZe_jCyuLdaHHuW2uHcD88X7Z9G4_GJJVQHKhsXIU4vpT2_pEUvMRPvcKZCJ13TMRB29actXHwP3DRL2SHNx2G_eVhfDk6HfjVsvA4dxuGHf_0vHSYr8Hz8wZE_0iVGCyyGM0FqRQF-O4Wki0ogGeDp-B5C7kn4rWsvQICJnYzEoPiXapBLMe4oy7-aodB-djI9XHZhJqFhjUPEZzFr97U85vSRq1nHqV1IqJTuGAhNrMBt3e_VeaE4MCBKS-mCV5Q9GPChcuJzzCjUHVjQhKmmo-QJhXUu_5c8hz55VR5wrE7mMlDef2J1tkM8LVdJQzy4-FIAqtSum22vr1Lmpn8K-ETOX-aCnnzmQA___wMSt_sdGa7JYjxAF4","summary":[{"type":"summary_text","text":"**Analyzing weather response**\n\nI've called the weather function, and it returned \"40 C\" which seems to be the temperature. Since it only provided that, I need to clarify that it's in Celsius, and I should let the user know that it’s quite hot. I could offer to provide more details such as humidity or wind, and I can convert that to Fahrenheit, which is 104°F. I need to mention the current temperature but avoid inventing any other details. I'll ask if they want the forecast or more information."},{"type":"summary_text","text":"**Crafting weather response**\n\nI want to keep my message concise and clear. I'll state the current temperature in Florence, Italy, which is 40°C (104°F), and let the user know I don’t have additional details like precipitation or wind. I should offer options for more information, such as today’s forecast, an hourly breakdown, or humidity and wind details. Additionally, I might include a friendly note about extreme heat. I’ll ask if they’d like me to fetch more information or convert units."}]},{"id":"msg_04fcf497c9f5b8760169b2ffaa75ac8195a37db9aea667c071","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"Current temperature in Florence, Italy: 40°C (104°F).\n\nI don't have more details (conditions, wind, humidity) from this query — would you like a forecast, an hourly breakdown, or other details?"}],"role":"assistant"}],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":"high","summary":"detailed"},"safety_identifier":null,"service_tier":"default","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":{"input_tokens":102,"input_tokens_details":{"cached_tokens":0},"output_tokens":428,"output_tokens_details":{"reasoning_tokens":320},"total_tokens":530},"user":null,"metadata":{}},"sequence_number":263} + data: {"type":"response.completed","response":{"id":"resp_060b1ce986da3b18016a3c11ac16088196b02990b9d9ba5934","object":"response","created_at":1782321580,"status":"completed","background":false,"completed_at":1782321588,"content_filters":[{"blocked":false,"source_type":"completion","content_filter_raw":[],"content_filter_results":{"protected_material_code":{"detected":false,"filtered":false},"protected_material_text":{"detected":false,"filtered":false},"hate":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"}},"content_filter_offsets":{"start_offset":0,"end_offset":2664,"check_offset":0}}],"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":null,"max_tool_calls":null,"model":"gpt-5-mini","moderation":null,"output":[{"id":"rs_060b1ce986da3b18016a3c11accd1c81969adf0df726cb650d","type":"reasoning","encrypted_content":"gAAAAABqPBG0nbP6aDzOdfceu-xmnSONzfIr8MKj55PKQ_V9VruEgIz3oyQJmYna13pv7SwOMldPtP5uxypG27IgFqwQ8dkHPqB6rxrYwx0vCHsuPgNtjWjHiJMkKBsz1pv9RIKzJX0PxJTBzhSgzQIW3QG78dy4jNCZri68K8Wr3K-yz7cXH9bzp8XGDwBiF1LwLcUlJCBvTfo5g-Jm9lvLt_NbuUVHjAUosnZ64nRVFi6Z_M6Gp1DN_TvkgWyrKYmQ5bPDwFJGYo1iDTyuUyKOh6A9nZ-SvmMYGberSd3F50HkdyTbGPQb0EgzpW47k53LBAKJPEJoBIHN7whDzLXwVp4X9QZ-Qmtq7WoMXy90n6-Pvt12DQ7phRXyo-qomemYI0sjzk_FyQ98R-d_xe7UMpYPj13N4mzHlXGFRA5zGK-92Z9zcR53slbem_LEZLC9W5ukXgv914esn74PgtwqPfckufTOBDlICKyD5zf3ekcJ93e1I5ReyCrUDwmKY2gHquyU0lg7pVuSCf8Ph-AXJkeSRCOJ8RNFce6r044s75BfL0svBs6knV3nN6VTPzit9ibi-5UZMVbMSUHoiP1CSaB02tObPgWZeOGGKh826SkAqK4WCx3SWiRk68L4h-UvSQYQg0S8rb3dRXYcZ2lnuqp_dVB59DqqGXjErt_v7KoK-oXyD6qbmqX6ec6fZatvo1YjkvakGt0h65mGO13n-4SA1ssPA3W0tcWKvimzHRDClgYfSZ64DHlxJbSP-uEJy9QpY35ARr7L73kvMVbRonBFw0fpnpig_OPtXOCg84FOEgHuXpWIWkI8UZyGzHyfHbs3ajZM9M3G7iFlBDizL6TSJAz4-7zfE0Rhv9_mJiZ3TY6ki1RHrDll8dxuJvpLiLSTC_V-zZQ0tx8qR5aPs7nWja_jjQvS6OwV0Nf5bSi2q3qCUKeCXntk-_2Mh7PAVp315LliJiujZM3MVWW2WKxyQeUdAE9y-tNj9bDJ6QPyU1_HZrFG7Vu3ufge64ay0H3_c1mg4NJQpwLhF0QakvlFCx_PCYz93DTBjllJycGPOAV3oiQ3W3tIZx__4HZJVfztEWhbveyllp1pslKrrHGxvEulYu9XT3fVtwlE4D0GhJj0ybNsGf48OzCJjjMY6Pt3mIHXFiTzrjPm8CczE2jMS5SMro_H-w21OYBeLgMEjSsYnJ4ItMwj7ukEwhEqBS0ymfP-MibU4-EVrhP5migSfv7yHjTXmkfMJSZDTr3XdCcnT9LV5wQv9ucGUbbyOa-3rNMcQw4xjp68R9vrHx5cW_IDGlPkgFguBBxmuR2p2dBfxatNdRdiBSsDCUd2ON84JcqMGyqsbXwvCMRzu1lKe6v0dJFg3hfY3j0l_J2aBeRCyQE0qVuJLxrQJYHzyjJbi-I761pqLFYH7uDkTWdL4ovkybyrb6OhC01fhI9QF17tb6fnWIyXl4ydS6XWrJj6lEwNrG1gZuw0I2FN3s5IxaO4NMNjw_dQEcLP0sGAHrHdrD4qvq4PqXmu7AY7OyYIkVUrcZIE3hhegN5uiBrH5RxyBgn2MuQnb0kOuLAnZyeOdI9QLxfC-FSBXUqB2kdpas1KwvYp3Xdy34SCqiMD_PfWuNC6N92e8s2pou7DYhFVLXRlRhL8Im0MLtpPNeJF2BMjDLx4L_Xo04F7pT3qEg5oO6nhB50qM5FLjz2Ky_9FlAHXOwt_6RRi5lIAHy_rUJf45ooEpZU7HDKeXQu9RydNZ5h6LCY9yLtZKiRp6qwkbEWzVvN-ROl4InmqAjH_pHbe_hl2VVqa9x_EZUiHE-RTEGzothOvSZyL6FEWWhyQ4G9AO5kS0RcXV4DOewbYugJVasc3h3e1X9Amdgn3GGG3lXicLV_aKpDrXZVUUXA4qdGY8cyz-nZX66QyCdVAqbEpFI-c1i0Io5ipgfpsWNBziZ7acVLW0u-Qh4t6hWEQpayHDByVgPGRQeTZk-cz76CwROWpBDvo424pLM7bSYzSYLbatCpnuiJBQteibzCkmX369_5IeeMkhbU7gpKR2KFORJDqUnhAxIk7Yr5QIoBVEb83jRdVBUqB_oyt1gE2cGMOA7cfzkp8PhIwAx4jBfnutkdvPZn7my0kAOhKKyYKhEJ7qolbKjX7D52MikeX2IAmRKUa0ISt5_ehSiyrPmhlV-BYaZWsbYQHzMAld7xMU7rU25Rcee9LkJauLtfNI_YLunTocsLY3jn9qvsrGCldPYJEl5FfUCQNtmKpni94Y7HbEex4cHpy1JHMdxhfKWWIx3_BDBv8-L-EFSGXmhtrDyo6xdqmj1n_Z0MrCrVopSzrsrbG9rW6DtPqYqxQhuzQj3gXdolZ8xZ-ZOuCJrmaF-IRrfKq_d9-QsJ-_ZNAIiaempHU_44QaCxuqt7AJ2QTII8JGhs_PDxnj5pbGRq3kgPpAdSv-lyYF1tOUn3IlpLdc5V5OWwegT0yC5eg2Umo36LKvz4Yaa1Tim8ibhzuQfdat4SaJloG-AvYK3gCMhsxssLSfe5ANt5TfbXwtgKDKpu50ThJWu1p8FJlmwZCEqKUjmms26Yp6s-v6ryYUyx1-fZOMl0yAg2G3J6a6jhObjYWm5OVjXf9tip0K5RTPy_79TQIOEpHkRxTOVah6wYxAikyk_Dfsq03VsQP0MeEQp1LiA8iqFgRIF6rRuqMlNNUHwU71rxx3UD6WkxRqg9mef80E73BS1gBtpzW4bpujaKnwOVd4EAuEfsUOdxvU7Nw4opd3l_k2yPxbcl8XGbkMcKMiCowvALbvBRPCpnLm0mZJ2WfqVGcznsBhGNuM6ewpK7uOU35DWoqiWyrgLFdhR4SmrkIAeRKANTxEn5QJk8rxYkIOpo3-5C-_p-032oQ4yn20YZFFfDE-54Dm8zszGkclLy1xviqnY7CGT2zU4-uZHgrq870DQjUBgnfKZ-Qo-l45OD2m7QbA45Dcg41sUt0O51yk7e9a6iXk-tnX-PNtnfy3gAXZB7hZrfhkAxvBeL0kYzlTJ1WppSriCqiRjNkVHcX3TaiHKs3uR1GbM56D_6O3C6xHBKENONNaj3DdpDsDEDV7WQoUVm4sIJd3BTbiYI2RxLux3CaWzWDnh80tbz8VHQe3dSL6DQh1cg6zeFaTX2VRbfp2c-4RvcZ2y-IXoJnbRSjSScXAW_LRPDpjeMPi0vObvbQ3KVA5o8Lej3x8SDoSE2-B4RNavUZwmRExlIxkM3ob1YPMbQVxWk2lW1iY3dC4RrpPQYAvAXZR_rrGLAp9p-4Zt7TBn7XNxNRZZD3T5Mcoe-syQURYfQJFa8LuNxmxP-p-II8n6wNmmTnFmfafqvvrfVW68ESlw-PFVFwh8HnKRaghyJcg0oqv9fdve8kg1lxldVao3zUlSMcf10MbsUuqUnVhnELuB_IREV6tXLVD1ZcbfHQEN8oOOVPj6ieIz3KbVr_OpuQ6r0Lfx3pkCCwtRJtZxLC8sdN6_Yj9H9gC1s-bxJQqR96JLtjunKBzbRrcqWGiqgrem65WIwFyrLNaNO3BoQ2XHkxZOa-6wvtYb3a6V54KDFGtFCP81_Kq_VrIugbR4rO-J8nRe-MP3TMMdk7gOjnK4XIMQbp_Q1hCoE_9wGrhC-zqDvN00NuzH1tGbwV6BE0x6RXaLYMzJXpRDV60-dLsYNK8u0ertJx3I_qIcWEpr8PiDBTvdsJZI8nMInao-RvW27cWPZBmuQ7A47k2tUY-pis-gXRpF6045zTcBDe4QYBQIhSsGayAJGYDUf3cCJlAyvhuK5wCNGGZdHcUU4kiVNnyryX5ETVVhBXSkfYZJvYsRLCLzZgYgqVnvskmy-wgwA76Jzz_ELdggk7XynLp1gVPk7TwnWQsC4LRpDCCTTsMInk7CuxK23wQbihsAMBn-nb5C950r8O-haQR0X30p1Gnx8eL7e7-drj5dX8IsEwncKbImMzCeSloqdR4E-Lnoc9Nc_bGbLuK8itb-nWajphsjCOcfYIGLB9QpSntmpZeH2APbb4qBaPvCke0a7rV7X58H6j-zSKvU2Esw==","summary":[{"type":"summary_text","text":"**Providing weather update**\n\nThe user asked about the weather in Florence, Italy. After calling the weather tool, I received a response of 40°C. I should keep my reply concise, mentioning that it's quite hot. I could say something like: \"Current temperature in Florence: 40°C (104°F).\" It might be good to add advice about hydration, sun protection, and light clothing, and ask if they'd like additional details like humidity or a forecast. Keeping it clear is key!"},{"type":"summary_text","text":"**Conveying weather advice**\n\nI need to address the current temperature in Florence, Italy, which is 40°C. After converting that to Fahrenheit, it equates to 104°F. I want to stress that it's very hot and suggest precautions like staying hydrated, limiting sun exposure, using sunscreen, and avoiding strenuous activities. I should also ask if the user wants an hourly forecast or tomorrow's weather. I could frame my response like this: \"Current temperature in Florence: 40°C (104°F). It's very hot—stay hydrated!\""},{"type":"summary_text","text":"**Drafting heat safety response**\n\nI want to make sure I address heat safety effectively. The current temperature is 40°C (104°F), which is very hot. I'll provide three key suggestions: stay hydrated, seek shade or air conditioning, and avoid heavy exercise during the midday heat. I'll also include a note about being cautious with vulnerable individuals who might be more affected. To keep it friendly, I could say, \"Would you like more details about wind, precipitation, or an hourly forecast?\" I’ll keep everything concise!"}]},{"id":"msg_060b1ce986da3b18016a3c11b48c9481968f9ce89e269388f3","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"Current temperature in Florence, Italy: 40°C (104°F).\n\nThat’s very hot — suggestions:\n- Stay hydrated and avoid prolonged sun exposure.\n- Seek air conditioning or shade; wear light, loose clothing and sunscreen.\n- Avoid strenuous outdoor activity during peak heat; check on vulnerable people.\n\nWould you like an hourly forecast, tomorrow’s outlook, or heat‑advice for specific activities?"}],"role":"assistant"}],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":null,"effort":"high","summary":"detailed"},"safety_identifier":null,"service_tier":"default","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":{"input_tokens":92,"input_tokens_details":{"cached_tokens":0},"output_tokens":576,"output_tokens_details":{"reasoning_tokens":448},"total_tokens":668},"user":null,"metadata":{}},"sequence_number":387} headers: Content-Type: - text/event-stream; charset=utf-8 status: 200 OK code: 200 - duration: 572.433ms + duration: 364.789834ms diff --git a/providertests/testdata/TestAzureResponsesWithSummaryThinking/azure-gpt-5-mini/thinking.yaml b/providertests/testdata/TestAzureResponsesWithSummaryThinking/azure-gpt-5-mini/thinking.yaml index b16395b61..adeb586db 100644 --- a/providertests/testdata/TestAzureResponsesWithSummaryThinking/azure-gpt-5-mini/thinking.yaml +++ b/providertests/testdata/TestAzureResponsesWithSummaryThinking/azure-gpt-5-mini/thinking.yaml @@ -15,32 +15,28 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://fantasy-playground-resource.openai.azure.com/openai/v1/responses method: POST response: proto: HTTP/2.0 proto_major: 2 proto_minor: 0 - content_length: 5968 + content_length: 5674 body: |- { - "id": "resp_03e04b1d440a87110169b2ff8dceac819697919beb0b86d619", + "id": "resp_01c32cb1aac1c6d7016a3c119a79b0819788515ab536b29dca", "object": "response", - "created_at": 1773338509, + "created_at": 1782321562, "status": "completed", "background": false, - "completed_at": 1773338517, + "completed_at": 1782321568, "content_filters": [ { "blocked": false, "source_type": "prompt", "content_filter_raw": [], "content_filter_results": { - "jailbreak": { - "detected": false, - "filtered": false - }, "hate": { "filtered": false, "severity": "safe" @@ -56,11 +52,15 @@ interactions: "self_harm": { "filtered": false, "severity": "safe" + }, + "jailbreak": { + "detected": false, + "filtered": false } }, "content_filter_offsets": { "start_offset": 0, - "end_offset": 71, + "end_offset": 1260, "check_offset": 0 } }, @@ -69,11 +69,11 @@ interactions: "source_type": "completion", "content_filter_raw": [], "content_filter_results": { - "protected_material_text": { + "protected_material_code": { "detected": false, "filtered": false }, - "protected_material_code": { + "protected_material_text": { "detected": false, "filtered": false }, @@ -96,7 +96,7 @@ interactions: }, "content_filter_offsets": { "start_offset": 0, - "end_offset": 1878, + "end_offset": 467, "check_offset": 0 } } @@ -108,24 +108,25 @@ interactions: "max_output_tokens": null, "max_tool_calls": null, "model": "gpt-5-mini", + "moderation": null, "output": [ { - "id": "rs_03e04b1d440a87110169b2ff91f840819692bf236ebfcc7f66", + "id": "rs_01c32cb1aac1c6d7016a3c119b346c8197b37f47689a11a452", "type": "reasoning", - "encrypted_content": "gAAAAABpsv-VXwrkiA2LGZS81tv6gXmlZFltBSfylmK7DeO9bnDg43lIoU7T_Dmcxg4SHjIsSOAt1-QnNyApcix2-vjt8aim5NX85sGG-DOFbsikMl-eSyXc4B98LXjP9nS0XxNAakLhhBMObzmIFlf7CwMGSyn3z9VT9Z0oizw6BP5TiEVXSJKZcnzPW4CDfVlGzrBk60NnS2ugDpkWUd6krcc_vU_CudDFDAbFVs4HGEGJDSAXnms0XEWemEnkbjL1dLhesjW-MX-W4uQEGXNJqcVoaC0z0LPu6G7T9SdKEZbrNI5GQu-bL67pjdFfddv6VrrSWovs7-D0X6lr5ZAjuDkqPLQo1uyJDAoOUgx-Z2z7tACHEkG7jqCenTJ3fwQe88KdDcoJoZ59s6VqL-msbnAZpiTKdMyM0wR5jQSXwtaVp9yhNgqjRWDW-RlJc7RbY_4x4j5xL3p1vyF1ioFjo2z7u5Lb9tsBLHOXRDpb9BFGXQbxOmP4VpvMN_93CcszyIRd6mPp3taVpnJPlLTSVW4uBXfGX2RKLAcT0DsYicB3O0sjjfWpGLQuEvmCWSrCHBwYAy-PGDPAQgcsGjsE9alwXOhHXONyq5BkiIs4cQ3ZWCibDTqg2CEVsCuXZPHL50SjuQOFRmFZkXRbnH8xXTAhDNGqFsISgHCeSV6EPEUL72n1SPeJPdxHc1x1ZZL7HdqHMQUfPnE-eMW4IKapOU3MJ5rxXui6ye5aYBHtRFVJgv6xf-lYpWQXLjJWqulelZPST5gLeAl9NPcPwpz3frgoWH9GpB6glNgavPVWQ2cJwYTv85gJ0I3kLATYBY5LRegYAqBvKGBE0ZDR55neZwn83uckMcEh37diCV3SbPFQMUbxw9gkFVobB3jC3r0OetBTXc0rBcO1bN2s1pRf_493hP1uG4r1Q40_kJubyq6KjaJm_aOl6-X9aGVV6VmTmcvSPzrfga7_sXoS23Qxgo5qfyqj6ERnsSUHvqofb7XRUZDbpMSYUyQ8MonZSYs8OuZT7ZoFI0F2WNqZEOBfbYCMeCimlPYmdwgb_3LJMf5ivUbuRq9uG94TrZXxLG2MprIvNHJAxVVt3eRHOzMIo0kgwRYtHd-MdIyeo6nUmv_JPZIRJvnJ5w4GRCvcX9V6j2Yq2CV39NM7QFhSkoSTDz2dKvXwQY3gzhCQM651-mINb86qiL3L-vVtGzZe2ZL5z6VBDON-QOiQyZV7fLH8S5ECKgoK_X81fEjxBAuRkBZGAB-HiuIA6DV_B2O_zE-z09a0ObdBztRd68qMMBNQEuTGZx07C1nVLNZPKro-qT_mx9IbAUwQClw2QHhT6vWIvuWdFWdod44rFDtv-zTImkWtMxbQOjc7dWSPZN6dN-7TCQtVR0DIPl0aouEtgRu3eSWKeHOjTUKBa8D0izB2UQYGHpkyL5-FlTc7NplZRbWMjBDsio-63EV4a_ZISrt2AtacO7p1Tk_H-7atZdWYi1Y0aBg8qf1QWtKzdef-EdgkGPcmUr4rqkH67LrOiNncq-tiqiZhRQ1lHduosIB2dN-Of5NFPe3N5oRD0cSlwhMWJjgC3zkA7ECx8kzKjFsJNPFSqh738KQRxwpaZbqLBIc_FA5WzgSByt_7mLpNKTqQHss_RtU2YMe2JH0VO8V7Waa_mpqELoHcMjHfaIKci-srsOtheWV1x8VSE38ouhV16xaE5WieXL5vtrUJGjdKLsKbm7wYrSnIuU9nr_Ms9nGx5dqdEguJkjKbuNkrZFuUk_Ld5s0Dyg9loLcagD_rRJ8wswmH9xRY-4P1zNZMFKwULj92Xw==", + "encrypted_content": "gAAAAABqPBGg_398aCndRHh9AcP5uDVN4oXAq3utyyqzTqH51hOGXd3gfi95QM5K8Arn1QaF5woH3D58bUJyMmDWiU0ntSQb8kE1iiVegiTYGkHYMpUhpTbuZv1COOhjHhJkK07TJIKm8_uAswJdJYFeSfEAi1vBiBODUjmnzEhjQqNP_O4fpxZxrJG2INLa3kDrfOUyYx9hRejMMYDxSDroU9o7f13nF5mYENSAnJai6ZEMrDNGu3Ph93W2FEyb8PZp3MyrXBN0eFW9i3aZvzuqkRr-lwdsm-QRsITZDSNOjYzXjqTSB4rfWtgTE674NAsz60ArndPslDRFoOUEz2SJgWEsi4mVPvgXR-f72007WfE3sd_ac8IJn3P64QnGtapgKgjGdWJMupQrY80HsgNOUgxKn1kS-iQ5wz42CztYO9t3HvCYNOm1AtMRildfrRB3-4n8JzK5k4ah-SnNZoUoK5N5jCCU9dLocGUHFqaGadr5kcFDdy4__otSDyz-02p6Ay9yydWJ9zHEL4yPhzP1clCkih_deaGeDjnWNPQw0jsoVr1QrSL7FMemmZt8MLoRn7s0ZJM0UCQdzIKl4diLdZTPhGZrAFZttMij6ocYQNFXoEFi9NBWqUiacRsDInvWe3vimvnKOnPD2iYPzW_YE6QPBfz5nHH5GPEm0rsSbEs2Ht013zpEwTDHfa21P1rEaE6NzSTPLT5_92hW1tBZGUIdom0ZlDDBNmoBfy536la6qJn6Ty7eQtq1Iqow4kBbOAG4VRVv3Lrc3DD39gBIij6aqxtRL1-SuI0pQA1bgFHdJjav0TI-d1R7ZGFIfSFh6xvCqrWccHWelzjdjbg6NEZegGNXzQCTEZ8xzwYTUifgPWwAyLD_ErbDXlVK9HXtG9Tufp-HI7AiD8WYsNJrGxvWEHRqwuUaGQMDOoLttZZ3vArk0rfkD_MNrcw0IjN0QzLU9f3PcOjP6LvEF8F8lCZVvtA2tuAy7od_XOnvpkomc9QWaT2bsp7j9XCtvYuR3rfY66i3CAi6V00-MU4ADAmgGjDVv4wN4y8v-gsqhnrKyIqcdYeoL2MtwV4EZnZwUlev14wVRMfOb0LApVelS3kE5cTAWRFrMhGiRg5-S4MqznC8U-Xz1fMsuWf2Bcn-zYhpGPMzLWlniJ1dWQCG1KZ0K-6b0m8P5riTPGjEvqov-K2gLu_6yruuALcN1lC3ONMYQtWr74K4NnnLSSPaOg9GZKOspQQNwLj4aFuUfEZKkwTjBuBHU5-iKtPapLjQJTax6nDlAQnBpEj_WABGxRbzI7Daho5JK7o_lsLgZfnQkOvOHHZNrSxKWbC0i0jbwVMT0hn1i7KVQwe-0RTKHonnhC3Vnqocu52MwE4n4hQIH5qGL2mswQXVCv9uVs-RWZrJ05_xaJqESb11KMIen8RZU41-wg_xn6megkBLJP4FmiQuhklbYcG1UQyUQuWiojdkCJ3abQgM7TOzuamyeSaICz22fCDyzw-1hAs-BTAyxA42Eh4=", "summary": [ { "type": "summary_text", - "text": "**Fetching weather for Florence**\n\nThe user is asking for the weather in Florence, Italy. I see that I can use the functions.weather tool, which takes a location string. I could use multi_tool_use.parallel, but since I just need one tool, it makes more sense to call functions.weather directly. The tool expects a JSON format with the location specified, so I'll structure it as {\"location\":\"Florence, Italy\"}. Now, I\u2019ll go ahead and call this function to get the weather." + "text": "**Retrieving Florence weather**\n\nThe user wants to know the weather in Florence, Italy. To get this information, I should use the weather function tool. It sounds straightforward, as I only need to call this tool once, so I won\u2019t need the multi-tool wrapper. I\u2019ll use the functions.weather with the specified location. After that, I'll return the results in the commentary channel. Let's proceed with that call for the weather!" } ] }, { - "id": "fc_03e04b1d440a87110169b2ff9482d08196b9611b538400d9b0", + "id": "fc_01c32cb1aac1c6d7016a3c11a02aa081978493f95d5da73116", "type": "function_call", "status": "completed", "arguments": "{\"location\":\"Florence, Italy\"}", - "call_id": "call_58ZCzgYxpwaBCsl2an3OWjkQ", + "call_id": "call_vV0VlY1cmzQxHRify97kgtE0", "name": "weather" } ], @@ -133,8 +134,9 @@ interactions: "presence_penalty": 0.0, "previous_response_id": null, "prompt_cache_key": null, - "prompt_cache_retention": null, + "prompt_cache_retention": "in_memory", "reasoning": { + "context": null, "effort": "high", "summary": "detailed" }, @@ -173,15 +175,15 @@ interactions: "top_p": 1.0, "truncation": "disabled", "usage": { - "input_tokens": 66, + "input_tokens": 63, "input_tokens_details": { "cached_tokens": 0 }, - "output_tokens": 171, + "output_tokens": 113, "output_tokens_details": { - "reasoning_tokens": 128 + "reasoning_tokens": 64 }, - "total_tokens": 237 + "total_tokens": 176 }, "user": null, "metadata": {} @@ -191,37 +193,37 @@ interactions: - application/json status: 200 OK code: 200 - duration: 8.094597125s + duration: 6.324638333s - id: 1 request: proto: HTTP/1.1 proto_major: 1 proto_minor: 1 - content_length: 791 + content_length: 779 host: "" - body: '{"store":false,"include":["reasoning.encrypted_content"],"input":[{"content":"You are a helpful assistant","role":"developer"},{"content":[{"text":"What''s the weather in Florence, Italy?","type":"input_text"}],"role":"user"},{"arguments":"\"{\\\"location\\\":\\\"Florence, Italy\\\"}\"","call_id":"call_58ZCzgYxpwaBCsl2an3OWjkQ","name":"weather","type":"function_call"},{"call_id":"call_58ZCzgYxpwaBCsl2an3OWjkQ","output":"40 C","type":"function_call_output"}],"model":"gpt-5-mini","reasoning":{"effort":"high","summary":"auto"},"tool_choice":"auto","tools":[{"strict":false,"parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"name":"weather","description":"Get weather information for a location","type":"function"}]}' + body: '{"store":false,"include":["reasoning.encrypted_content"],"input":[{"content":"You are a helpful assistant","role":"developer"},{"content":[{"text":"What''s the weather in Florence, Italy?","type":"input_text"}],"role":"user"},{"arguments":"{\"location\":\"Florence, Italy\"}","call_id":"call_vV0VlY1cmzQxHRify97kgtE0","name":"weather","type":"function_call"},{"call_id":"call_vV0VlY1cmzQxHRify97kgtE0","output":"40 C","type":"function_call_output"}],"model":"gpt-5-mini","reasoning":{"effort":"high","summary":"auto"},"tool_choice":"auto","tools":[{"strict":false,"parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"name":"weather","description":"Get weather information for a location","type":"function"}]}' headers: Accept: - application/json Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://fantasy-playground-resource.openai.azure.com/openai/v1/responses method: POST response: proto: HTTP/2.0 proto_major: 2 proto_minor: 0 - content_length: 7839 + content_length: 6854 body: |- { - "id": "resp_03e04b1d440a87110169b2ff95e7e881968351190f833d9929", + "id": "resp_054c615229b73091016a3c11a0ce208194a5b96d79440e2091", "object": "response", - "created_at": 1773338517, + "created_at": 1782321568, "status": "completed", "background": false, - "completed_at": 1773338527, + "completed_at": 1782321576, "content_filters": [ { "blocked": false, @@ -255,7 +257,7 @@ interactions: }, "content_filter_offsets": { "start_offset": 0, - "end_offset": 3357, + "end_offset": 1383, "check_offset": 0 } } @@ -267,24 +269,25 @@ interactions: "max_output_tokens": null, "max_tool_calls": null, "model": "gpt-5-mini", + "moderation": null, "output": [ { - "id": "rs_03e04b1d440a87110169b2ff9728608196a7633ffa976a82d9", + "id": "rs_054c615229b73091016a3c11a182688194bc96f4cfffa1dd75", "type": "reasoning", - "encrypted_content": "gAAAAABpsv-fpb3rS7-bQl4c_t4hmXUOwnwmGym7XB5QpPIRXiNgCXQVpiKPvvmqEGMhzrlTx0S1pxIn8cuyWLmsQnI76mv63_LRfNGBZekDfsfFDa2ZNTGW8WiWq3LMbP3CZz24Ld9x0rp83M90cKY4tWrWERKfsii6bX4b41p42leowZQMa9QAbuJH2z897shfIVbmwLsG8vUuD0OsrCcLfQcqHoTQJBE0Xme2H9o79idNBOf5mbrG8JhF9OxUHtwjH6LRuubx3fFtyfDAS53sx5oKtYZHbQoG0YMbD1oSqlWgO9DEqApKNb848RvGoXOp1_Yu2Pq4hLNBaH-I2VfR_3HEWupf5GJ1t85Sc3Ag69Ix_RcL2x46y1fpCaSrxw1dPZ0XlPX55cOVErQ4-3hNc3EdsQ4Qi5XWT-LYvophKrSzd02pFWYj4T86KiHX6ROteeGTxDkRZtf7v-3lO-QC1uNlsE5lHuPYsunES_ZXoyCc9n_mKrKxQlXyjVONQavgkpZz3BLNHQSFWPJ4ajip3aYHDjzdHtRp5Z3g7AWPC9_isbZ9MHx3IoR9gcnAEjYmo-yIJffbSEnPVyBCgiGpX9dG3KFue11g-uM9wzkQ_PvLnSeNCiXrP1JXEukQRJic9gQ7KvmRCzjNmGcbQnCvDt6iFmv9gut9HEPEj5DqLDnA5ntX2u_0vCJtCUGeL0iT0cChchvrLlA48XWwgYCmH3UyifNa7gh7NQ2Vm3vyMFcOmcWDFUYSYkTytc33Xr48yzPZKjxmkRtsxJqpF4h8v3z8N3hfRRq-fDsQZsmKW8soI03yuAW1bsVvabnEmdpu8Olk88HCD4NdBeEKHqA4-FiKYnXd6-KT2KZVvMejaCMPYYYE3FsTXpjMlBihDvl2Ajclc_izAD0KKhaGlHQ6VEzuVBDbxvleoOYsDGQwCI9bZXcneqeSSUxUOotJOHyt8gGISVuWkKuM8hLGMqn2gIOyuQERcwWwj1WkxwAaNSNdWszbwlmpSjFSdc9K6knWQna5R2DqlEh9-WQcHSxNtsWo8rGPWb3PbbuQMvaPfD1zVntCfTO3UssmXwwIWwnkMdgZylRDhaQqIln4Xsgx4DYhiK5eYN4Es9bXEXugi5cOq0OEOVj_A9C5-Aj438k9luAAnm09q1xZOIxI5amDblv80zleGijt1r2qsLpdsGCejr44GDFZ-S1Py9pWURzDQ7kfXsqv18Sw1TjsrewP2GwRmJQ4aYSpbsjZRUa82xoHb7kxdLz9j27Fyxi6I9HmnZf-bCcMzy7f8WzGmmCWgGQDRpE5iy7fMxTI0hML0sZpfxAxRWwFtMp7Emr4m8zjDzCgLFjp3S47wRtGJHft_JaWkBXbpjkiJknz0Wo_72Tshqk64PopsGyYNqU_sk2wBL98aHgL-tsrd7XJ4Xjzm0padS9iJ0NqkIX4pQyZ8cXyZa1kXoMb1_JWK2DEJSj1o34iZbxnKPKhgt9tM4yHJrmSX5wgbmeTYjPQVkmx5yiN8FygqyFaeSsCulS1HAfcwoQs59QWcj-vJS_a6ffpYJ336RMpodQ2PgloXTEdJzNvoSWEeZOPML7WKQsGHqjVfAzeENW9Psd2T3IuMjgfoE3xM8opHGd7PFIIS-5FPaWzE16vFWXT9vJDeZaeCOuTetYJjtxs-qaj5uBfQ-OknsSLposZcyYty__eagFdxfPKR_iFcy_AdBPp1mufM71OrN4CyRdQ2QCnPcLFNVzlXVR6LRKwBNCOkUq-gBei474FLheWLh0psuaUy9rxxo8y_hLjxn0_Z0LwAbdYKF2Siz9E18W8YmjGVD9iD1lcraodYs6Xl2D4J2jFKL4dmopw0P9-U143P46HXplpTANifxEGW_RnKG9HpgpUfv6Gp9vPPrL-GeBW-51JDAq-y0BCD0e4SFEHWSDT7b16c5BQpYul2K3XviYHGxjGAI8rWNS03Lac96eAmzuCn8KzqBvOHJcFyZ54PfcEitmhCzOZ03UXEQwduMbRnCCW1Gp-WZGloWpTxbJNQYpLH01nqSJn86wzsVj-g0DLQWSsC1pcOIh_wsslvp15HRqLD3fUtEFc_ls3BDciXoIkNG8O0wZ9HVQJcLm1k08hYvU-5W7X_LW8-cOa3-kBaW6oU0yqk9sNrzl-rAdl90U2j0L0oQF3lufR6A6K8ZJf67MzAWpXcazPOVN58gVu9ZvfR_KbraKjyTkIsQQmFBecWoptOMbxgD_uCOhsHtFzeS5SVFfg77Woxo1BFLqy2PUbw-IpDsTJ4ssJ241Ycyjg1KY8XDSl24AiyCaw70QIksSrcc__dAIUaE-lbHQlQRwRCFu3BHKgHHbwkgFbH2ar9xo_dI7v-uriY0gVxvzwVrnCnKKA6phKGJZs9nVb9fLupHBm5IiueakkoIWTpsGcl6nfZCnSAy3d1SpZJZ9OGHhR0yD_8uP6RvVeT3B5nebw8ko-LF6CWI9Wlb_T0m0yuzgwXqliYlHEVqT0u3IDFbpQ4yAUpIa9PFYatuYX6IEr_a5pfUbrnW63Z-1H3iz7iKJdDKdvrPbje1mvf70ZmRv7esI6BphFj2VRH9A4yJukCx5Kv_w4OYNfk3D7KCQ858p5V_JcUdVGxpOXP_s1PCJe7eZtpdywewNfcH_25mdK70IkAOEPSFsvA9tVmR0KJzYRycs5Nqpsd111HGylZIdrRSAiuxrBc0OiZP7dVsxBx6MeQhG7j-hUh0nk9iMenbyY4yA45R4jalCvR6yjuvJJ6Dgx6E1ePqFEfnISHPZrYTPXjqZtLZUnyD3zKbpF_kxpMlxA930Gi4-_qPNDtQm00TwraPvXkWTmTFHLtxGEh3D_btbymaRxRPkIfwi0myHkJNS-tsa3CUd4QfzvOAYMB5rB-K1dKSr38j_m4l0ZnhfZ7fCSHYgDcSZUWye5f2f3khFuPG5_xrGz_h0CIzugDxTCZI3BNUYQeO7u2e1XeovICoUspkat_BVE-pP2Hm6OSX2ZUNiVemI00bPoxjpxPhriAgzjAlxwz-hPbnc8cAkm6PZNMH4HeNfxJdeYFrtmES86AGW9lYCY8oxIjFsXXnxFhDDFtal1-5bnCSpi1EnsGmP5WmbDKUkj9vqWi1NUk0WrwnjsefvnOGwkvneoP8Yp6Dn4nLPQJl_e-L-cbjNInGf3FS2vdFtNEOMm7VbI-J4qIBnk3UQoTL8jCxct7TQvSEkFwZE-HO-oSFz03KPyWk4X2j2-A4xfUnGCuQOZOSyvIhh6BcJBsU1OwhqC3G0CZMwAj1-hWBvb3QPg00e-zqAADusg2ggkekD-fbopAG8x4rejhRBvrob2IA6Oroig69H1_WnpLuPHgJ9-TYP25iler8R66zuHkX60LKNN-D6B-ff6ymmQ_kF1zVGg2ufjfQ5xlkR302PCLKrb8IhVe5vBsTJEWERR2WehtdCvoqySNgh3u7C2t2thPV4mHN0xA5_HzOk6Zz7AqMLnnW-0m1-eKxWYDic=", + "encrypted_content": "gAAAAABqPBGohsoHj6Zrlp56c71sN9MnDxwsDgoFUaW7_zgzbtk8OaW_JdSD4OuQASET_vZXPrQWsDnwWCMLXmTS9evgHL-BbqmDGuDoDluZQ9o7txdim74dNH9bOXZQ-qeaoQwq5VrVw4gOM9MhNpjta2m8GuaGI4_acw-jq-LA2lciyPTkAEWd1LPRK7p08AQa05FLB2SHY-ta9wPts_jY_VcTQ0GkLCj2GND21klplPCRwnDuQBAA31UUdEXrWCAhbQT-KCh3YHGT7PJQCCV2FT55eijoe1EJ6-6FJ6dQXGesRpR1GTfYMvXu1uKg8XFhrK5a07wN5aPi0EgHHoTveG9PT1wWmTjUa8f4GzHVsCLf3dCh8HbTQuuSxYmmwMMRKy-mk33v8vZ0YGVe0L0vpphoHYosE0VRmOdg63l7LeDdMydJ-ksLQguVU_6OR6LBec1YzshGJbauDS7GZnorFwdo0vaWYvfnnbyBn-SUOnePmXYGX9wFxwC70pUGIdswT27couaaY3dyNMiLweZ6aH3T5PWxEClVgBbg9WU56SATEBkpPiKkKmo3IrJMZmueZiShYQgGzTxyHA3Zf-a-ZS2Z7MO2JMyGygQKhvgX5Kce4RLVrHc3gqtAQoAzCDEE5McWkPPgYt_Ts2bp8V8-Thzg4P77R6TSDF8ijaIffzspwuiR7ii1oKnJQGfHIMftO4QVFr99-k57IsNr8wBtz0RyuNapWwdhmWp7zHmxqoFgYTwfQsI0EL_Mkg1l0TsCvNmolMK_39A7FCfDxTK12shsHBEg_nfA0RsjDyP0scmm_bYTKnJdZ5-EXlsXnCpSknTW1osc4jMoka-yUzn586Ea7bN_KnES7cErhWrQhrzg0sdJRchyQjJZhVNkasIXbHxnxXPrfFfKzG7GTTaMQQTSjoiIb0ZY5HVLIoHJ6GcfcuXcTzwPiTucTbj_BzWdD4S7BMBgSbxJlEdKGO5MPmix67U5Y_0tu7NpjLCuGqaYwYy_SMcZUYQZXkcNWGHFCbvpXpPvkKH0p7CnxjTd8KW3g39S2lPQfcLFzN7XLTvI4AwkaHKV-RA7zOyx5Mi52a-nPRjRG2wSUVR4Eq-FblmLdolcH1UtxbCzyAO0O2P3EDPk8NAR4zwnXJQECwnw0AvCSsjmct_JD7excBLD8O1-uOG18GVmdFbND_1_PtP5EJnQH45nGtU86pDQftWVK_XSLJuTExiV0aQwW1EZtqkcbrOOl58LT7575kRE6USfo5pofx5UQKBoHjHhP3mTZb56Z4Zl59pSGunT58RxZRPhM_jicgjUbP3h7pecHVzGr_w1E9hJKKr8s1pwmZ0XKb1EQ5fwpnGssXtDYEGN1_-13wVDWTX8oQaEYKKfD0ULtFr9zbnc0xqJuj0z9rVNZUj2m4rkyhrR7qVJDzctuUPRMSFksuw0Svquq7B8oZi3lgjhs5-myxPN1jsd29cR_a6jm_Vy8gzeGM8y6wME9CX2uNdXOf6QiryB0Z7Qjvu91yxz_XHNGr24U8-wWtXIbp-WQcQwRebcMhNuZo6xrBe2Bq87nVIfR3JXRjOGwlXu0nGgHI4oUBVbAkeauZKZbXmhFJ-RBzAssKWiQzvDkCXfnIFYn4rYN2UX_UNY3UWgwQnIb0VrOBIg2TgUletnhyP4rca5esZ53iAPR_1NTm8tPffVxWRG8myfUZkjtsvjDE2qY5_f2JcT0kw70MQEEi_MOX2oWf-G0Xwq39tJ-9tdcG42zV-wrGJYEYL6vkS1YHhFfrUAQZvs7jT1xM-xqfQ84r1oGWKezN9taEmTc2KM8C4AEr1YiRU2ONlGWd9P0IkK2_-Oa9c7OL6xuoaaU6587C0ms_FJqUsPwMyWKWRW-M5HbSv_5_QxizHTyVJiFSxAXQvz9ZxH-nT9Fmc3uNaqzMnlgXZbdniYALSxFTdYQloIyF_-v2bYlb8BnOIVItGp3K9tyvT9Qmr-pvnuiBqjRnI0DI9BCSbSNQi0oF8DRX0sHt0IkHCsANupuB-Ivub_lJ2M6ZKKKITW61zwR8RfMD0FH1ERV06K0tyOrN0W0GyEQ_wxcjSOAF99ZZlhj5llU4yi2KRRoSGRa_9P9ay2ja6Yd_DLpkHdaG2bS9tvIOiwioIIUi45sCHqlLAwFH4Qr-RgKjK8DlC6kCw-M2aFfzb996bNg_3oJ_t5u0d2FgbAA1qFoLyVMBzFmcYnP-FBK0CKAOdxFGdBqMLJqAMSchwEeMTFaEvqxki9q5SE4-7YMjN1_xgTQeqQ0w0aBz63rZtZY1urW2fsb1iMnN71pr_1zRaVDAmySqTA-gC2-LC6DgR0WN23okAyUOj7cPqDakFI7xj6h_MOk4Ebj2F8GavC4OG97gX-_Mbe0a99YJze_XM5Siy0iAhljSXvIyyC-8AAkQhO4LrZd_4I2o9jCDkp2r53xM4WC1fcGmnqNky7sdAhO-0XQ0DnOwfFSURkXGH74hWmxEatVJ5_q27XMgL9Y72_t0jS85FEw5o6u872qmzqcI5dvqFfSHAy65TNMHIKDqDVJtr-Fd-W92GZHv0v", "summary": [ { "type": "summary_text", - "text": "**Reporting Florence weather**\n\nThe tool returned \"40 C,\" which is pretty hot! I need to provide the user with the current weather in Florence, Italy, but I realize it only gives the temperature. So, I should clarify that it's 40\u00b0C right now. It's extremely hot, and I want to remind the user to stay hydrated and seek shade. I'll keep the response concise and ask if they\u2019d like more details about the forecast or hourly conditions." + "text": "**Providing weather details**\n\nThe user asked about the weather in Florence, Italy. I got the result of 40\u00b0C, which is 104\u00b0F. I'll keep my response concise and state, \"Current temperature in Florence, Italy: 40\u00b0C (104\u00b0F). It's really hot.\" Although I\u2019m tempted to suggest staying hydrated, the user didn\u2019t ask for advice. I could also ask if they\u2019d like an hourly forecast or additional details like humidity and wind, but I\u2019ll keep it simple while providing essential information." }, { "type": "summary_text", - "text": "**Summarizing Florence weather info**\n\nI want to provide a comprehensive yet concise update on the weather in Florence, Italy. I\u2019ll tell the user the current temperature is 40\u00b0C (104\u00b0F), along with safety tips: stay hydrated, take breaks in the shade or air conditioning, and wear light clothing and sunscreen. I might also ask if they want a detailed forecast or hourly updates. I need to avoid claiming specifics about weather conditions since the tool didn\u2019t provide that data." + "text": "**Converting temperature**\n\nI need to convert 40\u00b0C to Fahrenheit. The calculation is straightforward: (40 * 9/5) + 32 = 104\u00b0F. That seems right! I should also include the degree symbol for clarity. However, the system has noted that I should avoid heavy formatting, so I'll just keep it in plain text. After confirming the numeric conversion is accurate, I can move on to create the final response. It looks good to go!" } ] }, { - "id": "msg_03e04b1d440a87110169b2ff9ed2a8819688f2b28a2cdba9a8", + "id": "msg_054c615229b73091016a3c11a80d108194a949aaa4dbcc4b82", "type": "message", "status": "completed", "content": [ @@ -292,7 +295,7 @@ interactions: "type": "output_text", "annotations": [], "logprobs": [], - "text": "Current temperature in Florence, Italy: 40\u00b0C (104\u00b0F).\n\nThat\u2019s very hot \u2014 stay hydrated, avoid strenuous outdoor activity in the midday sun, seek shade or air conditioning, wear light clothing and sunscreen. Would you like a full forecast (conditions, humidity, wind) or an hourly outlook?" + "text": "Current temperature in Florence, Italy: 40\u00b0C (104\u00b0F). That's very hot \u2014 stay hydrated and avoid prolonged sun exposure. Would you like humidity, wind, an hourly forecast, or a multi-day outlook?" } ], "role": "assistant" @@ -302,8 +305,9 @@ interactions: "presence_penalty": 0.0, "previous_response_id": null, "prompt_cache_key": null, - "prompt_cache_retention": null, + "prompt_cache_retention": "in_memory", "reasoning": { + "context": null, "effort": "high", "summary": "detailed" }, @@ -342,15 +346,15 @@ interactions: "top_p": 1.0, "truncation": "disabled", "usage": { - "input_tokens": 248, + "input_tokens": 92, "input_tokens_details": { "cached_tokens": 0 }, - "output_tokens": 489, + "output_tokens": 322, "output_tokens_details": { - "reasoning_tokens": 384 + "reasoning_tokens": 256 }, - "total_tokens": 737 + "total_tokens": 414 }, "user": null, "metadata": {} @@ -360,4 +364,4 @@ interactions: - application/json status: 200 OK code: 200 - duration: 9.999820417s + duration: 7.734558083s diff --git a/providertests/testdata/TestAzureThinking/azure-gpt-5-mini/thinking-streaming.yaml b/providertests/testdata/TestAzureThinking/azure-gpt-5-mini/thinking-streaming.yaml index 307021c8e..e5e104765 100644 --- a/providertests/testdata/TestAzureThinking/azure-gpt-5-mini/thinking-streaming.yaml +++ b/providertests/testdata/TestAzureThinking/azure-gpt-5-mini/thinking-streaming.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://fantasy-playground-resource.openai.azure.com/openai/v1/chat/completions method: POST response: @@ -26,27 +26,27 @@ interactions: body: |+ data: {"choices":[],"created":0,"id":"","model":"","object":"","prompt_filter_results":[{"prompt_index":0,"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"jailbreak":{"detected":false,"filtered":false},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}}}]} - data: {"choices":[{"content_filter_results":{},"delta":{"content":null,"refusal":null,"role":"assistant","tool_calls":[{"function":{"arguments":"","name":"weather"},"id":"call_ftDSBiJDv090pGPsMwdpJCtX","index":0,"type":"function"}]},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338592,"id":"chatcmpl-DIefIEkVhFvGxEin3iF87MkAmNHJ9","model":"gpt-5-mini-2025-08-07","obfuscation":"Bd5X0KXpyjlWz","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":null,"refusal":null,"role":"assistant","tool_calls":[{"function":{"arguments":"","name":"weather"},"id":"call_DA9IQQ5D4VQYL6AOoVPUb3Kg","index":0,"type":"function"}]},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321642,"id":"chatcmpl-DuLZCiguvglQmro4uwCHRifLpSYLN","model":"gpt-5-mini-2025-08-07","obfuscation":"dp6Z","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"tool_calls":[{"function":{"arguments":"{\""},"index":0}]},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338592,"id":"chatcmpl-DIefIEkVhFvGxEin3iF87MkAmNHJ9","model":"gpt-5-mini-2025-08-07","obfuscation":"csp","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"tool_calls":[{"function":{"arguments":"{\""},"index":0}]},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321642,"id":"chatcmpl-DuLZCiguvglQmro4uwCHRifLpSYLN","model":"gpt-5-mini-2025-08-07","obfuscation":"dI7JOn27ab","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"tool_calls":[{"function":{"arguments":"location"},"index":0}]},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338592,"id":"chatcmpl-DIefIEkVhFvGxEin3iF87MkAmNHJ9","model":"gpt-5-mini-2025-08-07","obfuscation":"O0PONDnbp4c5Hc","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"tool_calls":[{"function":{"arguments":"location"},"index":0}]},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321642,"id":"chatcmpl-DuLZCiguvglQmro4uwCHRifLpSYLN","model":"gpt-5-mini-2025-08-07","obfuscation":"pu2e2","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"tool_calls":[{"function":{"arguments":"\":\""},"index":0}]},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338592,"id":"chatcmpl-DIefIEkVhFvGxEin3iF87MkAmNHJ9","model":"gpt-5-mini-2025-08-07","obfuscation":"J","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"tool_calls":[{"function":{"arguments":"\":\""},"index":0}]},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321642,"id":"chatcmpl-DuLZCiguvglQmro4uwCHRifLpSYLN","model":"gpt-5-mini-2025-08-07","obfuscation":"cW6WjiJF","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"tool_calls":[{"function":{"arguments":"Flor"},"index":0}]},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338592,"id":"chatcmpl-DIefIEkVhFvGxEin3iF87MkAmNHJ9","model":"gpt-5-mini-2025-08-07","obfuscation":"cI","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"tool_calls":[{"function":{"arguments":"Flor"},"index":0}]},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321642,"id":"chatcmpl-DuLZCiguvglQmro4uwCHRifLpSYLN","model":"gpt-5-mini-2025-08-07","obfuscation":"fly477nZe","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"tool_calls":[{"function":{"arguments":"ence"},"index":0}]},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338592,"id":"chatcmpl-DIefIEkVhFvGxEin3iF87MkAmNHJ9","model":"gpt-5-mini-2025-08-07","obfuscation":"Qc","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"tool_calls":[{"function":{"arguments":"ence"},"index":0}]},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321642,"id":"chatcmpl-DuLZCiguvglQmro4uwCHRifLpSYLN","model":"gpt-5-mini-2025-08-07","obfuscation":"8s7s5XYtc","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"tool_calls":[{"function":{"arguments":","},"index":0}]},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338592,"id":"chatcmpl-DIefIEkVhFvGxEin3iF87MkAmNHJ9","model":"gpt-5-mini-2025-08-07","obfuscation":"HN6gr","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"tool_calls":[{"function":{"arguments":","},"index":0}]},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321642,"id":"chatcmpl-DuLZCiguvglQmro4uwCHRifLpSYLN","model":"gpt-5-mini-2025-08-07","obfuscation":"Zcgp7RcJClMa","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"tool_calls":[{"function":{"arguments":" Italy"},"index":0}]},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338592,"id":"chatcmpl-DIefIEkVhFvGxEin3iF87MkAmNHJ9","model":"gpt-5-mini-2025-08-07","obfuscation":"","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"tool_calls":[{"function":{"arguments":" Italy"},"index":0}]},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321642,"id":"chatcmpl-DuLZCiguvglQmro4uwCHRifLpSYLN","model":"gpt-5-mini-2025-08-07","obfuscation":"waP2dYJ","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"tool_calls":[{"function":{"arguments":"\"}"},"index":0}]},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338592,"id":"chatcmpl-DIefIEkVhFvGxEin3iF87MkAmNHJ9","model":"gpt-5-mini-2025-08-07","obfuscation":"bPJ","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"tool_calls":[{"function":{"arguments":"\"}"},"index":0}]},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321642,"id":"chatcmpl-DuLZCiguvglQmro4uwCHRifLpSYLN","model":"gpt-5-mini-2025-08-07","obfuscation":"eYmiaJD1Ds","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{},"finish_reason":"tool_calls","index":0,"logprobs":null}],"created":1773338592,"id":"chatcmpl-DIefIEkVhFvGxEin3iF87MkAmNHJ9","model":"gpt-5-mini-2025-08-07","obfuscation":"7QRm","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{},"finish_reason":"tool_calls","index":0,"logprobs":null}],"created":1782321642,"id":"chatcmpl-DuLZCiguvglQmro4uwCHRifLpSYLN","model":"gpt-5-mini-2025-08-07","obfuscation":"xA4BnVFW5ZY","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[],"created":1773338592,"id":"chatcmpl-DIefIEkVhFvGxEin3iF87MkAmNHJ9","model":"gpt-5-mini-2025-08-07","obfuscation":"Tz31GYPbIe","object":"chat.completion.chunk","system_fingerprint":null,"usage":{"completion_tokens":154,"completion_tokens_details":{"accepted_prediction_tokens":0,"audio_tokens":0,"reasoning_tokens":128,"rejected_prediction_tokens":0},"prompt_tokens":145,"prompt_tokens_details":{"audio_tokens":0,"cached_tokens":0},"total_tokens":299}} + data: {"choices":[],"created":1782321642,"id":"chatcmpl-DuLZCiguvglQmro4uwCHRifLpSYLN","latency_checkpoint":{"engine_tbt_ms":12,"engine_ttft_ms":36,"engine_ttlt_ms":1525,"pre_inference_ms":212,"service_tbt_ms":12,"service_ttft_ms":664,"service_ttlt_ms":2158,"total_duration_ms":1952,"user_visible_ttft_ms":453},"model":"gpt-5-mini-2025-08-07","obfuscation":"NsK","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":{"completion_tokens":90,"completion_tokens_details":{"accepted_prediction_tokens":0,"audio_tokens":0,"reasoning_tokens":64,"rejected_prediction_tokens":0},"prompt_tokens":145,"prompt_tokens_details":{"audio_tokens":0,"cached_tokens":0},"total_tokens":235}} data: [DONE] @@ -55,7 +55,7 @@ interactions: - text/event-stream; charset=utf-8 status: 200 OK code: 200 - duration: 3.215603542s + duration: 2.210214709s - id: 1 request: proto: HTTP/1.1 @@ -63,14 +63,14 @@ interactions: proto_minor: 1 content_length: 767 host: "" - body: '{"messages":[{"content":"You are a helpful assistant","role":"system"},{"content":"What''s the weather in Florence, Italy?","role":"user"},{"tool_calls":[{"id":"call_ftDSBiJDv090pGPsMwdpJCtX","function":{"arguments":"{\"location\":\"Florence, Italy\"}","name":"weather"},"type":"function"}],"role":"assistant"},{"content":"40 C","tool_call_id":"call_ftDSBiJDv090pGPsMwdpJCtX","role":"tool"}],"model":"gpt-5-mini","reasoning_effort":"high","stream_options":{"include_usage":true},"tool_choice":"auto","tools":[{"function":{"name":"weather","strict":false,"description":"Get weather information for a location","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"}},"type":"function"}],"stream":true}' + body: '{"messages":[{"content":"You are a helpful assistant","role":"system"},{"content":"What''s the weather in Florence, Italy?","role":"user"},{"tool_calls":[{"id":"call_DA9IQQ5D4VQYL6AOoVPUb3Kg","function":{"arguments":"{\"location\":\"Florence, Italy\"}","name":"weather"},"type":"function"}],"role":"assistant"},{"content":"40 C","tool_call_id":"call_DA9IQQ5D4VQYL6AOoVPUb3Kg","role":"tool"}],"model":"gpt-5-mini","reasoning_effort":"high","stream_options":{"include_usage":true},"tool_choice":"auto","tools":[{"function":{"name":"weather","strict":false,"description":"Get weather information for a location","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"}},"type":"function"}],"stream":true}' headers: Accept: - application/json Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://fantasy-playground-resource.openai.azure.com/openai/v1/chat/completions method: POST response: @@ -81,247 +81,151 @@ interactions: body: |+ data: {"choices":[],"created":0,"id":"","model":"","object":"","prompt_filter_results":[{"prompt_index":0,"content_filter_results":{}}]} - data: {"choices":[{"content_filter_results":{},"delta":{"content":"","refusal":null,"role":"assistant"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"3HA95RAPHlb47h","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":"","refusal":null,"role":"assistant"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321644,"id":"chatcmpl-DuLZEecdAJKA6JI76nZgu64Qgpo1z","model":"gpt-5-mini-2025-08-07","obfuscation":"ycfKL","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":"Current"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"3lZYzxdxp","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":"Current"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321644,"id":"chatcmpl-DuLZEecdAJKA6JI76nZgu64Qgpo1z","model":"gpt-5-mini-2025-08-07","obfuscation":"","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":" temperature"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"IR2O","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":" temperature"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321644,"id":"chatcmpl-DuLZEecdAJKA6JI76nZgu64Qgpo1z","model":"gpt-5-mini-2025-08-07","obfuscation":"W1D3G7R3SR3","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":" in"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"hf61kw5fihC9r","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":" in"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321644,"id":"chatcmpl-DuLZEecdAJKA6JI76nZgu64Qgpo1z","model":"gpt-5-mini-2025-08-07","obfuscation":"hXFA","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":" Florence"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"cBAqvSw","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":" Florence"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321644,"id":"chatcmpl-DuLZEecdAJKA6JI76nZgu64Qgpo1z","model":"gpt-5-mini-2025-08-07","obfuscation":"Th8CXX8EehGEIy","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":","},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"LZzsFvANKrPDY9k","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":","},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321644,"id":"chatcmpl-DuLZEecdAJKA6JI76nZgu64Qgpo1z","model":"gpt-5-mini-2025-08-07","obfuscation":"gVNoV8","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":" Italy"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"UPx7joizNn","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":" Italy"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321644,"id":"chatcmpl-DuLZEecdAJKA6JI76nZgu64Qgpo1z","model":"gpt-5-mini-2025-08-07","obfuscation":"L","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":":"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"KS1lFB31kSgahXB","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":":"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321644,"id":"chatcmpl-DuLZEecdAJKA6JI76nZgu64Qgpo1z","model":"gpt-5-mini-2025-08-07","obfuscation":"b8ERSj","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":" "},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"KQb9BSzkd76WpfQ","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":" "},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321644,"id":"chatcmpl-DuLZEecdAJKA6JI76nZgu64Qgpo1z","model":"gpt-5-mini-2025-08-07","obfuscation":"iqPHxQ","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":"40"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"V98DUYwI77olOk","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":"40"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321644,"id":"chatcmpl-DuLZEecdAJKA6JI76nZgu64Qgpo1z","model":"gpt-5-mini-2025-08-07","obfuscation":"hOIvG","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":"°C"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"MNV1doW2YxhPbs","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":"°C"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321644,"id":"chatcmpl-DuLZEecdAJKA6JI76nZgu64Qgpo1z","model":"gpt-5-mini-2025-08-07","obfuscation":"LbHvl","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":" ("},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"G61DJZVe1kruMD","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":" ("},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321644,"id":"chatcmpl-DuLZEecdAJKA6JI76nZgu64Qgpo1z","model":"gpt-5-mini-2025-08-07","obfuscation":"cGJrU","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":"104"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"AtXm0iSsUlA0t","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":"104"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321644,"id":"chatcmpl-DuLZEecdAJKA6JI76nZgu64Qgpo1z","model":"gpt-5-mini-2025-08-07","obfuscation":"mFpS","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":"°F"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"tFmr05pIN4XALL","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":"°F"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321644,"id":"chatcmpl-DuLZEecdAJKA6JI76nZgu64Qgpo1z","model":"gpt-5-mini-2025-08-07","obfuscation":"Z5hdR","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":").\n\n"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"yGlHIxzaTO","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":").\n\n"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321644,"id":"chatcmpl-DuLZEecdAJKA6JI76nZgu64Qgpo1z","model":"gpt-5-mini-2025-08-07","obfuscation":"3","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":"That's"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"NpML0LaEvM","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":"That"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321644,"id":"chatcmpl-DuLZEecdAJKA6JI76nZgu64Qgpo1z","model":"gpt-5-mini-2025-08-07","obfuscation":"rt5","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":" very"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"Oz2n9fWEzbK","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":"’s"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321644,"id":"chatcmpl-DuLZEecdAJKA6JI76nZgu64Qgpo1z","model":"gpt-5-mini-2025-08-07","obfuscation":"RAur5","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":" hot"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"Re3ztFBtrU9d","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":" very"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321644,"id":"chatcmpl-DuLZEecdAJKA6JI76nZgu64Qgpo1z","model":"gpt-5-mini-2025-08-07","obfuscation":"tt","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":" —"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"q270QaM8TlUjZ2","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":" hot"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321644,"id":"chatcmpl-DuLZEecdAJKA6JI76nZgu64Qgpo1z","model":"gpt-5-mini-2025-08-07","obfuscation":"o29","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":" consider"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"vdRSPxt","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":"."},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321644,"id":"chatcmpl-DuLZEecdAJKA6JI76nZgu64Qgpo1z","model":"gpt-5-mini-2025-08-07","obfuscation":"pd4Ty8","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":" taking"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"KMgRdS5DI","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":" Heat"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321644,"id":"chatcmpl-DuLZEecdAJKA6JI76nZgu64Qgpo1z","model":"gpt-5-mini-2025-08-07","obfuscation":"tz","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":" precautions"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"k1Xf","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":"-s"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321644,"id":"chatcmpl-DuLZEecdAJKA6JI76nZgu64Qgpo1z","model":"gpt-5-mini-2025-08-07","obfuscation":"Bd6Xl","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":":\n"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"LcJukybnAchRk","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":"afety"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321644,"id":"chatcmpl-DuLZEecdAJKA6JI76nZgu64Qgpo1z","model":"gpt-5-mini-2025-08-07","obfuscation":"Ol","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":"-"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"xxdLhXgbfF5AZMU","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":" tips"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321644,"id":"chatcmpl-DuLZEecdAJKA6JI76nZgu64Qgpo1z","model":"gpt-5-mini-2025-08-07","obfuscation":"lP","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":" Stay"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"vBbWTn5J9TP","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":":"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321644,"id":"chatcmpl-DuLZEecdAJKA6JI76nZgu64Qgpo1z","model":"gpt-5-mini-2025-08-07","obfuscation":"m61gO5","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":" hydrated"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"G9fDK8C","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":" stay"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321644,"id":"chatcmpl-DuLZEecdAJKA6JI76nZgu64Qgpo1z","model":"gpt-5-mini-2025-08-07","obfuscation":"eY","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":" ("},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"WgesnM091I11iu","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":" hydrated"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321644,"id":"chatcmpl-DuLZEecdAJKA6JI76nZgu64Qgpo1z","model":"gpt-5-mini-2025-08-07","obfuscation":"oQSfsYmDcBqWai","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":"drink"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"b8M8X6dwX0r","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":","},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321644,"id":"chatcmpl-DuLZEecdAJKA6JI76nZgu64Qgpo1z","model":"gpt-5-mini-2025-08-07","obfuscation":"gWFE4g","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":" water"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"17EbcRltbt","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":" avoid"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321644,"id":"chatcmpl-DuLZEecdAJKA6JI76nZgu64Qgpo1z","model":"gpt-5-mini-2025-08-07","obfuscation":"y","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":" regularly"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"K5gjjk","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":" strenuous"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321644,"id":"chatcmpl-DuLZEecdAJKA6JI76nZgu64Qgpo1z","model":"gpt-5-mini-2025-08-07","obfuscation":"smVFGxQ6tWsCL","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":";"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"vzi4ah92xFpkKVx","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":" activity"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321644,"id":"chatcmpl-DuLZEecdAJKA6JI76nZgu64Qgpo1z","model":"gpt-5-mini-2025-08-07","obfuscation":"TQG4d7kleavHaQ","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":" avoid"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"lUFlzE5Mue","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":" during"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321644,"id":"chatcmpl-DuLZEecdAJKA6JI76nZgu64Qgpo1z","model":"gpt-5-mini-2025-08-07","obfuscation":"","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":" excessive"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"gxUm6X","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":" midday"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321644,"id":"chatcmpl-DuLZEecdAJKA6JI76nZgu64Qgpo1z","model":"gpt-5-mini-2025-08-07","obfuscation":"","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}},"delta":{"content":" caffeine"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"6GfoRSB","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":","},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321644,"id":"chatcmpl-DuLZEecdAJKA6JI76nZgu64Qgpo1z","model":"gpt-5-mini-2025-08-07","obfuscation":"x0mVPR","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":"/al"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"qJvfdpkzGzQzh","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":" wear"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321644,"id":"chatcmpl-DuLZEecdAJKA6JI76nZgu64Qgpo1z","model":"gpt-5-mini-2025-08-07","obfuscation":"Ls","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":"cohol"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"7BvEM0oby2R","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":" lightweight"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321644,"id":"chatcmpl-DuLZEecdAJKA6JI76nZgu64Qgpo1z","model":"gpt-5-mini-2025-08-07","obfuscation":"I2lxxX6cLd6","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":").\n"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"sEnjTxu8aZJE","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":" clothing"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321644,"id":"chatcmpl-DuLZEecdAJKA6JI76nZgu64Qgpo1z","model":"gpt-5-mini-2025-08-07","obfuscation":"iob2Cdhp4NFM44","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":"-"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"gg83nI6a8OVWWB2","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":" and"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321644,"id":"chatcmpl-DuLZEecdAJKA6JI76nZgu64Qgpo1z","model":"gpt-5-mini-2025-08-07","obfuscation":"rw4","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":" Avoid"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"wCazZFUWOK","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":" sunscreen"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321644,"id":"chatcmpl-DuLZEecdAJKA6JI76nZgu64Qgpo1z","model":"gpt-5-mini-2025-08-07","obfuscation":"rtugC4CfoRNqt","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":" strenuous"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"pI7nk8","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":","},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321644,"id":"chatcmpl-DuLZEecdAJKA6JI76nZgu64Qgpo1z","model":"gpt-5-mini-2025-08-07","obfuscation":"UTnFSc","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":" outdoor"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"jZJDpM0i","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":" seek"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321644,"id":"chatcmpl-DuLZEecdAJKA6JI76nZgu64Qgpo1z","model":"gpt-5-mini-2025-08-07","obfuscation":"Ob","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":" activity"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"9Cszq4h","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":" shade"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321644,"id":"chatcmpl-DuLZEecdAJKA6JI76nZgu64Qgpo1z","model":"gpt-5-mini-2025-08-07","obfuscation":"n","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":","},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"ccx7Ow0IgtpKRD1","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":" or"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321644,"id":"chatcmpl-DuLZEecdAJKA6JI76nZgu64Qgpo1z","model":"gpt-5-mini-2025-08-07","obfuscation":"6wlR","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":" especially"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"2q59F","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":" air"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321644,"id":"chatcmpl-DuLZEecdAJKA6JI76nZgu64Qgpo1z","model":"gpt-5-mini-2025-08-07","obfuscation":"a6Q","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":" midday"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"nLfpqjLOz","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":" conditioning"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321644,"id":"chatcmpl-DuLZEecdAJKA6JI76nZgu64Qgpo1z","model":"gpt-5-mini-2025-08-07","obfuscation":"Rv8pVW3dHa","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":" ("},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"mZwrDDsIpZnKOF","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":","},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321644,"id":"chatcmpl-DuLZEecdAJKA6JI76nZgu64Qgpo1z","model":"gpt-5-mini-2025-08-07","obfuscation":"C6ZwPT","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":"rough"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"bgzZlzVmUD2","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":" and"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321644,"id":"chatcmpl-DuLZEecdAJKA6JI76nZgu64Qgpo1z","model":"gpt-5-mini-2025-08-07","obfuscation":"BdR","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":"ly"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"sVrx9LJLa95fV3","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":" check"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321644,"id":"chatcmpl-DuLZEecdAJKA6JI76nZgu64Qgpo1z","model":"gpt-5-mini-2025-08-07","obfuscation":"K","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":" "},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"JVnsFaYsSispVif","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":" local"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321644,"id":"chatcmpl-DuLZEecdAJKA6JI76nZgu64Qgpo1z","model":"gpt-5-mini-2025-08-07","obfuscation":"x","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":"11"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"scHk7bnoLA7c6S","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":" heat"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321644,"id":"chatcmpl-DuLZEecdAJKA6JI76nZgu64Qgpo1z","model":"gpt-5-mini-2025-08-07","obfuscation":"VI","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":":"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"pIurC5WMYJab12D","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":" advis"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321644,"id":"chatcmpl-DuLZEecdAJKA6JI76nZgu64Qgpo1z","model":"gpt-5-mini-2025-08-07","obfuscation":"C","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":"00"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"8bb17wRArdn4pz","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":"ories"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321644,"id":"chatcmpl-DuLZEecdAJKA6JI76nZgu64Qgpo1z","model":"gpt-5-mini-2025-08-07","obfuscation":"mz","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":"–"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"C77OHlgIkSKrEy3","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":"."},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321644,"id":"chatcmpl-DuLZEecdAJKA6JI76nZgu64Qgpo1z","model":"gpt-5-mini-2025-08-07","obfuscation":"Ppq9O5","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":"16"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"PJ22SgwN35SduS","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":" Would"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321644,"id":"chatcmpl-DuLZEecdAJKA6JI76nZgu64Qgpo1z","model":"gpt-5-mini-2025-08-07","obfuscation":"R","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":":"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"vM7HBGiuIw5tYYa","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":" you"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321644,"id":"chatcmpl-DuLZEecdAJKA6JI76nZgu64Qgpo1z","model":"gpt-5-mini-2025-08-07","obfuscation":"isZ","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":"00"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"Lt95YSM4Dccobl","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":" like"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321644,"id":"chatcmpl-DuLZEecdAJKA6JI76nZgu64Qgpo1z","model":"gpt-5-mini-2025-08-07","obfuscation":"GC","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":").\n"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"EuiI8g49irMp","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":" an"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321644,"id":"chatcmpl-DuLZEecdAJKA6JI76nZgu64Qgpo1z","model":"gpt-5-mini-2025-08-07","obfuscation":"iI30","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":"-"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"PSn5gk7EBnlyk1t","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":" hourly"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321644,"id":"chatcmpl-DuLZEecdAJKA6JI76nZgu64Qgpo1z","model":"gpt-5-mini-2025-08-07","obfuscation":"","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":" Use"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"TZOUKZuHeD2O","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":" forecast"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321644,"id":"chatcmpl-DuLZEecdAJKA6JI76nZgu64Qgpo1z","model":"gpt-5-mini-2025-08-07","obfuscation":"1LyP5zpOQzX0ip","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":" air"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"yWD1Utojb18F","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":","},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321644,"id":"chatcmpl-DuLZEecdAJKA6JI76nZgu64Qgpo1z","model":"gpt-5-mini-2025-08-07","obfuscation":"Grhs2L","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":" conditioning"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"Mkc","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":" precipitation"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321644,"id":"chatcmpl-DuLZEecdAJKA6JI76nZgu64Qgpo1z","model":"gpt-5-mini-2025-08-07","obfuscation":"9JC0XKIZr","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":" or"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"kvlRVgKP3dF7l","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":"/w"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321644,"id":"chatcmpl-DuLZEecdAJKA6JI76nZgu64Qgpo1z","model":"gpt-5-mini-2025-08-07","obfuscation":"kZcey","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":" seek"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"3snzq59ocoB","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":"ind"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321644,"id":"chatcmpl-DuLZEecdAJKA6JI76nZgu64Qgpo1z","model":"gpt-5-mini-2025-08-07","obfuscation":"3gf2","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":" shaded"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"1XcUdqYi7","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{"content":" details"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321644,"id":"chatcmpl-DuLZEecdAJKA6JI76nZgu64Qgpo1z","model":"gpt-5-mini-2025-08-07","obfuscation":"EnUvoA2N8JUqXzv","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":"/c"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"G3H2fjm4SsNN0M","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{"protected_material_code":{"detected":false,"filtered":false}},"delta":{"content":","},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321644,"id":"chatcmpl-DuLZEecdAJKA6JI76nZgu64Qgpo1z","model":"gpt-5-mini-2025-08-07","obfuscation":"08Qy7o","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":"ool"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"lIE9Q0yANtdw1","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{"protected_material_code":{"detected":false,"filtered":false}},"delta":{"content":" or"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321644,"id":"chatcmpl-DuLZEecdAJKA6JI76nZgu64Qgpo1z","model":"gpt-5-mini-2025-08-07","obfuscation":"IjMP","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":" places"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"yeWSaLkIc","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{"protected_material_code":{"detected":false,"filtered":false}},"delta":{"content":" advice"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321644,"id":"chatcmpl-DuLZEecdAJKA6JI76nZgu64Qgpo1z","model":"gpt-5-mini-2025-08-07","obfuscation":"","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":";"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"P4gbCIzvVWcTXNn","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{"protected_material_code":{"detected":false,"filtered":false}},"delta":{"content":" for"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321644,"id":"chatcmpl-DuLZEecdAJKA6JI76nZgu64Qgpo1z","model":"gpt-5-mini-2025-08-07","obfuscation":"5VR","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":" wear"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"lBzyJ5Y1vu7","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{"protected_material_code":{"detected":false,"filtered":false}},"delta":{"content":" outdoor"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321644,"id":"chatcmpl-DuLZEecdAJKA6JI76nZgu64Qgpo1z","model":"gpt-5-mini-2025-08-07","obfuscation":"kzbWY3GbzKCnhCA","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}},"delta":{"content":" light"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"tvKUydxX24","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{"protected_material_code":{"detected":false,"filtered":false}},"delta":{"content":" plans"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321644,"id":"chatcmpl-DuLZEecdAJKA6JI76nZgu64Qgpo1z","model":"gpt-5-mini-2025-08-07","obfuscation":"F","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":","},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"CiLADG6u9W0y9Ny","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{"protected_material_code":{"detected":false,"filtered":false}},"delta":{"content":"?"},"finish_reason":null,"index":0,"logprobs":null}],"created":1782321644,"id":"chatcmpl-DuLZEecdAJKA6JI76nZgu64Qgpo1z","model":"gpt-5-mini-2025-08-07","obfuscation":"wduWkN","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":" loose"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"zZbZ003Kmw","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} + data: {"choices":[{"content_filter_results":{},"delta":{},"finish_reason":"stop","index":0,"logprobs":null}],"created":1782321644,"id":"chatcmpl-DuLZEecdAJKA6JI76nZgu64Qgpo1z","model":"gpt-5-mini-2025-08-07","obfuscation":"V","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":null} - data: {"choices":[{"content_filter_results":{},"delta":{"content":" clothing"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"b2F7Yv6","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} - - data: {"choices":[{"content_filter_results":{},"delta":{"content":" and"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"oL6XzhfGeEKR","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} - - data: {"choices":[{"content_filter_results":{},"delta":{"content":" sunscreen"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"cxpaPx","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} - - data: {"choices":[{"content_filter_results":{},"delta":{"content":".\n"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"UjAspscjahlZV","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} - - data: {"choices":[{"content_filter_results":{},"delta":{"content":"-"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"gyErmdS4HJWhm4h","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} - - data: {"choices":[{"content_filter_results":{},"delta":{"content":" Watch"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"2oqx9TBaMS","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} - - data: {"choices":[{"content_filter_results":{},"delta":{"content":" for"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"83pdAcwrFAET","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} - - data: {"choices":[{"content_filter_results":{},"delta":{"content":" signs"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"GfQbzNZ79r","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} - - data: {"choices":[{"content_filter_results":{},"delta":{"content":" of"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"ePYA2av4fUnKv","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} - - data: {"choices":[{"content_filter_results":{},"delta":{"content":" heat"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"I31dCFKc03i","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} - - data: {"choices":[{"content_filter_results":{},"delta":{"content":" exhaustion"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"KI3FK","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} - - data: {"choices":[{"content_filter_results":{},"delta":{"content":" ("},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"XdLQoex728Y3in","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} - - data: {"choices":[{"content_filter_results":{},"delta":{"content":"d"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"wdVPV5Mn8JpQ9cx","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} - - data: {"choices":[{"content_filter_results":{},"delta":{"content":"izziness"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"jJ0JN8GD","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} - - data: {"choices":[{"content_filter_results":{},"delta":{"content":","},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"fKBwZodXuj0M1WV","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} - - data: {"choices":[{"content_filter_results":{},"delta":{"content":" nausea"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"7H3X4j0ve","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} - - data: {"choices":[{"content_filter_results":{},"delta":{"content":","},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"0HziLlEZZG31QHl","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} - - data: {"choices":[{"content_filter_results":{},"delta":{"content":" rapid"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"NH9cZdH5kP","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} - - data: {"choices":[{"content_filter_results":{},"delta":{"content":" heartbeat"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"ct7tjI","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} - - data: {"choices":[{"content_filter_results":{},"delta":{"content":")"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"u0Gq3rGyayIhTm7","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} - - data: {"choices":[{"content_filter_results":{},"delta":{"content":" and"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"MHFTkmVNfMGT","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} - - data: {"choices":[{"content_filter_results":{},"delta":{"content":" get"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"oLC04FtMnRqC","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} - - data: {"choices":[{"content_filter_results":{},"delta":{"content":" medical"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"1bYM6Z7r","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} - - data: {"choices":[{"content_filter_results":{},"delta":{"content":" help"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"mWyRN5A1q7Q","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} - - data: {"choices":[{"content_filter_results":{},"delta":{"content":" if"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"b7oENnAnzvefa","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} - - data: {"choices":[{"content_filter_results":{},"delta":{"content":" needed"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"GtsZxxIz6","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} - - data: {"choices":[{"content_filter_results":{},"delta":{"content":".\n\n"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"ZwkG3302DKJ","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} - - data: {"choices":[{"content_filter_results":{},"delta":{"content":"Would"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"BFbIAOPU3uF","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} - - data: {"choices":[{"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}},"delta":{"content":" you"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"nqzoyQqOUkxS","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} - - data: {"choices":[{"content_filter_results":{},"delta":{"content":" like"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"oJmE14F5Mg5","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} - - data: {"choices":[{"content_filter_results":{},"delta":{"content":" humidity"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"mJFQ2aL","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} - - data: {"choices":[{"content_filter_results":{},"delta":{"content":","},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"MJbQC33saVLkOpG","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} - - data: {"choices":[{"content_filter_results":{},"delta":{"content":" wind"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"Un7cO6xCzjB","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} - - data: {"choices":[{"content_filter_results":{},"delta":{"content":","},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"6WThy9JMuIp5iTx","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} - - data: {"choices":[{"content_filter_results":{},"delta":{"content":" an"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"3umW3YHCmpGWz","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} - - data: {"choices":[{"content_filter_results":{},"delta":{"content":" hourly"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"EgxzCunmM","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} - - data: {"choices":[{"content_filter_results":{},"delta":{"content":"/"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"mzW4bPhTrnoGT9f","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} - - data: {"choices":[{"content_filter_results":{},"delta":{"content":"7"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"6RextvWkHuBzotP","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} - - data: {"choices":[{"content_filter_results":{},"delta":{"content":"-day"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"6oVzPZWkAxFP","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} - - data: {"choices":[{"content_filter_results":{},"delta":{"content":" forecast"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"UAzLWos","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} - - data: {"choices":[{"content_filter_results":{},"delta":{"content":","},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"NSIJAX6I2xRkfPA","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} - - data: {"choices":[{"content_filter_results":{},"delta":{"content":" or"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"MReFZDCAc2xIZ","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} - - data: {"choices":[{"content_filter_results":{},"delta":{"content":" local"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"Yi0pDPc68L","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} - - data: {"choices":[{"content_filter_results":{},"delta":{"content":" heat"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"ZXR59ClOzXH","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} - - data: {"choices":[{"content_filter_results":{},"delta":{"content":" advis"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"N3gxsFSiev","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} - - data: {"choices":[{"content_filter_results":{},"delta":{"content":"ories"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"sdSgAdqH2rX","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} - - data: {"choices":[{"content_filter_results":{},"delta":{"content":"?"},"finish_reason":null,"index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"IGZljoU8VDJ67FU","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} - - data: {"choices":[{"content_filter_results":{},"delta":{},"finish_reason":"stop","index":0,"logprobs":null}],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"Vkn6FkKRSk","object":"chat.completion.chunk","system_fingerprint":null,"usage":null} - - data: {"choices":[],"created":1773338596,"id":"chatcmpl-DIefMU7QYydJPYOz1gjK0J4yGNF5L","model":"gpt-5-mini-2025-08-07","obfuscation":"q3RUBjZgnh","object":"chat.completion.chunk","system_fingerprint":null,"usage":{"completion_tokens":704,"completion_tokens_details":{"accepted_prediction_tokens":0,"audio_tokens":0,"reasoning_tokens":576,"rejected_prediction_tokens":0},"prompt_tokens":176,"prompt_tokens_details":{"audio_tokens":0,"cached_tokens":0},"total_tokens":880}} + data: {"choices":[],"created":1782321644,"id":"chatcmpl-DuLZEecdAJKA6JI76nZgu64Qgpo1z","latency_checkpoint":{"engine_tbt_ms":13,"engine_ttft_ms":41,"engine_ttlt_ms":8153,"pre_inference_ms":173,"service_tbt_ms":13,"service_ttft_ms":598,"service_ttlt_ms":8705,"total_duration_ms":8543,"user_visible_ttft_ms":425},"model":"gpt-5-mini-2025-08-07","obfuscation":"p","object":"chat.completion.chunk","service_tier":"default","system_fingerprint":null,"usage":{"completion_tokens":592,"completion_tokens_details":{"accepted_prediction_tokens":0,"audio_tokens":0,"reasoning_tokens":512,"rejected_prediction_tokens":0},"prompt_tokens":176,"prompt_tokens_details":{"audio_tokens":0,"cached_tokens":0},"total_tokens":768}} data: [DONE] @@ -330,4 +234,4 @@ interactions: - text/event-stream; charset=utf-8 status: 200 OK code: 200 - duration: 9.105651958s + duration: 8.190144834s diff --git a/providertests/testdata/TestAzureThinking/azure-gpt-5-mini/thinking.yaml b/providertests/testdata/TestAzureThinking/azure-gpt-5-mini/thinking.yaml index bfb597752..696dc4fc1 100644 --- a/providertests/testdata/TestAzureThinking/azure-gpt-5-mini/thinking.yaml +++ b/providertests/testdata/TestAzureThinking/azure-gpt-5-mini/thinking.yaml @@ -15,22 +15,22 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://fantasy-playground-resource.openai.azure.com/openai/v1/chat/completions method: POST response: proto: HTTP/2.0 proto_major: 2 proto_minor: 0 - content_length: 1051 + content_length: 1302 body: | - {"choices":[{"content_filter_results":{},"finish_reason":"tool_calls","index":0,"logprobs":null,"message":{"annotations":[],"content":null,"refusal":null,"role":"assistant","tool_calls":[{"function":{"arguments":"{\"location\":\"Florence, Italy\"}","name":"weather"},"id":"call_KB8H788JpPZKWXYN0zoeGVSO","type":"function"}]}}],"created":1773338582,"id":"chatcmpl-DIef8vKdF3DsLvy32GOOYsrusK8ew","model":"gpt-5-mini-2025-08-07","object":"chat.completion","prompt_filter_results":[{"prompt_index":0,"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"jailbreak":{"detected":false,"filtered":false},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}}}],"system_fingerprint":null,"usage":{"completion_tokens":90,"completion_tokens_details":{"accepted_prediction_tokens":0,"audio_tokens":0,"reasoning_tokens":64,"rejected_prediction_tokens":0},"prompt_tokens":145,"prompt_tokens_details":{"audio_tokens":0,"cached_tokens":0},"total_tokens":235}} + {"choices":[{"content_filter_results":{},"finish_reason":"tool_calls","index":0,"logprobs":null,"message":{"annotations":[],"content":null,"refusal":null,"role":"assistant","tool_calls":[{"function":{"arguments":"{\"location\":\"Florence, Italy\"}","name":"weather"},"id":"call_tvEGAtC9EJdeiqYCz0S1vQST","type":"function"}]}}],"created":1782321630,"id":"chatcmpl-DuLZ0dgARywxlk2z1MS2qGUsf5mIi","model":"gpt-5-mini-2025-08-07","object":"chat.completion","prompt_filter_results":[{"prompt_index":0,"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"jailbreak":{"detected":false,"filtered":false},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}}}],"service_tier":"default","system_fingerprint":null,"usage":{"completion_tokens":154,"completion_tokens_details":{"accepted_prediction_tokens":0,"audio_tokens":0,"reasoning_tokens":128,"rejected_prediction_tokens":0},"latency_checkpoint":{"engine_tbt_ms":12,"engine_ttft_ms":54,"engine_ttlt_ms":2068,"pre_inference_ms":122,"service_tbt_ms":12,"service_ttft_ms":564,"service_ttlt_ms":2573,"total_duration_ms":2461,"user_visible_ttft_ms":443},"prompt_tokens":145,"prompt_tokens_details":{"audio_tokens":0,"cached_tokens":0},"total_tokens":299}} headers: Content-Type: - application/json status: 200 OK code: 200 - duration: 2.01810125s + duration: 2.920321917s - id: 1 request: proto: HTTP/1.1 @@ -38,26 +38,26 @@ interactions: proto_minor: 1 content_length: 713 host: "" - body: '{"messages":[{"content":"You are a helpful assistant","role":"system"},{"content":"What''s the weather in Florence, Italy?","role":"user"},{"tool_calls":[{"id":"call_KB8H788JpPZKWXYN0zoeGVSO","function":{"arguments":"{\"location\":\"Florence, Italy\"}","name":"weather"},"type":"function"}],"role":"assistant"},{"content":"40 C","tool_call_id":"call_KB8H788JpPZKWXYN0zoeGVSO","role":"tool"}],"model":"gpt-5-mini","reasoning_effort":"high","tool_choice":"auto","tools":[{"function":{"name":"weather","strict":false,"description":"Get weather information for a location","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"}},"type":"function"}]}' + body: '{"messages":[{"content":"You are a helpful assistant","role":"system"},{"content":"What''s the weather in Florence, Italy?","role":"user"},{"tool_calls":[{"id":"call_tvEGAtC9EJdeiqYCz0S1vQST","function":{"arguments":"{\"location\":\"Florence, Italy\"}","name":"weather"},"type":"function"}],"role":"assistant"},{"content":"40 C","tool_call_id":"call_tvEGAtC9EJdeiqYCz0S1vQST","role":"tool"}],"model":"gpt-5-mini","reasoning_effort":"high","tool_choice":"auto","tools":[{"function":{"name":"weather","strict":false,"description":"Get weather information for a location","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"}},"type":"function"}]}' headers: Accept: - application/json Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://fantasy-playground-resource.openai.azure.com/openai/v1/chat/completions method: POST response: proto: HTTP/2.0 proto_major: 2 proto_minor: 0 - content_length: 1502 + content_length: 1483 body: | - {"choices":[{"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"protected_material_code":{"detected":false,"filtered":false},"protected_material_text":{"detected":false,"filtered":false},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}},"finish_reason":"stop","index":0,"logprobs":null,"message":{"annotations":[],"content":"Right now Florence, Italy is about 40 °C (104 °F). That’s very hot — take care.\n\nQuick tips\n- Stay hydrated and drink water regularly.\n- Avoid strenuous outdoor activity during the hottest part of the day (late morning–mid afternoon).\n- Use shade/air conditioning, wear loose light clothing and a hat, and apply sunscreen.\n- Watch for heat-exhaustion/heat-stroke signs (dizziness, fainting, rapid pulse, confusion); seek medical help if severe.\n\nWould you like humidity, wind, an hourly forecast, or a 7-day outlook?","refusal":null,"role":"assistant"}}],"created":1773338584,"id":"chatcmpl-DIefAdzHB1dLXMwJrTWf7ykG5PGE9","model":"gpt-5-mini-2025-08-07","object":"chat.completion","prompt_filter_results":[{"prompt_index":0,"content_filter_results":{}}],"system_fingerprint":null,"usage":{"completion_tokens":771,"completion_tokens_details":{"accepted_prediction_tokens":0,"audio_tokens":0,"reasoning_tokens":640,"rejected_prediction_tokens":0},"prompt_tokens":176,"prompt_tokens_details":{"audio_tokens":0,"cached_tokens":0},"total_tokens":947}} + {"choices":[{"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"protected_material_code":{"detected":false,"filtered":false},"protected_material_text":{"detected":false,"filtered":false},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}},"finish_reason":"stop","index":0,"logprobs":null,"message":{"annotations":[],"content":"Right now in Florence, Italy it’s 40°C (104°F). That’s very hot — stay hydrated, avoid strenuous outdoor activity during peak sun, seek shade or air conditioning, and use sun protection. Would you like an hourly forecast, a 7-day outlook, or anything else?","refusal":null,"role":"assistant"}}],"created":1782321633,"id":"chatcmpl-DuLZ3A454CecdGctWzmVa7Is5IZUT","model":"gpt-5-mini-2025-08-07","object":"chat.completion","prompt_filter_results":[{"prompt_index":0,"content_filter_results":{}}],"service_tier":"default","system_fingerprint":null,"usage":{"completion_tokens":645,"completion_tokens_details":{"accepted_prediction_tokens":0,"audio_tokens":0,"reasoning_tokens":576,"rejected_prediction_tokens":0},"latency_checkpoint":{"engine_tbt_ms":11,"engine_ttft_ms":40,"engine_ttlt_ms":7463,"pre_inference_ms":133,"service_tbt_ms":11,"service_ttft_ms":571,"service_ttlt_ms":7969,"total_duration_ms":7845,"user_visible_ttft_ms":438},"prompt_tokens":176,"prompt_tokens_details":{"audio_tokens":0,"cached_tokens":0},"total_tokens":821}} headers: Content-Type: - application/json status: 200 OK code: 200 - duration: 8.376763541s + duration: 8.5358505s diff --git a/providertests/testdata/TestAzureThinking/azure-grok-3-mini/thinking-streaming.yaml b/providertests/testdata/TestAzureThinking/azure-grok-3-mini/thinking-streaming.yaml deleted file mode 100644 index 64f16c78e..000000000 --- a/providertests/testdata/TestAzureThinking/azure-grok-3-mini/thinking-streaming.yaml +++ /dev/null @@ -1,1495 +0,0 @@ ---- -version: 2 -interactions: -- id: 0 - request: - proto: HTTP/1.1 - proto_major: 1 - proto_minor: 1 - content_length: 516 - host: "" - body: '{"messages":[{"content":"You are a helpful assistant","role":"system"},{"content":"What''s the weather in Florence, Italy?","role":"user"}],"model":"grok-3-mini","reasoning_effort":"high","stream_options":{"include_usage":true},"tool_choice":"auto","tools":[{"function":{"name":"weather","strict":false,"description":"Get weather information for a location","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"}},"type":"function"}],"stream":true}' - headers: - Accept: - - application/json - Content-Type: - - application/json - User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) - url: https://fantasy-playground-resource.openai.azure.com/openai/v1/chat/completions - method: POST - response: - proto: HTTP/2.0 - proto_major: 2 - proto_minor: 0 - content_length: -1 - body: |+ - data: {"choices":[],"created":0,"id":"","model":"","object":"","prompt_filter_results":[{"prompt_index":0,"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"jailbreak":{"filtered":false,"detected":false},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}}}]} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"First","role":"assistant"},"index":0}],"created":1773338612,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":","},"index":0}],"created":1773338612,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" the"},"index":0}],"created":1773338612,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" user"},"index":0}],"created":1773338612,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" is"},"index":0}],"created":1773338612,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" asking"},"index":0}],"created":1773338612,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" for"},"index":0}],"created":1773338612,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" the"},"index":0}],"created":1773338612,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" weather"},"index":0}],"created":1773338612,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" in"},"index":0}],"created":1773338612,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" Florence"},"index":0}],"created":1773338612,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":","},"index":0}],"created":1773338612,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" Italy"},"index":0}],"created":1773338612,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"."},"index":0}],"created":1773338612,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" I"},"index":0}],"created":1773338612,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" have"},"index":0}],"created":1773338612,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" an"},"index":0}],"created":1773338612,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" available"},"index":0}],"created":1773338612,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" function"},"index":0}],"created":1773338612,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" called"},"index":0}],"created":1773338612,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" \""},"index":0}],"created":1773338612,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"weather"},"index":0}],"created":1773338612,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"\""},"index":0}],"created":1773338612,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" that"},"index":0}],"created":1773338612,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" can"},"index":0}],"created":1773338612,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" get"},"index":0}],"created":1773338612,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" weather"},"index":0}],"created":1773338612,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" information"},"index":0}],"created":1773338612,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" for"},"index":0}],"created":1773338612,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" a"},"index":0}],"created":1773338612,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" location"},"index":0}],"created":1773338612,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":".\n\n"},"index":0}],"created":1773338612,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"The"},"index":0}],"created":1773338612,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" function"},"index":0}],"created":1773338612,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" description"},"index":0}],"created":1773338612,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" is"},"index":0}],"created":1773338612,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":":"},"index":0}],"created":1773338612,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" \""},"index":0}],"created":1773338612,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"Get"},"index":0}],"created":1773338612,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" weather"},"index":0}],"created":1773338612,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" information"},"index":0}],"created":1773338612,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" for"},"index":0}],"created":1773338612,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" a"},"index":0}],"created":1773338612,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" location"},"index":0}],"created":1773338612,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"\"."},"index":0}],"created":1773338612,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" The"},"index":0}],"created":1773338612,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" parameters"},"index":0}],"created":1773338612,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" require"},"index":0}],"created":1773338612,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" a"},"index":0}],"created":1773338612,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" \""},"index":0}],"created":1773338612,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"location"},"index":0}],"created":1773338612,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"\""},"index":0}],"created":1773338612,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" which"},"index":0}],"created":1773338612,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" is"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" a"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" string"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":","},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" described"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" as"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" \""},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"the"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" city"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"\".\n\n"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"The"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" user"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" has"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" provided"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" \""},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"Florence"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":","},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" Italy"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"\","},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" which"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" specifies"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" both"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" the"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" city"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" and"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" the"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" country"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"."},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" This"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" should"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" be"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" sufficient"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" as"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" the"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" location"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" parameter"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"."},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" I"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" can"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" infer"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" that"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" \""},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"Florence"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":","},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" Italy"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"\""},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" is"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" the"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" value"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" for"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" the"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" \""},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"location"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"\""},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" parameter"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":".\n\n"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"Since"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" all"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" required"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" parameters"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" are"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" provided"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" and"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" it's"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" clear"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":","},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" I"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" should"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" call"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" the"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" function"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"."},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" The"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" function"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" call"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" should"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" be"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" in"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" JSON"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" format"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" within"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" \u003c"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"function"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"_call"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"\u003e\u003c/"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"function"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"_call"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"\u003e"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" tags"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":".\n\n"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"The"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" format"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" should"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" be"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":":"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" \u003c"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"function"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"_call"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"\u003e{\""},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"action"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"\":"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" \""},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"function"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"_name"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"\","},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" \""},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"action"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"_input"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"\":"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" {\""},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"parameter"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"\":"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" \""},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"argument"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"\""},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"}}\u003c/"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"function"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"_call"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"\u003e\n\n"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"For"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" this"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" case"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":","},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" action"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" is"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" \""},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"weather"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"\","},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" and"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" action"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"_input"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" should"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" have"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" \""},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"location"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"\""},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" with"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" the"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" value"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" \""},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"Florence"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":","},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" Italy"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"\".\n\n"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"I"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" don't"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" need"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" to"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" provide"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" any"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" additional"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" response"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" text"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" before"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" the"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" function"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" call"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":","},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" as"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" the"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" instruction"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" is"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" to"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" call"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" the"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" function"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" if"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" it's"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" the"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" logical"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" next"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" step"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"."},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" The"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" response"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" should"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" be"},"index":0}],"created":1773338613,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" concise"},"index":0}],"created":1773338614,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":".\n\n"},"index":0}],"created":1773338614,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"After"},"index":0}],"created":1773338614,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" calling"},"index":0}],"created":1773338614,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" the"},"index":0}],"created":1773338614,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" function"},"index":0}],"created":1773338614,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":","},"index":0}],"created":1773338614,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" if"},"index":0}],"created":1773338614,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" this"},"index":0}],"created":1773338614,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" were"},"index":0}],"created":1773338614,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" a"},"index":0}],"created":1773338614,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" multi"},"index":0}],"created":1773338614,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"-turn"},"index":0}],"created":1773338614,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" conversation"},"index":0}],"created":1773338614,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":","},"index":0}],"created":1773338614,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" I"},"index":0}],"created":1773338614,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" might"},"index":0}],"created":1773338614,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" need"},"index":0}],"created":1773338614,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" to"},"index":0}],"created":1773338614,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" handle"},"index":0}],"created":1773338614,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" the"},"index":0}],"created":1773338614,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" response"},"index":0}],"created":1773338614,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":","},"index":0}],"created":1773338614,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" but"},"index":0}],"created":1773338614,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" the"},"index":0}],"created":1773338614,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" system"},"index":0}],"created":1773338614,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" prompt"},"index":0}],"created":1773338614,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" says"},"index":0}],"created":1773338614,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" to"},"index":0}],"created":1773338614,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" continue"},"index":0}],"created":1773338614,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" calling"},"index":0}],"created":1773338614,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" functions"},"index":0}],"created":1773338614,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" until"},"index":0}],"created":1773338614,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" the"},"index":0}],"created":1773338614,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" request"},"index":0}],"created":1773338614,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" is"},"index":0}],"created":1773338614,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" fulfilled"},"index":0}],"created":1773338614,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"."},"index":0}],"created":1773338614,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" However"},"index":0}],"created":1773338614,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":","},"index":0}],"created":1773338614,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" once"},"index":0}],"created":1773338614,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" I"},"index":0}],"created":1773338614,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" call"},"index":0}],"created":1773338614,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" the"},"index":0}],"created":1773338614,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" weather"},"index":0}],"created":1773338614,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" function"},"index":0}],"created":1773338614,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":","},"index":0}],"created":1773338614,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" it"},"index":0}],"created":1773338614,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" should"},"index":0}],"created":1773338614,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" provide"},"index":0}],"created":1773338614,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" the"},"index":0}],"created":1773338614,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" weather"},"index":0}],"created":1773338614,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" information"},"index":0}],"created":1773338614,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":","},"index":0}],"created":1773338614,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" so"},"index":0}],"created":1773338614,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" this"},"index":0}],"created":1773338614,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" might"},"index":0}],"created":1773338614,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" be"},"index":0}],"created":1773338614,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" the"},"index":0}],"created":1773338614,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" only"},"index":0}],"created":1773338614,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" call"},"index":0}],"created":1773338614,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" needed"},"index":0}],"created":1773338614,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":".\n\n"},"index":0}],"created":1773338614,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"Finally"},"index":0}],"created":1773338614,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":","},"index":0}],"created":1773338614,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" ensure"},"index":0}],"created":1773338614,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" the"},"index":0}],"created":1773338614,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" output"},"index":0}],"created":1773338614,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" is"},"index":0}],"created":1773338614,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" not"},"index":0}],"created":1773338614,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" verbose"},"index":0}],"created":1773338614,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":";"},"index":0}],"created":1773338614,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" keep"},"index":0}],"created":1773338614,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" it"},"index":0}],"created":1773338614,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" clear"},"index":0}],"created":1773338614,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":".\n\n"},"index":0}],"created":1773338614,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"So"},"index":0}],"created":1773338614,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":","},"index":0}],"created":1773338614,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" my"},"index":0}],"created":1773338614,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" response"},"index":0}],"created":1773338614,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" should"},"index":0}],"created":1773338614,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" just"},"index":0}],"created":1773338614,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" be"},"index":0}],"created":1773338614,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" the"},"index":0}],"created":1773338614,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" function"},"index":0}],"created":1773338614,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" call"},"index":0}],"created":1773338614,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"."},"index":0}],"created":1773338614,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"tool_calls":[{"function":{"arguments":"{\"location\":\"Florence, Italy\"}","name":"weather"},"id":"call_59730831","index":0,"type":"function"}]},"index":0}],"created":1773338614,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{},"finish_reason":"tool_calls","index":0}],"created":1773338614,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[],"created":1773338614,"id":"6dbdc2de-84d4-497d-9536-e643fcc3f981_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9","usage":{"completion_tokens":27,"completion_tokens_details":{"accepted_prediction_tokens":0,"audio_tokens":0,"reasoning_tokens":317,"rejected_prediction_tokens":0},"num_sources_used":0,"prompt_tokens":288,"prompt_tokens_details":{"audio_tokens":0,"cached_tokens":0,"image_tokens":0,"text_tokens":288},"total_tokens":632}} - - data: [DONE] - - headers: - Content-Type: - - text/event-stream - status: 200 OK - code: 200 - duration: 412.644917ms -- id: 1 - request: - proto: HTTP/1.1 - proto_major: 1 - proto_minor: 1 - content_length: 736 - host: "" - body: '{"messages":[{"content":"You are a helpful assistant","role":"system"},{"content":"What''s the weather in Florence, Italy?","role":"user"},{"tool_calls":[{"id":"call_59730831","function":{"arguments":"{\"location\":\"Florence, Italy\"}","name":"weather"},"type":"function"}],"role":"assistant"},{"content":"40 C","tool_call_id":"call_59730831","role":"tool"}],"model":"grok-3-mini","reasoning_effort":"high","stream_options":{"include_usage":true},"tool_choice":"auto","tools":[{"function":{"name":"weather","strict":false,"description":"Get weather information for a location","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"}},"type":"function"}],"stream":true}' - headers: - Accept: - - application/json - Content-Type: - - application/json - User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) - url: https://fantasy-playground-resource.openai.azure.com/openai/v1/chat/completions - method: POST - response: - proto: HTTP/2.0 - proto_major: 2 - proto_minor: 0 - content_length: -1 - body: |+ - data: {"choices":[],"created":0,"id":"","model":"","object":"","prompt_filter_results":[{"prompt_index":0,"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"jailbreak":{"filtered":false,"detected":false},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}}}]} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"First","role":"assistant"},"index":0}],"created":1773338614,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":","},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" the"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" user"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" asked"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" about"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" the"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" weather"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" in"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" Florence"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":","},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" Italy"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"."},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" I"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" have"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" a"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" function"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" available"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" called"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" \""},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"weather"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"\""},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" that"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" can"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" get"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" weather"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" information"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" for"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" a"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" location"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"."},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" The"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" required"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" parameter"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" is"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" \""},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"location"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"\","},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" which"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" is"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" a"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" string"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":".\n\n"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"In"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" the"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" user's"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" query"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":","},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" the"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" location"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" is"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" clearly"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" specified"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" as"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" \""},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"Florence"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":","},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" Italy"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"\"."},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" So"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":","},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" all"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" required"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" parameters"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" are"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" provided"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" and"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" infer"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"able"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":".\n\n"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"According"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" to"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" the"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" instructions"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":","},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" if"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" the"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" user's"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" query"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" can"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" be"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" addressed"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" using"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" an"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" available"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" function"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" and"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" all"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" parameters"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" are"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" provided"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":","},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" I"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" should"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" trigger"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" a"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" function"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" call"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" in"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" the"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" specified"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" JSON"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" format"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" within"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" \u003c"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"function"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"_call"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"\u003e"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" tags"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":".\n\n"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"I"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" already"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" did"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" that"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" in"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" my"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" initial"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" response"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":":"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" \u003c"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"function"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"_call"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"\u003e{\""},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"action"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"\":"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" \""},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"weather"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"\","},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" \""},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"action"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"_input"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"\":"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" {\""},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"location"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"\":"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" \""},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"Florence"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":","},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" Italy"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"\""},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"}}\u003c/"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"function"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"_call"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"\u003e\n\n"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"Now"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":","},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" in"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" this"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" simulation"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":","},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" there's"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" a"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" response"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" from"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" the"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" function"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":":"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" \""},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"Function"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":":"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" "},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"40"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" C"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"\"."},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" This"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" means"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" the"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" function"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" call"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" has"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" been"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" executed"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" and"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" returned"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" a"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" result"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":".\n\n"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"My"},"index":0}],"created":1773338615,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" role"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" is"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" to"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" be"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" a"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" helpful"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" assistant"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"."},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" After"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" the"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" function"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" call"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":","},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" I"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" need"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" to"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" provide"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" a"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" response"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" to"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" the"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" user"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" based"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" on"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" the"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" result"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"."},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" The"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" instructions"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" say"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":":"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" \""},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"Keep"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" your"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" response"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" to"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" user"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" clear"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":";"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" please"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" do"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" not"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" make"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" your"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" response"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" verbose"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"!\"\n\n"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"So"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":","},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" I"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" should"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" now"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" use"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" the"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" result"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" from"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" the"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" function"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" to"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" answer"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" the"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" user"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" directly"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":".\n\n"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"The"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" function"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" returned"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" \""},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"40"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" C"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"\","},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" which"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" I"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" assume"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" means"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" "},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"40"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" degrees"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" Celsius"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"."},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" I"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" should"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" format"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" this"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" into"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" a"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" clear"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":","},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" concise"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" response"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":".\n\n"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"Since"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" this"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" is"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" a"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" multi"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"-turn"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" conversation"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":","},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" I"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" need"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" to"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" continue"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" advancing"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" the"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" user's"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" request"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"."},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" The"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" request"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" was"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" for"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" weather"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" information"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":","},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" and"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" now"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" I"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" have"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" it"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":","},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" so"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" I"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" can"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" fulfill"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" the"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" request"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":".\n\n"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"I"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" don't"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" need"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" to"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" call"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" another"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" function"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" unless"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" more"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" is"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" needed"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":","},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" which"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" isn't"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" the"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" case"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" here"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":".\n\n"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"Final"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" response"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" should"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" be"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" clear"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" and"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" not"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" verbose"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"."},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" Something"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" like"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":":"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" \""},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"The"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" weather"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" in"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" Florence"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":","},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" Italy"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" is"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" "},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"40"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"°C"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":".\"\n\n"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"I"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" should"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" use"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" the"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" exact"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" output"},"index":0}],"created":1773338616,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" from"},"index":0}],"created":1773338617,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" the"},"index":0}],"created":1773338617,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" function"},"index":0}],"created":1773338617,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":","},"index":0}],"created":1773338617,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" but"},"index":0}],"created":1773338617,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" make"},"index":0}],"created":1773338617,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" it"},"index":0}],"created":1773338617,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" user"},"index":0}],"created":1773338617,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"-friendly"},"index":0}],"created":1773338617,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":".\n\n"},"index":0}],"created":1773338617,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"Response"},"index":0}],"created":1773338617,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" structure"},"index":0}],"created":1773338617,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":":"},"index":0}],"created":1773338617,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" After"},"index":0}],"created":1773338617,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" the"},"index":0}],"created":1773338617,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" function"},"index":0}],"created":1773338617,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" call"},"index":0}],"created":1773338617,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" is"},"index":0}],"created":1773338617,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" handled"},"index":0}],"created":1773338617,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":","},"index":0}],"created":1773338617,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" I"},"index":0}],"created":1773338617,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" respond"},"index":0}],"created":1773338617,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" with"},"index":0}],"created":1773338617,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" the"},"index":0}],"created":1773338617,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":" information"},"index":0}],"created":1773338617,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{"reasoning_content":"."},"index":0}],"created":1773338617,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}},"delta":{"content":"The"},"index":0}],"created":1773338617,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}},"delta":{"content":" weather"},"index":0}],"created":1773338617,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}},"delta":{"content":" in"},"index":0}],"created":1773338617,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}},"delta":{"content":" Florence"},"index":0}],"created":1773338617,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}},"delta":{"content":","},"index":0}],"created":1773338617,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}},"delta":{"content":" Italy"},"index":0}],"created":1773338617,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}},"delta":{"content":" is"},"index":0}],"created":1773338617,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}},"delta":{"content":" "},"index":0}],"created":1773338617,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}},"delta":{"content":"40"},"index":0}],"created":1773338617,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}},"delta":{"content":"°C"},"index":0}],"created":1773338617,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}},"delta":{"content":"."},"index":0}],"created":1773338617,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[{"content_filter_results":{},"delta":{},"finish_reason":"stop","index":0}],"created":1773338617,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9"} - - data: {"choices":[],"created":1773338617,"id":"26d931dd-a83e-46a8-a258-90c71a6a05d5_sidecar","model":"grok-3-mini-high","object":"chat.completion.chunk","system_fingerprint":"fp_d33f0040b9","usage":{"completion_tokens":11,"completion_tokens_details":{"accepted_prediction_tokens":0,"audio_tokens":0,"reasoning_tokens":380,"rejected_prediction_tokens":0},"num_sources_used":0,"prompt_tokens":332,"prompt_tokens_details":{"audio_tokens":0,"cached_tokens":0,"image_tokens":0,"text_tokens":332},"total_tokens":723}} - - data: [DONE] - - headers: - Content-Type: - - text/event-stream - status: 200 OK - code: 200 - duration: 511.548584ms diff --git a/providertests/testdata/TestAzureThinking/azure-grok-3-mini/thinking.yaml b/providertests/testdata/TestAzureThinking/azure-grok-3-mini/thinking.yaml deleted file mode 100644 index 104f16e29..000000000 --- a/providertests/testdata/TestAzureThinking/azure-grok-3-mini/thinking.yaml +++ /dev/null @@ -1,65 +0,0 @@ ---- -version: 2 -interactions: -- id: 0 - request: - proto: HTTP/1.1 - proto_major: 1 - proto_minor: 1 - content_length: 462 - host: "" - body: '{"messages":[{"content":"You are a helpful assistant","role":"system"},{"content":"What''s the weather in Florence, Italy?","role":"user"}],"model":"grok-3-mini","reasoning_effort":"high","tool_choice":"auto","tools":[{"function":{"name":"weather","strict":false,"description":"Get weather information for a location","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"}},"type":"function"}]}' - headers: - Accept: - - application/json - Content-Type: - - application/json - User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) - url: https://fantasy-playground-resource.openai.azure.com/openai/v1/chat/completions - method: POST - response: - proto: HTTP/2.0 - proto_major: 2 - proto_minor: 0 - content_length: -1 - uncompressed: true - body: | - {"choices":[{"content_filter_results":{},"finish_reason":"tool_calls","index":0,"logprobs":null,"message":{"content":"","reasoning_content":"First, the user is asking for the weather in Florence, Italy. I have an available function called \"weather\" that can get weather information for a location.\n\nThe function description is: \"Get weather information for a location\". The parameters require a \"location\" which is a string describing the city.\n\nIn this query, the user has provided \"Florence, Italy\", which clearly specifies the city and country. This matches the required parameter for the \"weather\" function.\n\nAll required parameters are provided and inferable. The location is given as \"Florence, Italy\", so I can use that directly.\n\nAccording to the instructions, if the user's query can be addressed using an available function and all required parameters are provided, I should trigger a function call in the specified JSON format within \u003cfunction_call\u003e tags.\n\nThe format should be: \u003cfunction_call\u003e{\"action\": \"function_name\", \"action_input\": {\"parameter\": \"argument\"}}\u003c/function_call\u003e\n\nFor this case, the action is \"weather\", and the action_input should have the \"location\" parameter with the value \"Florence, Italy\".\n\nI should not make my response verbose. Keep it clear and concise. Since I'm calling a function, my response should only contain the function call if that's the next step.\n\nThe instructions say: \"You are only permitted to use the \u003cfunction_call\u003e tag in your response only if you have made the decision to call a function.\" And in this case, I have decided to call the function.\n\nAfter calling the function, in a multi-turn conversation, I might need to handle the response, but for now, the logical next step is to call the weather function.\n\nNo need to ask for clarification because the location is clear.\n\nSo, my response should be:\n\n\u003cfunction_call\u003e{\"action\": \"weather\", \"action_input\": {\"location\": \"Florence, Italy\"}}\u003c/function_call\u003e\n\nThat seems straightforward.","refusal":null,"role":"assistant","tool_calls":[{"function":{"arguments":"{\"location\":\"Florence, Italy\"}","call_id":null,"name":"weather"},"id":"call_39096519","type":"function"}]},"stop_reason":null}],"created":1773338606,"id":"4a702f64-f693-4d27-8806-c9a9907959ae_sidecar","model":"grok-3-mini-high","object":"chat.completion","prompt_filter_results":[{"prompt_index":0,"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"jailbreak":{"filtered":false,"detected":false},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}}}],"usage":{"audio_prompt_tokens":0,"completion_tokens":27,"completion_tokens_details":{"accepted_prediction_tokens":0,"audio_tokens":0,"reasoning_tokens":379,"rejected_prediction_tokens":0},"num_sources_used":0,"prompt_tokens":288,"prompt_tokens_details":{"audio_tokens":0,"cached_tokens":0,"image_tokens":0,"text_tokens":288},"total_tokens":694}} - headers: - Content-Type: - - application/json - status: 200 OK - code: 200 - duration: 3.557213292s -- id: 1 - request: - proto: HTTP/1.1 - proto_major: 1 - proto_minor: 1 - content_length: 682 - host: "" - body: '{"messages":[{"content":"You are a helpful assistant","role":"system"},{"content":"What''s the weather in Florence, Italy?","role":"user"},{"tool_calls":[{"id":"call_39096519","function":{"arguments":"{\"location\":\"Florence, Italy\"}","name":"weather"},"type":"function"}],"role":"assistant"},{"content":"40 C","tool_call_id":"call_39096519","role":"tool"}],"model":"grok-3-mini","reasoning_effort":"high","tool_choice":"auto","tools":[{"function":{"name":"weather","strict":false,"description":"Get weather information for a location","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"}},"type":"function"}]}' - headers: - Accept: - - application/json - Content-Type: - - application/json - User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) - url: https://fantasy-playground-resource.openai.azure.com/openai/v1/chat/completions - method: POST - response: - proto: HTTP/2.0 - proto_major: 2 - proto_minor: 0 - content_length: -1 - uncompressed: true - body: | - {"choices":[{"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"protected_material_code":{"filtered":false,"detected":false},"protected_material_text":{"filtered":false,"detected":false},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}},"finish_reason":"stop","index":0,"logprobs":null,"message":{"content":"The weather in Florence, Italy, is currently 40°C.","reasoning_content":"First, the user asked: \"What's the weather in Florence, Italy?\" This directly matches the available function \"weather\", which requires a \"location\" parameter.\n\nThe function call I made was: \u003cfunction_call\u003e{\"action\": \"weather\", \"action_input\": {\"location\": \"Florence, Italy\"}}\u003c/function_call\u003e\n\nNow, the system has responded with the function output: \"Function: 40 C\". I assume this means the weather function returned that the temperature is 40 degrees Celsius.\n\nMy role is to be a helpful assistant. After calling a function, I should provide a clear, non-verbose response to the user based on the function's output.\n\nThe user's request is now fulfilled because I called the weather function, and I have the result. I don't need to call any more functions unless there's more to the query.\n\nResponse guidelines:\n- Keep the response clear and not verbose.\n- If I've called a function and have the result, I should present it to the user.\n- Only use \u003cfunction_call\u003e tags when deciding to call a function. In this case, I've already called it, and now I'm responding with the result.\n\nSo, I should now give a straightforward answer to the user based on the function's output.\n\nFunction output is \"40 C\", which I interpret as 40 degrees Celsius. I should make this user-friendly.\n\nFinal response: Inform the user about the weather in Florence, Italy, based on the function call result.","refusal":null,"role":"assistant","tool_calls":null},"stop_reason":null}],"created":1773338610,"id":"69b00015-5cfe-4d69-b451-da44ba17c1f9_sidecar","model":"grok-3-mini-high","object":"chat.completion","prompt_filter_results":[{"prompt_index":0,"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"jailbreak":{"filtered":false,"detected":false},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}}}],"usage":{"audio_prompt_tokens":0,"completion_tokens":13,"completion_tokens_details":{"accepted_prediction_tokens":0,"audio_tokens":0,"reasoning_tokens":293,"rejected_prediction_tokens":0},"num_sources_used":0,"prompt_tokens":332,"prompt_tokens_details":{"audio_tokens":0,"cached_tokens":0,"image_tokens":0,"text_tokens":332},"total_tokens":638}} - headers: - Content-Type: - - application/json - status: 200 OK - code: 200 - duration: 2.248014792s diff --git a/providertests/testdata/TestOpenAICommon/openai-gpt-4o-mini/multi_tool.yaml b/providertests/testdata/TestOpenAICommon/openai-gpt-4o-mini/multi_tool.yaml index a828b4d21..339704e85 100644 --- a/providertests/testdata/TestOpenAICommon/openai-gpt-4o-mini/multi_tool.yaml +++ b/providertests/testdata/TestOpenAICommon/openai-gpt-4o-mini/multi_tool.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://api.openai.com/v1/chat/completions method: POST response: @@ -26,9 +26,9 @@ interactions: uncompressed: true body: | { - "id": "chatcmpl-DIgOpyNV7XwvLi4hv5AIERgkhr9r2", + "id": "chatcmpl-DuLdUO0Pvm9IhUmV9qCj30FQ6gQrs", "object": "chat.completion", - "created": 1773345259, + "created": 1782321908, "model": "gpt-4o-mini-2024-07-18", "choices": [ { @@ -38,7 +38,7 @@ interactions: "content": null, "tool_calls": [ { - "id": "call_EnBRBmuabMwppICaGr0KqkBZ", + "id": "call_2wt6qUGrlxczUadZYf3qXyH0", "type": "function", "function": { "name": "add", @@ -46,7 +46,7 @@ interactions: } }, { - "id": "call_I5Wnsq0pwgt98vEg7f63nTZI", + "id": "call_vZOWZaH7tzu0rLZeogtafvrf", "type": "function", "function": { "name": "multiply", @@ -77,14 +77,14 @@ interactions: } }, "service_tier": "default", - "system_fingerprint": "fp_a1681c17ec" + "system_fingerprint": "fp_0d8f5eee12" } headers: Content-Type: - application/json status: 200 OK code: 200 - duration: 1.068009292s + duration: 2.256681833s - id: 1 request: proto: HTTP/1.1 @@ -92,14 +92,14 @@ interactions: proto_minor: 1 content_length: 1247 host: "" - body: '{"messages":[{"content":"You are a helpful assistant. CRITICAL: Always use both add and multiply at the same time ALWAYS.","role":"system"},{"content":"Add and multiply the number 2 and 3","role":"user"},{"tool_calls":[{"id":"call_EnBRBmuabMwppICaGr0KqkBZ","function":{"arguments":"{\"a\": 2, \"b\": 3}","name":"add"},"type":"function"},{"id":"call_I5Wnsq0pwgt98vEg7f63nTZI","function":{"arguments":"{\"a\": 2, \"b\": 3}","name":"multiply"},"type":"function"}],"role":"assistant"},{"content":"5","tool_call_id":"call_EnBRBmuabMwppICaGr0KqkBZ","role":"tool"},{"content":"6","tool_call_id":"call_I5Wnsq0pwgt98vEg7f63nTZI","role":"tool"}],"model":"gpt-4o-mini","max_tokens":4000,"tool_choice":"auto","tools":[{"function":{"name":"add","strict":false,"description":"Add two numbers","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"}},"type":"function"},{"function":{"name":"multiply","strict":false,"description":"Multiply two numbers","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"}},"type":"function"}]}' + body: '{"messages":[{"content":"You are a helpful assistant. CRITICAL: Always use both add and multiply at the same time ALWAYS.","role":"system"},{"content":"Add and multiply the number 2 and 3","role":"user"},{"tool_calls":[{"id":"call_2wt6qUGrlxczUadZYf3qXyH0","function":{"arguments":"{\"a\": 2, \"b\": 3}","name":"add"},"type":"function"},{"id":"call_vZOWZaH7tzu0rLZeogtafvrf","function":{"arguments":"{\"a\": 2, \"b\": 3}","name":"multiply"},"type":"function"}],"role":"assistant"},{"content":"5","tool_call_id":"call_2wt6qUGrlxczUadZYf3qXyH0","role":"tool"},{"content":"6","tool_call_id":"call_vZOWZaH7tzu0rLZeogtafvrf","role":"tool"}],"model":"gpt-4o-mini","max_tokens":4000,"tool_choice":"auto","tools":[{"function":{"name":"add","strict":false,"description":"Add two numbers","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"}},"type":"function"},{"function":{"name":"multiply","strict":false,"description":"Multiply two numbers","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"}},"type":"function"}]}' headers: Accept: - application/json Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://api.openai.com/v1/chat/completions method: POST response: @@ -110,16 +110,16 @@ interactions: uncompressed: true body: | { - "id": "chatcmpl-DIgOqNuKd78j1HHOtDjbirEaWUqtl", + "id": "chatcmpl-DuLdVFrPbAOC3f0eWQVTpsjwZoeQ4", "object": "chat.completion", - "created": 1773345260, + "created": 1782321909, "model": "gpt-4o-mini-2024-07-18", "choices": [ { "index": 0, "message": { "role": "assistant", - "content": "The result of adding 2 and 3 is 5, and the result of multiplying 2 and 3 is 6.", + "content": "The sum of 2 and 3 is 5, and the product of 2 and 3 is 6.", "refusal": null, "annotations": [] }, @@ -129,8 +129,8 @@ interactions: ], "usage": { "prompt_tokens": 176, - "completion_tokens": 28, - "total_tokens": 204, + "completion_tokens": 26, + "total_tokens": 202, "prompt_tokens_details": { "cached_tokens": 0, "audio_tokens": 0 @@ -143,11 +143,11 @@ interactions: } }, "service_tier": "default", - "system_fingerprint": "fp_a1681c17ec" + "system_fingerprint": "fp_0d8f5eee12" } headers: Content-Type: - application/json status: 200 OK code: 200 - duration: 919.718333ms + duration: 881.997125ms diff --git a/providertests/testdata/TestOpenAICommon/openai-gpt-4o-mini/multi_tool_streaming.yaml b/providertests/testdata/TestOpenAICommon/openai-gpt-4o-mini/multi_tool_streaming.yaml index 3ac5185fc..6ffb721cb 100644 --- a/providertests/testdata/TestOpenAICommon/openai-gpt-4o-mini/multi_tool_streaming.yaml +++ b/providertests/testdata/TestOpenAICommon/openai-gpt-4o-mini/multi_tool_streaming.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://api.openai.com/v1/chat/completions method: POST response: @@ -24,31 +24,31 @@ interactions: proto_minor: 0 content_length: -1 body: |+ - data: {"id":"chatcmpl-DIgOrid9As2KRUSwbF3yxoewtUUhz","object":"chat.completion.chunk","created":1773345261,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_7cd1a06d3a","usage":null,"choices":[{"index":0,"delta":{"role":"assistant","content":null},"logprobs":null,"finish_reason":null}],"obfuscation":"KIjm2E"} + data: {"id":"chatcmpl-DuLdWOILVCVVrpY7aRAWaTdcPyWSy","object":"chat.completion.chunk","created":1782321910,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_59e007eafa","usage":null,"choices":[{"index":0,"delta":{"role":"assistant","content":null},"logprobs":null,"finish_reason":null}],"obfuscation":"CYlcrz"} - data: {"id":"chatcmpl-DIgOrid9As2KRUSwbF3yxoewtUUhz","object":"chat.completion.chunk","created":1773345261,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_7cd1a06d3a","usage":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"id":"call_4ifjNdHz0FdUYGSOEoJhug4a","type":"function","function":{"name":"add","arguments":""}}]},"logprobs":null,"finish_reason":null}],"obfuscation":"5II9VlxoYyNJA"} + data: {"id":"chatcmpl-DuLdWOILVCVVrpY7aRAWaTdcPyWSy","object":"chat.completion.chunk","created":1782321910,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_59e007eafa","usage":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"id":"call_cclGbjTQkZDEnnHrRiU0n7NO","type":"function","function":{"name":"add","arguments":""}}]},"logprobs":null,"finish_reason":null}],"obfuscation":"CfQxNLZB1Nzny"} - data: {"id":"chatcmpl-DIgOrid9As2KRUSwbF3yxoewtUUhz","object":"chat.completion.chunk","created":1773345261,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_7cd1a06d3a","usage":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"{\"a\""}}]},"logprobs":null,"finish_reason":null}],"obfuscation":"UJ2FiL4T4Y9"} + data: {"id":"chatcmpl-DuLdWOILVCVVrpY7aRAWaTdcPyWSy","object":"chat.completion.chunk","created":1782321910,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_59e007eafa","usage":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"{\"a\""}}]},"logprobs":null,"finish_reason":null}],"obfuscation":"ilkuWcchzis"} - data: {"id":"chatcmpl-DIgOrid9As2KRUSwbF3yxoewtUUhz","object":"chat.completion.chunk","created":1773345261,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_7cd1a06d3a","usage":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":": 2, "}}]},"logprobs":null,"finish_reason":null}],"obfuscation":"foSkpbnmDEL3"} + data: {"id":"chatcmpl-DuLdWOILVCVVrpY7aRAWaTdcPyWSy","object":"chat.completion.chunk","created":1782321910,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_59e007eafa","usage":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":": 2, "}}]},"logprobs":null,"finish_reason":null}],"obfuscation":"eqbfZORj91iF"} - data: {"id":"chatcmpl-DIgOrid9As2KRUSwbF3yxoewtUUhz","object":"chat.completion.chunk","created":1773345261,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_7cd1a06d3a","usage":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"\"b\": 3"}}]},"logprobs":null,"finish_reason":null}],"obfuscation":"KETPJkl7j"} + data: {"id":"chatcmpl-DuLdWOILVCVVrpY7aRAWaTdcPyWSy","object":"chat.completion.chunk","created":1782321910,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_59e007eafa","usage":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"\"b\": 3"}}]},"logprobs":null,"finish_reason":null}],"obfuscation":"Zxu4W6X0H"} - data: {"id":"chatcmpl-DIgOrid9As2KRUSwbF3yxoewtUUhz","object":"chat.completion.chunk","created":1773345261,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_7cd1a06d3a","usage":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"}"}}]},"logprobs":null,"finish_reason":null}],"obfuscation":""} + data: {"id":"chatcmpl-DuLdWOILVCVVrpY7aRAWaTdcPyWSy","object":"chat.completion.chunk","created":1782321910,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_59e007eafa","usage":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"}"}}]},"logprobs":null,"finish_reason":null}],"obfuscation":""} - data: {"id":"chatcmpl-DIgOrid9As2KRUSwbF3yxoewtUUhz","object":"chat.completion.chunk","created":1773345261,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_7cd1a06d3a","usage":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":1,"id":"call_sXf7ZGvQxWZWcqH7dp0F1Fd6","type":"function","function":{"name":"multiply","arguments":""}}]},"logprobs":null,"finish_reason":null}],"obfuscation":"ml2N4dAQ"} + data: {"id":"chatcmpl-DuLdWOILVCVVrpY7aRAWaTdcPyWSy","object":"chat.completion.chunk","created":1782321910,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_59e007eafa","usage":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":1,"id":"call_Nob2SzTcxIjro1HvSBPQS6XG","type":"function","function":{"name":"multiply","arguments":""}}]},"logprobs":null,"finish_reason":null}],"obfuscation":"XQ1508MK"} - data: {"id":"chatcmpl-DIgOrid9As2KRUSwbF3yxoewtUUhz","object":"chat.completion.chunk","created":1773345261,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_7cd1a06d3a","usage":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":1,"function":{"arguments":"{\"a\""}}]},"logprobs":null,"finish_reason":null}],"obfuscation":"rUc5ZQTYGRR"} + data: {"id":"chatcmpl-DuLdWOILVCVVrpY7aRAWaTdcPyWSy","object":"chat.completion.chunk","created":1782321910,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_59e007eafa","usage":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":1,"function":{"arguments":"{\"a\""}}]},"logprobs":null,"finish_reason":null}],"obfuscation":"vnwwSSxYtqU"} - data: {"id":"chatcmpl-DIgOrid9As2KRUSwbF3yxoewtUUhz","object":"chat.completion.chunk","created":1773345261,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_7cd1a06d3a","usage":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":1,"function":{"arguments":": 2, "}}]},"logprobs":null,"finish_reason":null}],"obfuscation":"jWFhTtti2n56"} + data: {"id":"chatcmpl-DuLdWOILVCVVrpY7aRAWaTdcPyWSy","object":"chat.completion.chunk","created":1782321910,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_59e007eafa","usage":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":1,"function":{"arguments":": 2, "}}]},"logprobs":null,"finish_reason":null}],"obfuscation":"Jc9qhtRslVNu"} - data: {"id":"chatcmpl-DIgOrid9As2KRUSwbF3yxoewtUUhz","object":"chat.completion.chunk","created":1773345261,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_7cd1a06d3a","usage":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":1,"function":{"arguments":"\"b\": 3"}}]},"logprobs":null,"finish_reason":null}],"obfuscation":"MGZKJclaE"} + data: {"id":"chatcmpl-DuLdWOILVCVVrpY7aRAWaTdcPyWSy","object":"chat.completion.chunk","created":1782321910,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_59e007eafa","usage":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":1,"function":{"arguments":"\"b\": 3"}}]},"logprobs":null,"finish_reason":null}],"obfuscation":"DVTPxZsAw"} - data: {"id":"chatcmpl-DIgOrid9As2KRUSwbF3yxoewtUUhz","object":"chat.completion.chunk","created":1773345261,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_7cd1a06d3a","usage":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":1,"function":{"arguments":"}"}}]},"logprobs":null,"finish_reason":null}],"obfuscation":""} + data: {"id":"chatcmpl-DuLdWOILVCVVrpY7aRAWaTdcPyWSy","object":"chat.completion.chunk","created":1782321910,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_59e007eafa","usage":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":1,"function":{"arguments":"}"}}]},"logprobs":null,"finish_reason":null}],"obfuscation":""} - data: {"id":"chatcmpl-DIgOrid9As2KRUSwbF3yxoewtUUhz","object":"chat.completion.chunk","created":1773345261,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_7cd1a06d3a","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"tool_calls"}],"usage":null,"obfuscation":"WDrV0BQzF3Ss5V4"} + data: {"id":"chatcmpl-DuLdWOILVCVVrpY7aRAWaTdcPyWSy","object":"chat.completion.chunk","created":1782321910,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_59e007eafa","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"tool_calls"}],"usage":null,"obfuscation":"dI0m5oSXnhtIAHF"} - data: {"id":"chatcmpl-DIgOrid9As2KRUSwbF3yxoewtUUhz","object":"chat.completion.chunk","created":1773345261,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_7cd1a06d3a","choices":[],"usage":{"prompt_tokens":106,"completion_tokens":50,"total_tokens":156,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"ouYIhbAX"} + data: {"id":"chatcmpl-DuLdWOILVCVVrpY7aRAWaTdcPyWSy","object":"chat.completion.chunk","created":1782321910,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_59e007eafa","choices":[],"usage":{"prompt_tokens":106,"completion_tokens":50,"total_tokens":156,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"BQfZg7aa"} data: [DONE] @@ -57,7 +57,7 @@ interactions: - text/event-stream; charset=utf-8 status: 200 OK code: 200 - duration: 1.289255208s + duration: 1.248101458s - id: 1 request: proto: HTTP/1.1 @@ -65,14 +65,14 @@ interactions: proto_minor: 1 content_length: 1284 host: "" - body: '{"messages":[{"content":"You are a helpful assistant. Always use both add and multiply at the same time.","role":"system"},{"content":"Add and multiply the number 2 and 3","role":"user"},{"tool_calls":[{"id":"call_4ifjNdHz0FdUYGSOEoJhug4a","function":{"arguments":"{\"a\": 2, \"b\": 3}","name":"add"},"type":"function"},{"id":"call_sXf7ZGvQxWZWcqH7dp0F1Fd6","function":{"arguments":"{\"a\": 2, \"b\": 3}","name":"multiply"},"type":"function"}],"role":"assistant"},{"content":"5","tool_call_id":"call_4ifjNdHz0FdUYGSOEoJhug4a","role":"tool"},{"content":"6","tool_call_id":"call_sXf7ZGvQxWZWcqH7dp0F1Fd6","role":"tool"}],"model":"gpt-4o-mini","max_tokens":4000,"stream_options":{"include_usage":true},"tool_choice":"auto","tools":[{"function":{"name":"add","strict":false,"description":"Add two numbers","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"}},"type":"function"},{"function":{"name":"multiply","strict":false,"description":"Multiply two numbers","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"}},"type":"function"}],"stream":true}' + body: '{"messages":[{"content":"You are a helpful assistant. Always use both add and multiply at the same time.","role":"system"},{"content":"Add and multiply the number 2 and 3","role":"user"},{"tool_calls":[{"id":"call_cclGbjTQkZDEnnHrRiU0n7NO","function":{"arguments":"{\"a\": 2, \"b\": 3}","name":"add"},"type":"function"},{"id":"call_Nob2SzTcxIjro1HvSBPQS6XG","function":{"arguments":"{\"a\": 2, \"b\": 3}","name":"multiply"},"type":"function"}],"role":"assistant"},{"content":"5","tool_call_id":"call_cclGbjTQkZDEnnHrRiU0n7NO","role":"tool"},{"content":"6","tool_call_id":"call_Nob2SzTcxIjro1HvSBPQS6XG","role":"tool"}],"model":"gpt-4o-mini","max_tokens":4000,"stream_options":{"include_usage":true},"tool_choice":"auto","tools":[{"function":{"name":"add","strict":false,"description":"Add two numbers","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"}},"type":"function"},{"function":{"name":"multiply","strict":false,"description":"Multiply two numbers","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"}},"type":"function"}],"stream":true}' headers: Accept: - application/json Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://api.openai.com/v1/chat/completions method: POST response: @@ -81,61 +81,61 @@ interactions: proto_minor: 0 content_length: -1 body: |+ - data: {"id":"chatcmpl-DIgOuEkd6Uqq8tPXdk2MbDIioWtU8","object":"chat.completion.chunk","created":1773345264,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_7cd1a06d3a","choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"iPkRpouE3"} + data: {"id":"chatcmpl-DuLdYWgDBTb4Am3saOR9aPajzKbJy","object":"chat.completion.chunk","created":1782321912,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_59e007eafa","choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"niwJPCCCC"} - data: {"id":"chatcmpl-DIgOuEkd6Uqq8tPXdk2MbDIioWtU8","object":"chat.completion.chunk","created":1773345264,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_7cd1a06d3a","choices":[{"index":0,"delta":{"content":"The"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"uFgdCLVK"} + data: {"id":"chatcmpl-DuLdYWgDBTb4Am3saOR9aPajzKbJy","object":"chat.completion.chunk","created":1782321912,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_59e007eafa","choices":[{"index":0,"delta":{"content":"The"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"O7gMKPCF"} - data: {"id":"chatcmpl-DIgOuEkd6Uqq8tPXdk2MbDIioWtU8","object":"chat.completion.chunk","created":1773345264,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_7cd1a06d3a","choices":[{"index":0,"delta":{"content":" sum"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"DmLl7W4"} + data: {"id":"chatcmpl-DuLdYWgDBTb4Am3saOR9aPajzKbJy","object":"chat.completion.chunk","created":1782321912,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_59e007eafa","choices":[{"index":0,"delta":{"content":" sum"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"wFNG4iR"} - data: {"id":"chatcmpl-DIgOuEkd6Uqq8tPXdk2MbDIioWtU8","object":"chat.completion.chunk","created":1773345264,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_7cd1a06d3a","choices":[{"index":0,"delta":{"content":" of"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"isI5xJ0H"} + data: {"id":"chatcmpl-DuLdYWgDBTb4Am3saOR9aPajzKbJy","object":"chat.completion.chunk","created":1782321912,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_59e007eafa","choices":[{"index":0,"delta":{"content":" of"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"ATzaF6qT"} - data: {"id":"chatcmpl-DIgOuEkd6Uqq8tPXdk2MbDIioWtU8","object":"chat.completion.chunk","created":1773345264,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_7cd1a06d3a","choices":[{"index":0,"delta":{"content":" "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"23VLqcXjZ5"} + data: {"id":"chatcmpl-DuLdYWgDBTb4Am3saOR9aPajzKbJy","object":"chat.completion.chunk","created":1782321912,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_59e007eafa","choices":[{"index":0,"delta":{"content":" "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"x8qWxmM07E"} - data: {"id":"chatcmpl-DIgOuEkd6Uqq8tPXdk2MbDIioWtU8","object":"chat.completion.chunk","created":1773345264,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_7cd1a06d3a","choices":[{"index":0,"delta":{"content":"2"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"DHjCxmy9nu"} + data: {"id":"chatcmpl-DuLdYWgDBTb4Am3saOR9aPajzKbJy","object":"chat.completion.chunk","created":1782321912,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_59e007eafa","choices":[{"index":0,"delta":{"content":"2"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"XcLMIN1zMT"} - data: {"id":"chatcmpl-DIgOuEkd6Uqq8tPXdk2MbDIioWtU8","object":"chat.completion.chunk","created":1773345264,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_7cd1a06d3a","choices":[{"index":0,"delta":{"content":" and"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"dbmEjqi"} + data: {"id":"chatcmpl-DuLdYWgDBTb4Am3saOR9aPajzKbJy","object":"chat.completion.chunk","created":1782321912,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_59e007eafa","choices":[{"index":0,"delta":{"content":" and"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"eoJ2uSA"} - data: {"id":"chatcmpl-DIgOuEkd6Uqq8tPXdk2MbDIioWtU8","object":"chat.completion.chunk","created":1773345264,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_7cd1a06d3a","choices":[{"index":0,"delta":{"content":" "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"Zby0mr05uY"} + data: {"id":"chatcmpl-DuLdYWgDBTb4Am3saOR9aPajzKbJy","object":"chat.completion.chunk","created":1782321912,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_59e007eafa","choices":[{"index":0,"delta":{"content":" "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"0mpDoLeKIU"} - data: {"id":"chatcmpl-DIgOuEkd6Uqq8tPXdk2MbDIioWtU8","object":"chat.completion.chunk","created":1773345264,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_7cd1a06d3a","choices":[{"index":0,"delta":{"content":"3"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"QXvqz9CSR6"} + data: {"id":"chatcmpl-DuLdYWgDBTb4Am3saOR9aPajzKbJy","object":"chat.completion.chunk","created":1782321912,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_59e007eafa","choices":[{"index":0,"delta":{"content":"3"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"aP4oXIEB8l"} - data: {"id":"chatcmpl-DIgOuEkd6Uqq8tPXdk2MbDIioWtU8","object":"chat.completion.chunk","created":1773345264,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_7cd1a06d3a","choices":[{"index":0,"delta":{"content":" is"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"hb1heBYd"} + data: {"id":"chatcmpl-DuLdYWgDBTb4Am3saOR9aPajzKbJy","object":"chat.completion.chunk","created":1782321912,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_59e007eafa","choices":[{"index":0,"delta":{"content":" is"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"RLeuEkRw"} - data: {"id":"chatcmpl-DIgOuEkd6Uqq8tPXdk2MbDIioWtU8","object":"chat.completion.chunk","created":1773345264,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_7cd1a06d3a","choices":[{"index":0,"delta":{"content":" "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"EUG6qi40bZ"} + data: {"id":"chatcmpl-DuLdYWgDBTb4Am3saOR9aPajzKbJy","object":"chat.completion.chunk","created":1782321912,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_59e007eafa","choices":[{"index":0,"delta":{"content":" "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"a6Y75pmDvG"} - data: {"id":"chatcmpl-DIgOuEkd6Uqq8tPXdk2MbDIioWtU8","object":"chat.completion.chunk","created":1773345264,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_7cd1a06d3a","choices":[{"index":0,"delta":{"content":"5"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"pLrMiYkMuw"} + data: {"id":"chatcmpl-DuLdYWgDBTb4Am3saOR9aPajzKbJy","object":"chat.completion.chunk","created":1782321912,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_59e007eafa","choices":[{"index":0,"delta":{"content":"5"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"XUgGsNthBO"} - data: {"id":"chatcmpl-DIgOuEkd6Uqq8tPXdk2MbDIioWtU8","object":"chat.completion.chunk","created":1773345264,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_7cd1a06d3a","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"qTrg7i7BDa"} + data: {"id":"chatcmpl-DuLdYWgDBTb4Am3saOR9aPajzKbJy","object":"chat.completion.chunk","created":1782321912,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_59e007eafa","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"rbdPupzRUx"} - data: {"id":"chatcmpl-DIgOuEkd6Uqq8tPXdk2MbDIioWtU8","object":"chat.completion.chunk","created":1773345264,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_7cd1a06d3a","choices":[{"index":0,"delta":{"content":" and"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"sjLzOoh"} + data: {"id":"chatcmpl-DuLdYWgDBTb4Am3saOR9aPajzKbJy","object":"chat.completion.chunk","created":1782321912,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_59e007eafa","choices":[{"index":0,"delta":{"content":" and"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"K8YYhOH"} - data: {"id":"chatcmpl-DIgOuEkd6Uqq8tPXdk2MbDIioWtU8","object":"chat.completion.chunk","created":1773345264,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_7cd1a06d3a","choices":[{"index":0,"delta":{"content":" the"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"sSKfhps"} + data: {"id":"chatcmpl-DuLdYWgDBTb4Am3saOR9aPajzKbJy","object":"chat.completion.chunk","created":1782321912,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_59e007eafa","choices":[{"index":0,"delta":{"content":" the"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"qvjfz6T"} - data: {"id":"chatcmpl-DIgOuEkd6Uqq8tPXdk2MbDIioWtU8","object":"chat.completion.chunk","created":1773345264,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_7cd1a06d3a","choices":[{"index":0,"delta":{"content":" product"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"Hoz"} + data: {"id":"chatcmpl-DuLdYWgDBTb4Am3saOR9aPajzKbJy","object":"chat.completion.chunk","created":1782321912,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_59e007eafa","choices":[{"index":0,"delta":{"content":" product"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"Gc0"} - data: {"id":"chatcmpl-DIgOuEkd6Uqq8tPXdk2MbDIioWtU8","object":"chat.completion.chunk","created":1773345264,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_7cd1a06d3a","choices":[{"index":0,"delta":{"content":" of"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"K4INnxUr"} + data: {"id":"chatcmpl-DuLdYWgDBTb4Am3saOR9aPajzKbJy","object":"chat.completion.chunk","created":1782321912,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_59e007eafa","choices":[{"index":0,"delta":{"content":" of"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"u2ndNwuq"} - data: {"id":"chatcmpl-DIgOuEkd6Uqq8tPXdk2MbDIioWtU8","object":"chat.completion.chunk","created":1773345264,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_7cd1a06d3a","choices":[{"index":0,"delta":{"content":" "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"zVLvNRoJjQ"} + data: {"id":"chatcmpl-DuLdYWgDBTb4Am3saOR9aPajzKbJy","object":"chat.completion.chunk","created":1782321912,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_59e007eafa","choices":[{"index":0,"delta":{"content":" "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"MdtZxxneHV"} - data: {"id":"chatcmpl-DIgOuEkd6Uqq8tPXdk2MbDIioWtU8","object":"chat.completion.chunk","created":1773345264,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_7cd1a06d3a","choices":[{"index":0,"delta":{"content":"2"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"uDfLn970EF"} + data: {"id":"chatcmpl-DuLdYWgDBTb4Am3saOR9aPajzKbJy","object":"chat.completion.chunk","created":1782321912,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_59e007eafa","choices":[{"index":0,"delta":{"content":"2"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"eNAx758SXJ"} - data: {"id":"chatcmpl-DIgOuEkd6Uqq8tPXdk2MbDIioWtU8","object":"chat.completion.chunk","created":1773345264,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_7cd1a06d3a","choices":[{"index":0,"delta":{"content":" and"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"1WswduC"} + data: {"id":"chatcmpl-DuLdYWgDBTb4Am3saOR9aPajzKbJy","object":"chat.completion.chunk","created":1782321912,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_59e007eafa","choices":[{"index":0,"delta":{"content":" and"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"52ms73n"} - data: {"id":"chatcmpl-DIgOuEkd6Uqq8tPXdk2MbDIioWtU8","object":"chat.completion.chunk","created":1773345264,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_7cd1a06d3a","choices":[{"index":0,"delta":{"content":" "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"OzA4VE5hxx"} + data: {"id":"chatcmpl-DuLdYWgDBTb4Am3saOR9aPajzKbJy","object":"chat.completion.chunk","created":1782321912,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_59e007eafa","choices":[{"index":0,"delta":{"content":" "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"EBMiL2urba"} - data: {"id":"chatcmpl-DIgOuEkd6Uqq8tPXdk2MbDIioWtU8","object":"chat.completion.chunk","created":1773345264,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_7cd1a06d3a","choices":[{"index":0,"delta":{"content":"3"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"Li2BWG59Kg"} + data: {"id":"chatcmpl-DuLdYWgDBTb4Am3saOR9aPajzKbJy","object":"chat.completion.chunk","created":1782321912,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_59e007eafa","choices":[{"index":0,"delta":{"content":"3"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"NRJRPe5JY0"} - data: {"id":"chatcmpl-DIgOuEkd6Uqq8tPXdk2MbDIioWtU8","object":"chat.completion.chunk","created":1773345264,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_7cd1a06d3a","choices":[{"index":0,"delta":{"content":" is"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"zoFWV8hK"} + data: {"id":"chatcmpl-DuLdYWgDBTb4Am3saOR9aPajzKbJy","object":"chat.completion.chunk","created":1782321912,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_59e007eafa","choices":[{"index":0,"delta":{"content":" is"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"S9btOCTU"} - data: {"id":"chatcmpl-DIgOuEkd6Uqq8tPXdk2MbDIioWtU8","object":"chat.completion.chunk","created":1773345264,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_7cd1a06d3a","choices":[{"index":0,"delta":{"content":" "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"fRkwbjtnEL"} + data: {"id":"chatcmpl-DuLdYWgDBTb4Am3saOR9aPajzKbJy","object":"chat.completion.chunk","created":1782321912,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_59e007eafa","choices":[{"index":0,"delta":{"content":" "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"ExUjdIr2rV"} - data: {"id":"chatcmpl-DIgOuEkd6Uqq8tPXdk2MbDIioWtU8","object":"chat.completion.chunk","created":1773345264,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_7cd1a06d3a","choices":[{"index":0,"delta":{"content":"6"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"sj2SqrLm21"} + data: {"id":"chatcmpl-DuLdYWgDBTb4Am3saOR9aPajzKbJy","object":"chat.completion.chunk","created":1782321912,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_59e007eafa","choices":[{"index":0,"delta":{"content":"6"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"YVXTN1mzMj"} - data: {"id":"chatcmpl-DIgOuEkd6Uqq8tPXdk2MbDIioWtU8","object":"chat.completion.chunk","created":1773345264,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_7cd1a06d3a","choices":[{"index":0,"delta":{"content":"."},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"H5GxEzH5ir"} + data: {"id":"chatcmpl-DuLdYWgDBTb4Am3saOR9aPajzKbJy","object":"chat.completion.chunk","created":1782321912,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_59e007eafa","choices":[{"index":0,"delta":{"content":"."},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"TMf9r4xhXX"} - data: {"id":"chatcmpl-DIgOuEkd6Uqq8tPXdk2MbDIioWtU8","object":"chat.completion.chunk","created":1773345264,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_7cd1a06d3a","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}],"usage":null,"obfuscation":"Jkxho"} + data: {"id":"chatcmpl-DuLdYWgDBTb4Am3saOR9aPajzKbJy","object":"chat.completion.chunk","created":1782321912,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_59e007eafa","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}],"usage":null,"obfuscation":"hgMXz"} - data: {"id":"chatcmpl-DIgOuEkd6Uqq8tPXdk2MbDIioWtU8","object":"chat.completion.chunk","created":1773345264,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_7cd1a06d3a","choices":[],"usage":{"prompt_tokens":172,"completion_tokens":26,"total_tokens":198,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"G3Jrdl0n"} + data: {"id":"chatcmpl-DuLdYWgDBTb4Am3saOR9aPajzKbJy","object":"chat.completion.chunk","created":1782321912,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_59e007eafa","choices":[],"usage":{"prompt_tokens":172,"completion_tokens":26,"total_tokens":198,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"XdQeqDkb"} data: [DONE] @@ -144,4 +144,4 @@ interactions: - text/event-stream; charset=utf-8 status: 200 OK code: 200 - duration: 2.556743167s + duration: 772.578666ms diff --git a/providertests/testdata/TestOpenAICommon/openai-gpt-4o-mini/simple.yaml b/providertests/testdata/TestOpenAICommon/openai-gpt-4o-mini/simple.yaml index 1d9b12e93..e0e109f04 100644 --- a/providertests/testdata/TestOpenAICommon/openai-gpt-4o-mini/simple.yaml +++ b/providertests/testdata/TestOpenAICommon/openai-gpt-4o-mini/simple.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://api.openai.com/v1/chat/completions method: POST response: @@ -26,9 +26,9 @@ interactions: uncompressed: true body: | { - "id": "chatcmpl-DIgOi0wgNHF0PWeEoYnbNXVQaA7a3", + "id": "chatcmpl-DuLdOKeSvJ2ah93ut8DRAVP44PlmE", "object": "chat.completion", - "created": 1773345252, + "created": 1782321902, "model": "gpt-4o-mini-2024-07-18", "choices": [ { @@ -59,11 +59,11 @@ interactions: } }, "service_tier": "default", - "system_fingerprint": "fp_a1681c17ec" + "system_fingerprint": "fp_bbc23ca3d7" } headers: Content-Type: - application/json status: 200 OK code: 200 - duration: 1.318546791s + duration: 608.021ms diff --git a/providertests/testdata/TestOpenAICommon/openai-gpt-4o-mini/simple_streaming.yaml b/providertests/testdata/TestOpenAICommon/openai-gpt-4o-mini/simple_streaming.yaml index 89b956304..e46fc1ab7 100644 --- a/providertests/testdata/TestOpenAICommon/openai-gpt-4o-mini/simple_streaming.yaml +++ b/providertests/testdata/TestOpenAICommon/openai-gpt-4o-mini/simple_streaming.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://api.openai.com/v1/chat/completions method: POST response: @@ -24,15 +24,15 @@ interactions: proto_minor: 0 content_length: -1 body: |+ - data: {"id":"chatcmpl-DIgOjQDzOMnHOjRXh6hE6jYDE9H1R","object":"chat.completion.chunk","created":1773345253,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_a1681c17ec","choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"EMaSS8R31"} + data: {"id":"chatcmpl-DuLdOuviL2tiVxMim6HmX4YMnCorK","object":"chat.completion.chunk","created":1782321902,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_bbc23ca3d7","choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"yS7A7FhhV"} - data: {"id":"chatcmpl-DIgOjQDzOMnHOjRXh6hE6jYDE9H1R","object":"chat.completion.chunk","created":1773345253,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_a1681c17ec","choices":[{"index":0,"delta":{"content":"Olá"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"LMZtYIzA"} + data: {"id":"chatcmpl-DuLdOuviL2tiVxMim6HmX4YMnCorK","object":"chat.completion.chunk","created":1782321902,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_bbc23ca3d7","choices":[{"index":0,"delta":{"content":"Olá"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"TuWnytCa"} - data: {"id":"chatcmpl-DIgOjQDzOMnHOjRXh6hE6jYDE9H1R","object":"chat.completion.chunk","created":1773345253,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_a1681c17ec","choices":[{"index":0,"delta":{"content":"!"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"EMk88ywTIH"} + data: {"id":"chatcmpl-DuLdOuviL2tiVxMim6HmX4YMnCorK","object":"chat.completion.chunk","created":1782321902,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_bbc23ca3d7","choices":[{"index":0,"delta":{"content":"!"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"D1BuwrjA1C"} - data: {"id":"chatcmpl-DIgOjQDzOMnHOjRXh6hE6jYDE9H1R","object":"chat.completion.chunk","created":1773345253,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_a1681c17ec","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}],"usage":null,"obfuscation":"EDwkM"} + data: {"id":"chatcmpl-DuLdOuviL2tiVxMim6HmX4YMnCorK","object":"chat.completion.chunk","created":1782321902,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_bbc23ca3d7","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}],"usage":null,"obfuscation":"cw1RS"} - data: {"id":"chatcmpl-DIgOjQDzOMnHOjRXh6hE6jYDE9H1R","object":"chat.completion.chunk","created":1773345253,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_a1681c17ec","choices":[],"usage":{"prompt_tokens":20,"completion_tokens":2,"total_tokens":22,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"IdvJnRouyrt"} + data: {"id":"chatcmpl-DuLdOuviL2tiVxMim6HmX4YMnCorK","object":"chat.completion.chunk","created":1782321902,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_bbc23ca3d7","choices":[],"usage":{"prompt_tokens":20,"completion_tokens":2,"total_tokens":22,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"eScNPVmGYP3"} data: [DONE] @@ -41,4 +41,4 @@ interactions: - text/event-stream; charset=utf-8 status: 200 OK code: 200 - duration: 1.139285s + duration: 727.245709ms diff --git a/providertests/testdata/TestOpenAICommon/openai-gpt-4o-mini/tool.yaml b/providertests/testdata/TestOpenAICommon/openai-gpt-4o-mini/tool.yaml index 3072a1dd1..57ca8f3dd 100644 --- a/providertests/testdata/TestOpenAICommon/openai-gpt-4o-mini/tool.yaml +++ b/providertests/testdata/TestOpenAICommon/openai-gpt-4o-mini/tool.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://api.openai.com/v1/chat/completions method: POST response: @@ -26,9 +26,9 @@ interactions: uncompressed: true body: | { - "id": "chatcmpl-DIgOk3gewlmBhJ4mFyuXsOd49PGCv", + "id": "chatcmpl-DuLdP8CI4un8TWs1V8tS3xfFpq7Ta", "object": "chat.completion", - "created": 1773345254, + "created": 1782321903, "model": "gpt-4o-mini-2024-07-18", "choices": [ { @@ -38,7 +38,7 @@ interactions: "content": null, "tool_calls": [ { - "id": "call_Uc7i7ZjQl7pcDrnYSnUx8sEy", + "id": "call_15X0Q2MmkK1IeFfiol9LFlqb", "type": "function", "function": { "name": "weather", @@ -69,14 +69,14 @@ interactions: } }, "service_tier": "default", - "system_fingerprint": "fp_a1681c17ec" + "system_fingerprint": "fp_51b9c32e14" } headers: Content-Type: - application/json status: 200 OK code: 200 - duration: 1.030302416s + duration: 1.508598708s - id: 1 request: proto: HTTP/1.1 @@ -84,14 +84,14 @@ interactions: proto_minor: 1 content_length: 705 host: "" - body: '{"messages":[{"content":"You are a helpful assistant","role":"system"},{"content":"What''s the weather in Florence,Italy?","role":"user"},{"tool_calls":[{"id":"call_Uc7i7ZjQl7pcDrnYSnUx8sEy","function":{"arguments":"{\"location\":\"Florence, Italy\"}","name":"weather"},"type":"function"}],"role":"assistant"},{"content":"40 C","tool_call_id":"call_Uc7i7ZjQl7pcDrnYSnUx8sEy","role":"tool"}],"model":"gpt-4o-mini","max_tokens":4000,"tool_choice":"auto","tools":[{"function":{"name":"weather","strict":false,"description":"Get weather information for a location","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"}},"type":"function"}]}' + body: '{"messages":[{"content":"You are a helpful assistant","role":"system"},{"content":"What''s the weather in Florence,Italy?","role":"user"},{"tool_calls":[{"id":"call_15X0Q2MmkK1IeFfiol9LFlqb","function":{"arguments":"{\"location\":\"Florence, Italy\"}","name":"weather"},"type":"function"}],"role":"assistant"},{"content":"40 C","tool_call_id":"call_15X0Q2MmkK1IeFfiol9LFlqb","role":"tool"}],"model":"gpt-4o-mini","max_tokens":4000,"tool_choice":"auto","tools":[{"function":{"name":"weather","strict":false,"description":"Get weather information for a location","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"}},"type":"function"}]}' headers: Accept: - application/json Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://api.openai.com/v1/chat/completions method: POST response: @@ -102,16 +102,16 @@ interactions: uncompressed: true body: | { - "id": "chatcmpl-DIgOlYuRMeVlZ68uQ38PADSFTUQ72", + "id": "chatcmpl-DuLdRO4UKukXzWLIIHKFM5Rxu03mY", "object": "chat.completion", - "created": 1773345255, + "created": 1782321905, "model": "gpt-4o-mini-2024-07-18", "choices": [ { "index": 0, "message": { "role": "assistant", - "content": "The weather in Florence, Italy is currently 40°C.", + "content": "The current weather in Florence, Italy is 40°C.", "refusal": null, "annotations": [] }, @@ -135,11 +135,11 @@ interactions: } }, "service_tier": "default", - "system_fingerprint": "fp_a1681c17ec" + "system_fingerprint": "fp_51b9c32e14" } headers: Content-Type: - application/json status: 200 OK code: 200 - duration: 798.836292ms + duration: 686.915667ms diff --git a/providertests/testdata/TestOpenAICommon/openai-gpt-4o-mini/tool_streaming.yaml b/providertests/testdata/TestOpenAICommon/openai-gpt-4o-mini/tool_streaming.yaml index 72cf9c5d3..be611fa3b 100644 --- a/providertests/testdata/TestOpenAICommon/openai-gpt-4o-mini/tool_streaming.yaml +++ b/providertests/testdata/TestOpenAICommon/openai-gpt-4o-mini/tool_streaming.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://api.openai.com/v1/chat/completions method: POST response: @@ -24,27 +24,27 @@ interactions: proto_minor: 0 content_length: -1 body: |+ - data: {"id":"chatcmpl-DIgOoYfoXo6zS9kmetYbWUShG5Dhl","object":"chat.completion.chunk","created":1773345258,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_a1681c17ec","choices":[{"index":0,"delta":{"role":"assistant","content":null,"tool_calls":[{"index":0,"id":"call_XErNUDi099mgWToFoqmibkKR","type":"function","function":{"name":"weather","arguments":""}}],"refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"8oRX7pI1"} + data: {"id":"chatcmpl-DuLdRJdgsTDkaWQbovITznUPevjfI","object":"chat.completion.chunk","created":1782321905,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_51b9c32e14","choices":[{"index":0,"delta":{"role":"assistant","content":null,"tool_calls":[{"index":0,"id":"call_qLFv8oQOs68qRuEVmG8TuEJp","type":"function","function":{"name":"weather","arguments":""}}],"refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"yxX80dGA"} - data: {"id":"chatcmpl-DIgOoYfoXo6zS9kmetYbWUShG5Dhl","object":"chat.completion.chunk","created":1773345258,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_a1681c17ec","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"{\""}}]},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"e65aHQEPK8iPfV"} + data: {"id":"chatcmpl-DuLdRJdgsTDkaWQbovITznUPevjfI","object":"chat.completion.chunk","created":1782321905,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_51b9c32e14","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"{\""}}]},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"F9iNLFh1z1gO2v"} - data: {"id":"chatcmpl-DIgOoYfoXo6zS9kmetYbWUShG5Dhl","object":"chat.completion.chunk","created":1773345258,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_a1681c17ec","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"location"}}]},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"p2m8oASmu"} + data: {"id":"chatcmpl-DuLdRJdgsTDkaWQbovITznUPevjfI","object":"chat.completion.chunk","created":1782321905,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_51b9c32e14","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"location"}}]},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"uo0zshnTB"} - data: {"id":"chatcmpl-DIgOoYfoXo6zS9kmetYbWUShG5Dhl","object":"chat.completion.chunk","created":1773345258,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_a1681c17ec","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"\":\""}}]},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"0qqtI2gKFGte"} + data: {"id":"chatcmpl-DuLdRJdgsTDkaWQbovITznUPevjfI","object":"chat.completion.chunk","created":1782321905,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_51b9c32e14","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"\":\""}}]},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"4OrXXCZa3ih4"} - data: {"id":"chatcmpl-DIgOoYfoXo6zS9kmetYbWUShG5Dhl","object":"chat.completion.chunk","created":1773345258,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_a1681c17ec","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"Flor"}}]},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"4giRkUUQzoYHi"} + data: {"id":"chatcmpl-DuLdRJdgsTDkaWQbovITznUPevjfI","object":"chat.completion.chunk","created":1782321905,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_51b9c32e14","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"Flor"}}]},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"SRWgoLPvoEJAt"} - data: {"id":"chatcmpl-DIgOoYfoXo6zS9kmetYbWUShG5Dhl","object":"chat.completion.chunk","created":1773345258,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_a1681c17ec","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"ence"}}]},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"Csa2Nw3twNpj8"} + data: {"id":"chatcmpl-DuLdRJdgsTDkaWQbovITznUPevjfI","object":"chat.completion.chunk","created":1782321905,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_51b9c32e14","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"ence"}}]},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"Txa2flqei5725"} - data: {"id":"chatcmpl-DIgOoYfoXo6zS9kmetYbWUShG5Dhl","object":"chat.completion.chunk","created":1773345258,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_a1681c17ec","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":","}}]},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":""} + data: {"id":"chatcmpl-DuLdRJdgsTDkaWQbovITznUPevjfI","object":"chat.completion.chunk","created":1782321905,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_51b9c32e14","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":","}}]},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":""} - data: {"id":"chatcmpl-DIgOoYfoXo6zS9kmetYbWUShG5Dhl","object":"chat.completion.chunk","created":1773345258,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_a1681c17ec","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" Italy"}}]},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"JnmXDVfI7YV"} + data: {"id":"chatcmpl-DuLdRJdgsTDkaWQbovITznUPevjfI","object":"chat.completion.chunk","created":1782321905,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_51b9c32e14","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"Italy"}}]},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"akBAoXC9dHGV"} - data: {"id":"chatcmpl-DIgOoYfoXo6zS9kmetYbWUShG5Dhl","object":"chat.completion.chunk","created":1773345258,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_a1681c17ec","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"\"}"}}]},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"BLMNTFueRdKI86"} + data: {"id":"chatcmpl-DuLdRJdgsTDkaWQbovITznUPevjfI","object":"chat.completion.chunk","created":1782321905,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_51b9c32e14","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"\"}"}}]},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"L5oYL89NOoYpZ5"} - data: {"id":"chatcmpl-DIgOoYfoXo6zS9kmetYbWUShG5Dhl","object":"chat.completion.chunk","created":1773345258,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_a1681c17ec","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"tool_calls"}],"usage":null,"obfuscation":"oXtxunLJ6zZiVak"} + data: {"id":"chatcmpl-DuLdRJdgsTDkaWQbovITznUPevjfI","object":"chat.completion.chunk","created":1782321905,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_51b9c32e14","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"tool_calls"}],"usage":null,"obfuscation":"KU9IrU4nKN1B8Jq"} - data: {"id":"chatcmpl-DIgOoYfoXo6zS9kmetYbWUShG5Dhl","object":"chat.completion.chunk","created":1773345258,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_a1681c17ec","choices":[],"usage":{"prompt_tokens":61,"completion_tokens":16,"total_tokens":77,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"lQh7fF5Szf"} + data: {"id":"chatcmpl-DuLdRJdgsTDkaWQbovITznUPevjfI","object":"chat.completion.chunk","created":1782321905,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_51b9c32e14","choices":[],"usage":{"prompt_tokens":61,"completion_tokens":16,"total_tokens":77,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"VyVtGXSdkS"} data: [DONE] @@ -53,22 +53,22 @@ interactions: - text/event-stream; charset=utf-8 status: 200 OK code: 200 - duration: 2.459145959s + duration: 764.811375ms - id: 1 request: proto: HTTP/1.1 proto_major: 1 proto_minor: 1 - content_length: 759 + content_length: 758 host: "" - body: '{"messages":[{"content":"You are a helpful assistant","role":"system"},{"content":"What''s the weather in Florence,Italy?","role":"user"},{"tool_calls":[{"id":"call_XErNUDi099mgWToFoqmibkKR","function":{"arguments":"{\"location\":\"Florence, Italy\"}","name":"weather"},"type":"function"}],"role":"assistant"},{"content":"40 C","tool_call_id":"call_XErNUDi099mgWToFoqmibkKR","role":"tool"}],"model":"gpt-4o-mini","max_tokens":4000,"stream_options":{"include_usage":true},"tool_choice":"auto","tools":[{"function":{"name":"weather","strict":false,"description":"Get weather information for a location","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"}},"type":"function"}],"stream":true}' + body: '{"messages":[{"content":"You are a helpful assistant","role":"system"},{"content":"What''s the weather in Florence,Italy?","role":"user"},{"tool_calls":[{"id":"call_qLFv8oQOs68qRuEVmG8TuEJp","function":{"arguments":"{\"location\":\"Florence,Italy\"}","name":"weather"},"type":"function"}],"role":"assistant"},{"content":"40 C","tool_call_id":"call_qLFv8oQOs68qRuEVmG8TuEJp","role":"tool"}],"model":"gpt-4o-mini","max_tokens":4000,"stream_options":{"include_usage":true},"tool_choice":"auto","tools":[{"function":{"name":"weather","strict":false,"description":"Get weather information for a location","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"}},"type":"function"}],"stream":true}' headers: Accept: - application/json Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://api.openai.com/v1/chat/completions method: POST response: @@ -77,37 +77,35 @@ interactions: proto_minor: 0 content_length: -1 body: |+ - data: {"id":"chatcmpl-DIgOoZgbGnQLjS6lVv4L1jjouBbQN","object":"chat.completion.chunk","created":1773345258,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_a1681c17ec","choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"d9W4jhR2Q"} + data: {"id":"chatcmpl-DuLdSir8kzAQMIjRl1tG2YC59CjR1","object":"chat.completion.chunk","created":1782321906,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_51b9c32e14","choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"H1cXdonj3"} - data: {"id":"chatcmpl-DIgOoZgbGnQLjS6lVv4L1jjouBbQN","object":"chat.completion.chunk","created":1773345258,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_a1681c17ec","choices":[{"index":0,"delta":{"content":"The"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"RxX2JDg2"} + data: {"id":"chatcmpl-DuLdSir8kzAQMIjRl1tG2YC59CjR1","object":"chat.completion.chunk","created":1782321906,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_51b9c32e14","choices":[{"index":0,"delta":{"content":"The"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"co1AgmWP"} - data: {"id":"chatcmpl-DIgOoZgbGnQLjS6lVv4L1jjouBbQN","object":"chat.completion.chunk","created":1773345258,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_a1681c17ec","choices":[{"index":0,"delta":{"content":" current"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"2de"} + data: {"id":"chatcmpl-DuLdSir8kzAQMIjRl1tG2YC59CjR1","object":"chat.completion.chunk","created":1782321906,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_51b9c32e14","choices":[{"index":0,"delta":{"content":" current"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"FKp"} - data: {"id":"chatcmpl-DIgOoZgbGnQLjS6lVv4L1jjouBbQN","object":"chat.completion.chunk","created":1773345258,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_a1681c17ec","choices":[{"index":0,"delta":{"content":" weather"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"uBL"} + data: {"id":"chatcmpl-DuLdSir8kzAQMIjRl1tG2YC59CjR1","object":"chat.completion.chunk","created":1782321906,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_51b9c32e14","choices":[{"index":0,"delta":{"content":" temperature"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"9OqQAwIRlxrwiz2"} - data: {"id":"chatcmpl-DIgOoZgbGnQLjS6lVv4L1jjouBbQN","object":"chat.completion.chunk","created":1773345258,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_a1681c17ec","choices":[{"index":0,"delta":{"content":" in"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"bnNxmJcu"} + data: {"id":"chatcmpl-DuLdSir8kzAQMIjRl1tG2YC59CjR1","object":"chat.completion.chunk","created":1782321906,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_51b9c32e14","choices":[{"index":0,"delta":{"content":" in"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"GC1MsOgE"} - data: {"id":"chatcmpl-DIgOoZgbGnQLjS6lVv4L1jjouBbQN","object":"chat.completion.chunk","created":1773345258,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_a1681c17ec","choices":[{"index":0,"delta":{"content":" Florence"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"ih"} + data: {"id":"chatcmpl-DuLdSir8kzAQMIjRl1tG2YC59CjR1","object":"chat.completion.chunk","created":1782321906,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_51b9c32e14","choices":[{"index":0,"delta":{"content":" Florence"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"Ha"} - data: {"id":"chatcmpl-DIgOoZgbGnQLjS6lVv4L1jjouBbQN","object":"chat.completion.chunk","created":1773345258,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_a1681c17ec","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"E5r2OnVUvN"} + data: {"id":"chatcmpl-DuLdSir8kzAQMIjRl1tG2YC59CjR1","object":"chat.completion.chunk","created":1782321906,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_51b9c32e14","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"sxnOuy2lZk"} - data: {"id":"chatcmpl-DIgOoZgbGnQLjS6lVv4L1jjouBbQN","object":"chat.completion.chunk","created":1773345258,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_a1681c17ec","choices":[{"index":0,"delta":{"content":" Italy"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"nkCRe"} + data: {"id":"chatcmpl-DuLdSir8kzAQMIjRl1tG2YC59CjR1","object":"chat.completion.chunk","created":1782321906,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_51b9c32e14","choices":[{"index":0,"delta":{"content":" Italy"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"xy9od"} - data: {"id":"chatcmpl-DIgOoZgbGnQLjS6lVv4L1jjouBbQN","object":"chat.completion.chunk","created":1773345258,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_a1681c17ec","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"c7agRoxZtL"} + data: {"id":"chatcmpl-DuLdSir8kzAQMIjRl1tG2YC59CjR1","object":"chat.completion.chunk","created":1782321906,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_51b9c32e14","choices":[{"index":0,"delta":{"content":" is"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"cIBC4WsJ"} - data: {"id":"chatcmpl-DIgOoZgbGnQLjS6lVv4L1jjouBbQN","object":"chat.completion.chunk","created":1773345258,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_a1681c17ec","choices":[{"index":0,"delta":{"content":" is"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"v4wHx0z7"} + data: {"id":"chatcmpl-DuLdSir8kzAQMIjRl1tG2YC59CjR1","object":"chat.completion.chunk","created":1782321906,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_51b9c32e14","choices":[{"index":0,"delta":{"content":" "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"R7b9Wg6MPV"} - data: {"id":"chatcmpl-DIgOoZgbGnQLjS6lVv4L1jjouBbQN","object":"chat.completion.chunk","created":1773345258,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_a1681c17ec","choices":[{"index":0,"delta":{"content":" "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"NiwZnu2XCJ"} + data: {"id":"chatcmpl-DuLdSir8kzAQMIjRl1tG2YC59CjR1","object":"chat.completion.chunk","created":1782321906,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_51b9c32e14","choices":[{"index":0,"delta":{"content":"40"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"htFX5s6e0"} - data: {"id":"chatcmpl-DIgOoZgbGnQLjS6lVv4L1jjouBbQN","object":"chat.completion.chunk","created":1773345258,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_a1681c17ec","choices":[{"index":0,"delta":{"content":"40"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"1U6vC0Gys"} + data: {"id":"chatcmpl-DuLdSir8kzAQMIjRl1tG2YC59CjR1","object":"chat.completion.chunk","created":1782321906,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_51b9c32e14","choices":[{"index":0,"delta":{"content":"°C"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"hypcsEaeF"} - data: {"id":"chatcmpl-DIgOoZgbGnQLjS6lVv4L1jjouBbQN","object":"chat.completion.chunk","created":1773345258,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_a1681c17ec","choices":[{"index":0,"delta":{"content":"°C"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"Kpm3jGVsv"} + data: {"id":"chatcmpl-DuLdSir8kzAQMIjRl1tG2YC59CjR1","object":"chat.completion.chunk","created":1782321906,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_51b9c32e14","choices":[{"index":0,"delta":{"content":"."},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"301CwehwyQ"} - data: {"id":"chatcmpl-DIgOoZgbGnQLjS6lVv4L1jjouBbQN","object":"chat.completion.chunk","created":1773345258,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_a1681c17ec","choices":[{"index":0,"delta":{"content":"."},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"1jiir8qG5L"} + data: {"id":"chatcmpl-DuLdSir8kzAQMIjRl1tG2YC59CjR1","object":"chat.completion.chunk","created":1782321906,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_51b9c32e14","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}],"usage":null,"obfuscation":"Lpkab"} - data: {"id":"chatcmpl-DIgOoZgbGnQLjS6lVv4L1jjouBbQN","object":"chat.completion.chunk","created":1773345258,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_a1681c17ec","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}],"usage":null,"obfuscation":"rBR4p"} - - data: {"id":"chatcmpl-DIgOoZgbGnQLjS6lVv4L1jjouBbQN","object":"chat.completion.chunk","created":1773345258,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_a1681c17ec","choices":[],"usage":{"prompt_tokens":86,"completion_tokens":14,"total_tokens":100,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"4l6fU0Kp9"} + data: {"id":"chatcmpl-DuLdSir8kzAQMIjRl1tG2YC59CjR1","object":"chat.completion.chunk","created":1782321906,"model":"gpt-4o-mini-2024-07-18","service_tier":"default","system_fingerprint":"fp_51b9c32e14","choices":[],"usage":{"prompt_tokens":86,"completion_tokens":13,"total_tokens":99,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"qzXirRfm5I"} data: [DONE] @@ -116,4 +114,4 @@ interactions: - text/event-stream; charset=utf-8 status: 200 OK code: 200 - duration: 488.971083ms + duration: 549.256209ms diff --git a/providertests/testdata/TestOpenAICommon/openai-gpt-4o/multi_tool.yaml b/providertests/testdata/TestOpenAICommon/openai-gpt-4o/multi_tool.yaml index eadc31f04..c014259bd 100644 --- a/providertests/testdata/TestOpenAICommon/openai-gpt-4o/multi_tool.yaml +++ b/providertests/testdata/TestOpenAICommon/openai-gpt-4o/multi_tool.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://api.openai.com/v1/chat/completions method: POST response: @@ -26,9 +26,9 @@ interactions: uncompressed: true body: | { - "id": "chatcmpl-DIgObeNUTgd3mKUPL1g6ygkN3DvM3", + "id": "chatcmpl-DuLdJw8LrXaHfxHUWoGkO4mQLLtEk", "object": "chat.completion", - "created": 1773345245, + "created": 1782321897, "model": "gpt-4o-2024-08-06", "choices": [ { @@ -38,7 +38,7 @@ interactions: "content": null, "tool_calls": [ { - "id": "call_NcgoJ9yG7B80xYdhs8G5ISBr", + "id": "call_fifE5poZ3dg3JDUKGFi48NGq", "type": "function", "function": { "name": "add", @@ -46,7 +46,7 @@ interactions: } }, { - "id": "call_aQxN06JVJjD8r0thA3lblynG", + "id": "call_cvvIly4eGLZUYOMhAviT8jAF", "type": "function", "function": { "name": "multiply", @@ -77,14 +77,14 @@ interactions: } }, "service_tier": "default", - "system_fingerprint": "fp_44968754fe" + "system_fingerprint": "fp_683410201e" } headers: Content-Type: - application/json status: 200 OK code: 200 - duration: 936.560625ms + duration: 1.105662625s - id: 1 request: proto: HTTP/1.1 @@ -92,14 +92,14 @@ interactions: proto_minor: 1 content_length: 1242 host: "" - body: '{"messages":[{"content":"You are a helpful assistant. CRITICAL: Always use both add and multiply at the same time ALWAYS.","role":"system"},{"content":"Add and multiply the number 2 and 3","role":"user"},{"tool_calls":[{"id":"call_NcgoJ9yG7B80xYdhs8G5ISBr","function":{"arguments":"{\"a\": 2, \"b\": 3}","name":"add"},"type":"function"},{"id":"call_aQxN06JVJjD8r0thA3lblynG","function":{"arguments":"{\"a\": 2, \"b\": 3}","name":"multiply"},"type":"function"}],"role":"assistant"},{"content":"5","tool_call_id":"call_NcgoJ9yG7B80xYdhs8G5ISBr","role":"tool"},{"content":"6","tool_call_id":"call_aQxN06JVJjD8r0thA3lblynG","role":"tool"}],"model":"gpt-4o","max_tokens":4000,"tool_choice":"auto","tools":[{"function":{"name":"add","strict":false,"description":"Add two numbers","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"}},"type":"function"},{"function":{"name":"multiply","strict":false,"description":"Multiply two numbers","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"}},"type":"function"}]}' + body: '{"messages":[{"content":"You are a helpful assistant. CRITICAL: Always use both add and multiply at the same time ALWAYS.","role":"system"},{"content":"Add and multiply the number 2 and 3","role":"user"},{"tool_calls":[{"id":"call_fifE5poZ3dg3JDUKGFi48NGq","function":{"arguments":"{\"a\": 2, \"b\": 3}","name":"add"},"type":"function"},{"id":"call_cvvIly4eGLZUYOMhAviT8jAF","function":{"arguments":"{\"a\": 2, \"b\": 3}","name":"multiply"},"type":"function"}],"role":"assistant"},{"content":"5","tool_call_id":"call_fifE5poZ3dg3JDUKGFi48NGq","role":"tool"},{"content":"6","tool_call_id":"call_cvvIly4eGLZUYOMhAviT8jAF","role":"tool"}],"model":"gpt-4o","max_tokens":4000,"tool_choice":"auto","tools":[{"function":{"name":"add","strict":false,"description":"Add two numbers","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"}},"type":"function"},{"function":{"name":"multiply","strict":false,"description":"Multiply two numbers","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"}},"type":"function"}]}' headers: Accept: - application/json Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://api.openai.com/v1/chat/completions method: POST response: @@ -110,9 +110,9 @@ interactions: uncompressed: true body: | { - "id": "chatcmpl-DIgOcsNyS14lIbIkrInRiwiEleYkg", + "id": "chatcmpl-DuLdL7Zz4iHqgl5WrFxQFnJ1CvSsK", "object": "chat.completion", - "created": 1773345246, + "created": 1782321899, "model": "gpt-4o-2024-08-06", "choices": [ { @@ -143,11 +143,11 @@ interactions: } }, "service_tier": "default", - "system_fingerprint": "fp_44968754fe" + "system_fingerprint": "fp_683410201e" } headers: Content-Type: - application/json status: 200 OK code: 200 - duration: 1.17854075s + duration: 1.479770541s diff --git a/providertests/testdata/TestOpenAICommon/openai-gpt-4o/multi_tool_streaming.yaml b/providertests/testdata/TestOpenAICommon/openai-gpt-4o/multi_tool_streaming.yaml index bdf2e29e2..62127d966 100644 --- a/providertests/testdata/TestOpenAICommon/openai-gpt-4o/multi_tool_streaming.yaml +++ b/providertests/testdata/TestOpenAICommon/openai-gpt-4o/multi_tool_streaming.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://api.openai.com/v1/chat/completions method: POST response: @@ -24,31 +24,31 @@ interactions: proto_minor: 0 content_length: -1 body: |+ - data: {"id":"chatcmpl-DIgOgnbt21sEHKKTkWWAUf2BiMy3T","object":"chat.completion.chunk","created":1773345250,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_b7c8e3f100","usage":null,"choices":[{"index":0,"delta":{"role":"assistant","content":null},"logprobs":null,"finish_reason":null}],"obfuscation":"iVMxB4bDtxB"} + data: {"id":"chatcmpl-DuLdMEdkw5VsZSxKY3i9G934hT7LM","object":"chat.completion.chunk","created":1782321900,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_4fa7959453","usage":null,"choices":[{"index":0,"delta":{"role":"assistant","content":null},"logprobs":null,"finish_reason":null}],"obfuscation":"ZvYJfUINRWi"} - data: {"id":"chatcmpl-DIgOgnbt21sEHKKTkWWAUf2BiMy3T","object":"chat.completion.chunk","created":1773345250,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_b7c8e3f100","usage":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"id":"call_lhJr4dWBxpVpf9LjGfERTy62","type":"function","function":{"name":"add","arguments":""}}]},"logprobs":null,"finish_reason":null}],"obfuscation":"KE"} + data: {"id":"chatcmpl-DuLdMEdkw5VsZSxKY3i9G934hT7LM","object":"chat.completion.chunk","created":1782321900,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_4fa7959453","usage":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"id":"call_ehIWdjL1abZk1h8FWGLQ0Hie","type":"function","function":{"name":"add","arguments":""}}]},"logprobs":null,"finish_reason":null}],"obfuscation":"zu"} - data: {"id":"chatcmpl-DIgOgnbt21sEHKKTkWWAUf2BiMy3T","object":"chat.completion.chunk","created":1773345250,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_b7c8e3f100","usage":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"{\"a\""}}]},"logprobs":null,"finish_reason":null}],"obfuscation":""} + data: {"id":"chatcmpl-DuLdMEdkw5VsZSxKY3i9G934hT7LM","object":"chat.completion.chunk","created":1782321900,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_4fa7959453","usage":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"{\"a\""}}]},"logprobs":null,"finish_reason":null}],"obfuscation":""} - data: {"id":"chatcmpl-DIgOgnbt21sEHKKTkWWAUf2BiMy3T","object":"chat.completion.chunk","created":1773345250,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_b7c8e3f100","usage":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":": 2, "}}]},"logprobs":null,"finish_reason":null}],"obfuscation":"S"} + data: {"id":"chatcmpl-DuLdMEdkw5VsZSxKY3i9G934hT7LM","object":"chat.completion.chunk","created":1782321900,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_4fa7959453","usage":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":": 2, "}}]},"logprobs":null,"finish_reason":null}],"obfuscation":"m"} - data: {"id":"chatcmpl-DIgOgnbt21sEHKKTkWWAUf2BiMy3T","object":"chat.completion.chunk","created":1773345250,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_b7c8e3f100","usage":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"\"b\": 3"}}]},"logprobs":null,"finish_reason":null}],"obfuscation":"Bx6KS6Kn5SaKPa"} + data: {"id":"chatcmpl-DuLdMEdkw5VsZSxKY3i9G934hT7LM","object":"chat.completion.chunk","created":1782321900,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_4fa7959453","usage":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"\"b\": 3"}}]},"logprobs":null,"finish_reason":null}],"obfuscation":"nsrdAagU8qzJ7f"} - data: {"id":"chatcmpl-DIgOgnbt21sEHKKTkWWAUf2BiMy3T","object":"chat.completion.chunk","created":1773345250,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_b7c8e3f100","usage":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"}"}}]},"logprobs":null,"finish_reason":null}],"obfuscation":"6608q"} + data: {"id":"chatcmpl-DuLdMEdkw5VsZSxKY3i9G934hT7LM","object":"chat.completion.chunk","created":1782321900,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_4fa7959453","usage":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"}"}}]},"logprobs":null,"finish_reason":null}],"obfuscation":"KpuIU"} - data: {"id":"chatcmpl-DIgOgnbt21sEHKKTkWWAUf2BiMy3T","object":"chat.completion.chunk","created":1773345250,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_b7c8e3f100","usage":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":1,"id":"call_o97Fs8Ray28WjwotGOcB6vXB","type":"function","function":{"name":"multiply","arguments":""}}]},"logprobs":null,"finish_reason":null}],"obfuscation":"WBOuHOUc04gzs"} + data: {"id":"chatcmpl-DuLdMEdkw5VsZSxKY3i9G934hT7LM","object":"chat.completion.chunk","created":1782321900,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_4fa7959453","usage":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":1,"id":"call_fBSgA47J5VeONggizTIvl7AH","type":"function","function":{"name":"multiply","arguments":""}}]},"logprobs":null,"finish_reason":null}],"obfuscation":"mAgBTWJHyqam0"} - data: {"id":"chatcmpl-DIgOgnbt21sEHKKTkWWAUf2BiMy3T","object":"chat.completion.chunk","created":1773345250,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_b7c8e3f100","usage":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":1,"function":{"arguments":"{\"a\""}}]},"logprobs":null,"finish_reason":null}],"obfuscation":""} + data: {"id":"chatcmpl-DuLdMEdkw5VsZSxKY3i9G934hT7LM","object":"chat.completion.chunk","created":1782321900,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_4fa7959453","usage":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":1,"function":{"arguments":"{\"a\""}}]},"logprobs":null,"finish_reason":null}],"obfuscation":""} - data: {"id":"chatcmpl-DIgOgnbt21sEHKKTkWWAUf2BiMy3T","object":"chat.completion.chunk","created":1773345250,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_b7c8e3f100","usage":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":1,"function":{"arguments":": 2, "}}]},"logprobs":null,"finish_reason":null}],"obfuscation":"h"} + data: {"id":"chatcmpl-DuLdMEdkw5VsZSxKY3i9G934hT7LM","object":"chat.completion.chunk","created":1782321900,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_4fa7959453","usage":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":1,"function":{"arguments":": 2, "}}]},"logprobs":null,"finish_reason":null}],"obfuscation":"6"} - data: {"id":"chatcmpl-DIgOgnbt21sEHKKTkWWAUf2BiMy3T","object":"chat.completion.chunk","created":1773345250,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_b7c8e3f100","usage":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":1,"function":{"arguments":"\"b\": 3"}}]},"logprobs":null,"finish_reason":null}],"obfuscation":"n5afZuErja0bFi"} + data: {"id":"chatcmpl-DuLdMEdkw5VsZSxKY3i9G934hT7LM","object":"chat.completion.chunk","created":1782321900,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_4fa7959453","usage":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":1,"function":{"arguments":"\"b\": 3"}}]},"logprobs":null,"finish_reason":null}],"obfuscation":"EfUIWvkkOkEzjT"} - data: {"id":"chatcmpl-DIgOgnbt21sEHKKTkWWAUf2BiMy3T","object":"chat.completion.chunk","created":1773345250,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_b7c8e3f100","usage":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":1,"function":{"arguments":"}"}}]},"logprobs":null,"finish_reason":null}],"obfuscation":"EQXsc"} + data: {"id":"chatcmpl-DuLdMEdkw5VsZSxKY3i9G934hT7LM","object":"chat.completion.chunk","created":1782321900,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_4fa7959453","usage":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":1,"function":{"arguments":"}"}}]},"logprobs":null,"finish_reason":null}],"obfuscation":"HbNbf"} - data: {"id":"chatcmpl-DIgOgnbt21sEHKKTkWWAUf2BiMy3T","object":"chat.completion.chunk","created":1773345250,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_b7c8e3f100","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"tool_calls"}],"usage":null,"obfuscation":"dxl0"} + data: {"id":"chatcmpl-DuLdMEdkw5VsZSxKY3i9G934hT7LM","object":"chat.completion.chunk","created":1782321900,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_4fa7959453","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"tool_calls"}],"usage":null,"obfuscation":"9Szx"} - data: {"id":"chatcmpl-DIgOgnbt21sEHKKTkWWAUf2BiMy3T","object":"chat.completion.chunk","created":1773345250,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_b7c8e3f100","choices":[],"usage":{"prompt_tokens":106,"completion_tokens":50,"total_tokens":156,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"TGqprANrKBek6"} + data: {"id":"chatcmpl-DuLdMEdkw5VsZSxKY3i9G934hT7LM","object":"chat.completion.chunk","created":1782321900,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_4fa7959453","choices":[],"usage":{"prompt_tokens":106,"completion_tokens":50,"total_tokens":156,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"e81oTeHXQjUjZ"} data: [DONE] @@ -57,7 +57,7 @@ interactions: - text/event-stream; charset=utf-8 status: 200 OK code: 200 - duration: 3.781110667s + duration: 929.581ms - id: 1 request: proto: HTTP/1.1 @@ -65,14 +65,14 @@ interactions: proto_minor: 1 content_length: 1279 host: "" - body: '{"messages":[{"content":"You are a helpful assistant. Always use both add and multiply at the same time.","role":"system"},{"content":"Add and multiply the number 2 and 3","role":"user"},{"tool_calls":[{"id":"call_lhJr4dWBxpVpf9LjGfERTy62","function":{"arguments":"{\"a\": 2, \"b\": 3}","name":"add"},"type":"function"},{"id":"call_o97Fs8Ray28WjwotGOcB6vXB","function":{"arguments":"{\"a\": 2, \"b\": 3}","name":"multiply"},"type":"function"}],"role":"assistant"},{"content":"5","tool_call_id":"call_lhJr4dWBxpVpf9LjGfERTy62","role":"tool"},{"content":"6","tool_call_id":"call_o97Fs8Ray28WjwotGOcB6vXB","role":"tool"}],"model":"gpt-4o","max_tokens":4000,"stream_options":{"include_usage":true},"tool_choice":"auto","tools":[{"function":{"name":"add","strict":false,"description":"Add two numbers","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"}},"type":"function"},{"function":{"name":"multiply","strict":false,"description":"Multiply two numbers","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"}},"type":"function"}],"stream":true}' + body: '{"messages":[{"content":"You are a helpful assistant. Always use both add and multiply at the same time.","role":"system"},{"content":"Add and multiply the number 2 and 3","role":"user"},{"tool_calls":[{"id":"call_ehIWdjL1abZk1h8FWGLQ0Hie","function":{"arguments":"{\"a\": 2, \"b\": 3}","name":"add"},"type":"function"},{"id":"call_fBSgA47J5VeONggizTIvl7AH","function":{"arguments":"{\"a\": 2, \"b\": 3}","name":"multiply"},"type":"function"}],"role":"assistant"},{"content":"5","tool_call_id":"call_ehIWdjL1abZk1h8FWGLQ0Hie","role":"tool"},{"content":"6","tool_call_id":"call_fBSgA47J5VeONggizTIvl7AH","role":"tool"}],"model":"gpt-4o","max_tokens":4000,"stream_options":{"include_usage":true},"tool_choice":"auto","tools":[{"function":{"name":"add","strict":false,"description":"Add two numbers","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"}},"type":"function"},{"function":{"name":"multiply","strict":false,"description":"Multiply two numbers","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"}},"type":"function"}],"stream":true}' headers: Accept: - application/json Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://api.openai.com/v1/chat/completions method: POST response: @@ -81,49 +81,49 @@ interactions: proto_minor: 0 content_length: -1 body: |+ - data: {"id":"chatcmpl-DIgOhMk4rdtMwcP5RhJQHwNQWkjse","object":"chat.completion.chunk","created":1773345251,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_b7c8e3f100","choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"I00rI7wzo1HTO4"} + data: {"id":"chatcmpl-DuLdNvsdmTNPbya2tqjr8GbYubTqm","object":"chat.completion.chunk","created":1782321901,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_4fa7959453","choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"Ro4m2bWLT0Minz"} - data: {"id":"chatcmpl-DIgOhMk4rdtMwcP5RhJQHwNQWkjse","object":"chat.completion.chunk","created":1773345251,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_b7c8e3f100","choices":[{"index":0,"delta":{"content":"The"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"WLjIy7Astonby"} + data: {"id":"chatcmpl-DuLdNvsdmTNPbya2tqjr8GbYubTqm","object":"chat.completion.chunk","created":1782321901,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_4fa7959453","choices":[{"index":0,"delta":{"content":"The"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"FH7MCqlO5ZoHv"} - data: {"id":"chatcmpl-DIgOhMk4rdtMwcP5RhJQHwNQWkjse","object":"chat.completion.chunk","created":1773345251,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_b7c8e3f100","choices":[{"index":0,"delta":{"content":" sum"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"bOXdHrLR03Zp"} + data: {"id":"chatcmpl-DuLdNvsdmTNPbya2tqjr8GbYubTqm","object":"chat.completion.chunk","created":1782321901,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_4fa7959453","choices":[{"index":0,"delta":{"content":" sum"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"n2hLyGkfiulW"} - data: {"id":"chatcmpl-DIgOhMk4rdtMwcP5RhJQHwNQWkjse","object":"chat.completion.chunk","created":1773345251,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_b7c8e3f100","choices":[{"index":0,"delta":{"content":" of"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"9bbu0esZoaBdx"} + data: {"id":"chatcmpl-DuLdNvsdmTNPbya2tqjr8GbYubTqm","object":"chat.completion.chunk","created":1782321901,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_4fa7959453","choices":[{"index":0,"delta":{"content":" of"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"bgCLTPyBTAwEO"} - data: {"id":"chatcmpl-DIgOhMk4rdtMwcP5RhJQHwNQWkjse","object":"chat.completion.chunk","created":1773345251,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_b7c8e3f100","choices":[{"index":0,"delta":{"content":" "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"2Fvg5RCUBYHGnUs"} + data: {"id":"chatcmpl-DuLdNvsdmTNPbya2tqjr8GbYubTqm","object":"chat.completion.chunk","created":1782321901,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_4fa7959453","choices":[{"index":0,"delta":{"content":" "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"iJ6jfudmp3kNsBA"} - data: {"id":"chatcmpl-DIgOhMk4rdtMwcP5RhJQHwNQWkjse","object":"chat.completion.chunk","created":1773345251,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_b7c8e3f100","choices":[{"index":0,"delta":{"content":"2"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"tRqLf2rz8UbPaz7"} + data: {"id":"chatcmpl-DuLdNvsdmTNPbya2tqjr8GbYubTqm","object":"chat.completion.chunk","created":1782321901,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_4fa7959453","choices":[{"index":0,"delta":{"content":"2"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"g3v5VcCcQHdZYIq"} - data: {"id":"chatcmpl-DIgOhMk4rdtMwcP5RhJQHwNQWkjse","object":"chat.completion.chunk","created":1773345251,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_b7c8e3f100","choices":[{"index":0,"delta":{"content":" and"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"DwNSpEpUXxzr"} + data: {"id":"chatcmpl-DuLdNvsdmTNPbya2tqjr8GbYubTqm","object":"chat.completion.chunk","created":1782321901,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_4fa7959453","choices":[{"index":0,"delta":{"content":" and"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"MnurRojM9o73"} - data: {"id":"chatcmpl-DIgOhMk4rdtMwcP5RhJQHwNQWkjse","object":"chat.completion.chunk","created":1773345251,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_b7c8e3f100","choices":[{"index":0,"delta":{"content":" "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"1ue4FuXrgG0dLmk"} + data: {"id":"chatcmpl-DuLdNvsdmTNPbya2tqjr8GbYubTqm","object":"chat.completion.chunk","created":1782321901,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_4fa7959453","choices":[{"index":0,"delta":{"content":" "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"BB0pxD6UJl9RhVV"} - data: {"id":"chatcmpl-DIgOhMk4rdtMwcP5RhJQHwNQWkjse","object":"chat.completion.chunk","created":1773345251,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_b7c8e3f100","choices":[{"index":0,"delta":{"content":"3"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"eK1qbtAxWfyPEzj"} + data: {"id":"chatcmpl-DuLdNvsdmTNPbya2tqjr8GbYubTqm","object":"chat.completion.chunk","created":1782321901,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_4fa7959453","choices":[{"index":0,"delta":{"content":"3"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"BBZT3KyQ7Roopdx"} - data: {"id":"chatcmpl-DIgOhMk4rdtMwcP5RhJQHwNQWkjse","object":"chat.completion.chunk","created":1773345251,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_b7c8e3f100","choices":[{"index":0,"delta":{"content":" is"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"IIt8asqN1PThE"} + data: {"id":"chatcmpl-DuLdNvsdmTNPbya2tqjr8GbYubTqm","object":"chat.completion.chunk","created":1782321901,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_4fa7959453","choices":[{"index":0,"delta":{"content":" is"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"32cdw5KyDyo13"} - data: {"id":"chatcmpl-DIgOhMk4rdtMwcP5RhJQHwNQWkjse","object":"chat.completion.chunk","created":1773345251,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_b7c8e3f100","choices":[{"index":0,"delta":{"content":" "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"ra6B5Mepffgq3AJ"} + data: {"id":"chatcmpl-DuLdNvsdmTNPbya2tqjr8GbYubTqm","object":"chat.completion.chunk","created":1782321901,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_4fa7959453","choices":[{"index":0,"delta":{"content":" "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"ikzUJVb6J92Y27M"} - data: {"id":"chatcmpl-DIgOhMk4rdtMwcP5RhJQHwNQWkjse","object":"chat.completion.chunk","created":1773345251,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_b7c8e3f100","choices":[{"index":0,"delta":{"content":"5"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"c18shkN11EFWg1D"} + data: {"id":"chatcmpl-DuLdNvsdmTNPbya2tqjr8GbYubTqm","object":"chat.completion.chunk","created":1782321901,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_4fa7959453","choices":[{"index":0,"delta":{"content":"5"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"MnoxCM4EDVJgb3A"} - data: {"id":"chatcmpl-DIgOhMk4rdtMwcP5RhJQHwNQWkjse","object":"chat.completion.chunk","created":1773345251,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_b7c8e3f100","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"CWRigLwlvI8YOjH"} + data: {"id":"chatcmpl-DuLdNvsdmTNPbya2tqjr8GbYubTqm","object":"chat.completion.chunk","created":1782321901,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_4fa7959453","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"RjpyFiZhDMePHiE"} - data: {"id":"chatcmpl-DIgOhMk4rdtMwcP5RhJQHwNQWkjse","object":"chat.completion.chunk","created":1773345251,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_b7c8e3f100","choices":[{"index":0,"delta":{"content":" and"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"xXtpRlnEIrnE"} + data: {"id":"chatcmpl-DuLdNvsdmTNPbya2tqjr8GbYubTqm","object":"chat.completion.chunk","created":1782321901,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_4fa7959453","choices":[{"index":0,"delta":{"content":" and"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"jpHSfcXHwisX"} - data: {"id":"chatcmpl-DIgOhMk4rdtMwcP5RhJQHwNQWkjse","object":"chat.completion.chunk","created":1773345251,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_b7c8e3f100","choices":[{"index":0,"delta":{"content":" the"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"Us4LEC3qJTpv"} + data: {"id":"chatcmpl-DuLdNvsdmTNPbya2tqjr8GbYubTqm","object":"chat.completion.chunk","created":1782321901,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_4fa7959453","choices":[{"index":0,"delta":{"content":" the"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"7ZDddSgIWjdN"} - data: {"id":"chatcmpl-DIgOhMk4rdtMwcP5RhJQHwNQWkjse","object":"chat.completion.chunk","created":1773345251,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_b7c8e3f100","choices":[{"index":0,"delta":{"content":" product"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"WDMIwfIr"} + data: {"id":"chatcmpl-DuLdNvsdmTNPbya2tqjr8GbYubTqm","object":"chat.completion.chunk","created":1782321901,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_4fa7959453","choices":[{"index":0,"delta":{"content":" product"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"SAORHY2J"} - data: {"id":"chatcmpl-DIgOhMk4rdtMwcP5RhJQHwNQWkjse","object":"chat.completion.chunk","created":1773345251,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_b7c8e3f100","choices":[{"index":0,"delta":{"content":" is"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"VXwKNFr0nU49U"} + data: {"id":"chatcmpl-DuLdNvsdmTNPbya2tqjr8GbYubTqm","object":"chat.completion.chunk","created":1782321901,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_4fa7959453","choices":[{"index":0,"delta":{"content":" is"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"YUhYLbJV9Eavw"} - data: {"id":"chatcmpl-DIgOhMk4rdtMwcP5RhJQHwNQWkjse","object":"chat.completion.chunk","created":1773345251,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_b7c8e3f100","choices":[{"index":0,"delta":{"content":" "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"A5dEb5Boh91ELeX"} + data: {"id":"chatcmpl-DuLdNvsdmTNPbya2tqjr8GbYubTqm","object":"chat.completion.chunk","created":1782321901,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_4fa7959453","choices":[{"index":0,"delta":{"content":" "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"kvNo5kFQB8Psop6"} - data: {"id":"chatcmpl-DIgOhMk4rdtMwcP5RhJQHwNQWkjse","object":"chat.completion.chunk","created":1773345251,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_b7c8e3f100","choices":[{"index":0,"delta":{"content":"6"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"dJ0PotEtLvWld1o"} + data: {"id":"chatcmpl-DuLdNvsdmTNPbya2tqjr8GbYubTqm","object":"chat.completion.chunk","created":1782321901,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_4fa7959453","choices":[{"index":0,"delta":{"content":"6"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"WuvbrSRRT736rfM"} - data: {"id":"chatcmpl-DIgOhMk4rdtMwcP5RhJQHwNQWkjse","object":"chat.completion.chunk","created":1773345251,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_b7c8e3f100","choices":[{"index":0,"delta":{"content":"."},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"1O71Ppjix5JfjEh"} + data: {"id":"chatcmpl-DuLdNvsdmTNPbya2tqjr8GbYubTqm","object":"chat.completion.chunk","created":1782321901,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_4fa7959453","choices":[{"index":0,"delta":{"content":"."},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"RzZJFnMkycfRIAM"} - data: {"id":"chatcmpl-DIgOhMk4rdtMwcP5RhJQHwNQWkjse","object":"chat.completion.chunk","created":1773345251,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_b7c8e3f100","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}],"usage":null,"obfuscation":"1NSXVez5Rf"} + data: {"id":"chatcmpl-DuLdNvsdmTNPbya2tqjr8GbYubTqm","object":"chat.completion.chunk","created":1782321901,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_4fa7959453","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}],"usage":null,"obfuscation":"DvESy0r2wP"} - data: {"id":"chatcmpl-DIgOhMk4rdtMwcP5RhJQHwNQWkjse","object":"chat.completion.chunk","created":1773345251,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_b7c8e3f100","choices":[],"usage":{"prompt_tokens":172,"completion_tokens":20,"total_tokens":192,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"LvgodbfjYIIYs"} + data: {"id":"chatcmpl-DuLdNvsdmTNPbya2tqjr8GbYubTqm","object":"chat.completion.chunk","created":1782321901,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_4fa7959453","choices":[],"usage":{"prompt_tokens":172,"completion_tokens":20,"total_tokens":192,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"ZJmcAfT5iZVbq"} data: [DONE] @@ -132,4 +132,4 @@ interactions: - text/event-stream; charset=utf-8 status: 200 OK code: 200 - duration: 504.805375ms + duration: 579.736709ms diff --git a/providertests/testdata/TestOpenAICommon/openai-gpt-4o/simple.yaml b/providertests/testdata/TestOpenAICommon/openai-gpt-4o/simple.yaml index bfdfe6ae6..8887ae28e 100644 --- a/providertests/testdata/TestOpenAICommon/openai-gpt-4o/simple.yaml +++ b/providertests/testdata/TestOpenAICommon/openai-gpt-4o/simple.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://api.openai.com/v1/chat/completions method: POST response: @@ -26,16 +26,16 @@ interactions: uncompressed: true body: | { - "id": "chatcmpl-DIgOSL1y8LJyfxxxzLR97P1iacvT8", + "id": "chatcmpl-DuLdCrhIZ5WekmJNOuiNyelYjQqZk", "object": "chat.completion", - "created": 1773345236, + "created": 1782321890, "model": "gpt-4o-2024-08-06", "choices": [ { "index": 0, "message": { "role": "assistant", - "content": "Olá!", + "content": "Oi!", "refusal": null, "annotations": [] }, @@ -59,11 +59,11 @@ interactions: } }, "service_tier": "default", - "system_fingerprint": "fp_c7a156cce7" + "system_fingerprint": "fp_86f87dc6f1" } headers: Content-Type: - application/json status: 200 OK code: 200 - duration: 1.690255125s + duration: 1.133625875s diff --git a/providertests/testdata/TestOpenAICommon/openai-gpt-4o/simple_streaming.yaml b/providertests/testdata/TestOpenAICommon/openai-gpt-4o/simple_streaming.yaml index 11db4b55d..a25e3c829 100644 --- a/providertests/testdata/TestOpenAICommon/openai-gpt-4o/simple_streaming.yaml +++ b/providertests/testdata/TestOpenAICommon/openai-gpt-4o/simple_streaming.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://api.openai.com/v1/chat/completions method: POST response: @@ -24,15 +24,15 @@ interactions: proto_minor: 0 content_length: -1 body: |+ - data: {"id":"chatcmpl-DIgOT5HbKwGK7vEjQ8fxquD0ES8ig","object":"chat.completion.chunk","created":1773345237,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_c7a156cce7","choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"40HCD1w4us7i7q"} + data: {"id":"chatcmpl-DuLdCoxuLDs8HRMlOuz0Bi4wgi4XJ","object":"chat.completion.chunk","created":1782321890,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_86f87dc6f1","choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"dcng047mBvo6Hy"} - data: {"id":"chatcmpl-DIgOT5HbKwGK7vEjQ8fxquD0ES8ig","object":"chat.completion.chunk","created":1773345237,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_c7a156cce7","choices":[{"index":0,"delta":{"content":"Olá"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"n28Y6FdfZjqrq"} + data: {"id":"chatcmpl-DuLdCoxuLDs8HRMlOuz0Bi4wgi4XJ","object":"chat.completion.chunk","created":1782321890,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_86f87dc6f1","choices":[{"index":0,"delta":{"content":"Olá"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"kGEVHK9STFy0L"} - data: {"id":"chatcmpl-DIgOT5HbKwGK7vEjQ8fxquD0ES8ig","object":"chat.completion.chunk","created":1773345237,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_c7a156cce7","choices":[{"index":0,"delta":{"content":"!"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"KEbvTC6xxk8jD8A"} + data: {"id":"chatcmpl-DuLdCoxuLDs8HRMlOuz0Bi4wgi4XJ","object":"chat.completion.chunk","created":1782321890,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_86f87dc6f1","choices":[{"index":0,"delta":{"content":"!"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"nNNmq0sYCNnlt4e"} - data: {"id":"chatcmpl-DIgOT5HbKwGK7vEjQ8fxquD0ES8ig","object":"chat.completion.chunk","created":1773345237,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_c7a156cce7","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}],"usage":null,"obfuscation":"SAplBO6D3G"} + data: {"id":"chatcmpl-DuLdCoxuLDs8HRMlOuz0Bi4wgi4XJ","object":"chat.completion.chunk","created":1782321890,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_86f87dc6f1","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}],"usage":null,"obfuscation":"EkBNlqIgr3"} - data: {"id":"chatcmpl-DIgOT5HbKwGK7vEjQ8fxquD0ES8ig","object":"chat.completion.chunk","created":1773345237,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_c7a156cce7","choices":[],"usage":{"prompt_tokens":20,"completion_tokens":2,"total_tokens":22,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":""} + data: {"id":"chatcmpl-DuLdCoxuLDs8HRMlOuz0Bi4wgi4XJ","object":"chat.completion.chunk","created":1782321890,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_86f87dc6f1","choices":[],"usage":{"prompt_tokens":20,"completion_tokens":2,"total_tokens":22,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":""} data: [DONE] @@ -41,4 +41,4 @@ interactions: - text/event-stream; charset=utf-8 status: 200 OK code: 200 - duration: 507.327917ms + duration: 507.584375ms diff --git a/providertests/testdata/TestOpenAICommon/openai-gpt-4o/tool.yaml b/providertests/testdata/TestOpenAICommon/openai-gpt-4o/tool.yaml index 728441b73..f8db70c26 100644 --- a/providertests/testdata/TestOpenAICommon/openai-gpt-4o/tool.yaml +++ b/providertests/testdata/TestOpenAICommon/openai-gpt-4o/tool.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://api.openai.com/v1/chat/completions method: POST response: @@ -26,9 +26,9 @@ interactions: uncompressed: true body: | { - "id": "chatcmpl-DIgOVkcYwRdDIvQjYGbUZZD00gsxh", + "id": "chatcmpl-DuLdFsxvqE5UB68GmaA3Q8Q8xWTTt", "object": "chat.completion", - "created": 1773345239, + "created": 1782321893, "model": "gpt-4o-2024-08-06", "choices": [ { @@ -38,11 +38,11 @@ interactions: "content": null, "tool_calls": [ { - "id": "call_3eHnfvL6QJXyzdmN10qxuau6", + "id": "call_IUonKM9GCNis5eMRHuusMqoy", "type": "function", "function": { "name": "weather", - "arguments": "{\"location\":\"Florence,Italy\"}" + "arguments": "{\"location\":\"Florence, Italy\"}" } } ], @@ -69,29 +69,29 @@ interactions: } }, "service_tier": "default", - "system_fingerprint": "fp_ad6e9d3570" + "system_fingerprint": "fp_e6c46296c9" } headers: Content-Type: - application/json status: 200 OK code: 200 - duration: 2.097003459s + duration: 3.924414958s - id: 1 request: proto: HTTP/1.1 proto_major: 1 proto_minor: 1 - content_length: 699 + content_length: 700 host: "" - body: '{"messages":[{"content":"You are a helpful assistant","role":"system"},{"content":"What''s the weather in Florence,Italy?","role":"user"},{"tool_calls":[{"id":"call_3eHnfvL6QJXyzdmN10qxuau6","function":{"arguments":"{\"location\":\"Florence,Italy\"}","name":"weather"},"type":"function"}],"role":"assistant"},{"content":"40 C","tool_call_id":"call_3eHnfvL6QJXyzdmN10qxuau6","role":"tool"}],"model":"gpt-4o","max_tokens":4000,"tool_choice":"auto","tools":[{"function":{"name":"weather","strict":false,"description":"Get weather information for a location","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"}},"type":"function"}]}' + body: '{"messages":[{"content":"You are a helpful assistant","role":"system"},{"content":"What''s the weather in Florence,Italy?","role":"user"},{"tool_calls":[{"id":"call_IUonKM9GCNis5eMRHuusMqoy","function":{"arguments":"{\"location\":\"Florence, Italy\"}","name":"weather"},"type":"function"}],"role":"assistant"},{"content":"40 C","tool_call_id":"call_IUonKM9GCNis5eMRHuusMqoy","role":"tool"}],"model":"gpt-4o","max_tokens":4000,"tool_choice":"auto","tools":[{"function":{"name":"weather","strict":false,"description":"Get weather information for a location","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"}},"type":"function"}]}' headers: Accept: - application/json Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://api.openai.com/v1/chat/completions method: POST response: @@ -102,16 +102,16 @@ interactions: uncompressed: true body: | { - "id": "chatcmpl-DIgOWwD5sH104pb99yiRJ1be9UtUd", + "id": "chatcmpl-DuLdHv2zvb8aazm4Y6RlHu7gNpQs9", "object": "chat.completion", - "created": 1773345240, + "created": 1782321895, "model": "gpt-4o-2024-08-06", "choices": [ { "index": 0, "message": { "role": "assistant", - "content": "The current weather in Florence, Italy is 40°C.", + "content": "The weather in Florence, Italy is currently 40°C.", "refusal": null, "annotations": [] }, @@ -135,11 +135,11 @@ interactions: } }, "service_tier": "default", - "system_fingerprint": "fp_ad6e9d3570" + "system_fingerprint": "fp_e6c46296c9" } headers: Content-Type: - application/json status: 200 OK code: 200 - duration: 920.258625ms + duration: 878.655958ms diff --git a/providertests/testdata/TestOpenAICommon/openai-gpt-4o/tool_streaming.yaml b/providertests/testdata/TestOpenAICommon/openai-gpt-4o/tool_streaming.yaml index 60d643538..44237d841 100644 --- a/providertests/testdata/TestOpenAICommon/openai-gpt-4o/tool_streaming.yaml +++ b/providertests/testdata/TestOpenAICommon/openai-gpt-4o/tool_streaming.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://api.openai.com/v1/chat/completions method: POST response: @@ -24,27 +24,27 @@ interactions: proto_minor: 0 content_length: -1 body: |+ - data: {"id":"chatcmpl-DIgOYMXmYOXjhEX6yuEufQ4vABXz2","object":"chat.completion.chunk","created":1773345242,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_c7a156cce7","choices":[{"index":0,"delta":{"role":"assistant","content":null,"tool_calls":[{"index":0,"id":"call_gFQuLUJTwJsBM7Y2mq8A5Tb9","type":"function","function":{"name":"weather","arguments":""}}],"refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"6spKBRZAjZ8J0"} + data: {"id":"chatcmpl-DuLdInI48CUMPbcraGuxW2KFhK3CM","object":"chat.completion.chunk","created":1782321896,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_e6c46296c9","choices":[{"index":0,"delta":{"role":"assistant","content":null,"tool_calls":[{"index":0,"id":"call_7kE4IjtnwXcGbX6hDM7xFu8T","type":"function","function":{"name":"weather","arguments":""}}],"refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"I4YePAoyJgMnS"} - data: {"id":"chatcmpl-DIgOYMXmYOXjhEX6yuEufQ4vABXz2","object":"chat.completion.chunk","created":1773345242,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_c7a156cce7","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"{\""}}]},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"yH6"} + data: {"id":"chatcmpl-DuLdInI48CUMPbcraGuxW2KFhK3CM","object":"chat.completion.chunk","created":1782321896,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_e6c46296c9","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"{\""}}]},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"3Be"} - data: {"id":"chatcmpl-DIgOYMXmYOXjhEX6yuEufQ4vABXz2","object":"chat.completion.chunk","created":1773345242,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_c7a156cce7","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"location"}}]},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"lJ55qhVB1AN93C"} + data: {"id":"chatcmpl-DuLdInI48CUMPbcraGuxW2KFhK3CM","object":"chat.completion.chunk","created":1782321896,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_e6c46296c9","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"location"}}]},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"bkGJq7e6fF9ZFa"} - data: {"id":"chatcmpl-DIgOYMXmYOXjhEX6yuEufQ4vABXz2","object":"chat.completion.chunk","created":1773345242,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_c7a156cce7","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"\":\""}}]},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"s"} + data: {"id":"chatcmpl-DuLdInI48CUMPbcraGuxW2KFhK3CM","object":"chat.completion.chunk","created":1782321896,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_e6c46296c9","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"\":\""}}]},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"P"} - data: {"id":"chatcmpl-DIgOYMXmYOXjhEX6yuEufQ4vABXz2","object":"chat.completion.chunk","created":1773345242,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_c7a156cce7","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"Flor"}}]},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"qN"} + data: {"id":"chatcmpl-DuLdInI48CUMPbcraGuxW2KFhK3CM","object":"chat.completion.chunk","created":1782321896,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_e6c46296c9","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"Flor"}}]},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"2N"} - data: {"id":"chatcmpl-DIgOYMXmYOXjhEX6yuEufQ4vABXz2","object":"chat.completion.chunk","created":1773345242,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_c7a156cce7","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"ence"}}]},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"77"} + data: {"id":"chatcmpl-DuLdInI48CUMPbcraGuxW2KFhK3CM","object":"chat.completion.chunk","created":1782321896,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_e6c46296c9","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"ence"}}]},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"6h"} - data: {"id":"chatcmpl-DIgOYMXmYOXjhEX6yuEufQ4vABXz2","object":"chat.completion.chunk","created":1773345242,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_c7a156cce7","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":","}}]},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"VLp1X"} + data: {"id":"chatcmpl-DuLdInI48CUMPbcraGuxW2KFhK3CM","object":"chat.completion.chunk","created":1782321896,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_e6c46296c9","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":","}}]},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"TbxII"} - data: {"id":"chatcmpl-DIgOYMXmYOXjhEX6yuEufQ4vABXz2","object":"chat.completion.chunk","created":1773345242,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_c7a156cce7","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" Italy"}}]},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":""} + data: {"id":"chatcmpl-DuLdInI48CUMPbcraGuxW2KFhK3CM","object":"chat.completion.chunk","created":1782321896,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_e6c46296c9","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" Italy"}}]},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":""} - data: {"id":"chatcmpl-DIgOYMXmYOXjhEX6yuEufQ4vABXz2","object":"chat.completion.chunk","created":1773345242,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_c7a156cce7","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"\"}"}}]},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"YMN"} + data: {"id":"chatcmpl-DuLdInI48CUMPbcraGuxW2KFhK3CM","object":"chat.completion.chunk","created":1782321896,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_e6c46296c9","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"\"}"}}]},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"gQx"} - data: {"id":"chatcmpl-DIgOYMXmYOXjhEX6yuEufQ4vABXz2","object":"chat.completion.chunk","created":1773345242,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_c7a156cce7","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"tool_calls"}],"usage":null,"obfuscation":"TFgV"} + data: {"id":"chatcmpl-DuLdInI48CUMPbcraGuxW2KFhK3CM","object":"chat.completion.chunk","created":1782321896,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_e6c46296c9","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"tool_calls"}],"usage":null,"obfuscation":"j3uk"} - data: {"id":"chatcmpl-DIgOYMXmYOXjhEX6yuEufQ4vABXz2","object":"chat.completion.chunk","created":1773345242,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_c7a156cce7","choices":[],"usage":{"prompt_tokens":61,"completion_tokens":16,"total_tokens":77,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"ZQqtsgfnKUMFnQR"} + data: {"id":"chatcmpl-DuLdInI48CUMPbcraGuxW2KFhK3CM","object":"chat.completion.chunk","created":1782321896,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_e6c46296c9","choices":[],"usage":{"prompt_tokens":61,"completion_tokens":16,"total_tokens":77,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"gQMtNCWqoHwBPmt"} data: [DONE] @@ -53,7 +53,7 @@ interactions: - text/event-stream; charset=utf-8 status: 200 OK code: 200 - duration: 1.533239416s + duration: 896.93675ms - id: 1 request: proto: HTTP/1.1 @@ -61,14 +61,14 @@ interactions: proto_minor: 1 content_length: 754 host: "" - body: '{"messages":[{"content":"You are a helpful assistant","role":"system"},{"content":"What''s the weather in Florence,Italy?","role":"user"},{"tool_calls":[{"id":"call_gFQuLUJTwJsBM7Y2mq8A5Tb9","function":{"arguments":"{\"location\":\"Florence, Italy\"}","name":"weather"},"type":"function"}],"role":"assistant"},{"content":"40 C","tool_call_id":"call_gFQuLUJTwJsBM7Y2mq8A5Tb9","role":"tool"}],"model":"gpt-4o","max_tokens":4000,"stream_options":{"include_usage":true},"tool_choice":"auto","tools":[{"function":{"name":"weather","strict":false,"description":"Get weather information for a location","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"}},"type":"function"}],"stream":true}' + body: '{"messages":[{"content":"You are a helpful assistant","role":"system"},{"content":"What''s the weather in Florence,Italy?","role":"user"},{"tool_calls":[{"id":"call_7kE4IjtnwXcGbX6hDM7xFu8T","function":{"arguments":"{\"location\":\"Florence, Italy\"}","name":"weather"},"type":"function"}],"role":"assistant"},{"content":"40 C","tool_call_id":"call_7kE4IjtnwXcGbX6hDM7xFu8T","role":"tool"}],"model":"gpt-4o","max_tokens":4000,"stream_options":{"include_usage":true},"tool_choice":"auto","tools":[{"function":{"name":"weather","strict":false,"description":"Get weather information for a location","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"}},"type":"function"}],"stream":true}' headers: Accept: - application/json Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://api.openai.com/v1/chat/completions method: POST response: @@ -77,35 +77,35 @@ interactions: proto_minor: 0 content_length: -1 body: |+ - data: {"id":"chatcmpl-DIgOZEILn4dneOO9GLJ0fLQPDcnYr","object":"chat.completion.chunk","created":1773345243,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_22cd3c63e9","choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"APGdpAes4gFKrF"} + data: {"id":"chatcmpl-DuLdJCsSSbBBJ5FZPFMNj2owr3Fhr","object":"chat.completion.chunk","created":1782321897,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_e6c46296c9","choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"zjz08dUTfZUpMy"} - data: {"id":"chatcmpl-DIgOZEILn4dneOO9GLJ0fLQPDcnYr","object":"chat.completion.chunk","created":1773345243,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_22cd3c63e9","choices":[{"index":0,"delta":{"content":"The"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"8ROdL0a3vN5cK"} + data: {"id":"chatcmpl-DuLdJCsSSbBBJ5FZPFMNj2owr3Fhr","object":"chat.completion.chunk","created":1782321897,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_e6c46296c9","choices":[{"index":0,"delta":{"content":"The"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"76pBOrzaG4djy"} - data: {"id":"chatcmpl-DIgOZEILn4dneOO9GLJ0fLQPDcnYr","object":"chat.completion.chunk","created":1773345243,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_22cd3c63e9","choices":[{"index":0,"delta":{"content":" current"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"p11oc9ks"} + data: {"id":"chatcmpl-DuLdJCsSSbBBJ5FZPFMNj2owr3Fhr","object":"chat.completion.chunk","created":1782321897,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_e6c46296c9","choices":[{"index":0,"delta":{"content":" current"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"hgs7VLZr"} - data: {"id":"chatcmpl-DIgOZEILn4dneOO9GLJ0fLQPDcnYr","object":"chat.completion.chunk","created":1773345243,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_22cd3c63e9","choices":[{"index":0,"delta":{"content":" temperature"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"Gz5V"} + data: {"id":"chatcmpl-DuLdJCsSSbBBJ5FZPFMNj2owr3Fhr","object":"chat.completion.chunk","created":1782321897,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_e6c46296c9","choices":[{"index":0,"delta":{"content":" temperature"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"35ij"} - data: {"id":"chatcmpl-DIgOZEILn4dneOO9GLJ0fLQPDcnYr","object":"chat.completion.chunk","created":1773345243,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_22cd3c63e9","choices":[{"index":0,"delta":{"content":" in"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"rynKxq0lJ6zCS"} + data: {"id":"chatcmpl-DuLdJCsSSbBBJ5FZPFMNj2owr3Fhr","object":"chat.completion.chunk","created":1782321897,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_e6c46296c9","choices":[{"index":0,"delta":{"content":" in"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"Chd1mZR5UMq0q"} - data: {"id":"chatcmpl-DIgOZEILn4dneOO9GLJ0fLQPDcnYr","object":"chat.completion.chunk","created":1773345243,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_22cd3c63e9","choices":[{"index":0,"delta":{"content":" Florence"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"RB2Cump"} + data: {"id":"chatcmpl-DuLdJCsSSbBBJ5FZPFMNj2owr3Fhr","object":"chat.completion.chunk","created":1782321897,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_e6c46296c9","choices":[{"index":0,"delta":{"content":" Florence"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"d9OtQNy"} - data: {"id":"chatcmpl-DIgOZEILn4dneOO9GLJ0fLQPDcnYr","object":"chat.completion.chunk","created":1773345243,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_22cd3c63e9","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"dktNYMblGlkyqvC"} + data: {"id":"chatcmpl-DuLdJCsSSbBBJ5FZPFMNj2owr3Fhr","object":"chat.completion.chunk","created":1782321897,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_e6c46296c9","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"OGwOT2iJWSHj9Nb"} - data: {"id":"chatcmpl-DIgOZEILn4dneOO9GLJ0fLQPDcnYr","object":"chat.completion.chunk","created":1773345243,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_22cd3c63e9","choices":[{"index":0,"delta":{"content":" Italy"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"6Ko3t1M7KO"} + data: {"id":"chatcmpl-DuLdJCsSSbBBJ5FZPFMNj2owr3Fhr","object":"chat.completion.chunk","created":1782321897,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_e6c46296c9","choices":[{"index":0,"delta":{"content":" Italy"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"XN1GRJ677l"} - data: {"id":"chatcmpl-DIgOZEILn4dneOO9GLJ0fLQPDcnYr","object":"chat.completion.chunk","created":1773345243,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_22cd3c63e9","choices":[{"index":0,"delta":{"content":" is"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"l9QjE69PUvvV5"} + data: {"id":"chatcmpl-DuLdJCsSSbBBJ5FZPFMNj2owr3Fhr","object":"chat.completion.chunk","created":1782321897,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_e6c46296c9","choices":[{"index":0,"delta":{"content":" is"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"DLnUXSBHb1JIX"} - data: {"id":"chatcmpl-DIgOZEILn4dneOO9GLJ0fLQPDcnYr","object":"chat.completion.chunk","created":1773345243,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_22cd3c63e9","choices":[{"index":0,"delta":{"content":" "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"NV94464tHMJOFdV"} + data: {"id":"chatcmpl-DuLdJCsSSbBBJ5FZPFMNj2owr3Fhr","object":"chat.completion.chunk","created":1782321897,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_e6c46296c9","choices":[{"index":0,"delta":{"content":" "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"oRaOlghIvtmeEcW"} - data: {"id":"chatcmpl-DIgOZEILn4dneOO9GLJ0fLQPDcnYr","object":"chat.completion.chunk","created":1773345243,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_22cd3c63e9","choices":[{"index":0,"delta":{"content":"40"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"XqVrRIj7NMJjSg"} + data: {"id":"chatcmpl-DuLdJCsSSbBBJ5FZPFMNj2owr3Fhr","object":"chat.completion.chunk","created":1782321897,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_e6c46296c9","choices":[{"index":0,"delta":{"content":"40"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"woQ5YZmQImnpGW"} - data: {"id":"chatcmpl-DIgOZEILn4dneOO9GLJ0fLQPDcnYr","object":"chat.completion.chunk","created":1773345243,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_22cd3c63e9","choices":[{"index":0,"delta":{"content":"°C"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"g0R9xOfjnFySDQ"} + data: {"id":"chatcmpl-DuLdJCsSSbBBJ5FZPFMNj2owr3Fhr","object":"chat.completion.chunk","created":1782321897,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_e6c46296c9","choices":[{"index":0,"delta":{"content":"°C"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"oqxWDBV7AJa90b"} - data: {"id":"chatcmpl-DIgOZEILn4dneOO9GLJ0fLQPDcnYr","object":"chat.completion.chunk","created":1773345243,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_22cd3c63e9","choices":[{"index":0,"delta":{"content":"."},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"aJTBIAG5P5Zog5v"} + data: {"id":"chatcmpl-DuLdJCsSSbBBJ5FZPFMNj2owr3Fhr","object":"chat.completion.chunk","created":1782321897,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_e6c46296c9","choices":[{"index":0,"delta":{"content":"."},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"wI2h97axDhZ3fbD"} - data: {"id":"chatcmpl-DIgOZEILn4dneOO9GLJ0fLQPDcnYr","object":"chat.completion.chunk","created":1773345243,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_22cd3c63e9","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}],"usage":null,"obfuscation":"e9Yt0HF6FH"} + data: {"id":"chatcmpl-DuLdJCsSSbBBJ5FZPFMNj2owr3Fhr","object":"chat.completion.chunk","created":1782321897,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_e6c46296c9","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}],"usage":null,"obfuscation":"FsMYLGLAPx"} - data: {"id":"chatcmpl-DIgOZEILn4dneOO9GLJ0fLQPDcnYr","object":"chat.completion.chunk","created":1773345243,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_22cd3c63e9","choices":[],"usage":{"prompt_tokens":86,"completion_tokens":13,"total_tokens":99,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"V89OWCoE0c7MQOo"} + data: {"id":"chatcmpl-DuLdJCsSSbBBJ5FZPFMNj2owr3Fhr","object":"chat.completion.chunk","created":1782321897,"model":"gpt-4o-2024-08-06","service_tier":"default","system_fingerprint":"fp_e6c46296c9","choices":[],"usage":{"prompt_tokens":86,"completion_tokens":13,"total_tokens":99,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"XPwkhlohHQcWxlN"} data: [DONE] @@ -114,4 +114,4 @@ interactions: - text/event-stream; charset=utf-8 status: 200 OK code: 200 - duration: 1.82146025s + duration: 619.560875ms diff --git a/providertests/testdata/TestOpenAICommon/openai-gpt-5/multi_tool.yaml b/providertests/testdata/TestOpenAICommon/openai-gpt-5/multi_tool.yaml index 983be05d7..2cd400be1 100644 --- a/providertests/testdata/TestOpenAICommon/openai-gpt-5/multi_tool.yaml +++ b/providertests/testdata/TestOpenAICommon/openai-gpt-5/multi_tool.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://api.openai.com/v1/chat/completions method: POST response: @@ -26,9 +26,9 @@ interactions: uncompressed: true body: | { - "id": "chatcmpl-DIgPPk7saen7U19r0G4lPuldlpqWC", + "id": "chatcmpl-DuLdwG9dovOoGcPewSoHPH2zgGXdJ", "object": "chat.completion", - "created": 1773345295, + "created": 1782321936, "model": "gpt-5-2025-08-07", "choices": [ { @@ -38,7 +38,7 @@ interactions: "content": null, "tool_calls": [ { - "id": "call_qYblat6FHmVxqmw0d5E2GriK", + "id": "call_JbtEJLdy2rnO1a0MncDXg7en", "type": "function", "function": { "name": "add", @@ -46,7 +46,7 @@ interactions: } }, { - "id": "call_nB3RUGzSDKdqIYs5ctAN9DRP", + "id": "call_8KLhmbfdG4JIj3NXaa2ycNiK", "type": "function", "function": { "name": "multiply", @@ -83,7 +83,7 @@ interactions: - application/json status: 200 OK code: 200 - duration: 6.091876458s + duration: 6.278232542s - id: 1 request: proto: HTTP/1.1 @@ -91,14 +91,14 @@ interactions: proto_minor: 1 content_length: 1252 host: "" - body: '{"messages":[{"content":"You are a helpful assistant. CRITICAL: Always use both add and multiply at the same time ALWAYS.","role":"system"},{"content":"Add and multiply the number 2 and 3","role":"user"},{"tool_calls":[{"id":"call_qYblat6FHmVxqmw0d5E2GriK","function":{"arguments":"{\"a\": 2, \"b\": 3}","name":"add"},"type":"function"},{"id":"call_nB3RUGzSDKdqIYs5ctAN9DRP","function":{"arguments":"{\"a\": 2, \"b\": 3}","name":"multiply"},"type":"function"}],"role":"assistant"},{"content":"5","tool_call_id":"call_qYblat6FHmVxqmw0d5E2GriK","role":"tool"},{"content":"6","tool_call_id":"call_nB3RUGzSDKdqIYs5ctAN9DRP","role":"tool"}],"model":"gpt-5","max_completion_tokens":4000,"tool_choice":"auto","tools":[{"function":{"name":"add","strict":false,"description":"Add two numbers","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"}},"type":"function"},{"function":{"name":"multiply","strict":false,"description":"Multiply two numbers","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"}},"type":"function"}]}' + body: '{"messages":[{"content":"You are a helpful assistant. CRITICAL: Always use both add and multiply at the same time ALWAYS.","role":"system"},{"content":"Add and multiply the number 2 and 3","role":"user"},{"tool_calls":[{"id":"call_JbtEJLdy2rnO1a0MncDXg7en","function":{"arguments":"{\"a\": 2, \"b\": 3}","name":"add"},"type":"function"},{"id":"call_8KLhmbfdG4JIj3NXaa2ycNiK","function":{"arguments":"{\"a\": 2, \"b\": 3}","name":"multiply"},"type":"function"}],"role":"assistant"},{"content":"5","tool_call_id":"call_JbtEJLdy2rnO1a0MncDXg7en","role":"tool"},{"content":"6","tool_call_id":"call_8KLhmbfdG4JIj3NXaa2ycNiK","role":"tool"}],"model":"gpt-5","max_completion_tokens":4000,"tool_choice":"auto","tools":[{"function":{"name":"add","strict":false,"description":"Add two numbers","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"}},"type":"function"},{"function":{"name":"multiply","strict":false,"description":"Multiply two numbers","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"}},"type":"function"}]}' headers: Accept: - application/json Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://api.openai.com/v1/chat/completions method: POST response: @@ -109,16 +109,16 @@ interactions: uncompressed: true body: | { - "id": "chatcmpl-DIgPV4XrXfzx4Go0eCC5SSYTEtm5h", + "id": "chatcmpl-DuLe3V1Le0cl6NTcYRCfH8amBRaLS", "object": "chat.completion", - "created": 1773345301, + "created": 1782321943, "model": "gpt-5-2025-08-07", "choices": [ { "index": 0, "message": { "role": "assistant", - "content": "Results:\n- Addition: 2 + 3 = 5\n- Multiplication: 2 × 3 = 6", + "content": "- Sum (2 + 3): 5\n- Product (2 × 3): 6", "refusal": null, "annotations": [] }, @@ -127,8 +127,8 @@ interactions: ], "usage": { "prompt_tokens": 266, - "completion_tokens": 29, - "total_tokens": 295, + "completion_tokens": 24, + "total_tokens": 290, "prompt_tokens_details": { "cached_tokens": 0, "audio_tokens": 0 @@ -148,4 +148,4 @@ interactions: - application/json status: 200 OK code: 200 - duration: 1.220892708s + duration: 2.211079292s diff --git a/providertests/testdata/TestOpenAICommon/openai-gpt-5/multi_tool_streaming.yaml b/providertests/testdata/TestOpenAICommon/openai-gpt-5/multi_tool_streaming.yaml index ecf072b97..adc0d8867 100644 --- a/providertests/testdata/TestOpenAICommon/openai-gpt-5/multi_tool_streaming.yaml +++ b/providertests/testdata/TestOpenAICommon/openai-gpt-5/multi_tool_streaming.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://api.openai.com/v1/chat/completions method: POST response: @@ -24,31 +24,31 @@ interactions: proto_minor: 0 content_length: -1 body: |+ - data: {"id":"chatcmpl-DIgPW9JEWVwwJNAQ3qR06ANW8KVff","object":"chat.completion.chunk","created":1773345302,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"usage":null,"choices":[{"index":0,"delta":{"role":"assistant","content":null},"finish_reason":null}],"obfuscation":"HACDS8t"} + data: {"id":"chatcmpl-DuLe5uYcQLe3hznEQpmI0pr8qyHJ8","object":"chat.completion.chunk","created":1782321945,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"usage":null,"choices":[{"index":0,"delta":{"role":"assistant","content":null},"finish_reason":null}],"obfuscation":"Hv7qlnu"} - data: {"id":"chatcmpl-DIgPW9JEWVwwJNAQ3qR06ANW8KVff","object":"chat.completion.chunk","created":1773345302,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"usage":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"id":"call_HK2ZnDjXVP8y7DIxGfUj37xn","type":"function","function":{"name":"add","arguments":""}}]},"finish_reason":null}],"obfuscation":"eYYMFNtwCRnxIn"} + data: {"id":"chatcmpl-DuLe5uYcQLe3hznEQpmI0pr8qyHJ8","object":"chat.completion.chunk","created":1782321945,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"usage":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"id":"call_8ElDxJj6u7IUDEwQIrwFbveM","type":"function","function":{"name":"add","arguments":""}}]},"finish_reason":null}],"obfuscation":"fw6euDAEW65QnF"} - data: {"id":"chatcmpl-DIgPW9JEWVwwJNAQ3qR06ANW8KVff","object":"chat.completion.chunk","created":1773345302,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"usage":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"{\"a\""}}]},"finish_reason":null}],"obfuscation":"YU6lFpCT8DlI"} + data: {"id":"chatcmpl-DuLe5uYcQLe3hznEQpmI0pr8qyHJ8","object":"chat.completion.chunk","created":1782321945,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"usage":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"{\"a\""}}]},"finish_reason":null}],"obfuscation":"siIjP86UOiG4"} - data: {"id":"chatcmpl-DIgPW9JEWVwwJNAQ3qR06ANW8KVff","object":"chat.completion.chunk","created":1773345302,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"usage":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":": 2, "}}]},"finish_reason":null}],"obfuscation":"nEyU1RU1lEipK"} + data: {"id":"chatcmpl-DuLe5uYcQLe3hznEQpmI0pr8qyHJ8","object":"chat.completion.chunk","created":1782321945,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"usage":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":": 2, "}}]},"finish_reason":null}],"obfuscation":"XZt0XK1e3Lafa"} - data: {"id":"chatcmpl-DIgPW9JEWVwwJNAQ3qR06ANW8KVff","object":"chat.completion.chunk","created":1773345302,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"usage":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"\"b\": 3"}}]},"finish_reason":null}],"obfuscation":"e7UG9P82Rz"} + data: {"id":"chatcmpl-DuLe5uYcQLe3hznEQpmI0pr8qyHJ8","object":"chat.completion.chunk","created":1782321945,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"usage":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"\"b\": 3"}}]},"finish_reason":null}],"obfuscation":"ro8z4ezWY7"} - data: {"id":"chatcmpl-DIgPW9JEWVwwJNAQ3qR06ANW8KVff","object":"chat.completion.chunk","created":1773345302,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"usage":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"}"}}]},"finish_reason":null}],"obfuscation":"b"} + data: {"id":"chatcmpl-DuLe5uYcQLe3hznEQpmI0pr8qyHJ8","object":"chat.completion.chunk","created":1782321945,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"usage":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"}"}}]},"finish_reason":null}],"obfuscation":"l"} - data: {"id":"chatcmpl-DIgPW9JEWVwwJNAQ3qR06ANW8KVff","object":"chat.completion.chunk","created":1773345302,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"usage":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":1,"id":"call_FziDuLl4P4uEHEaVPOq7KApz","type":"function","function":{"name":"multiply","arguments":""}}]},"finish_reason":null}],"obfuscation":"fNh1zA1va"} + data: {"id":"chatcmpl-DuLe5uYcQLe3hznEQpmI0pr8qyHJ8","object":"chat.completion.chunk","created":1782321945,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"usage":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":1,"id":"call_HEZOX3JzspqFubADMNdWn12E","type":"function","function":{"name":"multiply","arguments":""}}]},"finish_reason":null}],"obfuscation":"uzGwAT9Jh"} - data: {"id":"chatcmpl-DIgPW9JEWVwwJNAQ3qR06ANW8KVff","object":"chat.completion.chunk","created":1773345302,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"usage":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":1,"function":{"arguments":"{\"a\""}}]},"finish_reason":null}],"obfuscation":"hGBJkQyT9sfy"} + data: {"id":"chatcmpl-DuLe5uYcQLe3hznEQpmI0pr8qyHJ8","object":"chat.completion.chunk","created":1782321945,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"usage":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":1,"function":{"arguments":"{\"a\""}}]},"finish_reason":null}],"obfuscation":"TZpkt8b2fwhe"} - data: {"id":"chatcmpl-DIgPW9JEWVwwJNAQ3qR06ANW8KVff","object":"chat.completion.chunk","created":1773345302,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"usage":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":1,"function":{"arguments":": 2, "}}]},"finish_reason":null}],"obfuscation":"RMGsBkUp9hu3k"} + data: {"id":"chatcmpl-DuLe5uYcQLe3hznEQpmI0pr8qyHJ8","object":"chat.completion.chunk","created":1782321945,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"usage":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":1,"function":{"arguments":": 2, "}}]},"finish_reason":null}],"obfuscation":"QsMx0eHnrovPb"} - data: {"id":"chatcmpl-DIgPW9JEWVwwJNAQ3qR06ANW8KVff","object":"chat.completion.chunk","created":1773345302,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"usage":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":1,"function":{"arguments":"\"b\": 3"}}]},"finish_reason":null}],"obfuscation":"oN2krbBWOg"} + data: {"id":"chatcmpl-DuLe5uYcQLe3hznEQpmI0pr8qyHJ8","object":"chat.completion.chunk","created":1782321945,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"usage":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":1,"function":{"arguments":"\"b\": 3"}}]},"finish_reason":null}],"obfuscation":"8gS4iP4B7X"} - data: {"id":"chatcmpl-DIgPW9JEWVwwJNAQ3qR06ANW8KVff","object":"chat.completion.chunk","created":1773345302,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"usage":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":1,"function":{"arguments":"}"}}]},"finish_reason":null}],"obfuscation":"R"} + data: {"id":"chatcmpl-DuLe5uYcQLe3hznEQpmI0pr8qyHJ8","object":"chat.completion.chunk","created":1782321945,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"usage":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":1,"function":{"arguments":"}"}}]},"finish_reason":null}],"obfuscation":"o"} - data: {"id":"chatcmpl-DIgPW9JEWVwwJNAQ3qR06ANW8KVff","object":"chat.completion.chunk","created":1773345302,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{},"finish_reason":"tool_calls"}],"usage":null,"obfuscation":""} + data: {"id":"chatcmpl-DuLe5uYcQLe3hznEQpmI0pr8qyHJ8","object":"chat.completion.chunk","created":1782321945,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{},"finish_reason":"tool_calls"}],"usage":null,"obfuscation":""} - data: {"id":"chatcmpl-DIgPW9JEWVwwJNAQ3qR06ANW8KVff","object":"chat.completion.chunk","created":1773345302,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[],"usage":{"prompt_tokens":190,"completion_tokens":315,"total_tokens":505,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":256,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"2JJpgI"} + data: {"id":"chatcmpl-DuLe5uYcQLe3hznEQpmI0pr8qyHJ8","object":"chat.completion.chunk","created":1782321945,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[],"usage":{"prompt_tokens":190,"completion_tokens":379,"total_tokens":569,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":320,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"IMUIO5"} data: [DONE] @@ -57,7 +57,7 @@ interactions: - text/event-stream; charset=utf-8 status: 200 OK code: 200 - duration: 6.964085083s + duration: 6.884639417s - id: 1 request: proto: HTTP/1.1 @@ -65,14 +65,14 @@ interactions: proto_minor: 1 content_length: 1289 host: "" - body: '{"messages":[{"content":"You are a helpful assistant. Always use both add and multiply at the same time.","role":"system"},{"content":"Add and multiply the number 2 and 3","role":"user"},{"tool_calls":[{"id":"call_HK2ZnDjXVP8y7DIxGfUj37xn","function":{"arguments":"{\"a\": 2, \"b\": 3}","name":"add"},"type":"function"},{"id":"call_FziDuLl4P4uEHEaVPOq7KApz","function":{"arguments":"{\"a\": 2, \"b\": 3}","name":"multiply"},"type":"function"}],"role":"assistant"},{"content":"5","tool_call_id":"call_HK2ZnDjXVP8y7DIxGfUj37xn","role":"tool"},{"content":"6","tool_call_id":"call_FziDuLl4P4uEHEaVPOq7KApz","role":"tool"}],"model":"gpt-5","max_completion_tokens":4000,"stream_options":{"include_usage":true},"tool_choice":"auto","tools":[{"function":{"name":"add","strict":false,"description":"Add two numbers","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"}},"type":"function"},{"function":{"name":"multiply","strict":false,"description":"Multiply two numbers","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"}},"type":"function"}],"stream":true}' + body: '{"messages":[{"content":"You are a helpful assistant. Always use both add and multiply at the same time.","role":"system"},{"content":"Add and multiply the number 2 and 3","role":"user"},{"tool_calls":[{"id":"call_8ElDxJj6u7IUDEwQIrwFbveM","function":{"arguments":"{\"a\": 2, \"b\": 3}","name":"add"},"type":"function"},{"id":"call_HEZOX3JzspqFubADMNdWn12E","function":{"arguments":"{\"a\": 2, \"b\": 3}","name":"multiply"},"type":"function"}],"role":"assistant"},{"content":"5","tool_call_id":"call_8ElDxJj6u7IUDEwQIrwFbveM","role":"tool"},{"content":"6","tool_call_id":"call_HEZOX3JzspqFubADMNdWn12E","role":"tool"}],"model":"gpt-5","max_completion_tokens":4000,"stream_options":{"include_usage":true},"tool_choice":"auto","tools":[{"function":{"name":"add","strict":false,"description":"Add two numbers","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"}},"type":"function"},{"function":{"name":"multiply","strict":false,"description":"Multiply two numbers","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"}},"type":"function"}],"stream":true}' headers: Accept: - application/json Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://api.openai.com/v1/chat/completions method: POST response: @@ -81,57 +81,55 @@ interactions: proto_minor: 0 content_length: -1 body: |+ - data: {"id":"chatcmpl-DIgPdKQqJh9SQOWG0lr9E9GR4ejBV","object":"chat.completion.chunk","created":1773345309,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"finish_reason":null}],"usage":null,"obfuscation":"6J7ZI3bsns"} + data: {"id":"chatcmpl-DuLeBttf9MGNv6MRME4YoOcRh2ekF","object":"chat.completion.chunk","created":1782321951,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"finish_reason":null}],"usage":null,"obfuscation":"6jQBHereiF"} - data: {"id":"chatcmpl-DIgPdKQqJh9SQOWG0lr9E9GR4ejBV","object":"chat.completion.chunk","created":1773345309,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":"-"},"finish_reason":null}],"usage":null,"obfuscation":"81XGlvpWROm"} + data: {"id":"chatcmpl-DuLeBttf9MGNv6MRME4YoOcRh2ekF","object":"chat.completion.chunk","created":1782321951,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":"Addition"},"finish_reason":null}],"usage":null,"obfuscation":"V3br"} - data: {"id":"chatcmpl-DIgPdKQqJh9SQOWG0lr9E9GR4ejBV","object":"chat.completion.chunk","created":1773345309,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":" Sum"},"finish_reason":null}],"usage":null,"obfuscation":"NSmWgmap"} + data: {"id":"chatcmpl-DuLeBttf9MGNv6MRME4YoOcRh2ekF","object":"chat.completion.chunk","created":1782321951,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":":"},"finish_reason":null}],"usage":null,"obfuscation":"ypNrN1fN7wg"} - data: {"id":"chatcmpl-DIgPdKQqJh9SQOWG0lr9E9GR4ejBV","object":"chat.completion.chunk","created":1773345309,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":" ("},"finish_reason":null}],"usage":null,"obfuscation":"jH7uArQMmQ"} + data: {"id":"chatcmpl-DuLeBttf9MGNv6MRME4YoOcRh2ekF","object":"chat.completion.chunk","created":1782321951,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":" "},"finish_reason":null}],"usage":null,"obfuscation":"CsjTqhvelMy"} - data: {"id":"chatcmpl-DIgPdKQqJh9SQOWG0lr9E9GR4ejBV","object":"chat.completion.chunk","created":1773345309,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":"2"},"finish_reason":null}],"usage":null,"obfuscation":"HqQ56gcVKED"} + data: {"id":"chatcmpl-DuLeBttf9MGNv6MRME4YoOcRh2ekF","object":"chat.completion.chunk","created":1782321951,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":"2"},"finish_reason":null}],"usage":null,"obfuscation":"GAZyn62yebt"} - data: {"id":"chatcmpl-DIgPdKQqJh9SQOWG0lr9E9GR4ejBV","object":"chat.completion.chunk","created":1773345309,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":" +"},"finish_reason":null}],"usage":null,"obfuscation":"TYOVr0GO0a"} + data: {"id":"chatcmpl-DuLeBttf9MGNv6MRME4YoOcRh2ekF","object":"chat.completion.chunk","created":1782321951,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":" +"},"finish_reason":null}],"usage":null,"obfuscation":"qPm7B5Euvr"} - data: {"id":"chatcmpl-DIgPdKQqJh9SQOWG0lr9E9GR4ejBV","object":"chat.completion.chunk","created":1773345309,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":" "},"finish_reason":null}],"usage":null,"obfuscation":"C12uOxBXHQK"} + data: {"id":"chatcmpl-DuLeBttf9MGNv6MRME4YoOcRh2ekF","object":"chat.completion.chunk","created":1782321951,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":" "},"finish_reason":null}],"usage":null,"obfuscation":"wyAhGGUI5Vm"} - data: {"id":"chatcmpl-DIgPdKQqJh9SQOWG0lr9E9GR4ejBV","object":"chat.completion.chunk","created":1773345309,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":"3"},"finish_reason":null}],"usage":null,"obfuscation":"KGLb8NU46IG"} + data: {"id":"chatcmpl-DuLeBttf9MGNv6MRME4YoOcRh2ekF","object":"chat.completion.chunk","created":1782321951,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":"3"},"finish_reason":null}],"usage":null,"obfuscation":"JSxgUmdEVLd"} - data: {"id":"chatcmpl-DIgPdKQqJh9SQOWG0lr9E9GR4ejBV","object":"chat.completion.chunk","created":1773345309,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":")"},"finish_reason":null}],"usage":null,"obfuscation":"jB9cmhKKTFW"} + data: {"id":"chatcmpl-DuLeBttf9MGNv6MRME4YoOcRh2ekF","object":"chat.completion.chunk","created":1782321951,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":" ="},"finish_reason":null}],"usage":null,"obfuscation":"Rg3pYnMTx2"} - data: {"id":"chatcmpl-DIgPdKQqJh9SQOWG0lr9E9GR4ejBV","object":"chat.completion.chunk","created":1773345309,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":" ="},"finish_reason":null}],"usage":null,"obfuscation":"esnduWZH99"} + data: {"id":"chatcmpl-DuLeBttf9MGNv6MRME4YoOcRh2ekF","object":"chat.completion.chunk","created":1782321951,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":" "},"finish_reason":null}],"usage":null,"obfuscation":"VdRLN4d0qxD"} - data: {"id":"chatcmpl-DIgPdKQqJh9SQOWG0lr9E9GR4ejBV","object":"chat.completion.chunk","created":1773345309,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":" "},"finish_reason":null}],"usage":null,"obfuscation":"d9qdsGvEAIy"} + data: {"id":"chatcmpl-DuLeBttf9MGNv6MRME4YoOcRh2ekF","object":"chat.completion.chunk","created":1782321951,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":"5"},"finish_reason":null}],"usage":null,"obfuscation":"vgCfUYPT4vj"} - data: {"id":"chatcmpl-DIgPdKQqJh9SQOWG0lr9E9GR4ejBV","object":"chat.completion.chunk","created":1773345309,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":"5"},"finish_reason":null}],"usage":null,"obfuscation":"xqmU8b3GaXY"} + data: {"id":"chatcmpl-DuLeBttf9MGNv6MRME4YoOcRh2ekF","object":"chat.completion.chunk","created":1782321951,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":"\n"},"finish_reason":null}],"usage":null,"obfuscation":"8Kz49KbDeA"} - data: {"id":"chatcmpl-DIgPdKQqJh9SQOWG0lr9E9GR4ejBV","object":"chat.completion.chunk","created":1773345309,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":"\n"},"finish_reason":null}],"usage":null,"obfuscation":"G6BZAobIF7"} + data: {"id":"chatcmpl-DuLeBttf9MGNv6MRME4YoOcRh2ekF","object":"chat.completion.chunk","created":1782321951,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":"Multip"},"finish_reason":null}],"usage":null,"obfuscation":"65BEpn"} - data: {"id":"chatcmpl-DIgPdKQqJh9SQOWG0lr9E9GR4ejBV","object":"chat.completion.chunk","created":1773345309,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":"-"},"finish_reason":null}],"usage":null,"obfuscation":"K6le8T0bniD"} + data: {"id":"chatcmpl-DuLeBttf9MGNv6MRME4YoOcRh2ekF","object":"chat.completion.chunk","created":1782321951,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":"lication"},"finish_reason":null}],"usage":null,"obfuscation":"aao8"} - data: {"id":"chatcmpl-DIgPdKQqJh9SQOWG0lr9E9GR4ejBV","object":"chat.completion.chunk","created":1773345309,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":" Product"},"finish_reason":null}],"usage":null,"obfuscation":"ymeI"} + data: {"id":"chatcmpl-DuLeBttf9MGNv6MRME4YoOcRh2ekF","object":"chat.completion.chunk","created":1782321951,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":":"},"finish_reason":null}],"usage":null,"obfuscation":"bgQNvDsSxqH"} - data: {"id":"chatcmpl-DIgPdKQqJh9SQOWG0lr9E9GR4ejBV","object":"chat.completion.chunk","created":1773345309,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":" ("},"finish_reason":null}],"usage":null,"obfuscation":"mcBsTpX0EG"} + data: {"id":"chatcmpl-DuLeBttf9MGNv6MRME4YoOcRh2ekF","object":"chat.completion.chunk","created":1782321951,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":" "},"finish_reason":null}],"usage":null,"obfuscation":"voW9dLUM4PW"} - data: {"id":"chatcmpl-DIgPdKQqJh9SQOWG0lr9E9GR4ejBV","object":"chat.completion.chunk","created":1773345309,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":"2"},"finish_reason":null}],"usage":null,"obfuscation":"pZDrnJ0rCCV"} + data: {"id":"chatcmpl-DuLeBttf9MGNv6MRME4YoOcRh2ekF","object":"chat.completion.chunk","created":1782321951,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":"2"},"finish_reason":null}],"usage":null,"obfuscation":"UQzoCRaezdz"} - data: {"id":"chatcmpl-DIgPdKQqJh9SQOWG0lr9E9GR4ejBV","object":"chat.completion.chunk","created":1773345309,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":" ×"},"finish_reason":null}],"usage":null,"obfuscation":"Bg1rlRRr0x"} + data: {"id":"chatcmpl-DuLeBttf9MGNv6MRME4YoOcRh2ekF","object":"chat.completion.chunk","created":1782321951,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":" ×"},"finish_reason":null}],"usage":null,"obfuscation":"M8aOmOSkVq"} - data: {"id":"chatcmpl-DIgPdKQqJh9SQOWG0lr9E9GR4ejBV","object":"chat.completion.chunk","created":1773345309,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":" "},"finish_reason":null}],"usage":null,"obfuscation":"quSUDqgoByI"} + data: {"id":"chatcmpl-DuLeBttf9MGNv6MRME4YoOcRh2ekF","object":"chat.completion.chunk","created":1782321951,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":" "},"finish_reason":null}],"usage":null,"obfuscation":"L42EYQ0f6iS"} - data: {"id":"chatcmpl-DIgPdKQqJh9SQOWG0lr9E9GR4ejBV","object":"chat.completion.chunk","created":1773345309,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":"3"},"finish_reason":null}],"usage":null,"obfuscation":"kBX0JiHB4LP"} + data: {"id":"chatcmpl-DuLeBttf9MGNv6MRME4YoOcRh2ekF","object":"chat.completion.chunk","created":1782321951,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":"3"},"finish_reason":null}],"usage":null,"obfuscation":"VVekenwOMCs"} - data: {"id":"chatcmpl-DIgPdKQqJh9SQOWG0lr9E9GR4ejBV","object":"chat.completion.chunk","created":1773345309,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":")"},"finish_reason":null}],"usage":null,"obfuscation":"H026O8G0G2x"} + data: {"id":"chatcmpl-DuLeBttf9MGNv6MRME4YoOcRh2ekF","object":"chat.completion.chunk","created":1782321951,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":" ="},"finish_reason":null}],"usage":null,"obfuscation":"NI5AJQjC54"} - data: {"id":"chatcmpl-DIgPdKQqJh9SQOWG0lr9E9GR4ejBV","object":"chat.completion.chunk","created":1773345309,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":" ="},"finish_reason":null}],"usage":null,"obfuscation":"uoZG2R2cHi"} + data: {"id":"chatcmpl-DuLeBttf9MGNv6MRME4YoOcRh2ekF","object":"chat.completion.chunk","created":1782321951,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":" "},"finish_reason":null}],"usage":null,"obfuscation":"DTcPAhIXljV"} - data: {"id":"chatcmpl-DIgPdKQqJh9SQOWG0lr9E9GR4ejBV","object":"chat.completion.chunk","created":1773345309,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":" "},"finish_reason":null}],"usage":null,"obfuscation":"3hIDg40DK7U"} + data: {"id":"chatcmpl-DuLeBttf9MGNv6MRME4YoOcRh2ekF","object":"chat.completion.chunk","created":1782321951,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":"6"},"finish_reason":null}],"usage":null,"obfuscation":"Fsmz8sgpuJQ"} - data: {"id":"chatcmpl-DIgPdKQqJh9SQOWG0lr9E9GR4ejBV","object":"chat.completion.chunk","created":1773345309,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":"6"},"finish_reason":null}],"usage":null,"obfuscation":"Ez70DkFCXuS"} + data: {"id":"chatcmpl-DuLeBttf9MGNv6MRME4YoOcRh2ekF","object":"chat.completion.chunk","created":1782321951,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{},"finish_reason":"stop"}],"usage":null,"obfuscation":"sDLeOY"} - data: {"id":"chatcmpl-DIgPdKQqJh9SQOWG0lr9E9GR4ejBV","object":"chat.completion.chunk","created":1773345309,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{},"finish_reason":"stop"}],"usage":null,"obfuscation":"Lj7Cy9"} - - data: {"id":"chatcmpl-DIgPdKQqJh9SQOWG0lr9E9GR4ejBV","object":"chat.completion.chunk","created":1773345309,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[],"usage":{"prompt_tokens":262,"completion_tokens":26,"total_tokens":288,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"LU3nvWwHd"} + data: {"id":"chatcmpl-DuLeBttf9MGNv6MRME4YoOcRh2ekF","object":"chat.completion.chunk","created":1782321951,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[],"usage":{"prompt_tokens":262,"completion_tokens":25,"total_tokens":287,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"fnF2IrBGZ"} data: [DONE] @@ -140,4 +138,4 @@ interactions: - text/event-stream; charset=utf-8 status: 200 OK code: 200 - duration: 640.692ms + duration: 1.068865292s diff --git a/providertests/testdata/TestOpenAICommon/openai-gpt-5/simple.yaml b/providertests/testdata/TestOpenAICommon/openai-gpt-5/simple.yaml index 5865a8f5d..c13c271d3 100644 --- a/providertests/testdata/TestOpenAICommon/openai-gpt-5/simple.yaml +++ b/providertests/testdata/TestOpenAICommon/openai-gpt-5/simple.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://api.openai.com/v1/chat/completions method: POST response: @@ -26,16 +26,16 @@ interactions: uncompressed: true body: | { - "id": "chatcmpl-DIgOvtAUIXW4npz54Y1WBQrdmydWl", + "id": "chatcmpl-DuLdZDauwhFn5FZYgDe3D5LiXUlQW", "object": "chat.completion", - "created": 1773345265, + "created": 1782321913, "model": "gpt-5-2025-08-07", "choices": [ { "index": 0, "message": { "role": "assistant", - "content": "Oi!", + "content": "Olá!", "refusal": null, "annotations": [] }, @@ -44,14 +44,14 @@ interactions: ], "usage": { "prompt_tokens": 19, - "completion_tokens": 75, - "total_tokens": 94, + "completion_tokens": 139, + "total_tokens": 158, "prompt_tokens_details": { "cached_tokens": 0, "audio_tokens": 0 }, "completion_tokens_details": { - "reasoning_tokens": 64, + "reasoning_tokens": 128, "audio_tokens": 0, "accepted_prediction_tokens": 0, "rejected_prediction_tokens": 0 @@ -65,4 +65,4 @@ interactions: - application/json status: 200 OK code: 200 - duration: 3.497726291s + duration: 3.780336542s diff --git a/providertests/testdata/TestOpenAICommon/openai-gpt-5/simple_streaming.yaml b/providertests/testdata/TestOpenAICommon/openai-gpt-5/simple_streaming.yaml index fcc8b2ba2..afb0165a0 100644 --- a/providertests/testdata/TestOpenAICommon/openai-gpt-5/simple_streaming.yaml +++ b/providertests/testdata/TestOpenAICommon/openai-gpt-5/simple_streaming.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://api.openai.com/v1/chat/completions method: POST response: @@ -24,15 +24,15 @@ interactions: proto_minor: 0 content_length: -1 body: |+ - data: {"id":"chatcmpl-DIgOzIUUPhRUFtD2eaXPrsJ8sQjqP","object":"chat.completion.chunk","created":1773345269,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"finish_reason":null}],"usage":null,"obfuscation":"RqvT6Oh3Gy"} + data: {"id":"chatcmpl-DuLddZr4DRHJOM0r9PiSog78i9fIY","object":"chat.completion.chunk","created":1782321917,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"finish_reason":null}],"usage":null,"obfuscation":"mbRezgIrEH"} - data: {"id":"chatcmpl-DIgOzIUUPhRUFtD2eaXPrsJ8sQjqP","object":"chat.completion.chunk","created":1773345269,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":"Olá"},"finish_reason":null}],"usage":null,"obfuscation":"6TRZKgChI"} + data: {"id":"chatcmpl-DuLddZr4DRHJOM0r9PiSog78i9fIY","object":"chat.completion.chunk","created":1782321917,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":"Olá"},"finish_reason":null}],"usage":null,"obfuscation":"6PfkJQFAw"} - data: {"id":"chatcmpl-DIgOzIUUPhRUFtD2eaXPrsJ8sQjqP","object":"chat.completion.chunk","created":1773345269,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":"!"},"finish_reason":null}],"usage":null,"obfuscation":"arqZWqvZkKB"} + data: {"id":"chatcmpl-DuLddZr4DRHJOM0r9PiSog78i9fIY","object":"chat.completion.chunk","created":1782321917,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":"!"},"finish_reason":null}],"usage":null,"obfuscation":"NJwRWoooWcp"} - data: {"id":"chatcmpl-DIgOzIUUPhRUFtD2eaXPrsJ8sQjqP","object":"chat.completion.chunk","created":1773345269,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{},"finish_reason":"stop"}],"usage":null,"obfuscation":"7H6gf4"} + data: {"id":"chatcmpl-DuLddZr4DRHJOM0r9PiSog78i9fIY","object":"chat.completion.chunk","created":1782321917,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{},"finish_reason":"stop"}],"usage":null,"obfuscation":"RZdMG9"} - data: {"id":"chatcmpl-DIgOzIUUPhRUFtD2eaXPrsJ8sQjqP","object":"chat.completion.chunk","created":1773345269,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[],"usage":{"prompt_tokens":19,"completion_tokens":139,"total_tokens":158,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":128,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"JD3JtPw"} + data: {"id":"chatcmpl-DuLddZr4DRHJOM0r9PiSog78i9fIY","object":"chat.completion.chunk","created":1782321917,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[],"usage":{"prompt_tokens":19,"completion_tokens":75,"total_tokens":94,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":64,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"haKPyvbhUp"} data: [DONE] @@ -41,4 +41,4 @@ interactions: - text/event-stream; charset=utf-8 status: 200 OK code: 200 - duration: 2.667532458s + duration: 4.5948545s diff --git a/providertests/testdata/TestOpenAICommon/openai-gpt-5/tool.yaml b/providertests/testdata/TestOpenAICommon/openai-gpt-5/tool.yaml index c7509e178..a6a6ed4be 100644 --- a/providertests/testdata/TestOpenAICommon/openai-gpt-5/tool.yaml +++ b/providertests/testdata/TestOpenAICommon/openai-gpt-5/tool.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://api.openai.com/v1/chat/completions method: POST response: @@ -26,9 +26,9 @@ interactions: uncompressed: true body: | { - "id": "chatcmpl-DIgP1cdJUOKtUeAnEKhAXPlz4ocX1", + "id": "chatcmpl-DuLdhUGYLeMhuTeydXCkL7TYyTfD4", "object": "chat.completion", - "created": 1773345271, + "created": 1782321921, "model": "gpt-5-2025-08-07", "choices": [ { @@ -38,7 +38,7 @@ interactions: "content": null, "tool_calls": [ { - "id": "call_UC58858zDb1VGnI3t4T7v19X", + "id": "call_CbLGG8FesyHec5bdp4w9isPp", "type": "function", "function": { "name": "weather", @@ -75,7 +75,7 @@ interactions: - application/json status: 200 OK code: 200 - duration: 3.250397625s + duration: 3.380224666s - id: 1 request: proto: HTTP/1.1 @@ -83,14 +83,14 @@ interactions: proto_minor: 1 content_length: 710 host: "" - body: '{"messages":[{"content":"You are a helpful assistant","role":"system"},{"content":"What''s the weather in Florence,Italy?","role":"user"},{"tool_calls":[{"id":"call_UC58858zDb1VGnI3t4T7v19X","function":{"arguments":"{\"location\":\"Florence, Italy\"}","name":"weather"},"type":"function"}],"role":"assistant"},{"content":"40 C","tool_call_id":"call_UC58858zDb1VGnI3t4T7v19X","role":"tool"}],"model":"gpt-5","max_completion_tokens":4000,"tool_choice":"auto","tools":[{"function":{"name":"weather","strict":false,"description":"Get weather information for a location","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"}},"type":"function"}]}' + body: '{"messages":[{"content":"You are a helpful assistant","role":"system"},{"content":"What''s the weather in Florence,Italy?","role":"user"},{"tool_calls":[{"id":"call_CbLGG8FesyHec5bdp4w9isPp","function":{"arguments":"{\"location\":\"Florence, Italy\"}","name":"weather"},"type":"function"}],"role":"assistant"},{"content":"40 C","tool_call_id":"call_CbLGG8FesyHec5bdp4w9isPp","role":"tool"}],"model":"gpt-5","max_completion_tokens":4000,"tool_choice":"auto","tools":[{"function":{"name":"weather","strict":false,"description":"Get weather information for a location","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"}},"type":"function"}]}' headers: Accept: - application/json Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://api.openai.com/v1/chat/completions method: POST response: @@ -101,16 +101,16 @@ interactions: uncompressed: true body: | { - "id": "chatcmpl-DIgP5ZkKTU1fpDUXvRzcsYmgrTBv5", + "id": "chatcmpl-DuLdkUV0J4bowR6h2ZeJgpnWkg57v", "object": "chat.completion", - "created": 1773345275, + "created": 1782321924, "model": "gpt-5-2025-08-07", "choices": [ { "index": 0, "message": { "role": "assistant", - "content": "Right now in Florence, Italy, it’s about 40°C (104°F). Would you like a forecast or more details like wind and humidity?", + "content": "It’s currently about 40°C (104°F) in Florence, Italy. Would you like a forecast or more details like wind and humidity?", "refusal": null, "annotations": [] }, @@ -119,14 +119,14 @@ interactions: ], "usage": { "prompt_tokens": 176, - "completion_tokens": 359, - "total_tokens": 535, + "completion_tokens": 230, + "total_tokens": 406, "prompt_tokens_details": { "cached_tokens": 0, "audio_tokens": 0 }, "completion_tokens_details": { - "reasoning_tokens": 320, + "reasoning_tokens": 192, "audio_tokens": 0, "accepted_prediction_tokens": 0, "rejected_prediction_tokens": 0 @@ -140,4 +140,4 @@ interactions: - application/json status: 200 OK code: 200 - duration: 11.360699125s + duration: 3.903981167s diff --git a/providertests/testdata/TestOpenAICommon/openai-gpt-5/tool_streaming.yaml b/providertests/testdata/TestOpenAICommon/openai-gpt-5/tool_streaming.yaml index 84bdd1950..151e38bde 100644 --- a/providertests/testdata/TestOpenAICommon/openai-gpt-5/tool_streaming.yaml +++ b/providertests/testdata/TestOpenAICommon/openai-gpt-5/tool_streaming.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://api.openai.com/v1/chat/completions method: POST response: @@ -24,27 +24,27 @@ interactions: proto_minor: 0 content_length: -1 body: |+ - data: {"id":"chatcmpl-DIgPGik2hAdKcPOj1RDhKq0ceGhIt","object":"chat.completion.chunk","created":1773345286,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"role":"assistant","content":null,"tool_calls":[{"index":0,"id":"call_eJ2thyY7663zBFMe4P6Lb8Yk","type":"function","function":{"name":"weather","arguments":""}}],"refusal":null},"finish_reason":null}],"usage":null,"obfuscation":"R8PYPwot6"} + data: {"id":"chatcmpl-DuLdov3Qna0hmlIwzwWCG9FRhpJh7","object":"chat.completion.chunk","created":1782321928,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"role":"assistant","content":null,"tool_calls":[{"index":0,"id":"call_eKRQDHJdZUhEXo1K1cobzFrl","type":"function","function":{"name":"weather","arguments":""}}],"refusal":null},"finish_reason":null}],"usage":null,"obfuscation":"pqZwIjEsN"} - data: {"id":"chatcmpl-DIgPGik2hAdKcPOj1RDhKq0ceGhIt","object":"chat.completion.chunk","created":1773345286,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"{\""}}]},"finish_reason":null}],"usage":null,"obfuscation":"aFFn0ls4hxoBT4F"} + data: {"id":"chatcmpl-DuLdov3Qna0hmlIwzwWCG9FRhpJh7","object":"chat.completion.chunk","created":1782321928,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"{\""}}]},"finish_reason":null}],"usage":null,"obfuscation":"r44NVoVhrDTp1Vc"} - data: {"id":"chatcmpl-DIgPGik2hAdKcPOj1RDhKq0ceGhIt","object":"chat.completion.chunk","created":1773345286,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"location"}}]},"finish_reason":null}],"usage":null,"obfuscation":"BrZWmNeP4Y"} + data: {"id":"chatcmpl-DuLdov3Qna0hmlIwzwWCG9FRhpJh7","object":"chat.completion.chunk","created":1782321928,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"location"}}]},"finish_reason":null}],"usage":null,"obfuscation":"53sli4uGNB"} - data: {"id":"chatcmpl-DIgPGik2hAdKcPOj1RDhKq0ceGhIt","object":"chat.completion.chunk","created":1773345286,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"\":\""}}]},"finish_reason":null}],"usage":null,"obfuscation":"PvzCZ3WQzErV7"} + data: {"id":"chatcmpl-DuLdov3Qna0hmlIwzwWCG9FRhpJh7","object":"chat.completion.chunk","created":1782321928,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"\":\""}}]},"finish_reason":null}],"usage":null,"obfuscation":"hEXIIpd7ziZVU"} - data: {"id":"chatcmpl-DIgPGik2hAdKcPOj1RDhKq0ceGhIt","object":"chat.completion.chunk","created":1773345286,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"Flor"}}]},"finish_reason":null}],"usage":null,"obfuscation":"c1obCHKkYVIePA"} + data: {"id":"chatcmpl-DuLdov3Qna0hmlIwzwWCG9FRhpJh7","object":"chat.completion.chunk","created":1782321928,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"Flor"}}]},"finish_reason":null}],"usage":null,"obfuscation":"gQGSsxNul96OCn"} - data: {"id":"chatcmpl-DIgPGik2hAdKcPOj1RDhKq0ceGhIt","object":"chat.completion.chunk","created":1773345286,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"ence"}}]},"finish_reason":null}],"usage":null,"obfuscation":"q4u1B6Y6c6SUhW"} + data: {"id":"chatcmpl-DuLdov3Qna0hmlIwzwWCG9FRhpJh7","object":"chat.completion.chunk","created":1782321928,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"ence"}}]},"finish_reason":null}],"usage":null,"obfuscation":"lwG3WsFSvsvkvG"} - data: {"id":"chatcmpl-DIgPGik2hAdKcPOj1RDhKq0ceGhIt","object":"chat.completion.chunk","created":1773345286,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":","}}]},"finish_reason":null}],"usage":null,"obfuscation":"Y"} + data: {"id":"chatcmpl-DuLdov3Qna0hmlIwzwWCG9FRhpJh7","object":"chat.completion.chunk","created":1782321928,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":","}}]},"finish_reason":null}],"usage":null,"obfuscation":"I"} - data: {"id":"chatcmpl-DIgPGik2hAdKcPOj1RDhKq0ceGhIt","object":"chat.completion.chunk","created":1773345286,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" Italy"}}]},"finish_reason":null}],"usage":null,"obfuscation":"gxardK8TniMI"} + data: {"id":"chatcmpl-DuLdov3Qna0hmlIwzwWCG9FRhpJh7","object":"chat.completion.chunk","created":1782321928,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" Italy"}}]},"finish_reason":null}],"usage":null,"obfuscation":"XUOQ6n6zkjud"} - data: {"id":"chatcmpl-DIgPGik2hAdKcPOj1RDhKq0ceGhIt","object":"chat.completion.chunk","created":1773345286,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"\"}"}}]},"finish_reason":null}],"usage":null,"obfuscation":"cCSFWJkwLh8xewo"} + data: {"id":"chatcmpl-DuLdov3Qna0hmlIwzwWCG9FRhpJh7","object":"chat.completion.chunk","created":1782321928,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"\"}"}}]},"finish_reason":null}],"usage":null,"obfuscation":"SscH2aQops12iVO"} - data: {"id":"chatcmpl-DIgPGik2hAdKcPOj1RDhKq0ceGhIt","object":"chat.completion.chunk","created":1773345286,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{},"finish_reason":"tool_calls"}],"usage":null,"obfuscation":""} + data: {"id":"chatcmpl-DuLdov3Qna0hmlIwzwWCG9FRhpJh7","object":"chat.completion.chunk","created":1782321928,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{},"finish_reason":"tool_calls"}],"usage":null,"obfuscation":""} - data: {"id":"chatcmpl-DIgPGik2hAdKcPOj1RDhKq0ceGhIt","object":"chat.completion.chunk","created":1773345286,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[],"usage":{"prompt_tokens":145,"completion_tokens":89,"total_tokens":234,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":64,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"NLZbTOjm"} + data: {"id":"chatcmpl-DuLdov3Qna0hmlIwzwWCG9FRhpJh7","object":"chat.completion.chunk","created":1782321928,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[],"usage":{"prompt_tokens":145,"completion_tokens":89,"total_tokens":234,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":64,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"j5kV7n99"} data: [DONE] @@ -53,7 +53,7 @@ interactions: - text/event-stream; charset=utf-8 status: 200 OK code: 200 - duration: 2.531527834s + duration: 1.857834666s - id: 1 request: proto: HTTP/1.1 @@ -61,14 +61,14 @@ interactions: proto_minor: 1 content_length: 764 host: "" - body: '{"messages":[{"content":"You are a helpful assistant","role":"system"},{"content":"What''s the weather in Florence,Italy?","role":"user"},{"tool_calls":[{"id":"call_eJ2thyY7663zBFMe4P6Lb8Yk","function":{"arguments":"{\"location\":\"Florence, Italy\"}","name":"weather"},"type":"function"}],"role":"assistant"},{"content":"40 C","tool_call_id":"call_eJ2thyY7663zBFMe4P6Lb8Yk","role":"tool"}],"model":"gpt-5","max_completion_tokens":4000,"stream_options":{"include_usage":true},"tool_choice":"auto","tools":[{"function":{"name":"weather","strict":false,"description":"Get weather information for a location","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"}},"type":"function"}],"stream":true}' + body: '{"messages":[{"content":"You are a helpful assistant","role":"system"},{"content":"What''s the weather in Florence,Italy?","role":"user"},{"tool_calls":[{"id":"call_eKRQDHJdZUhEXo1K1cobzFrl","function":{"arguments":"{\"location\":\"Florence, Italy\"}","name":"weather"},"type":"function"}],"role":"assistant"},{"content":"40 C","tool_call_id":"call_eKRQDHJdZUhEXo1K1cobzFrl","role":"tool"}],"model":"gpt-5","max_completion_tokens":4000,"stream_options":{"include_usage":true},"tool_choice":"auto","tools":[{"function":{"name":"weather","strict":false,"description":"Get weather information for a location","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"}},"type":"function"}],"stream":true}' headers: Accept: - application/json Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://api.openai.com/v1/chat/completions method: POST response: @@ -77,65 +77,65 @@ interactions: proto_minor: 0 content_length: -1 body: |+ - data: {"id":"chatcmpl-DIgPJ8oDy11g7Dhcl6yilNP70J3pY","object":"chat.completion.chunk","created":1773345289,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"finish_reason":null}],"usage":null,"obfuscation":"XiDPexih7w"} + data: {"id":"chatcmpl-DuLdqPnSNpAmUBdBXOvPaANHkr3n5","object":"chat.completion.chunk","created":1782321930,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"finish_reason":null}],"usage":null,"obfuscation":"4PwNa98Cwh"} - data: {"id":"chatcmpl-DIgPJ8oDy11g7Dhcl6yilNP70J3pY","object":"chat.completion.chunk","created":1773345289,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":"It"},"finish_reason":null}],"usage":null,"obfuscation":"oENgFXuSd7"} + data: {"id":"chatcmpl-DuLdqPnSNpAmUBdBXOvPaANHkr3n5","object":"chat.completion.chunk","created":1782321930,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":"It"},"finish_reason":null}],"usage":null,"obfuscation":"h3Wa64KFlW"} - data: {"id":"chatcmpl-DIgPJ8oDy11g7Dhcl6yilNP70J3pY","object":"chat.completion.chunk","created":1773345289,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":"’s"},"finish_reason":null}],"usage":null,"obfuscation":"fzjG0RroQT"} + data: {"id":"chatcmpl-DuLdqPnSNpAmUBdBXOvPaANHkr3n5","object":"chat.completion.chunk","created":1782321930,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":"’s"},"finish_reason":null}],"usage":null,"obfuscation":"hmD6JGbqtz"} - data: {"id":"chatcmpl-DIgPJ8oDy11g7Dhcl6yilNP70J3pY","object":"chat.completion.chunk","created":1773345289,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":" currently"},"finish_reason":null}],"usage":null,"obfuscation":"dz"} + data: {"id":"chatcmpl-DuLdqPnSNpAmUBdBXOvPaANHkr3n5","object":"chat.completion.chunk","created":1782321930,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":" currently"},"finish_reason":null}],"usage":null,"obfuscation":"KE"} - data: {"id":"chatcmpl-DIgPJ8oDy11g7Dhcl6yilNP70J3pY","object":"chat.completion.chunk","created":1773345289,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":" about"},"finish_reason":null}],"usage":null,"obfuscation":"tMbXn0"} + data: {"id":"chatcmpl-DuLdqPnSNpAmUBdBXOvPaANHkr3n5","object":"chat.completion.chunk","created":1782321930,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":" about"},"finish_reason":null}],"usage":null,"obfuscation":"p78ild"} - data: {"id":"chatcmpl-DIgPJ8oDy11g7Dhcl6yilNP70J3pY","object":"chat.completion.chunk","created":1773345289,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":" "},"finish_reason":null}],"usage":null,"obfuscation":"kUvkrAGocnJ"} + data: {"id":"chatcmpl-DuLdqPnSNpAmUBdBXOvPaANHkr3n5","object":"chat.completion.chunk","created":1782321930,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":" "},"finish_reason":null}],"usage":null,"obfuscation":"mu00xoiUAPN"} - data: {"id":"chatcmpl-DIgPJ8oDy11g7Dhcl6yilNP70J3pY","object":"chat.completion.chunk","created":1773345289,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":"40"},"finish_reason":null}],"usage":null,"obfuscation":"99A85XCQou"} + data: {"id":"chatcmpl-DuLdqPnSNpAmUBdBXOvPaANHkr3n5","object":"chat.completion.chunk","created":1782321930,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":"40"},"finish_reason":null}],"usage":null,"obfuscation":"f6VDqIJiL9"} - data: {"id":"chatcmpl-DIgPJ8oDy11g7Dhcl6yilNP70J3pY","object":"chat.completion.chunk","created":1773345289,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":"°C"},"finish_reason":null}],"usage":null,"obfuscation":"AvniZh9bSS"} + data: {"id":"chatcmpl-DuLdqPnSNpAmUBdBXOvPaANHkr3n5","object":"chat.completion.chunk","created":1782321930,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":"°C"},"finish_reason":null}],"usage":null,"obfuscation":"pGOD10ejj6"} - data: {"id":"chatcmpl-DIgPJ8oDy11g7Dhcl6yilNP70J3pY","object":"chat.completion.chunk","created":1773345289,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":" ("},"finish_reason":null}],"usage":null,"obfuscation":"TW8wDQVHS8"} + data: {"id":"chatcmpl-DuLdqPnSNpAmUBdBXOvPaANHkr3n5","object":"chat.completion.chunk","created":1782321930,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":" ("},"finish_reason":null}],"usage":null,"obfuscation":"a16dTKwOvc"} - data: {"id":"chatcmpl-DIgPJ8oDy11g7Dhcl6yilNP70J3pY","object":"chat.completion.chunk","created":1773345289,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":"104"},"finish_reason":null}],"usage":null,"obfuscation":"mZldA7TCO"} + data: {"id":"chatcmpl-DuLdqPnSNpAmUBdBXOvPaANHkr3n5","object":"chat.completion.chunk","created":1782321930,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":"104"},"finish_reason":null}],"usage":null,"obfuscation":"8LQ3xuUr9"} - data: {"id":"chatcmpl-DIgPJ8oDy11g7Dhcl6yilNP70J3pY","object":"chat.completion.chunk","created":1773345289,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":"°F"},"finish_reason":null}],"usage":null,"obfuscation":"8mf53hQtJA"} + data: {"id":"chatcmpl-DuLdqPnSNpAmUBdBXOvPaANHkr3n5","object":"chat.completion.chunk","created":1782321930,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":"°F"},"finish_reason":null}],"usage":null,"obfuscation":"GkdcCVyDtN"} - data: {"id":"chatcmpl-DIgPJ8oDy11g7Dhcl6yilNP70J3pY","object":"chat.completion.chunk","created":1773345289,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":")"},"finish_reason":null}],"usage":null,"obfuscation":"1Rb8wet2NPI"} + data: {"id":"chatcmpl-DuLdqPnSNpAmUBdBXOvPaANHkr3n5","object":"chat.completion.chunk","created":1782321930,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":")"},"finish_reason":null}],"usage":null,"obfuscation":"XUMdd05UPjj"} - data: {"id":"chatcmpl-DIgPJ8oDy11g7Dhcl6yilNP70J3pY","object":"chat.completion.chunk","created":1773345289,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":" in"},"finish_reason":null}],"usage":null,"obfuscation":"Yu5azcKFM"} + data: {"id":"chatcmpl-DuLdqPnSNpAmUBdBXOvPaANHkr3n5","object":"chat.completion.chunk","created":1782321930,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":" in"},"finish_reason":null}],"usage":null,"obfuscation":"zlZXpvjNQ"} - data: {"id":"chatcmpl-DIgPJ8oDy11g7Dhcl6yilNP70J3pY","object":"chat.completion.chunk","created":1773345289,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":" Florence"},"finish_reason":null}],"usage":null,"obfuscation":"F2Q"} + data: {"id":"chatcmpl-DuLdqPnSNpAmUBdBXOvPaANHkr3n5","object":"chat.completion.chunk","created":1782321930,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":" Florence"},"finish_reason":null}],"usage":null,"obfuscation":"8BS"} - data: {"id":"chatcmpl-DIgPJ8oDy11g7Dhcl6yilNP70J3pY","object":"chat.completion.chunk","created":1773345289,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":","},"finish_reason":null}],"usage":null,"obfuscation":"mHcX706UAf7"} + data: {"id":"chatcmpl-DuLdqPnSNpAmUBdBXOvPaANHkr3n5","object":"chat.completion.chunk","created":1782321930,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":","},"finish_reason":null}],"usage":null,"obfuscation":"3Yd9nVptDAh"} - data: {"id":"chatcmpl-DIgPJ8oDy11g7Dhcl6yilNP70J3pY","object":"chat.completion.chunk","created":1773345289,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":" Italy"},"finish_reason":null}],"usage":null,"obfuscation":"5ZKafo"} + data: {"id":"chatcmpl-DuLdqPnSNpAmUBdBXOvPaANHkr3n5","object":"chat.completion.chunk","created":1782321930,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":" Italy"},"finish_reason":null}],"usage":null,"obfuscation":"FDUSz1"} - data: {"id":"chatcmpl-DIgPJ8oDy11g7Dhcl6yilNP70J3pY","object":"chat.completion.chunk","created":1773345289,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":"."},"finish_reason":null}],"usage":null,"obfuscation":"ksBJT9ORN4W"} + data: {"id":"chatcmpl-DuLdqPnSNpAmUBdBXOvPaANHkr3n5","object":"chat.completion.chunk","created":1782321930,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":"."},"finish_reason":null}],"usage":null,"obfuscation":"HKZNEg60au3"} - data: {"id":"chatcmpl-DIgPJ8oDy11g7Dhcl6yilNP70J3pY","object":"chat.completion.chunk","created":1773345289,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":" Want"},"finish_reason":null}],"usage":null,"obfuscation":"AsH09ka"} + data: {"id":"chatcmpl-DuLdqPnSNpAmUBdBXOvPaANHkr3n5","object":"chat.completion.chunk","created":1782321930,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":" Want"},"finish_reason":null}],"usage":null,"obfuscation":"4Z3V20I"} - data: {"id":"chatcmpl-DIgPJ8oDy11g7Dhcl6yilNP70J3pY","object":"chat.completion.chunk","created":1773345289,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":" a"},"finish_reason":null}],"usage":null,"obfuscation":"ffDCYtZfG6"} + data: {"id":"chatcmpl-DuLdqPnSNpAmUBdBXOvPaANHkr3n5","object":"chat.completion.chunk","created":1782321930,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":" a"},"finish_reason":null}],"usage":null,"obfuscation":"K8Z8xQ3OgG"} - data: {"id":"chatcmpl-DIgPJ8oDy11g7Dhcl6yilNP70J3pY","object":"chat.completion.chunk","created":1773345289,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":" forecast"},"finish_reason":null}],"usage":null,"obfuscation":"ree"} + data: {"id":"chatcmpl-DuLdqPnSNpAmUBdBXOvPaANHkr3n5","object":"chat.completion.chunk","created":1782321930,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":" forecast"},"finish_reason":null}],"usage":null,"obfuscation":"vWU"} - data: {"id":"chatcmpl-DIgPJ8oDy11g7Dhcl6yilNP70J3pY","object":"chat.completion.chunk","created":1773345289,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":" or"},"finish_reason":null}],"usage":null,"obfuscation":"8KeKcBw5T"} + data: {"id":"chatcmpl-DuLdqPnSNpAmUBdBXOvPaANHkr3n5","object":"chat.completion.chunk","created":1782321930,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":" or"},"finish_reason":null}],"usage":null,"obfuscation":"2xpySe2rU"} - data: {"id":"chatcmpl-DIgPJ8oDy11g7Dhcl6yilNP70J3pY","object":"chat.completion.chunk","created":1773345289,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":" more"},"finish_reason":null}],"usage":null,"obfuscation":"S9sBpHy"} + data: {"id":"chatcmpl-DuLdqPnSNpAmUBdBXOvPaANHkr3n5","object":"chat.completion.chunk","created":1782321930,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":" more"},"finish_reason":null}],"usage":null,"obfuscation":"WWb6Vb8"} - data: {"id":"chatcmpl-DIgPJ8oDy11g7Dhcl6yilNP70J3pY","object":"chat.completion.chunk","created":1773345289,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":" details"},"finish_reason":null}],"usage":null,"obfuscation":"855E"} + data: {"id":"chatcmpl-DuLdqPnSNpAmUBdBXOvPaANHkr3n5","object":"chat.completion.chunk","created":1782321930,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":" details"},"finish_reason":null}],"usage":null,"obfuscation":"vcFu"} - data: {"id":"chatcmpl-DIgPJ8oDy11g7Dhcl6yilNP70J3pY","object":"chat.completion.chunk","created":1773345289,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":" like"},"finish_reason":null}],"usage":null,"obfuscation":"ZsQcAoo"} + data: {"id":"chatcmpl-DuLdqPnSNpAmUBdBXOvPaANHkr3n5","object":"chat.completion.chunk","created":1782321930,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":" like"},"finish_reason":null}],"usage":null,"obfuscation":"GBcQgp8"} - data: {"id":"chatcmpl-DIgPJ8oDy11g7Dhcl6yilNP70J3pY","object":"chat.completion.chunk","created":1773345289,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":" wind"},"finish_reason":null}],"usage":null,"obfuscation":"gPWHHcw"} + data: {"id":"chatcmpl-DuLdqPnSNpAmUBdBXOvPaANHkr3n5","object":"chat.completion.chunk","created":1782321930,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":" wind"},"finish_reason":null}],"usage":null,"obfuscation":"6Xu3T3n"} - data: {"id":"chatcmpl-DIgPJ8oDy11g7Dhcl6yilNP70J3pY","object":"chat.completion.chunk","created":1773345289,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":" and"},"finish_reason":null}],"usage":null,"obfuscation":"fb50AAQB"} + data: {"id":"chatcmpl-DuLdqPnSNpAmUBdBXOvPaANHkr3n5","object":"chat.completion.chunk","created":1782321930,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":" and"},"finish_reason":null}],"usage":null,"obfuscation":"4nOLsfvk"} - data: {"id":"chatcmpl-DIgPJ8oDy11g7Dhcl6yilNP70J3pY","object":"chat.completion.chunk","created":1773345289,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":" precipitation"},"finish_reason":null}],"usage":null,"obfuscation":"GFPj1aAFqr092b"} + data: {"id":"chatcmpl-DuLdqPnSNpAmUBdBXOvPaANHkr3n5","object":"chat.completion.chunk","created":1782321930,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":" humidity"},"finish_reason":null}],"usage":null,"obfuscation":"Dip"} - data: {"id":"chatcmpl-DIgPJ8oDy11g7Dhcl6yilNP70J3pY","object":"chat.completion.chunk","created":1773345289,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":"?"},"finish_reason":null}],"usage":null,"obfuscation":"ASOmJoTz8dc"} + data: {"id":"chatcmpl-DuLdqPnSNpAmUBdBXOvPaANHkr3n5","object":"chat.completion.chunk","created":1782321930,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":"?"},"finish_reason":null}],"usage":null,"obfuscation":"ttaIghUhanr"} - data: {"id":"chatcmpl-DIgPJ8oDy11g7Dhcl6yilNP70J3pY","object":"chat.completion.chunk","created":1773345289,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{},"finish_reason":"stop"}],"usage":null,"obfuscation":"FjUHfl"} + data: {"id":"chatcmpl-DuLdqPnSNpAmUBdBXOvPaANHkr3n5","object":"chat.completion.chunk","created":1782321930,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{},"finish_reason":"stop"}],"usage":null,"obfuscation":"ZxFVg0"} - data: {"id":"chatcmpl-DIgPJ8oDy11g7Dhcl6yilNP70J3pY","object":"chat.completion.chunk","created":1773345289,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[],"usage":{"prompt_tokens":176,"completion_tokens":228,"total_tokens":404,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":192,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"Rf9dfT"} + data: {"id":"chatcmpl-DuLdqPnSNpAmUBdBXOvPaANHkr3n5","object":"chat.completion.chunk","created":1782321930,"model":"gpt-5-2025-08-07","service_tier":"default","system_fingerprint":null,"choices":[],"usage":{"prompt_tokens":176,"completion_tokens":228,"total_tokens":404,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":192,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"GG2jTI"} data: [DONE] @@ -144,4 +144,4 @@ interactions: - text/event-stream; charset=utf-8 status: 200 OK code: 200 - duration: 6.066157375s + duration: 5.355454542s diff --git a/providertests/testdata/TestOpenAICommon/openai-o4-mini/simple.yaml b/providertests/testdata/TestOpenAICommon/openai-o4-mini/simple.yaml index 5e6f8fb15..4d3834e36 100644 --- a/providertests/testdata/TestOpenAICommon/openai-o4-mini/simple.yaml +++ b/providertests/testdata/TestOpenAICommon/openai-o4-mini/simple.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://api.openai.com/v1/chat/completions method: POST response: @@ -26,9 +26,9 @@ interactions: uncompressed: true body: | { - "id": "chatcmpl-DIgPfPRHH3hbcJrUvp86lUUftzWnb", + "id": "chatcmpl-DuLeDtyFFWubUMW0S2zKtWAcRItWc", "object": "chat.completion", - "created": 1773345311, + "created": 1782321953, "model": "o4-mini-2025-04-16", "choices": [ { @@ -65,4 +65,4 @@ interactions: - application/json status: 200 OK code: 200 - duration: 2.659721958s + duration: 1.506363042s diff --git a/providertests/testdata/TestOpenAICommon/openai-o4-mini/simple_streaming.yaml b/providertests/testdata/TestOpenAICommon/openai-o4-mini/simple_streaming.yaml index 56d1135df..50134abdf 100644 --- a/providertests/testdata/TestOpenAICommon/openai-o4-mini/simple_streaming.yaml +++ b/providertests/testdata/TestOpenAICommon/openai-o4-mini/simple_streaming.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://api.openai.com/v1/chat/completions method: POST response: @@ -24,15 +24,15 @@ interactions: proto_minor: 0 content_length: -1 body: |+ - data: {"id":"chatcmpl-DIgPh1YE0k628kxm9BT1bZ1Ruc66x","object":"chat.completion.chunk","created":1773345313,"model":"o4-mini-2025-04-16","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"finish_reason":null}],"usage":null,"obfuscation":"a0V9REEu"} + data: {"id":"chatcmpl-DuLeEBVm5LS4rIiGdSJtHqH8h1BgG","object":"chat.completion.chunk","created":1782321954,"model":"o4-mini-2025-04-16","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"finish_reason":null}],"usage":null,"obfuscation":"PcDWkTE9"} - data: {"id":"chatcmpl-DIgPh1YE0k628kxm9BT1bZ1Ruc66x","object":"chat.completion.chunk","created":1773345313,"model":"o4-mini-2025-04-16","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":"Oi"},"finish_reason":null}],"usage":null,"obfuscation":"Zx8hqQTu"} + data: {"id":"chatcmpl-DuLeEBVm5LS4rIiGdSJtHqH8h1BgG","object":"chat.completion.chunk","created":1782321954,"model":"o4-mini-2025-04-16","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":"Olá"},"finish_reason":null}],"usage":null,"obfuscation":"K7E1609"} - data: {"id":"chatcmpl-DIgPh1YE0k628kxm9BT1bZ1Ruc66x","object":"chat.completion.chunk","created":1773345313,"model":"o4-mini-2025-04-16","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":"!"},"finish_reason":null}],"usage":null,"obfuscation":"Pwf1M3ddx"} + data: {"id":"chatcmpl-DuLeEBVm5LS4rIiGdSJtHqH8h1BgG","object":"chat.completion.chunk","created":1782321954,"model":"o4-mini-2025-04-16","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":"!"},"finish_reason":null}],"usage":null,"obfuscation":"x3J5CuhsX"} - data: {"id":"chatcmpl-DIgPh1YE0k628kxm9BT1bZ1Ruc66x","object":"chat.completion.chunk","created":1773345313,"model":"o4-mini-2025-04-16","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{},"finish_reason":"stop"}],"usage":null,"obfuscation":"DyIS"} + data: {"id":"chatcmpl-DuLeEBVm5LS4rIiGdSJtHqH8h1BgG","object":"chat.completion.chunk","created":1782321954,"model":"o4-mini-2025-04-16","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{},"finish_reason":"stop"}],"usage":null,"obfuscation":"Y4Mt"} - data: {"id":"chatcmpl-DIgPh1YE0k628kxm9BT1bZ1Ruc66x","object":"chat.completion.chunk","created":1773345313,"model":"o4-mini-2025-04-16","service_tier":"default","system_fingerprint":null,"choices":[],"usage":{"prompt_tokens":19,"completion_tokens":148,"total_tokens":167,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":128,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"2vHvk"} + data: {"id":"chatcmpl-DuLeEBVm5LS4rIiGdSJtHqH8h1BgG","object":"chat.completion.chunk","created":1782321954,"model":"o4-mini-2025-04-16","service_tier":"default","system_fingerprint":null,"choices":[],"usage":{"prompt_tokens":19,"completion_tokens":84,"total_tokens":103,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":64,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"kcfzPmF"} data: [DONE] @@ -41,4 +41,4 @@ interactions: - text/event-stream; charset=utf-8 status: 200 OK code: 200 - duration: 1.727020792s + duration: 1.2101485s diff --git a/providertests/testdata/TestOpenAICommon/openai-o4-mini/tool.yaml b/providertests/testdata/TestOpenAICommon/openai-o4-mini/tool.yaml index cac2c69da..ad550c3e5 100644 --- a/providertests/testdata/TestOpenAICommon/openai-o4-mini/tool.yaml +++ b/providertests/testdata/TestOpenAICommon/openai-o4-mini/tool.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://api.openai.com/v1/chat/completions method: POST response: @@ -26,9 +26,9 @@ interactions: uncompressed: true body: | { - "id": "chatcmpl-DIgPjH4PSJNZtaCUtWht6f93kVI2o", + "id": "chatcmpl-DuLeGZov85fGOLxUhGaG3N45Qhm4b", "object": "chat.completion", - "created": 1773345315, + "created": 1782321956, "model": "o4-mini-2025-04-16", "choices": [ { @@ -38,7 +38,7 @@ interactions: "content": null, "tool_calls": [ { - "id": "call_Uto0Xgr2iYWOHzkWGoNNoYTb", + "id": "call_gcwOMtZgMBLlxt6yBBUtJAXo", "type": "function", "function": { "name": "weather", @@ -54,14 +54,14 @@ interactions: ], "usage": { "prompt_tokens": 64, - "completion_tokens": 89, - "total_tokens": 153, + "completion_tokens": 25, + "total_tokens": 89, "prompt_tokens_details": { "cached_tokens": 0, "audio_tokens": 0 }, "completion_tokens_details": { - "reasoning_tokens": 64, + "reasoning_tokens": 0, "audio_tokens": 0, "accepted_prediction_tokens": 0, "rejected_prediction_tokens": 0 @@ -75,7 +75,7 @@ interactions: - application/json status: 200 OK code: 200 - duration: 1.500324417s + duration: 1.112232875s - id: 1 request: proto: HTTP/1.1 @@ -83,14 +83,14 @@ interactions: proto_minor: 1 content_length: 712 host: "" - body: '{"messages":[{"content":"You are a helpful assistant","role":"system"},{"content":"What''s the weather in Florence,Italy?","role":"user"},{"tool_calls":[{"id":"call_Uto0Xgr2iYWOHzkWGoNNoYTb","function":{"arguments":"{\"location\":\"Florence, Italy\"}","name":"weather"},"type":"function"}],"role":"assistant"},{"content":"40 C","tool_call_id":"call_Uto0Xgr2iYWOHzkWGoNNoYTb","role":"tool"}],"model":"o4-mini","max_completion_tokens":4000,"tool_choice":"auto","tools":[{"function":{"name":"weather","strict":false,"description":"Get weather information for a location","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"}},"type":"function"}]}' + body: '{"messages":[{"content":"You are a helpful assistant","role":"system"},{"content":"What''s the weather in Florence,Italy?","role":"user"},{"tool_calls":[{"id":"call_gcwOMtZgMBLlxt6yBBUtJAXo","function":{"arguments":"{\"location\":\"Florence, Italy\"}","name":"weather"},"type":"function"}],"role":"assistant"},{"content":"40 C","tool_call_id":"call_gcwOMtZgMBLlxt6yBBUtJAXo","role":"tool"}],"model":"o4-mini","max_completion_tokens":4000,"tool_choice":"auto","tools":[{"function":{"name":"weather","strict":false,"description":"Get weather information for a location","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"}},"type":"function"}]}' headers: Accept: - application/json Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://api.openai.com/v1/chat/completions method: POST response: @@ -101,16 +101,16 @@ interactions: uncompressed: true body: | { - "id": "chatcmpl-DIgPkGqw5A5Sl65TfoTZrI4dgSUHd", + "id": "chatcmpl-DuLeHQQElASaeLyGeFVfFRmECBBf6", "object": "chat.completion", - "created": 1773345316, + "created": 1782321957, "model": "o4-mini-2025-04-16", "choices": [ { "index": 0, "message": { "role": "assistant", - "content": "The current temperature in Florence, Italy is 40 °C.", + "content": "The current temperature in Florence, Italy is 40°C.", "refusal": null, "annotations": [] }, @@ -119,8 +119,8 @@ interactions: ], "usage": { "prompt_tokens": 95, - "completion_tokens": 25, - "total_tokens": 120, + "completion_tokens": 24, + "total_tokens": 119, "prompt_tokens_details": { "cached_tokens": 0, "audio_tokens": 0 @@ -140,4 +140,4 @@ interactions: - application/json status: 200 OK code: 200 - duration: 872.285291ms + duration: 1.062016042s diff --git a/providertests/testdata/TestOpenAICommon/openai-o4-mini/tool_streaming.yaml b/providertests/testdata/TestOpenAICommon/openai-o4-mini/tool_streaming.yaml index 76109fac5..9f849f446 100644 --- a/providertests/testdata/TestOpenAICommon/openai-o4-mini/tool_streaming.yaml +++ b/providertests/testdata/TestOpenAICommon/openai-o4-mini/tool_streaming.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://api.openai.com/v1/chat/completions method: POST response: @@ -24,27 +24,27 @@ interactions: proto_minor: 0 content_length: -1 body: |+ - data: {"id":"chatcmpl-DIgPlQPwJD3L58NCrIk3tvAcboKkQ","object":"chat.completion.chunk","created":1773345317,"model":"o4-mini-2025-04-16","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"role":"assistant","content":null,"tool_calls":[{"index":0,"id":"call_IPFxz4Q0YCdQYlcVjKu1zTAa","type":"function","function":{"name":"weather","arguments":""}}],"refusal":null},"finish_reason":null}],"usage":null,"obfuscation":"VRnxcNa"} + data: {"id":"chatcmpl-DuLeIpxcRF0CNHhOlprzRuyUJebEf","object":"chat.completion.chunk","created":1782321958,"model":"o4-mini-2025-04-16","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"role":"assistant","content":null,"tool_calls":[{"index":0,"id":"call_SyhYkKgZpS1zkLbedByQ2MLh","type":"function","function":{"name":"weather","arguments":""}}],"refusal":null},"finish_reason":null}],"usage":null,"obfuscation":"sB4WgB1"} - data: {"id":"chatcmpl-DIgPlQPwJD3L58NCrIk3tvAcboKkQ","object":"chat.completion.chunk","created":1773345317,"model":"o4-mini-2025-04-16","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"{\""}}]},"finish_reason":null}],"usage":null,"obfuscation":"V4pTgeLXAx9yZ"} + data: {"id":"chatcmpl-DuLeIpxcRF0CNHhOlprzRuyUJebEf","object":"chat.completion.chunk","created":1782321958,"model":"o4-mini-2025-04-16","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"{\""}}]},"finish_reason":null}],"usage":null,"obfuscation":"6zmU3TCfTZcVi"} - data: {"id":"chatcmpl-DIgPlQPwJD3L58NCrIk3tvAcboKkQ","object":"chat.completion.chunk","created":1773345317,"model":"o4-mini-2025-04-16","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"location"}}]},"finish_reason":null}],"usage":null,"obfuscation":"QsjsqhuC"} + data: {"id":"chatcmpl-DuLeIpxcRF0CNHhOlprzRuyUJebEf","object":"chat.completion.chunk","created":1782321958,"model":"o4-mini-2025-04-16","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"location"}}]},"finish_reason":null}],"usage":null,"obfuscation":"pOWQv60n"} - data: {"id":"chatcmpl-DIgPlQPwJD3L58NCrIk3tvAcboKkQ","object":"chat.completion.chunk","created":1773345317,"model":"o4-mini-2025-04-16","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"\":\""}}]},"finish_reason":null}],"usage":null,"obfuscation":"ikmxFdW0G4O"} + data: {"id":"chatcmpl-DuLeIpxcRF0CNHhOlprzRuyUJebEf","object":"chat.completion.chunk","created":1782321958,"model":"o4-mini-2025-04-16","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"\":\""}}]},"finish_reason":null}],"usage":null,"obfuscation":"LsCRSs0Yi0w"} - data: {"id":"chatcmpl-DIgPlQPwJD3L58NCrIk3tvAcboKkQ","object":"chat.completion.chunk","created":1773345317,"model":"o4-mini-2025-04-16","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"Flor"}}]},"finish_reason":null}],"usage":null,"obfuscation":"13vYLgoRPJKD"} + data: {"id":"chatcmpl-DuLeIpxcRF0CNHhOlprzRuyUJebEf","object":"chat.completion.chunk","created":1782321958,"model":"o4-mini-2025-04-16","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"Flor"}}]},"finish_reason":null}],"usage":null,"obfuscation":"0CZiBbTvsNiI"} - data: {"id":"chatcmpl-DIgPlQPwJD3L58NCrIk3tvAcboKkQ","object":"chat.completion.chunk","created":1773345317,"model":"o4-mini-2025-04-16","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"ence"}}]},"finish_reason":null}],"usage":null,"obfuscation":"aswXf0mYvU03"} + data: {"id":"chatcmpl-DuLeIpxcRF0CNHhOlprzRuyUJebEf","object":"chat.completion.chunk","created":1782321958,"model":"o4-mini-2025-04-16","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"ence"}}]},"finish_reason":null}],"usage":null,"obfuscation":"uk2wffBGPDuB"} - data: {"id":"chatcmpl-DIgPlQPwJD3L58NCrIk3tvAcboKkQ","object":"chat.completion.chunk","created":1773345317,"model":"o4-mini-2025-04-16","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":","}}]},"finish_reason":null}],"usage":null,"obfuscation":"v6X6MmrIfRxFNTD"} + data: {"id":"chatcmpl-DuLeIpxcRF0CNHhOlprzRuyUJebEf","object":"chat.completion.chunk","created":1782321958,"model":"o4-mini-2025-04-16","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":","}}]},"finish_reason":null}],"usage":null,"obfuscation":"P37h4WAH5QC4ZHn"} - data: {"id":"chatcmpl-DIgPlQPwJD3L58NCrIk3tvAcboKkQ","object":"chat.completion.chunk","created":1773345317,"model":"o4-mini-2025-04-16","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" Italy"}}]},"finish_reason":null}],"usage":null,"obfuscation":"VfJN7HUk1x"} + data: {"id":"chatcmpl-DuLeIpxcRF0CNHhOlprzRuyUJebEf","object":"chat.completion.chunk","created":1782321958,"model":"o4-mini-2025-04-16","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":" Italy"}}]},"finish_reason":null}],"usage":null,"obfuscation":"A1pum56HN6"} - data: {"id":"chatcmpl-DIgPlQPwJD3L58NCrIk3tvAcboKkQ","object":"chat.completion.chunk","created":1773345317,"model":"o4-mini-2025-04-16","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"\"}"}}]},"finish_reason":null}],"usage":null,"obfuscation":"ji56ji488O4TT"} + data: {"id":"chatcmpl-DuLeIpxcRF0CNHhOlprzRuyUJebEf","object":"chat.completion.chunk","created":1782321958,"model":"o4-mini-2025-04-16","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"\"}"}}]},"finish_reason":null}],"usage":null,"obfuscation":"TsabzfL3GH8iF"} - data: {"id":"chatcmpl-DIgPlQPwJD3L58NCrIk3tvAcboKkQ","object":"chat.completion.chunk","created":1773345317,"model":"o4-mini-2025-04-16","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{},"finish_reason":"tool_calls"}],"usage":null,"obfuscation":"ZHLEkvPfQiwaBL"} + data: {"id":"chatcmpl-DuLeIpxcRF0CNHhOlprzRuyUJebEf","object":"chat.completion.chunk","created":1782321958,"model":"o4-mini-2025-04-16","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{},"finish_reason":"tool_calls"}],"usage":null,"obfuscation":"UZs3ctGHrZWw4E"} - data: {"id":"chatcmpl-DIgPlQPwJD3L58NCrIk3tvAcboKkQ","object":"chat.completion.chunk","created":1773345317,"model":"o4-mini-2025-04-16","service_tier":"default","system_fingerprint":null,"choices":[],"usage":{"prompt_tokens":64,"completion_tokens":25,"total_tokens":89,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"gn2DQ30v3"} + data: {"id":"chatcmpl-DuLeIpxcRF0CNHhOlprzRuyUJebEf","object":"chat.completion.chunk","created":1782321958,"model":"o4-mini-2025-04-16","service_tier":"default","system_fingerprint":null,"choices":[],"usage":{"prompt_tokens":64,"completion_tokens":89,"total_tokens":153,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":64,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"eYGsxjn"} data: [DONE] @@ -53,7 +53,7 @@ interactions: - text/event-stream; charset=utf-8 status: 200 OK code: 200 - duration: 1.224742875s + duration: 1.461489875s - id: 1 request: proto: HTTP/1.1 @@ -61,14 +61,14 @@ interactions: proto_minor: 1 content_length: 766 host: "" - body: '{"messages":[{"content":"You are a helpful assistant","role":"system"},{"content":"What''s the weather in Florence,Italy?","role":"user"},{"tool_calls":[{"id":"call_IPFxz4Q0YCdQYlcVjKu1zTAa","function":{"arguments":"{\"location\":\"Florence, Italy\"}","name":"weather"},"type":"function"}],"role":"assistant"},{"content":"40 C","tool_call_id":"call_IPFxz4Q0YCdQYlcVjKu1zTAa","role":"tool"}],"model":"o4-mini","max_completion_tokens":4000,"stream_options":{"include_usage":true},"tool_choice":"auto","tools":[{"function":{"name":"weather","strict":false,"description":"Get weather information for a location","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"}},"type":"function"}],"stream":true}' + body: '{"messages":[{"content":"You are a helpful assistant","role":"system"},{"content":"What''s the weather in Florence,Italy?","role":"user"},{"tool_calls":[{"id":"call_SyhYkKgZpS1zkLbedByQ2MLh","function":{"arguments":"{\"location\":\"Florence, Italy\"}","name":"weather"},"type":"function"}],"role":"assistant"},{"content":"40 C","tool_call_id":"call_SyhYkKgZpS1zkLbedByQ2MLh","role":"tool"}],"model":"o4-mini","max_completion_tokens":4000,"stream_options":{"include_usage":true},"tool_choice":"auto","tools":[{"function":{"name":"weather","strict":false,"description":"Get weather information for a location","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"}},"type":"function"}],"stream":true}' headers: Accept: - application/json Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://api.openai.com/v1/chat/completions method: POST response: @@ -77,97 +77,35 @@ interactions: proto_minor: 0 content_length: -1 body: |+ - data: {"id":"chatcmpl-DIgPmdvQ53n4Vw2fe770d2VxVZnq3","object":"chat.completion.chunk","created":1773345318,"model":"o4-mini-2025-04-16","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"finish_reason":null}],"usage":null,"obfuscation":"DDlYigKk"} + data: {"id":"chatcmpl-DuLeJV9loA6ZzqCkq1cqsgj5kb1cA","object":"chat.completion.chunk","created":1782321959,"model":"o4-mini-2025-04-16","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"finish_reason":null}],"usage":null,"obfuscation":"4EmLmcZI"} - data: {"id":"chatcmpl-DIgPmdvQ53n4Vw2fe770d2VxVZnq3","object":"chat.completion.chunk","created":1773345318,"model":"o4-mini-2025-04-16","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":"The"},"finish_reason":null}],"usage":null,"obfuscation":"jeEaJfD"} + data: {"id":"chatcmpl-DuLeJV9loA6ZzqCkq1cqsgj5kb1cA","object":"chat.completion.chunk","created":1782321959,"model":"o4-mini-2025-04-16","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":"The"},"finish_reason":null}],"usage":null,"obfuscation":"FvzY1jq"} - data: {"id":"chatcmpl-DIgPmdvQ53n4Vw2fe770d2VxVZnq3","object":"chat.completion.chunk","created":1773345318,"model":"o4-mini-2025-04-16","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":" current"},"finish_reason":null}],"usage":null,"obfuscation":"ao"} + data: {"id":"chatcmpl-DuLeJV9loA6ZzqCkq1cqsgj5kb1cA","object":"chat.completion.chunk","created":1782321959,"model":"o4-mini-2025-04-16","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":" current"},"finish_reason":null}],"usage":null,"obfuscation":"5w"} - data: {"id":"chatcmpl-DIgPmdvQ53n4Vw2fe770d2VxVZnq3","object":"chat.completion.chunk","created":1773345318,"model":"o4-mini-2025-04-16","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":" temperature"},"finish_reason":null}],"usage":null,"obfuscation":"O4FwZbYiLtqXpB"} + data: {"id":"chatcmpl-DuLeJV9loA6ZzqCkq1cqsgj5kb1cA","object":"chat.completion.chunk","created":1782321959,"model":"o4-mini-2025-04-16","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":" temperature"},"finish_reason":null}],"usage":null,"obfuscation":"eX6bjSeHrfjX6C"} - data: {"id":"chatcmpl-DIgPmdvQ53n4Vw2fe770d2VxVZnq3","object":"chat.completion.chunk","created":1773345318,"model":"o4-mini-2025-04-16","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":" in"},"finish_reason":null}],"usage":null,"obfuscation":"HuZjbZc"} + data: {"id":"chatcmpl-DuLeJV9loA6ZzqCkq1cqsgj5kb1cA","object":"chat.completion.chunk","created":1782321959,"model":"o4-mini-2025-04-16","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":" in"},"finish_reason":null}],"usage":null,"obfuscation":"dYGSTr4"} - data: {"id":"chatcmpl-DIgPmdvQ53n4Vw2fe770d2VxVZnq3","object":"chat.completion.chunk","created":1773345318,"model":"o4-mini-2025-04-16","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":" Florence"},"finish_reason":null}],"usage":null,"obfuscation":"2"} + data: {"id":"chatcmpl-DuLeJV9loA6ZzqCkq1cqsgj5kb1cA","object":"chat.completion.chunk","created":1782321959,"model":"o4-mini-2025-04-16","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":" Florence"},"finish_reason":null}],"usage":null,"obfuscation":"s"} - data: {"id":"chatcmpl-DIgPmdvQ53n4Vw2fe770d2VxVZnq3","object":"chat.completion.chunk","created":1773345318,"model":"o4-mini-2025-04-16","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":","},"finish_reason":null}],"usage":null,"obfuscation":"SP4qhQ9ir"} + data: {"id":"chatcmpl-DuLeJV9loA6ZzqCkq1cqsgj5kb1cA","object":"chat.completion.chunk","created":1782321959,"model":"o4-mini-2025-04-16","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":","},"finish_reason":null}],"usage":null,"obfuscation":"leQ1KIGqn"} - data: {"id":"chatcmpl-DIgPmdvQ53n4Vw2fe770d2VxVZnq3","object":"chat.completion.chunk","created":1773345318,"model":"o4-mini-2025-04-16","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":" Italy"},"finish_reason":null}],"usage":null,"obfuscation":"dYeJ"} + data: {"id":"chatcmpl-DuLeJV9loA6ZzqCkq1cqsgj5kb1cA","object":"chat.completion.chunk","created":1782321959,"model":"o4-mini-2025-04-16","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":" Italy"},"finish_reason":null}],"usage":null,"obfuscation":"BmGq"} - data: {"id":"chatcmpl-DIgPmdvQ53n4Vw2fe770d2VxVZnq3","object":"chat.completion.chunk","created":1773345318,"model":"o4-mini-2025-04-16","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":" is"},"finish_reason":null}],"usage":null,"obfuscation":"TCxfzaU"} + data: {"id":"chatcmpl-DuLeJV9loA6ZzqCkq1cqsgj5kb1cA","object":"chat.completion.chunk","created":1782321959,"model":"o4-mini-2025-04-16","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":" is"},"finish_reason":null}],"usage":null,"obfuscation":"QqlSvCv"} - data: {"id":"chatcmpl-DIgPmdvQ53n4Vw2fe770d2VxVZnq3","object":"chat.completion.chunk","created":1773345318,"model":"o4-mini-2025-04-16","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":" "},"finish_reason":null}],"usage":null,"obfuscation":"G0YjHOrDQ"} + data: {"id":"chatcmpl-DuLeJV9loA6ZzqCkq1cqsgj5kb1cA","object":"chat.completion.chunk","created":1782321959,"model":"o4-mini-2025-04-16","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":" "},"finish_reason":null}],"usage":null,"obfuscation":"JfPdCnf2j"} - data: {"id":"chatcmpl-DIgPmdvQ53n4Vw2fe770d2VxVZnq3","object":"chat.completion.chunk","created":1773345318,"model":"o4-mini-2025-04-16","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":"40"},"finish_reason":null}],"usage":null,"obfuscation":"F7QFoDDT"} + data: {"id":"chatcmpl-DuLeJV9loA6ZzqCkq1cqsgj5kb1cA","object":"chat.completion.chunk","created":1782321959,"model":"o4-mini-2025-04-16","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":"40"},"finish_reason":null}],"usage":null,"obfuscation":"6WzgNF1P"} - data: {"id":"chatcmpl-DIgPmdvQ53n4Vw2fe770d2VxVZnq3","object":"chat.completion.chunk","created":1773345318,"model":"o4-mini-2025-04-16","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":"°C"},"finish_reason":null}],"usage":null,"obfuscation":"bBVJdTaK"} + data: {"id":"chatcmpl-DuLeJV9loA6ZzqCkq1cqsgj5kb1cA","object":"chat.completion.chunk","created":1782321959,"model":"o4-mini-2025-04-16","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":"°C"},"finish_reason":null}],"usage":null,"obfuscation":"4Xtm8sro"} - data: {"id":"chatcmpl-DIgPmdvQ53n4Vw2fe770d2VxVZnq3","object":"chat.completion.chunk","created":1773345318,"model":"o4-mini-2025-04-16","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":"."},"finish_reason":null}],"usage":null,"obfuscation":"IIGrsbwaB"} + data: {"id":"chatcmpl-DuLeJV9loA6ZzqCkq1cqsgj5kb1cA","object":"chat.completion.chunk","created":1782321959,"model":"o4-mini-2025-04-16","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":"."},"finish_reason":null}],"usage":null,"obfuscation":"b0Axb9Miv"} - data: {"id":"chatcmpl-DIgPmdvQ53n4Vw2fe770d2VxVZnq3","object":"chat.completion.chunk","created":1773345318,"model":"o4-mini-2025-04-16","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":" Let"},"finish_reason":null}],"usage":null,"obfuscation":"lgGKo9"} + data: {"id":"chatcmpl-DuLeJV9loA6ZzqCkq1cqsgj5kb1cA","object":"chat.completion.chunk","created":1782321959,"model":"o4-mini-2025-04-16","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{},"finish_reason":"stop"}],"usage":null,"obfuscation":"JdqL"} - data: {"id":"chatcmpl-DIgPmdvQ53n4Vw2fe770d2VxVZnq3","object":"chat.completion.chunk","created":1773345318,"model":"o4-mini-2025-04-16","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":" me"},"finish_reason":null}],"usage":null,"obfuscation":"v00rVsQ"} - - data: {"id":"chatcmpl-DIgPmdvQ53n4Vw2fe770d2VxVZnq3","object":"chat.completion.chunk","created":1773345318,"model":"o4-mini-2025-04-16","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":" know"},"finish_reason":null}],"usage":null,"obfuscation":"MjgMR"} - - data: {"id":"chatcmpl-DIgPmdvQ53n4Vw2fe770d2VxVZnq3","object":"chat.completion.chunk","created":1773345318,"model":"o4-mini-2025-04-16","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":" if"},"finish_reason":null}],"usage":null,"obfuscation":"aC3WM4K"} - - data: {"id":"chatcmpl-DIgPmdvQ53n4Vw2fe770d2VxVZnq3","object":"chat.completion.chunk","created":1773345318,"model":"o4-mini-2025-04-16","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":" you"},"finish_reason":null}],"usage":null,"obfuscation":"NOFWzn"} - - data: {"id":"chatcmpl-DIgPmdvQ53n4Vw2fe770d2VxVZnq3","object":"chat.completion.chunk","created":1773345318,"model":"o4-mini-2025-04-16","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":"’d"},"finish_reason":null}],"usage":null,"obfuscation":"urEcj2hA"} - - data: {"id":"chatcmpl-DIgPmdvQ53n4Vw2fe770d2VxVZnq3","object":"chat.completion.chunk","created":1773345318,"model":"o4-mini-2025-04-16","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":" like"},"finish_reason":null}],"usage":null,"obfuscation":"WBTJI"} - - data: {"id":"chatcmpl-DIgPmdvQ53n4Vw2fe770d2VxVZnq3","object":"chat.completion.chunk","created":1773345318,"model":"o4-mini-2025-04-16","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":" more"},"finish_reason":null}],"usage":null,"obfuscation":"fsWyl"} - - data: {"id":"chatcmpl-DIgPmdvQ53n4Vw2fe770d2VxVZnq3","object":"chat.completion.chunk","created":1773345318,"model":"o4-mini-2025-04-16","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":" detailed"},"finish_reason":null}],"usage":null,"obfuscation":"4"} - - data: {"id":"chatcmpl-DIgPmdvQ53n4Vw2fe770d2VxVZnq3","object":"chat.completion.chunk","created":1773345318,"model":"o4-mini-2025-04-16","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":" info"},"finish_reason":null}],"usage":null,"obfuscation":"wkh6a"} - - data: {"id":"chatcmpl-DIgPmdvQ53n4Vw2fe770d2VxVZnq3","object":"chat.completion.chunk","created":1773345318,"model":"o4-mini-2025-04-16","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":"—"},"finish_reason":null}],"usage":null,"obfuscation":"H6KfId463"} - - data: {"id":"chatcmpl-DIgPmdvQ53n4Vw2fe770d2VxVZnq3","object":"chat.completion.chunk","created":1773345318,"model":"o4-mini-2025-04-16","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":"such"},"finish_reason":null}],"usage":null,"obfuscation":"Xedcj0"} - - data: {"id":"chatcmpl-DIgPmdvQ53n4Vw2fe770d2VxVZnq3","object":"chat.completion.chunk","created":1773345318,"model":"o4-mini-2025-04-16","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":" as"},"finish_reason":null}],"usage":null,"obfuscation":"oCNLtJB"} - - data: {"id":"chatcmpl-DIgPmdvQ53n4Vw2fe770d2VxVZnq3","object":"chat.completion.chunk","created":1773345318,"model":"o4-mini-2025-04-16","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":" conditions"},"finish_reason":null}],"usage":null,"obfuscation":"vpA8sHknSBMoRi8"} - - data: {"id":"chatcmpl-DIgPmdvQ53n4Vw2fe770d2VxVZnq3","object":"chat.completion.chunk","created":1773345318,"model":"o4-mini-2025-04-16","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":" ("},"finish_reason":null}],"usage":null,"obfuscation":"KCadl7a6"} - - data: {"id":"chatcmpl-DIgPmdvQ53n4Vw2fe770d2VxVZnq3","object":"chat.completion.chunk","created":1773345318,"model":"o4-mini-2025-04-16","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":"sun"},"finish_reason":null}],"usage":null,"obfuscation":"82oDycO"} - - data: {"id":"chatcmpl-DIgPmdvQ53n4Vw2fe770d2VxVZnq3","object":"chat.completion.chunk","created":1773345318,"model":"o4-mini-2025-04-16","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":"ny"},"finish_reason":null}],"usage":null,"obfuscation":"77XWeW6R"} - - data: {"id":"chatcmpl-DIgPmdvQ53n4Vw2fe770d2VxVZnq3","object":"chat.completion.chunk","created":1773345318,"model":"o4-mini-2025-04-16","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":","},"finish_reason":null}],"usage":null,"obfuscation":"NbduFnd0o"} - - data: {"id":"chatcmpl-DIgPmdvQ53n4Vw2fe770d2VxVZnq3","object":"chat.completion.chunk","created":1773345318,"model":"o4-mini-2025-04-16","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":" cloudy"},"finish_reason":null}],"usage":null,"obfuscation":"AGc"} - - data: {"id":"chatcmpl-DIgPmdvQ53n4Vw2fe770d2VxVZnq3","object":"chat.completion.chunk","created":1773345318,"model":"o4-mini-2025-04-16","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":","},"finish_reason":null}],"usage":null,"obfuscation":"TA4voQggb"} - - data: {"id":"chatcmpl-DIgPmdvQ53n4Vw2fe770d2VxVZnq3","object":"chat.completion.chunk","created":1773345318,"model":"o4-mini-2025-04-16","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":" etc"},"finish_reason":null}],"usage":null,"obfuscation":"LzOtRM"} - - data: {"id":"chatcmpl-DIgPmdvQ53n4Vw2fe770d2VxVZnq3","object":"chat.completion.chunk","created":1773345318,"model":"o4-mini-2025-04-16","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":".),"},"finish_reason":null}],"usage":null,"obfuscation":"dIpk1Z1"} - - data: {"id":"chatcmpl-DIgPmdvQ53n4Vw2fe770d2VxVZnq3","object":"chat.completion.chunk","created":1773345318,"model":"o4-mini-2025-04-16","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":" wind"},"finish_reason":null}],"usage":null,"obfuscation":"hADbE"} - - data: {"id":"chatcmpl-DIgPmdvQ53n4Vw2fe770d2VxVZnq3","object":"chat.completion.chunk","created":1773345318,"model":"o4-mini-2025-04-16","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":" speed"},"finish_reason":null}],"usage":null,"obfuscation":"UAsn"} - - data: {"id":"chatcmpl-DIgPmdvQ53n4Vw2fe770d2VxVZnq3","object":"chat.completion.chunk","created":1773345318,"model":"o4-mini-2025-04-16","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":","},"finish_reason":null}],"usage":null,"obfuscation":"r1mai7bLD"} - - data: {"id":"chatcmpl-DIgPmdvQ53n4Vw2fe770d2VxVZnq3","object":"chat.completion.chunk","created":1773345318,"model":"o4-mini-2025-04-16","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":" or"},"finish_reason":null}],"usage":null,"obfuscation":"1H6M62d"} - - data: {"id":"chatcmpl-DIgPmdvQ53n4Vw2fe770d2VxVZnq3","object":"chat.completion.chunk","created":1773345318,"model":"o4-mini-2025-04-16","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":" forecasts"},"finish_reason":null}],"usage":null,"obfuscation":""} - - data: {"id":"chatcmpl-DIgPmdvQ53n4Vw2fe770d2VxVZnq3","object":"chat.completion.chunk","created":1773345318,"model":"o4-mini-2025-04-16","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":" for"},"finish_reason":null}],"usage":null,"obfuscation":"oQJEKo"} - - data: {"id":"chatcmpl-DIgPmdvQ53n4Vw2fe770d2VxVZnq3","object":"chat.completion.chunk","created":1773345318,"model":"o4-mini-2025-04-16","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":" upcoming"},"finish_reason":null}],"usage":null,"obfuscation":"y"} - - data: {"id":"chatcmpl-DIgPmdvQ53n4Vw2fe770d2VxVZnq3","object":"chat.completion.chunk","created":1773345318,"model":"o4-mini-2025-04-16","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":" days"},"finish_reason":null}],"usage":null,"obfuscation":"xgMSt"} - - data: {"id":"chatcmpl-DIgPmdvQ53n4Vw2fe770d2VxVZnq3","object":"chat.completion.chunk","created":1773345318,"model":"o4-mini-2025-04-16","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{"content":"!"},"finish_reason":null}],"usage":null,"obfuscation":"OJ1z2ZLGq"} - - data: {"id":"chatcmpl-DIgPmdvQ53n4Vw2fe770d2VxVZnq3","object":"chat.completion.chunk","created":1773345318,"model":"o4-mini-2025-04-16","service_tier":"default","system_fingerprint":null,"choices":[{"index":0,"delta":{},"finish_reason":"stop"}],"usage":null,"obfuscation":"j9oI"} - - data: {"id":"chatcmpl-DIgPmdvQ53n4Vw2fe770d2VxVZnq3","object":"chat.completion.chunk","created":1773345318,"model":"o4-mini-2025-04-16","service_tier":"default","system_fingerprint":null,"choices":[],"usage":{"prompt_tokens":95,"completion_tokens":55,"total_tokens":150,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"QsTDmpjG"} + data: {"id":"chatcmpl-DuLeJV9loA6ZzqCkq1cqsgj5kb1cA","object":"chat.completion.chunk","created":1782321959,"model":"o4-mini-2025-04-16","service_tier":"default","system_fingerprint":null,"choices":[],"usage":{"prompt_tokens":95,"completion_tokens":24,"total_tokens":119,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"KsLokgiP"} data: [DONE] @@ -176,4 +114,4 @@ interactions: - text/event-stream; charset=utf-8 status: 200 OK code: 200 - duration: 450.043792ms + duration: 594.947791ms diff --git a/providertests/testdata/TestOpenAIResponsesCommon/openai-gpt-4o-mini/multi_tool.yaml b/providertests/testdata/TestOpenAIResponsesCommon/openai-gpt-4o-mini/multi_tool.yaml index 1f857fa03..d74d2b8b4 100644 --- a/providertests/testdata/TestOpenAIResponsesCommon/openai-gpt-4o-mini/multi_tool.yaml +++ b/providertests/testdata/TestOpenAIResponsesCommon/openai-gpt-4o-mini/multi_tool.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://api.openai.com/v1/responses method: POST response: @@ -26,15 +26,15 @@ interactions: uncompressed: true body: |- { - "id": "resp_06c9369658d47a830169b319286e2481978ee58c27688418a4", + "id": "resp_0080d7ac46927739016a3c1210cb8481a08ebce3627ac5b681", "object": "response", - "created_at": 1773345064, + "created_at": 1782321680, "status": "completed", "background": false, "billing": { "payer": "developer" }, - "completed_at": 1773345066, + "completed_at": 1782321681, "error": null, "frequency_penalty": 0.0, "incomplete_details": null, @@ -42,21 +42,22 @@ interactions: "max_output_tokens": 4000, "max_tool_calls": null, "model": "gpt-4o-mini-2024-07-18", + "moderation": null, "output": [ { - "id": "fc_06c9369658d47a830169b3192a8aa88197a0e98a9b82410435", + "id": "fc_0080d7ac46927739016a3c1211ead881a0b79e8c154b90ea97", "type": "function_call", "status": "completed", "arguments": "{\"a\":2,\"b\":3}", - "call_id": "call_Ho1Mm8gWDYTudQDnyEQcs2af", + "call_id": "call_4duuhyRqgE5yacjdB7N3qLs3", "name": "add" }, { - "id": "fc_06c9369658d47a830169b3192a8ab48197849a5cbfde111bab", + "id": "fc_0080d7ac46927739016a3c1211eae481a09556917026b86270", "type": "function_call", "status": "completed", "arguments": "{\"a\":2,\"b\":3}", - "call_id": "call_LyJki45I73XIhz3QOSFsOsd7", + "call_id": "call_R9NaXdicUFYsl6ROHrFdxe2A", "name": "multiply" } ], @@ -64,8 +65,9 @@ interactions: "presence_penalty": 0.0, "previous_response_id": null, "prompt_cache_key": null, - "prompt_cache_retention": null, + "prompt_cache_retention": "in_memory", "reasoning": { + "context": null, "effort": null, "summary": null }, @@ -150,22 +152,22 @@ interactions: - application/json status: 200 OK code: 200 - duration: 3.200548834s + duration: 1.383639792s - id: 1 request: proto: HTTP/1.1 proto_major: 1 proto_minor: 1 - content_length: 1266 + content_length: 1242 host: "" - body: '{"max_output_tokens":4000,"store":false,"input":[{"content":"You are a helpful assistant. CRITICAL: Always use both add and multiply at the same time ALWAYS.","role":"system"},{"content":[{"text":"Add and multiply the number 2 and 3","type":"input_text"}],"role":"user"},{"arguments":"\"{\\\"a\\\":2,\\\"b\\\":3}\"","call_id":"call_Ho1Mm8gWDYTudQDnyEQcs2af","name":"add","type":"function_call"},{"arguments":"\"{\\\"a\\\":2,\\\"b\\\":3}\"","call_id":"call_LyJki45I73XIhz3QOSFsOsd7","name":"multiply","type":"function_call"},{"call_id":"call_Ho1Mm8gWDYTudQDnyEQcs2af","output":"5","type":"function_call_output"},{"call_id":"call_LyJki45I73XIhz3QOSFsOsd7","output":"6","type":"function_call_output"}],"model":"gpt-4o-mini","tool_choice":"auto","tools":[{"strict":false,"parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"},"name":"add","description":"Add two numbers","type":"function"},{"strict":false,"parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"},"name":"multiply","description":"Multiply two numbers","type":"function"}]}' + body: '{"max_output_tokens":4000,"store":false,"input":[{"content":"You are a helpful assistant. CRITICAL: Always use both add and multiply at the same time ALWAYS.","role":"system"},{"content":[{"text":"Add and multiply the number 2 and 3","type":"input_text"}],"role":"user"},{"arguments":"{\"a\":2,\"b\":3}","call_id":"call_4duuhyRqgE5yacjdB7N3qLs3","name":"add","type":"function_call"},{"arguments":"{\"a\":2,\"b\":3}","call_id":"call_R9NaXdicUFYsl6ROHrFdxe2A","name":"multiply","type":"function_call"},{"call_id":"call_4duuhyRqgE5yacjdB7N3qLs3","output":"5","type":"function_call_output"},{"call_id":"call_R9NaXdicUFYsl6ROHrFdxe2A","output":"6","type":"function_call_output"}],"model":"gpt-4o-mini","tool_choice":"auto","tools":[{"strict":false,"parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"},"name":"add","description":"Add two numbers","type":"function"},{"strict":false,"parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"},"name":"multiply","description":"Multiply two numbers","type":"function"}]}' headers: Accept: - application/json Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://api.openai.com/v1/responses method: POST response: @@ -176,15 +178,15 @@ interactions: uncompressed: true body: |- { - "id": "resp_0f6225818e209e0a0169b3192ad504819dad012c3ce78900d1", + "id": "resp_04d1a373cc2cf018016a3c12123434819cb99f7203d1a18223", "object": "response", - "created_at": 1773345066, + "created_at": 1782321682, "status": "completed", "background": false, "billing": { "payer": "developer" }, - "completed_at": 1773345067, + "completed_at": 1782321684, "error": null, "frequency_penalty": 0.0, "incomplete_details": null, @@ -192,9 +194,10 @@ interactions: "max_output_tokens": 4000, "max_tool_calls": null, "model": "gpt-4o-mini-2024-07-18", + "moderation": null, "output": [ { - "id": "msg_0f6225818e209e0a0169b3192b5a28819d8a7380e2cc5f43e3", + "id": "msg_04d1a373cc2cf018016a3c1213f5d0819c979f8a206a2cf048", "type": "message", "status": "completed", "content": [ @@ -202,7 +205,7 @@ interactions: "type": "output_text", "annotations": [], "logprobs": [], - "text": "The results are as follows:\n\n- Addition of 2 and 3: **5**\n- Multiplication of 2 and 3: **6**" + "text": "The results are as follows:\n- **Addition**: 2 + 3 = 5\n- **Multiplication**: 2 \u00d7 3 = 6" } ], "role": "assistant" @@ -212,8 +215,9 @@ interactions: "presence_penalty": 0.0, "previous_response_id": null, "prompt_cache_key": null, - "prompt_cache_retention": null, + "prompt_cache_retention": "in_memory", "reasoning": { + "context": null, "effort": null, "summary": null }, @@ -280,15 +284,15 @@ interactions: "top_p": 1.0, "truncation": "disabled", "usage": { - "input_tokens": 156, + "input_tokens": 154, "input_tokens_details": { "cached_tokens": 0 }, - "output_tokens": 33, + "output_tokens": 36, "output_tokens_details": { "reasoning_tokens": 0 }, - "total_tokens": 189 + "total_tokens": 190 }, "user": null, "metadata": {} @@ -298,4 +302,4 @@ interactions: - application/json status: 200 OK code: 200 - duration: 1.32445875s + duration: 2.623050083s diff --git a/providertests/testdata/TestOpenAIResponsesCommon/openai-gpt-4o-mini/multi_tool_streaming.yaml b/providertests/testdata/TestOpenAIResponsesCommon/openai-gpt-4o-mini/multi_tool_streaming.yaml index b543f60f1..e754c0f41 100644 --- a/providertests/testdata/TestOpenAIResponsesCommon/openai-gpt-4o-mini/multi_tool_streaming.yaml +++ b/providertests/testdata/TestOpenAIResponsesCommon/openai-gpt-4o-mini/multi_tool_streaming.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://api.openai.com/v1/responses method: POST response: @@ -25,59 +25,59 @@ interactions: content_length: -1 body: |+ event: response.created - data: {"type":"response.created","response":{"id":"resp_051ddccacfbdf89b0169b3192ccafc81939f9c25e3b8d1da9c","object":"response","created_at":1773345068,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-4o-mini-2024-07-18","output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":null,"summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Add two numbers","name":"add","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"},"strict":false},{"type":"function","description":"Multiply two numbers","name":"multiply","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":0} + data: {"type":"response.created","response":{"id":"resp_00483e9118f52e4c016a3c1214d5d8819da2ca22014dbd1961","object":"response","created_at":1782321684,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-4o-mini-2024-07-18","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":null,"effort":null,"summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Add two numbers","name":"add","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"},"strict":false},{"type":"function","description":"Multiply two numbers","name":"multiply","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":0} event: response.in_progress - data: {"type":"response.in_progress","response":{"id":"resp_051ddccacfbdf89b0169b3192ccafc81939f9c25e3b8d1da9c","object":"response","created_at":1773345068,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-4o-mini-2024-07-18","output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":null,"summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Add two numbers","name":"add","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"},"strict":false},{"type":"function","description":"Multiply two numbers","name":"multiply","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":1} + data: {"type":"response.in_progress","response":{"id":"resp_00483e9118f52e4c016a3c1214d5d8819da2ca22014dbd1961","object":"response","created_at":1782321684,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-4o-mini-2024-07-18","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":null,"effort":null,"summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Add two numbers","name":"add","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"},"strict":false},{"type":"function","description":"Multiply two numbers","name":"multiply","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":1} event: response.output_item.added - data: {"type":"response.output_item.added","item":{"id":"fc_051ddccacfbdf89b0169b3192e40888193a4298efae5129a6d","type":"function_call","status":"in_progress","arguments":"","call_id":"call_OZDDKUbHklxRCGXcHori821P","name":"add"},"output_index":0,"sequence_number":2} + data: {"type":"response.output_item.added","item":{"id":"fc_00483e9118f52e4c016a3c12160b80819db632c047c5399c42","type":"function_call","status":"in_progress","arguments":"","call_id":"call_ZckkKeJQwcJPC27VXT61xFLf","name":"add"},"output_index":0,"sequence_number":2} event: response.function_call_arguments.delta - data: {"type":"response.function_call_arguments.delta","delta":"{\"a\":2,\"b\":3}","item_id":"fc_051ddccacfbdf89b0169b3192e40888193a4298efae5129a6d","obfuscation":"aHM","output_index":0,"sequence_number":3} + data: {"type":"response.function_call_arguments.delta","delta":"{\"a\":2,\"b\":3}","item_id":"fc_00483e9118f52e4c016a3c12160b80819db632c047c5399c42","obfuscation":"P5U","output_index":0,"sequence_number":3} event: response.function_call_arguments.done - data: {"type":"response.function_call_arguments.done","arguments":"{\"a\":2,\"b\":3}","item_id":"fc_051ddccacfbdf89b0169b3192e40888193a4298efae5129a6d","output_index":0,"sequence_number":4} + data: {"type":"response.function_call_arguments.done","arguments":"{\"a\":2,\"b\":3}","item_id":"fc_00483e9118f52e4c016a3c12160b80819db632c047c5399c42","output_index":0,"sequence_number":4} event: response.output_item.done - data: {"type":"response.output_item.done","item":{"id":"fc_051ddccacfbdf89b0169b3192e40888193a4298efae5129a6d","type":"function_call","status":"completed","arguments":"{\"a\":2,\"b\":3}","call_id":"call_OZDDKUbHklxRCGXcHori821P","name":"add"},"output_index":0,"sequence_number":5} + data: {"type":"response.output_item.done","item":{"id":"fc_00483e9118f52e4c016a3c12160b80819db632c047c5399c42","type":"function_call","status":"completed","arguments":"{\"a\":2,\"b\":3}","call_id":"call_ZckkKeJQwcJPC27VXT61xFLf","name":"add"},"output_index":0,"sequence_number":5} event: response.output_item.added - data: {"type":"response.output_item.added","item":{"id":"fc_051ddccacfbdf89b0169b3192e409881939a4682082a25ca52","type":"function_call","status":"in_progress","arguments":"","call_id":"call_UwFmMZFxz1H4WnsRzFuWhQIK","name":"multiply"},"output_index":1,"sequence_number":6} + data: {"type":"response.output_item.added","item":{"id":"fc_00483e9118f52e4c016a3c12160ba0819d83931caa31f0a841","type":"function_call","status":"in_progress","arguments":"","call_id":"call_M9h2AZgoLEv6q5gkex1QMtm2","name":"multiply"},"output_index":1,"sequence_number":6} event: response.function_call_arguments.delta - data: {"type":"response.function_call_arguments.delta","delta":"{\"a\":2,\"b\":3}","item_id":"fc_051ddccacfbdf89b0169b3192e409881939a4682082a25ca52","obfuscation":"XFH","output_index":1,"sequence_number":7} + data: {"type":"response.function_call_arguments.delta","delta":"{\"a\":2,\"b\":3}","item_id":"fc_00483e9118f52e4c016a3c12160ba0819d83931caa31f0a841","obfuscation":"dmG","output_index":1,"sequence_number":7} event: response.function_call_arguments.done - data: {"type":"response.function_call_arguments.done","arguments":"{\"a\":2,\"b\":3}","item_id":"fc_051ddccacfbdf89b0169b3192e409881939a4682082a25ca52","output_index":1,"sequence_number":8} + data: {"type":"response.function_call_arguments.done","arguments":"{\"a\":2,\"b\":3}","item_id":"fc_00483e9118f52e4c016a3c12160ba0819d83931caa31f0a841","output_index":1,"sequence_number":8} event: response.output_item.done - data: {"type":"response.output_item.done","item":{"id":"fc_051ddccacfbdf89b0169b3192e409881939a4682082a25ca52","type":"function_call","status":"completed","arguments":"{\"a\":2,\"b\":3}","call_id":"call_UwFmMZFxz1H4WnsRzFuWhQIK","name":"multiply"},"output_index":1,"sequence_number":9} + data: {"type":"response.output_item.done","item":{"id":"fc_00483e9118f52e4c016a3c12160ba0819d83931caa31f0a841","type":"function_call","status":"completed","arguments":"{\"a\":2,\"b\":3}","call_id":"call_M9h2AZgoLEv6q5gkex1QMtm2","name":"multiply"},"output_index":1,"sequence_number":9} event: response.completed - data: {"type":"response.completed","response":{"id":"resp_051ddccacfbdf89b0169b3192ccafc81939f9c25e3b8d1da9c","object":"response","created_at":1773345068,"status":"completed","background":false,"completed_at":1773345070,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-4o-mini-2024-07-18","output":[{"id":"fc_051ddccacfbdf89b0169b3192e40888193a4298efae5129a6d","type":"function_call","status":"completed","arguments":"{\"a\":2,\"b\":3}","call_id":"call_OZDDKUbHklxRCGXcHori821P","name":"add"},{"id":"fc_051ddccacfbdf89b0169b3192e409881939a4682082a25ca52","type":"function_call","status":"completed","arguments":"{\"a\":2,\"b\":3}","call_id":"call_UwFmMZFxz1H4WnsRzFuWhQIK","name":"multiply"}],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":null,"summary":null},"safety_identifier":null,"service_tier":"default","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Add two numbers","name":"add","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"},"strict":false},{"type":"function","description":"Multiply two numbers","name":"multiply","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":{"input_tokens":104,"input_tokens_details":{"cached_tokens":0},"output_tokens":51,"output_tokens_details":{"reasoning_tokens":0},"total_tokens":155},"user":null,"metadata":{}},"sequence_number":10} + data: {"type":"response.completed","response":{"id":"resp_00483e9118f52e4c016a3c1214d5d8819da2ca22014dbd1961","object":"response","created_at":1782321684,"status":"completed","background":false,"completed_at":1782321686,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-4o-mini-2024-07-18","moderation":null,"output":[{"id":"fc_00483e9118f52e4c016a3c12160b80819db632c047c5399c42","type":"function_call","status":"completed","arguments":"{\"a\":2,\"b\":3}","call_id":"call_ZckkKeJQwcJPC27VXT61xFLf","name":"add"},{"id":"fc_00483e9118f52e4c016a3c12160ba0819d83931caa31f0a841","type":"function_call","status":"completed","arguments":"{\"a\":2,\"b\":3}","call_id":"call_M9h2AZgoLEv6q5gkex1QMtm2","name":"multiply"}],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":null,"effort":null,"summary":null},"safety_identifier":null,"service_tier":"default","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Add two numbers","name":"add","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"},"strict":false},{"type":"function","description":"Multiply two numbers","name":"multiply","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":{"input_tokens":104,"input_tokens_details":{"cached_tokens":0},"output_tokens":51,"output_tokens_details":{"reasoning_tokens":0},"total_tokens":155},"user":null,"metadata":{}},"sequence_number":10} headers: Content-Type: - text/event-stream; charset=utf-8 status: 200 OK code: 200 - duration: 957.746791ms + duration: 533.525542ms - id: 1 request: proto: HTTP/1.1 proto_major: 1 proto_minor: 1 - content_length: 1263 + content_length: 1239 host: "" - body: '{"max_output_tokens":4000,"store":false,"input":[{"content":"You are a helpful assistant. Always use both add and multiply at the same time.","role":"system"},{"content":[{"text":"Add and multiply the number 2 and 3","type":"input_text"}],"role":"user"},{"arguments":"\"{\\\"a\\\":2,\\\"b\\\":3}\"","call_id":"call_OZDDKUbHklxRCGXcHori821P","name":"add","type":"function_call"},{"arguments":"\"{\\\"a\\\":2,\\\"b\\\":3}\"","call_id":"call_UwFmMZFxz1H4WnsRzFuWhQIK","name":"multiply","type":"function_call"},{"call_id":"call_OZDDKUbHklxRCGXcHori821P","output":"5","type":"function_call_output"},{"call_id":"call_UwFmMZFxz1H4WnsRzFuWhQIK","output":"6","type":"function_call_output"}],"model":"gpt-4o-mini","tool_choice":"auto","tools":[{"strict":false,"parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"},"name":"add","description":"Add two numbers","type":"function"},{"strict":false,"parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"},"name":"multiply","description":"Multiply two numbers","type":"function"}],"stream":true}' + body: '{"max_output_tokens":4000,"store":false,"input":[{"content":"You are a helpful assistant. Always use both add and multiply at the same time.","role":"system"},{"content":[{"text":"Add and multiply the number 2 and 3","type":"input_text"}],"role":"user"},{"arguments":"{\"a\":2,\"b\":3}","call_id":"call_ZckkKeJQwcJPC27VXT61xFLf","name":"add","type":"function_call"},{"arguments":"{\"a\":2,\"b\":3}","call_id":"call_M9h2AZgoLEv6q5gkex1QMtm2","name":"multiply","type":"function_call"},{"call_id":"call_ZckkKeJQwcJPC27VXT61xFLf","output":"5","type":"function_call_output"},{"call_id":"call_M9h2AZgoLEv6q5gkex1QMtm2","output":"6","type":"function_call_output"}],"model":"gpt-4o-mini","tool_choice":"auto","tools":[{"strict":false,"parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"},"name":"add","description":"Add two numbers","type":"function"},{"strict":false,"parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"},"name":"multiply","description":"Multiply two numbers","type":"function"}],"stream":true}' headers: Accept: - application/json Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://api.openai.com/v1/responses method: POST response: @@ -87,110 +87,110 @@ interactions: content_length: -1 body: |+ event: response.created - data: {"type":"response.created","response":{"id":"resp_03f81ba30cbe40970169b3192e9e088196b20448362cb2f58f","object":"response","created_at":1773345070,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-4o-mini-2024-07-18","output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":null,"summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Add two numbers","name":"add","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"},"strict":false},{"type":"function","description":"Multiply two numbers","name":"multiply","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":0} + data: {"type":"response.created","response":{"id":"resp_0ff54135c0daf028016a3c12165ba8819c8c4a4e07fe1d964b","object":"response","created_at":1782321686,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-4o-mini-2024-07-18","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":null,"effort":null,"summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Add two numbers","name":"add","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"},"strict":false},{"type":"function","description":"Multiply two numbers","name":"multiply","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":0} event: response.in_progress - data: {"type":"response.in_progress","response":{"id":"resp_03f81ba30cbe40970169b3192e9e088196b20448362cb2f58f","object":"response","created_at":1773345070,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-4o-mini-2024-07-18","output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":null,"summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Add two numbers","name":"add","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"},"strict":false},{"type":"function","description":"Multiply two numbers","name":"multiply","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":1} + data: {"type":"response.in_progress","response":{"id":"resp_0ff54135c0daf028016a3c12165ba8819c8c4a4e07fe1d964b","object":"response","created_at":1782321686,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-4o-mini-2024-07-18","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":null,"effort":null,"summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Add two numbers","name":"add","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"},"strict":false},{"type":"function","description":"Multiply two numbers","name":"multiply","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":1} event: response.output_item.added - data: {"type":"response.output_item.added","item":{"id":"msg_03f81ba30cbe40970169b3192f975c8196ae7191841f725909","type":"message","status":"in_progress","content":[],"role":"assistant"},"output_index":0,"sequence_number":2} + data: {"type":"response.output_item.added","item":{"id":"msg_0ff54135c0daf028016a3c1216e744819ca39541260ced3e0d","type":"message","status":"in_progress","content":[],"role":"assistant"},"output_index":0,"sequence_number":2} event: response.content_part.added - data: {"type":"response.content_part.added","content_index":0,"item_id":"msg_03f81ba30cbe40970169b3192f975c8196ae7191841f725909","output_index":0,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":""},"sequence_number":3} + data: {"type":"response.content_part.added","content_index":0,"item_id":"msg_0ff54135c0daf028016a3c1216e744819ca39541260ced3e0d","output_index":0,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":""},"sequence_number":3} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":"The","item_id":"msg_03f81ba30cbe40970169b3192f975c8196ae7191841f725909","logprobs":[],"obfuscation":"qAoGwhcl0mmJj","output_index":0,"sequence_number":4} + data: {"type":"response.output_text.delta","content_index":0,"delta":"The","item_id":"msg_0ff54135c0daf028016a3c1216e744819ca39541260ced3e0d","logprobs":[],"obfuscation":"1A5zvLDfD2mYT","output_index":0,"sequence_number":4} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" sum","item_id":"msg_03f81ba30cbe40970169b3192f975c8196ae7191841f725909","logprobs":[],"obfuscation":"IDMGb0V2Wo9T","output_index":0,"sequence_number":5} + data: {"type":"response.output_text.delta","content_index":0,"delta":" sum","item_id":"msg_0ff54135c0daf028016a3c1216e744819ca39541260ced3e0d","logprobs":[],"obfuscation":"73JRD07IgXhb","output_index":0,"sequence_number":5} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" of","item_id":"msg_03f81ba30cbe40970169b3192f975c8196ae7191841f725909","logprobs":[],"obfuscation":"n2s6f8i0aq9rt","output_index":0,"sequence_number":6} + data: {"type":"response.output_text.delta","content_index":0,"delta":" of","item_id":"msg_0ff54135c0daf028016a3c1216e744819ca39541260ced3e0d","logprobs":[],"obfuscation":"R3wUkScX6qQcP","output_index":0,"sequence_number":6} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" ","item_id":"msg_03f81ba30cbe40970169b3192f975c8196ae7191841f725909","logprobs":[],"obfuscation":"bdypggfsMoQMqLb","output_index":0,"sequence_number":7} + data: {"type":"response.output_text.delta","content_index":0,"delta":" ","item_id":"msg_0ff54135c0daf028016a3c1216e744819ca39541260ced3e0d","logprobs":[],"obfuscation":"oVLW8E1tHjnUypb","output_index":0,"sequence_number":7} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":"2","item_id":"msg_03f81ba30cbe40970169b3192f975c8196ae7191841f725909","logprobs":[],"obfuscation":"dKExYa2KxoxJ5nX","output_index":0,"sequence_number":8} + data: {"type":"response.output_text.delta","content_index":0,"delta":"2","item_id":"msg_0ff54135c0daf028016a3c1216e744819ca39541260ced3e0d","logprobs":[],"obfuscation":"11mp0AF17Usy3CA","output_index":0,"sequence_number":8} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" and","item_id":"msg_03f81ba30cbe40970169b3192f975c8196ae7191841f725909","logprobs":[],"obfuscation":"rPKLgPWYCdIx","output_index":0,"sequence_number":9} + data: {"type":"response.output_text.delta","content_index":0,"delta":" and","item_id":"msg_0ff54135c0daf028016a3c1216e744819ca39541260ced3e0d","logprobs":[],"obfuscation":"Kumr8c1Ud03N","output_index":0,"sequence_number":9} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" ","item_id":"msg_03f81ba30cbe40970169b3192f975c8196ae7191841f725909","logprobs":[],"obfuscation":"yh7lvlbaOLoCUKR","output_index":0,"sequence_number":10} + data: {"type":"response.output_text.delta","content_index":0,"delta":" ","item_id":"msg_0ff54135c0daf028016a3c1216e744819ca39541260ced3e0d","logprobs":[],"obfuscation":"62ut2fOiTvznfQb","output_index":0,"sequence_number":10} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":"3","item_id":"msg_03f81ba30cbe40970169b3192f975c8196ae7191841f725909","logprobs":[],"obfuscation":"td4dyqvjDbmIdjn","output_index":0,"sequence_number":11} + data: {"type":"response.output_text.delta","content_index":0,"delta":"3","item_id":"msg_0ff54135c0daf028016a3c1216e744819ca39541260ced3e0d","logprobs":[],"obfuscation":"cVm9hNXlmA4Krvx","output_index":0,"sequence_number":11} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" is","item_id":"msg_03f81ba30cbe40970169b3192f975c8196ae7191841f725909","logprobs":[],"obfuscation":"JtkMBVtrOTRZ1","output_index":0,"sequence_number":12} + data: {"type":"response.output_text.delta","content_index":0,"delta":" is","item_id":"msg_0ff54135c0daf028016a3c1216e744819ca39541260ced3e0d","logprobs":[],"obfuscation":"SymDkRD33TL7o","output_index":0,"sequence_number":12} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" **","item_id":"msg_03f81ba30cbe40970169b3192f975c8196ae7191841f725909","logprobs":[],"obfuscation":"EMwU8JS5km4ax","output_index":0,"sequence_number":13} + data: {"type":"response.output_text.delta","content_index":0,"delta":" **","item_id":"msg_0ff54135c0daf028016a3c1216e744819ca39541260ced3e0d","logprobs":[],"obfuscation":"Jm84rerRdQV9S","output_index":0,"sequence_number":13} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":"5","item_id":"msg_03f81ba30cbe40970169b3192f975c8196ae7191841f725909","logprobs":[],"obfuscation":"GeluUzHRL1lzpnw","output_index":0,"sequence_number":14} + data: {"type":"response.output_text.delta","content_index":0,"delta":"5","item_id":"msg_0ff54135c0daf028016a3c1216e744819ca39541260ced3e0d","logprobs":[],"obfuscation":"imN2YcxvzfHlGvw","output_index":0,"sequence_number":14} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":"**,","item_id":"msg_03f81ba30cbe40970169b3192f975c8196ae7191841f725909","logprobs":[],"obfuscation":"HE4A57xivBnAW","output_index":0,"sequence_number":15} + data: {"type":"response.output_text.delta","content_index":0,"delta":"**,","item_id":"msg_0ff54135c0daf028016a3c1216e744819ca39541260ced3e0d","logprobs":[],"obfuscation":"fL07UFWsyb3iq","output_index":0,"sequence_number":15} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" and","item_id":"msg_03f81ba30cbe40970169b3192f975c8196ae7191841f725909","logprobs":[],"obfuscation":"C7diJuQ63b9T","output_index":0,"sequence_number":16} + data: {"type":"response.output_text.delta","content_index":0,"delta":" and","item_id":"msg_0ff54135c0daf028016a3c1216e744819ca39541260ced3e0d","logprobs":[],"obfuscation":"y9MiA7NJgtNm","output_index":0,"sequence_number":16} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" the","item_id":"msg_03f81ba30cbe40970169b3192f975c8196ae7191841f725909","logprobs":[],"obfuscation":"pbLnbdqWTPX3","output_index":0,"sequence_number":17} + data: {"type":"response.output_text.delta","content_index":0,"delta":" the","item_id":"msg_0ff54135c0daf028016a3c1216e744819ca39541260ced3e0d","logprobs":[],"obfuscation":"XFcLFPfTZL0L","output_index":0,"sequence_number":17} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" product","item_id":"msg_03f81ba30cbe40970169b3192f975c8196ae7191841f725909","logprobs":[],"obfuscation":"hYzibBX9","output_index":0,"sequence_number":18} + data: {"type":"response.output_text.delta","content_index":0,"delta":" product","item_id":"msg_0ff54135c0daf028016a3c1216e744819ca39541260ced3e0d","logprobs":[],"obfuscation":"eHNmjNeE","output_index":0,"sequence_number":18} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" of","item_id":"msg_03f81ba30cbe40970169b3192f975c8196ae7191841f725909","logprobs":[],"obfuscation":"73JJGCaqZl5hG","output_index":0,"sequence_number":19} + data: {"type":"response.output_text.delta","content_index":0,"delta":" of","item_id":"msg_0ff54135c0daf028016a3c1216e744819ca39541260ced3e0d","logprobs":[],"obfuscation":"IyUd3WER5k3mK","output_index":0,"sequence_number":19} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" ","item_id":"msg_03f81ba30cbe40970169b3192f975c8196ae7191841f725909","logprobs":[],"obfuscation":"i28G3RBkaTreeNw","output_index":0,"sequence_number":20} + data: {"type":"response.output_text.delta","content_index":0,"delta":" ","item_id":"msg_0ff54135c0daf028016a3c1216e744819ca39541260ced3e0d","logprobs":[],"obfuscation":"pFvMZq0vZx0DPLx","output_index":0,"sequence_number":20} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":"2","item_id":"msg_03f81ba30cbe40970169b3192f975c8196ae7191841f725909","logprobs":[],"obfuscation":"BbljDec1HqsPA3d","output_index":0,"sequence_number":21} + data: {"type":"response.output_text.delta","content_index":0,"delta":"2","item_id":"msg_0ff54135c0daf028016a3c1216e744819ca39541260ced3e0d","logprobs":[],"obfuscation":"ShyuCloM6Xp7qlX","output_index":0,"sequence_number":21} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" and","item_id":"msg_03f81ba30cbe40970169b3192f975c8196ae7191841f725909","logprobs":[],"obfuscation":"CDlw7VIwZL5r","output_index":0,"sequence_number":22} + data: {"type":"response.output_text.delta","content_index":0,"delta":" and","item_id":"msg_0ff54135c0daf028016a3c1216e744819ca39541260ced3e0d","logprobs":[],"obfuscation":"4OPXPUrXJERI","output_index":0,"sequence_number":22} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" ","item_id":"msg_03f81ba30cbe40970169b3192f975c8196ae7191841f725909","logprobs":[],"obfuscation":"aLU8xTlOgFeaLG6","output_index":0,"sequence_number":23} + data: {"type":"response.output_text.delta","content_index":0,"delta":" ","item_id":"msg_0ff54135c0daf028016a3c1216e744819ca39541260ced3e0d","logprobs":[],"obfuscation":"2QTcoHVYL2dBzxy","output_index":0,"sequence_number":23} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":"3","item_id":"msg_03f81ba30cbe40970169b3192f975c8196ae7191841f725909","logprobs":[],"obfuscation":"OZp1LoSO41VhaAY","output_index":0,"sequence_number":24} + data: {"type":"response.output_text.delta","content_index":0,"delta":"3","item_id":"msg_0ff54135c0daf028016a3c1216e744819ca39541260ced3e0d","logprobs":[],"obfuscation":"35j3Fl3OALRuWIL","output_index":0,"sequence_number":24} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" is","item_id":"msg_03f81ba30cbe40970169b3192f975c8196ae7191841f725909","logprobs":[],"obfuscation":"UEU9rq9Hx8fJg","output_index":0,"sequence_number":25} + data: {"type":"response.output_text.delta","content_index":0,"delta":" is","item_id":"msg_0ff54135c0daf028016a3c1216e744819ca39541260ced3e0d","logprobs":[],"obfuscation":"eA74avtFwAFgv","output_index":0,"sequence_number":25} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" **","item_id":"msg_03f81ba30cbe40970169b3192f975c8196ae7191841f725909","logprobs":[],"obfuscation":"9Oydss0TP23yD","output_index":0,"sequence_number":26} + data: {"type":"response.output_text.delta","content_index":0,"delta":" **","item_id":"msg_0ff54135c0daf028016a3c1216e744819ca39541260ced3e0d","logprobs":[],"obfuscation":"QnS0vweLpokGr","output_index":0,"sequence_number":26} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":"6","item_id":"msg_03f81ba30cbe40970169b3192f975c8196ae7191841f725909","logprobs":[],"obfuscation":"9arKkcOdxDVow6m","output_index":0,"sequence_number":27} + data: {"type":"response.output_text.delta","content_index":0,"delta":"6","item_id":"msg_0ff54135c0daf028016a3c1216e744819ca39541260ced3e0d","logprobs":[],"obfuscation":"WNgxB8deAYo4bwO","output_index":0,"sequence_number":27} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":"**","item_id":"msg_03f81ba30cbe40970169b3192f975c8196ae7191841f725909","logprobs":[],"obfuscation":"VzlVabUmszXW5a","output_index":0,"sequence_number":28} + data: {"type":"response.output_text.delta","content_index":0,"delta":"**","item_id":"msg_0ff54135c0daf028016a3c1216e744819ca39541260ced3e0d","logprobs":[],"obfuscation":"C45d3NQKFkcGWq","output_index":0,"sequence_number":28} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":".","item_id":"msg_03f81ba30cbe40970169b3192f975c8196ae7191841f725909","logprobs":[],"obfuscation":"aDRQjz7l5Lxt5jd","output_index":0,"sequence_number":29} + data: {"type":"response.output_text.delta","content_index":0,"delta":".","item_id":"msg_0ff54135c0daf028016a3c1216e744819ca39541260ced3e0d","logprobs":[],"obfuscation":"0LCP5qf2ZOIYPhE","output_index":0,"sequence_number":29} event: response.output_text.done - data: {"type":"response.output_text.done","content_index":0,"item_id":"msg_03f81ba30cbe40970169b3192f975c8196ae7191841f725909","logprobs":[],"output_index":0,"sequence_number":30,"text":"The sum of 2 and 3 is **5**, and the product of 2 and 3 is **6**."} + data: {"type":"response.output_text.done","content_index":0,"item_id":"msg_0ff54135c0daf028016a3c1216e744819ca39541260ced3e0d","logprobs":[],"output_index":0,"sequence_number":30,"text":"The sum of 2 and 3 is **5**, and the product of 2 and 3 is **6**."} event: response.content_part.done - data: {"type":"response.content_part.done","content_index":0,"item_id":"msg_03f81ba30cbe40970169b3192f975c8196ae7191841f725909","output_index":0,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":"The sum of 2 and 3 is **5**, and the product of 2 and 3 is **6**."},"sequence_number":31} + data: {"type":"response.content_part.done","content_index":0,"item_id":"msg_0ff54135c0daf028016a3c1216e744819ca39541260ced3e0d","output_index":0,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":"The sum of 2 and 3 is **5**, and the product of 2 and 3 is **6**."},"sequence_number":31} event: response.output_item.done - data: {"type":"response.output_item.done","item":{"id":"msg_03f81ba30cbe40970169b3192f975c8196ae7191841f725909","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"The sum of 2 and 3 is **5**, and the product of 2 and 3 is **6**."}],"role":"assistant"},"output_index":0,"sequence_number":32} + data: {"type":"response.output_item.done","item":{"id":"msg_0ff54135c0daf028016a3c1216e744819ca39541260ced3e0d","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"The sum of 2 and 3 is **5**, and the product of 2 and 3 is **6**."}],"role":"assistant"},"output_index":0,"sequence_number":32} event: response.completed - data: {"type":"response.completed","response":{"id":"resp_03f81ba30cbe40970169b3192e9e088196b20448362cb2f58f","object":"response","created_at":1773345070,"status":"completed","background":false,"completed_at":1773345071,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-4o-mini-2024-07-18","output":[{"id":"msg_03f81ba30cbe40970169b3192f975c8196ae7191841f725909","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"The sum of 2 and 3 is **5**, and the product of 2 and 3 is **6**."}],"role":"assistant"}],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":null,"summary":null},"safety_identifier":null,"service_tier":"default","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Add two numbers","name":"add","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"},"strict":false},{"type":"function","description":"Multiply two numbers","name":"multiply","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":{"input_tokens":152,"input_tokens_details":{"cached_tokens":0},"output_tokens":28,"output_tokens_details":{"reasoning_tokens":0},"total_tokens":180},"user":null,"metadata":{}},"sequence_number":33} + data: {"type":"response.completed","response":{"id":"resp_0ff54135c0daf028016a3c12165ba8819c8c4a4e07fe1d964b","object":"response","created_at":1782321686,"status":"completed","background":false,"completed_at":1782321687,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-4o-mini-2024-07-18","moderation":null,"output":[{"id":"msg_0ff54135c0daf028016a3c1216e744819ca39541260ced3e0d","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"The sum of 2 and 3 is **5**, and the product of 2 and 3 is **6**."}],"role":"assistant"}],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":null,"effort":null,"summary":null},"safety_identifier":null,"service_tier":"default","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Add two numbers","name":"add","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"},"strict":false},{"type":"function","description":"Multiply two numbers","name":"multiply","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":{"input_tokens":150,"input_tokens_details":{"cached_tokens":0},"output_tokens":28,"output_tokens_details":{"reasoning_tokens":0},"total_tokens":178},"user":null,"metadata":{}},"sequence_number":33} headers: Content-Type: - text/event-stream; charset=utf-8 status: 200 OK code: 200 - duration: 261.065167ms + duration: 288.935ms diff --git a/providertests/testdata/TestOpenAIResponsesCommon/openai-gpt-4o-mini/simple.yaml b/providertests/testdata/TestOpenAIResponsesCommon/openai-gpt-4o-mini/simple.yaml index 92e9847e9..924f90c9f 100644 --- a/providertests/testdata/TestOpenAIResponsesCommon/openai-gpt-4o-mini/simple.yaml +++ b/providertests/testdata/TestOpenAIResponsesCommon/openai-gpt-4o-mini/simple.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://api.openai.com/v1/responses method: POST response: @@ -26,15 +26,15 @@ interactions: uncompressed: true body: |- { - "id": "resp_0fb1614857f93b000169b301608d788196b418da95b3216762", + "id": "resp_0f8d9108fdddf23b016a3c1209558c819f839aa6a3efc268a1", "object": "response", - "created_at": 1773338976, + "created_at": 1782321673, "status": "completed", "background": false, "billing": { "payer": "developer" }, - "completed_at": 1773338977, + "completed_at": 1782321674, "error": null, "frequency_penalty": 0.0, "incomplete_details": null, @@ -42,9 +42,10 @@ interactions: "max_output_tokens": 4000, "max_tool_calls": null, "model": "gpt-4o-mini-2024-07-18", + "moderation": null, "output": [ { - "id": "msg_0fb1614857f93b000169b3016144c0819690589659acec505e", + "id": "msg_0f8d9108fdddf23b016a3c120a34d0819fbcfa0f2572ec6066", "type": "message", "status": "completed", "content": [ @@ -52,7 +53,7 @@ interactions: "type": "output_text", "annotations": [], "logprobs": [], - "text": "Oi!" + "text": "Ol\u00e1!" } ], "role": "assistant" @@ -62,8 +63,9 @@ interactions: "presence_penalty": 0.0, "previous_response_id": null, "prompt_cache_key": null, - "prompt_cache_retention": null, + "prompt_cache_retention": "in_memory", "reasoning": { + "context": null, "effort": null, "summary": null }, @@ -101,4 +103,4 @@ interactions: - application/json status: 200 OK code: 200 - duration: 963.122875ms + duration: 1.4557985s diff --git a/providertests/testdata/TestOpenAIResponsesCommon/openai-gpt-4o-mini/simple_streaming.yaml b/providertests/testdata/TestOpenAIResponsesCommon/openai-gpt-4o-mini/simple_streaming.yaml index 9e48d5d2f..b826d86b9 100644 --- a/providertests/testdata/TestOpenAIResponsesCommon/openai-gpt-4o-mini/simple_streaming.yaml +++ b/providertests/testdata/TestOpenAIResponsesCommon/openai-gpt-4o-mini/simple_streaming.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://api.openai.com/v1/responses method: POST response: @@ -25,53 +25,53 @@ interactions: content_length: -1 body: |+ event: response.created - data: {"type":"response.created","response":{"id":"resp_064593f70a5b52690169b301617fdc81a1965aa55499ef859e","object":"response","created_at":1773338977,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-4o-mini-2024-07-18","output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":null,"summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":0} + data: {"type":"response.created","response":{"id":"resp_0a6fc3349e38704d016a3c120ac63c819e941b6f18b7170ff4","object":"response","created_at":1782321674,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-4o-mini-2024-07-18","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":null,"effort":null,"summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":0} event: response.in_progress - data: {"type":"response.in_progress","response":{"id":"resp_064593f70a5b52690169b301617fdc81a1965aa55499ef859e","object":"response","created_at":1773338977,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-4o-mini-2024-07-18","output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":null,"summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":1} + data: {"type":"response.in_progress","response":{"id":"resp_0a6fc3349e38704d016a3c120ac63c819e941b6f18b7170ff4","object":"response","created_at":1782321674,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-4o-mini-2024-07-18","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":null,"effort":null,"summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":1} event: response.output_item.added - data: {"type":"response.output_item.added","item":{"id":"msg_064593f70a5b52690169b3016226f081a1810f69d61a7e82b0","type":"message","status":"in_progress","content":[],"role":"assistant"},"output_index":0,"sequence_number":2} + data: {"type":"response.output_item.added","item":{"id":"msg_0a6fc3349e38704d016a3c120b5d28819ea807fdf185cae88e","type":"message","status":"in_progress","content":[],"role":"assistant"},"output_index":0,"sequence_number":2} event: response.content_part.added - data: {"type":"response.content_part.added","content_index":0,"item_id":"msg_064593f70a5b52690169b3016226f081a1810f69d61a7e82b0","output_index":0,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":""},"sequence_number":3} + data: {"type":"response.content_part.added","content_index":0,"item_id":"msg_0a6fc3349e38704d016a3c120b5d28819ea807fdf185cae88e","output_index":0,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":""},"sequence_number":3} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":"Hi","item_id":"msg_064593f70a5b52690169b3016226f081a1810f69d61a7e82b0","logprobs":[],"obfuscation":"irbtAeXgiV0Urq","output_index":0,"sequence_number":4} + data: {"type":"response.output_text.delta","content_index":0,"delta":"Hi","item_id":"msg_0a6fc3349e38704d016a3c120b5d28819ea807fdf185cae88e","logprobs":[],"obfuscation":"I7Nl54CKLwXRwW","output_index":0,"sequence_number":4} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" in","item_id":"msg_064593f70a5b52690169b3016226f081a1810f69d61a7e82b0","logprobs":[],"obfuscation":"8Bj8MpDXsxfNJ","output_index":0,"sequence_number":5} + data: {"type":"response.output_text.delta","content_index":0,"delta":" in","item_id":"msg_0a6fc3349e38704d016a3c120b5d28819ea807fdf185cae88e","logprobs":[],"obfuscation":"bKqQHHGWqLft8","output_index":0,"sequence_number":5} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" Portuguese","item_id":"msg_064593f70a5b52690169b3016226f081a1810f69d61a7e82b0","logprobs":[],"obfuscation":"wr2GS","output_index":0,"sequence_number":6} + data: {"type":"response.output_text.delta","content_index":0,"delta":" Portuguese","item_id":"msg_0a6fc3349e38704d016a3c120b5d28819ea807fdf185cae88e","logprobs":[],"obfuscation":"Jhb76","output_index":0,"sequence_number":6} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" is","item_id":"msg_064593f70a5b52690169b3016226f081a1810f69d61a7e82b0","logprobs":[],"obfuscation":"0zTahere49C9B","output_index":0,"sequence_number":7} + data: {"type":"response.output_text.delta","content_index":0,"delta":" is","item_id":"msg_0a6fc3349e38704d016a3c120b5d28819ea807fdf185cae88e","logprobs":[],"obfuscation":"q0s7rIVIvEt6w","output_index":0,"sequence_number":7} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" \"","item_id":"msg_064593f70a5b52690169b3016226f081a1810f69d61a7e82b0","logprobs":[],"obfuscation":"t4z6fq8E79w4Oq","output_index":0,"sequence_number":8} + data: {"type":"response.output_text.delta","content_index":0,"delta":" \"","item_id":"msg_0a6fc3349e38704d016a3c120b5d28819ea807fdf185cae88e","logprobs":[],"obfuscation":"osKg3zz2aBaRBP","output_index":0,"sequence_number":8} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":"Olá","item_id":"msg_064593f70a5b52690169b3016226f081a1810f69d61a7e82b0","logprobs":[],"obfuscation":"WV62NUnCq2yOS","output_index":0,"sequence_number":9} + data: {"type":"response.output_text.delta","content_index":0,"delta":"Oi","item_id":"msg_0a6fc3349e38704d016a3c120b5d28819ea807fdf185cae88e","logprobs":[],"obfuscation":"VZhkPsYkdF2Wms","output_index":0,"sequence_number":9} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":"!\"","item_id":"msg_064593f70a5b52690169b3016226f081a1810f69d61a7e82b0","logprobs":[],"obfuscation":"8egyvrVZrARLcR","output_index":0,"sequence_number":10} + data: {"type":"response.output_text.delta","content_index":0,"delta":"!\"","item_id":"msg_0a6fc3349e38704d016a3c120b5d28819ea807fdf185cae88e","logprobs":[],"obfuscation":"uFx0rrtPfwzJWF","output_index":0,"sequence_number":10} event: response.output_text.done - data: {"type":"response.output_text.done","content_index":0,"item_id":"msg_064593f70a5b52690169b3016226f081a1810f69d61a7e82b0","logprobs":[],"output_index":0,"sequence_number":11,"text":"Hi in Portuguese is \"Olá!\""} + data: {"type":"response.output_text.done","content_index":0,"item_id":"msg_0a6fc3349e38704d016a3c120b5d28819ea807fdf185cae88e","logprobs":[],"output_index":0,"sequence_number":11,"text":"Hi in Portuguese is \"Oi!\""} event: response.content_part.done - data: {"type":"response.content_part.done","content_index":0,"item_id":"msg_064593f70a5b52690169b3016226f081a1810f69d61a7e82b0","output_index":0,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":"Hi in Portuguese is \"Olá!\""},"sequence_number":12} + data: {"type":"response.content_part.done","content_index":0,"item_id":"msg_0a6fc3349e38704d016a3c120b5d28819ea807fdf185cae88e","output_index":0,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":"Hi in Portuguese is \"Oi!\""},"sequence_number":12} event: response.output_item.done - data: {"type":"response.output_item.done","item":{"id":"msg_064593f70a5b52690169b3016226f081a1810f69d61a7e82b0","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"Hi in Portuguese is \"Olá!\""}],"role":"assistant"},"output_index":0,"sequence_number":13} + data: {"type":"response.output_item.done","item":{"id":"msg_0a6fc3349e38704d016a3c120b5d28819ea807fdf185cae88e","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"Hi in Portuguese is \"Oi!\""}],"role":"assistant"},"output_index":0,"sequence_number":13} event: response.completed - data: {"type":"response.completed","response":{"id":"resp_064593f70a5b52690169b301617fdc81a1965aa55499ef859e","object":"response","created_at":1773338977,"status":"completed","background":false,"completed_at":1773338978,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-4o-mini-2024-07-18","output":[{"id":"msg_064593f70a5b52690169b3016226f081a1810f69d61a7e82b0","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"Hi in Portuguese is \"Olá!\""}],"role":"assistant"}],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":null,"summary":null},"safety_identifier":null,"service_tier":"default","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":{"input_tokens":20,"input_tokens_details":{"cached_tokens":0},"output_tokens":8,"output_tokens_details":{"reasoning_tokens":0},"total_tokens":28},"user":null,"metadata":{}},"sequence_number":14} + data: {"type":"response.completed","response":{"id":"resp_0a6fc3349e38704d016a3c120ac63c819e941b6f18b7170ff4","object":"response","created_at":1782321674,"status":"completed","background":false,"completed_at":1782321675,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-4o-mini-2024-07-18","moderation":null,"output":[{"id":"msg_0a6fc3349e38704d016a3c120b5d28819ea807fdf185cae88e","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"Hi in Portuguese is \"Oi!\""}],"role":"assistant"}],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":null,"effort":null,"summary":null},"safety_identifier":null,"service_tier":"default","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":{"input_tokens":20,"input_tokens_details":{"cached_tokens":0},"output_tokens":8,"output_tokens_details":{"reasoning_tokens":0},"total_tokens":28},"user":null,"metadata":{}},"sequence_number":14} headers: Content-Type: - text/event-stream; charset=utf-8 status: 200 OK code: 200 - duration: 208.343917ms + duration: 327.674083ms diff --git a/providertests/testdata/TestOpenAIResponsesCommon/openai-gpt-4o-mini/tool.yaml b/providertests/testdata/TestOpenAIResponsesCommon/openai-gpt-4o-mini/tool.yaml index 56523fa83..3ed5f9de1 100644 --- a/providertests/testdata/TestOpenAIResponsesCommon/openai-gpt-4o-mini/tool.yaml +++ b/providertests/testdata/TestOpenAIResponsesCommon/openai-gpt-4o-mini/tool.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://api.openai.com/v1/responses method: POST response: @@ -26,15 +26,15 @@ interactions: uncompressed: true body: |- { - "id": "resp_0589cd5cec6943ec0169b3191fa6288190ba41bc84bbb13455", + "id": "resp_0d9e9b38807e0d8a016a3c120baedc81a18f24ab933f2193f9", "object": "response", - "created_at": 1773345055, + "created_at": 1782321675, "status": "completed", "background": false, "billing": { "payer": "developer" }, - "completed_at": 1773345056, + "completed_at": 1782321676, "error": null, "frequency_penalty": 0.0, "incomplete_details": null, @@ -42,13 +42,14 @@ interactions: "max_output_tokens": 4000, "max_tool_calls": null, "model": "gpt-4o-mini-2024-07-18", + "moderation": null, "output": [ { - "id": "fc_0589cd5cec6943ec0169b3192048b48190b7a029b212da3cf0", + "id": "fc_0d9e9b38807e0d8a016a3c120cb92c81a193e05ae6e58246c3", "type": "function_call", "status": "completed", "arguments": "{\"location\":\"Florence, Italy\"}", - "call_id": "call_fvLU8DzDYjJa5V2k9Nsvq3ls", + "call_id": "call_XX4zIshrJWNnM1Z3n6XsaSxP", "name": "weather" } ], @@ -56,8 +57,9 @@ interactions: "presence_penalty": 0.0, "previous_response_id": null, "prompt_cache_key": null, - "prompt_cache_retention": null, + "prompt_cache_retention": "in_memory", "reasoning": { + "context": null, "effort": null, "summary": null }, @@ -114,22 +116,22 @@ interactions: - application/json status: 200 OK code: 200 - duration: 2.063641541s + duration: 1.491003458s - id: 1 request: proto: HTTP/1.1 proto_major: 1 proto_minor: 1 - content_length: 724 + content_length: 712 host: "" - body: '{"max_output_tokens":4000,"store":false,"input":[{"content":"You are a helpful assistant","role":"system"},{"content":[{"text":"What''s the weather in Florence,Italy?","type":"input_text"}],"role":"user"},{"arguments":"\"{\\\"location\\\":\\\"Florence, Italy\\\"}\"","call_id":"call_fvLU8DzDYjJa5V2k9Nsvq3ls","name":"weather","type":"function_call"},{"call_id":"call_fvLU8DzDYjJa5V2k9Nsvq3ls","output":"40 C","type":"function_call_output"}],"model":"gpt-4o-mini","tool_choice":"auto","tools":[{"strict":false,"parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"name":"weather","description":"Get weather information for a location","type":"function"}]}' + body: '{"max_output_tokens":4000,"store":false,"input":[{"content":"You are a helpful assistant","role":"system"},{"content":[{"text":"What''s the weather in Florence,Italy?","type":"input_text"}],"role":"user"},{"arguments":"{\"location\":\"Florence, Italy\"}","call_id":"call_XX4zIshrJWNnM1Z3n6XsaSxP","name":"weather","type":"function_call"},{"call_id":"call_XX4zIshrJWNnM1Z3n6XsaSxP","output":"40 C","type":"function_call_output"}],"model":"gpt-4o-mini","tool_choice":"auto","tools":[{"strict":false,"parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"name":"weather","description":"Get weather information for a location","type":"function"}]}' headers: Accept: - application/json Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://api.openai.com/v1/responses method: POST response: @@ -140,15 +142,15 @@ interactions: uncompressed: true body: |- { - "id": "resp_015a0cae6d9789840169b319218ff881a281cc1f960f86416b", + "id": "resp_039f329dbed97aa5016a3c120d2fc081a3b9e3bec252760583", "object": "response", - "created_at": 1773345057, + "created_at": 1782321677, "status": "completed", "background": false, "billing": { "payer": "developer" }, - "completed_at": 1773345058, + "completed_at": 1782321678, "error": null, "frequency_penalty": 0.0, "incomplete_details": null, @@ -156,9 +158,10 @@ interactions: "max_output_tokens": 4000, "max_tool_calls": null, "model": "gpt-4o-mini-2024-07-18", + "moderation": null, "output": [ { - "id": "msg_015a0cae6d9789840169b31922616c81a28c661e338d69de27", + "id": "msg_039f329dbed97aa5016a3c120df12c81a3b04a662a9626e5e9", "type": "message", "status": "completed", "content": [ @@ -166,7 +169,7 @@ interactions: "type": "output_text", "annotations": [], "logprobs": [], - "text": "The current temperature in Florence, Italy, is 40\u00b0C. If you need more details about the weather, feel free to ask!" + "text": "The weather in Florence, Italy, is currently 40\u00b0C." } ], "role": "assistant" @@ -176,8 +179,9 @@ interactions: "presence_penalty": 0.0, "previous_response_id": null, "prompt_cache_key": null, - "prompt_cache_retention": null, + "prompt_cache_retention": "in_memory", "reasoning": { + "context": null, "effort": null, "summary": null }, @@ -216,15 +220,15 @@ interactions: "top_p": 1.0, "truncation": "disabled", "usage": { - "input_tokens": 83, + "input_tokens": 81, "input_tokens_details": { "cached_tokens": 0 }, - "output_tokens": 29, + "output_tokens": 15, "output_tokens_details": { "reasoning_tokens": 0 }, - "total_tokens": 112 + "total_tokens": 96 }, "user": null, "metadata": {} @@ -234,4 +238,4 @@ interactions: - application/json status: 200 OK code: 200 - duration: 2.210815041s + duration: 1.1742705s diff --git a/providertests/testdata/TestOpenAIResponsesCommon/openai-gpt-4o-mini/tool_streaming.yaml b/providertests/testdata/TestOpenAIResponsesCommon/openai-gpt-4o-mini/tool_streaming.yaml index b09c30e05..fccdbe391 100644 --- a/providertests/testdata/TestOpenAIResponsesCommon/openai-gpt-4o-mini/tool_streaming.yaml +++ b/providertests/testdata/TestOpenAIResponsesCommon/openai-gpt-4o-mini/tool_streaming.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://api.openai.com/v1/responses method: POST response: @@ -25,68 +25,68 @@ interactions: content_length: -1 body: |+ event: response.created - data: {"type":"response.created","response":{"id":"resp_04f33c18250e523b0169b31922e0c88190805966184c08e1a7","object":"response","created_at":1773345058,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-4o-mini-2024-07-18","output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":null,"summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":0} + data: {"type":"response.created","response":{"id":"resp_0befc33218ec8037016a3c120e5510819d9df02eea96fc61ae","object":"response","created_at":1782321678,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-4o-mini-2024-07-18","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":null,"effort":null,"summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":0} event: response.in_progress - data: {"type":"response.in_progress","response":{"id":"resp_04f33c18250e523b0169b31922e0c88190805966184c08e1a7","object":"response","created_at":1773345058,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-4o-mini-2024-07-18","output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":null,"summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":1} + data: {"type":"response.in_progress","response":{"id":"resp_0befc33218ec8037016a3c120e5510819d9df02eea96fc61ae","object":"response","created_at":1782321678,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-4o-mini-2024-07-18","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":null,"effort":null,"summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":1} event: response.output_item.added - data: {"type":"response.output_item.added","item":{"id":"fc_04f33c18250e523b0169b3192358588190a1c63040e606ce3c","type":"function_call","status":"in_progress","arguments":"","call_id":"call_yLQoefRSgy3mxdgHFwx1248W","name":"weather"},"output_index":0,"sequence_number":2} + data: {"type":"response.output_item.added","item":{"id":"fc_0befc33218ec8037016a3c120f4b78819d83774530a8accd94","type":"function_call","status":"in_progress","arguments":"","call_id":"call_4TL7SrUyTg60nSUcfgeWLFXO","name":"weather"},"output_index":0,"sequence_number":2} event: response.function_call_arguments.delta - data: {"type":"response.function_call_arguments.delta","delta":"{\"","item_id":"fc_04f33c18250e523b0169b3192358588190a1c63040e606ce3c","obfuscation":"H2IjffAFGAlEeS","output_index":0,"sequence_number":3} + data: {"type":"response.function_call_arguments.delta","delta":"{\"","item_id":"fc_0befc33218ec8037016a3c120f4b78819d83774530a8accd94","obfuscation":"PCQ6yyxohsUwN7","output_index":0,"sequence_number":3} event: response.function_call_arguments.delta - data: {"type":"response.function_call_arguments.delta","delta":"location","item_id":"fc_04f33c18250e523b0169b3192358588190a1c63040e606ce3c","obfuscation":"PNOkzPWf","output_index":0,"sequence_number":4} + data: {"type":"response.function_call_arguments.delta","delta":"location","item_id":"fc_0befc33218ec8037016a3c120f4b78819d83774530a8accd94","obfuscation":"1p4bueEn","output_index":0,"sequence_number":4} event: response.function_call_arguments.delta - data: {"type":"response.function_call_arguments.delta","delta":"\":\"","item_id":"fc_04f33c18250e523b0169b3192358588190a1c63040e606ce3c","obfuscation":"Lb9zjSGAjqEB4","output_index":0,"sequence_number":5} + data: {"type":"response.function_call_arguments.delta","delta":"\":\"","item_id":"fc_0befc33218ec8037016a3c120f4b78819d83774530a8accd94","obfuscation":"7ptUVb9dqDfSC","output_index":0,"sequence_number":5} event: response.function_call_arguments.delta - data: {"type":"response.function_call_arguments.delta","delta":"Flor","item_id":"fc_04f33c18250e523b0169b3192358588190a1c63040e606ce3c","obfuscation":"AAV9dhXnnd8A","output_index":0,"sequence_number":6} + data: {"type":"response.function_call_arguments.delta","delta":"Flor","item_id":"fc_0befc33218ec8037016a3c120f4b78819d83774530a8accd94","obfuscation":"QWyU3sTDr0qT","output_index":0,"sequence_number":6} event: response.function_call_arguments.delta - data: {"type":"response.function_call_arguments.delta","delta":"ence","item_id":"fc_04f33c18250e523b0169b3192358588190a1c63040e606ce3c","obfuscation":"nLkP3PChOu1c","output_index":0,"sequence_number":7} + data: {"type":"response.function_call_arguments.delta","delta":"ence","item_id":"fc_0befc33218ec8037016a3c120f4b78819d83774530a8accd94","obfuscation":"toKai2S5bG2g","output_index":0,"sequence_number":7} event: response.function_call_arguments.delta - data: {"type":"response.function_call_arguments.delta","delta":",","item_id":"fc_04f33c18250e523b0169b3192358588190a1c63040e606ce3c","obfuscation":"dnrqYFrPaP3XSvU","output_index":0,"sequence_number":8} + data: {"type":"response.function_call_arguments.delta","delta":",","item_id":"fc_0befc33218ec8037016a3c120f4b78819d83774530a8accd94","obfuscation":"KYEwssKxnuLc9DZ","output_index":0,"sequence_number":8} event: response.function_call_arguments.delta - data: {"type":"response.function_call_arguments.delta","delta":" Italy","item_id":"fc_04f33c18250e523b0169b3192358588190a1c63040e606ce3c","obfuscation":"CpEyj9U0LV","output_index":0,"sequence_number":9} + data: {"type":"response.function_call_arguments.delta","delta":" Italy","item_id":"fc_0befc33218ec8037016a3c120f4b78819d83774530a8accd94","obfuscation":"tlZg6aSfH0","output_index":0,"sequence_number":9} event: response.function_call_arguments.delta - data: {"type":"response.function_call_arguments.delta","delta":"\"}","item_id":"fc_04f33c18250e523b0169b3192358588190a1c63040e606ce3c","obfuscation":"PBFRZZs6gzCsDb","output_index":0,"sequence_number":10} + data: {"type":"response.function_call_arguments.delta","delta":"\"}","item_id":"fc_0befc33218ec8037016a3c120f4b78819d83774530a8accd94","obfuscation":"R8QQ34l5U5GYHj","output_index":0,"sequence_number":10} event: response.function_call_arguments.done - data: {"type":"response.function_call_arguments.done","arguments":"{\"location\":\"Florence, Italy\"}","item_id":"fc_04f33c18250e523b0169b3192358588190a1c63040e606ce3c","output_index":0,"sequence_number":11} + data: {"type":"response.function_call_arguments.done","arguments":"{\"location\":\"Florence, Italy\"}","item_id":"fc_0befc33218ec8037016a3c120f4b78819d83774530a8accd94","output_index":0,"sequence_number":11} event: response.output_item.done - data: {"type":"response.output_item.done","item":{"id":"fc_04f33c18250e523b0169b3192358588190a1c63040e606ce3c","type":"function_call","status":"completed","arguments":"{\"location\":\"Florence, Italy\"}","call_id":"call_yLQoefRSgy3mxdgHFwx1248W","name":"weather"},"output_index":0,"sequence_number":12} + data: {"type":"response.output_item.done","item":{"id":"fc_0befc33218ec8037016a3c120f4b78819d83774530a8accd94","type":"function_call","status":"completed","arguments":"{\"location\":\"Florence, Italy\"}","call_id":"call_4TL7SrUyTg60nSUcfgeWLFXO","name":"weather"},"output_index":0,"sequence_number":12} event: response.completed - data: {"type":"response.completed","response":{"id":"resp_04f33c18250e523b0169b31922e0c88190805966184c08e1a7","object":"response","created_at":1773345058,"status":"completed","background":false,"completed_at":1773345060,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-4o-mini-2024-07-18","output":[{"id":"fc_04f33c18250e523b0169b3192358588190a1c63040e606ce3c","type":"function_call","status":"completed","arguments":"{\"location\":\"Florence, Italy\"}","call_id":"call_yLQoefRSgy3mxdgHFwx1248W","name":"weather"}],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":null,"summary":null},"safety_identifier":null,"service_tier":"default","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":{"input_tokens":58,"input_tokens_details":{"cached_tokens":0},"output_tokens":17,"output_tokens_details":{"reasoning_tokens":0},"total_tokens":75},"user":null,"metadata":{}},"sequence_number":13} + data: {"type":"response.completed","response":{"id":"resp_0befc33218ec8037016a3c120e5510819d9df02eea96fc61ae","object":"response","created_at":1782321678,"status":"completed","background":false,"completed_at":1782321679,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-4o-mini-2024-07-18","moderation":null,"output":[{"id":"fc_0befc33218ec8037016a3c120f4b78819d83774530a8accd94","type":"function_call","status":"completed","arguments":"{\"location\":\"Florence, Italy\"}","call_id":"call_4TL7SrUyTg60nSUcfgeWLFXO","name":"weather"}],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":null,"effort":null,"summary":null},"safety_identifier":null,"service_tier":"default","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":{"input_tokens":58,"input_tokens_details":{"cached_tokens":0},"output_tokens":17,"output_tokens_details":{"reasoning_tokens":0},"total_tokens":75},"user":null,"metadata":{}},"sequence_number":13} headers: Content-Type: - text/event-stream; charset=utf-8 status: 200 OK code: 200 - duration: 281.359792ms + duration: 255.880375ms - id: 1 request: proto: HTTP/1.1 proto_major: 1 proto_minor: 1 - content_length: 738 + content_length: 726 host: "" - body: '{"max_output_tokens":4000,"store":false,"input":[{"content":"You are a helpful assistant","role":"system"},{"content":[{"text":"What''s the weather in Florence,Italy?","type":"input_text"}],"role":"user"},{"arguments":"\"{\\\"location\\\":\\\"Florence, Italy\\\"}\"","call_id":"call_yLQoefRSgy3mxdgHFwx1248W","name":"weather","type":"function_call"},{"call_id":"call_yLQoefRSgy3mxdgHFwx1248W","output":"40 C","type":"function_call_output"}],"model":"gpt-4o-mini","tool_choice":"auto","tools":[{"strict":false,"parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"name":"weather","description":"Get weather information for a location","type":"function"}],"stream":true}' + body: '{"max_output_tokens":4000,"store":false,"input":[{"content":"You are a helpful assistant","role":"system"},{"content":[{"text":"What''s the weather in Florence,Italy?","type":"input_text"}],"role":"user"},{"arguments":"{\"location\":\"Florence, Italy\"}","call_id":"call_4TL7SrUyTg60nSUcfgeWLFXO","name":"weather","type":"function_call"},{"call_id":"call_4TL7SrUyTg60nSUcfgeWLFXO","output":"40 C","type":"function_call_output"}],"model":"gpt-4o-mini","tool_choice":"auto","tools":[{"strict":false,"parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"name":"weather","description":"Get weather information for a location","type":"function"}],"stream":true}' headers: Accept: - application/json Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://api.openai.com/v1/responses method: POST response: @@ -96,122 +96,107 @@ interactions: content_length: -1 body: |+ event: response.created - data: {"type":"response.created","response":{"id":"resp_0b878a1dda64a2180169b31925d07081a085b212c597c52037","object":"response","created_at":1773345061,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-4o-mini-2024-07-18","output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":null,"summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":0} + data: {"type":"response.created","response":{"id":"resp_051d610521e34f94016a3c120fa1a0819da4d3a5e758050bf2","object":"response","created_at":1782321679,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-4o-mini-2024-07-18","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":null,"effort":null,"summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":0} event: response.in_progress - data: {"type":"response.in_progress","response":{"id":"resp_0b878a1dda64a2180169b31925d07081a085b212c597c52037","object":"response","created_at":1773345061,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-4o-mini-2024-07-18","output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":null,"summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":1} + data: {"type":"response.in_progress","response":{"id":"resp_051d610521e34f94016a3c120fa1a0819da4d3a5e758050bf2","object":"response","created_at":1782321679,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-4o-mini-2024-07-18","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":null,"effort":null,"summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":1} event: response.output_item.added - data: {"type":"response.output_item.added","item":{"id":"msg_0b878a1dda64a2180169b31927049c81a0abb8a3843b833e7e","type":"message","status":"in_progress","content":[],"role":"assistant"},"output_index":0,"sequence_number":2} + data: {"type":"response.output_item.added","item":{"id":"msg_051d610521e34f94016a3c121042ec819d967453ef7e979dc7","type":"message","status":"in_progress","content":[],"role":"assistant"},"output_index":0,"sequence_number":2} event: response.content_part.added - data: {"type":"response.content_part.added","content_index":0,"item_id":"msg_0b878a1dda64a2180169b31927049c81a0abb8a3843b833e7e","output_index":0,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":""},"sequence_number":3} + data: {"type":"response.content_part.added","content_index":0,"item_id":"msg_051d610521e34f94016a3c121042ec819d967453ef7e979dc7","output_index":0,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":""},"sequence_number":3} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":"The","item_id":"msg_0b878a1dda64a2180169b31927049c81a0abb8a3843b833e7e","logprobs":[],"obfuscation":"2GgLhn5npmyeu","output_index":0,"sequence_number":4} + data: {"type":"response.output_text.delta","content_index":0,"delta":"The","item_id":"msg_051d610521e34f94016a3c121042ec819d967453ef7e979dc7","logprobs":[],"obfuscation":"L7avu2BFWBVc0","output_index":0,"sequence_number":4} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" weather","item_id":"msg_0b878a1dda64a2180169b31927049c81a0abb8a3843b833e7e","logprobs":[],"obfuscation":"Q7ofTjsq","output_index":0,"sequence_number":5} + data: {"type":"response.output_text.delta","content_index":0,"delta":" current","item_id":"msg_051d610521e34f94016a3c121042ec819d967453ef7e979dc7","logprobs":[],"obfuscation":"4Hv8aZyC","output_index":0,"sequence_number":5} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" in","item_id":"msg_0b878a1dda64a2180169b31927049c81a0abb8a3843b833e7e","logprobs":[],"obfuscation":"T4igl5YWjSeVY","output_index":0,"sequence_number":6} + data: {"type":"response.output_text.delta","content_index":0,"delta":" temperature","item_id":"msg_051d610521e34f94016a3c121042ec819d967453ef7e979dc7","logprobs":[],"obfuscation":"zDvV","output_index":0,"sequence_number":6} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" Florence","item_id":"msg_0b878a1dda64a2180169b31927049c81a0abb8a3843b833e7e","logprobs":[],"obfuscation":"rRL2oec","output_index":0,"sequence_number":7} + data: {"type":"response.output_text.delta","content_index":0,"delta":" in","item_id":"msg_051d610521e34f94016a3c121042ec819d967453ef7e979dc7","logprobs":[],"obfuscation":"GTFmwOX0EWi6Z","output_index":0,"sequence_number":7} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":",","item_id":"msg_0b878a1dda64a2180169b31927049c81a0abb8a3843b833e7e","logprobs":[],"obfuscation":"boxLx8AZwLgqH2D","output_index":0,"sequence_number":8} + data: {"type":"response.output_text.delta","content_index":0,"delta":" Florence","item_id":"msg_051d610521e34f94016a3c121042ec819d967453ef7e979dc7","logprobs":[],"obfuscation":"MqI7UKJ","output_index":0,"sequence_number":8} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" Italy","item_id":"msg_0b878a1dda64a2180169b31927049c81a0abb8a3843b833e7e","logprobs":[],"obfuscation":"vUgz4IkM9M","output_index":0,"sequence_number":9} + data: {"type":"response.output_text.delta","content_index":0,"delta":",","item_id":"msg_051d610521e34f94016a3c121042ec819d967453ef7e979dc7","logprobs":[],"obfuscation":"xP6xubJYe0CaGdS","output_index":0,"sequence_number":9} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":",","item_id":"msg_0b878a1dda64a2180169b31927049c81a0abb8a3843b833e7e","logprobs":[],"obfuscation":"km5IFAnYv4xCD09","output_index":0,"sequence_number":10} + data: {"type":"response.output_text.delta","content_index":0,"delta":" Italy","item_id":"msg_051d610521e34f94016a3c121042ec819d967453ef7e979dc7","logprobs":[],"obfuscation":"tPANZO46br","output_index":0,"sequence_number":10} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" is","item_id":"msg_0b878a1dda64a2180169b31927049c81a0abb8a3843b833e7e","logprobs":[],"obfuscation":"f3MJphlJc13in","output_index":0,"sequence_number":11} + data: {"type":"response.output_text.delta","content_index":0,"delta":",","item_id":"msg_051d610521e34f94016a3c121042ec819d967453ef7e979dc7","logprobs":[],"obfuscation":"rxy259OhXtnbb6m","output_index":0,"sequence_number":11} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" currently","item_id":"msg_0b878a1dda64a2180169b31927049c81a0abb8a3843b833e7e","logprobs":[],"obfuscation":"CwiLJB","output_index":0,"sequence_number":12} + data: {"type":"response.output_text.delta","content_index":0,"delta":" is","item_id":"msg_051d610521e34f94016a3c121042ec819d967453ef7e979dc7","logprobs":[],"obfuscation":"NTifIQhNShos9","output_index":0,"sequence_number":12} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" ","item_id":"msg_0b878a1dda64a2180169b31927049c81a0abb8a3843b833e7e","logprobs":[],"obfuscation":"w1DHuhC0gZ03g5d","output_index":0,"sequence_number":13} + data: {"type":"response.output_text.delta","content_index":0,"delta":" ","item_id":"msg_051d610521e34f94016a3c121042ec819d967453ef7e979dc7","logprobs":[],"obfuscation":"TC3pkRPDwfHjc6Q","output_index":0,"sequence_number":13} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":"40","item_id":"msg_0b878a1dda64a2180169b31927049c81a0abb8a3843b833e7e","logprobs":[],"obfuscation":"2pxlgXyTwuMbJH","output_index":0,"sequence_number":14} + data: {"type":"response.output_text.delta","content_index":0,"delta":"40","item_id":"msg_051d610521e34f94016a3c121042ec819d967453ef7e979dc7","logprobs":[],"obfuscation":"EzaCjb6yRpSQ7Y","output_index":0,"sequence_number":14} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":"°C","item_id":"msg_0b878a1dda64a2180169b31927049c81a0abb8a3843b833e7e","logprobs":[],"obfuscation":"i3eXFnvM19ehGg","output_index":0,"sequence_number":15} + data: {"type":"response.output_text.delta","content_index":0,"delta":"°C","item_id":"msg_051d610521e34f94016a3c121042ec819d967453ef7e979dc7","logprobs":[],"obfuscation":"KckuSSzBZZma9p","output_index":0,"sequence_number":15} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":".","item_id":"msg_0b878a1dda64a2180169b31927049c81a0abb8a3843b833e7e","logprobs":[],"obfuscation":"OoATSshXGtYhboY","output_index":0,"sequence_number":16} + data: {"type":"response.output_text.delta","content_index":0,"delta":".","item_id":"msg_051d610521e34f94016a3c121042ec819d967453ef7e979dc7","logprobs":[],"obfuscation":"t0vFlSg9DedZftF","output_index":0,"sequence_number":16} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" It","item_id":"msg_0b878a1dda64a2180169b31927049c81a0abb8a3843b833e7e","logprobs":[],"obfuscation":"hevuPRf6bIpWI","output_index":0,"sequence_number":17} + data: {"type":"response.output_text.delta","content_index":0,"delta":" If","item_id":"msg_051d610521e34f94016a3c121042ec819d967453ef7e979dc7","logprobs":[],"obfuscation":"wuudWuyDSPJeu","output_index":0,"sequence_number":17} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" seems","item_id":"msg_0b878a1dda64a2180169b31927049c81a0abb8a3843b833e7e","logprobs":[],"obfuscation":"s27XnKZ17D","output_index":0,"sequence_number":18} + data: {"type":"response.output_text.delta","content_index":0,"delta":" you","item_id":"msg_051d610521e34f94016a3c121042ec819d967453ef7e979dc7","logprobs":[],"obfuscation":"wWPg3opWxA8B","output_index":0,"sequence_number":18} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" quite","item_id":"msg_0b878a1dda64a2180169b31927049c81a0abb8a3843b833e7e","logprobs":[],"obfuscation":"ITl0MvUuId","output_index":0,"sequence_number":19} + data: {"type":"response.output_text.delta","content_index":0,"delta":" need","item_id":"msg_051d610521e34f94016a3c121042ec819d967453ef7e979dc7","logprobs":[],"obfuscation":"cOiwpiF9hoK","output_index":0,"sequence_number":19} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" hot","item_id":"msg_0b878a1dda64a2180169b31927049c81a0abb8a3843b833e7e","logprobs":[],"obfuscation":"hQPClupGmAnA","output_index":0,"sequence_number":20} + data: {"type":"response.output_text.delta","content_index":0,"delta":" more","item_id":"msg_051d610521e34f94016a3c121042ec819d967453ef7e979dc7","logprobs":[],"obfuscation":"U5U2xoFZyRd","output_index":0,"sequence_number":20} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":"!","item_id":"msg_0b878a1dda64a2180169b31927049c81a0abb8a3843b833e7e","logprobs":[],"obfuscation":"h7hs5jMKdRAisZE","output_index":0,"sequence_number":21} + data: {"type":"response.output_text.delta","content_index":0,"delta":" details","item_id":"msg_051d610521e34f94016a3c121042ec819d967453ef7e979dc7","logprobs":[],"obfuscation":"84n2SFKC","output_index":0,"sequence_number":21} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" Make","item_id":"msg_0b878a1dda64a2180169b31927049c81a0abb8a3843b833e7e","logprobs":[],"obfuscation":"2xz6ceFkxr1","output_index":0,"sequence_number":22} + data: {"type":"response.output_text.delta","content_index":0,"delta":" or","item_id":"msg_051d610521e34f94016a3c121042ec819d967453ef7e979dc7","logprobs":[],"obfuscation":"zfhwLVjL6CM8h","output_index":0,"sequence_number":22} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" sure","item_id":"msg_0b878a1dda64a2180169b31927049c81a0abb8a3843b833e7e","logprobs":[],"obfuscation":"ByBlZgxCgUM","output_index":0,"sequence_number":23} + data: {"type":"response.output_text.delta","content_index":0,"delta":" forecasts","item_id":"msg_051d610521e34f94016a3c121042ec819d967453ef7e979dc7","logprobs":[],"obfuscation":"eQ3I4R","output_index":0,"sequence_number":23} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" to","item_id":"msg_0b878a1dda64a2180169b31927049c81a0abb8a3843b833e7e","logprobs":[],"obfuscation":"8b0DQ7a2BwE6y","output_index":0,"sequence_number":24} + data: {"type":"response.output_text.delta","content_index":0,"delta":",","item_id":"msg_051d610521e34f94016a3c121042ec819d967453ef7e979dc7","logprobs":[],"obfuscation":"xw5qqlnHFuKx8hL","output_index":0,"sequence_number":24} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" stay","item_id":"msg_0b878a1dda64a2180169b31927049c81a0abb8a3843b833e7e","logprobs":[],"obfuscation":"lo8AvaybLhZ","output_index":0,"sequence_number":25} + data: {"type":"response.output_text.delta","content_index":0,"delta":" let","item_id":"msg_051d610521e34f94016a3c121042ec819d967453ef7e979dc7","logprobs":[],"obfuscation":"geZT3Is9I0jP","output_index":0,"sequence_number":25} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" hydrated","item_id":"msg_0b878a1dda64a2180169b31927049c81a0abb8a3843b833e7e","logprobs":[],"obfuscation":"Z9ewIaO","output_index":0,"sequence_number":26} + data: {"type":"response.output_text.delta","content_index":0,"delta":" me","item_id":"msg_051d610521e34f94016a3c121042ec819d967453ef7e979dc7","logprobs":[],"obfuscation":"tRP5L5xdol7jb","output_index":0,"sequence_number":26} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" and","item_id":"msg_0b878a1dda64a2180169b31927049c81a0abb8a3843b833e7e","logprobs":[],"obfuscation":"jvLwHjlPABiA","output_index":0,"sequence_number":27} + data: {"type":"response.output_text.delta","content_index":0,"delta":" know","item_id":"msg_051d610521e34f94016a3c121042ec819d967453ef7e979dc7","logprobs":[],"obfuscation":"bQO4OweRYh3","output_index":0,"sequence_number":27} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" take","item_id":"msg_0b878a1dda64a2180169b31927049c81a0abb8a3843b833e7e","logprobs":[],"obfuscation":"bvcen6VV2sV","output_index":0,"sequence_number":28} - - event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" care","item_id":"msg_0b878a1dda64a2180169b31927049c81a0abb8a3843b833e7e","logprobs":[],"obfuscation":"T75oWFdSwKg","output_index":0,"sequence_number":29} - - event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" if","item_id":"msg_0b878a1dda64a2180169b31927049c81a0abb8a3843b833e7e","logprobs":[],"obfuscation":"dR9TZZnR7Sjo3","output_index":0,"sequence_number":30} - - event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" you're","item_id":"msg_0b878a1dda64a2180169b31927049c81a0abb8a3843b833e7e","logprobs":[],"obfuscation":"iWBM1odqO","output_index":0,"sequence_number":31} - - event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" outdoors","item_id":"msg_0b878a1dda64a2180169b31927049c81a0abb8a3843b833e7e","logprobs":[],"obfuscation":"08I61Dr","output_index":0,"sequence_number":32} - - event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":".","item_id":"msg_0b878a1dda64a2180169b31927049c81a0abb8a3843b833e7e","logprobs":[],"obfuscation":"NJXyAtQUakW877G","output_index":0,"sequence_number":33} + data: {"type":"response.output_text.delta","content_index":0,"delta":"!","item_id":"msg_051d610521e34f94016a3c121042ec819d967453ef7e979dc7","logprobs":[],"obfuscation":"IZiNzMv7D6atLFg","output_index":0,"sequence_number":28} event: response.output_text.done - data: {"type":"response.output_text.done","content_index":0,"item_id":"msg_0b878a1dda64a2180169b31927049c81a0abb8a3843b833e7e","logprobs":[],"output_index":0,"sequence_number":34,"text":"The weather in Florence, Italy, is currently 40°C. It seems quite hot! Make sure to stay hydrated and take care if you're outdoors."} + data: {"type":"response.output_text.done","content_index":0,"item_id":"msg_051d610521e34f94016a3c121042ec819d967453ef7e979dc7","logprobs":[],"output_index":0,"sequence_number":29,"text":"The current temperature in Florence, Italy, is 40°C. If you need more details or forecasts, let me know!"} event: response.content_part.done - data: {"type":"response.content_part.done","content_index":0,"item_id":"msg_0b878a1dda64a2180169b31927049c81a0abb8a3843b833e7e","output_index":0,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":"The weather in Florence, Italy, is currently 40°C. It seems quite hot! Make sure to stay hydrated and take care if you're outdoors."},"sequence_number":35} + data: {"type":"response.content_part.done","content_index":0,"item_id":"msg_051d610521e34f94016a3c121042ec819d967453ef7e979dc7","output_index":0,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":"The current temperature in Florence, Italy, is 40°C. If you need more details or forecasts, let me know!"},"sequence_number":30} event: response.output_item.done - data: {"type":"response.output_item.done","item":{"id":"msg_0b878a1dda64a2180169b31927049c81a0abb8a3843b833e7e","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"The weather in Florence, Italy, is currently 40°C. It seems quite hot! Make sure to stay hydrated and take care if you're outdoors."}],"role":"assistant"},"output_index":0,"sequence_number":36} + data: {"type":"response.output_item.done","item":{"id":"msg_051d610521e34f94016a3c121042ec819d967453ef7e979dc7","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"The current temperature in Florence, Italy, is 40°C. If you need more details or forecasts, let me know!"}],"role":"assistant"},"output_index":0,"sequence_number":31} event: response.completed - data: {"type":"response.completed","response":{"id":"resp_0b878a1dda64a2180169b31925d07081a085b212c597c52037","object":"response","created_at":1773345061,"status":"completed","background":false,"completed_at":1773345063,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-4o-mini-2024-07-18","output":[{"id":"msg_0b878a1dda64a2180169b31927049c81a0abb8a3843b833e7e","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"The weather in Florence, Italy, is currently 40°C. It seems quite hot! Make sure to stay hydrated and take care if you're outdoors."}],"role":"assistant"}],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":null,"summary":null},"safety_identifier":null,"service_tier":"default","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":{"input_tokens":83,"input_tokens_details":{"cached_tokens":0},"output_tokens":32,"output_tokens_details":{"reasoning_tokens":0},"total_tokens":115},"user":null,"metadata":{}},"sequence_number":37} + data: {"type":"response.completed","response":{"id":"resp_051d610521e34f94016a3c120fa1a0819da4d3a5e758050bf2","object":"response","created_at":1782321679,"status":"completed","background":false,"completed_at":1782321680,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-4o-mini-2024-07-18","moderation":null,"output":[{"id":"msg_051d610521e34f94016a3c121042ec819d967453ef7e979dc7","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"The current temperature in Florence, Italy, is 40°C. If you need more details or forecasts, let me know!"}],"role":"assistant"}],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":null,"effort":null,"summary":null},"safety_identifier":null,"service_tier":"default","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":{"input_tokens":81,"input_tokens_details":{"cached_tokens":0},"output_tokens":27,"output_tokens_details":{"reasoning_tokens":0},"total_tokens":108},"user":null,"metadata":{}},"sequence_number":32} headers: Content-Type: - text/event-stream; charset=utf-8 status: 200 OK code: 200 - duration: 1.066251583s + duration: 399.231542ms diff --git a/providertests/testdata/TestOpenAIResponsesCommon/openai-gpt-4o/multi_tool.yaml b/providertests/testdata/TestOpenAIResponsesCommon/openai-gpt-4o/multi_tool.yaml index 4fa329ce0..b407c37f8 100644 --- a/providertests/testdata/TestOpenAIResponsesCommon/openai-gpt-4o/multi_tool.yaml +++ b/providertests/testdata/TestOpenAIResponsesCommon/openai-gpt-4o/multi_tool.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://api.openai.com/v1/responses method: POST response: @@ -26,15 +26,15 @@ interactions: uncompressed: true body: |- { - "id": "resp_004f198d0fcb211c0169b30159ecc081959941b172e908aa4a", + "id": "resp_0038f9f9083d2c12016a3c1202933081a2bc45cfde28659e9b", "object": "response", - "created_at": 1773338969, + "created_at": 1782321666, "status": "completed", "background": false, "billing": { "payer": "developer" }, - "completed_at": 1773338971, + "completed_at": 1782321667, "error": null, "frequency_penalty": 0.0, "incomplete_details": null, @@ -42,21 +42,22 @@ interactions: "max_output_tokens": 4000, "max_tool_calls": null, "model": "gpt-4o-2024-08-06", + "moderation": null, "output": [ { - "id": "fc_004f198d0fcb211c0169b3015b67188195a8d6f2ca1b65a49d", + "id": "fc_0038f9f9083d2c12016a3c12036e2881a28509892751dc2fc0", "type": "function_call", "status": "completed", "arguments": "{\"a\":2,\"b\":3}", - "call_id": "call_PpY2vL7P7LXhDTGnOt7QloYN", + "call_id": "call_IAQ7c0mnAiAE89MUQa42HQy4", "name": "add" }, { - "id": "fc_004f198d0fcb211c0169b3015b67288195930283b886688c85", + "id": "fc_0038f9f9083d2c12016a3c12036e3881a286625edab78f7ac4", "type": "function_call", "status": "completed", "arguments": "{\"a\":2,\"b\":3}", - "call_id": "call_TDdcDMTBBI92rFgbWw4brhBy", + "call_id": "call_gXYDdXX5Ld6zWOSpIAh0QHPr", "name": "multiply" } ], @@ -64,8 +65,9 @@ interactions: "presence_penalty": 0.0, "previous_response_id": null, "prompt_cache_key": null, - "prompt_cache_retention": null, + "prompt_cache_retention": "in_memory", "reasoning": { + "context": null, "effort": null, "summary": null }, @@ -150,22 +152,22 @@ interactions: - application/json status: 200 OK code: 200 - duration: 2.647188375s + duration: 1.155488375s - id: 1 request: proto: HTTP/1.1 proto_major: 1 proto_minor: 1 - content_length: 1261 + content_length: 1237 host: "" - body: '{"max_output_tokens":4000,"store":false,"input":[{"content":"You are a helpful assistant. CRITICAL: Always use both add and multiply at the same time ALWAYS.","role":"system"},{"content":[{"text":"Add and multiply the number 2 and 3","type":"input_text"}],"role":"user"},{"arguments":"\"{\\\"a\\\":2,\\\"b\\\":3}\"","call_id":"call_PpY2vL7P7LXhDTGnOt7QloYN","name":"add","type":"function_call"},{"arguments":"\"{\\\"a\\\":2,\\\"b\\\":3}\"","call_id":"call_TDdcDMTBBI92rFgbWw4brhBy","name":"multiply","type":"function_call"},{"call_id":"call_PpY2vL7P7LXhDTGnOt7QloYN","output":"5","type":"function_call_output"},{"call_id":"call_TDdcDMTBBI92rFgbWw4brhBy","output":"6","type":"function_call_output"}],"model":"gpt-4o","tool_choice":"auto","tools":[{"strict":false,"parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"},"name":"add","description":"Add two numbers","type":"function"},{"strict":false,"parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"},"name":"multiply","description":"Multiply two numbers","type":"function"}]}' + body: '{"max_output_tokens":4000,"store":false,"input":[{"content":"You are a helpful assistant. CRITICAL: Always use both add and multiply at the same time ALWAYS.","role":"system"},{"content":[{"text":"Add and multiply the number 2 and 3","type":"input_text"}],"role":"user"},{"arguments":"{\"a\":2,\"b\":3}","call_id":"call_IAQ7c0mnAiAE89MUQa42HQy4","name":"add","type":"function_call"},{"arguments":"{\"a\":2,\"b\":3}","call_id":"call_gXYDdXX5Ld6zWOSpIAh0QHPr","name":"multiply","type":"function_call"},{"call_id":"call_IAQ7c0mnAiAE89MUQa42HQy4","output":"5","type":"function_call_output"},{"call_id":"call_gXYDdXX5Ld6zWOSpIAh0QHPr","output":"6","type":"function_call_output"}],"model":"gpt-4o","tool_choice":"auto","tools":[{"strict":false,"parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"},"name":"add","description":"Add two numbers","type":"function"},{"strict":false,"parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"},"name":"multiply","description":"Multiply two numbers","type":"function"}]}' headers: Accept: - application/json Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://api.openai.com/v1/responses method: POST response: @@ -176,15 +178,15 @@ interactions: uncompressed: true body: |- { - "id": "resp_0dba5e52c1794a190169b3015c6370819092abfbee309c7628", + "id": "resp_0cf6818d95767d1b016a3c1203c2e4819288a1eb6c31ab6f31", "object": "response", - "created_at": 1773338972, + "created_at": 1782321667, "status": "completed", "background": false, "billing": { "payer": "developer" }, - "completed_at": 1773338973, + "completed_at": 1782321669, "error": null, "frequency_penalty": 0.0, "incomplete_details": null, @@ -192,9 +194,10 @@ interactions: "max_output_tokens": 4000, "max_tool_calls": null, "model": "gpt-4o-2024-08-06", + "moderation": null, "output": [ { - "id": "msg_0dba5e52c1794a190169b3015d467481908d0b632c9f281197", + "id": "msg_0cf6818d95767d1b016a3c12051e5c8192a04fa16142f95950", "type": "message", "status": "completed", "content": [ @@ -202,7 +205,7 @@ interactions: "type": "output_text", "annotations": [], "logprobs": [], - "text": "The result of adding 2 and 3 is 5, and the result of multiplying them is 6." + "text": "The sum of 2 and 3 is 5, and their product is 6." } ], "role": "assistant" @@ -212,8 +215,9 @@ interactions: "presence_penalty": 0.0, "previous_response_id": null, "prompt_cache_key": null, - "prompt_cache_retention": null, + "prompt_cache_retention": "in_memory", "reasoning": { + "context": null, "effort": null, "summary": null }, @@ -280,15 +284,15 @@ interactions: "top_p": 1.0, "truncation": "disabled", "usage": { - "input_tokens": 156, + "input_tokens": 154, "input_tokens_details": { "cached_tokens": 0 }, - "output_tokens": 25, + "output_tokens": 21, "output_tokens_details": { "reasoning_tokens": 0 }, - "total_tokens": 181 + "total_tokens": 175 }, "user": null, "metadata": {} @@ -298,4 +302,4 @@ interactions: - application/json status: 200 OK code: 200 - duration: 1.938283875s + duration: 1.718246291s diff --git a/providertests/testdata/TestOpenAIResponsesCommon/openai-gpt-4o/multi_tool_streaming.yaml b/providertests/testdata/TestOpenAIResponsesCommon/openai-gpt-4o/multi_tool_streaming.yaml index e9c08ae1a..7910a74ee 100644 --- a/providertests/testdata/TestOpenAIResponsesCommon/openai-gpt-4o/multi_tool_streaming.yaml +++ b/providertests/testdata/TestOpenAIResponsesCommon/openai-gpt-4o/multi_tool_streaming.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://api.openai.com/v1/responses method: POST response: @@ -25,59 +25,59 @@ interactions: content_length: -1 body: |+ event: response.created - data: {"type":"response.created","response":{"id":"resp_045e0403848c7e000169b3015da2fc81a39ed662486e0980c6","object":"response","created_at":1773338973,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-4o-2024-08-06","output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":null,"summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Add two numbers","name":"add","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"},"strict":false},{"type":"function","description":"Multiply two numbers","name":"multiply","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":0} + data: {"type":"response.created","response":{"id":"resp_07d2265248f742f6016a3c120577cc819eb21c20dbe6ebd5fa","object":"response","created_at":1782321669,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-4o-2024-08-06","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":null,"effort":null,"summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Add two numbers","name":"add","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"},"strict":false},{"type":"function","description":"Multiply two numbers","name":"multiply","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":0} event: response.in_progress - data: {"type":"response.in_progress","response":{"id":"resp_045e0403848c7e000169b3015da2fc81a39ed662486e0980c6","object":"response","created_at":1773338973,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-4o-2024-08-06","output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":null,"summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Add two numbers","name":"add","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"},"strict":false},{"type":"function","description":"Multiply two numbers","name":"multiply","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":1} + data: {"type":"response.in_progress","response":{"id":"resp_07d2265248f742f6016a3c120577cc819eb21c20dbe6ebd5fa","object":"response","created_at":1782321669,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-4o-2024-08-06","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":null,"effort":null,"summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Add two numbers","name":"add","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"},"strict":false},{"type":"function","description":"Multiply two numbers","name":"multiply","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":1} event: response.output_item.added - data: {"type":"response.output_item.added","item":{"id":"fc_045e0403848c7e000169b3015e3fb881a3975075c6fb60adb8","type":"function_call","status":"in_progress","arguments":"","call_id":"call_8qJHo9WEvcPR9DhL3Kla9QZu","name":"add"},"output_index":0,"sequence_number":2} + data: {"type":"response.output_item.added","item":{"id":"fc_07d2265248f742f6016a3c12065a2c819e8eb9b547f64a93fc","type":"function_call","status":"in_progress","arguments":"","call_id":"call_NnEvpiwdL8XrZ6F3T9VJyVw7","name":"add"},"output_index":0,"sequence_number":2} event: response.function_call_arguments.delta - data: {"type":"response.function_call_arguments.delta","delta":"{\"a\":2,\"b\":3}","item_id":"fc_045e0403848c7e000169b3015e3fb881a3975075c6fb60adb8","obfuscation":"RK5","output_index":0,"sequence_number":3} + data: {"type":"response.function_call_arguments.delta","delta":"{\"a\":2,\"b\":3}","item_id":"fc_07d2265248f742f6016a3c12065a2c819e8eb9b547f64a93fc","obfuscation":"cpf","output_index":0,"sequence_number":3} event: response.function_call_arguments.done - data: {"type":"response.function_call_arguments.done","arguments":"{\"a\":2,\"b\":3}","item_id":"fc_045e0403848c7e000169b3015e3fb881a3975075c6fb60adb8","output_index":0,"sequence_number":4} + data: {"type":"response.function_call_arguments.done","arguments":"{\"a\":2,\"b\":3}","item_id":"fc_07d2265248f742f6016a3c12065a2c819e8eb9b547f64a93fc","output_index":0,"sequence_number":4} event: response.output_item.done - data: {"type":"response.output_item.done","item":{"id":"fc_045e0403848c7e000169b3015e3fb881a3975075c6fb60adb8","type":"function_call","status":"completed","arguments":"{\"a\":2,\"b\":3}","call_id":"call_8qJHo9WEvcPR9DhL3Kla9QZu","name":"add"},"output_index":0,"sequence_number":5} + data: {"type":"response.output_item.done","item":{"id":"fc_07d2265248f742f6016a3c12065a2c819e8eb9b547f64a93fc","type":"function_call","status":"completed","arguments":"{\"a\":2,\"b\":3}","call_id":"call_NnEvpiwdL8XrZ6F3T9VJyVw7","name":"add"},"output_index":0,"sequence_number":5} event: response.output_item.added - data: {"type":"response.output_item.added","item":{"id":"fc_045e0403848c7e000169b3015e3fc481a3bbf90a62123baf69","type":"function_call","status":"in_progress","arguments":"","call_id":"call_ujTTiiLIE53rXHLZ6GRQIL1Z","name":"multiply"},"output_index":1,"sequence_number":6} + data: {"type":"response.output_item.added","item":{"id":"fc_07d2265248f742f6016a3c12065a40819e8e8a06cce489d66f","type":"function_call","status":"in_progress","arguments":"","call_id":"call_TQ8336oa6YnuT2leYzRDBBLz","name":"multiply"},"output_index":1,"sequence_number":6} event: response.function_call_arguments.delta - data: {"type":"response.function_call_arguments.delta","delta":"{\"a\":2,\"b\":3}","item_id":"fc_045e0403848c7e000169b3015e3fc481a3bbf90a62123baf69","obfuscation":"C7y","output_index":1,"sequence_number":7} + data: {"type":"response.function_call_arguments.delta","delta":"{\"a\":2,\"b\":3}","item_id":"fc_07d2265248f742f6016a3c12065a40819e8e8a06cce489d66f","obfuscation":"JIg","output_index":1,"sequence_number":7} event: response.function_call_arguments.done - data: {"type":"response.function_call_arguments.done","arguments":"{\"a\":2,\"b\":3}","item_id":"fc_045e0403848c7e000169b3015e3fc481a3bbf90a62123baf69","output_index":1,"sequence_number":8} + data: {"type":"response.function_call_arguments.done","arguments":"{\"a\":2,\"b\":3}","item_id":"fc_07d2265248f742f6016a3c12065a40819e8e8a06cce489d66f","output_index":1,"sequence_number":8} event: response.output_item.done - data: {"type":"response.output_item.done","item":{"id":"fc_045e0403848c7e000169b3015e3fc481a3bbf90a62123baf69","type":"function_call","status":"completed","arguments":"{\"a\":2,\"b\":3}","call_id":"call_ujTTiiLIE53rXHLZ6GRQIL1Z","name":"multiply"},"output_index":1,"sequence_number":9} + data: {"type":"response.output_item.done","item":{"id":"fc_07d2265248f742f6016a3c12065a40819e8e8a06cce489d66f","type":"function_call","status":"completed","arguments":"{\"a\":2,\"b\":3}","call_id":"call_TQ8336oa6YnuT2leYzRDBBLz","name":"multiply"},"output_index":1,"sequence_number":9} event: response.completed - data: {"type":"response.completed","response":{"id":"resp_045e0403848c7e000169b3015da2fc81a39ed662486e0980c6","object":"response","created_at":1773338973,"status":"completed","background":false,"completed_at":1773338974,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-4o-2024-08-06","output":[{"id":"fc_045e0403848c7e000169b3015e3fb881a3975075c6fb60adb8","type":"function_call","status":"completed","arguments":"{\"a\":2,\"b\":3}","call_id":"call_8qJHo9WEvcPR9DhL3Kla9QZu","name":"add"},{"id":"fc_045e0403848c7e000169b3015e3fc481a3bbf90a62123baf69","type":"function_call","status":"completed","arguments":"{\"a\":2,\"b\":3}","call_id":"call_ujTTiiLIE53rXHLZ6GRQIL1Z","name":"multiply"}],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":null,"summary":null},"safety_identifier":null,"service_tier":"default","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Add two numbers","name":"add","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"},"strict":false},{"type":"function","description":"Multiply two numbers","name":"multiply","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":{"input_tokens":104,"input_tokens_details":{"cached_tokens":0},"output_tokens":51,"output_tokens_details":{"reasoning_tokens":0},"total_tokens":155},"user":null,"metadata":{}},"sequence_number":10} + data: {"type":"response.completed","response":{"id":"resp_07d2265248f742f6016a3c120577cc819eb21c20dbe6ebd5fa","object":"response","created_at":1782321669,"status":"completed","background":false,"completed_at":1782321670,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-4o-2024-08-06","moderation":null,"output":[{"id":"fc_07d2265248f742f6016a3c12065a2c819e8eb9b547f64a93fc","type":"function_call","status":"completed","arguments":"{\"a\":2,\"b\":3}","call_id":"call_NnEvpiwdL8XrZ6F3T9VJyVw7","name":"add"},{"id":"fc_07d2265248f742f6016a3c12065a40819e8e8a06cce489d66f","type":"function_call","status":"completed","arguments":"{\"a\":2,\"b\":3}","call_id":"call_TQ8336oa6YnuT2leYzRDBBLz","name":"multiply"}],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":null,"effort":null,"summary":null},"safety_identifier":null,"service_tier":"default","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Add two numbers","name":"add","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"},"strict":false},{"type":"function","description":"Multiply two numbers","name":"multiply","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":{"input_tokens":104,"input_tokens_details":{"cached_tokens":0},"output_tokens":51,"output_tokens_details":{"reasoning_tokens":0},"total_tokens":155},"user":null,"metadata":{}},"sequence_number":10} headers: Content-Type: - text/event-stream; charset=utf-8 status: 200 OK code: 200 - duration: 216.414667ms + duration: 267.240209ms - id: 1 request: proto: HTTP/1.1 proto_major: 1 proto_minor: 1 - content_length: 1258 + content_length: 1234 host: "" - body: '{"max_output_tokens":4000,"store":false,"input":[{"content":"You are a helpful assistant. Always use both add and multiply at the same time.","role":"system"},{"content":[{"text":"Add and multiply the number 2 and 3","type":"input_text"}],"role":"user"},{"arguments":"\"{\\\"a\\\":2,\\\"b\\\":3}\"","call_id":"call_8qJHo9WEvcPR9DhL3Kla9QZu","name":"add","type":"function_call"},{"arguments":"\"{\\\"a\\\":2,\\\"b\\\":3}\"","call_id":"call_ujTTiiLIE53rXHLZ6GRQIL1Z","name":"multiply","type":"function_call"},{"call_id":"call_8qJHo9WEvcPR9DhL3Kla9QZu","output":"5","type":"function_call_output"},{"call_id":"call_ujTTiiLIE53rXHLZ6GRQIL1Z","output":"6","type":"function_call_output"}],"model":"gpt-4o","tool_choice":"auto","tools":[{"strict":false,"parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"},"name":"add","description":"Add two numbers","type":"function"},{"strict":false,"parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"},"name":"multiply","description":"Multiply two numbers","type":"function"}],"stream":true}' + body: '{"max_output_tokens":4000,"store":false,"input":[{"content":"You are a helpful assistant. Always use both add and multiply at the same time.","role":"system"},{"content":[{"text":"Add and multiply the number 2 and 3","type":"input_text"}],"role":"user"},{"arguments":"{\"a\":2,\"b\":3}","call_id":"call_NnEvpiwdL8XrZ6F3T9VJyVw7","name":"add","type":"function_call"},{"arguments":"{\"a\":2,\"b\":3}","call_id":"call_TQ8336oa6YnuT2leYzRDBBLz","name":"multiply","type":"function_call"},{"call_id":"call_NnEvpiwdL8XrZ6F3T9VJyVw7","output":"5","type":"function_call_output"},{"call_id":"call_TQ8336oa6YnuT2leYzRDBBLz","output":"6","type":"function_call_output"}],"model":"gpt-4o","tool_choice":"auto","tools":[{"strict":false,"parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"},"name":"add","description":"Add two numbers","type":"function"},{"strict":false,"parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"},"name":"multiply","description":"Multiply two numbers","type":"function"}],"stream":true}' headers: Accept: - application/json Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://api.openai.com/v1/responses method: POST response: @@ -87,89 +87,89 @@ interactions: content_length: -1 body: |+ event: response.created - data: {"type":"response.created","response":{"id":"resp_06391baa052cedba0169b3015f62a481979d1a5f3ff912b3d7","object":"response","created_at":1773338975,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-4o-2024-08-06","output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":null,"summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Add two numbers","name":"add","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"},"strict":false},{"type":"function","description":"Multiply two numbers","name":"multiply","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":0} + data: {"type":"response.created","response":{"id":"resp_030af2f714867f9b016a3c12078714819c9cfc320ae710c052","object":"response","created_at":1782321671,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-4o-2024-08-06","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":null,"effort":null,"summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Add two numbers","name":"add","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"},"strict":false},{"type":"function","description":"Multiply two numbers","name":"multiply","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":0} event: response.in_progress - data: {"type":"response.in_progress","response":{"id":"resp_06391baa052cedba0169b3015f62a481979d1a5f3ff912b3d7","object":"response","created_at":1773338975,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-4o-2024-08-06","output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":null,"summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Add two numbers","name":"add","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"},"strict":false},{"type":"function","description":"Multiply two numbers","name":"multiply","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":1} + data: {"type":"response.in_progress","response":{"id":"resp_030af2f714867f9b016a3c12078714819c9cfc320ae710c052","object":"response","created_at":1782321671,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-4o-2024-08-06","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":null,"effort":null,"summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Add two numbers","name":"add","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"},"strict":false},{"type":"function","description":"Multiply two numbers","name":"multiply","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":1} event: response.output_item.added - data: {"type":"response.output_item.added","item":{"id":"msg_06391baa052cedba0169b3016032348197aef7079b5c55b575","type":"message","status":"in_progress","content":[],"role":"assistant"},"output_index":0,"sequence_number":2} + data: {"type":"response.output_item.added","item":{"id":"msg_030af2f714867f9b016a3c12089d04819cb7c5cd17e9666e4f","type":"message","status":"in_progress","content":[],"role":"assistant"},"output_index":0,"sequence_number":2} event: response.content_part.added - data: {"type":"response.content_part.added","content_index":0,"item_id":"msg_06391baa052cedba0169b3016032348197aef7079b5c55b575","output_index":0,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":""},"sequence_number":3} + data: {"type":"response.content_part.added","content_index":0,"item_id":"msg_030af2f714867f9b016a3c12089d04819cb7c5cd17e9666e4f","output_index":0,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":""},"sequence_number":3} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":"The","item_id":"msg_06391baa052cedba0169b3016032348197aef7079b5c55b575","logprobs":[],"obfuscation":"6HWERDh15ICmT","output_index":0,"sequence_number":4} + data: {"type":"response.output_text.delta","content_index":0,"delta":"The","item_id":"msg_030af2f714867f9b016a3c12089d04819cb7c5cd17e9666e4f","logprobs":[],"obfuscation":"3Xh1OVDUlA8LI","output_index":0,"sequence_number":4} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" sum","item_id":"msg_06391baa052cedba0169b3016032348197aef7079b5c55b575","logprobs":[],"obfuscation":"TCOeatlCLBTY","output_index":0,"sequence_number":5} + data: {"type":"response.output_text.delta","content_index":0,"delta":" sum","item_id":"msg_030af2f714867f9b016a3c12089d04819cb7c5cd17e9666e4f","logprobs":[],"obfuscation":"pWRvhkTacgSa","output_index":0,"sequence_number":5} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" of","item_id":"msg_06391baa052cedba0169b3016032348197aef7079b5c55b575","logprobs":[],"obfuscation":"VqdiuvpW0wn4x","output_index":0,"sequence_number":6} + data: {"type":"response.output_text.delta","content_index":0,"delta":" of","item_id":"msg_030af2f714867f9b016a3c12089d04819cb7c5cd17e9666e4f","logprobs":[],"obfuscation":"lZNOPVdwD0xl2","output_index":0,"sequence_number":6} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" ","item_id":"msg_06391baa052cedba0169b3016032348197aef7079b5c55b575","logprobs":[],"obfuscation":"fx8jlMXw5tDQHEu","output_index":0,"sequence_number":7} + data: {"type":"response.output_text.delta","content_index":0,"delta":" ","item_id":"msg_030af2f714867f9b016a3c12089d04819cb7c5cd17e9666e4f","logprobs":[],"obfuscation":"aR3VVg7saJOoAKu","output_index":0,"sequence_number":7} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":"2","item_id":"msg_06391baa052cedba0169b3016032348197aef7079b5c55b575","logprobs":[],"obfuscation":"FJUSk6VoT3pkquc","output_index":0,"sequence_number":8} + data: {"type":"response.output_text.delta","content_index":0,"delta":"2","item_id":"msg_030af2f714867f9b016a3c12089d04819cb7c5cd17e9666e4f","logprobs":[],"obfuscation":"xKvMrQBoGysRj9J","output_index":0,"sequence_number":8} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" and","item_id":"msg_06391baa052cedba0169b3016032348197aef7079b5c55b575","logprobs":[],"obfuscation":"ebeJVpugBZCl","output_index":0,"sequence_number":9} + data: {"type":"response.output_text.delta","content_index":0,"delta":" and","item_id":"msg_030af2f714867f9b016a3c12089d04819cb7c5cd17e9666e4f","logprobs":[],"obfuscation":"mxk4tv4vS5oK","output_index":0,"sequence_number":9} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" ","item_id":"msg_06391baa052cedba0169b3016032348197aef7079b5c55b575","logprobs":[],"obfuscation":"d8xwI8iOfxUIfMt","output_index":0,"sequence_number":10} + data: {"type":"response.output_text.delta","content_index":0,"delta":" ","item_id":"msg_030af2f714867f9b016a3c12089d04819cb7c5cd17e9666e4f","logprobs":[],"obfuscation":"hUQtuCimGzf4luH","output_index":0,"sequence_number":10} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":"3","item_id":"msg_06391baa052cedba0169b3016032348197aef7079b5c55b575","logprobs":[],"obfuscation":"XjzlKogftRNWcP4","output_index":0,"sequence_number":11} + data: {"type":"response.output_text.delta","content_index":0,"delta":"3","item_id":"msg_030af2f714867f9b016a3c12089d04819cb7c5cd17e9666e4f","logprobs":[],"obfuscation":"VoVDK0JNAOiMvu2","output_index":0,"sequence_number":11} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" is","item_id":"msg_06391baa052cedba0169b3016032348197aef7079b5c55b575","logprobs":[],"obfuscation":"jwMqzJ3NbGJrB","output_index":0,"sequence_number":12} + data: {"type":"response.output_text.delta","content_index":0,"delta":" is","item_id":"msg_030af2f714867f9b016a3c12089d04819cb7c5cd17e9666e4f","logprobs":[],"obfuscation":"Cu6JUojInNn0l","output_index":0,"sequence_number":12} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" ","item_id":"msg_06391baa052cedba0169b3016032348197aef7079b5c55b575","logprobs":[],"obfuscation":"Lmvu1EoQyQPEPkr","output_index":0,"sequence_number":13} + data: {"type":"response.output_text.delta","content_index":0,"delta":" ","item_id":"msg_030af2f714867f9b016a3c12089d04819cb7c5cd17e9666e4f","logprobs":[],"obfuscation":"Tcsl1p0PZ0xcyF0","output_index":0,"sequence_number":13} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":"5","item_id":"msg_06391baa052cedba0169b3016032348197aef7079b5c55b575","logprobs":[],"obfuscation":"Ycmqt79fNRPw3n3","output_index":0,"sequence_number":14} + data: {"type":"response.output_text.delta","content_index":0,"delta":"5","item_id":"msg_030af2f714867f9b016a3c12089d04819cb7c5cd17e9666e4f","logprobs":[],"obfuscation":"wfQdx2IBZJFP4Ha","output_index":0,"sequence_number":14} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":",","item_id":"msg_06391baa052cedba0169b3016032348197aef7079b5c55b575","logprobs":[],"obfuscation":"z7RluLA5vfz8eef","output_index":0,"sequence_number":15} + data: {"type":"response.output_text.delta","content_index":0,"delta":",","item_id":"msg_030af2f714867f9b016a3c12089d04819cb7c5cd17e9666e4f","logprobs":[],"obfuscation":"tRWMvyDdy8hxSE9","output_index":0,"sequence_number":15} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" and","item_id":"msg_06391baa052cedba0169b3016032348197aef7079b5c55b575","logprobs":[],"obfuscation":"XSV2eIDOUNrC","output_index":0,"sequence_number":16} + data: {"type":"response.output_text.delta","content_index":0,"delta":" and","item_id":"msg_030af2f714867f9b016a3c12089d04819cb7c5cd17e9666e4f","logprobs":[],"obfuscation":"k1g42ukzxN2F","output_index":0,"sequence_number":16} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" their","item_id":"msg_06391baa052cedba0169b3016032348197aef7079b5c55b575","logprobs":[],"obfuscation":"YsCZMcPZ34","output_index":0,"sequence_number":17} + data: {"type":"response.output_text.delta","content_index":0,"delta":" their","item_id":"msg_030af2f714867f9b016a3c12089d04819cb7c5cd17e9666e4f","logprobs":[],"obfuscation":"uZbMhE6oGN","output_index":0,"sequence_number":17} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" product","item_id":"msg_06391baa052cedba0169b3016032348197aef7079b5c55b575","logprobs":[],"obfuscation":"UAZs4rdr","output_index":0,"sequence_number":18} + data: {"type":"response.output_text.delta","content_index":0,"delta":" product","item_id":"msg_030af2f714867f9b016a3c12089d04819cb7c5cd17e9666e4f","logprobs":[],"obfuscation":"x5Mgti9L","output_index":0,"sequence_number":18} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" is","item_id":"msg_06391baa052cedba0169b3016032348197aef7079b5c55b575","logprobs":[],"obfuscation":"gjBz1vmMHyd4d","output_index":0,"sequence_number":19} + data: {"type":"response.output_text.delta","content_index":0,"delta":" is","item_id":"msg_030af2f714867f9b016a3c12089d04819cb7c5cd17e9666e4f","logprobs":[],"obfuscation":"8GqYleU2f5vlw","output_index":0,"sequence_number":19} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" ","item_id":"msg_06391baa052cedba0169b3016032348197aef7079b5c55b575","logprobs":[],"obfuscation":"jmrs3JUSsoSx6Ty","output_index":0,"sequence_number":20} + data: {"type":"response.output_text.delta","content_index":0,"delta":" ","item_id":"msg_030af2f714867f9b016a3c12089d04819cb7c5cd17e9666e4f","logprobs":[],"obfuscation":"xEpJDpFIgARdKBO","output_index":0,"sequence_number":20} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":"6","item_id":"msg_06391baa052cedba0169b3016032348197aef7079b5c55b575","logprobs":[],"obfuscation":"7D8bItiC2H70ibV","output_index":0,"sequence_number":21} + data: {"type":"response.output_text.delta","content_index":0,"delta":"6","item_id":"msg_030af2f714867f9b016a3c12089d04819cb7c5cd17e9666e4f","logprobs":[],"obfuscation":"8w2BrwU0EtCtOFp","output_index":0,"sequence_number":21} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":".","item_id":"msg_06391baa052cedba0169b3016032348197aef7079b5c55b575","logprobs":[],"obfuscation":"XnDzM0HYkG85AiS","output_index":0,"sequence_number":22} + data: {"type":"response.output_text.delta","content_index":0,"delta":".","item_id":"msg_030af2f714867f9b016a3c12089d04819cb7c5cd17e9666e4f","logprobs":[],"obfuscation":"crlitAuybqz22ap","output_index":0,"sequence_number":22} event: response.output_text.done - data: {"type":"response.output_text.done","content_index":0,"item_id":"msg_06391baa052cedba0169b3016032348197aef7079b5c55b575","logprobs":[],"output_index":0,"sequence_number":23,"text":"The sum of 2 and 3 is 5, and their product is 6."} + data: {"type":"response.output_text.done","content_index":0,"item_id":"msg_030af2f714867f9b016a3c12089d04819cb7c5cd17e9666e4f","logprobs":[],"output_index":0,"sequence_number":23,"text":"The sum of 2 and 3 is 5, and their product is 6."} event: response.content_part.done - data: {"type":"response.content_part.done","content_index":0,"item_id":"msg_06391baa052cedba0169b3016032348197aef7079b5c55b575","output_index":0,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":"The sum of 2 and 3 is 5, and their product is 6."},"sequence_number":24} + data: {"type":"response.content_part.done","content_index":0,"item_id":"msg_030af2f714867f9b016a3c12089d04819cb7c5cd17e9666e4f","output_index":0,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":"The sum of 2 and 3 is 5, and their product is 6."},"sequence_number":24} event: response.output_item.done - data: {"type":"response.output_item.done","item":{"id":"msg_06391baa052cedba0169b3016032348197aef7079b5c55b575","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"The sum of 2 and 3 is 5, and their product is 6."}],"role":"assistant"},"output_index":0,"sequence_number":25} + data: {"type":"response.output_item.done","item":{"id":"msg_030af2f714867f9b016a3c12089d04819cb7c5cd17e9666e4f","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"The sum of 2 and 3 is 5, and their product is 6."}],"role":"assistant"},"output_index":0,"sequence_number":25} event: response.completed - data: {"type":"response.completed","response":{"id":"resp_06391baa052cedba0169b3015f62a481979d1a5f3ff912b3d7","object":"response","created_at":1773338975,"status":"completed","background":false,"completed_at":1773338976,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-4o-2024-08-06","output":[{"id":"msg_06391baa052cedba0169b3016032348197aef7079b5c55b575","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"The sum of 2 and 3 is 5, and their product is 6."}],"role":"assistant"}],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":null,"summary":null},"safety_identifier":null,"service_tier":"default","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Add two numbers","name":"add","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"},"strict":false},{"type":"function","description":"Multiply two numbers","name":"multiply","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":{"input_tokens":152,"input_tokens_details":{"cached_tokens":0},"output_tokens":21,"output_tokens_details":{"reasoning_tokens":0},"total_tokens":173},"user":null,"metadata":{}},"sequence_number":26} + data: {"type":"response.completed","response":{"id":"resp_030af2f714867f9b016a3c12078714819c9cfc320ae710c052","object":"response","created_at":1782321671,"status":"completed","background":false,"completed_at":1782321673,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-4o-2024-08-06","moderation":null,"output":[{"id":"msg_030af2f714867f9b016a3c12089d04819cb7c5cd17e9666e4f","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"The sum of 2 and 3 is 5, and their product is 6."}],"role":"assistant"}],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":null,"effort":null,"summary":null},"safety_identifier":null,"service_tier":"default","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Add two numbers","name":"add","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"},"strict":false},{"type":"function","description":"Multiply two numbers","name":"multiply","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":{"input_tokens":150,"input_tokens_details":{"cached_tokens":0},"output_tokens":21,"output_tokens_details":{"reasoning_tokens":0},"total_tokens":171},"user":null,"metadata":{}},"sequence_number":26} headers: Content-Type: - text/event-stream; charset=utf-8 status: 200 OK code: 200 - duration: 1.08024975s + duration: 1.5179005s diff --git a/providertests/testdata/TestOpenAIResponsesCommon/openai-gpt-4o/simple.yaml b/providertests/testdata/TestOpenAIResponsesCommon/openai-gpt-4o/simple.yaml index 8377feb86..cc27b53ef 100644 --- a/providertests/testdata/TestOpenAIResponsesCommon/openai-gpt-4o/simple.yaml +++ b/providertests/testdata/TestOpenAIResponsesCommon/openai-gpt-4o/simple.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://api.openai.com/v1/responses method: POST response: @@ -26,15 +26,15 @@ interactions: uncompressed: true body: |- { - "id": "resp_0e7dfdc132fa96a90169b3014c5470819eadf32151a0dbfd15", + "id": "resp_07592f42d0d2f1ac016a3c11f75bd081a1a99d083171a39f1f", "object": "response", - "created_at": 1773338956, + "created_at": 1782321655, "status": "completed", "background": false, "billing": { "payer": "developer" }, - "completed_at": 1773338957, + "completed_at": 1782321657, "error": null, "frequency_penalty": 0.0, "incomplete_details": null, @@ -42,9 +42,10 @@ interactions: "max_output_tokens": 4000, "max_tool_calls": null, "model": "gpt-4o-2024-08-06", + "moderation": null, "output": [ { - "id": "msg_0e7dfdc132fa96a90169b3014db10c819ea5b69df79c7f2810", + "id": "msg_07592f42d0d2f1ac016a3c11f9002081a180824d7cd06bccbd", "type": "message", "status": "completed", "content": [ @@ -52,7 +53,7 @@ interactions: "type": "output_text", "annotations": [], "logprobs": [], - "text": "Oi!" + "text": "Ol\u00e1!" } ], "role": "assistant" @@ -62,8 +63,9 @@ interactions: "presence_penalty": 0.0, "previous_response_id": null, "prompt_cache_key": null, - "prompt_cache_retention": null, + "prompt_cache_retention": "in_memory", "reasoning": { + "context": null, "effort": null, "summary": null }, @@ -101,4 +103,4 @@ interactions: - application/json status: 200 OK code: 200 - duration: 2.574510083s + duration: 3.360262125s diff --git a/providertests/testdata/TestOpenAIResponsesCommon/openai-gpt-4o/simple_streaming.yaml b/providertests/testdata/TestOpenAIResponsesCommon/openai-gpt-4o/simple_streaming.yaml index 1955a08fc..5f1530cd3 100644 --- a/providertests/testdata/TestOpenAIResponsesCommon/openai-gpt-4o/simple_streaming.yaml +++ b/providertests/testdata/TestOpenAIResponsesCommon/openai-gpt-4o/simple_streaming.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://api.openai.com/v1/responses method: POST response: @@ -25,38 +25,38 @@ interactions: content_length: -1 body: |+ event: response.created - data: {"type":"response.created","response":{"id":"resp_09a1072d660287e90169b3014ec67c819fa59fe909ba58d190","object":"response","created_at":1773338958,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-4o-2024-08-06","output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":null,"summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":0} + data: {"type":"response.created","response":{"id":"resp_099d6c816b4d9f35016a3c11f9593481a2a77e9b90b888ae50","object":"response","created_at":1782321657,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-4o-2024-08-06","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":null,"effort":null,"summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":0} event: response.in_progress - data: {"type":"response.in_progress","response":{"id":"resp_09a1072d660287e90169b3014ec67c819fa59fe909ba58d190","object":"response","created_at":1773338958,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-4o-2024-08-06","output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":null,"summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":1} + data: {"type":"response.in_progress","response":{"id":"resp_099d6c816b4d9f35016a3c11f9593481a2a77e9b90b888ae50","object":"response","created_at":1782321657,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-4o-2024-08-06","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":null,"effort":null,"summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":1} event: response.output_item.added - data: {"type":"response.output_item.added","item":{"id":"msg_09a1072d660287e90169b3014fcaec819f82333d27096f1e40","type":"message","status":"in_progress","content":[],"role":"assistant"},"output_index":0,"sequence_number":2} + data: {"type":"response.output_item.added","item":{"id":"msg_099d6c816b4d9f35016a3c11fb338081a289266547cae6ff41","type":"message","status":"in_progress","content":[],"role":"assistant"},"output_index":0,"sequence_number":2} event: response.content_part.added - data: {"type":"response.content_part.added","content_index":0,"item_id":"msg_09a1072d660287e90169b3014fcaec819f82333d27096f1e40","output_index":0,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":""},"sequence_number":3} + data: {"type":"response.content_part.added","content_index":0,"item_id":"msg_099d6c816b4d9f35016a3c11fb338081a289266547cae6ff41","output_index":0,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":""},"sequence_number":3} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":"Olá","item_id":"msg_09a1072d660287e90169b3014fcaec819f82333d27096f1e40","logprobs":[],"obfuscation":"pD1PKJarAoaqr","output_index":0,"sequence_number":4} + data: {"type":"response.output_text.delta","content_index":0,"delta":"Olá","item_id":"msg_099d6c816b4d9f35016a3c11fb338081a289266547cae6ff41","logprobs":[],"obfuscation":"MWsYL9iUMgwoT","output_index":0,"sequence_number":4} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":"!","item_id":"msg_09a1072d660287e90169b3014fcaec819f82333d27096f1e40","logprobs":[],"obfuscation":"kZAT1CpRcJ3JazH","output_index":0,"sequence_number":5} + data: {"type":"response.output_text.delta","content_index":0,"delta":"!","item_id":"msg_099d6c816b4d9f35016a3c11fb338081a289266547cae6ff41","logprobs":[],"obfuscation":"TUhaeSUxzyLf2VK","output_index":0,"sequence_number":5} event: response.output_text.done - data: {"type":"response.output_text.done","content_index":0,"item_id":"msg_09a1072d660287e90169b3014fcaec819f82333d27096f1e40","logprobs":[],"output_index":0,"sequence_number":6,"text":"Olá!"} + data: {"type":"response.output_text.done","content_index":0,"item_id":"msg_099d6c816b4d9f35016a3c11fb338081a289266547cae6ff41","logprobs":[],"output_index":0,"sequence_number":6,"text":"Olá!"} event: response.content_part.done - data: {"type":"response.content_part.done","content_index":0,"item_id":"msg_09a1072d660287e90169b3014fcaec819f82333d27096f1e40","output_index":0,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":"Olá!"},"sequence_number":7} + data: {"type":"response.content_part.done","content_index":0,"item_id":"msg_099d6c816b4d9f35016a3c11fb338081a289266547cae6ff41","output_index":0,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":"Olá!"},"sequence_number":7} event: response.output_item.done - data: {"type":"response.output_item.done","item":{"id":"msg_09a1072d660287e90169b3014fcaec819f82333d27096f1e40","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"Olá!"}],"role":"assistant"},"output_index":0,"sequence_number":8} + data: {"type":"response.output_item.done","item":{"id":"msg_099d6c816b4d9f35016a3c11fb338081a289266547cae6ff41","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"Olá!"}],"role":"assistant"},"output_index":0,"sequence_number":8} event: response.completed - data: {"type":"response.completed","response":{"id":"resp_09a1072d660287e90169b3014ec67c819fa59fe909ba58d190","object":"response","created_at":1773338958,"status":"completed","background":false,"completed_at":1773338959,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-4o-2024-08-06","output":[{"id":"msg_09a1072d660287e90169b3014fcaec819f82333d27096f1e40","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"Olá!"}],"role":"assistant"}],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":null,"summary":null},"safety_identifier":null,"service_tier":"default","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":{"input_tokens":20,"input_tokens_details":{"cached_tokens":0},"output_tokens":3,"output_tokens_details":{"reasoning_tokens":0},"total_tokens":23},"user":null,"metadata":{}},"sequence_number":9} + data: {"type":"response.completed","response":{"id":"resp_099d6c816b4d9f35016a3c11f9593481a2a77e9b90b888ae50","object":"response","created_at":1782321657,"status":"completed","background":false,"completed_at":1782321659,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-4o-2024-08-06","moderation":null,"output":[{"id":"msg_099d6c816b4d9f35016a3c11fb338081a289266547cae6ff41","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"Olá!"}],"role":"assistant"}],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":null,"effort":null,"summary":null},"safety_identifier":null,"service_tier":"default","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":{"input_tokens":20,"input_tokens_details":{"cached_tokens":0},"output_tokens":3,"output_tokens_details":{"reasoning_tokens":0},"total_tokens":23},"user":null,"metadata":{}},"sequence_number":9} headers: Content-Type: - text/event-stream; charset=utf-8 status: 200 OK code: 200 - duration: 1.117413709s + duration: 406.037917ms diff --git a/providertests/testdata/TestOpenAIResponsesCommon/openai-gpt-4o/tool.yaml b/providertests/testdata/TestOpenAIResponsesCommon/openai-gpt-4o/tool.yaml index 99c32f832..042b67466 100644 --- a/providertests/testdata/TestOpenAIResponsesCommon/openai-gpt-4o/tool.yaml +++ b/providertests/testdata/TestOpenAIResponsesCommon/openai-gpt-4o/tool.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://api.openai.com/v1/responses method: POST response: @@ -26,15 +26,15 @@ interactions: uncompressed: true body: |- { - "id": "resp_0560da6ac76dea570169b30150cda081a2a5e231ac98d899ad", + "id": "resp_0ae18fcb02ae6780016a3c11fb7aa481a0a5936c206a2238bd", "object": "response", - "created_at": 1773338960, + "created_at": 1782321659, "status": "completed", "background": false, "billing": { "payer": "developer" }, - "completed_at": 1773338963, + "completed_at": 1782321661, "error": null, "frequency_penalty": 0.0, "incomplete_details": null, @@ -42,13 +42,14 @@ interactions: "max_output_tokens": 4000, "max_tool_calls": null, "model": "gpt-4o-2024-08-06", + "moderation": null, "output": [ { - "id": "fc_0560da6ac76dea570169b30152ecd081a29cdb56baa536c00c", + "id": "fc_0ae18fcb02ae6780016a3c11fd4fdc81a0b19ad4db2c85f795", "type": "function_call", "status": "completed", "arguments": "{\"location\":\"Florence, Italy\"}", - "call_id": "call_HMl4m0PQwcLjJ6aiA4xFRSNz", + "call_id": "call_6Y7U4KSBYYYDJIEL0QdvBtzW", "name": "weather" } ], @@ -56,8 +57,9 @@ interactions: "presence_penalty": 0.0, "previous_response_id": null, "prompt_cache_key": null, - "prompt_cache_retention": null, + "prompt_cache_retention": "in_memory", "reasoning": { + "context": null, "effort": null, "summary": null }, @@ -114,22 +116,22 @@ interactions: - application/json status: 200 OK code: 200 - duration: 3.301408417s + duration: 2.242171209s - id: 1 request: proto: HTTP/1.1 proto_major: 1 proto_minor: 1 - content_length: 719 + content_length: 707 host: "" - body: '{"max_output_tokens":4000,"store":false,"input":[{"content":"You are a helpful assistant","role":"system"},{"content":[{"text":"What''s the weather in Florence,Italy?","type":"input_text"}],"role":"user"},{"arguments":"\"{\\\"location\\\":\\\"Florence, Italy\\\"}\"","call_id":"call_HMl4m0PQwcLjJ6aiA4xFRSNz","name":"weather","type":"function_call"},{"call_id":"call_HMl4m0PQwcLjJ6aiA4xFRSNz","output":"40 C","type":"function_call_output"}],"model":"gpt-4o","tool_choice":"auto","tools":[{"strict":false,"parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"name":"weather","description":"Get weather information for a location","type":"function"}]}' + body: '{"max_output_tokens":4000,"store":false,"input":[{"content":"You are a helpful assistant","role":"system"},{"content":[{"text":"What''s the weather in Florence,Italy?","type":"input_text"}],"role":"user"},{"arguments":"{\"location\":\"Florence, Italy\"}","call_id":"call_6Y7U4KSBYYYDJIEL0QdvBtzW","name":"weather","type":"function_call"},{"call_id":"call_6Y7U4KSBYYYDJIEL0QdvBtzW","output":"40 C","type":"function_call_output"}],"model":"gpt-4o","tool_choice":"auto","tools":[{"strict":false,"parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"name":"weather","description":"Get weather information for a location","type":"function"}]}' headers: Accept: - application/json Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://api.openai.com/v1/responses method: POST response: @@ -140,15 +142,15 @@ interactions: uncompressed: true body: |- { - "id": "resp_09df0b104e552ae00169b3015430788193996dfac9a8b2dd26", + "id": "resp_0d44284ff704da0c016a3c11fdb35c819c913115a0baebb25a", "object": "response", - "created_at": 1773338964, + "created_at": 1782321661, "status": "completed", "background": false, "billing": { "payer": "developer" }, - "completed_at": 1773338965, + "completed_at": 1782321662, "error": null, "frequency_penalty": 0.0, "incomplete_details": null, @@ -156,9 +158,10 @@ interactions: "max_output_tokens": 4000, "max_tool_calls": null, "model": "gpt-4o-2024-08-06", + "moderation": null, "output": [ { - "id": "msg_09df0b104e552ae00169b3015526148193ba1b423e49987014", + "id": "msg_0d44284ff704da0c016a3c11fe59bc819ca9134d82e7799fae", "type": "message", "status": "completed", "content": [ @@ -176,8 +179,9 @@ interactions: "presence_penalty": 0.0, "previous_response_id": null, "prompt_cache_key": null, - "prompt_cache_retention": null, + "prompt_cache_retention": "in_memory", "reasoning": { + "context": null, "effort": null, "summary": null }, @@ -216,7 +220,7 @@ interactions: "top_p": 1.0, "truncation": "disabled", "usage": { - "input_tokens": 83, + "input_tokens": 81, "input_tokens_details": { "cached_tokens": 0 }, @@ -224,7 +228,7 @@ interactions: "output_tokens_details": { "reasoning_tokens": 0 }, - "total_tokens": 97 + "total_tokens": 95 }, "user": null, "metadata": {} @@ -234,4 +238,4 @@ interactions: - application/json status: 200 OK code: 200 - duration: 2.250649709s + duration: 1.024352708s diff --git a/providertests/testdata/TestOpenAIResponsesCommon/openai-gpt-4o/tool_streaming.yaml b/providertests/testdata/TestOpenAIResponsesCommon/openai-gpt-4o/tool_streaming.yaml index d9350dc37..8b7620f6c 100644 --- a/providertests/testdata/TestOpenAIResponsesCommon/openai-gpt-4o/tool_streaming.yaml +++ b/providertests/testdata/TestOpenAIResponsesCommon/openai-gpt-4o/tool_streaming.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://api.openai.com/v1/responses method: POST response: @@ -25,68 +25,68 @@ interactions: content_length: -1 body: |+ event: response.created - data: {"type":"response.created","response":{"id":"resp_04ca22e2be25fcad0169b301565a408192ac42b6c97404f9c3","object":"response","created_at":1773338966,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-4o-2024-08-06","output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":null,"summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":0} + data: {"type":"response.created","response":{"id":"resp_08e0d5fe24768fbd016a3c11fec04081928b7c5c05d975fc26","object":"response","created_at":1782321662,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-4o-2024-08-06","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":null,"effort":null,"summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":0} event: response.in_progress - data: {"type":"response.in_progress","response":{"id":"resp_04ca22e2be25fcad0169b301565a408192ac42b6c97404f9c3","object":"response","created_at":1773338966,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-4o-2024-08-06","output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":null,"summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":1} + data: {"type":"response.in_progress","response":{"id":"resp_08e0d5fe24768fbd016a3c11fec04081928b7c5c05d975fc26","object":"response","created_at":1782321662,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-4o-2024-08-06","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":null,"effort":null,"summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":1} event: response.output_item.added - data: {"type":"response.output_item.added","item":{"id":"fc_04ca22e2be25fcad0169b30157ebdc8192b56c02cce5635715","type":"function_call","status":"in_progress","arguments":"","call_id":"call_ucvCl5l598TOPnppSOm9008r","name":"weather"},"output_index":0,"sequence_number":2} + data: {"type":"response.output_item.added","item":{"id":"fc_08e0d5fe24768fbd016a3c120112e481928ab6e9c900d449e6","type":"function_call","status":"in_progress","arguments":"","call_id":"call_PRiJm2RVAvt7IoRvjxIXxFVF","name":"weather"},"output_index":0,"sequence_number":2} event: response.function_call_arguments.delta - data: {"type":"response.function_call_arguments.delta","delta":"{\"","item_id":"fc_04ca22e2be25fcad0169b30157ebdc8192b56c02cce5635715","obfuscation":"RlTCuP3LxSnQCA","output_index":0,"sequence_number":3} + data: {"type":"response.function_call_arguments.delta","delta":"{\"","item_id":"fc_08e0d5fe24768fbd016a3c120112e481928ab6e9c900d449e6","obfuscation":"gXoA7jnLagsqN9","output_index":0,"sequence_number":3} event: response.function_call_arguments.delta - data: {"type":"response.function_call_arguments.delta","delta":"location","item_id":"fc_04ca22e2be25fcad0169b30157ebdc8192b56c02cce5635715","obfuscation":"QgcK37ga","output_index":0,"sequence_number":4} + data: {"type":"response.function_call_arguments.delta","delta":"location","item_id":"fc_08e0d5fe24768fbd016a3c120112e481928ab6e9c900d449e6","obfuscation":"5nlNJUHY","output_index":0,"sequence_number":4} event: response.function_call_arguments.delta - data: {"type":"response.function_call_arguments.delta","delta":"\":\"","item_id":"fc_04ca22e2be25fcad0169b30157ebdc8192b56c02cce5635715","obfuscation":"UF37Go4K7ziK4","output_index":0,"sequence_number":5} + data: {"type":"response.function_call_arguments.delta","delta":"\":\"","item_id":"fc_08e0d5fe24768fbd016a3c120112e481928ab6e9c900d449e6","obfuscation":"FORgzFLBcXhTf","output_index":0,"sequence_number":5} event: response.function_call_arguments.delta - data: {"type":"response.function_call_arguments.delta","delta":"Flor","item_id":"fc_04ca22e2be25fcad0169b30157ebdc8192b56c02cce5635715","obfuscation":"CnvBzsy3rTux","output_index":0,"sequence_number":6} + data: {"type":"response.function_call_arguments.delta","delta":"Flor","item_id":"fc_08e0d5fe24768fbd016a3c120112e481928ab6e9c900d449e6","obfuscation":"NBdlGFSIrNzV","output_index":0,"sequence_number":6} event: response.function_call_arguments.delta - data: {"type":"response.function_call_arguments.delta","delta":"ence","item_id":"fc_04ca22e2be25fcad0169b30157ebdc8192b56c02cce5635715","obfuscation":"aNlZcHsX6nre","output_index":0,"sequence_number":7} + data: {"type":"response.function_call_arguments.delta","delta":"ence","item_id":"fc_08e0d5fe24768fbd016a3c120112e481928ab6e9c900d449e6","obfuscation":"N5b502cOJaah","output_index":0,"sequence_number":7} event: response.function_call_arguments.delta - data: {"type":"response.function_call_arguments.delta","delta":",","item_id":"fc_04ca22e2be25fcad0169b30157ebdc8192b56c02cce5635715","obfuscation":"lo008GEBMgBdgy7","output_index":0,"sequence_number":8} + data: {"type":"response.function_call_arguments.delta","delta":",","item_id":"fc_08e0d5fe24768fbd016a3c120112e481928ab6e9c900d449e6","obfuscation":"7lqNZ34ytIEDm03","output_index":0,"sequence_number":8} event: response.function_call_arguments.delta - data: {"type":"response.function_call_arguments.delta","delta":" Italy","item_id":"fc_04ca22e2be25fcad0169b30157ebdc8192b56c02cce5635715","obfuscation":"717ARz1XUH","output_index":0,"sequence_number":9} + data: {"type":"response.function_call_arguments.delta","delta":" Italy","item_id":"fc_08e0d5fe24768fbd016a3c120112e481928ab6e9c900d449e6","obfuscation":"eDf5NaEOA4","output_index":0,"sequence_number":9} event: response.function_call_arguments.delta - data: {"type":"response.function_call_arguments.delta","delta":"\"}","item_id":"fc_04ca22e2be25fcad0169b30157ebdc8192b56c02cce5635715","obfuscation":"XwwhJA4dI6TNNp","output_index":0,"sequence_number":10} + data: {"type":"response.function_call_arguments.delta","delta":"\"}","item_id":"fc_08e0d5fe24768fbd016a3c120112e481928ab6e9c900d449e6","obfuscation":"FOkqwfG3Rnjuet","output_index":0,"sequence_number":10} event: response.function_call_arguments.done - data: {"type":"response.function_call_arguments.done","arguments":"{\"location\":\"Florence, Italy\"}","item_id":"fc_04ca22e2be25fcad0169b30157ebdc8192b56c02cce5635715","output_index":0,"sequence_number":11} + data: {"type":"response.function_call_arguments.done","arguments":"{\"location\":\"Florence, Italy\"}","item_id":"fc_08e0d5fe24768fbd016a3c120112e481928ab6e9c900d449e6","output_index":0,"sequence_number":11} event: response.output_item.done - data: {"type":"response.output_item.done","item":{"id":"fc_04ca22e2be25fcad0169b30157ebdc8192b56c02cce5635715","type":"function_call","status":"completed","arguments":"{\"location\":\"Florence, Italy\"}","call_id":"call_ucvCl5l598TOPnppSOm9008r","name":"weather"},"output_index":0,"sequence_number":12} + data: {"type":"response.output_item.done","item":{"id":"fc_08e0d5fe24768fbd016a3c120112e481928ab6e9c900d449e6","type":"function_call","status":"completed","arguments":"{\"location\":\"Florence, Italy\"}","call_id":"call_PRiJm2RVAvt7IoRvjxIXxFVF","name":"weather"},"output_index":0,"sequence_number":12} event: response.completed - data: {"type":"response.completed","response":{"id":"resp_04ca22e2be25fcad0169b301565a408192ac42b6c97404f9c3","object":"response","created_at":1773338966,"status":"completed","background":false,"completed_at":1773338968,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-4o-2024-08-06","output":[{"id":"fc_04ca22e2be25fcad0169b30157ebdc8192b56c02cce5635715","type":"function_call","status":"completed","arguments":"{\"location\":\"Florence, Italy\"}","call_id":"call_ucvCl5l598TOPnppSOm9008r","name":"weather"}],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":null,"summary":null},"safety_identifier":null,"service_tier":"default","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":{"input_tokens":58,"input_tokens_details":{"cached_tokens":0},"output_tokens":17,"output_tokens_details":{"reasoning_tokens":0},"total_tokens":75},"user":null,"metadata":{}},"sequence_number":13} + data: {"type":"response.completed","response":{"id":"resp_08e0d5fe24768fbd016a3c11fec04081928b7c5c05d975fc26","object":"response","created_at":1782321662,"status":"completed","background":false,"completed_at":1782321665,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-4o-2024-08-06","moderation":null,"output":[{"id":"fc_08e0d5fe24768fbd016a3c120112e481928ab6e9c900d449e6","type":"function_call","status":"completed","arguments":"{\"location\":\"Florence, Italy\"}","call_id":"call_PRiJm2RVAvt7IoRvjxIXxFVF","name":"weather"}],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":null,"effort":null,"summary":null},"safety_identifier":null,"service_tier":"default","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":{"input_tokens":58,"input_tokens_details":{"cached_tokens":0},"output_tokens":17,"output_tokens_details":{"reasoning_tokens":0},"total_tokens":75},"user":null,"metadata":{}},"sequence_number":13} headers: Content-Type: - text/event-stream; charset=utf-8 status: 200 OK code: 200 - duration: 1.031451917s + duration: 327.358917ms - id: 1 request: proto: HTTP/1.1 proto_major: 1 proto_minor: 1 - content_length: 733 + content_length: 721 host: "" - body: '{"max_output_tokens":4000,"store":false,"input":[{"content":"You are a helpful assistant","role":"system"},{"content":[{"text":"What''s the weather in Florence,Italy?","type":"input_text"}],"role":"user"},{"arguments":"\"{\\\"location\\\":\\\"Florence, Italy\\\"}\"","call_id":"call_ucvCl5l598TOPnppSOm9008r","name":"weather","type":"function_call"},{"call_id":"call_ucvCl5l598TOPnppSOm9008r","output":"40 C","type":"function_call_output"}],"model":"gpt-4o","tool_choice":"auto","tools":[{"strict":false,"parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"name":"weather","description":"Get weather information for a location","type":"function"}],"stream":true}' + body: '{"max_output_tokens":4000,"store":false,"input":[{"content":"You are a helpful assistant","role":"system"},{"content":[{"text":"What''s the weather in Florence,Italy?","type":"input_text"}],"role":"user"},{"arguments":"{\"location\":\"Florence, Italy\"}","call_id":"call_PRiJm2RVAvt7IoRvjxIXxFVF","name":"weather","type":"function_call"},{"call_id":"call_PRiJm2RVAvt7IoRvjxIXxFVF","output":"40 C","type":"function_call_output"}],"model":"gpt-4o","tool_choice":"auto","tools":[{"strict":false,"parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"name":"weather","description":"Get weather information for a location","type":"function"}],"stream":true}' headers: Accept: - application/json Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://api.openai.com/v1/responses method: POST response: @@ -96,68 +96,68 @@ interactions: content_length: -1 body: |+ event: response.created - data: {"type":"response.created","response":{"id":"resp_0bda4590417bd1510169b301585a34819f9f99b79659a2484b","object":"response","created_at":1773338968,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-4o-2024-08-06","output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":null,"summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":0} + data: {"type":"response.created","response":{"id":"resp_05bf401c6a96e8f8016a3c12019e648191b854b80349a9aa8b","object":"response","created_at":1782321665,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-4o-2024-08-06","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":null,"effort":null,"summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":0} event: response.in_progress - data: {"type":"response.in_progress","response":{"id":"resp_0bda4590417bd1510169b301585a34819f9f99b79659a2484b","object":"response","created_at":1773338968,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-4o-2024-08-06","output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":null,"summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":1} + data: {"type":"response.in_progress","response":{"id":"resp_05bf401c6a96e8f8016a3c12019e648191b854b80349a9aa8b","object":"response","created_at":1782321665,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-4o-2024-08-06","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":null,"effort":null,"summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":1} event: response.output_item.added - data: {"type":"response.output_item.added","item":{"id":"msg_0bda4590417bd1510169b30158beb0819f81fd20565650adb9","type":"message","status":"in_progress","content":[],"role":"assistant"},"output_index":0,"sequence_number":2} + data: {"type":"response.output_item.added","item":{"id":"msg_05bf401c6a96e8f8016a3c12022ee081919201ccebef2eac39","type":"message","status":"in_progress","content":[],"role":"assistant"},"output_index":0,"sequence_number":2} event: response.content_part.added - data: {"type":"response.content_part.added","content_index":0,"item_id":"msg_0bda4590417bd1510169b30158beb0819f81fd20565650adb9","output_index":0,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":""},"sequence_number":3} + data: {"type":"response.content_part.added","content_index":0,"item_id":"msg_05bf401c6a96e8f8016a3c12022ee081919201ccebef2eac39","output_index":0,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":""},"sequence_number":3} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":"The","item_id":"msg_0bda4590417bd1510169b30158beb0819f81fd20565650adb9","logprobs":[],"obfuscation":"J14wbPNOJ1ECS","output_index":0,"sequence_number":4} + data: {"type":"response.output_text.delta","content_index":0,"delta":"The","item_id":"msg_05bf401c6a96e8f8016a3c12022ee081919201ccebef2eac39","logprobs":[],"obfuscation":"ZKbdMhLFAmKjc","output_index":0,"sequence_number":4} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" current","item_id":"msg_0bda4590417bd1510169b30158beb0819f81fd20565650adb9","logprobs":[],"obfuscation":"XJZMpoWt","output_index":0,"sequence_number":5} + data: {"type":"response.output_text.delta","content_index":0,"delta":" current","item_id":"msg_05bf401c6a96e8f8016a3c12022ee081919201ccebef2eac39","logprobs":[],"obfuscation":"RZT7wrG1","output_index":0,"sequence_number":5} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" temperature","item_id":"msg_0bda4590417bd1510169b30158beb0819f81fd20565650adb9","logprobs":[],"obfuscation":"oKh2","output_index":0,"sequence_number":6} + data: {"type":"response.output_text.delta","content_index":0,"delta":" temperature","item_id":"msg_05bf401c6a96e8f8016a3c12022ee081919201ccebef2eac39","logprobs":[],"obfuscation":"nFLa","output_index":0,"sequence_number":6} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" in","item_id":"msg_0bda4590417bd1510169b30158beb0819f81fd20565650adb9","logprobs":[],"obfuscation":"iq1LCT3KTydLV","output_index":0,"sequence_number":7} + data: {"type":"response.output_text.delta","content_index":0,"delta":" in","item_id":"msg_05bf401c6a96e8f8016a3c12022ee081919201ccebef2eac39","logprobs":[],"obfuscation":"2oPjIPEnHiDJc","output_index":0,"sequence_number":7} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" Florence","item_id":"msg_0bda4590417bd1510169b30158beb0819f81fd20565650adb9","logprobs":[],"obfuscation":"QQ1X83z","output_index":0,"sequence_number":8} + data: {"type":"response.output_text.delta","content_index":0,"delta":" Florence","item_id":"msg_05bf401c6a96e8f8016a3c12022ee081919201ccebef2eac39","logprobs":[],"obfuscation":"HNfkKsV","output_index":0,"sequence_number":8} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":",","item_id":"msg_0bda4590417bd1510169b30158beb0819f81fd20565650adb9","logprobs":[],"obfuscation":"Nv3kDOuqatuEsyu","output_index":0,"sequence_number":9} + data: {"type":"response.output_text.delta","content_index":0,"delta":",","item_id":"msg_05bf401c6a96e8f8016a3c12022ee081919201ccebef2eac39","logprobs":[],"obfuscation":"byWZvc7Mw1QHmc4","output_index":0,"sequence_number":9} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" Italy","item_id":"msg_0bda4590417bd1510169b30158beb0819f81fd20565650adb9","logprobs":[],"obfuscation":"PFWBX7dx9R","output_index":0,"sequence_number":10} + data: {"type":"response.output_text.delta","content_index":0,"delta":" Italy","item_id":"msg_05bf401c6a96e8f8016a3c12022ee081919201ccebef2eac39","logprobs":[],"obfuscation":"Z1bl0ZMsx5","output_index":0,"sequence_number":10} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" is","item_id":"msg_0bda4590417bd1510169b30158beb0819f81fd20565650adb9","logprobs":[],"obfuscation":"NaXNOcjL9QhAV","output_index":0,"sequence_number":11} + data: {"type":"response.output_text.delta","content_index":0,"delta":" is","item_id":"msg_05bf401c6a96e8f8016a3c12022ee081919201ccebef2eac39","logprobs":[],"obfuscation":"lqanrCvTSZeZF","output_index":0,"sequence_number":11} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" ","item_id":"msg_0bda4590417bd1510169b30158beb0819f81fd20565650adb9","logprobs":[],"obfuscation":"XV6wTWBsgig9vlH","output_index":0,"sequence_number":12} + data: {"type":"response.output_text.delta","content_index":0,"delta":" ","item_id":"msg_05bf401c6a96e8f8016a3c12022ee081919201ccebef2eac39","logprobs":[],"obfuscation":"PQ0eGQ2ddPeAibe","output_index":0,"sequence_number":12} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":"40","item_id":"msg_0bda4590417bd1510169b30158beb0819f81fd20565650adb9","logprobs":[],"obfuscation":"YabRyTRDUYfx7d","output_index":0,"sequence_number":13} + data: {"type":"response.output_text.delta","content_index":0,"delta":"40","item_id":"msg_05bf401c6a96e8f8016a3c12022ee081919201ccebef2eac39","logprobs":[],"obfuscation":"SmTOJpoyV5dFjC","output_index":0,"sequence_number":13} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":"°C","item_id":"msg_0bda4590417bd1510169b30158beb0819f81fd20565650adb9","logprobs":[],"obfuscation":"gNlqwvjlaBVFK6","output_index":0,"sequence_number":14} + data: {"type":"response.output_text.delta","content_index":0,"delta":"°C","item_id":"msg_05bf401c6a96e8f8016a3c12022ee081919201ccebef2eac39","logprobs":[],"obfuscation":"NAQgt91rDKXNYA","output_index":0,"sequence_number":14} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":".","item_id":"msg_0bda4590417bd1510169b30158beb0819f81fd20565650adb9","logprobs":[],"obfuscation":"GDmzWwlC2CZkvF6","output_index":0,"sequence_number":15} + data: {"type":"response.output_text.delta","content_index":0,"delta":".","item_id":"msg_05bf401c6a96e8f8016a3c12022ee081919201ccebef2eac39","logprobs":[],"obfuscation":"P8UDsj1hyw4R7xv","output_index":0,"sequence_number":15} event: response.output_text.done - data: {"type":"response.output_text.done","content_index":0,"item_id":"msg_0bda4590417bd1510169b30158beb0819f81fd20565650adb9","logprobs":[],"output_index":0,"sequence_number":16,"text":"The current temperature in Florence, Italy is 40°C."} + data: {"type":"response.output_text.done","content_index":0,"item_id":"msg_05bf401c6a96e8f8016a3c12022ee081919201ccebef2eac39","logprobs":[],"output_index":0,"sequence_number":16,"text":"The current temperature in Florence, Italy is 40°C."} event: response.content_part.done - data: {"type":"response.content_part.done","content_index":0,"item_id":"msg_0bda4590417bd1510169b30158beb0819f81fd20565650adb9","output_index":0,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":"The current temperature in Florence, Italy is 40°C."},"sequence_number":17} + data: {"type":"response.content_part.done","content_index":0,"item_id":"msg_05bf401c6a96e8f8016a3c12022ee081919201ccebef2eac39","output_index":0,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":"The current temperature in Florence, Italy is 40°C."},"sequence_number":17} event: response.output_item.done - data: {"type":"response.output_item.done","item":{"id":"msg_0bda4590417bd1510169b30158beb0819f81fd20565650adb9","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"The current temperature in Florence, Italy is 40°C."}],"role":"assistant"},"output_index":0,"sequence_number":18} + data: {"type":"response.output_item.done","item":{"id":"msg_05bf401c6a96e8f8016a3c12022ee081919201ccebef2eac39","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"The current temperature in Florence, Italy is 40°C."}],"role":"assistant"},"output_index":0,"sequence_number":18} event: response.completed - data: {"type":"response.completed","response":{"id":"resp_0bda4590417bd1510169b301585a34819f9f99b79659a2484b","object":"response","created_at":1773338968,"status":"completed","background":false,"completed_at":1773338968,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-4o-2024-08-06","output":[{"id":"msg_0bda4590417bd1510169b30158beb0819f81fd20565650adb9","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"The current temperature in Florence, Italy is 40°C."}],"role":"assistant"}],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":null,"summary":null},"safety_identifier":null,"service_tier":"default","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":{"input_tokens":83,"input_tokens_details":{"cached_tokens":0},"output_tokens":14,"output_tokens_details":{"reasoning_tokens":0},"total_tokens":97},"user":null,"metadata":{}},"sequence_number":19} + data: {"type":"response.completed","response":{"id":"resp_05bf401c6a96e8f8016a3c12019e648191b854b80349a9aa8b","object":"response","created_at":1782321665,"status":"completed","background":false,"completed_at":1782321666,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-4o-2024-08-06","moderation":null,"output":[{"id":"msg_05bf401c6a96e8f8016a3c12022ee081919201ccebef2eac39","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"The current temperature in Florence, Italy is 40°C."}],"role":"assistant"}],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":null,"effort":null,"summary":null},"safety_identifier":null,"service_tier":"default","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":{"input_tokens":81,"input_tokens_details":{"cached_tokens":0},"output_tokens":14,"output_tokens_details":{"reasoning_tokens":0},"total_tokens":95},"user":null,"metadata":{}},"sequence_number":19} headers: Content-Type: - text/event-stream; charset=utf-8 status: 200 OK code: 200 - duration: 232.381833ms + duration: 409.353791ms diff --git a/providertests/testdata/TestOpenAIResponsesCommon/openai-gpt-5/multi_tool.yaml b/providertests/testdata/TestOpenAIResponsesCommon/openai-gpt-5/multi_tool.yaml index 5ac0d04ce..53365b140 100644 --- a/providertests/testdata/TestOpenAIResponsesCommon/openai-gpt-5/multi_tool.yaml +++ b/providertests/testdata/TestOpenAIResponsesCommon/openai-gpt-5/multi_tool.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://api.openai.com/v1/responses method: POST response: @@ -26,15 +26,15 @@ interactions: uncompressed: true body: |- { - "id": "resp_03b3c71eed97b5600169b3194dbf748191bbde243b0983aa49", + "id": "resp_0adb81d1c2f6e68a016a3c1227ce4881a1b92723de5486dbfe", "object": "response", - "created_at": 1773345101, + "created_at": 1782321703, "status": "completed", "background": false, "billing": { "payer": "developer" }, - "completed_at": 1773345112, + "completed_at": 1782321707, "error": null, "frequency_penalty": 0.0, "incomplete_details": null, @@ -42,26 +42,28 @@ interactions: "max_output_tokens": 4000, "max_tool_calls": null, "model": "gpt-5-2025-08-07", + "moderation": null, "output": [ { - "id": "rs_03b3c71eed97b5600169b3194e5d948191bebefe1e37f969d9", + "id": "rs_0adb81d1c2f6e68a016a3c12286a0081a184e1b23cca2ac02d", "type": "reasoning", + "content": [], "summary": [] }, { - "id": "fc_03b3c71eed97b5600169b3195844ac819186a843dc3f5705d0", + "id": "fc_0adb81d1c2f6e68a016a3c122b744481a197df0b5a6edff94b", "type": "function_call", "status": "completed", "arguments": "{\"a\":2,\"b\":3}", - "call_id": "call_SXMdSYIWhKweiIjoBRxUmzZw", + "call_id": "call_R52CnFTPli0v0yaGZbZYrvYA", "name": "add" }, { - "id": "fc_03b3c71eed97b5600169b3195844b881918850ccf6295b1358", + "id": "fc_0adb81d1c2f6e68a016a3c122b745481a195d1638a76603374", "type": "function_call", "status": "completed", "arguments": "{\"a\":2,\"b\":3}", - "call_id": "call_wBPb8fIvZKT8tHxONHfs6iqq", + "call_id": "call_J4euPJS0XQZ9P3dO4Y7sCUF7", "name": "multiply" } ], @@ -69,8 +71,9 @@ interactions: "presence_penalty": 0.0, "previous_response_id": null, "prompt_cache_key": null, - "prompt_cache_retention": null, + "prompt_cache_retention": "in_memory", "reasoning": { + "context": "current_turn", "effort": "medium", "summary": null }, @@ -141,11 +144,11 @@ interactions: "input_tokens_details": { "cached_tokens": 0 }, - "output_tokens": 482, + "output_tokens": 305, "output_tokens_details": { - "reasoning_tokens": 384 + "reasoning_tokens": 192 }, - "total_tokens": 595 + "total_tokens": 418 }, "user": null, "metadata": {} @@ -155,22 +158,22 @@ interactions: - application/json status: 200 OK code: 200 - duration: 11.724504125s + duration: 4.014900209s - id: 1 request: proto: HTTP/1.1 proto_major: 1 proto_minor: 1 - content_length: 1263 + content_length: 1239 host: "" - body: '{"max_output_tokens":4000,"store":false,"input":[{"content":"You are a helpful assistant. CRITICAL: Always use both add and multiply at the same time ALWAYS.","role":"developer"},{"content":[{"text":"Add and multiply the number 2 and 3","type":"input_text"}],"role":"user"},{"arguments":"\"{\\\"a\\\":2,\\\"b\\\":3}\"","call_id":"call_SXMdSYIWhKweiIjoBRxUmzZw","name":"add","type":"function_call"},{"arguments":"\"{\\\"a\\\":2,\\\"b\\\":3}\"","call_id":"call_wBPb8fIvZKT8tHxONHfs6iqq","name":"multiply","type":"function_call"},{"call_id":"call_SXMdSYIWhKweiIjoBRxUmzZw","output":"5","type":"function_call_output"},{"call_id":"call_wBPb8fIvZKT8tHxONHfs6iqq","output":"6","type":"function_call_output"}],"model":"gpt-5","tool_choice":"auto","tools":[{"strict":false,"parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"},"name":"add","description":"Add two numbers","type":"function"},{"strict":false,"parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"},"name":"multiply","description":"Multiply two numbers","type":"function"}]}' + body: '{"max_output_tokens":4000,"store":false,"input":[{"content":"You are a helpful assistant. CRITICAL: Always use both add and multiply at the same time ALWAYS.","role":"developer"},{"content":[{"text":"Add and multiply the number 2 and 3","type":"input_text"}],"role":"user"},{"arguments":"{\"a\":2,\"b\":3}","call_id":"call_R52CnFTPli0v0yaGZbZYrvYA","name":"add","type":"function_call"},{"arguments":"{\"a\":2,\"b\":3}","call_id":"call_J4euPJS0XQZ9P3dO4Y7sCUF7","name":"multiply","type":"function_call"},{"call_id":"call_R52CnFTPli0v0yaGZbZYrvYA","output":"5","type":"function_call_output"},{"call_id":"call_J4euPJS0XQZ9P3dO4Y7sCUF7","output":"6","type":"function_call_output"}],"model":"gpt-5","tool_choice":"auto","tools":[{"strict":false,"parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"},"name":"add","description":"Add two numbers","type":"function"},{"strict":false,"parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"},"name":"multiply","description":"Multiply two numbers","type":"function"}]}' headers: Accept: - application/json Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://api.openai.com/v1/responses method: POST response: @@ -181,15 +184,15 @@ interactions: uncompressed: true body: |- { - "id": "resp_090b2c2ec0612c180169b319590fc081979080b24b97425b44", + "id": "resp_0bdec949032fc441016a3c122bd45881a1989400cebff80a78", "object": "response", - "created_at": 1773345113, + "created_at": 1782321707, "status": "completed", "background": false, "billing": { "payer": "developer" }, - "completed_at": 1773345114, + "completed_at": 1782321708, "error": null, "frequency_penalty": 0.0, "incomplete_details": null, @@ -197,9 +200,10 @@ interactions: "max_output_tokens": 4000, "max_tool_calls": null, "model": "gpt-5-2025-08-07", + "moderation": null, "output": [ { - "id": "msg_090b2c2ec0612c180169b31959d5008197bc5cf5fcf895424d", + "id": "msg_0bdec949032fc441016a3c122c56f081a1a09e13fbe1654946", "type": "message", "status": "completed", "content": [ @@ -217,8 +221,9 @@ interactions: "presence_penalty": 0.0, "previous_response_id": null, "prompt_cache_key": null, - "prompt_cache_retention": null, + "prompt_cache_retention": "in_memory", "reasoning": { + "context": "current_turn", "effort": "medium", "summary": null }, @@ -285,7 +290,7 @@ interactions: "top_p": 1.0, "truncation": "disabled", "usage": { - "input_tokens": 173, + "input_tokens": 171, "input_tokens_details": { "cached_tokens": 0 }, @@ -293,7 +298,7 @@ interactions: "output_tokens_details": { "reasoning_tokens": 0 }, - "total_tokens": 202 + "total_tokens": 200 }, "user": null, "metadata": {} @@ -303,4 +308,4 @@ interactions: - application/json status: 200 OK code: 200 - duration: 2.080252208s + duration: 1.1300935s diff --git a/providertests/testdata/TestOpenAIResponsesCommon/openai-gpt-5/multi_tool_streaming.yaml b/providertests/testdata/TestOpenAIResponsesCommon/openai-gpt-5/multi_tool_streaming.yaml index 20340c3fe..8e40abdc1 100644 --- a/providertests/testdata/TestOpenAIResponsesCommon/openai-gpt-5/multi_tool_streaming.yaml +++ b/providertests/testdata/TestOpenAIResponsesCommon/openai-gpt-5/multi_tool_streaming.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://api.openai.com/v1/responses method: POST response: @@ -25,65 +25,65 @@ interactions: content_length: -1 body: |+ event: response.created - data: {"type":"response.created","response":{"id":"resp_07fb4e5ebba6750d0169b3195ab2b0819398ac0b66c9fc8101","object":"response","created_at":1773345114,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-5-2025-08-07","output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":"medium","summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Add two numbers","name":"add","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"},"strict":false},{"type":"function","description":"Multiply two numbers","name":"multiply","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":0} + data: {"type":"response.created","response":{"id":"resp_0a7836d50cf181dd016a3c122cf3b881a1947fb8d49897cfca","object":"response","created_at":1782321708,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-5-2025-08-07","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":"current_turn","effort":"medium","summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Add two numbers","name":"add","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"},"strict":false},{"type":"function","description":"Multiply two numbers","name":"multiply","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":0} event: response.in_progress - data: {"type":"response.in_progress","response":{"id":"resp_07fb4e5ebba6750d0169b3195ab2b0819398ac0b66c9fc8101","object":"response","created_at":1773345114,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-5-2025-08-07","output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":"medium","summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Add two numbers","name":"add","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"},"strict":false},{"type":"function","description":"Multiply two numbers","name":"multiply","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":1} + data: {"type":"response.in_progress","response":{"id":"resp_0a7836d50cf181dd016a3c122cf3b881a1947fb8d49897cfca","object":"response","created_at":1782321708,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-5-2025-08-07","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":"current_turn","effort":"medium","summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Add two numbers","name":"add","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"},"strict":false},{"type":"function","description":"Multiply two numbers","name":"multiply","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":1} event: response.output_item.added - data: {"type":"response.output_item.added","item":{"id":"rs_07fb4e5ebba6750d0169b3195b0f18819380aebb13fb8c7ee3","type":"reasoning","summary":[]},"output_index":0,"sequence_number":2} + data: {"type":"response.output_item.added","item":{"id":"rs_0a7836d50cf181dd016a3c122e5e1881a1b60647835c2c9ab0","type":"reasoning","content":[],"summary":[]},"output_index":0,"sequence_number":2} event: response.output_item.done - data: {"type":"response.output_item.done","item":{"id":"rs_07fb4e5ebba6750d0169b3195b0f18819380aebb13fb8c7ee3","type":"reasoning","summary":[]},"output_index":0,"sequence_number":3} + data: {"type":"response.output_item.done","item":{"id":"rs_0a7836d50cf181dd016a3c122e5e1881a1b60647835c2c9ab0","type":"reasoning","content":[],"summary":[]},"output_index":0,"sequence_number":3} event: response.output_item.added - data: {"type":"response.output_item.added","item":{"id":"fc_07fb4e5ebba6750d0169b3195fdfd08193a96806479caa4789","type":"function_call","status":"in_progress","arguments":"","call_id":"call_65v82QHWb1nih7p5BEVjf7lH","name":"add"},"output_index":1,"sequence_number":4} + data: {"type":"response.output_item.added","item":{"id":"fc_0a7836d50cf181dd016a3c12307fa481a1a06adb8b03345a43","type":"function_call","status":"in_progress","arguments":"","call_id":"call_inViAUr9eV0GDtyOywkCxp59","name":"add"},"output_index":1,"sequence_number":4} event: response.function_call_arguments.delta - data: {"type":"response.function_call_arguments.delta","delta":"{\"a\":2,\"b\":3}","item_id":"fc_07fb4e5ebba6750d0169b3195fdfd08193a96806479caa4789","obfuscation":"Rm5","output_index":1,"sequence_number":5} + data: {"type":"response.function_call_arguments.delta","delta":"{\"a\":2,\"b\":3}","item_id":"fc_0a7836d50cf181dd016a3c12307fa481a1a06adb8b03345a43","obfuscation":"kx8","output_index":1,"sequence_number":5} event: response.function_call_arguments.done - data: {"type":"response.function_call_arguments.done","arguments":"{\"a\":2,\"b\":3}","item_id":"fc_07fb4e5ebba6750d0169b3195fdfd08193a96806479caa4789","output_index":1,"sequence_number":6} + data: {"type":"response.function_call_arguments.done","arguments":"{\"a\":2,\"b\":3}","item_id":"fc_0a7836d50cf181dd016a3c12307fa481a1a06adb8b03345a43","output_index":1,"sequence_number":6} event: response.output_item.done - data: {"type":"response.output_item.done","item":{"id":"fc_07fb4e5ebba6750d0169b3195fdfd08193a96806479caa4789","type":"function_call","status":"completed","arguments":"{\"a\":2,\"b\":3}","call_id":"call_65v82QHWb1nih7p5BEVjf7lH","name":"add"},"output_index":1,"sequence_number":7} + data: {"type":"response.output_item.done","item":{"id":"fc_0a7836d50cf181dd016a3c12307fa481a1a06adb8b03345a43","type":"function_call","status":"completed","arguments":"{\"a\":2,\"b\":3}","call_id":"call_inViAUr9eV0GDtyOywkCxp59","name":"add"},"output_index":1,"sequence_number":7} event: response.output_item.added - data: {"type":"response.output_item.added","item":{"id":"fc_07fb4e5ebba6750d0169b3195fdfe0819385836af19a472dad","type":"function_call","status":"in_progress","arguments":"","call_id":"call_vkCUfawj1PRERWMvw5PKhoB9","name":"multiply"},"output_index":2,"sequence_number":8} + data: {"type":"response.output_item.added","item":{"id":"fc_0a7836d50cf181dd016a3c12307fc081a1affc9e4960f41492","type":"function_call","status":"in_progress","arguments":"","call_id":"call_Op66UUnzuOoKmgGeFJQJFTUY","name":"multiply"},"output_index":2,"sequence_number":8} event: response.function_call_arguments.delta - data: {"type":"response.function_call_arguments.delta","delta":"{\"a\":2,\"b\":3}","item_id":"fc_07fb4e5ebba6750d0169b3195fdfe0819385836af19a472dad","obfuscation":"iAz","output_index":2,"sequence_number":9} + data: {"type":"response.function_call_arguments.delta","delta":"{\"a\":2,\"b\":3}","item_id":"fc_0a7836d50cf181dd016a3c12307fc081a1affc9e4960f41492","obfuscation":"1WA","output_index":2,"sequence_number":9} event: response.function_call_arguments.done - data: {"type":"response.function_call_arguments.done","arguments":"{\"a\":2,\"b\":3}","item_id":"fc_07fb4e5ebba6750d0169b3195fdfe0819385836af19a472dad","output_index":2,"sequence_number":10} + data: {"type":"response.function_call_arguments.done","arguments":"{\"a\":2,\"b\":3}","item_id":"fc_0a7836d50cf181dd016a3c12307fc081a1affc9e4960f41492","output_index":2,"sequence_number":10} event: response.output_item.done - data: {"type":"response.output_item.done","item":{"id":"fc_07fb4e5ebba6750d0169b3195fdfe0819385836af19a472dad","type":"function_call","status":"completed","arguments":"{\"a\":2,\"b\":3}","call_id":"call_vkCUfawj1PRERWMvw5PKhoB9","name":"multiply"},"output_index":2,"sequence_number":11} + data: {"type":"response.output_item.done","item":{"id":"fc_0a7836d50cf181dd016a3c12307fc081a1affc9e4960f41492","type":"function_call","status":"completed","arguments":"{\"a\":2,\"b\":3}","call_id":"call_Op66UUnzuOoKmgGeFJQJFTUY","name":"multiply"},"output_index":2,"sequence_number":11} event: response.completed - data: {"type":"response.completed","response":{"id":"resp_07fb4e5ebba6750d0169b3195ab2b0819398ac0b66c9fc8101","object":"response","created_at":1773345114,"status":"completed","background":false,"completed_at":1773345119,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-5-2025-08-07","output":[{"id":"rs_07fb4e5ebba6750d0169b3195b0f18819380aebb13fb8c7ee3","type":"reasoning","summary":[]},{"id":"fc_07fb4e5ebba6750d0169b3195fdfd08193a96806479caa4789","type":"function_call","status":"completed","arguments":"{\"a\":2,\"b\":3}","call_id":"call_65v82QHWb1nih7p5BEVjf7lH","name":"add"},{"id":"fc_07fb4e5ebba6750d0169b3195fdfe0819385836af19a472dad","type":"function_call","status":"completed","arguments":"{\"a\":2,\"b\":3}","call_id":"call_vkCUfawj1PRERWMvw5PKhoB9","name":"multiply"}],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":"medium","summary":null},"safety_identifier":null,"service_tier":"default","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Add two numbers","name":"add","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"},"strict":false},{"type":"function","description":"Multiply two numbers","name":"multiply","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":{"input_tokens":109,"input_tokens_details":{"cached_tokens":0},"output_tokens":272,"output_tokens_details":{"reasoning_tokens":192},"total_tokens":381},"user":null,"metadata":{}},"sequence_number":12} + data: {"type":"response.completed","response":{"id":"resp_0a7836d50cf181dd016a3c122cf3b881a1947fb8d49897cfca","object":"response","created_at":1782321708,"status":"completed","background":false,"completed_at":1782321712,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-5-2025-08-07","moderation":null,"output":[{"id":"rs_0a7836d50cf181dd016a3c122e5e1881a1b60647835c2c9ab0","type":"reasoning","content":[],"summary":[]},{"id":"fc_0a7836d50cf181dd016a3c12307fa481a1a06adb8b03345a43","type":"function_call","status":"completed","arguments":"{\"a\":2,\"b\":3}","call_id":"call_inViAUr9eV0GDtyOywkCxp59","name":"add"},{"id":"fc_0a7836d50cf181dd016a3c12307fc081a1affc9e4960f41492","type":"function_call","status":"completed","arguments":"{\"a\":2,\"b\":3}","call_id":"call_Op66UUnzuOoKmgGeFJQJFTUY","name":"multiply"}],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":"current_turn","effort":"medium","summary":null},"safety_identifier":null,"service_tier":"default","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Add two numbers","name":"add","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"},"strict":false},{"type":"function","description":"Multiply two numbers","name":"multiply","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":{"input_tokens":109,"input_tokens_details":{"cached_tokens":0},"output_tokens":223,"output_tokens_details":{"reasoning_tokens":128},"total_tokens":332},"user":null,"metadata":{}},"sequence_number":12} headers: Content-Type: - text/event-stream; charset=utf-8 status: 200 OK code: 200 - duration: 258.1015ms + duration: 336.850875ms - id: 1 request: proto: HTTP/1.1 proto_major: 1 proto_minor: 1 - content_length: 1260 + content_length: 1236 host: "" - body: '{"max_output_tokens":4000,"store":false,"input":[{"content":"You are a helpful assistant. Always use both add and multiply at the same time.","role":"developer"},{"content":[{"text":"Add and multiply the number 2 and 3","type":"input_text"}],"role":"user"},{"arguments":"\"{\\\"a\\\":2,\\\"b\\\":3}\"","call_id":"call_65v82QHWb1nih7p5BEVjf7lH","name":"add","type":"function_call"},{"arguments":"\"{\\\"a\\\":2,\\\"b\\\":3}\"","call_id":"call_vkCUfawj1PRERWMvw5PKhoB9","name":"multiply","type":"function_call"},{"call_id":"call_65v82QHWb1nih7p5BEVjf7lH","output":"5","type":"function_call_output"},{"call_id":"call_vkCUfawj1PRERWMvw5PKhoB9","output":"6","type":"function_call_output"}],"model":"gpt-5","tool_choice":"auto","tools":[{"strict":false,"parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"},"name":"add","description":"Add two numbers","type":"function"},{"strict":false,"parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"},"name":"multiply","description":"Multiply two numbers","type":"function"}],"stream":true}' + body: '{"max_output_tokens":4000,"store":false,"input":[{"content":"You are a helpful assistant. Always use both add and multiply at the same time.","role":"developer"},{"content":[{"text":"Add and multiply the number 2 and 3","type":"input_text"}],"role":"user"},{"arguments":"{\"a\":2,\"b\":3}","call_id":"call_inViAUr9eV0GDtyOywkCxp59","name":"add","type":"function_call"},{"arguments":"{\"a\":2,\"b\":3}","call_id":"call_Op66UUnzuOoKmgGeFJQJFTUY","name":"multiply","type":"function_call"},{"call_id":"call_inViAUr9eV0GDtyOywkCxp59","output":"5","type":"function_call_output"},{"call_id":"call_Op66UUnzuOoKmgGeFJQJFTUY","output":"6","type":"function_call_output"}],"model":"gpt-5","tool_choice":"auto","tools":[{"strict":false,"parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"},"name":"add","description":"Add two numbers","type":"function"},{"strict":false,"parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"},"name":"multiply","description":"Multiply two numbers","type":"function"}],"stream":true}' headers: Accept: - application/json Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://api.openai.com/v1/responses method: POST response: @@ -93,68 +93,110 @@ interactions: content_length: -1 body: |+ event: response.created - data: {"type":"response.created","response":{"id":"resp_060c32d4ad52dd1b0169b319603c74819fba7d9eb0608667bf","object":"response","created_at":1773345120,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-5-2025-08-07","output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":"medium","summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Add two numbers","name":"add","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"},"strict":false},{"type":"function","description":"Multiply two numbers","name":"multiply","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":0} + data: {"type":"response.created","response":{"id":"resp_0dd65ac660ad00e6016a3c1230cfa4819eb070eaf590b21379","object":"response","created_at":1782321712,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-5-2025-08-07","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":"current_turn","effort":"medium","summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Add two numbers","name":"add","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"},"strict":false},{"type":"function","description":"Multiply two numbers","name":"multiply","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":0} event: response.in_progress - data: {"type":"response.in_progress","response":{"id":"resp_060c32d4ad52dd1b0169b319603c74819fba7d9eb0608667bf","object":"response","created_at":1773345120,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-5-2025-08-07","output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":"medium","summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Add two numbers","name":"add","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"},"strict":false},{"type":"function","description":"Multiply two numbers","name":"multiply","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":1} + data: {"type":"response.in_progress","response":{"id":"resp_0dd65ac660ad00e6016a3c1230cfa4819eb070eaf590b21379","object":"response","created_at":1782321712,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-5-2025-08-07","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":"current_turn","effort":"medium","summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Add two numbers","name":"add","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"},"strict":false},{"type":"function","description":"Multiply two numbers","name":"multiply","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":1} event: response.output_item.added - data: {"type":"response.output_item.added","item":{"id":"msg_060c32d4ad52dd1b0169b31960f1a8819fa607eb963e4b2b01","type":"message","status":"in_progress","content":[],"role":"assistant"},"output_index":0,"sequence_number":2} + data: {"type":"response.output_item.added","item":{"id":"msg_0dd65ac660ad00e6016a3c1231c5f0819eb6adc3d7b061a6f2","type":"message","status":"in_progress","content":[],"role":"assistant"},"output_index":0,"sequence_number":2} event: response.content_part.added - data: {"type":"response.content_part.added","content_index":0,"item_id":"msg_060c32d4ad52dd1b0169b31960f1a8819fa607eb963e4b2b01","output_index":0,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":""},"sequence_number":3} + data: {"type":"response.content_part.added","content_index":0,"item_id":"msg_0dd65ac660ad00e6016a3c1231c5f0819eb6adc3d7b061a6f2","output_index":0,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":""},"sequence_number":3} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":"Addition","item_id":"msg_060c32d4ad52dd1b0169b31960f1a8819fa607eb963e4b2b01","logprobs":[],"obfuscation":"vECP4wnX","output_index":0,"sequence_number":4} + data: {"type":"response.output_text.delta","content_index":0,"delta":"Results","item_id":"msg_0dd65ac660ad00e6016a3c1231c5f0819eb6adc3d7b061a6f2","logprobs":[],"obfuscation":"uP9kpCBEt","output_index":0,"sequence_number":4} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" result","item_id":"msg_060c32d4ad52dd1b0169b31960f1a8819fa607eb963e4b2b01","logprobs":[],"obfuscation":"DWVN7X0hy","output_index":0,"sequence_number":5} + data: {"type":"response.output_text.delta","content_index":0,"delta":":\n","item_id":"msg_0dd65ac660ad00e6016a3c1231c5f0819eb6adc3d7b061a6f2","logprobs":[],"obfuscation":"C4RxRmS6VECDeh","output_index":0,"sequence_number":5} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":":","item_id":"msg_060c32d4ad52dd1b0169b31960f1a8819fa607eb963e4b2b01","logprobs":[],"obfuscation":"lmi55AuYocEnr7a","output_index":0,"sequence_number":6} + data: {"type":"response.output_text.delta","content_index":0,"delta":"-","item_id":"msg_0dd65ac660ad00e6016a3c1231c5f0819eb6adc3d7b061a6f2","logprobs":[],"obfuscation":"7qNm5YEQa10xUaC","output_index":0,"sequence_number":6} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" ","item_id":"msg_060c32d4ad52dd1b0169b31960f1a8819fa607eb963e4b2b01","logprobs":[],"obfuscation":"yMned8Cq9YnQpOq","output_index":0,"sequence_number":7} + data: {"type":"response.output_text.delta","content_index":0,"delta":" Addition","item_id":"msg_0dd65ac660ad00e6016a3c1231c5f0819eb6adc3d7b061a6f2","logprobs":[],"obfuscation":"LHof7Fp","output_index":0,"sequence_number":7} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":"5","item_id":"msg_060c32d4ad52dd1b0169b31960f1a8819fa607eb963e4b2b01","logprobs":[],"obfuscation":"3rDBo7AQjM3kcoe","output_index":0,"sequence_number":8} + data: {"type":"response.output_text.delta","content_index":0,"delta":" (","item_id":"msg_0dd65ac660ad00e6016a3c1231c5f0819eb6adc3d7b061a6f2","logprobs":[],"obfuscation":"1lz7C1487Dz8bq","output_index":0,"sequence_number":8} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":"\n","item_id":"msg_060c32d4ad52dd1b0169b31960f1a8819fa607eb963e4b2b01","logprobs":[],"obfuscation":"911PdPNTDmw3zgS","output_index":0,"sequence_number":9} + data: {"type":"response.output_text.delta","content_index":0,"delta":"2","item_id":"msg_0dd65ac660ad00e6016a3c1231c5f0819eb6adc3d7b061a6f2","logprobs":[],"obfuscation":"S0JE8tcOZtjNFP1","output_index":0,"sequence_number":9} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":"Multip","item_id":"msg_060c32d4ad52dd1b0169b31960f1a8819fa607eb963e4b2b01","logprobs":[],"obfuscation":"nsz8t1oBSB","output_index":0,"sequence_number":10} + data: {"type":"response.output_text.delta","content_index":0,"delta":" +","item_id":"msg_0dd65ac660ad00e6016a3c1231c5f0819eb6adc3d7b061a6f2","logprobs":[],"obfuscation":"9roq6jcMhGqARz","output_index":0,"sequence_number":10} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":"lication","item_id":"msg_060c32d4ad52dd1b0169b31960f1a8819fa607eb963e4b2b01","logprobs":[],"obfuscation":"qBMKXuX3","output_index":0,"sequence_number":11} + data: {"type":"response.output_text.delta","content_index":0,"delta":" ","item_id":"msg_0dd65ac660ad00e6016a3c1231c5f0819eb6adc3d7b061a6f2","logprobs":[],"obfuscation":"AYYNd53P82j64OV","output_index":0,"sequence_number":11} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" result","item_id":"msg_060c32d4ad52dd1b0169b31960f1a8819fa607eb963e4b2b01","logprobs":[],"obfuscation":"i16z2RxV4","output_index":0,"sequence_number":12} + data: {"type":"response.output_text.delta","content_index":0,"delta":"3","item_id":"msg_0dd65ac660ad00e6016a3c1231c5f0819eb6adc3d7b061a6f2","logprobs":[],"obfuscation":"43GniGedPkKX9fl","output_index":0,"sequence_number":12} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":":","item_id":"msg_060c32d4ad52dd1b0169b31960f1a8819fa607eb963e4b2b01","logprobs":[],"obfuscation":"n3Nf4afxOCFpEmF","output_index":0,"sequence_number":13} + data: {"type":"response.output_text.delta","content_index":0,"delta":")","item_id":"msg_0dd65ac660ad00e6016a3c1231c5f0819eb6adc3d7b061a6f2","logprobs":[],"obfuscation":"ar6KQe9YmBVrRX2","output_index":0,"sequence_number":13} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" ","item_id":"msg_060c32d4ad52dd1b0169b31960f1a8819fa607eb963e4b2b01","logprobs":[],"obfuscation":"WLV0YdqLA3iiuwh","output_index":0,"sequence_number":14} + data: {"type":"response.output_text.delta","content_index":0,"delta":" =","item_id":"msg_0dd65ac660ad00e6016a3c1231c5f0819eb6adc3d7b061a6f2","logprobs":[],"obfuscation":"5y6vE0B4koE0TQ","output_index":0,"sequence_number":14} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":"6","item_id":"msg_060c32d4ad52dd1b0169b31960f1a8819fa607eb963e4b2b01","logprobs":[],"obfuscation":"mgFwGkBtk9ZLQJ8","output_index":0,"sequence_number":15} + data: {"type":"response.output_text.delta","content_index":0,"delta":" ","item_id":"msg_0dd65ac660ad00e6016a3c1231c5f0819eb6adc3d7b061a6f2","logprobs":[],"obfuscation":"4xivlekwnkTANmg","output_index":0,"sequence_number":15} + + event: response.output_text.delta + data: {"type":"response.output_text.delta","content_index":0,"delta":"5","item_id":"msg_0dd65ac660ad00e6016a3c1231c5f0819eb6adc3d7b061a6f2","logprobs":[],"obfuscation":"7EKOsSbIhBrrxbZ","output_index":0,"sequence_number":16} + + event: response.output_text.delta + data: {"type":"response.output_text.delta","content_index":0,"delta":"\n","item_id":"msg_0dd65ac660ad00e6016a3c1231c5f0819eb6adc3d7b061a6f2","logprobs":[],"obfuscation":"QbkyuVScEad5FqT","output_index":0,"sequence_number":17} + + event: response.output_text.delta + data: {"type":"response.output_text.delta","content_index":0,"delta":"-","item_id":"msg_0dd65ac660ad00e6016a3c1231c5f0819eb6adc3d7b061a6f2","logprobs":[],"obfuscation":"E3O8OJ2qenhUfnJ","output_index":0,"sequence_number":18} + + event: response.output_text.delta + data: {"type":"response.output_text.delta","content_index":0,"delta":" Multip","item_id":"msg_0dd65ac660ad00e6016a3c1231c5f0819eb6adc3d7b061a6f2","logprobs":[],"obfuscation":"LGXs3imvR","output_index":0,"sequence_number":19} + + event: response.output_text.delta + data: {"type":"response.output_text.delta","content_index":0,"delta":"lication","item_id":"msg_0dd65ac660ad00e6016a3c1231c5f0819eb6adc3d7b061a6f2","logprobs":[],"obfuscation":"xOA6PJZg","output_index":0,"sequence_number":20} + + event: response.output_text.delta + data: {"type":"response.output_text.delta","content_index":0,"delta":" (","item_id":"msg_0dd65ac660ad00e6016a3c1231c5f0819eb6adc3d7b061a6f2","logprobs":[],"obfuscation":"tBSlbg2OnagBBA","output_index":0,"sequence_number":21} + + event: response.output_text.delta + data: {"type":"response.output_text.delta","content_index":0,"delta":"2","item_id":"msg_0dd65ac660ad00e6016a3c1231c5f0819eb6adc3d7b061a6f2","logprobs":[],"obfuscation":"aTJCAoIstKHZXlp","output_index":0,"sequence_number":22} + + event: response.output_text.delta + data: {"type":"response.output_text.delta","content_index":0,"delta":" ×","item_id":"msg_0dd65ac660ad00e6016a3c1231c5f0819eb6adc3d7b061a6f2","logprobs":[],"obfuscation":"oXQ0UOXet366rT","output_index":0,"sequence_number":23} + + event: response.output_text.delta + data: {"type":"response.output_text.delta","content_index":0,"delta":" ","item_id":"msg_0dd65ac660ad00e6016a3c1231c5f0819eb6adc3d7b061a6f2","logprobs":[],"obfuscation":"6hYVvg1kJxu4tuH","output_index":0,"sequence_number":24} + + event: response.output_text.delta + data: {"type":"response.output_text.delta","content_index":0,"delta":"3","item_id":"msg_0dd65ac660ad00e6016a3c1231c5f0819eb6adc3d7b061a6f2","logprobs":[],"obfuscation":"7S72LIKAvktp0L4","output_index":0,"sequence_number":25} + + event: response.output_text.delta + data: {"type":"response.output_text.delta","content_index":0,"delta":")","item_id":"msg_0dd65ac660ad00e6016a3c1231c5f0819eb6adc3d7b061a6f2","logprobs":[],"obfuscation":"Dnlzs1giZqPlUex","output_index":0,"sequence_number":26} + + event: response.output_text.delta + data: {"type":"response.output_text.delta","content_index":0,"delta":" =","item_id":"msg_0dd65ac660ad00e6016a3c1231c5f0819eb6adc3d7b061a6f2","logprobs":[],"obfuscation":"hYjpBkmlI6BGtf","output_index":0,"sequence_number":27} + + event: response.output_text.delta + data: {"type":"response.output_text.delta","content_index":0,"delta":" ","item_id":"msg_0dd65ac660ad00e6016a3c1231c5f0819eb6adc3d7b061a6f2","logprobs":[],"obfuscation":"mbGLrvG7FnWQ4Ch","output_index":0,"sequence_number":28} + + event: response.output_text.delta + data: {"type":"response.output_text.delta","content_index":0,"delta":"6","item_id":"msg_0dd65ac660ad00e6016a3c1231c5f0819eb6adc3d7b061a6f2","logprobs":[],"obfuscation":"85fESIZsemOMpSu","output_index":0,"sequence_number":29} event: response.output_text.done - data: {"type":"response.output_text.done","content_index":0,"item_id":"msg_060c32d4ad52dd1b0169b31960f1a8819fa607eb963e4b2b01","logprobs":[],"output_index":0,"sequence_number":16,"text":"Addition result: 5\nMultiplication result: 6"} + data: {"type":"response.output_text.done","content_index":0,"item_id":"msg_0dd65ac660ad00e6016a3c1231c5f0819eb6adc3d7b061a6f2","logprobs":[],"output_index":0,"sequence_number":30,"text":"Results:\n- Addition (2 + 3) = 5\n- Multiplication (2 × 3) = 6"} event: response.content_part.done - data: {"type":"response.content_part.done","content_index":0,"item_id":"msg_060c32d4ad52dd1b0169b31960f1a8819fa607eb963e4b2b01","output_index":0,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":"Addition result: 5\nMultiplication result: 6"},"sequence_number":17} + data: {"type":"response.content_part.done","content_index":0,"item_id":"msg_0dd65ac660ad00e6016a3c1231c5f0819eb6adc3d7b061a6f2","output_index":0,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":"Results:\n- Addition (2 + 3) = 5\n- Multiplication (2 × 3) = 6"},"sequence_number":31} event: response.output_item.done - data: {"type":"response.output_item.done","item":{"id":"msg_060c32d4ad52dd1b0169b31960f1a8819fa607eb963e4b2b01","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"Addition result: 5\nMultiplication result: 6"}],"role":"assistant"},"output_index":0,"sequence_number":18} + data: {"type":"response.output_item.done","item":{"id":"msg_0dd65ac660ad00e6016a3c1231c5f0819eb6adc3d7b061a6f2","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"Results:\n- Addition (2 + 3) = 5\n- Multiplication (2 × 3) = 6"}],"role":"assistant"},"output_index":0,"sequence_number":32} event: response.completed - data: {"type":"response.completed","response":{"id":"resp_060c32d4ad52dd1b0169b319603c74819fba7d9eb0608667bf","object":"response","created_at":1773345120,"status":"completed","background":false,"completed_at":1773345121,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-5-2025-08-07","output":[{"id":"msg_060c32d4ad52dd1b0169b31960f1a8819fa607eb963e4b2b01","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"Addition result: 5\nMultiplication result: 6"}],"role":"assistant"}],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":"medium","summary":null},"safety_identifier":null,"service_tier":"default","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Add two numbers","name":"add","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"},"strict":false},{"type":"function","description":"Multiply two numbers","name":"multiply","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":{"input_tokens":169,"input_tokens_details":{"cached_tokens":0},"output_tokens":16,"output_tokens_details":{"reasoning_tokens":0},"total_tokens":185},"user":null,"metadata":{}},"sequence_number":19} + data: {"type":"response.completed","response":{"id":"resp_0dd65ac660ad00e6016a3c1230cfa4819eb070eaf590b21379","object":"response","created_at":1782321712,"status":"completed","background":false,"completed_at":1782321714,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-5-2025-08-07","moderation":null,"output":[{"id":"msg_0dd65ac660ad00e6016a3c1231c5f0819eb6adc3d7b061a6f2","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"Results:\n- Addition (2 + 3) = 5\n- Multiplication (2 × 3) = 6"}],"role":"assistant"}],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":"current_turn","effort":"medium","summary":null},"safety_identifier":null,"service_tier":"default","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Add two numbers","name":"add","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"},"strict":false},{"type":"function","description":"Multiply two numbers","name":"multiply","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":{"input_tokens":167,"input_tokens_details":{"cached_tokens":0},"output_tokens":30,"output_tokens_details":{"reasoning_tokens":0},"total_tokens":197},"user":null,"metadata":{}},"sequence_number":33} headers: Content-Type: - text/event-stream; charset=utf-8 status: 200 OK code: 200 - duration: 238.775459ms + duration: 439.065292ms diff --git a/providertests/testdata/TestOpenAIResponsesCommon/openai-gpt-5/simple.yaml b/providertests/testdata/TestOpenAIResponsesCommon/openai-gpt-5/simple.yaml index bd9e8af67..42c47014e 100644 --- a/providertests/testdata/TestOpenAIResponsesCommon/openai-gpt-5/simple.yaml +++ b/providertests/testdata/TestOpenAIResponsesCommon/openai-gpt-5/simple.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://api.openai.com/v1/responses method: POST response: @@ -26,15 +26,15 @@ interactions: uncompressed: true body: |- { - "id": "resp_02024dfc5f4dacc80169b319301db4819587c30653126df754", + "id": "resp_0320e3f50879ffd0016a3c1217824881a09817355d0690c260", "object": "response", - "created_at": 1773345072, + "created_at": 1782321687, "status": "completed", "background": false, "billing": { "payer": "developer" }, - "completed_at": 1773345074, + "completed_at": 1782321689, "error": null, "frequency_penalty": 0.0, "incomplete_details": null, @@ -42,14 +42,16 @@ interactions: "max_output_tokens": 4000, "max_tool_calls": null, "model": "gpt-5-2025-08-07", + "moderation": null, "output": [ { - "id": "rs_02024dfc5f4dacc80169b319307bc4819588310448b323625a", + "id": "rs_0320e3f50879ffd0016a3c1217f90c81a0bf64cc451638f3e6", "type": "reasoning", + "content": [], "summary": [] }, { - "id": "msg_02024dfc5f4dacc80169b319326820819584d998f22e95c207", + "id": "msg_0320e3f50879ffd0016a3c1218fb1881a0881b261ab719bafa", "type": "message", "status": "completed", "content": [ @@ -67,8 +69,9 @@ interactions: "presence_penalty": 0.0, "previous_response_id": null, "prompt_cache_key": null, - "prompt_cache_retention": null, + "prompt_cache_retention": "in_memory", "reasoning": { + "context": "current_turn", "effort": "medium", "summary": null }, @@ -92,11 +95,11 @@ interactions: "input_tokens_details": { "cached_tokens": 0 }, - "output_tokens": 116, + "output_tokens": 86, "output_tokens_details": { "reasoning_tokens": 64 }, - "total_tokens": 135 + "total_tokens": 105 }, "user": null, "metadata": {} @@ -106,4 +109,4 @@ interactions: - application/json status: 200 OK code: 200 - duration: 2.786829208s + duration: 1.9655875s diff --git a/providertests/testdata/TestOpenAIResponsesCommon/openai-gpt-5/simple_streaming.yaml b/providertests/testdata/TestOpenAIResponsesCommon/openai-gpt-5/simple_streaming.yaml index 3c2ac5848..0ece3fb9a 100644 --- a/providertests/testdata/TestOpenAIResponsesCommon/openai-gpt-5/simple_streaming.yaml +++ b/providertests/testdata/TestOpenAIResponsesCommon/openai-gpt-5/simple_streaming.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://api.openai.com/v1/responses method: POST response: @@ -25,44 +25,44 @@ interactions: content_length: -1 body: |+ event: response.created - data: {"type":"response.created","response":{"id":"resp_0c8a85042b7cd7a50169b31933ad68819fac3a7136b8acfe2e","object":"response","created_at":1773345075,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-5-2025-08-07","output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":"medium","summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":0} + data: {"type":"response.created","response":{"id":"resp_0f80f320b6d3bc2b016a3c121983f08192898904ff92319f9f","object":"response","created_at":1782321689,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-5-2025-08-07","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":"current_turn","effort":"medium","summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":0} event: response.in_progress - data: {"type":"response.in_progress","response":{"id":"resp_0c8a85042b7cd7a50169b31933ad68819fac3a7136b8acfe2e","object":"response","created_at":1773345075,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-5-2025-08-07","output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":"medium","summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":1} + data: {"type":"response.in_progress","response":{"id":"resp_0f80f320b6d3bc2b016a3c121983f08192898904ff92319f9f","object":"response","created_at":1782321689,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-5-2025-08-07","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":"current_turn","effort":"medium","summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":1} event: response.output_item.added - data: {"type":"response.output_item.added","item":{"id":"rs_0c8a85042b7cd7a50169b319343c24819fb2e79948660b3840","type":"reasoning","summary":[]},"output_index":0,"sequence_number":2} + data: {"type":"response.output_item.added","item":{"id":"rs_0f80f320b6d3bc2b016a3c121a0ae4819292601257c72b5d09","type":"reasoning","content":[],"summary":[]},"output_index":0,"sequence_number":2} event: response.output_item.done - data: {"type":"response.output_item.done","item":{"id":"rs_0c8a85042b7cd7a50169b319343c24819fb2e79948660b3840","type":"reasoning","summary":[]},"output_index":0,"sequence_number":3} + data: {"type":"response.output_item.done","item":{"id":"rs_0f80f320b6d3bc2b016a3c121a0ae4819292601257c72b5d09","type":"reasoning","content":[],"summary":[]},"output_index":0,"sequence_number":3} event: response.output_item.added - data: {"type":"response.output_item.added","item":{"id":"msg_0c8a85042b7cd7a50169b3193618a4819fa1f11af9a7d23d05","type":"message","status":"in_progress","content":[],"role":"assistant"},"output_index":1,"sequence_number":4} + data: {"type":"response.output_item.added","item":{"id":"msg_0f80f320b6d3bc2b016a3c121b2bf481929859fbd5c84b5199","type":"message","status":"in_progress","content":[],"role":"assistant"},"output_index":1,"sequence_number":4} event: response.content_part.added - data: {"type":"response.content_part.added","content_index":0,"item_id":"msg_0c8a85042b7cd7a50169b3193618a4819fa1f11af9a7d23d05","output_index":1,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":""},"sequence_number":5} + data: {"type":"response.content_part.added","content_index":0,"item_id":"msg_0f80f320b6d3bc2b016a3c121b2bf481929859fbd5c84b5199","output_index":1,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":""},"sequence_number":5} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":"Olá","item_id":"msg_0c8a85042b7cd7a50169b3193618a4819fa1f11af9a7d23d05","logprobs":[],"obfuscation":"5GPWRLF7QowPE","output_index":1,"sequence_number":6} + data: {"type":"response.output_text.delta","content_index":0,"delta":"Oi","item_id":"msg_0f80f320b6d3bc2b016a3c121b2bf481929859fbd5c84b5199","logprobs":[],"obfuscation":"jiWK3iiUKcoCjS","output_index":1,"sequence_number":6} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":"!","item_id":"msg_0c8a85042b7cd7a50169b3193618a4819fa1f11af9a7d23d05","logprobs":[],"obfuscation":"vv6Zxt2DFTNY9Tz","output_index":1,"sequence_number":7} + data: {"type":"response.output_text.delta","content_index":0,"delta":"!","item_id":"msg_0f80f320b6d3bc2b016a3c121b2bf481929859fbd5c84b5199","logprobs":[],"obfuscation":"KEwvbZ8DkmOMJkB","output_index":1,"sequence_number":7} event: response.output_text.done - data: {"type":"response.output_text.done","content_index":0,"item_id":"msg_0c8a85042b7cd7a50169b3193618a4819fa1f11af9a7d23d05","logprobs":[],"output_index":1,"sequence_number":8,"text":"Olá!"} + data: {"type":"response.output_text.done","content_index":0,"item_id":"msg_0f80f320b6d3bc2b016a3c121b2bf481929859fbd5c84b5199","logprobs":[],"output_index":1,"sequence_number":8,"text":"Oi!"} event: response.content_part.done - data: {"type":"response.content_part.done","content_index":0,"item_id":"msg_0c8a85042b7cd7a50169b3193618a4819fa1f11af9a7d23d05","output_index":1,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":"Olá!"},"sequence_number":9} + data: {"type":"response.content_part.done","content_index":0,"item_id":"msg_0f80f320b6d3bc2b016a3c121b2bf481929859fbd5c84b5199","output_index":1,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":"Oi!"},"sequence_number":9} event: response.output_item.done - data: {"type":"response.output_item.done","item":{"id":"msg_0c8a85042b7cd7a50169b3193618a4819fa1f11af9a7d23d05","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"Olá!"}],"role":"assistant"},"output_index":1,"sequence_number":10} + data: {"type":"response.output_item.done","item":{"id":"msg_0f80f320b6d3bc2b016a3c121b2bf481929859fbd5c84b5199","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"Oi!"}],"role":"assistant"},"output_index":1,"sequence_number":10} event: response.completed - data: {"type":"response.completed","response":{"id":"resp_0c8a85042b7cd7a50169b31933ad68819fac3a7136b8acfe2e","object":"response","created_at":1773345075,"status":"completed","background":false,"completed_at":1773345078,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-5-2025-08-07","output":[{"id":"rs_0c8a85042b7cd7a50169b319343c24819fb2e79948660b3840","type":"reasoning","summary":[]},{"id":"msg_0c8a85042b7cd7a50169b3193618a4819fa1f11af9a7d23d05","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"Olá!"}],"role":"assistant"}],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":"medium","summary":null},"safety_identifier":null,"service_tier":"default","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":{"input_tokens":19,"input_tokens_details":{"cached_tokens":0},"output_tokens":108,"output_tokens_details":{"reasoning_tokens":64},"total_tokens":127},"user":null,"metadata":{}},"sequence_number":11} + data: {"type":"response.completed","response":{"id":"resp_0f80f320b6d3bc2b016a3c121983f08192898904ff92319f9f","object":"response","created_at":1782321689,"status":"completed","background":false,"completed_at":1782321691,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-5-2025-08-07","moderation":null,"output":[{"id":"rs_0f80f320b6d3bc2b016a3c121a0ae4819292601257c72b5d09","type":"reasoning","content":[],"summary":[]},{"id":"msg_0f80f320b6d3bc2b016a3c121b2bf481929859fbd5c84b5199","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"Oi!"}],"role":"assistant"}],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":"current_turn","effort":"medium","summary":null},"safety_identifier":null,"service_tier":"default","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":{"input_tokens":19,"input_tokens_details":{"cached_tokens":0},"output_tokens":118,"output_tokens_details":{"reasoning_tokens":64},"total_tokens":137},"user":null,"metadata":{}},"sequence_number":11} headers: Content-Type: - text/event-stream; charset=utf-8 status: 200 OK code: 200 - duration: 1.019619708s + duration: 518.473125ms diff --git a/providertests/testdata/TestOpenAIResponsesCommon/openai-gpt-5/tool.yaml b/providertests/testdata/TestOpenAIResponsesCommon/openai-gpt-5/tool.yaml index f1501d50c..5f0108eec 100644 --- a/providertests/testdata/TestOpenAIResponsesCommon/openai-gpt-5/tool.yaml +++ b/providertests/testdata/TestOpenAIResponsesCommon/openai-gpt-5/tool.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://api.openai.com/v1/responses method: POST response: @@ -26,15 +26,15 @@ interactions: uncompressed: true body: |- { - "id": "resp_07acbe0aaedca68d0169b319365d8481969b62465aff0f7bc8", + "id": "resp_02e6812e3c7ddb29016a3c121b7cc48192bd8125185d555837", "object": "response", - "created_at": 1773345078, + "created_at": 1782321691, "status": "completed", "background": false, "billing": { "payer": "developer" }, - "completed_at": 1773345080, + "completed_at": 1782321693, "error": null, "frequency_penalty": 0.0, "incomplete_details": null, @@ -42,18 +42,20 @@ interactions: "max_output_tokens": 4000, "max_tool_calls": null, "model": "gpt-5-2025-08-07", + "moderation": null, "output": [ { - "id": "rs_07acbe0aaedca68d0169b31936b8c4819680474c33b1cd2067", + "id": "rs_02e6812e3c7ddb29016a3c121be1a8819287150d83b7163106", "type": "reasoning", + "content": [], "summary": [] }, { - "id": "fc_07acbe0aaedca68d0169b31937d54081968957c8161482d509", + "id": "fc_02e6812e3c7ddb29016a3c121d5be8819287115edcebcdb7ce", "type": "function_call", "status": "completed", "arguments": "{\"location\":\"Florence, Italy\"}", - "call_id": "call_d2Jw9Yi3xW2waCu4FfmMPBEn", + "call_id": "call_ves1YcSxZVxr4IGeGzt3Hn6u", "name": "weather" } ], @@ -61,8 +63,9 @@ interactions: "presence_penalty": 0.0, "previous_response_id": null, "prompt_cache_key": null, - "prompt_cache_retention": null, + "prompt_cache_retention": "in_memory", "reasoning": { + "context": "current_turn", "effort": "medium", "summary": null }, @@ -105,11 +108,11 @@ interactions: "input_tokens_details": { "cached_tokens": 0 }, - "output_tokens": 93, + "output_tokens": 132, "output_tokens_details": { "reasoning_tokens": 64 }, - "total_tokens": 156 + "total_tokens": 195 }, "user": null, "metadata": {} @@ -119,22 +122,22 @@ interactions: - application/json status: 200 OK code: 200 - duration: 2.367363417s + duration: 2.46458975s - id: 1 request: proto: HTTP/1.1 proto_major: 1 proto_minor: 1 - content_length: 721 + content_length: 709 host: "" - body: '{"max_output_tokens":4000,"store":false,"input":[{"content":"You are a helpful assistant","role":"developer"},{"content":[{"text":"What''s the weather in Florence,Italy?","type":"input_text"}],"role":"user"},{"arguments":"\"{\\\"location\\\":\\\"Florence, Italy\\\"}\"","call_id":"call_d2Jw9Yi3xW2waCu4FfmMPBEn","name":"weather","type":"function_call"},{"call_id":"call_d2Jw9Yi3xW2waCu4FfmMPBEn","output":"40 C","type":"function_call_output"}],"model":"gpt-5","tool_choice":"auto","tools":[{"strict":false,"parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"name":"weather","description":"Get weather information for a location","type":"function"}]}' + body: '{"max_output_tokens":4000,"store":false,"input":[{"content":"You are a helpful assistant","role":"developer"},{"content":[{"text":"What''s the weather in Florence,Italy?","type":"input_text"}],"role":"user"},{"arguments":"{\"location\":\"Florence, Italy\"}","call_id":"call_ves1YcSxZVxr4IGeGzt3Hn6u","name":"weather","type":"function_call"},{"call_id":"call_ves1YcSxZVxr4IGeGzt3Hn6u","output":"40 C","type":"function_call_output"}],"model":"gpt-5","tool_choice":"auto","tools":[{"strict":false,"parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"name":"weather","description":"Get weather information for a location","type":"function"}]}' headers: Accept: - application/json Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://api.openai.com/v1/responses method: POST response: @@ -145,15 +148,15 @@ interactions: uncompressed: true body: |- { - "id": "resp_03d61eab4560a2c00169b3193990088194a38da4e4ddb306ec", + "id": "resp_01417dd5017b29b4016a3c121df43481a1a970a2ce66b3de22", "object": "response", - "created_at": 1773345081, + "created_at": 1782321693, "status": "completed", "background": false, "billing": { "payer": "developer" }, - "completed_at": 1773345090, + "completed_at": 1782321697, "error": null, "frequency_penalty": 0.0, "incomplete_details": null, @@ -161,14 +164,16 @@ interactions: "max_output_tokens": 4000, "max_tool_calls": null, "model": "gpt-5-2025-08-07", + "moderation": null, "output": [ { - "id": "rs_03d61eab4560a2c00169b3193a33388194b4ac06cdbd59dbea", + "id": "rs_01417dd5017b29b4016a3c121e635481a1855d8f0c57044cbd", "type": "reasoning", + "content": [], "summary": [] }, { - "id": "msg_03d61eab4560a2c00169b31941cad881948f488c681492f5d6", + "id": "msg_01417dd5017b29b4016a3c122197c081a1b71206bc7990a4fd", "type": "message", "status": "completed", "content": [ @@ -176,7 +181,7 @@ interactions: "type": "output_text", "annotations": [], "logprobs": [], - "text": "It\u2019s currently about 40\u00b0C (104\u00b0F) in Florence, Italy." + "text": "The current temperature in Florence, Italy is about 40\u00b0C (104\u00b0F)." } ], "role": "assistant" @@ -186,8 +191,9 @@ interactions: "presence_penalty": 0.0, "previous_response_id": null, "prompt_cache_key": null, - "prompt_cache_retention": null, + "prompt_cache_retention": "in_memory", "reasoning": { + "context": "current_turn", "effort": "medium", "summary": null }, @@ -226,15 +232,15 @@ interactions: "top_p": 1.0, "truncation": "disabled", "usage": { - "input_tokens": 94, + "input_tokens": 92, "input_tokens_details": { "cached_tokens": 0 }, - "output_tokens": 219, + "output_tokens": 241, "output_tokens_details": { "reasoning_tokens": 192 }, - "total_tokens": 313 + "total_tokens": 333 }, "user": null, "metadata": {} @@ -244,4 +250,4 @@ interactions: - application/json status: 200 OK code: 200 - duration: 10.431176s + duration: 4.184959375s diff --git a/providertests/testdata/TestOpenAIResponsesCommon/openai-gpt-5/tool_streaming.yaml b/providertests/testdata/TestOpenAIResponsesCommon/openai-gpt-5/tool_streaming.yaml index d514ff563..cd76edfe1 100644 --- a/providertests/testdata/TestOpenAIResponsesCommon/openai-gpt-5/tool_streaming.yaml +++ b/providertests/testdata/TestOpenAIResponsesCommon/openai-gpt-5/tool_streaming.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://api.openai.com/v1/responses method: POST response: @@ -25,74 +25,74 @@ interactions: content_length: -1 body: |+ event: response.created - data: {"type":"response.created","response":{"id":"resp_0482d9f8acdf0e0d0169b319432fa481948bdc7df374b5e464","object":"response","created_at":1773345091,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-5-2025-08-07","output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":"medium","summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":0} + data: {"type":"response.created","response":{"id":"resp_0967f4efea4061d0016a3c122223dc81a08195678f441ec027","object":"response","created_at":1782321698,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-5-2025-08-07","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":"current_turn","effort":"medium","summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":0} event: response.in_progress - data: {"type":"response.in_progress","response":{"id":"resp_0482d9f8acdf0e0d0169b319432fa481948bdc7df374b5e464","object":"response","created_at":1773345091,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-5-2025-08-07","output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":"medium","summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":1} + data: {"type":"response.in_progress","response":{"id":"resp_0967f4efea4061d0016a3c122223dc81a08195678f441ec027","object":"response","created_at":1782321698,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-5-2025-08-07","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":"current_turn","effort":"medium","summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":1} event: response.output_item.added - data: {"type":"response.output_item.added","item":{"id":"rs_0482d9f8acdf0e0d0169b319438b988194b48fd3d175a69307","type":"reasoning","summary":[]},"output_index":0,"sequence_number":2} + data: {"type":"response.output_item.added","item":{"id":"rs_0967f4efea4061d0016a3c122284b881a0ba3b13e24047d7ce","type":"reasoning","content":[],"summary":[]},"output_index":0,"sequence_number":2} event: response.output_item.done - data: {"type":"response.output_item.done","item":{"id":"rs_0482d9f8acdf0e0d0169b319438b988194b48fd3d175a69307","type":"reasoning","summary":[]},"output_index":0,"sequence_number":3} + data: {"type":"response.output_item.done","item":{"id":"rs_0967f4efea4061d0016a3c122284b881a0ba3b13e24047d7ce","type":"reasoning","content":[],"summary":[]},"output_index":0,"sequence_number":3} event: response.output_item.added - data: {"type":"response.output_item.added","item":{"id":"fc_0482d9f8acdf0e0d0169b3194641ac8194b5d6d7120eb52c48","type":"function_call","status":"in_progress","arguments":"","call_id":"call_lEeVe1NUWaZ7MWIyf58FEKCg","name":"weather"},"output_index":1,"sequence_number":4} + data: {"type":"response.output_item.added","item":{"id":"fc_0967f4efea4061d0016a3c1223286481a0b6b3834cdd7c6574","type":"function_call","status":"in_progress","arguments":"","call_id":"call_nYgMM3oZuxort2H8Ky4uP5RE","name":"weather"},"output_index":1,"sequence_number":4} event: response.function_call_arguments.delta - data: {"type":"response.function_call_arguments.delta","delta":"{\"","item_id":"fc_0482d9f8acdf0e0d0169b3194641ac8194b5d6d7120eb52c48","obfuscation":"VHCQFAeIhlWuax","output_index":1,"sequence_number":5} + data: {"type":"response.function_call_arguments.delta","delta":"{\"","item_id":"fc_0967f4efea4061d0016a3c1223286481a0b6b3834cdd7c6574","obfuscation":"FnURDVCa1ru0qa","output_index":1,"sequence_number":5} event: response.function_call_arguments.delta - data: {"type":"response.function_call_arguments.delta","delta":"location","item_id":"fc_0482d9f8acdf0e0d0169b3194641ac8194b5d6d7120eb52c48","obfuscation":"vqQDaUOz","output_index":1,"sequence_number":6} + data: {"type":"response.function_call_arguments.delta","delta":"location","item_id":"fc_0967f4efea4061d0016a3c1223286481a0b6b3834cdd7c6574","obfuscation":"xsII3zSM","output_index":1,"sequence_number":6} event: response.function_call_arguments.delta - data: {"type":"response.function_call_arguments.delta","delta":"\":\"","item_id":"fc_0482d9f8acdf0e0d0169b3194641ac8194b5d6d7120eb52c48","obfuscation":"FilxKuJ4z4aV4","output_index":1,"sequence_number":7} + data: {"type":"response.function_call_arguments.delta","delta":"\":\"","item_id":"fc_0967f4efea4061d0016a3c1223286481a0b6b3834cdd7c6574","obfuscation":"i9REAeF3h18NI","output_index":1,"sequence_number":7} event: response.function_call_arguments.delta - data: {"type":"response.function_call_arguments.delta","delta":"Flor","item_id":"fc_0482d9f8acdf0e0d0169b3194641ac8194b5d6d7120eb52c48","obfuscation":"ftgV6AHDDmLR","output_index":1,"sequence_number":8} + data: {"type":"response.function_call_arguments.delta","delta":"Flor","item_id":"fc_0967f4efea4061d0016a3c1223286481a0b6b3834cdd7c6574","obfuscation":"H09OFhXBchI6","output_index":1,"sequence_number":8} event: response.function_call_arguments.delta - data: {"type":"response.function_call_arguments.delta","delta":"ence","item_id":"fc_0482d9f8acdf0e0d0169b3194641ac8194b5d6d7120eb52c48","obfuscation":"QZrcohzpzm8x","output_index":1,"sequence_number":9} + data: {"type":"response.function_call_arguments.delta","delta":"ence","item_id":"fc_0967f4efea4061d0016a3c1223286481a0b6b3834cdd7c6574","obfuscation":"7UvDX75Pa1Mw","output_index":1,"sequence_number":9} event: response.function_call_arguments.delta - data: {"type":"response.function_call_arguments.delta","delta":",","item_id":"fc_0482d9f8acdf0e0d0169b3194641ac8194b5d6d7120eb52c48","obfuscation":"GVBt3zDgbpXMvHN","output_index":1,"sequence_number":10} + data: {"type":"response.function_call_arguments.delta","delta":",","item_id":"fc_0967f4efea4061d0016a3c1223286481a0b6b3834cdd7c6574","obfuscation":"KI82byULRnnTvaU","output_index":1,"sequence_number":10} event: response.function_call_arguments.delta - data: {"type":"response.function_call_arguments.delta","delta":" Italy","item_id":"fc_0482d9f8acdf0e0d0169b3194641ac8194b5d6d7120eb52c48","obfuscation":"loHW1eoXLG","output_index":1,"sequence_number":11} + data: {"type":"response.function_call_arguments.delta","delta":" Italy","item_id":"fc_0967f4efea4061d0016a3c1223286481a0b6b3834cdd7c6574","obfuscation":"QEzYrMzRAi","output_index":1,"sequence_number":11} event: response.function_call_arguments.delta - data: {"type":"response.function_call_arguments.delta","delta":"\"}","item_id":"fc_0482d9f8acdf0e0d0169b3194641ac8194b5d6d7120eb52c48","obfuscation":"Mn7Frdqyx8HpSC","output_index":1,"sequence_number":12} + data: {"type":"response.function_call_arguments.delta","delta":"\"}","item_id":"fc_0967f4efea4061d0016a3c1223286481a0b6b3834cdd7c6574","obfuscation":"gw80uqN1MCW22Q","output_index":1,"sequence_number":12} event: response.function_call_arguments.done - data: {"type":"response.function_call_arguments.done","arguments":"{\"location\":\"Florence, Italy\"}","item_id":"fc_0482d9f8acdf0e0d0169b3194641ac8194b5d6d7120eb52c48","output_index":1,"sequence_number":13} + data: {"type":"response.function_call_arguments.done","arguments":"{\"location\":\"Florence, Italy\"}","item_id":"fc_0967f4efea4061d0016a3c1223286481a0b6b3834cdd7c6574","output_index":1,"sequence_number":13} event: response.output_item.done - data: {"type":"response.output_item.done","item":{"id":"fc_0482d9f8acdf0e0d0169b3194641ac8194b5d6d7120eb52c48","type":"function_call","status":"completed","arguments":"{\"location\":\"Florence, Italy\"}","call_id":"call_lEeVe1NUWaZ7MWIyf58FEKCg","name":"weather"},"output_index":1,"sequence_number":14} + data: {"type":"response.output_item.done","item":{"id":"fc_0967f4efea4061d0016a3c1223286481a0b6b3834cdd7c6574","type":"function_call","status":"completed","arguments":"{\"location\":\"Florence, Italy\"}","call_id":"call_nYgMM3oZuxort2H8Ky4uP5RE","name":"weather"},"output_index":1,"sequence_number":14} event: response.completed - data: {"type":"response.completed","response":{"id":"resp_0482d9f8acdf0e0d0169b319432fa481948bdc7df374b5e464","object":"response","created_at":1773345091,"status":"completed","background":false,"completed_at":1773345094,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-5-2025-08-07","output":[{"id":"rs_0482d9f8acdf0e0d0169b319438b988194b48fd3d175a69307","type":"reasoning","summary":[]},{"id":"fc_0482d9f8acdf0e0d0169b3194641ac8194b5d6d7120eb52c48","type":"function_call","status":"completed","arguments":"{\"location\":\"Florence, Italy\"}","call_id":"call_lEeVe1NUWaZ7MWIyf58FEKCg","name":"weather"}],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":"medium","summary":null},"safety_identifier":null,"service_tier":"default","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":{"input_tokens":63,"input_tokens_details":{"cached_tokens":0},"output_tokens":124,"output_tokens_details":{"reasoning_tokens":64},"total_tokens":187},"user":null,"metadata":{}},"sequence_number":15} + data: {"type":"response.completed","response":{"id":"resp_0967f4efea4061d0016a3c122223dc81a08195678f441ec027","object":"response","created_at":1782321698,"status":"completed","background":false,"completed_at":1782321699,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-5-2025-08-07","moderation":null,"output":[{"id":"rs_0967f4efea4061d0016a3c122284b881a0ba3b13e24047d7ce","type":"reasoning","content":[],"summary":[]},{"id":"fc_0967f4efea4061d0016a3c1223286481a0b6b3834cdd7c6574","type":"function_call","status":"completed","arguments":"{\"location\":\"Florence, Italy\"}","call_id":"call_nYgMM3oZuxort2H8Ky4uP5RE","name":"weather"}],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":"current_turn","effort":"medium","summary":null},"safety_identifier":null,"service_tier":"default","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":{"input_tokens":63,"input_tokens_details":{"cached_tokens":0},"output_tokens":77,"output_tokens_details":{"reasoning_tokens":0},"total_tokens":140},"user":null,"metadata":{}},"sequence_number":15} headers: Content-Type: - text/event-stream; charset=utf-8 status: 200 OK code: 200 - duration: 314.099875ms + duration: 304.932917ms - id: 1 request: proto: HTTP/1.1 proto_major: 1 proto_minor: 1 - content_length: 735 + content_length: 723 host: "" - body: '{"max_output_tokens":4000,"store":false,"input":[{"content":"You are a helpful assistant","role":"developer"},{"content":[{"text":"What''s the weather in Florence,Italy?","type":"input_text"}],"role":"user"},{"arguments":"\"{\\\"location\\\":\\\"Florence, Italy\\\"}\"","call_id":"call_lEeVe1NUWaZ7MWIyf58FEKCg","name":"weather","type":"function_call"},{"call_id":"call_lEeVe1NUWaZ7MWIyf58FEKCg","output":"40 C","type":"function_call_output"}],"model":"gpt-5","tool_choice":"auto","tools":[{"strict":false,"parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"name":"weather","description":"Get weather information for a location","type":"function"}],"stream":true}' + body: '{"max_output_tokens":4000,"store":false,"input":[{"content":"You are a helpful assistant","role":"developer"},{"content":[{"text":"What''s the weather in Florence,Italy?","type":"input_text"}],"role":"user"},{"arguments":"{\"location\":\"Florence, Italy\"}","call_id":"call_nYgMM3oZuxort2H8Ky4uP5RE","name":"weather","type":"function_call"},{"call_id":"call_nYgMM3oZuxort2H8Ky4uP5RE","output":"40 C","type":"function_call_output"}],"model":"gpt-5","tool_choice":"auto","tools":[{"strict":false,"parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"name":"weather","description":"Get weather information for a location","type":"function"}],"stream":true}' headers: Accept: - application/json Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://api.openai.com/v1/responses method: POST response: @@ -102,125 +102,146 @@ interactions: content_length: -1 body: |+ event: response.created - data: {"type":"response.created","response":{"id":"resp_06494ddbfa4b09cc0169b319477e2c8191a3c7d50a6412241c","object":"response","created_at":1773345095,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-5-2025-08-07","output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":"medium","summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":0} + data: {"type":"response.created","response":{"id":"resp_00814851e8cfbc2a016a3c12239ecc8192b5f7b3a13ba44a78","object":"response","created_at":1782321699,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-5-2025-08-07","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":"current_turn","effort":"medium","summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":0} event: response.in_progress - data: {"type":"response.in_progress","response":{"id":"resp_06494ddbfa4b09cc0169b319477e2c8191a3c7d50a6412241c","object":"response","created_at":1773345095,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-5-2025-08-07","output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":"medium","summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":1} + data: {"type":"response.in_progress","response":{"id":"resp_00814851e8cfbc2a016a3c12239ecc8192b5f7b3a13ba44a78","object":"response","created_at":1782321699,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-5-2025-08-07","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":"current_turn","effort":"medium","summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":1} event: response.output_item.added - data: {"type":"response.output_item.added","item":{"id":"rs_06494ddbfa4b09cc0169b3194822e48191acc98a982fdf7970","type":"reasoning","summary":[]},"output_index":0,"sequence_number":2} + data: {"type":"response.output_item.added","item":{"id":"rs_00814851e8cfbc2a016a3c1224110c8192a4d5fc077898ee50","type":"reasoning","content":[],"summary":[]},"output_index":0,"sequence_number":2} event: response.output_item.done - data: {"type":"response.output_item.done","item":{"id":"rs_06494ddbfa4b09cc0169b3194822e48191acc98a982fdf7970","type":"reasoning","summary":[]},"output_index":0,"sequence_number":3} + data: {"type":"response.output_item.done","item":{"id":"rs_00814851e8cfbc2a016a3c1224110c8192a4d5fc077898ee50","type":"reasoning","content":[],"summary":[]},"output_index":0,"sequence_number":3} event: response.output_item.added - data: {"type":"response.output_item.added","item":{"id":"msg_06494ddbfa4b09cc0169b3194bc4608191a6d41a96e797951d","type":"message","status":"in_progress","content":[],"role":"assistant"},"output_index":1,"sequence_number":4} + data: {"type":"response.output_item.added","item":{"id":"msg_00814851e8cfbc2a016a3c12276c2c8192b828bec83e61212d","type":"message","status":"in_progress","content":[],"role":"assistant"},"output_index":1,"sequence_number":4} event: response.content_part.added - data: {"type":"response.content_part.added","content_index":0,"item_id":"msg_06494ddbfa4b09cc0169b3194bc4608191a6d41a96e797951d","output_index":1,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":""},"sequence_number":5} + data: {"type":"response.content_part.added","content_index":0,"item_id":"msg_00814851e8cfbc2a016a3c12276c2c8192b828bec83e61212d","output_index":1,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":""},"sequence_number":5} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":"It","item_id":"msg_06494ddbfa4b09cc0169b3194bc4608191a6d41a96e797951d","logprobs":[],"obfuscation":"cWBSszRtrOCIRl","output_index":1,"sequence_number":6} + data: {"type":"response.output_text.delta","content_index":0,"delta":"Flor","item_id":"msg_00814851e8cfbc2a016a3c12276c2c8192b828bec83e61212d","logprobs":[],"obfuscation":"wBGy3C8mfsnh","output_index":1,"sequence_number":6} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":"’s","item_id":"msg_06494ddbfa4b09cc0169b3194bc4608191a6d41a96e797951d","logprobs":[],"obfuscation":"6lvv5DFjWiM8k5","output_index":1,"sequence_number":7} + data: {"type":"response.output_text.delta","content_index":0,"delta":"ence","item_id":"msg_00814851e8cfbc2a016a3c12276c2c8192b828bec83e61212d","logprobs":[],"obfuscation":"YIK0WciXNqcC","output_index":1,"sequence_number":7} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" about","item_id":"msg_06494ddbfa4b09cc0169b3194bc4608191a6d41a96e797951d","logprobs":[],"obfuscation":"ePiPxjpkR5","output_index":1,"sequence_number":8} + data: {"type":"response.output_text.delta","content_index":0,"delta":",","item_id":"msg_00814851e8cfbc2a016a3c12276c2c8192b828bec83e61212d","logprobs":[],"obfuscation":"NS15OxTZm4yEuWo","output_index":1,"sequence_number":8} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" ","item_id":"msg_06494ddbfa4b09cc0169b3194bc4608191a6d41a96e797951d","logprobs":[],"obfuscation":"r5DjzxsGPKzzhaL","output_index":1,"sequence_number":9} + data: {"type":"response.output_text.delta","content_index":0,"delta":" Italy","item_id":"msg_00814851e8cfbc2a016a3c12276c2c8192b828bec83e61212d","logprobs":[],"obfuscation":"kOmmitHnS5","output_index":1,"sequence_number":9} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":"40","item_id":"msg_06494ddbfa4b09cc0169b3194bc4608191a6d41a96e797951d","logprobs":[],"obfuscation":"Vq2Y4PRmIwQe14","output_index":1,"sequence_number":10} + data: {"type":"response.output_text.delta","content_index":0,"delta":" is","item_id":"msg_00814851e8cfbc2a016a3c12276c2c8192b828bec83e61212d","logprobs":[],"obfuscation":"tgydCZTrcIIbP","output_index":1,"sequence_number":10} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":"°C","item_id":"msg_06494ddbfa4b09cc0169b3194bc4608191a6d41a96e797951d","logprobs":[],"obfuscation":"JEwuFcRH5Wg9kA","output_index":1,"sequence_number":11} + data: {"type":"response.output_text.delta","content_index":0,"delta":" currently","item_id":"msg_00814851e8cfbc2a016a3c12276c2c8192b828bec83e61212d","logprobs":[],"obfuscation":"5Acrvv","output_index":1,"sequence_number":11} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" (","item_id":"msg_06494ddbfa4b09cc0169b3194bc4608191a6d41a96e797951d","logprobs":[],"obfuscation":"SbxxnA0luqhUTh","output_index":1,"sequence_number":12} + data: {"type":"response.output_text.delta","content_index":0,"delta":" about","item_id":"msg_00814851e8cfbc2a016a3c12276c2c8192b828bec83e61212d","logprobs":[],"obfuscation":"ltw8vHkSbh","output_index":1,"sequence_number":12} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":"104","item_id":"msg_06494ddbfa4b09cc0169b3194bc4608191a6d41a96e797951d","logprobs":[],"obfuscation":"X0k6tZfDWz4hM","output_index":1,"sequence_number":13} + data: {"type":"response.output_text.delta","content_index":0,"delta":" ","item_id":"msg_00814851e8cfbc2a016a3c12276c2c8192b828bec83e61212d","logprobs":[],"obfuscation":"j9DyIUHa6J1O1pX","output_index":1,"sequence_number":13} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":"°F","item_id":"msg_06494ddbfa4b09cc0169b3194bc4608191a6d41a96e797951d","logprobs":[],"obfuscation":"S3fUdQ7R4HAQ8Y","output_index":1,"sequence_number":14} + data: {"type":"response.output_text.delta","content_index":0,"delta":"40","item_id":"msg_00814851e8cfbc2a016a3c12276c2c8192b828bec83e61212d","logprobs":[],"obfuscation":"WcTJRGtnK4m6Zp","output_index":1,"sequence_number":14} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":")","item_id":"msg_06494ddbfa4b09cc0169b3194bc4608191a6d41a96e797951d","logprobs":[],"obfuscation":"J5iLIX5Pwy82zwd","output_index":1,"sequence_number":15} + data: {"type":"response.output_text.delta","content_index":0,"delta":"°C","item_id":"msg_00814851e8cfbc2a016a3c12276c2c8192b828bec83e61212d","logprobs":[],"obfuscation":"kgPeascAi7CqSq","output_index":1,"sequence_number":15} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" in","item_id":"msg_06494ddbfa4b09cc0169b3194bc4608191a6d41a96e797951d","logprobs":[],"obfuscation":"Ezk0gX2gQlgFV","output_index":1,"sequence_number":16} + data: {"type":"response.output_text.delta","content_index":0,"delta":" (","item_id":"msg_00814851e8cfbc2a016a3c12276c2c8192b828bec83e61212d","logprobs":[],"obfuscation":"McaGvVAGQGY4uM","output_index":1,"sequence_number":16} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" Florence","item_id":"msg_06494ddbfa4b09cc0169b3194bc4608191a6d41a96e797951d","logprobs":[],"obfuscation":"Stt1mR3","output_index":1,"sequence_number":17} + data: {"type":"response.output_text.delta","content_index":0,"delta":"104","item_id":"msg_00814851e8cfbc2a016a3c12276c2c8192b828bec83e61212d","logprobs":[],"obfuscation":"frU7uCi7gNTnD","output_index":1,"sequence_number":17} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":",","item_id":"msg_06494ddbfa4b09cc0169b3194bc4608191a6d41a96e797951d","logprobs":[],"obfuscation":"2VatvV5R9RVvoOD","output_index":1,"sequence_number":18} + data: {"type":"response.output_text.delta","content_index":0,"delta":"°F","item_id":"msg_00814851e8cfbc2a016a3c12276c2c8192b828bec83e61212d","logprobs":[],"obfuscation":"ROa8ePRIqmxjwN","output_index":1,"sequence_number":18} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" Italy","item_id":"msg_06494ddbfa4b09cc0169b3194bc4608191a6d41a96e797951d","logprobs":[],"obfuscation":"ikJklK9yap","output_index":1,"sequence_number":19} + data: {"type":"response.output_text.delta","content_index":0,"delta":").","item_id":"msg_00814851e8cfbc2a016a3c12276c2c8192b828bec83e61212d","logprobs":[],"obfuscation":"YqYSu51VkxorTn","output_index":1,"sequence_number":19} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" right","item_id":"msg_06494ddbfa4b09cc0169b3194bc4608191a6d41a96e797951d","logprobs":[],"obfuscation":"PgXFwJWXi0","output_index":1,"sequence_number":20} + data: {"type":"response.output_text.delta","content_index":0,"delta":" It","item_id":"msg_00814851e8cfbc2a016a3c12276c2c8192b828bec83e61212d","logprobs":[],"obfuscation":"6eu33sKUJOcgH","output_index":1,"sequence_number":20} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" now","item_id":"msg_06494ddbfa4b09cc0169b3194bc4608191a6d41a96e797951d","logprobs":[],"obfuscation":"KOlW9nYdpLEN","output_index":1,"sequence_number":21} + data: {"type":"response.output_text.delta","content_index":0,"delta":"’s","item_id":"msg_00814851e8cfbc2a016a3c12276c2c8192b828bec83e61212d","logprobs":[],"obfuscation":"RNfXTQnTw0cf0j","output_index":1,"sequence_number":21} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":".","item_id":"msg_06494ddbfa4b09cc0169b3194bc4608191a6d41a96e797951d","logprobs":[],"obfuscation":"787d1eJwdajC4Xm","output_index":1,"sequence_number":22} + data: {"type":"response.output_text.delta","content_index":0,"delta":" very","item_id":"msg_00814851e8cfbc2a016a3c12276c2c8192b828bec83e61212d","logprobs":[],"obfuscation":"8R7WcAHZB67","output_index":1,"sequence_number":22} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" Want","item_id":"msg_06494ddbfa4b09cc0169b3194bc4608191a6d41a96e797951d","logprobs":[],"obfuscation":"wnD0ywo76A5","output_index":1,"sequence_number":23} + data: {"type":"response.output_text.delta","content_index":0,"delta":" hot","item_id":"msg_00814851e8cfbc2a016a3c12276c2c8192b828bec83e61212d","logprobs":[],"obfuscation":"7sBq1aCYm1Av","output_index":1,"sequence_number":23} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" the","item_id":"msg_06494ddbfa4b09cc0169b3194bc4608191a6d41a96e797951d","logprobs":[],"obfuscation":"DzY8NrwM7I5y","output_index":1,"sequence_number":24} + data: {"type":"response.output_text.delta","content_index":0,"delta":"—","item_id":"msg_00814851e8cfbc2a016a3c12276c2c8192b828bec83e61212d","logprobs":[],"obfuscation":"dgxm87C8YRdHa7U","output_index":1,"sequence_number":24} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" forecast","item_id":"msg_06494ddbfa4b09cc0169b3194bc4608191a6d41a96e797951d","logprobs":[],"obfuscation":"gYqteGg","output_index":1,"sequence_number":25} + data: {"type":"response.output_text.delta","content_index":0,"delta":"stay","item_id":"msg_00814851e8cfbc2a016a3c12276c2c8192b828bec83e61212d","logprobs":[],"obfuscation":"NDT7ugTziXsH","output_index":1,"sequence_number":25} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" or","item_id":"msg_06494ddbfa4b09cc0169b3194bc4608191a6d41a96e797951d","logprobs":[],"obfuscation":"tUfZZADznQk8L","output_index":1,"sequence_number":26} + data: {"type":"response.output_text.delta","content_index":0,"delta":" hydrated","item_id":"msg_00814851e8cfbc2a016a3c12276c2c8192b828bec83e61212d","logprobs":[],"obfuscation":"wKmwtZ3","output_index":1,"sequence_number":26} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" tips","item_id":"msg_06494ddbfa4b09cc0169b3194bc4608191a6d41a96e797951d","logprobs":[],"obfuscation":"NmSkqcqLdW0","output_index":1,"sequence_number":27} + data: {"type":"response.output_text.delta","content_index":0,"delta":" and","item_id":"msg_00814851e8cfbc2a016a3c12276c2c8192b828bec83e61212d","logprobs":[],"obfuscation":"C2bkCjhEeyqU","output_index":1,"sequence_number":27} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" for","item_id":"msg_06494ddbfa4b09cc0169b3194bc4608191a6d41a96e797951d","logprobs":[],"obfuscation":"WbQhp14NfU2C","output_index":1,"sequence_number":28} + data: {"type":"response.output_text.delta","content_index":0,"delta":" avoid","item_id":"msg_00814851e8cfbc2a016a3c12276c2c8192b828bec83e61212d","logprobs":[],"obfuscation":"pM5vCudQj2","output_index":1,"sequence_number":28} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" staying","item_id":"msg_06494ddbfa4b09cc0169b3194bc4608191a6d41a96e797951d","logprobs":[],"obfuscation":"TsTDK1jY","output_index":1,"sequence_number":29} + data: {"type":"response.output_text.delta","content_index":0,"delta":" peak","item_id":"msg_00814851e8cfbc2a016a3c12276c2c8192b828bec83e61212d","logprobs":[],"obfuscation":"W43ePghDc92","output_index":1,"sequence_number":29} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" cool","item_id":"msg_06494ddbfa4b09cc0169b3194bc4608191a6d41a96e797951d","logprobs":[],"obfuscation":"spwLMyDeecW","output_index":1,"sequence_number":30} + data: {"type":"response.output_text.delta","content_index":0,"delta":" afternoon","item_id":"msg_00814851e8cfbc2a016a3c12276c2c8192b828bec83e61212d","logprobs":[],"obfuscation":"pqV7X2","output_index":1,"sequence_number":30} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" in","item_id":"msg_06494ddbfa4b09cc0169b3194bc4608191a6d41a96e797951d","logprobs":[],"obfuscation":"LJYUdtCFfr0Ls","output_index":1,"sequence_number":31} + data: {"type":"response.output_text.delta","content_index":0,"delta":" sun","item_id":"msg_00814851e8cfbc2a016a3c12276c2c8192b828bec83e61212d","logprobs":[],"obfuscation":"NmPrT3WmpEKm","output_index":1,"sequence_number":31} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" the","item_id":"msg_06494ddbfa4b09cc0169b3194bc4608191a6d41a96e797951d","logprobs":[],"obfuscation":"XsMR9DGqltH8","output_index":1,"sequence_number":32} + data: {"type":"response.output_text.delta","content_index":0,"delta":".","item_id":"msg_00814851e8cfbc2a016a3c12276c2c8192b828bec83e61212d","logprobs":[],"obfuscation":"eYKyxGDiGTvOAeS","output_index":1,"sequence_number":32} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" heat","item_id":"msg_06494ddbfa4b09cc0169b3194bc4608191a6d41a96e797951d","logprobs":[],"obfuscation":"YUD1G3S0F5v","output_index":1,"sequence_number":33} + data: {"type":"response.output_text.delta","content_index":0,"delta":" Want","item_id":"msg_00814851e8cfbc2a016a3c12276c2c8192b828bec83e61212d","logprobs":[],"obfuscation":"gyRLxzNgaVK","output_index":1,"sequence_number":33} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":"?","item_id":"msg_06494ddbfa4b09cc0169b3194bc4608191a6d41a96e797951d","logprobs":[],"obfuscation":"OdrruQMA4a3qf2T","output_index":1,"sequence_number":34} + data: {"type":"response.output_text.delta","content_index":0,"delta":" a","item_id":"msg_00814851e8cfbc2a016a3c12276c2c8192b828bec83e61212d","logprobs":[],"obfuscation":"V7a6q4J6y8qkfr","output_index":1,"sequence_number":34} + + event: response.output_text.delta + data: {"type":"response.output_text.delta","content_index":0,"delta":" forecast","item_id":"msg_00814851e8cfbc2a016a3c12276c2c8192b828bec83e61212d","logprobs":[],"obfuscation":"CqeGiyS","output_index":1,"sequence_number":35} + + event: response.output_text.delta + data: {"type":"response.output_text.delta","content_index":0,"delta":" for","item_id":"msg_00814851e8cfbc2a016a3c12276c2c8192b828bec83e61212d","logprobs":[],"obfuscation":"aHBaEUrFs35X","output_index":1,"sequence_number":36} + + event: response.output_text.delta + data: {"type":"response.output_text.delta","content_index":0,"delta":" the","item_id":"msg_00814851e8cfbc2a016a3c12276c2c8192b828bec83e61212d","logprobs":[],"obfuscation":"ee2CZv7ulVsV","output_index":1,"sequence_number":37} + + event: response.output_text.delta + data: {"type":"response.output_text.delta","content_index":0,"delta":" next","item_id":"msg_00814851e8cfbc2a016a3c12276c2c8192b828bec83e61212d","logprobs":[],"obfuscation":"qrMvFRY8Pid","output_index":1,"sequence_number":38} + + event: response.output_text.delta + data: {"type":"response.output_text.delta","content_index":0,"delta":" few","item_id":"msg_00814851e8cfbc2a016a3c12276c2c8192b828bec83e61212d","logprobs":[],"obfuscation":"EovAnTahsu48","output_index":1,"sequence_number":39} + + event: response.output_text.delta + data: {"type":"response.output_text.delta","content_index":0,"delta":" days","item_id":"msg_00814851e8cfbc2a016a3c12276c2c8192b828bec83e61212d","logprobs":[],"obfuscation":"Q3JpfyubulT","output_index":1,"sequence_number":40} + + event: response.output_text.delta + data: {"type":"response.output_text.delta","content_index":0,"delta":"?","item_id":"msg_00814851e8cfbc2a016a3c12276c2c8192b828bec83e61212d","logprobs":[],"obfuscation":"iUjb3TSyToOPJaK","output_index":1,"sequence_number":41} event: response.output_text.done - data: {"type":"response.output_text.done","content_index":0,"item_id":"msg_06494ddbfa4b09cc0169b3194bc4608191a6d41a96e797951d","logprobs":[],"output_index":1,"sequence_number":35,"text":"It’s about 40°C (104°F) in Florence, Italy right now. Want the forecast or tips for staying cool in the heat?"} + data: {"type":"response.output_text.done","content_index":0,"item_id":"msg_00814851e8cfbc2a016a3c12276c2c8192b828bec83e61212d","logprobs":[],"output_index":1,"sequence_number":42,"text":"Florence, Italy is currently about 40°C (104°F). It’s very hot—stay hydrated and avoid peak afternoon sun. Want a forecast for the next few days?"} event: response.content_part.done - data: {"type":"response.content_part.done","content_index":0,"item_id":"msg_06494ddbfa4b09cc0169b3194bc4608191a6d41a96e797951d","output_index":1,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":"It’s about 40°C (104°F) in Florence, Italy right now. Want the forecast or tips for staying cool in the heat?"},"sequence_number":36} + data: {"type":"response.content_part.done","content_index":0,"item_id":"msg_00814851e8cfbc2a016a3c12276c2c8192b828bec83e61212d","output_index":1,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":"Florence, Italy is currently about 40°C (104°F). It’s very hot—stay hydrated and avoid peak afternoon sun. Want a forecast for the next few days?"},"sequence_number":43} event: response.output_item.done - data: {"type":"response.output_item.done","item":{"id":"msg_06494ddbfa4b09cc0169b3194bc4608191a6d41a96e797951d","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"It’s about 40°C (104°F) in Florence, Italy right now. Want the forecast or tips for staying cool in the heat?"}],"role":"assistant"},"output_index":1,"sequence_number":37} + data: {"type":"response.output_item.done","item":{"id":"msg_00814851e8cfbc2a016a3c12276c2c8192b828bec83e61212d","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"Florence, Italy is currently about 40°C (104°F). It’s very hot—stay hydrated and avoid peak afternoon sun. Want a forecast for the next few days?"}],"role":"assistant"},"output_index":1,"sequence_number":44} event: response.completed - data: {"type":"response.completed","response":{"id":"resp_06494ddbfa4b09cc0169b319477e2c8191a3c7d50a6412241c","object":"response","created_at":1773345095,"status":"completed","background":false,"completed_at":1773345100,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-5-2025-08-07","output":[{"id":"rs_06494ddbfa4b09cc0169b3194822e48191acc98a982fdf7970","type":"reasoning","summary":[]},{"id":"msg_06494ddbfa4b09cc0169b3194bc4608191a6d41a96e797951d","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"It’s about 40°C (104°F) in Florence, Italy right now. Want the forecast or tips for staying cool in the heat?"}],"role":"assistant"}],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":"medium","summary":null},"safety_identifier":null,"service_tier":"default","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":{"input_tokens":94,"input_tokens_details":{"cached_tokens":0},"output_tokens":230,"output_tokens_details":{"reasoning_tokens":192},"total_tokens":324},"user":null,"metadata":{}},"sequence_number":38} + data: {"type":"response.completed","response":{"id":"resp_00814851e8cfbc2a016a3c12239ecc8192b5f7b3a13ba44a78","object":"response","created_at":1782321699,"status":"completed","background":false,"completed_at":1782321703,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-5-2025-08-07","moderation":null,"output":[{"id":"rs_00814851e8cfbc2a016a3c1224110c8192a4d5fc077898ee50","type":"reasoning","content":[],"summary":[]},{"id":"msg_00814851e8cfbc2a016a3c12276c2c8192b828bec83e61212d","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"Florence, Italy is currently about 40°C (104°F). It’s very hot—stay hydrated and avoid peak afternoon sun. Want a forecast for the next few days?"}],"role":"assistant"}],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":"current_turn","effort":"medium","summary":null},"safety_identifier":null,"service_tier":"default","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":{"input_tokens":92,"input_tokens_details":{"cached_tokens":0},"output_tokens":194,"output_tokens_details":{"reasoning_tokens":128},"total_tokens":286},"user":null,"metadata":{}},"sequence_number":45} headers: Content-Type: - text/event-stream; charset=utf-8 status: 200 OK code: 200 - duration: 1.109639291s + duration: 410.206833ms diff --git a/providertests/testdata/TestOpenAIResponsesCommon/openai-o4-mini/simple.yaml b/providertests/testdata/TestOpenAIResponsesCommon/openai-o4-mini/simple.yaml index 3fe8faf61..06ec769a4 100644 --- a/providertests/testdata/TestOpenAIResponsesCommon/openai-o4-mini/simple.yaml +++ b/providertests/testdata/TestOpenAIResponsesCommon/openai-o4-mini/simple.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://api.openai.com/v1/responses method: POST response: @@ -26,15 +26,15 @@ interactions: uncompressed: true body: |- { - "id": "resp_0577d63a991eed700169b31961c10481928212a8fddee831e8", + "id": "resp_0bcce28f8fece197016a3c12324844819d8934666ed381005b", "object": "response", - "created_at": 1773345121, + "created_at": 1782321714, "status": "completed", "background": false, "billing": { "payer": "developer" }, - "completed_at": 1773345124, + "completed_at": 1782321716, "error": null, "frequency_penalty": 0.0, "incomplete_details": null, @@ -42,14 +42,16 @@ interactions: "max_output_tokens": 4000, "max_tool_calls": null, "model": "o4-mini-2025-04-16", + "moderation": null, "output": [ { - "id": "rs_0577d63a991eed700169b319627ff88192a1f65d0284fde2da", + "id": "rs_0bcce28f8fece197016a3c12330fd0819da34ffabea7b4b55d", "type": "reasoning", + "content": [], "summary": [] }, { - "id": "msg_0577d63a991eed700169b31963cb688192bb2174abf46137e4", + "id": "msg_0bcce28f8fece197016a3c12345458819dadcee375cb280538", "type": "message", "status": "completed", "content": [ @@ -67,8 +69,9 @@ interactions: "presence_penalty": 0.0, "previous_response_id": null, "prompt_cache_key": null, - "prompt_cache_retention": null, + "prompt_cache_retention": "in_memory", "reasoning": { + "context": "current_turn", "effort": "medium", "summary": null }, @@ -92,11 +95,11 @@ interactions: "input_tokens_details": { "cached_tokens": 0 }, - "output_tokens": 111, + "output_tokens": 214, "output_tokens_details": { - "reasoning_tokens": 64 + "reasoning_tokens": 192 }, - "total_tokens": 130 + "total_tokens": 233 }, "user": null, "metadata": {} @@ -106,4 +109,4 @@ interactions: - application/json status: 200 OK code: 200 - duration: 2.5590765s + duration: 3.955245333s diff --git a/providertests/testdata/TestOpenAIResponsesCommon/openai-o4-mini/simple_streaming.yaml b/providertests/testdata/TestOpenAIResponsesCommon/openai-o4-mini/simple_streaming.yaml index 511f935e4..d2a436714 100644 --- a/providertests/testdata/TestOpenAIResponsesCommon/openai-o4-mini/simple_streaming.yaml +++ b/providertests/testdata/TestOpenAIResponsesCommon/openai-o4-mini/simple_streaming.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://api.openai.com/v1/responses method: POST response: @@ -25,44 +25,44 @@ interactions: content_length: -1 body: |+ event: response.created - data: {"type":"response.created","response":{"id":"resp_0716fcc68f97360c0169b319643d188193b0f58979a1a91c62","object":"response","created_at":1773345124,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"o4-mini-2025-04-16","output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":"medium","summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":0} + data: {"type":"response.created","response":{"id":"resp_06d253740eeeaa22016a3c12365058819eb2a853442ebbe72c","object":"response","created_at":1782321718,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"o4-mini-2025-04-16","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":"current_turn","effort":"medium","summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":0} event: response.in_progress - data: {"type":"response.in_progress","response":{"id":"resp_0716fcc68f97360c0169b319643d188193b0f58979a1a91c62","object":"response","created_at":1773345124,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"o4-mini-2025-04-16","output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":"medium","summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":1} + data: {"type":"response.in_progress","response":{"id":"resp_06d253740eeeaa22016a3c12365058819eb2a853442ebbe72c","object":"response","created_at":1782321718,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"o4-mini-2025-04-16","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":"current_turn","effort":"medium","summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":1} event: response.output_item.added - data: {"type":"response.output_item.added","item":{"id":"rs_0716fcc68f97360c0169b31965a8f48193ae09b58c7119d3a1","type":"reasoning","summary":[]},"output_index":0,"sequence_number":2} + data: {"type":"response.output_item.added","item":{"id":"rs_06d253740eeeaa22016a3c123723ec819ead685c53f6ad48d2","type":"reasoning","content":[],"summary":[]},"output_index":0,"sequence_number":2} event: response.output_item.done - data: {"type":"response.output_item.done","item":{"id":"rs_0716fcc68f97360c0169b31965a8f48193ae09b58c7119d3a1","type":"reasoning","summary":[]},"output_index":0,"sequence_number":3} + data: {"type":"response.output_item.done","item":{"id":"rs_06d253740eeeaa22016a3c123723ec819ead685c53f6ad48d2","type":"reasoning","content":[],"summary":[]},"output_index":0,"sequence_number":3} event: response.output_item.added - data: {"type":"response.output_item.added","item":{"id":"msg_0716fcc68f97360c0169b3196696a88193aaf9e2c1384f72f1","type":"message","status":"in_progress","content":[],"role":"assistant"},"output_index":1,"sequence_number":4} + data: {"type":"response.output_item.added","item":{"id":"msg_06d253740eeeaa22016a3c1237bb80819e8805518dfbab6cd0","type":"message","status":"in_progress","content":[],"role":"assistant"},"output_index":1,"sequence_number":4} event: response.content_part.added - data: {"type":"response.content_part.added","content_index":0,"item_id":"msg_0716fcc68f97360c0169b3196696a88193aaf9e2c1384f72f1","output_index":1,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":""},"sequence_number":5} + data: {"type":"response.content_part.added","content_index":0,"item_id":"msg_06d253740eeeaa22016a3c1237bb80819e8805518dfbab6cd0","output_index":1,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":""},"sequence_number":5} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":"Oi","item_id":"msg_0716fcc68f97360c0169b3196696a88193aaf9e2c1384f72f1","logprobs":[],"obfuscation":"lhLo9IWWLTqOw8","output_index":1,"sequence_number":6} + data: {"type":"response.output_text.delta","content_index":0,"delta":"Olá","item_id":"msg_06d253740eeeaa22016a3c1237bb80819e8805518dfbab6cd0","logprobs":[],"obfuscation":"sPZYlHqC82CL2","output_index":1,"sequence_number":6} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":"!","item_id":"msg_0716fcc68f97360c0169b3196696a88193aaf9e2c1384f72f1","logprobs":[],"obfuscation":"0RMKcpKiAHz9sis","output_index":1,"sequence_number":7} + data: {"type":"response.output_text.delta","content_index":0,"delta":"!","item_id":"msg_06d253740eeeaa22016a3c1237bb80819e8805518dfbab6cd0","logprobs":[],"obfuscation":"OJTjierOdMxMlNz","output_index":1,"sequence_number":7} event: response.output_text.done - data: {"type":"response.output_text.done","content_index":0,"item_id":"msg_0716fcc68f97360c0169b3196696a88193aaf9e2c1384f72f1","logprobs":[],"output_index":1,"sequence_number":8,"text":"Oi!"} + data: {"type":"response.output_text.done","content_index":0,"item_id":"msg_06d253740eeeaa22016a3c1237bb80819e8805518dfbab6cd0","logprobs":[],"output_index":1,"sequence_number":8,"text":"Olá!"} event: response.content_part.done - data: {"type":"response.content_part.done","content_index":0,"item_id":"msg_0716fcc68f97360c0169b3196696a88193aaf9e2c1384f72f1","output_index":1,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":"Oi!"},"sequence_number":9} + data: {"type":"response.content_part.done","content_index":0,"item_id":"msg_06d253740eeeaa22016a3c1237bb80819e8805518dfbab6cd0","output_index":1,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":"Olá!"},"sequence_number":9} event: response.output_item.done - data: {"type":"response.output_item.done","item":{"id":"msg_0716fcc68f97360c0169b3196696a88193aaf9e2c1384f72f1","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"Oi!"}],"role":"assistant"},"output_index":1,"sequence_number":10} + data: {"type":"response.output_item.done","item":{"id":"msg_06d253740eeeaa22016a3c1237bb80819e8805518dfbab6cd0","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"Olá!"}],"role":"assistant"},"output_index":1,"sequence_number":10} event: response.completed - data: {"type":"response.completed","response":{"id":"resp_0716fcc68f97360c0169b319643d188193b0f58979a1a91c62","object":"response","created_at":1773345124,"status":"completed","background":false,"completed_at":1773345126,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"o4-mini-2025-04-16","output":[{"id":"rs_0716fcc68f97360c0169b31965a8f48193ae09b58c7119d3a1","type":"reasoning","summary":[]},{"id":"msg_0716fcc68f97360c0169b3196696a88193aaf9e2c1384f72f1","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"Oi!"}],"role":"assistant"}],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":"medium","summary":null},"safety_identifier":null,"service_tier":"default","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":{"input_tokens":19,"input_tokens_details":{"cached_tokens":0},"output_tokens":115,"output_tokens_details":{"reasoning_tokens":64},"total_tokens":134},"user":null,"metadata":{}},"sequence_number":11} + data: {"type":"response.completed","response":{"id":"resp_06d253740eeeaa22016a3c12365058819eb2a853442ebbe72c","object":"response","created_at":1782321718,"status":"completed","background":false,"completed_at":1782321719,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"o4-mini-2025-04-16","moderation":null,"output":[{"id":"rs_06d253740eeeaa22016a3c123723ec819ead685c53f6ad48d2","type":"reasoning","content":[],"summary":[]},{"id":"msg_06d253740eeeaa22016a3c1237bb80819e8805518dfbab6cd0","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"Olá!"}],"role":"assistant"}],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":"current_turn","effort":"medium","summary":null},"safety_identifier":null,"service_tier":"default","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":{"input_tokens":19,"input_tokens_details":{"cached_tokens":0},"output_tokens":104,"output_tokens_details":{"reasoning_tokens":64},"total_tokens":123},"user":null,"metadata":{}},"sequence_number":11} headers: Content-Type: - text/event-stream; charset=utf-8 status: 200 OK code: 200 - duration: 257.678083ms + duration: 637.016334ms diff --git a/providertests/testdata/TestOpenAIResponsesCommon/openai-o4-mini/tool.yaml b/providertests/testdata/TestOpenAIResponsesCommon/openai-o4-mini/tool.yaml index 86df1e7cc..99fe0e067 100644 --- a/providertests/testdata/TestOpenAIResponsesCommon/openai-o4-mini/tool.yaml +++ b/providertests/testdata/TestOpenAIResponsesCommon/openai-o4-mini/tool.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://api.openai.com/v1/responses method: POST response: @@ -26,15 +26,15 @@ interactions: uncompressed: true body: |- { - "id": "resp_0794220d1334844a0169b31966df7481a18fc500bd6187bc22", + "id": "resp_0ba36516ed812a52016a3c12380f80819f93a925db8fd1b650", "object": "response", - "created_at": 1773345126, + "created_at": 1782321720, "status": "completed", "background": false, "billing": { "payer": "developer" }, - "completed_at": 1773345130, + "completed_at": 1782321722, "error": null, "frequency_penalty": 0.0, "incomplete_details": null, @@ -42,18 +42,20 @@ interactions: "max_output_tokens": 4000, "max_tool_calls": null, "model": "o4-mini-2025-04-16", + "moderation": null, "output": [ { - "id": "rs_0794220d1334844a0169b31967906c81a18bc636b6a18e2e41", + "id": "rs_0ba36516ed812a52016a3c1239082c819fa520dcf530ba1d0f", "type": "reasoning", + "content": [], "summary": [] }, { - "id": "fc_0794220d1334844a0169b3196a066481a19ffe57c11e74273a", + "id": "fc_0ba36516ed812a52016a3c1239f854819f9cedba1904c99cfc", "type": "function_call", "status": "completed", "arguments": "{\"location\":\"Florence, Italy\"}", - "call_id": "call_zS1DVzqYRCYZ6Ug86teTMYiq", + "call_id": "call_mNRPdaouMLQT0VFAO0oChvBL", "name": "weather" } ], @@ -61,8 +63,9 @@ interactions: "presence_penalty": 0.0, "previous_response_id": null, "prompt_cache_key": null, - "prompt_cache_retention": null, + "prompt_cache_retention": "in_memory", "reasoning": { + "context": "current_turn", "effort": "medium", "summary": null }, @@ -105,11 +108,11 @@ interactions: "input_tokens_details": { "cached_tokens": 0 }, - "output_tokens": 267, + "output_tokens": 176, "output_tokens_details": { - "reasoning_tokens": 192 + "reasoning_tokens": 128 }, - "total_tokens": 327 + "total_tokens": 236 }, "user": null, "metadata": {} @@ -119,22 +122,22 @@ interactions: - application/json status: 200 OK code: 200 - duration: 3.570247709s + duration: 2.386423958s - id: 1 request: proto: HTTP/1.1 proto_major: 1 proto_minor: 1 - content_length: 723 + content_length: 711 host: "" - body: '{"max_output_tokens":4000,"store":false,"input":[{"content":"You are a helpful assistant","role":"developer"},{"content":[{"text":"What''s the weather in Florence,Italy?","type":"input_text"}],"role":"user"},{"arguments":"\"{\\\"location\\\":\\\"Florence, Italy\\\"}\"","call_id":"call_zS1DVzqYRCYZ6Ug86teTMYiq","name":"weather","type":"function_call"},{"call_id":"call_zS1DVzqYRCYZ6Ug86teTMYiq","output":"40 C","type":"function_call_output"}],"model":"o4-mini","tool_choice":"auto","tools":[{"strict":false,"parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"name":"weather","description":"Get weather information for a location","type":"function"}]}' + body: '{"max_output_tokens":4000,"store":false,"input":[{"content":"You are a helpful assistant","role":"developer"},{"content":[{"text":"What''s the weather in Florence,Italy?","type":"input_text"}],"role":"user"},{"arguments":"{\"location\":\"Florence, Italy\"}","call_id":"call_mNRPdaouMLQT0VFAO0oChvBL","name":"weather","type":"function_call"},{"call_id":"call_mNRPdaouMLQT0VFAO0oChvBL","output":"40 C","type":"function_call_output"}],"model":"o4-mini","tool_choice":"auto","tools":[{"strict":false,"parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"name":"weather","description":"Get weather information for a location","type":"function"}]}' headers: Accept: - application/json Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://api.openai.com/v1/responses method: POST response: @@ -145,15 +148,15 @@ interactions: uncompressed: true body: |- { - "id": "resp_0d60a405fb29f78a0169b3196a732c81958630d18af0ec04d6", + "id": "resp_02f1d06fe2b66751016a3c123a6d5481a0bf4f10dddcb4574f", "object": "response", - "created_at": 1773345130, + "created_at": 1782321722, "status": "completed", "background": false, "billing": { "payer": "developer" }, - "completed_at": 1773345131, + "completed_at": 1782321723, "error": null, "frequency_penalty": 0.0, "incomplete_details": null, @@ -161,9 +164,10 @@ interactions: "max_output_tokens": 4000, "max_tool_calls": null, "model": "o4-mini-2025-04-16", + "moderation": null, "output": [ { - "id": "msg_0d60a405fb29f78a0169b3196b31ac8195b1efa41424289039", + "id": "msg_02f1d06fe2b66751016a3c123ad80881a089811753d80bdd48", "type": "message", "status": "completed", "content": [ @@ -171,7 +175,7 @@ interactions: "type": "output_text", "annotations": [], "logprobs": [], - "text": "The current temperature in Florence, Italy is 40\u00b0C." + "text": "The current temperature in Florence, Italy, is 40\u00b0C. It\u2019s quite hot\u2014be sure to stay hydrated and avoid prolonged sun exposure during peak afternoon hours. If you need more details like humidity, wind speed, or a forecast, just let me know!" } ], "role": "assistant" @@ -181,8 +185,9 @@ interactions: "presence_penalty": 0.0, "previous_response_id": null, "prompt_cache_key": null, - "prompt_cache_retention": null, + "prompt_cache_retention": "in_memory", "reasoning": { + "context": "current_turn", "effort": "medium", "summary": null }, @@ -221,15 +226,15 @@ interactions: "top_p": 1.0, "truncation": "disabled", "usage": { - "input_tokens": 91, + "input_tokens": 89, "input_tokens_details": { "cached_tokens": 0 }, - "output_tokens": 16, + "output_tokens": 57, "output_tokens_details": { "reasoning_tokens": 0 }, - "total_tokens": 107 + "total_tokens": 146 }, "user": null, "metadata": {} @@ -239,4 +244,4 @@ interactions: - application/json status: 200 OK code: 200 - duration: 1.310034417s + duration: 1.358084458s diff --git a/providertests/testdata/TestOpenAIResponsesCommon/openai-o4-mini/tool_streaming.yaml b/providertests/testdata/TestOpenAIResponsesCommon/openai-o4-mini/tool_streaming.yaml index fc85abad7..d21da223a 100644 --- a/providertests/testdata/TestOpenAIResponsesCommon/openai-o4-mini/tool_streaming.yaml +++ b/providertests/testdata/TestOpenAIResponsesCommon/openai-o4-mini/tool_streaming.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://api.openai.com/v1/responses method: POST response: @@ -25,74 +25,74 @@ interactions: content_length: -1 body: |+ event: response.created - data: {"type":"response.created","response":{"id":"resp_0b2d9e15e30cc24c0169b3196c0d788190a0b50cdad4bf9ac2","object":"response","created_at":1773345132,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"o4-mini-2025-04-16","output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":"medium","summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":0} + data: {"type":"response.created","response":{"id":"resp_0b86a26c238e40a9016a3c123bf5a4819e85647c55ab434a69","object":"response","created_at":1782321724,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"o4-mini-2025-04-16","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":"current_turn","effort":"medium","summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":0} event: response.in_progress - data: {"type":"response.in_progress","response":{"id":"resp_0b2d9e15e30cc24c0169b3196c0d788190a0b50cdad4bf9ac2","object":"response","created_at":1773345132,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"o4-mini-2025-04-16","output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":"medium","summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":1} + data: {"type":"response.in_progress","response":{"id":"resp_0b86a26c238e40a9016a3c123bf5a4819e85647c55ab434a69","object":"response","created_at":1782321724,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"o4-mini-2025-04-16","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":"current_turn","effort":"medium","summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":1} event: response.output_item.added - data: {"type":"response.output_item.added","item":{"id":"rs_0b2d9e15e30cc24c0169b3196ce5e8819083269391f141b5d6","type":"reasoning","summary":[]},"output_index":0,"sequence_number":2} + data: {"type":"response.output_item.added","item":{"id":"rs_0b86a26c238e40a9016a3c123d2a20819eb9a8dce83808a2ea","type":"reasoning","content":[],"summary":[]},"output_index":0,"sequence_number":2} event: response.output_item.done - data: {"type":"response.output_item.done","item":{"id":"rs_0b2d9e15e30cc24c0169b3196ce5e8819083269391f141b5d6","type":"reasoning","summary":[]},"output_index":0,"sequence_number":3} + data: {"type":"response.output_item.done","item":{"id":"rs_0b86a26c238e40a9016a3c123d2a20819eb9a8dce83808a2ea","type":"reasoning","content":[],"summary":[]},"output_index":0,"sequence_number":3} event: response.output_item.added - data: {"type":"response.output_item.added","item":{"id":"fc_0b2d9e15e30cc24c0169b3196db9c481908c9cb0991b0c06cc","type":"function_call","status":"in_progress","arguments":"","call_id":"call_0R0YWAhuIuRZsWqXR2GIwXaP","name":"weather"},"output_index":1,"sequence_number":4} + data: {"type":"response.output_item.added","item":{"id":"fc_0b86a26c238e40a9016a3c1240e7f0819ebc9c2535efaaf360","type":"function_call","status":"in_progress","arguments":"","call_id":"call_eK7Vcp3N6x11thqQ8JcD8HZq","name":"weather"},"output_index":1,"sequence_number":4} event: response.function_call_arguments.delta - data: {"type":"response.function_call_arguments.delta","delta":"{\"","item_id":"fc_0b2d9e15e30cc24c0169b3196db9c481908c9cb0991b0c06cc","obfuscation":"V2KWvGUmIo8E5h","output_index":1,"sequence_number":5} + data: {"type":"response.function_call_arguments.delta","delta":"{\"","item_id":"fc_0b86a26c238e40a9016a3c1240e7f0819ebc9c2535efaaf360","obfuscation":"rxNz76ysYfF6hH","output_index":1,"sequence_number":5} event: response.function_call_arguments.delta - data: {"type":"response.function_call_arguments.delta","delta":"location","item_id":"fc_0b2d9e15e30cc24c0169b3196db9c481908c9cb0991b0c06cc","obfuscation":"zWbPkSqT","output_index":1,"sequence_number":6} + data: {"type":"response.function_call_arguments.delta","delta":"location","item_id":"fc_0b86a26c238e40a9016a3c1240e7f0819ebc9c2535efaaf360","obfuscation":"8e0guMTZ","output_index":1,"sequence_number":6} event: response.function_call_arguments.delta - data: {"type":"response.function_call_arguments.delta","delta":"\":\"","item_id":"fc_0b2d9e15e30cc24c0169b3196db9c481908c9cb0991b0c06cc","obfuscation":"4Z37pG0NZyVBv","output_index":1,"sequence_number":7} + data: {"type":"response.function_call_arguments.delta","delta":"\":\"","item_id":"fc_0b86a26c238e40a9016a3c1240e7f0819ebc9c2535efaaf360","obfuscation":"EmIR1isnGap31","output_index":1,"sequence_number":7} event: response.function_call_arguments.delta - data: {"type":"response.function_call_arguments.delta","delta":"Flor","item_id":"fc_0b2d9e15e30cc24c0169b3196db9c481908c9cb0991b0c06cc","obfuscation":"2iYhF63IMlA2","output_index":1,"sequence_number":8} + data: {"type":"response.function_call_arguments.delta","delta":"Flor","item_id":"fc_0b86a26c238e40a9016a3c1240e7f0819ebc9c2535efaaf360","obfuscation":"DfmE1LBsAKoX","output_index":1,"sequence_number":8} event: response.function_call_arguments.delta - data: {"type":"response.function_call_arguments.delta","delta":"ence","item_id":"fc_0b2d9e15e30cc24c0169b3196db9c481908c9cb0991b0c06cc","obfuscation":"GWnVyiaBf8O0","output_index":1,"sequence_number":9} + data: {"type":"response.function_call_arguments.delta","delta":"ence","item_id":"fc_0b86a26c238e40a9016a3c1240e7f0819ebc9c2535efaaf360","obfuscation":"E9nmWTxoKGgj","output_index":1,"sequence_number":9} event: response.function_call_arguments.delta - data: {"type":"response.function_call_arguments.delta","delta":",","item_id":"fc_0b2d9e15e30cc24c0169b3196db9c481908c9cb0991b0c06cc","obfuscation":"JP3wiFV6SRekIws","output_index":1,"sequence_number":10} + data: {"type":"response.function_call_arguments.delta","delta":",","item_id":"fc_0b86a26c238e40a9016a3c1240e7f0819ebc9c2535efaaf360","obfuscation":"0S7XweTDMTstQTm","output_index":1,"sequence_number":10} event: response.function_call_arguments.delta - data: {"type":"response.function_call_arguments.delta","delta":" Italy","item_id":"fc_0b2d9e15e30cc24c0169b3196db9c481908c9cb0991b0c06cc","obfuscation":"qMpNcuQFEd","output_index":1,"sequence_number":11} + data: {"type":"response.function_call_arguments.delta","delta":" Italy","item_id":"fc_0b86a26c238e40a9016a3c1240e7f0819ebc9c2535efaaf360","obfuscation":"O0luNYG52j","output_index":1,"sequence_number":11} event: response.function_call_arguments.delta - data: {"type":"response.function_call_arguments.delta","delta":"\"}","item_id":"fc_0b2d9e15e30cc24c0169b3196db9c481908c9cb0991b0c06cc","obfuscation":"83BOsSAGLTiNQd","output_index":1,"sequence_number":12} + data: {"type":"response.function_call_arguments.delta","delta":"\"}","item_id":"fc_0b86a26c238e40a9016a3c1240e7f0819ebc9c2535efaaf360","obfuscation":"9oweT1BZZIfa8i","output_index":1,"sequence_number":12} event: response.function_call_arguments.done - data: {"type":"response.function_call_arguments.done","arguments":"{\"location\":\"Florence, Italy\"}","item_id":"fc_0b2d9e15e30cc24c0169b3196db9c481908c9cb0991b0c06cc","output_index":1,"sequence_number":13} + data: {"type":"response.function_call_arguments.done","arguments":"{\"location\":\"Florence, Italy\"}","item_id":"fc_0b86a26c238e40a9016a3c1240e7f0819ebc9c2535efaaf360","output_index":1,"sequence_number":13} event: response.output_item.done - data: {"type":"response.output_item.done","item":{"id":"fc_0b2d9e15e30cc24c0169b3196db9c481908c9cb0991b0c06cc","type":"function_call","status":"completed","arguments":"{\"location\":\"Florence, Italy\"}","call_id":"call_0R0YWAhuIuRZsWqXR2GIwXaP","name":"weather"},"output_index":1,"sequence_number":14} + data: {"type":"response.output_item.done","item":{"id":"fc_0b86a26c238e40a9016a3c1240e7f0819ebc9c2535efaaf360","type":"function_call","status":"completed","arguments":"{\"location\":\"Florence, Italy\"}","call_id":"call_eK7Vcp3N6x11thqQ8JcD8HZq","name":"weather"},"output_index":1,"sequence_number":14} event: response.completed - data: {"type":"response.completed","response":{"id":"resp_0b2d9e15e30cc24c0169b3196c0d788190a0b50cdad4bf9ac2","object":"response","created_at":1773345132,"status":"completed","background":false,"completed_at":1773345133,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"o4-mini-2025-04-16","output":[{"id":"rs_0b2d9e15e30cc24c0169b3196ce5e8819083269391f141b5d6","type":"reasoning","summary":[]},{"id":"fc_0b2d9e15e30cc24c0169b3196db9c481908c9cb0991b0c06cc","type":"function_call","status":"completed","arguments":"{\"location\":\"Florence, Italy\"}","call_id":"call_0R0YWAhuIuRZsWqXR2GIwXaP","name":"weather"}],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":"medium","summary":null},"safety_identifier":null,"service_tier":"default","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":{"input_tokens":60,"input_tokens_details":{"cached_tokens":0},"output_tokens":125,"output_tokens_details":{"reasoning_tokens":64},"total_tokens":185},"user":null,"metadata":{}},"sequence_number":15} + data: {"type":"response.completed","response":{"id":"resp_0b86a26c238e40a9016a3c123bf5a4819e85647c55ab434a69","object":"response","created_at":1782321724,"status":"completed","background":false,"completed_at":1782321729,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"o4-mini-2025-04-16","moderation":null,"output":[{"id":"rs_0b86a26c238e40a9016a3c123d2a20819eb9a8dce83808a2ea","type":"reasoning","content":[],"summary":[]},{"id":"fc_0b86a26c238e40a9016a3c1240e7f0819ebc9c2535efaaf360","type":"function_call","status":"completed","arguments":"{\"location\":\"Florence, Italy\"}","call_id":"call_eK7Vcp3N6x11thqQ8JcD8HZq","name":"weather"}],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":"current_turn","effort":"medium","summary":null},"safety_identifier":null,"service_tier":"default","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":{"input_tokens":60,"input_tokens_details":{"cached_tokens":0},"output_tokens":210,"output_tokens_details":{"reasoning_tokens":128},"total_tokens":270},"user":null,"metadata":{}},"sequence_number":15} headers: Content-Type: - text/event-stream; charset=utf-8 status: 200 OK code: 200 - duration: 619.772167ms + duration: 683.706542ms - id: 1 request: proto: HTTP/1.1 proto_major: 1 proto_minor: 1 - content_length: 737 + content_length: 725 host: "" - body: '{"max_output_tokens":4000,"store":false,"input":[{"content":"You are a helpful assistant","role":"developer"},{"content":[{"text":"What''s the weather in Florence,Italy?","type":"input_text"}],"role":"user"},{"arguments":"\"{\\\"location\\\":\\\"Florence, Italy\\\"}\"","call_id":"call_0R0YWAhuIuRZsWqXR2GIwXaP","name":"weather","type":"function_call"},{"call_id":"call_0R0YWAhuIuRZsWqXR2GIwXaP","output":"40 C","type":"function_call_output"}],"model":"o4-mini","tool_choice":"auto","tools":[{"strict":false,"parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"name":"weather","description":"Get weather information for a location","type":"function"}],"stream":true}' + body: '{"max_output_tokens":4000,"store":false,"input":[{"content":"You are a helpful assistant","role":"developer"},{"content":[{"text":"What''s the weather in Florence,Italy?","type":"input_text"}],"role":"user"},{"arguments":"{\"location\":\"Florence, Italy\"}","call_id":"call_eK7Vcp3N6x11thqQ8JcD8HZq","name":"weather","type":"function_call"},{"call_id":"call_eK7Vcp3N6x11thqQ8JcD8HZq","output":"40 C","type":"function_call_output"}],"model":"o4-mini","tool_choice":"auto","tools":[{"strict":false,"parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"name":"weather","description":"Get weather information for a location","type":"function"}],"stream":true}' headers: Accept: - application/json Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://api.openai.com/v1/responses method: POST response: @@ -102,140 +102,185 @@ interactions: content_length: -1 body: |+ event: response.created - data: {"type":"response.created","response":{"id":"resp_08de782ba11354070169b3196e16dc81a1abba20d8799c4c16","object":"response","created_at":1773345134,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"o4-mini-2025-04-16","output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":"medium","summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":0} + data: {"type":"response.created","response":{"id":"resp_0c6a6b7e377252c3016a3c12414544819cb4076cab0378fb3e","object":"response","created_at":1782321729,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"o4-mini-2025-04-16","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":"current_turn","effort":"medium","summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":0} event: response.in_progress - data: {"type":"response.in_progress","response":{"id":"resp_08de782ba11354070169b3196e16dc81a1abba20d8799c4c16","object":"response","created_at":1773345134,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"o4-mini-2025-04-16","output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":"medium","summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":1} + data: {"type":"response.in_progress","response":{"id":"resp_0c6a6b7e377252c3016a3c12414544819cb4076cab0378fb3e","object":"response","created_at":1782321729,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"o4-mini-2025-04-16","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":"current_turn","effort":"medium","summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":1} event: response.output_item.added - data: {"type":"response.output_item.added","item":{"id":"msg_08de782ba11354070169b3196e60b081a19273f52c2b743780","type":"message","status":"in_progress","content":[],"role":"assistant"},"output_index":0,"sequence_number":2} + data: {"type":"response.output_item.added","item":{"id":"msg_0c6a6b7e377252c3016a3c124225bc819c827b89235d940d43","type":"message","status":"in_progress","content":[],"role":"assistant"},"output_index":0,"sequence_number":2} event: response.content_part.added - data: {"type":"response.content_part.added","content_index":0,"item_id":"msg_08de782ba11354070169b3196e60b081a19273f52c2b743780","output_index":0,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":""},"sequence_number":3} + data: {"type":"response.content_part.added","content_index":0,"item_id":"msg_0c6a6b7e377252c3016a3c124225bc819c827b89235d940d43","output_index":0,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":""},"sequence_number":3} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":"The","item_id":"msg_08de782ba11354070169b3196e60b081a19273f52c2b743780","logprobs":[],"obfuscation":"JU8EPBlHH8GB5","output_index":0,"sequence_number":4} + data: {"type":"response.output_text.delta","content_index":0,"delta":"The","item_id":"msg_0c6a6b7e377252c3016a3c124225bc819c827b89235d940d43","logprobs":[],"obfuscation":"vD1D221yQ7YrM","output_index":0,"sequence_number":4} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" current","item_id":"msg_08de782ba11354070169b3196e60b081a19273f52c2b743780","logprobs":[],"obfuscation":"ZlV7S9Ms","output_index":0,"sequence_number":5} + data: {"type":"response.output_text.delta","content_index":0,"delta":" current","item_id":"msg_0c6a6b7e377252c3016a3c124225bc819c827b89235d940d43","logprobs":[],"obfuscation":"3ZdE9qzs","output_index":0,"sequence_number":5} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" temperature","item_id":"msg_08de782ba11354070169b3196e60b081a19273f52c2b743780","logprobs":[],"obfuscation":"nj4Y","output_index":0,"sequence_number":6} + data: {"type":"response.output_text.delta","content_index":0,"delta":" temperature","item_id":"msg_0c6a6b7e377252c3016a3c124225bc819c827b89235d940d43","logprobs":[],"obfuscation":"n1Rt","output_index":0,"sequence_number":6} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" in","item_id":"msg_08de782ba11354070169b3196e60b081a19273f52c2b743780","logprobs":[],"obfuscation":"ZThcImK6I72f1","output_index":0,"sequence_number":7} + data: {"type":"response.output_text.delta","content_index":0,"delta":" in","item_id":"msg_0c6a6b7e377252c3016a3c124225bc819c827b89235d940d43","logprobs":[],"obfuscation":"viWI57Y433E6B","output_index":0,"sequence_number":7} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" Florence","item_id":"msg_08de782ba11354070169b3196e60b081a19273f52c2b743780","logprobs":[],"obfuscation":"EflhRMi","output_index":0,"sequence_number":8} + data: {"type":"response.output_text.delta","content_index":0,"delta":" Florence","item_id":"msg_0c6a6b7e377252c3016a3c124225bc819c827b89235d940d43","logprobs":[],"obfuscation":"J47JMpB","output_index":0,"sequence_number":8} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":",","item_id":"msg_08de782ba11354070169b3196e60b081a19273f52c2b743780","logprobs":[],"obfuscation":"RKZg2aOiCgrTbLM","output_index":0,"sequence_number":9} + data: {"type":"response.output_text.delta","content_index":0,"delta":",","item_id":"msg_0c6a6b7e377252c3016a3c124225bc819c827b89235d940d43","logprobs":[],"obfuscation":"y8Nle1hEg21tpgx","output_index":0,"sequence_number":9} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" Italy","item_id":"msg_08de782ba11354070169b3196e60b081a19273f52c2b743780","logprobs":[],"obfuscation":"kWzxT4Xqql","output_index":0,"sequence_number":10} + data: {"type":"response.output_text.delta","content_index":0,"delta":" Italy","item_id":"msg_0c6a6b7e377252c3016a3c124225bc819c827b89235d940d43","logprobs":[],"obfuscation":"nkT28Mm14r","output_index":0,"sequence_number":10} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" is","item_id":"msg_08de782ba11354070169b3196e60b081a19273f52c2b743780","logprobs":[],"obfuscation":"FFVSuGBvlfTzu","output_index":0,"sequence_number":11} + data: {"type":"response.output_text.delta","content_index":0,"delta":" is","item_id":"msg_0c6a6b7e377252c3016a3c124225bc819c827b89235d940d43","logprobs":[],"obfuscation":"8YayVT9oDr70x","output_index":0,"sequence_number":11} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" about","item_id":"msg_08de782ba11354070169b3196e60b081a19273f52c2b743780","logprobs":[],"obfuscation":"Z5qvetse5o","output_index":0,"sequence_number":12} + data: {"type":"response.output_text.delta","content_index":0,"delta":" ","item_id":"msg_0c6a6b7e377252c3016a3c124225bc819c827b89235d940d43","logprobs":[],"obfuscation":"LroJ3ypPqnUWzSD","output_index":0,"sequence_number":12} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" ","item_id":"msg_08de782ba11354070169b3196e60b081a19273f52c2b743780","logprobs":[],"obfuscation":"350hRrlhypxWN9P","output_index":0,"sequence_number":13} + data: {"type":"response.output_text.delta","content_index":0,"delta":"40","item_id":"msg_0c6a6b7e377252c3016a3c124225bc819c827b89235d940d43","logprobs":[],"obfuscation":"LO2cFNheuWAbMf","output_index":0,"sequence_number":13} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":"40","item_id":"msg_08de782ba11354070169b3196e60b081a19273f52c2b743780","logprobs":[],"obfuscation":"wpFsSDsIvoTyYu","output_index":0,"sequence_number":14} + data: {"type":"response.output_text.delta","content_index":0,"delta":" ","item_id":"msg_0c6a6b7e377252c3016a3c124225bc819c827b89235d940d43","logprobs":[],"obfuscation":"E9Mko6ctYY2nCqi","output_index":0,"sequence_number":14} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":"°C","item_id":"msg_08de782ba11354070169b3196e60b081a19273f52c2b743780","logprobs":[],"obfuscation":"OqUkVjr58LVk07","output_index":0,"sequence_number":15} + data: {"type":"response.output_text.delta","content_index":0,"delta":"°C","item_id":"msg_0c6a6b7e377252c3016a3c124225bc819c827b89235d940d43","logprobs":[],"obfuscation":"VzkyrlvzHVKOnk","output_index":0,"sequence_number":15} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":".","item_id":"msg_08de782ba11354070169b3196e60b081a19273f52c2b743780","logprobs":[],"obfuscation":"bxwfCVyrqeGCyPH","output_index":0,"sequence_number":16} + data: {"type":"response.output_text.delta","content_index":0,"delta":".","item_id":"msg_0c6a6b7e377252c3016a3c124225bc819c827b89235d940d43","logprobs":[],"obfuscation":"QEDCG0WnRPnAfgC","output_index":0,"sequence_number":16} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" It","item_id":"msg_08de782ba11354070169b3196e60b081a19273f52c2b743780","logprobs":[],"obfuscation":"b0HO4B4LBNdq4","output_index":0,"sequence_number":17} + data: {"type":"response.output_text.delta","content_index":0,"delta":" It","item_id":"msg_0c6a6b7e377252c3016a3c124225bc819c827b89235d940d43","logprobs":[],"obfuscation":"xmOGWFn51jHYI","output_index":0,"sequence_number":17} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":"’s","item_id":"msg_08de782ba11354070169b3196e60b081a19273f52c2b743780","logprobs":[],"obfuscation":"32fhW5tCmAFj2G","output_index":0,"sequence_number":18} + data: {"type":"response.output_text.delta","content_index":0,"delta":"’s","item_id":"msg_0c6a6b7e377252c3016a3c124225bc819c827b89235d940d43","logprobs":[],"obfuscation":"jOI2UtLxy0Rehf","output_index":0,"sequence_number":18} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" quite","item_id":"msg_08de782ba11354070169b3196e60b081a19273f52c2b743780","logprobs":[],"obfuscation":"FaoYzC3Um5","output_index":0,"sequence_number":19} + data: {"type":"response.output_text.delta","content_index":0,"delta":" quite","item_id":"msg_0c6a6b7e377252c3016a3c124225bc819c827b89235d940d43","logprobs":[],"obfuscation":"vO7wImJS7b","output_index":0,"sequence_number":19} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" hot","item_id":"msg_08de782ba11354070169b3196e60b081a19273f52c2b743780","logprobs":[],"obfuscation":"KOi5UpyiW7Js","output_index":0,"sequence_number":20} + data: {"type":"response.output_text.delta","content_index":0,"delta":" hot","item_id":"msg_0c6a6b7e377252c3016a3c124225bc819c827b89235d940d43","logprobs":[],"obfuscation":"gDvroKF8TgUn","output_index":0,"sequence_number":20} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":"—","item_id":"msg_08de782ba11354070169b3196e60b081a19273f52c2b743780","logprobs":[],"obfuscation":"EeBS0vS74e8v8Xy","output_index":0,"sequence_number":21} + data: {"type":"response.output_text.delta","content_index":0,"delta":"—","item_id":"msg_0c6a6b7e377252c3016a3c124225bc819c827b89235d940d43","logprobs":[],"obfuscation":"jwZsZkRTgTcXaIR","output_index":0,"sequence_number":21} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":"remember","item_id":"msg_08de782ba11354070169b3196e60b081a19273f52c2b743780","logprobs":[],"obfuscation":"2WFgm8bQ","output_index":0,"sequence_number":22} + data: {"type":"response.output_text.delta","content_index":0,"delta":"be","item_id":"msg_0c6a6b7e377252c3016a3c124225bc819c827b89235d940d43","logprobs":[],"obfuscation":"iLGhOqLGnd3K9x","output_index":0,"sequence_number":22} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" to","item_id":"msg_08de782ba11354070169b3196e60b081a19273f52c2b743780","logprobs":[],"obfuscation":"YZiWBalVKO9Xz","output_index":0,"sequence_number":23} + data: {"type":"response.output_text.delta","content_index":0,"delta":" sure","item_id":"msg_0c6a6b7e377252c3016a3c124225bc819c827b89235d940d43","logprobs":[],"obfuscation":"i1KnLiASbhW","output_index":0,"sequence_number":23} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" stay","item_id":"msg_08de782ba11354070169b3196e60b081a19273f52c2b743780","logprobs":[],"obfuscation":"xJkgiZLtFuQ","output_index":0,"sequence_number":24} + data: {"type":"response.output_text.delta","content_index":0,"delta":" to","item_id":"msg_0c6a6b7e377252c3016a3c124225bc819c827b89235d940d43","logprobs":[],"obfuscation":"bd9J9de2w5Vf5","output_index":0,"sequence_number":24} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" hydrated","item_id":"msg_08de782ba11354070169b3196e60b081a19273f52c2b743780","logprobs":[],"obfuscation":"uYWGxjQ","output_index":0,"sequence_number":25} + data: {"type":"response.output_text.delta","content_index":0,"delta":" stay","item_id":"msg_0c6a6b7e377252c3016a3c124225bc819c827b89235d940d43","logprobs":[],"obfuscation":"HoNX9G598AP","output_index":0,"sequence_number":25} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":",","item_id":"msg_08de782ba11354070169b3196e60b081a19273f52c2b743780","logprobs":[],"obfuscation":"1ADd724q4QNKiJ5","output_index":0,"sequence_number":26} + data: {"type":"response.output_text.delta","content_index":0,"delta":" hydrated","item_id":"msg_0c6a6b7e377252c3016a3c124225bc819c827b89235d940d43","logprobs":[],"obfuscation":"smmy25f","output_index":0,"sequence_number":26} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" wear","item_id":"msg_08de782ba11354070169b3196e60b081a19273f52c2b743780","logprobs":[],"obfuscation":"SkpZ0E2V3oD","output_index":0,"sequence_number":27} + data: {"type":"response.output_text.delta","content_index":0,"delta":",","item_id":"msg_0c6a6b7e377252c3016a3c124225bc819c827b89235d940d43","logprobs":[],"obfuscation":"nf23gsLO0iJrLwq","output_index":0,"sequence_number":27} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" light","item_id":"msg_08de782ba11354070169b3196e60b081a19273f52c2b743780","logprobs":[],"obfuscation":"2byKScOTnN","output_index":0,"sequence_number":28} + data: {"type":"response.output_text.delta","content_index":0,"delta":" seek","item_id":"msg_0c6a6b7e377252c3016a3c124225bc819c827b89235d940d43","logprobs":[],"obfuscation":"hBPVogAZFU1","output_index":0,"sequence_number":28} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" clothing","item_id":"msg_08de782ba11354070169b3196e60b081a19273f52c2b743780","logprobs":[],"obfuscation":"1adIwOW","output_index":0,"sequence_number":29} + data: {"type":"response.output_text.delta","content_index":0,"delta":" shade","item_id":"msg_0c6a6b7e377252c3016a3c124225bc819c827b89235d940d43","logprobs":[],"obfuscation":"SKeEzPzqDc","output_index":0,"sequence_number":29} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":",","item_id":"msg_08de782ba11354070169b3196e60b081a19273f52c2b743780","logprobs":[],"obfuscation":"Haf13NfGN9hvawa","output_index":0,"sequence_number":30} + data: {"type":"response.output_text.delta","content_index":0,"delta":",","item_id":"msg_0c6a6b7e377252c3016a3c124225bc819c827b89235d940d43","logprobs":[],"obfuscation":"0TFXSlDxzIVluml","output_index":0,"sequence_number":30} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" and","item_id":"msg_08de782ba11354070169b3196e60b081a19273f52c2b743780","logprobs":[],"obfuscation":"884RG6TssNku","output_index":0,"sequence_number":31} + data: {"type":"response.output_text.delta","content_index":0,"delta":" and","item_id":"msg_0c6a6b7e377252c3016a3c124225bc819c827b89235d940d43","logprobs":[],"obfuscation":"CLtx4OJQLai0","output_index":0,"sequence_number":31} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" avoid","item_id":"msg_08de782ba11354070169b3196e60b081a19273f52c2b743780","logprobs":[],"obfuscation":"XqrdmUrTuZ","output_index":0,"sequence_number":32} + data: {"type":"response.output_text.delta","content_index":0,"delta":" limit","item_id":"msg_0c6a6b7e377252c3016a3c124225bc819c827b89235d940d43","logprobs":[],"obfuscation":"aEioVedAD0","output_index":0,"sequence_number":32} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" being","item_id":"msg_08de782ba11354070169b3196e60b081a19273f52c2b743780","logprobs":[],"obfuscation":"K3TiQTQc8t","output_index":0,"sequence_number":33} + data: {"type":"response.output_text.delta","content_index":0,"delta":" outdoor","item_id":"msg_0c6a6b7e377252c3016a3c124225bc819c827b89235d940d43","logprobs":[],"obfuscation":"iyRLqWtT","output_index":0,"sequence_number":33} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" outdoors","item_id":"msg_08de782ba11354070169b3196e60b081a19273f52c2b743780","logprobs":[],"obfuscation":"PME5mq9","output_index":0,"sequence_number":34} + data: {"type":"response.output_text.delta","content_index":0,"delta":" activities","item_id":"msg_0c6a6b7e377252c3016a3c124225bc819c827b89235d940d43","logprobs":[],"obfuscation":"oSAIx","output_index":0,"sequence_number":34} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" during","item_id":"msg_08de782ba11354070169b3196e60b081a19273f52c2b743780","logprobs":[],"obfuscation":"gabGLyTtD","output_index":0,"sequence_number":35} + data: {"type":"response.output_text.delta","content_index":0,"delta":" during","item_id":"msg_0c6a6b7e377252c3016a3c124225bc819c827b89235d940d43","logprobs":[],"obfuscation":"oeT4pln2H","output_index":0,"sequence_number":35} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" peak","item_id":"msg_08de782ba11354070169b3196e60b081a19273f52c2b743780","logprobs":[],"obfuscation":"I8E5S1EzcRG","output_index":0,"sequence_number":36} + data: {"type":"response.output_text.delta","content_index":0,"delta":" peak","item_id":"msg_0c6a6b7e377252c3016a3c124225bc819c827b89235d940d43","logprobs":[],"obfuscation":"ha30WXqexR9","output_index":0,"sequence_number":36} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" afternoon","item_id":"msg_08de782ba11354070169b3196e60b081a19273f52c2b743780","logprobs":[],"obfuscation":"3P4dqY","output_index":0,"sequence_number":37} + data: {"type":"response.output_text.delta","content_index":0,"delta":" afternoon","item_id":"msg_0c6a6b7e377252c3016a3c124225bc819c827b89235d940d43","logprobs":[],"obfuscation":"yeVDb8","output_index":0,"sequence_number":37} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" heat","item_id":"msg_08de782ba11354070169b3196e60b081a19273f52c2b743780","logprobs":[],"obfuscation":"ZOTg5DOuohf","output_index":0,"sequence_number":38} + data: {"type":"response.output_text.delta","content_index":0,"delta":" hours","item_id":"msg_0c6a6b7e377252c3016a3c124225bc819c827b89235d940d43","logprobs":[],"obfuscation":"o3WuJUQCFZ","output_index":0,"sequence_number":38} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":".","item_id":"msg_08de782ba11354070169b3196e60b081a19273f52c2b743780","logprobs":[],"obfuscation":"bVaiQ8BOr9D0Oq5","output_index":0,"sequence_number":39} + data: {"type":"response.output_text.delta","content_index":0,"delta":".","item_id":"msg_0c6a6b7e377252c3016a3c124225bc819c827b89235d940d43","logprobs":[],"obfuscation":"nmqEokf7l8aGO69","output_index":0,"sequence_number":39} + + event: response.output_text.delta + data: {"type":"response.output_text.delta","content_index":0,"delta":" Let","item_id":"msg_0c6a6b7e377252c3016a3c124225bc819c827b89235d940d43","logprobs":[],"obfuscation":"iCtkUK7VCQnI","output_index":0,"sequence_number":40} + + event: response.output_text.delta + data: {"type":"response.output_text.delta","content_index":0,"delta":" me","item_id":"msg_0c6a6b7e377252c3016a3c124225bc819c827b89235d940d43","logprobs":[],"obfuscation":"53T4jzW1WoxpY","output_index":0,"sequence_number":41} + + event: response.output_text.delta + data: {"type":"response.output_text.delta","content_index":0,"delta":" know","item_id":"msg_0c6a6b7e377252c3016a3c124225bc819c827b89235d940d43","logprobs":[],"obfuscation":"pEBsByt1Epj","output_index":0,"sequence_number":42} + + event: response.output_text.delta + data: {"type":"response.output_text.delta","content_index":0,"delta":" if","item_id":"msg_0c6a6b7e377252c3016a3c124225bc819c827b89235d940d43","logprobs":[],"obfuscation":"gIHYpgQNuStDX","output_index":0,"sequence_number":43} + + event: response.output_text.delta + data: {"type":"response.output_text.delta","content_index":0,"delta":" you","item_id":"msg_0c6a6b7e377252c3016a3c124225bc819c827b89235d940d43","logprobs":[],"obfuscation":"x5syys0y5rk5","output_index":0,"sequence_number":44} + + event: response.output_text.delta + data: {"type":"response.output_text.delta","content_index":0,"delta":" need","item_id":"msg_0c6a6b7e377252c3016a3c124225bc819c827b89235d940d43","logprobs":[],"obfuscation":"LAtxmf4GByv","output_index":0,"sequence_number":45} + + event: response.output_text.delta + data: {"type":"response.output_text.delta","content_index":0,"delta":" a","item_id":"msg_0c6a6b7e377252c3016a3c124225bc819c827b89235d940d43","logprobs":[],"obfuscation":"ODeMQY8NEIUUIS","output_index":0,"sequence_number":46} + + event: response.output_text.delta + data: {"type":"response.output_text.delta","content_index":0,"delta":" more","item_id":"msg_0c6a6b7e377252c3016a3c124225bc819c827b89235d940d43","logprobs":[],"obfuscation":"ouVAFeyzkKX","output_index":0,"sequence_number":47} + + event: response.output_text.delta + data: {"type":"response.output_text.delta","content_index":0,"delta":" detailed","item_id":"msg_0c6a6b7e377252c3016a3c124225bc819c827b89235d940d43","logprobs":[],"obfuscation":"mdMOJte","output_index":0,"sequence_number":48} + + event: response.output_text.delta + data: {"type":"response.output_text.delta","content_index":0,"delta":" forecast","item_id":"msg_0c6a6b7e377252c3016a3c124225bc819c827b89235d940d43","logprobs":[],"obfuscation":"A0v21R0","output_index":0,"sequence_number":49} + + event: response.output_text.delta + data: {"type":"response.output_text.delta","content_index":0,"delta":" or","item_id":"msg_0c6a6b7e377252c3016a3c124225bc819c827b89235d940d43","logprobs":[],"obfuscation":"9Z53cGhxwlOxC","output_index":0,"sequence_number":50} + + event: response.output_text.delta + data: {"type":"response.output_text.delta","content_index":0,"delta":" any","item_id":"msg_0c6a6b7e377252c3016a3c124225bc819c827b89235d940d43","logprobs":[],"obfuscation":"BSnzdO0aQX3w","output_index":0,"sequence_number":51} + + event: response.output_text.delta + data: {"type":"response.output_text.delta","content_index":0,"delta":" other","item_id":"msg_0c6a6b7e377252c3016a3c124225bc819c827b89235d940d43","logprobs":[],"obfuscation":"9kGa6R4hkC","output_index":0,"sequence_number":52} + + event: response.output_text.delta + data: {"type":"response.output_text.delta","content_index":0,"delta":" info","item_id":"msg_0c6a6b7e377252c3016a3c124225bc819c827b89235d940d43","logprobs":[],"obfuscation":"NdCZ0QN7B00","output_index":0,"sequence_number":53} + + event: response.output_text.delta + data: {"type":"response.output_text.delta","content_index":0,"delta":"!","item_id":"msg_0c6a6b7e377252c3016a3c124225bc819c827b89235d940d43","logprobs":[],"obfuscation":"Mk1gADwdhPgLj9v","output_index":0,"sequence_number":54} event: response.output_text.done - data: {"type":"response.output_text.done","content_index":0,"item_id":"msg_08de782ba11354070169b3196e60b081a19273f52c2b743780","logprobs":[],"output_index":0,"sequence_number":40,"text":"The current temperature in Florence, Italy is about 40°C. It’s quite hot—remember to stay hydrated, wear light clothing, and avoid being outdoors during peak afternoon heat."} + data: {"type":"response.output_text.done","content_index":0,"item_id":"msg_0c6a6b7e377252c3016a3c124225bc819c827b89235d940d43","logprobs":[],"output_index":0,"sequence_number":55,"text":"The current temperature in Florence, Italy is 40 °C. It’s quite hot—be sure to stay hydrated, seek shade, and limit outdoor activities during peak afternoon hours. Let me know if you need a more detailed forecast or any other info!"} event: response.content_part.done - data: {"type":"response.content_part.done","content_index":0,"item_id":"msg_08de782ba11354070169b3196e60b081a19273f52c2b743780","output_index":0,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":"The current temperature in Florence, Italy is about 40°C. It’s quite hot—remember to stay hydrated, wear light clothing, and avoid being outdoors during peak afternoon heat."},"sequence_number":41} + data: {"type":"response.content_part.done","content_index":0,"item_id":"msg_0c6a6b7e377252c3016a3c124225bc819c827b89235d940d43","output_index":0,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":"The current temperature in Florence, Italy is 40 °C. It’s quite hot—be sure to stay hydrated, seek shade, and limit outdoor activities during peak afternoon hours. Let me know if you need a more detailed forecast or any other info!"},"sequence_number":56} event: response.output_item.done - data: {"type":"response.output_item.done","item":{"id":"msg_08de782ba11354070169b3196e60b081a19273f52c2b743780","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"The current temperature in Florence, Italy is about 40°C. It’s quite hot—remember to stay hydrated, wear light clothing, and avoid being outdoors during peak afternoon heat."}],"role":"assistant"},"output_index":0,"sequence_number":42} + data: {"type":"response.output_item.done","item":{"id":"msg_0c6a6b7e377252c3016a3c124225bc819c827b89235d940d43","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"The current temperature in Florence, Italy is 40 °C. It’s quite hot—be sure to stay hydrated, seek shade, and limit outdoor activities during peak afternoon hours. Let me know if you need a more detailed forecast or any other info!"}],"role":"assistant"},"output_index":0,"sequence_number":57} event: response.completed - data: {"type":"response.completed","response":{"id":"resp_08de782ba11354070169b3196e16dc81a1abba20d8799c4c16","object":"response","created_at":1773345134,"status":"completed","background":false,"completed_at":1773345134,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"o4-mini-2025-04-16","output":[{"id":"msg_08de782ba11354070169b3196e60b081a19273f52c2b743780","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"The current temperature in Florence, Italy is about 40°C. It’s quite hot—remember to stay hydrated, wear light clothing, and avoid being outdoors during peak afternoon heat."}],"role":"assistant"}],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":"medium","summary":null},"safety_identifier":null,"service_tier":"default","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":{"input_tokens":91,"input_tokens_details":{"cached_tokens":0},"output_tokens":40,"output_tokens_details":{"reasoning_tokens":0},"total_tokens":131},"user":null,"metadata":{}},"sequence_number":43} + data: {"type":"response.completed","response":{"id":"resp_0c6a6b7e377252c3016a3c12414544819cb4076cab0378fb3e","object":"response","created_at":1782321729,"status":"completed","background":false,"completed_at":1782321730,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"o4-mini-2025-04-16","moderation":null,"output":[{"id":"msg_0c6a6b7e377252c3016a3c124225bc819c827b89235d940d43","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"The current temperature in Florence, Italy is 40 °C. It’s quite hot—be sure to stay hydrated, seek shade, and limit outdoor activities during peak afternoon hours. Let me know if you need a more detailed forecast or any other info!"}],"role":"assistant"}],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":"current_turn","effort":"medium","summary":null},"safety_identifier":null,"service_tier":"default","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":{"input_tokens":89,"input_tokens_details":{"cached_tokens":0},"output_tokens":55,"output_tokens_details":{"reasoning_tokens":0},"total_tokens":144},"user":null,"metadata":{}},"sequence_number":58} headers: Content-Type: - text/event-stream; charset=utf-8 status: 200 OK code: 200 - duration: 225.696625ms + duration: 300.754667ms diff --git a/providertests/testdata/TestOpenAIResponsesWithSummaryThinking/openai-gpt-5/thinking-streaming.yaml b/providertests/testdata/TestOpenAIResponsesWithSummaryThinking/openai-gpt-5/thinking-streaming.yaml index c943edca7..e618b8356 100644 --- a/providertests/testdata/TestOpenAIResponsesWithSummaryThinking/openai-gpt-5/thinking-streaming.yaml +++ b/providertests/testdata/TestOpenAIResponsesWithSummaryThinking/openai-gpt-5/thinking-streaming.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://api.openai.com/v1/responses method: POST response: @@ -25,362 +25,308 @@ interactions: content_length: -1 body: |+ event: response.created - data: {"type":"response.created","response":{"id":"resp_0ccfefab56fc1e6b0169b3197f938081919413a2656e175d4d","object":"response","created_at":1773345151,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":null,"max_tool_calls":null,"model":"gpt-5-2025-08-07","output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":"high","summary":"detailed"},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":0} + data: {"type":"response.created","response":{"id":"resp_017e85da2ae23b69016a3c12518cc0819da56cbbdd33f128f3","object":"response","created_at":1782321745,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":null,"max_tool_calls":null,"model":"gpt-5-2025-08-07","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":"current_turn","effort":"high","summary":"detailed"},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":0} event: response.in_progress - data: {"type":"response.in_progress","response":{"id":"resp_0ccfefab56fc1e6b0169b3197f938081919413a2656e175d4d","object":"response","created_at":1773345151,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":null,"max_tool_calls":null,"model":"gpt-5-2025-08-07","output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":"high","summary":"detailed"},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":1} + data: {"type":"response.in_progress","response":{"id":"resp_017e85da2ae23b69016a3c12518cc0819da56cbbdd33f128f3","object":"response","created_at":1782321745,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":null,"max_tool_calls":null,"model":"gpt-5-2025-08-07","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":"current_turn","effort":"high","summary":"detailed"},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":1} event: response.output_item.added - data: {"type":"response.output_item.added","item":{"id":"rs_0ccfefab56fc1e6b0169b3197fec948191a5128b289bd3abd7","type":"reasoning","encrypted_content":"gAAAAABpsxl_yV8A68uHGe_5NFByLGg0aQFfiez_MlTK4CqH7M7ggUstkIPpnHaMbPFVdcobD1ZZy2MYigBVV-8Zornn3d3wHBC5_vpFlyy1O1veu1vqKpwD2W7ndqH3J2hdiV_BspR6q3LrY7ioEU_-vs0lCcJxPkf8mtwdflfiB99foqC5MM8s53paHZSQF3XjLHPOkAfD6xstcU6nHMM00NGcD0iG-OcUZVD_92mPPaIZaehoZpSmD2_m4U3NPR7xoGCuHwvFcA4y7qhzjUvkCSb0onjtTTpmePp38fhPzxEOQwZblNmdcseRA5-mMCzm7j67K03Ieftkj7T6m_JFY86XOdeMn0SyXKq3U3v3tWyXuLdQTRRE_70kZTBLoK4cR2JG-TkPHTYg33o9VYn2ePv6hKFFCBu1DcSfGWz0MU-40W1CccKvHh_xoHlmdNxfWychcekNA42EWGYRH3R6LPCeFINWfmy7Hbej_q4lH135At4_VdE6gkTwZPWRgV6KnK_wcTgGmNkW6oY8qwFb4dmZYb4QgFH8_jPsacvIWHv7zIqJeJFs3bvJt-7ZcKOeBWmHpUUyWuGjxID36HH3LSwDPc2Scc1iJOfdcszxmCnLHIiu9Br-90u9n_BVvwxl88SQO50t4yu5P-9fX1JFeHyfHTu_c1n8xBqO1ZgKMu_Z-bhZ63LpsXClx20W4vDKgfUZRYa3HKhmEjttDY0YWeEAsUsgJyJGDqkcel_0AgRyUaSCx-xtP6mQOoNQA8H770UbZLtShb7otktAc7M5FUM3pTodAp_Xr2rdAD4OAIpqgvyPPvT8-ma2vrGUdQr_NIKj9Z58","summary":[]},"output_index":0,"sequence_number":2} + data: {"type":"response.output_item.added","item":{"id":"rs_017e85da2ae23b69016a3c1251dcec819daf72930a854fd4d1","type":"reasoning","content":[],"encrypted_content":"gAAAAABqPBJRAhmec86Fy9tP-ivVhrv0x9ECGIiqBAfx7OXcUgKd9ho8SvUUUilI37luuawhXJw_LMabXdj3nuPiS9CQVA05zkF6OOO4s_4gQesGvvU11tf2Dj5Iv8veg_Ols7RFhSzoU-DuCjiKbr1RPyEvNWuKOcP1yNOw8gv6qREPEFigmdQLcHa_qgFUtXo6aWfP8_hvvBU50KPC2QtvEqB7ls2UehGkIyeAwv1LP2o1q7VBxTTcU-o7D3r9jH0FEoykiIgSzMaacN1GstTHMF4Oepho81GYojBfS-uFqj_trhMplvFpgHvW-Rl8u0MSdf0mqLtpsOKNlQrCwpF8lbNeyxbMx9ywPshtcXy_WuxUM43fVlvco_2_dBEZIVRID7H-4Ul3nhEx9VLfR1wHfLTWjqriGAj_pE3J0UfNAD4_ITG45S_xBQvc73_oL3A2Q4_M0eXzx_yh9vjvay6d7X18GcxCfF2jUSHJvmL_11o44v_zTOUWHFuE5VJ4x27Xxtc5sfbcl_5A7LS5g56I2tas4OuAeg-iXE5RkiXQahPVi7xGAnD_hELI_9zaJ7nHchqqOQRgU6IVdMNFoy3qUmuXFitsOi81BG6lMWThJxuqhGdK4r9bsIuotmk_9BzsW7JzPguAMZ6HGNwcQGNnL0ugZwDj04O6CQooakN4_agASXVG8mtKQW5k2_wZ9siYfuSdTfbG4S-DXB8ZLFy7-szf8x0xIChSDohKdS5BovGkdO7IG0pc8wr40W1oqLLOtXxyw3yB7Ynjp8JWF0mUclv4Q0yfOh5jG9uoXyIVVO73HAtxseT5Oqu6mXt2Ihm8FHMNkJnJYnRBjaBxXOHMax-_BNUnh7Accx7I8QLjrt7B9TwOAo6PbyPAMv2CGpw7r7_-7gxLZU-OfHYW5UC_Kw1uxi5Q4g==","summary":[]},"output_index":0,"sequence_number":2} event: response.reasoning_summary_part.added - data: {"type":"response.reasoning_summary_part.added","item_id":"rs_0ccfefab56fc1e6b0169b3197fec948191a5128b289bd3abd7","output_index":0,"part":{"type":"summary_text","text":""},"sequence_number":3,"summary_index":0} + data: {"type":"response.reasoning_summary_part.added","item_id":"rs_017e85da2ae23b69016a3c1251dcec819daf72930a854fd4d1","output_index":0,"part":{"type":"summary_text","text":""},"sequence_number":3,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":"**Retr","item_id":"rs_0ccfefab56fc1e6b0169b3197fec948191a5128b289bd3abd7","obfuscation":"JLhrY7VjCa","output_index":0,"sequence_number":4,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":"**Getting weather info**\n\nI","item_id":"rs_017e85da2ae23b69016a3c1251dcec819daf72930a854fd4d1","obfuscation":"xgdyp","output_index":0,"sequence_number":4,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":"ieving","item_id":"rs_0ccfefab56fc1e6b0169b3197fec948191a5128b289bd3abd7","obfuscation":"yL7MJBzPLS","output_index":0,"sequence_number":5,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" need","item_id":"rs_017e85da2ae23b69016a3c1251dcec819daf72930a854fd4d1","obfuscation":"y4lUv4u4YwO","output_index":0,"sequence_number":5,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" weather","item_id":"rs_0ccfefab56fc1e6b0169b3197fec948191a5128b289bd3abd7","obfuscation":"1x51m9v3","output_index":0,"sequence_number":6,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" to","item_id":"rs_017e85da2ae23b69016a3c1251dcec819daf72930a854fd4d1","obfuscation":"lliOCc2dfXwA6","output_index":0,"sequence_number":6,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" for","item_id":"rs_0ccfefab56fc1e6b0169b3197fec948191a5128b289bd3abd7","obfuscation":"QpCpn7NqBSel","output_index":0,"sequence_number":7,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" respond","item_id":"rs_017e85da2ae23b69016a3c1251dcec819daf72930a854fd4d1","obfuscation":"D6GXM0Jm","output_index":0,"sequence_number":7,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" Florence","item_id":"rs_0ccfefab56fc1e6b0169b3197fec948191a5128b289bd3abd7","obfuscation":"rT7kl4t","output_index":0,"sequence_number":8,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" to","item_id":"rs_017e85da2ae23b69016a3c1251dcec819daf72930a854fd4d1","obfuscation":"yl9uf5ygzKTZb","output_index":0,"sequence_number":8,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":"**\n\nI","item_id":"rs_0ccfefab56fc1e6b0169b3197fec948191a5128b289bd3abd7","obfuscation":"1NS2I2dzdYE","output_index":0,"sequence_number":9,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" the","item_id":"rs_017e85da2ae23b69016a3c1251dcec819daf72930a854fd4d1","obfuscation":"HxTq2wtPseI3","output_index":0,"sequence_number":9,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" need","item_id":"rs_0ccfefab56fc1e6b0169b3197fec948191a5128b289bd3abd7","obfuscation":"TPv7B0VWpQv","output_index":0,"sequence_number":10,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" user's","item_id":"rs_017e85da2ae23b69016a3c1251dcec819daf72930a854fd4d1","obfuscation":"KxuNsGfuv","output_index":0,"sequence_number":10,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" to","item_id":"rs_0ccfefab56fc1e6b0169b3197fec948191a5128b289bd3abd7","obfuscation":"wJComQ4Jy83KZ","output_index":0,"sequence_number":11,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" question","item_id":"rs_017e85da2ae23b69016a3c1251dcec819daf72930a854fd4d1","obfuscation":"YpEYMAR","output_index":0,"sequence_number":11,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" answer","item_id":"rs_0ccfefab56fc1e6b0169b3197fec948191a5128b289bd3abd7","obfuscation":"T8qudhXf0","output_index":0,"sequence_number":12,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" about","item_id":"rs_017e85da2ae23b69016a3c1251dcec819daf72930a854fd4d1","obfuscation":"Z2MjMte16I","output_index":0,"sequence_number":12,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" the","item_id":"rs_0ccfefab56fc1e6b0169b3197fec948191a5128b289bd3abd7","obfuscation":"CWMwHKY1tKkn","output_index":0,"sequence_number":13,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" the","item_id":"rs_017e85da2ae23b69016a3c1251dcec819daf72930a854fd4d1","obfuscation":"HIYMsff3dXzU","output_index":0,"sequence_number":13,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" user's","item_id":"rs_0ccfefab56fc1e6b0169b3197fec948191a5128b289bd3abd7","obfuscation":"oIFZWUHLO","output_index":0,"sequence_number":14,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" weather","item_id":"rs_017e85da2ae23b69016a3c1251dcec819daf72930a854fd4d1","obfuscation":"KaNae1xF","output_index":0,"sequence_number":14,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" question","item_id":"rs_0ccfefab56fc1e6b0169b3197fec948191a5128b289bd3abd7","obfuscation":"tkVSYFe","output_index":0,"sequence_number":15,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" in","item_id":"rs_017e85da2ae23b69016a3c1251dcec819daf72930a854fd4d1","obfuscation":"wkm1dJKj4SJT7","output_index":0,"sequence_number":15,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" about","item_id":"rs_0ccfefab56fc1e6b0169b3197fec948191a5128b289bd3abd7","obfuscation":"CuSb3FRYjo","output_index":0,"sequence_number":16,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" Florence","item_id":"rs_017e85da2ae23b69016a3c1251dcec819daf72930a854fd4d1","obfuscation":"i8WwDDK","output_index":0,"sequence_number":16,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" the","item_id":"rs_0ccfefab56fc1e6b0169b3197fec948191a5128b289bd3abd7","obfuscation":"ARF2Yn0lqVqp","output_index":0,"sequence_number":17,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":",","item_id":"rs_017e85da2ae23b69016a3c1251dcec819daf72930a854fd4d1","obfuscation":"lcshuRPtuOB8bOC","output_index":0,"sequence_number":17,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" weather","item_id":"rs_0ccfefab56fc1e6b0169b3197fec948191a5128b289bd3abd7","obfuscation":"zwLnG39h","output_index":0,"sequence_number":18,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" Italy","item_id":"rs_017e85da2ae23b69016a3c1251dcec819daf72930a854fd4d1","obfuscation":"Roa9XuRLK7","output_index":0,"sequence_number":18,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" in","item_id":"rs_0ccfefab56fc1e6b0169b3197fec948191a5128b289bd3abd7","obfuscation":"hMC1jIIrE9DOL","output_index":0,"sequence_number":19,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":".","item_id":"rs_017e85da2ae23b69016a3c1251dcec819daf72930a854fd4d1","obfuscation":"1v1JZBlVzbfHRC4","output_index":0,"sequence_number":19,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" Florence","item_id":"rs_0ccfefab56fc1e6b0169b3197fec948191a5128b289bd3abd7","obfuscation":"UV4Y779","output_index":0,"sequence_number":20,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" I'll","item_id":"rs_017e85da2ae23b69016a3c1251dcec819daf72930a854fd4d1","obfuscation":"1danWAtitRe","output_index":0,"sequence_number":20,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":",","item_id":"rs_0ccfefab56fc1e6b0169b3197fec948191a5128b289bd3abd7","obfuscation":"nJPI2ay0cQ8oAti","output_index":0,"sequence_number":21,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" use","item_id":"rs_017e85da2ae23b69016a3c1251dcec819daf72930a854fd4d1","obfuscation":"2Th4EywWoxz7","output_index":0,"sequence_number":21,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" Italy","item_id":"rs_0ccfefab56fc1e6b0169b3197fec948191a5128b289bd3abd7","obfuscation":"xluMuLKz2m","output_index":0,"sequence_number":22,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" the","item_id":"rs_017e85da2ae23b69016a3c1251dcec819daf72930a854fd4d1","obfuscation":"mlOxGkP6nfKD","output_index":0,"sequence_number":22,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":".","item_id":"rs_0ccfefab56fc1e6b0169b3197fec948191a5128b289bd3abd7","obfuscation":"7FAynvzZ5lbb2ZM","output_index":0,"sequence_number":23,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" weather","item_id":"rs_017e85da2ae23b69016a3c1251dcec819daf72930a854fd4d1","obfuscation":"JeJwEflS","output_index":0,"sequence_number":23,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" I","item_id":"rs_0ccfefab56fc1e6b0169b3197fec948191a5128b289bd3abd7","obfuscation":"eRYpaTH3Tj7As2","output_index":0,"sequence_number":24,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" tool","item_id":"rs_017e85da2ae23b69016a3c1251dcec819daf72930a854fd4d1","obfuscation":"E1rk48CkAmE","output_index":0,"sequence_number":24,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" have","item_id":"rs_0ccfefab56fc1e6b0169b3197fec948191a5128b289bd3abd7","obfuscation":"8m99E2mWhGZ","output_index":0,"sequence_number":25,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":",","item_id":"rs_017e85da2ae23b69016a3c1251dcec819daf72930a854fd4d1","obfuscation":"J2P8Ej3NDfYHCaj","output_index":0,"sequence_number":25,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" a","item_id":"rs_0ccfefab56fc1e6b0169b3197fec948191a5128b289bd3abd7","obfuscation":"oMOxdMVpC46Teo","output_index":0,"sequence_number":26,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" which","item_id":"rs_017e85da2ae23b69016a3c1251dcec819daf72930a854fd4d1","obfuscation":"iOhWZcyy3A","output_index":0,"sequence_number":26,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" function","item_id":"rs_0ccfefab56fc1e6b0169b3197fec948191a5128b289bd3abd7","obfuscation":"7IE6GGf","output_index":0,"sequence_number":27,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" requires","item_id":"rs_017e85da2ae23b69016a3c1251dcec819daf72930a854fd4d1","obfuscation":"7oixLvr","output_index":0,"sequence_number":27,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" to","item_id":"rs_0ccfefab56fc1e6b0169b3197fec948191a5128b289bd3abd7","obfuscation":"PMTtxErF1zihS","output_index":0,"sequence_number":28,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" the","item_id":"rs_017e85da2ae23b69016a3c1251dcec819daf72930a854fd4d1","obfuscation":"gIV0gimkyaaa","output_index":0,"sequence_number":28,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" get","item_id":"rs_0ccfefab56fc1e6b0169b3197fec948191a5128b289bd3abd7","obfuscation":"oRp4yx8NnNGy","output_index":0,"sequence_number":29,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" location","item_id":"rs_017e85da2ae23b69016a3c1251dcec819daf72930a854fd4d1","obfuscation":"b4i2ahR","output_index":0,"sequence_number":29,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" this","item_id":"rs_0ccfefab56fc1e6b0169b3197fec948191a5128b289bd3abd7","obfuscation":"eaBAHqZPK95","output_index":0,"sequence_number":30,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" string","item_id":"rs_017e85da2ae23b69016a3c1251dcec819daf72930a854fd4d1","obfuscation":"OHlqV86fB","output_index":0,"sequence_number":30,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" information","item_id":"rs_0ccfefab56fc1e6b0169b3197fec948191a5128b289bd3abd7","obfuscation":"V1ul","output_index":0,"sequence_number":31,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":".","item_id":"rs_017e85da2ae23b69016a3c1251dcec819daf72930a854fd4d1","obfuscation":"hN2r6evghMOCdKS","output_index":0,"sequence_number":31,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":",","item_id":"rs_0ccfefab56fc1e6b0169b3197fec948191a5128b289bd3abd7","obfuscation":"0NDN1u1puHqtWra","output_index":0,"sequence_number":32,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" According","item_id":"rs_017e85da2ae23b69016a3c1251dcec819daf72930a854fd4d1","obfuscation":"1rp4SC","output_index":0,"sequence_number":32,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" specifically","item_id":"rs_0ccfefab56fc1e6b0169b3197fec948191a5128b289bd3abd7","obfuscation":"X7P","output_index":0,"sequence_number":33,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" to","item_id":"rs_017e85da2ae23b69016a3c1251dcec819daf72930a854fd4d1","obfuscation":"ZEt4t1y975Axa","output_index":0,"sequence_number":33,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" the","item_id":"rs_0ccfefab56fc1e6b0169b3197fec948191a5128b289bd3abd7","obfuscation":"n1mfMguZs43a","output_index":0,"sequence_number":34,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" the","item_id":"rs_017e85da2ae23b69016a3c1251dcec819daf72930a854fd4d1","obfuscation":"Eb3bp9txig93","output_index":0,"sequence_number":34,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" functions","item_id":"rs_0ccfefab56fc1e6b0169b3197fec948191a5128b289bd3abd7","obfuscation":"JHwovh","output_index":0,"sequence_number":35,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" instructions","item_id":"rs_017e85da2ae23b69016a3c1251dcec819daf72930a854fd4d1","obfuscation":"AWG","output_index":0,"sequence_number":35,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":".weather","item_id":"rs_0ccfefab56fc1e6b0169b3197fec948191a5128b289bd3abd7","obfuscation":"56wItrr5","output_index":0,"sequence_number":36,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":",","item_id":"rs_017e85da2ae23b69016a3c1251dcec819daf72930a854fd4d1","obfuscation":"8GZkMDfrS79adsj","output_index":0,"sequence_number":36,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" tool","item_id":"rs_0ccfefab56fc1e6b0169b3197fec948191a5128b289bd3abd7","obfuscation":"aNjUMkSuY0M","output_index":0,"sequence_number":37,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" I","item_id":"rs_017e85da2ae23b69016a3c1251dcec819daf72930a854fd4d1","obfuscation":"EGv6qrVUIME62h","output_index":0,"sequence_number":37,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":",","item_id":"rs_0ccfefab56fc1e6b0169b3197fec948191a5128b289bd3abd7","obfuscation":"ms53f67wkgAA5o0","output_index":0,"sequence_number":38,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" can","item_id":"rs_017e85da2ae23b69016a3c1251dcec819daf72930a854fd4d1","obfuscation":"BWDcQY20sZx7","output_index":0,"sequence_number":38,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" which","item_id":"rs_0ccfefab56fc1e6b0169b3197fec948191a5128b289bd3abd7","obfuscation":"3owL62Hpzz","output_index":0,"sequence_number":39,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" call","item_id":"rs_017e85da2ae23b69016a3c1251dcec819daf72930a854fd4d1","obfuscation":"g26ymDjVnBh","output_index":0,"sequence_number":39,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" I'll","item_id":"rs_0ccfefab56fc1e6b0169b3197fec948191a5128b289bd3abd7","obfuscation":"tQ72LUFT26R","output_index":0,"sequence_number":40,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" functions","item_id":"rs_017e85da2ae23b69016a3c1251dcec819daf72930a854fd4d1","obfuscation":"8s29zU","output_index":0,"sequence_number":40,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" use","item_id":"rs_0ccfefab56fc1e6b0169b3197fec948191a5128b289bd3abd7","obfuscation":"kaMJcZmjRFJn","output_index":0,"sequence_number":41,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":".weather","item_id":"rs_017e85da2ae23b69016a3c1251dcec819daf72930a854fd4d1","obfuscation":"46U1feDT","output_index":0,"sequence_number":41,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" with","item_id":"rs_0ccfefab56fc1e6b0169b3197fec948191a5128b289bd3abd7","obfuscation":"6hJzKRLRlVH","output_index":0,"sequence_number":42,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" directly","item_id":"rs_017e85da2ae23b69016a3c1251dcec819daf72930a854fd4d1","obfuscation":"K0Rj0Ob","output_index":0,"sequence_number":42,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" the","item_id":"rs_0ccfefab56fc1e6b0169b3197fec948191a5128b289bd3abd7","obfuscation":"dknQbdLtftar","output_index":0,"sequence_number":43,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" since","item_id":"rs_017e85da2ae23b69016a3c1251dcec819daf72930a854fd4d1","obfuscation":"78UzycJtPt","output_index":0,"sequence_number":43,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" location","item_id":"rs_0ccfefab56fc1e6b0169b3197fec948191a5128b289bd3abd7","obfuscation":"VKlRK6S","output_index":0,"sequence_number":44,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" I","item_id":"rs_017e85da2ae23b69016a3c1251dcec819daf72930a854fd4d1","obfuscation":"cruE5F3Hk5WMPi","output_index":0,"sequence_number":44,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" \"","item_id":"rs_0ccfefab56fc1e6b0169b3197fec948191a5128b289bd3abd7","obfuscation":"bbo5lNlrV18T0q","output_index":0,"sequence_number":45,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" only","item_id":"rs_017e85da2ae23b69016a3c1251dcec819daf72930a854fd4d1","obfuscation":"SMURURHCNsG","output_index":0,"sequence_number":45,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":"Flor","item_id":"rs_0ccfefab56fc1e6b0169b3197fec948191a5128b289bd3abd7","obfuscation":"pNWZV4XrFets","output_index":0,"sequence_number":46,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" need","item_id":"rs_017e85da2ae23b69016a3c1251dcec819daf72930a854fd4d1","obfuscation":"qUNx8D1ZYNE","output_index":0,"sequence_number":46,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":"ence","item_id":"rs_0ccfefab56fc1e6b0169b3197fec948191a5128b289bd3abd7","obfuscation":"K5aUlzprGjDI","output_index":0,"sequence_number":47,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" one","item_id":"rs_017e85da2ae23b69016a3c1251dcec819daf72930a854fd4d1","obfuscation":"s2UDubQdREu0","output_index":0,"sequence_number":47,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":",","item_id":"rs_0ccfefab56fc1e6b0169b3197fec948191a5128b289bd3abd7","obfuscation":"LZp4hD7kujTFY4t","output_index":0,"sequence_number":48,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" tool","item_id":"rs_017e85da2ae23b69016a3c1251dcec819daf72930a854fd4d1","obfuscation":"xpmd1TMawwJ","output_index":0,"sequence_number":48,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" Italy","item_id":"rs_0ccfefab56fc1e6b0169b3197fec948191a5128b289bd3abd7","obfuscation":"xSwBKWgqzY","output_index":0,"sequence_number":49,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" for","item_id":"rs_017e85da2ae23b69016a3c1251dcec819daf72930a854fd4d1","obfuscation":"3OwIof4ZGBjU","output_index":0,"sequence_number":49,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":".\"","item_id":"rs_0ccfefab56fc1e6b0169b3197fec948191a5128b289bd3abd7","obfuscation":"xkneODnoS1wH2R","output_index":0,"sequence_number":50,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" this","item_id":"rs_017e85da2ae23b69016a3c1251dcec819daf72930a854fd4d1","obfuscation":"5Fy6FlRHB2H","output_index":0,"sequence_number":50,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" Since","item_id":"rs_0ccfefab56fc1e6b0169b3197fec948191a5128b289bd3abd7","obfuscation":"0MTVIVsd7w","output_index":0,"sequence_number":51,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" task","item_id":"rs_017e85da2ae23b69016a3c1251dcec819daf72930a854fd4d1","obfuscation":"fPEpfp9u4CQ","output_index":0,"sequence_number":51,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" I'm","item_id":"rs_0ccfefab56fc1e6b0169b3197fec948191a5128b289bd3abd7","obfuscation":"7SfpNkM9DcQb","output_index":0,"sequence_number":52,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":".","item_id":"rs_017e85da2ae23b69016a3c1251dcec819daf72930a854fd4d1","obfuscation":"R53KasPCdZO634w","output_index":0,"sequence_number":52,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" likely","item_id":"rs_0ccfefab56fc1e6b0169b3197fec948191a5128b289bd3abd7","obfuscation":"Oj9lHbOT9","output_index":0,"sequence_number":53,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" There's","item_id":"rs_017e85da2ae23b69016a3c1251dcec819daf72930a854fd4d1","obfuscation":"tnhiQ2iI","output_index":0,"sequence_number":53,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" only","item_id":"rs_0ccfefab56fc1e6b0169b3197fec948191a5128b289bd3abd7","obfuscation":"TOoUaB8ev8F","output_index":0,"sequence_number":54,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" no","item_id":"rs_017e85da2ae23b69016a3c1251dcec819daf72930a854fd4d1","obfuscation":"7oaMU6SPhZqEk","output_index":0,"sequence_number":54,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" needing","item_id":"rs_0ccfefab56fc1e6b0169b3197fec948191a5128b289bd3abd7","obfuscation":"VUwVOoaf","output_index":0,"sequence_number":55,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" need","item_id":"rs_017e85da2ae23b69016a3c1251dcec819daf72930a854fd4d1","obfuscation":"jktzJNPNJGe","output_index":0,"sequence_number":55,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" one","item_id":"rs_0ccfefab56fc1e6b0169b3197fec948191a5128b289bd3abd7","obfuscation":"8krdWEKasl3B","output_index":0,"sequence_number":56,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" for","item_id":"rs_017e85da2ae23b69016a3c1251dcec819daf72930a854fd4d1","obfuscation":"R6hGyfehzHWA","output_index":0,"sequence_number":56,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" tool","item_id":"rs_0ccfefab56fc1e6b0169b3197fec948191a5128b289bd3abd7","obfuscation":"2ZQMShZTIfu","output_index":0,"sequence_number":57,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" parallel","item_id":"rs_017e85da2ae23b69016a3c1251dcec819daf72930a854fd4d1","obfuscation":"e6kIcHl","output_index":0,"sequence_number":57,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":",","item_id":"rs_0ccfefab56fc1e6b0169b3197fec948191a5128b289bd3abd7","obfuscation":"X5BfG8Ew3DWVBPE","output_index":0,"sequence_number":58,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" execution","item_id":"rs_017e85da2ae23b69016a3c1251dcec819daf72930a854fd4d1","obfuscation":"Ecfc2t","output_index":0,"sequence_number":58,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" I","item_id":"rs_0ccfefab56fc1e6b0169b3197fec948191a5128b289bd3abd7","obfuscation":"HP5e0CeeKQxPFI","output_index":0,"sequence_number":59,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" here","item_id":"rs_017e85da2ae23b69016a3c1251dcec819daf72930a854fd4d1","obfuscation":"Cfe4aM2uJAv","output_index":0,"sequence_number":59,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" won","item_id":"rs_0ccfefab56fc1e6b0169b3197fec948191a5128b289bd3abd7","obfuscation":"z8nNtikoxddi","output_index":0,"sequence_number":60,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":".","item_id":"rs_017e85da2ae23b69016a3c1251dcec819daf72930a854fd4d1","obfuscation":"sp8rwAlHtxZXctf","output_index":0,"sequence_number":60,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":"’t","item_id":"rs_0ccfefab56fc1e6b0169b3197fec948191a5128b289bd3abd7","obfuscation":"y4CgXO1xaenbGD","output_index":0,"sequence_number":61,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" I'll","item_id":"rs_017e85da2ae23b69016a3c1251dcec819daf72930a854fd4d1","obfuscation":"5vXczuTKaao","output_index":0,"sequence_number":61,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" bother","item_id":"rs_0ccfefab56fc1e6b0169b3197fec948191a5128b289bd3abd7","obfuscation":"cwFul2HIJ","output_index":0,"sequence_number":62,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" call","item_id":"rs_017e85da2ae23b69016a3c1251dcec819daf72930a854fd4d1","obfuscation":"wqjWV4uLWyF","output_index":0,"sequence_number":62,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" with","item_id":"rs_0ccfefab56fc1e6b0169b3197fec948191a5128b289bd3abd7","obfuscation":"xhTRjROrm9X","output_index":0,"sequence_number":63,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" the","item_id":"rs_017e85da2ae23b69016a3c1251dcec819daf72930a854fd4d1","obfuscation":"0j31yf9lk874","output_index":0,"sequence_number":63,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" any","item_id":"rs_0ccfefab56fc1e6b0169b3197fec948191a5128b289bd3abd7","obfuscation":"jhbfUMo78m6H","output_index":0,"sequence_number":64,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" tool","item_id":"rs_017e85da2ae23b69016a3c1251dcec819daf72930a854fd4d1","obfuscation":"JsljDoCByLh","output_index":0,"sequence_number":64,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" parallel","item_id":"rs_0ccfefab56fc1e6b0169b3197fec948191a5128b289bd3abd7","obfuscation":"syKklKk","output_index":0,"sequence_number":65,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" to","item_id":"rs_017e85da2ae23b69016a3c1251dcec819daf72930a854fd4d1","obfuscation":"xDOfcP7vT7D8D","output_index":0,"sequence_number":65,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" options","item_id":"rs_0ccfefab56fc1e6b0169b3197fec948191a5128b289bd3abd7","obfuscation":"mTwwcjw3","output_index":0,"sequence_number":66,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" retrieve","item_id":"rs_017e85da2ae23b69016a3c1251dcec819daf72930a854fd4d1","obfuscation":"hL9Q0y2","output_index":0,"sequence_number":66,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":".","item_id":"rs_0ccfefab56fc1e6b0169b3197fec948191a5128b289bd3abd7","obfuscation":"XHV0n7jVkAVnb4x","output_index":0,"sequence_number":67,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" the","item_id":"rs_017e85da2ae23b69016a3c1251dcec819daf72930a854fd4d1","obfuscation":"piIfbEkFpw9V","output_index":0,"sequence_number":67,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" I","item_id":"rs_0ccfefab56fc1e6b0169b3197fec948191a5128b289bd3abd7","obfuscation":"koa83qZ8lZNIa5","output_index":0,"sequence_number":68,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" current","item_id":"rs_017e85da2ae23b69016a3c1251dcec819daf72930a854fd4d1","obfuscation":"ikaYVsNC","output_index":0,"sequence_number":68,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":"’ll","item_id":"rs_0ccfefab56fc1e6b0169b3197fec948191a5128b289bd3abd7","obfuscation":"1gSZcIZjKtbjD","output_index":0,"sequence_number":69,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" weather","item_id":"rs_017e85da2ae23b69016a3c1251dcec819daf72930a854fd4d1","obfuscation":"nfM7wf8W","output_index":0,"sequence_number":69,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" ensure","item_id":"rs_0ccfefab56fc1e6b0169b3197fec948191a5128b289bd3abd7","obfuscation":"8UPXNRPiU","output_index":0,"sequence_number":70,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" information","item_id":"rs_017e85da2ae23b69016a3c1251dcec819daf72930a854fd4d1","obfuscation":"KpnZ","output_index":0,"sequence_number":70,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" to","item_id":"rs_0ccfefab56fc1e6b0169b3197fec948191a5128b289bd3abd7","obfuscation":"M6m19pwElusYf","output_index":0,"sequence_number":71,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" for","item_id":"rs_017e85da2ae23b69016a3c1251dcec819daf72930a854fd4d1","obfuscation":"M8lhREUay68r","output_index":0,"sequence_number":71,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" keep","item_id":"rs_0ccfefab56fc1e6b0169b3197fec948191a5128b289bd3abd7","obfuscation":"ZUyINE3oaOt","output_index":0,"sequence_number":72,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" Florence","item_id":"rs_017e85da2ae23b69016a3c1251dcec819daf72930a854fd4d1","obfuscation":"KbKJ8qH","output_index":0,"sequence_number":72,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" my","item_id":"rs_0ccfefab56fc1e6b0169b3197fec948191a5128b289bd3abd7","obfuscation":"B2ALgOmzxsXb4","output_index":0,"sequence_number":73,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" and","item_id":"rs_017e85da2ae23b69016a3c1251dcec819daf72930a854fd4d1","obfuscation":"cU8qzfF5FYSS","output_index":0,"sequence_number":73,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" output","item_id":"rs_0ccfefab56fc1e6b0169b3197fec948191a5128b289bd3abd7","obfuscation":"Tt0O5pnpo","output_index":0,"sequence_number":74,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" see","item_id":"rs_017e85da2ae23b69016a3c1251dcec819daf72930a854fd4d1","obfuscation":"2VHEU4dDxGid","output_index":0,"sequence_number":74,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" concise","item_id":"rs_0ccfefab56fc1e6b0169b3197fec948191a5128b289bd3abd7","obfuscation":"MqWwpsMM","output_index":0,"sequence_number":75,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" what","item_id":"rs_017e85da2ae23b69016a3c1251dcec819daf72930a854fd4d1","obfuscation":"XaPfQV7imN1","output_index":0,"sequence_number":75,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":",","item_id":"rs_0ccfefab56fc1e6b0169b3197fec948191a5128b289bd3abd7","obfuscation":"gnnEMhSMqeZVoh8","output_index":0,"sequence_number":76,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" it","item_id":"rs_017e85da2ae23b69016a3c1251dcec819daf72930a854fd4d1","obfuscation":"59p29Zm0c0jFP","output_index":0,"sequence_number":76,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" as","item_id":"rs_0ccfefab56fc1e6b0169b3197fec948191a5128b289bd3abd7","obfuscation":"ZBhBhynziS0Zo","output_index":0,"sequence_number":77,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":" returns","item_id":"rs_017e85da2ae23b69016a3c1251dcec819daf72930a854fd4d1","obfuscation":"G5hWBEHG","output_index":0,"sequence_number":77,"summary_index":0} event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" I","item_id":"rs_0ccfefab56fc1e6b0169b3197fec948191a5128b289bd3abd7","obfuscation":"1etO5mQAf7aTpJ","output_index":0,"sequence_number":78,"summary_index":0} - - event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" follow","item_id":"rs_0ccfefab56fc1e6b0169b3197fec948191a5128b289bd3abd7","obfuscation":"7s52MOS4z","output_index":0,"sequence_number":79,"summary_index":0} - - event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" the","item_id":"rs_0ccfefab56fc1e6b0169b3197fec948191a5128b289bd3abd7","obfuscation":"ZAqfLTVQYP5F","output_index":0,"sequence_number":80,"summary_index":0} - - event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" instructions","item_id":"rs_0ccfefab56fc1e6b0169b3197fec948191a5128b289bd3abd7","obfuscation":"3Qz","output_index":0,"sequence_number":81,"summary_index":0} - - event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" on","item_id":"rs_0ccfefab56fc1e6b0169b3197fec948191a5128b289bd3abd7","obfuscation":"pPyxTk3kJVImH","output_index":0,"sequence_number":82,"summary_index":0} - - event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" formatting","item_id":"rs_0ccfefab56fc1e6b0169b3197fec948191a5128b289bd3abd7","obfuscation":"NTt03","output_index":0,"sequence_number":83,"summary_index":0} - - event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":".","item_id":"rs_0ccfefab56fc1e6b0169b3197fec948191a5128b289bd3abd7","obfuscation":"gce68jsjXa6alX7","output_index":0,"sequence_number":84,"summary_index":0} - - event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" Now","item_id":"rs_0ccfefab56fc1e6b0169b3197fec948191a5128b289bd3abd7","obfuscation":"u7Pj8GDDHuef","output_index":0,"sequence_number":85,"summary_index":0} - - event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":",","item_id":"rs_0ccfefab56fc1e6b0169b3197fec948191a5128b289bd3abd7","obfuscation":"jnWnuN0d093p6vE","output_index":0,"sequence_number":86,"summary_index":0} - - event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" let","item_id":"rs_0ccfefab56fc1e6b0169b3197fec948191a5128b289bd3abd7","obfuscation":"e1KUl7s9HjUy","output_index":0,"sequence_number":87,"summary_index":0} - - event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":"’s","item_id":"rs_0ccfefab56fc1e6b0169b3197fec948191a5128b289bd3abd7","obfuscation":"ke82DH6jHXRZfL","output_index":0,"sequence_number":88,"summary_index":0} - - event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" go","item_id":"rs_0ccfefab56fc1e6b0169b3197fec948191a5128b289bd3abd7","obfuscation":"24Wnp2RV0vwNJ","output_index":0,"sequence_number":89,"summary_index":0} - - event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" ahead","item_id":"rs_0ccfefab56fc1e6b0169b3197fec948191a5128b289bd3abd7","obfuscation":"h9lT050NBM","output_index":0,"sequence_number":90,"summary_index":0} - - event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" and","item_id":"rs_0ccfefab56fc1e6b0169b3197fec948191a5128b289bd3abd7","obfuscation":"K5SZwaB5n8n4","output_index":0,"sequence_number":91,"summary_index":0} - - event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" make","item_id":"rs_0ccfefab56fc1e6b0169b3197fec948191a5128b289bd3abd7","obfuscation":"Zmv2UCFNuG0","output_index":0,"sequence_number":92,"summary_index":0} - - event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" that","item_id":"rs_0ccfefab56fc1e6b0169b3197fec948191a5128b289bd3abd7","obfuscation":"M8jdLQzvJG9","output_index":0,"sequence_number":93,"summary_index":0} - - event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" tool","item_id":"rs_0ccfefab56fc1e6b0169b3197fec948191a5128b289bd3abd7","obfuscation":"z8UPCH74a9m","output_index":0,"sequence_number":94,"summary_index":0} - - event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":" call","item_id":"rs_0ccfefab56fc1e6b0169b3197fec948191a5128b289bd3abd7","obfuscation":"F9HFzqrEFPf","output_index":0,"sequence_number":95,"summary_index":0} - - event: response.reasoning_summary_text.delta - data: {"type":"response.reasoning_summary_text.delta","delta":"!","item_id":"rs_0ccfefab56fc1e6b0169b3197fec948191a5128b289bd3abd7","obfuscation":"bRQC7fQshfRp1Pw","output_index":0,"sequence_number":96,"summary_index":0} + data: {"type":"response.reasoning_summary_text.delta","delta":"!","item_id":"rs_017e85da2ae23b69016a3c1251dcec819daf72930a854fd4d1","obfuscation":"SGgiEwwNw9D3RMa","output_index":0,"sequence_number":78,"summary_index":0} event: response.reasoning_summary_text.done - data: {"type":"response.reasoning_summary_text.done","item_id":"rs_0ccfefab56fc1e6b0169b3197fec948191a5128b289bd3abd7","output_index":0,"sequence_number":97,"summary_index":0,"text":"**Retrieving weather for Florence**\n\nI need to answer the user's question about the weather in Florence, Italy. I have a function to get this information, specifically the functions.weather tool, which I'll use with the location \"Florence, Italy.\" Since I'm likely only needing one tool, I won’t bother with any parallel options. I’ll ensure to keep my output concise, as I follow the instructions on formatting. Now, let’s go ahead and make that tool call!"} + data: {"type":"response.reasoning_summary_text.done","item_id":"rs_017e85da2ae23b69016a3c1251dcec819daf72930a854fd4d1","output_index":0,"sequence_number":79,"summary_index":0,"text":"**Getting weather info**\n\nI need to respond to the user's question about the weather in Florence, Italy. I'll use the weather tool, which requires the location string. According to the instructions, I can call functions.weather directly since I only need one tool for this task. There's no need for parallel execution here. I'll call the tool to retrieve the current weather information for Florence and see what it returns!"} event: response.reasoning_summary_part.done - data: {"type":"response.reasoning_summary_part.done","item_id":"rs_0ccfefab56fc1e6b0169b3197fec948191a5128b289bd3abd7","output_index":0,"part":{"type":"summary_text","text":"**Retrieving weather for Florence**\n\nI need to answer the user's question about the weather in Florence, Italy. I have a function to get this information, specifically the functions.weather tool, which I'll use with the location \"Florence, Italy.\" Since I'm likely only needing one tool, I won’t bother with any parallel options. I’ll ensure to keep my output concise, as I follow the instructions on formatting. Now, let’s go ahead and make that tool call!"},"sequence_number":98,"summary_index":0} + data: {"type":"response.reasoning_summary_part.done","item_id":"rs_017e85da2ae23b69016a3c1251dcec819daf72930a854fd4d1","output_index":0,"part":{"type":"summary_text","text":"**Getting weather info**\n\nI need to respond to the user's question about the weather in Florence, Italy. I'll use the weather tool, which requires the location string. According to the instructions, I can call functions.weather directly since I only need one tool for this task. There's no need for parallel execution here. I'll call the tool to retrieve the current weather information for Florence and see what it returns!"},"sequence_number":80,"summary_index":0} event: response.output_item.done - data: {"type":"response.output_item.done","item":{"id":"rs_0ccfefab56fc1e6b0169b3197fec948191a5128b289bd3abd7","type":"reasoning","encrypted_content":"gAAAAABpsxmE8pxiNFPjRPq1RQB2wOdV9T5T-6EWRm7CxY0TSltXQ_Kg4gk3QfVV4e5peyuvMw2PLKJJEdD3Z-KsrEKJgc50f4fcjz9-ZvdtKATRA02OtV13_HxTB2praT6ihLBViaptWEe_twb-8i76R2es7M5Mtud0tDSCiEkBnpOdZC87kwrDoa8AlDw20gFZ_uQcO7PG-t0f-hdYoKqDW8yjoh3tshsARvq0o9wuLEbGlgSF5JGKdsaZeipjQEyYzmtB7zLJVepCj57gwpRiX74fepCbIrHtvGZzSD5S9NyYMrCCZSKsTdhiSTx6kSoQyGj1VcVKTKQ73U1zouVHz4PN2oc9iXgv9Zb1CaWuds0bWp_S6hcq82ZAcDAD7KtcfTIwdGF_Pfh89V8T62Ui7_SndLIScNJtdUVO-TyrW9KA3HXIQG-JwB2NVg8KSWF9gnoti0PAxaQbStNRz0nOwrSYNVa87JLlubucgr_cv3a6zczsb4CUEy7xaQuzq6xEEYLf-MKhzGwyEGDeZ8AmRnf5Az4tl0KhT5_niltGpIrUwlagskQgmGPpXZd8MfRm5o7r50T95KVPGmB5ekjE5cUzcUkPUbyRYuA9vFaJB-fNZBSY3CVJUwzfrY82m-K19pH-1HlbNJCWKAqp-4osIANkphl1vMrJ4ldWOsUM0j8mqZqgUFIrXhUYQqSlPqqLH4XfG6loroiq9JsyAxEEnVAvxFuEX-sK4i1dkn7BiV7Ko55okFGEWznC202nRO0wYM1FRhkcA2IIytVpDI4TVIemXJr03V6O8ahb2kCnyKSMNJPsanMW0knQl4paRndlWdRgUCVSK1Ezm9B4GK4op1kfOciaAGNQ2pnhtu-XWgw9vlgHoAPWrZ1XZ1-0Z4TcLQdeL2e_xWQiLbABMqEUGmtVHBh6yMHSDBn-GkZWBKDZ2YOE8wYwuodKlzJpHcINPUOhVCvwfC-hjs99QuHSVRIZkx8wp3I7AEzjIz3Vu6wsGwH6O3h6QKvs2JLNat3Fcrzx39zArbgfy9CupP1mvaPOP--dZDXD7tYIerLWkVudxqtibP-kRMIuAFmzfClLOqr_d53eRU_NGxTKgOLcHrfEPIYcAtjWTI0YFALxKlU_YaL-0FIToBqKmZ5lAe5BYpjjXR-tra0FdyNERqYIMRcqkwZIepMI2PdYCWofZEKr8x09cDkDHZJc-VBxdJStSlXQV0delM7DGc_4Vdm7r-aohKjNiOxSEuu6vOEw7TOC-jZmgAQ8kPXOimnHbA3adwG5-N3-7tjQz7f9AYJ-V3Kwr5aAChvEpZXOSTG4UrrtFywBC3suxwMhFyhjZxk0cKjreH8o4EPrqqRM9YatMd0tN_pN6Ew24COUvWoVaTjVAXvXyt_ouqb-saIVGtGsHVK5RapOq0tKN3AyR6YveksZ4iAGThs57GDJzoOEEyiwzV7wRhmzm0MwnsOK3wga5JaD9kQv4wFa8eCMYHuB2c5gZXKTWtNmBI_uoMpO62JdwRmX2fUx5xFXJ6hSOiUd7k2TKTErzvsK7CefeYMV74cUcZpKspPphe-v4Htoa3X5fVVhh5rziXXGk7lrGsA2pd5IacjTNcFhBCFcXgKWd1mECac60mEKTZwZVaIZ27n6CN42c5oJbC9GtUZLgw3MX9HaGT7QonjpPC7Dzl5ZZ9gEuK1zAcv-v3d6HR4tRg3GdBKbmf3TUvjarjkp_N4L2mNyqW0whudBBSKfKvCGxf4CQRWLcLOBCxd1WwjK375Pgt27ABo=","summary":[{"type":"summary_text","text":"**Retrieving weather for Florence**\n\nI need to answer the user's question about the weather in Florence, Italy. I have a function to get this information, specifically the functions.weather tool, which I'll use with the location \"Florence, Italy.\" Since I'm likely only needing one tool, I won’t bother with any parallel options. I’ll ensure to keep my output concise, as I follow the instructions on formatting. Now, let’s go ahead and make that tool call!"}]},"output_index":0,"sequence_number":99} + data: {"type":"response.output_item.done","item":{"id":"rs_017e85da2ae23b69016a3c1251dcec819daf72930a854fd4d1","type":"reasoning","content":[],"encrypted_content":"gAAAAABqPBJWAIvEAmUTQCqLSmR9FPLSaCOTK3cpkKjorwAKVNzysthKw3djyrJ2Q0YC2MCprWw3B5aMyujyhSjp9ulmQZNuRfLtd2e_6eIVdk2Z4IXi9KUF9yMD6CyxZH9vCYUexn-EQK8eABozQY8jMF2WSDq-hy_sIzEUlIfD3kKbUhlB2fjRuk_5grBUfszpwiict_aqT29BuCHBXbnaOgcM4ggdU8zVPTnkc68GzVD0i0V7vneRSN7awJdrx6mn_4qdQPlis5LEr7n6xUOaGWUy1lXUKgAJtOIGFOoYJHcA24pNKdNcaeEqakKWCkdLfe07BuptmIwjhJK80-MEtIEKuq8vPAm50-BtBp3SoHddCtcMnsRhyQwiOLhbmPinSQXrX3JLFPJB-0PANRrUK1lBAcf75syUGwLpPEfZk1phkuCCAjobYQ423tQ5iffXi6HBj4sHlyhOJs7F31YrND44bQm8TsS0Zua1p4_FDSy5iAYhaJQs21XTRujZ2TX2nqL8aBEIC7KZvgsQCR1Q7DuK-7KCmX4yZPLoowhtVQfk3dT1glqvO_JEL6PH6TclHQDoc294vKXMSxrR7dlfkdLKV4uG16JV6mESV9PKw43uBCC2krwYI0oqk_WbDShjNsdp0Y6QZdBewIexb9a9H4DDF7tz3p2hNnW5ifVvT4D1lZydMGjSPUPi8cDtD59TN2re7JMs_NAMsGqpZeybacW-D-2epr2JTzefRLk92puMG-5dR1tGQNFDBa4YexClK8uDXUnCtIdHY_j9yTwJLXFibNbX7JWgios8oYh8SWOBLK2_5ggFAOv8oKvJ-GcPZtZlQSGVHPhMW68yI24o2VjIz9FqyfLkC9zSXdDPMZ2Syzwpx3Ovw-VKZ9OVrqeJftCJTHpZx-pl4Sx3k5JHp8ooY6_T4oaBM_bzsJ5qCWhMefS0xfoqVdWI4rNLTDJRQK9fYoDh8fybt4EymYV3lODHHx1RRORRNnvmsz2VvkhJxksQSyXH2_sGHhIl8hvrtxURGktyIyF-XW97FUto7KU8xFN-_K4yNvBqB7xt-8LdwqUsHc31juXN6891LDX2-7V12qVYN40ffTEHXekQupCC8Wy-isIJrbkg99BAlPu7XthWxXst0VVTcszeYL9AfRcP8CPqa8gshZCsGm7kI16lplJjvjFelqf15MjCTlzxlfDk5XFPddXPJyleAoOq9Ur7RQs_U0DA8hyF0HG64bPIrBpZ2kWbaZvPYBnKqXjGz8gptOg4xRRPcO-LgLBMvQUzixfwmBdOZYPTSo36OmRCQsld1WLM5QaSOwJp0Yio7piFC8UTCB4dQ7CCGRJ3i_mVK3185e1HZfknDc87BGpSFDEIV3G8Ze09HcAlRs28Fk9C__hHwc9rdthYuaqakN70A4E3cKDx-VT7dk9isO5Ww-SXPNJaGxGGDtj-hKF6YiN6Ewb7oIOkL5992PrtcSzPmjlAOmcXkHwwG-EniRn6ssBNMDEF70dWdqXEk4jMInUL7uQZHm1VDT9byGa6vrnOoETaCPT4YAP6tjmQE0XasRCHxQ==","summary":[{"type":"summary_text","text":"**Getting weather info**\n\nI need to respond to the user's question about the weather in Florence, Italy. I'll use the weather tool, which requires the location string. According to the instructions, I can call functions.weather directly since I only need one tool for this task. There's no need for parallel execution here. I'll call the tool to retrieve the current weather information for Florence and see what it returns!"}]},"output_index":0,"sequence_number":81} event: response.output_item.added - data: {"type":"response.output_item.added","item":{"id":"fc_0ccfefab56fc1e6b0169b31984a6208191ae1afff5e00f3a41","type":"function_call","status":"in_progress","arguments":"","call_id":"call_vTqMwYdzvdmoeNyNdQOqI1uY","name":"weather"},"output_index":1,"sequence_number":100} + data: {"type":"response.output_item.added","item":{"id":"fc_017e85da2ae23b69016a3c12560820819db3b6e8a38dddad65","type":"function_call","status":"in_progress","arguments":"","call_id":"call_zgUaIBRPTwxxOusyyKw5NVMH","name":"weather"},"output_index":1,"sequence_number":82} event: response.function_call_arguments.delta - data: {"type":"response.function_call_arguments.delta","delta":"{\"","item_id":"fc_0ccfefab56fc1e6b0169b31984a6208191ae1afff5e00f3a41","obfuscation":"XBWHQoTwNXeUNP","output_index":1,"sequence_number":101} + data: {"type":"response.function_call_arguments.delta","delta":"{\"","item_id":"fc_017e85da2ae23b69016a3c12560820819db3b6e8a38dddad65","obfuscation":"owUEioaL30uf4t","output_index":1,"sequence_number":83} event: response.function_call_arguments.delta - data: {"type":"response.function_call_arguments.delta","delta":"location","item_id":"fc_0ccfefab56fc1e6b0169b31984a6208191ae1afff5e00f3a41","obfuscation":"gNjVnV7D","output_index":1,"sequence_number":102} + data: {"type":"response.function_call_arguments.delta","delta":"location","item_id":"fc_017e85da2ae23b69016a3c12560820819db3b6e8a38dddad65","obfuscation":"b204zJnR","output_index":1,"sequence_number":84} event: response.function_call_arguments.delta - data: {"type":"response.function_call_arguments.delta","delta":"\":\"","item_id":"fc_0ccfefab56fc1e6b0169b31984a6208191ae1afff5e00f3a41","obfuscation":"buO4SQRRAJVIn","output_index":1,"sequence_number":103} + data: {"type":"response.function_call_arguments.delta","delta":"\":\"","item_id":"fc_017e85da2ae23b69016a3c12560820819db3b6e8a38dddad65","obfuscation":"m85gBokomQIUJ","output_index":1,"sequence_number":85} event: response.function_call_arguments.delta - data: {"type":"response.function_call_arguments.delta","delta":"Flor","item_id":"fc_0ccfefab56fc1e6b0169b31984a6208191ae1afff5e00f3a41","obfuscation":"R112wF10E1hA","output_index":1,"sequence_number":104} + data: {"type":"response.function_call_arguments.delta","delta":"Flor","item_id":"fc_017e85da2ae23b69016a3c12560820819db3b6e8a38dddad65","obfuscation":"rDa4h7sQxdeD","output_index":1,"sequence_number":86} event: response.function_call_arguments.delta - data: {"type":"response.function_call_arguments.delta","delta":"ence","item_id":"fc_0ccfefab56fc1e6b0169b31984a6208191ae1afff5e00f3a41","obfuscation":"JxMI48h5iX5W","output_index":1,"sequence_number":105} + data: {"type":"response.function_call_arguments.delta","delta":"ence","item_id":"fc_017e85da2ae23b69016a3c12560820819db3b6e8a38dddad65","obfuscation":"Ly52jo6qHdBz","output_index":1,"sequence_number":87} event: response.function_call_arguments.delta - data: {"type":"response.function_call_arguments.delta","delta":",","item_id":"fc_0ccfefab56fc1e6b0169b31984a6208191ae1afff5e00f3a41","obfuscation":"OyvAFdEIr6Gs1tL","output_index":1,"sequence_number":106} + data: {"type":"response.function_call_arguments.delta","delta":",","item_id":"fc_017e85da2ae23b69016a3c12560820819db3b6e8a38dddad65","obfuscation":"5h3zozjOd8bBYEX","output_index":1,"sequence_number":88} event: response.function_call_arguments.delta - data: {"type":"response.function_call_arguments.delta","delta":" Italy","item_id":"fc_0ccfefab56fc1e6b0169b31984a6208191ae1afff5e00f3a41","obfuscation":"WeIDEOnrsy","output_index":1,"sequence_number":107} + data: {"type":"response.function_call_arguments.delta","delta":" Italy","item_id":"fc_017e85da2ae23b69016a3c12560820819db3b6e8a38dddad65","obfuscation":"7zvofaLPXh","output_index":1,"sequence_number":89} event: response.function_call_arguments.delta - data: {"type":"response.function_call_arguments.delta","delta":"\"}","item_id":"fc_0ccfefab56fc1e6b0169b31984a6208191ae1afff5e00f3a41","obfuscation":"sc6E7805HejQEa","output_index":1,"sequence_number":108} + data: {"type":"response.function_call_arguments.delta","delta":"\"}","item_id":"fc_017e85da2ae23b69016a3c12560820819db3b6e8a38dddad65","obfuscation":"c6vcvMxO169PvZ","output_index":1,"sequence_number":90} event: response.function_call_arguments.done - data: {"type":"response.function_call_arguments.done","arguments":"{\"location\":\"Florence, Italy\"}","item_id":"fc_0ccfefab56fc1e6b0169b31984a6208191ae1afff5e00f3a41","output_index":1,"sequence_number":109} + data: {"type":"response.function_call_arguments.done","arguments":"{\"location\":\"Florence, Italy\"}","item_id":"fc_017e85da2ae23b69016a3c12560820819db3b6e8a38dddad65","output_index":1,"sequence_number":91} event: response.output_item.done - data: {"type":"response.output_item.done","item":{"id":"fc_0ccfefab56fc1e6b0169b31984a6208191ae1afff5e00f3a41","type":"function_call","status":"completed","arguments":"{\"location\":\"Florence, Italy\"}","call_id":"call_vTqMwYdzvdmoeNyNdQOqI1uY","name":"weather"},"output_index":1,"sequence_number":110} + data: {"type":"response.output_item.done","item":{"id":"fc_017e85da2ae23b69016a3c12560820819db3b6e8a38dddad65","type":"function_call","status":"completed","arguments":"{\"location\":\"Florence, Italy\"}","call_id":"call_zgUaIBRPTwxxOusyyKw5NVMH","name":"weather"},"output_index":1,"sequence_number":92} event: response.completed - data: {"type":"response.completed","response":{"id":"resp_0ccfefab56fc1e6b0169b3197f938081919413a2656e175d4d","object":"response","created_at":1773345151,"status":"completed","background":false,"completed_at":1773345156,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":null,"max_tool_calls":null,"model":"gpt-5-2025-08-07","output":[{"id":"rs_0ccfefab56fc1e6b0169b3197fec948191a5128b289bd3abd7","type":"reasoning","encrypted_content":"gAAAAABpsxmEKxC6TQfUmOYw1XzDon_RkJB6wSBQuVNjYx24Y-8Yjzd4x5vCvKEn5NpNMiF7JI7Lmh2zDDmQw2rkeYai_iBkV467cG-zqLOs-m7Vi5E5vY109QsexBS1r1VUcJrZt1fXIQEa6FmYzRWMCbX37QYUT8hyfz_dfRYk4BrDE3IOIeoWGE_lzcL-0eiPQumw6I2hDCgXSOCc-wb2TPhoudYFNQsFooh8VTOBtBjJ3lqYSKZSNuziAjRAJdBwSyIAP5InxPgO4REE4oc89jA2aQ3_McIs4RriIasXIQoYeEeT-cal6oU8JxNfA5isQoDlfGX6u_PyWno2KAKWotaoD24NvfMxXEdyXZudwZ78Li_sWnEIJpQfpMWTHZQjRNwW9Cfv5vrDfb0UrRdghUJQ0XavP-N4lhHQfIWNo8M7ojIPE3fhN1Ie7LabhTpRsOBJp3N26788mkWnyfgiLNRAcZBKJyeko-8yRNxS7BQzqiCn7X3UrnP2xZh6PuBwGcc_VdtbLWuGG4gn6LCfLVMSx-3Dcty-r-GxPpTZ1PzF-SP4LZMVEXb4MaDswyBjIWfUPct68xzcsS-Ww5TV6olA3W7lsZMLAlY__RsbmWl5CT2Qo9K4W4A8YLqCsg20O4pQRMGCPjcxEzDr8N_g9VG-exrRzPmsqQgPcDlOamnWDhNnTpzUlvxdwG9-Ui5sLBPrRCcsFq9h9tYRUmC4WKOpNQbaApxY6QjwtO3GY7pGXTKi0WySgw16jYZFeYLElnq4NVJYr800EZlyDQ6WshjIppiXuceSsN0Y2QTGMAWsEMVsJrAEeHCwCtWH0ox9QrXLFldZzQd5qqALyqAR_wR3cttKsqlZvgrcNDtsEaVnFXMPVSPB1cj6-wduF4OWbtWwgCtD7OauuoCxAe1Xf80kmvOpMBXwk5Fdvd2iA-YaXDrmZ-9IcbMUCRsJABp1kmr67Goq7P0EQD_0eblxGfanhP0oVZ9Gt-9c7I5Yj73YuwIFaqoy1_if5ciRHSFn0--XFh4uftFLJLkCV0SMIQEOy2z1mSTFrNEfa3zFJ_WVUnTgy2XR5Bz1Fk7rOPFERVYjoCfxNdgC3H_-quEbuL2lhHPqhj7jX-LHx2x8h_ZghHsgq7vwj2JMOyoEnNU7CSTaF6i2NhM9UeV1ZQ4uj7MN1B36yeNgX4rhvku2WPI7If8xTwFNbQjh0B-VH7dc01C3aIr53sbV7r_aF_s20hoVYYyDPURVKWcHugd3U1t4Czf6tPWeaITteDqV3R8P51B9YsYNXNLWBdvGgNYkAIDLiB9ZCyiLwgQB5wRDTtl758BL2rFU_oCikj3zNe5x3mb2O1Qfon72DtfXv-ZMEM52NtIvnmMAtIr1ceuwVrNePMvSAMx4CrPVMsdLnLfyiDDF5lMpMd-cVLZLBJ1N_GOUkev_mVy6OXa5eIkvXXtqpyBWf8K5-DiFqzEA0cB5wdNjk_7A8tQBxOnZWsc3-UMepVrrahA4KfxTygeuNcnA4IKg4q8k5HLjQrnS_VeGKMbD5bnEcbmZKfIC_8QrppPInRKeL1QWH_CQDNwHzJ3aTeIJfP25eNQBlV07LNKMoXnsxu-Zo0Cz5TGVIWGYb4077IUjDo1JuwPNMzW3wgh4pBg1eUt5hMbAqvL84u0Upiev15pqSsjglXHGtIkGrK3reVYS9wSTZx3o5P_M5uyIU-r7tmriDT9fpdSFT3nartII_VfgPBpBuMgysrqjwr9Wsxt20mBCt17ShBOrGYM69B6bibg=","summary":[{"type":"summary_text","text":"**Retrieving weather for Florence**\n\nI need to answer the user's question about the weather in Florence, Italy. I have a function to get this information, specifically the functions.weather tool, which I'll use with the location \"Florence, Italy.\" Since I'm likely only needing one tool, I won’t bother with any parallel options. I’ll ensure to keep my output concise, as I follow the instructions on formatting. Now, let’s go ahead and make that tool call!"}]},{"id":"fc_0ccfefab56fc1e6b0169b31984a6208191ae1afff5e00f3a41","type":"function_call","status":"completed","arguments":"{\"location\":\"Florence, Italy\"}","call_id":"call_vTqMwYdzvdmoeNyNdQOqI1uY","name":"weather"}],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":"high","summary":"detailed"},"safety_identifier":null,"service_tier":"default","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":{"input_tokens":63,"input_tokens_details":{"cached_tokens":0},"output_tokens":164,"output_tokens_details":{"reasoning_tokens":128},"total_tokens":227},"user":null,"metadata":{}},"sequence_number":111} + data: {"type":"response.completed","response":{"id":"resp_017e85da2ae23b69016a3c12518cc0819da56cbbdd33f128f3","object":"response","created_at":1782321745,"status":"completed","background":false,"completed_at":1782321750,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":null,"max_tool_calls":null,"model":"gpt-5-2025-08-07","moderation":null,"output":[{"id":"rs_017e85da2ae23b69016a3c1251dcec819daf72930a854fd4d1","type":"reasoning","content":[],"encrypted_content":"gAAAAABqPBJWmFz9tCTxPvUh6Qwqxw2cpGGbADZJW2a0Vpc_EJKs9PJ0Ex32Z6B2lJQuJX1QjxI9MH3fiKGq8bmZ5XyMRt78WQe48DqNMetnX0Mw3Xi5q4oxZTpNxjLE6w2ii65zrme8XmNZj6S6Judseay_YY1DT5bPG4M6scgFctbcc8n4rvgEy4DJDxtjnOmH5fl8UFF5S2zMLdnV530KfCBCplJqAU_3d4Ggcyv5Ey4UBtbEocBFpC9yY6L3f3JhDK3Bgg_EgOZMeQaDAhr_vLVgQZbJ0dCFYLjA8SKB9y9ffvlbeSwXsmPpTnjb0hBA3xFlyvWW7tm6BCVj0NTJnLngEJhrnQQmyFEPM8D2yEVOaZy695_njaBsuYyZWQNsA8NB-NAQCOWcekU6vr1Zn145zC2XOFX2MZuMuceIv97mVJS6jajKpNc_vOc716SwwDWOIsLfuYDk2sCiBDR0pBFos9swvmTEBDiu-EftNuXylYa-YGCCJV26op0vgoZslcwCJwn3owcGEkNEAP9pf2ndRGWl_QVh3t2Ed-a3Ns6PZG6cqlZaLs1mERRp2ClEYh72sxFn-_mr_DMWg1-WLj8J6kt2GnTZZMQIM9wcGC4_D0CTSP8Yq9Tm3ydEc3I9clhEWXpEoWwSeCPEvL-ngnOvuSGvyPtk6DN62LUdCBe9SCDY7DBMA5Tq0T7sc2e1torkZGqr459R7eU_ON94pjXiux3n9J7C5dvrsGyKpBhL09TAqjUmD6ek9Rry68sVj898G8LY1Ca0HrvjfF3QGtepcM6kSSgxQ65n46OtynGH0nuLA8--0JRT3A3fez7vIryTqt1nfZZAZ3-vJibQZHdIXh0XfVooU5hNTgCAPMxukppDViPI6CukSp88uwHSTsNVcs80YQeQgZu-jVlMFs2cx0-GzZlvYkEI880l2_-Utbkj5jCVEgtyUsnGNQIRvMzZcFtH9kSNOqmOerGeOPhbELL-zNFWM_Cm8bAHAC4H8cZWNTOSWU8GKyU1C3bjLm16OqR9YyVElaoQGv1Qf4FQIA0_KoX5p_yhphU6UAy2P3wOeegN5ffegZUBX3tDJ7ZNufEqg-OBByXmJOBDvkuWDNQR6ClJb1A307m7diqPw0JcB7jiYWxxdPQU1lNdcFqMCcSxdI_rZW6oHyPqiyEfW738_mWpQgyBZCY-w3abFtLIFBak4krWPYHxKyXbwuYTQcCOWdTpwXb8o2oJKGupQbtSLhmLg_ZpooPL28Su9bLM9kXTee01nXFFRVOgSYDxNKkFx5kMnE9d-YP8ML8xGUJBMLOlkNxbg7x3KP3TsfpN0UMfNj_DtOy_ywG4J2fCjWT5xigUfZZvZ8_YsHOyJcdKW8t4u_sUSmBNr0EUrVuA-eyR9DO1ieI5fFfU05DXb_sCd20KycWhG1sl7P8LSrJZj5it4_GNf9TP_Xum-lraj1-B52-ux1q9HPRjsNGt0KpDC4P_aEnuvpxXlGEnvb0AJZHxMsi7Bp-bJbJvS3xmL2rXPopGAzg2aYfMMP3SZIdOALbWcdyvN0SmPC7hp3BLWw==","summary":[{"type":"summary_text","text":"**Getting weather info**\n\nI need to respond to the user's question about the weather in Florence, Italy. I'll use the weather tool, which requires the location string. According to the instructions, I can call functions.weather directly since I only need one tool for this task. There's no need for parallel execution here. I'll call the tool to retrieve the current weather information for Florence and see what it returns!"}]},{"id":"fc_017e85da2ae23b69016a3c12560820819db3b6e8a38dddad65","type":"function_call","status":"completed","arguments":"{\"location\":\"Florence, Italy\"}","call_id":"call_zgUaIBRPTwxxOusyyKw5NVMH","name":"weather"}],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":"current_turn","effort":"high","summary":"detailed"},"safety_identifier":null,"service_tier":"default","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":{"input_tokens":63,"input_tokens_details":{"cached_tokens":0},"output_tokens":121,"output_tokens_details":{"reasoning_tokens":64},"total_tokens":184},"user":null,"metadata":{}},"sequence_number":93} headers: Content-Type: - text/event-stream; charset=utf-8 status: 200 OK code: 200 - duration: 420.316292ms + duration: 312.0085ms - id: 1 request: proto: HTTP/1.1 proto_major: 1 proto_minor: 1 - content_length: 800 + content_length: 788 host: "" - body: '{"store":false,"include":["reasoning.encrypted_content"],"input":[{"content":"You are a helpful assistant","role":"developer"},{"content":[{"text":"What''s the weather in Florence, Italy?","type":"input_text"}],"role":"user"},{"arguments":"\"{\\\"location\\\":\\\"Florence, Italy\\\"}\"","call_id":"call_vTqMwYdzvdmoeNyNdQOqI1uY","name":"weather","type":"function_call"},{"call_id":"call_vTqMwYdzvdmoeNyNdQOqI1uY","output":"40 C","type":"function_call_output"}],"model":"gpt-5","reasoning":{"effort":"high","summary":"auto"},"tool_choice":"auto","tools":[{"strict":false,"parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"name":"weather","description":"Get weather information for a location","type":"function"}],"stream":true}' + body: '{"store":false,"include":["reasoning.encrypted_content"],"input":[{"content":"You are a helpful assistant","role":"developer"},{"content":[{"text":"What''s the weather in Florence, Italy?","type":"input_text"}],"role":"user"},{"arguments":"{\"location\":\"Florence, Italy\"}","call_id":"call_zgUaIBRPTwxxOusyyKw5NVMH","name":"weather","type":"function_call"},{"call_id":"call_zgUaIBRPTwxxOusyyKw5NVMH","output":"40 C","type":"function_call_output"}],"model":"gpt-5","reasoning":{"effort":"high","summary":"auto"},"tool_choice":"auto","tools":[{"strict":false,"parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"name":"weather","description":"Get weather information for a location","type":"function"}],"stream":true}' headers: Accept: - application/json Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://api.openai.com/v1/responses method: POST response: @@ -390,68 +336,368 @@ interactions: content_length: -1 body: |+ event: response.created - data: {"type":"response.created","response":{"id":"resp_0ccfefab56fc1e6b0169b31984ef988191b502d872c2499f4c","object":"response","created_at":1773345156,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":null,"max_tool_calls":null,"model":"gpt-5-2025-08-07","output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":"high","summary":"detailed"},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":0} + data: {"type":"response.created","response":{"id":"resp_065915db01d8635a016a3c125658a081a38159e7d307d23d65","object":"response","created_at":1782321750,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":null,"max_tool_calls":null,"model":"gpt-5-2025-08-07","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":"current_turn","effort":"high","summary":"detailed"},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":0} event: response.in_progress - data: {"type":"response.in_progress","response":{"id":"resp_0ccfefab56fc1e6b0169b31984ef988191b502d872c2499f4c","object":"response","created_at":1773345156,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":null,"max_tool_calls":null,"model":"gpt-5-2025-08-07","output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":"high","summary":"detailed"},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":1} + data: {"type":"response.in_progress","response":{"id":"resp_065915db01d8635a016a3c125658a081a38159e7d307d23d65","object":"response","created_at":1782321750,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":null,"max_tool_calls":null,"model":"gpt-5-2025-08-07","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":"current_turn","effort":"high","summary":"detailed"},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":1} + + event: response.output_item.added + data: {"type":"response.output_item.added","item":{"id":"rs_065915db01d8635a016a3c1256d2dc81a3a6206cbb8ad411b6","type":"reasoning","content":[],"encrypted_content":"gAAAAABqPBJWnVbUj1Pc-lYHtqrXzHke4s_WmAOdIHTHWd7BaV6fwhTNd6aWTrOnHGPDEA5fbUzoCDIwoxBtGl5nBu8JXW2TzeknYlENMJHbJ8YQs__BSX6Fv-am1b-ZZwIvfE2nWJzDuaVwVFymjHg6ibiKtUgUks44fXFk5D2g0jsiRplEGSkx7pmCZ_EtK_V7nO6vNU9YFw-fH7hR0yR3_2WN5ipt4Vl4918HQVWnj7TBZmdOxs9p5Cn3-fiusw41eFNWf059vQ5VrGIBoEFqL4S3t551AfWExCbAVzLAc-1Hw_LlIc6HF9T93znZI-ZTQ6LfqvsQe8ccunYadl6DSUd0O6vMtZnoXZ7Kbz89Nzh6fOudZq4MFJytlZz0XqBLZnfoLl8IGBpmheDrKttmoAu_Rjg9vLHhXMi6dvljfjvl71zVwr3pZsWhgkX95_-TifAaQp2giufpOSfzqTIx43c0np5EmIz-vxegTYHEmzsmYbZGvVJLkE0EJJwqFJAB9Mn2tvXiB_np9pXxSpQzgpfOrLc6MBpvGyPaz2DbB9or91EzycuVUsSkFlGJ8sZPnF9LiYVAHoRAqqFctYRaNCgEdtE7d0QlRv2V_ngejFyYLRktjaGaXQi8hr0CxqsBGWqBTmYCClwAy4VJvvzDn-kMQQJXHLP70LJamPSfNTQ-pnbUPBiNJiIuwweU84YulC0fXPJpkRJ4ilr3tu6MrgJFxxoJUMvcNc8NvZ1ag9gewQ_QKfeh_A5nFLgIlFqcqSBsuWGCZU44-2W9bDtdypFomCuu0l15OffS0lCjJHuEiq778KTKeeB_s8mDQvwdq1Z-FRC_HrxcsyizKZARYA1jkdG-5XCZ70csEYT1U8DA1umCPofOOl6tOgDsXJ51Wm9IvcK0MwQJ5w6K5KtBIqMGYFbocg==","summary":[]},"output_index":0,"sequence_number":2} + + event: response.reasoning_summary_part.added + data: {"type":"response.reasoning_summary_part.added","item_id":"rs_065915db01d8635a016a3c1256d2dc81a3a6206cbb8ad411b6","output_index":0,"part":{"type":"summary_text","text":""},"sequence_number":3,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":"**Finalizing the response**\n\nI","item_id":"rs_065915db01d8635a016a3c1256d2dc81a3a6206cbb8ad411b6","obfuscation":"ub","output_index":0,"sequence_number":4,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" can","item_id":"rs_065915db01d8635a016a3c1256d2dc81a3a6206cbb8ad411b6","obfuscation":"SH2iuGiuaSit","output_index":0,"sequence_number":5,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" mention","item_id":"rs_065915db01d8635a016a3c1256d2dc81a3a6206cbb8ad411b6","obfuscation":"TM4kUnrn","output_index":0,"sequence_number":6,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" the","item_id":"rs_065915db01d8635a016a3c1256d2dc81a3a6206cbb8ad411b6","obfuscation":"ufbZYu7sWFEZ","output_index":0,"sequence_number":7,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" time","item_id":"rs_065915db01d8635a016a3c1256d2dc81a3a6206cbb8ad411b6","obfuscation":"kpW5Dcq0c4f","output_index":0,"sequence_number":8,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" of","item_id":"rs_065915db01d8635a016a3c1256d2dc81a3a6206cbb8ad411b6","obfuscation":"KKCjni062c6c5","output_index":0,"sequence_number":9,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" day","item_id":"rs_065915db01d8635a016a3c1256d2dc81a3a6206cbb8ad411b6","obfuscation":"zvQA0vRgQpTo","output_index":0,"sequence_number":10,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":",","item_id":"rs_065915db01d8635a016a3c1256d2dc81a3a6206cbb8ad411b6","obfuscation":"IYFXMN1b9tDmSSc","output_index":0,"sequence_number":11,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" but","item_id":"rs_065915db01d8635a016a3c1256d2dc81a3a6206cbb8ad411b6","obfuscation":"Bc4K3wbuwVmE","output_index":0,"sequence_number":12,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" since","item_id":"rs_065915db01d8635a016a3c1256d2dc81a3a6206cbb8ad411b6","obfuscation":"62wAw5q2yb","output_index":0,"sequence_number":13,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" that","item_id":"rs_065915db01d8635a016a3c1256d2dc81a3a6206cbb8ad411b6","obfuscation":"Q5kb3bO3SF0","output_index":0,"sequence_number":14,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" wasn't","item_id":"rs_065915db01d8635a016a3c1256d2dc81a3a6206cbb8ad411b6","obfuscation":"6Bv4KMm0e","output_index":0,"sequence_number":15,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" provided","item_id":"rs_065915db01d8635a016a3c1256d2dc81a3a6206cbb8ad411b6","obfuscation":"EE7AeUA","output_index":0,"sequence_number":16,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":",","item_id":"rs_065915db01d8635a016a3c1256d2dc81a3a6206cbb8ad411b6","obfuscation":"aWd77flcLmDFtiI","output_index":0,"sequence_number":17,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" I'll","item_id":"rs_065915db01d8635a016a3c1256d2dc81a3a6206cbb8ad411b6","obfuscation":"PyQTETV0KZu","output_index":0,"sequence_number":18,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" just","item_id":"rs_065915db01d8635a016a3c1256d2dc81a3a6206cbb8ad411b6","obfuscation":"cV7b4X5L723","output_index":0,"sequence_number":19,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" stick","item_id":"rs_065915db01d8635a016a3c1256d2dc81a3a6206cbb8ad411b6","obfuscation":"39A03XWUhf","output_index":0,"sequence_number":20,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" with","item_id":"rs_065915db01d8635a016a3c1256d2dc81a3a6206cbb8ad411b6","obfuscation":"dXI2xnkRlzS","output_index":0,"sequence_number":21,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" \"","item_id":"rs_065915db01d8635a016a3c1256d2dc81a3a6206cbb8ad411b6","obfuscation":"QbG9NxFiircApr","output_index":0,"sequence_number":22,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":"right","item_id":"rs_065915db01d8635a016a3c1256d2dc81a3a6206cbb8ad411b6","obfuscation":"BhYVmfxTlfD","output_index":0,"sequence_number":23,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" now","item_id":"rs_065915db01d8635a016a3c1256d2dc81a3a6206cbb8ad411b6","obfuscation":"kj8q4GtKTmeu","output_index":0,"sequence_number":24,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":".\"","item_id":"rs_065915db01d8635a016a3c1256d2dc81a3a6206cbb8ad411b6","obfuscation":"GXe9uxjJC6kIQx","output_index":0,"sequence_number":25,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" I","item_id":"rs_065915db01d8635a016a3c1256d2dc81a3a6206cbb8ad411b6","obfuscation":"daEgbfUXTJOosf","output_index":0,"sequence_number":26,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" think","item_id":"rs_065915db01d8635a016a3c1256d2dc81a3a6206cbb8ad411b6","obfuscation":"HGkeVOhCFo","output_index":0,"sequence_number":27,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" it","item_id":"rs_065915db01d8635a016a3c1256d2dc81a3a6206cbb8ad411b6","obfuscation":"guwoYnOxQDfdz","output_index":0,"sequence_number":28,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":"’s","item_id":"rs_065915db01d8635a016a3c1256d2dc81a3a6206cbb8ad411b6","obfuscation":"qMxfeZtkMEyg7x","output_index":0,"sequence_number":29,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" best","item_id":"rs_065915db01d8635a016a3c1256d2dc81a3a6206cbb8ad411b6","obfuscation":"yEwhjIIgMHb","output_index":0,"sequence_number":30,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" not","item_id":"rs_065915db01d8635a016a3c1256d2dc81a3a6206cbb8ad411b6","obfuscation":"EaHLCl0AlcSd","output_index":0,"sequence_number":31,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" to","item_id":"rs_065915db01d8635a016a3c1256d2dc81a3a6206cbb8ad411b6","obfuscation":"NIo6bcMAyk98M","output_index":0,"sequence_number":32,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" over","item_id":"rs_065915db01d8635a016a3c1256d2dc81a3a6206cbb8ad411b6","obfuscation":"IoR3LurRzt1","output_index":0,"sequence_number":33,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":"comp","item_id":"rs_065915db01d8635a016a3c1256d2dc81a3a6206cbb8ad411b6","obfuscation":"nu6g0PxLOCMY","output_index":0,"sequence_number":34,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":"licate","item_id":"rs_065915db01d8635a016a3c1256d2dc81a3a6206cbb8ad411b6","obfuscation":"lr3qVQ1jSJ","output_index":0,"sequence_number":35,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" things","item_id":"rs_065915db01d8635a016a3c1256d2dc81a3a6206cbb8ad411b6","obfuscation":"IH5MS1u4U","output_index":0,"sequence_number":36,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":".","item_id":"rs_065915db01d8635a016a3c1256d2dc81a3a6206cbb8ad411b6","obfuscation":"TVa9yACT18eQePB","output_index":0,"sequence_number":37,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" The","item_id":"rs_065915db01d8635a016a3c1256d2dc81a3a6206cbb8ad411b6","obfuscation":"5y8NJvrFctXk","output_index":0,"sequence_number":38,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" returned","item_id":"rs_065915db01d8635a016a3c1256d2dc81a3a6206cbb8ad411b6","obfuscation":"NcUOvYL","output_index":0,"sequence_number":39,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" value","item_id":"rs_065915db01d8635a016a3c1256d2dc81a3a6206cbb8ad411b6","obfuscation":"ziara07Ejc","output_index":0,"sequence_number":40,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" could","item_id":"rs_065915db01d8635a016a3c1256d2dc81a3a6206cbb8ad411b6","obfuscation":"hWRGxvLGTD","output_index":0,"sequence_number":41,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" reflect","item_id":"rs_065915db01d8635a016a3c1256d2dc81a3a6206cbb8ad411b6","obfuscation":"XGZB0Imv","output_index":0,"sequence_number":42,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" the","item_id":"rs_065915db01d8635a016a3c1256d2dc81a3a6206cbb8ad411b6","obfuscation":"flcWmWgY4957","output_index":0,"sequence_number":43,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" midday","item_id":"rs_065915db01d8635a016a3c1256d2dc81a3a6206cbb8ad411b6","obfuscation":"h03eTfyOH","output_index":0,"sequence_number":44,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" high","item_id":"rs_065915db01d8635a016a3c1256d2dc81a3a6206cbb8ad411b6","obfuscation":"HMTS8lmr1Ma","output_index":0,"sequence_number":45,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" or","item_id":"rs_065915db01d8635a016a3c1256d2dc81a3a6206cbb8ad411b6","obfuscation":"GSxcSOIdOAyU2","output_index":0,"sequence_number":46,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" other","item_id":"rs_065915db01d8635a016a3c1256d2dc81a3a6206cbb8ad411b6","obfuscation":"ut2M1XFmlF","output_index":0,"sequence_number":47,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" specifics","item_id":"rs_065915db01d8635a016a3c1256d2dc81a3a6206cbb8ad411b6","obfuscation":"ImLUJM","output_index":0,"sequence_number":48,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":".","item_id":"rs_065915db01d8635a016a3c1256d2dc81a3a6206cbb8ad411b6","obfuscation":"lpMpoTyoEZhOUWf","output_index":0,"sequence_number":49,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" I","item_id":"rs_065915db01d8635a016a3c1256d2dc81a3a6206cbb8ad411b6","obfuscation":"S9RtjfjYJhY0HP","output_index":0,"sequence_number":50,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":"’ll","item_id":"rs_065915db01d8635a016a3c1256d2dc81a3a6206cbb8ad411b6","obfuscation":"usyZ3caHxfBOy","output_index":0,"sequence_number":51,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" keep","item_id":"rs_065915db01d8635a016a3c1256d2dc81a3a6206cbb8ad411b6","obfuscation":"oOAtWGGkcGF","output_index":0,"sequence_number":52,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" the","item_id":"rs_065915db01d8635a016a3c1256d2dc81a3a6206cbb8ad411b6","obfuscation":"RPbYrhUgn6lV","output_index":0,"sequence_number":53,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" tone","item_id":"rs_065915db01d8635a016a3c1256d2dc81a3a6206cbb8ad411b6","obfuscation":"GuMY0xlR0gs","output_index":0,"sequence_number":54,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" friendly","item_id":"rs_065915db01d8635a016a3c1256d2dc81a3a6206cbb8ad411b6","obfuscation":"k30OEpx","output_index":0,"sequence_number":55,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" and","item_id":"rs_065915db01d8635a016a3c1256d2dc81a3a6206cbb8ad411b6","obfuscation":"Yqwn7cOg8W7T","output_index":0,"sequence_number":56,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" straightforward","item_id":"rs_065915db01d8635a016a3c1256d2dc81a3a6206cbb8ad411b6","obfuscation":"","output_index":0,"sequence_number":57,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":".","item_id":"rs_065915db01d8635a016a3c1256d2dc81a3a6206cbb8ad411b6","obfuscation":"7P7PXqQvtN4EicY","output_index":0,"sequence_number":58,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" It's","item_id":"rs_065915db01d8635a016a3c1256d2dc81a3a6206cbb8ad411b6","obfuscation":"FdmqlaktFHW","output_index":0,"sequence_number":59,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" important","item_id":"rs_065915db01d8635a016a3c1256d2dc81a3a6206cbb8ad411b6","obfuscation":"D7GOan","output_index":0,"sequence_number":60,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" to","item_id":"rs_065915db01d8635a016a3c1256d2dc81a3a6206cbb8ad411b6","obfuscation":"CiPdv3YEIaZ7H","output_index":0,"sequence_number":61,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" me","item_id":"rs_065915db01d8635a016a3c1256d2dc81a3a6206cbb8ad411b6","obfuscation":"gnDR5OwsUlYP3","output_index":0,"sequence_number":62,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" that","item_id":"rs_065915db01d8635a016a3c1256d2dc81a3a6206cbb8ad411b6","obfuscation":"4yJTQqjUD0J","output_index":0,"sequence_number":63,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" the","item_id":"rs_065915db01d8635a016a3c1256d2dc81a3a6206cbb8ad411b6","obfuscation":"3d1aHYVnFcNP","output_index":0,"sequence_number":64,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" final","item_id":"rs_065915db01d8635a016a3c1256d2dc81a3a6206cbb8ad411b6","obfuscation":"RwzM3phpc2","output_index":0,"sequence_number":65,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" response","item_id":"rs_065915db01d8635a016a3c1256d2dc81a3a6206cbb8ad411b6","obfuscation":"SfReASH","output_index":0,"sequence_number":66,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" is","item_id":"rs_065915db01d8635a016a3c1256d2dc81a3a6206cbb8ad411b6","obfuscation":"8AwIvG5ltB6ET","output_index":0,"sequence_number":67,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" clear","item_id":"rs_065915db01d8635a016a3c1256d2dc81a3a6206cbb8ad411b6","obfuscation":"tEFgG73zNF","output_index":0,"sequence_number":68,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" and","item_id":"rs_065915db01d8635a016a3c1256d2dc81a3a6206cbb8ad411b6","obfuscation":"pGu6QKg3wUJN","output_index":0,"sequence_number":69,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" user","item_id":"rs_065915db01d8635a016a3c1256d2dc81a3a6206cbb8ad411b6","obfuscation":"PMRhObOgDKo","output_index":0,"sequence_number":70,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":"-friendly","item_id":"rs_065915db01d8635a016a3c1256d2dc81a3a6206cbb8ad411b6","obfuscation":"xjvojXc","output_index":0,"sequence_number":71,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" without","item_id":"rs_065915db01d8635a016a3c1256d2dc81a3a6206cbb8ad411b6","obfuscation":"Bq2p1MZ7","output_index":0,"sequence_number":72,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" unnecessary","item_id":"rs_065915db01d8635a016a3c1256d2dc81a3a6206cbb8ad411b6","obfuscation":"Cqn0","output_index":0,"sequence_number":73,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" complexity","item_id":"rs_065915db01d8635a016a3c1256d2dc81a3a6206cbb8ad411b6","obfuscation":"YsQeD","output_index":0,"sequence_number":74,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":".","item_id":"rs_065915db01d8635a016a3c1256d2dc81a3a6206cbb8ad411b6","obfuscation":"30ok7zuT6co8AKL","output_index":0,"sequence_number":75,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" Let","item_id":"rs_065915db01d8635a016a3c1256d2dc81a3a6206cbb8ad411b6","obfuscation":"2HHBuNiEQB2n","output_index":0,"sequence_number":76,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":"’s","item_id":"rs_065915db01d8635a016a3c1256d2dc81a3a6206cbb8ad411b6","obfuscation":"dPZyHUMeZC4UvK","output_index":0,"sequence_number":77,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" get","item_id":"rs_065915db01d8635a016a3c1256d2dc81a3a6206cbb8ad411b6","obfuscation":"gwPtLsRCDczi","output_index":0,"sequence_number":78,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" this","item_id":"rs_065915db01d8635a016a3c1256d2dc81a3a6206cbb8ad411b6","obfuscation":"rUDGmc1Itks","output_index":0,"sequence_number":79,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" right","item_id":"rs_065915db01d8635a016a3c1256d2dc81a3a6206cbb8ad411b6","obfuscation":"NDB1smEuvl","output_index":0,"sequence_number":80,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":"!","item_id":"rs_065915db01d8635a016a3c1256d2dc81a3a6206cbb8ad411b6","obfuscation":"zP7MzU8YbJOlNTh","output_index":0,"sequence_number":81,"summary_index":0} + + event: response.reasoning_summary_text.done + data: {"type":"response.reasoning_summary_text.done","item_id":"rs_065915db01d8635a016a3c1256d2dc81a3a6206cbb8ad411b6","output_index":0,"sequence_number":82,"summary_index":0,"text":"**Finalizing the response**\n\nI can mention the time of day, but since that wasn't provided, I'll just stick with \"right now.\" I think it’s best not to overcomplicate things. The returned value could reflect the midday high or other specifics. I’ll keep the tone friendly and straightforward. It's important to me that the final response is clear and user-friendly without unnecessary complexity. Let’s get this right!"} + + event: response.reasoning_summary_part.done + data: {"type":"response.reasoning_summary_part.done","item_id":"rs_065915db01d8635a016a3c1256d2dc81a3a6206cbb8ad411b6","output_index":0,"part":{"type":"summary_text","text":"**Finalizing the response**\n\nI can mention the time of day, but since that wasn't provided, I'll just stick with \"right now.\" I think it’s best not to overcomplicate things. The returned value could reflect the midday high or other specifics. I’ll keep the tone friendly and straightforward. It's important to me that the final response is clear and user-friendly without unnecessary complexity. Let’s get this right!"},"sequence_number":83,"summary_index":0} + + event: response.output_item.done + data: {"type":"response.output_item.done","item":{"id":"rs_065915db01d8635a016a3c1256d2dc81a3a6206cbb8ad411b6","type":"reasoning","content":[],"encrypted_content":"gAAAAABqPBJc4a19bWzRV5X76yoaKtnXWnU_ys5oZz-xUYk19AAi86w00Y2six2ZdiUatgIyDmTpukS5LkpbkUVvyLydHvPc2NG0Bb4jS8wz6KKJhK-RtEuNdC-5jbfEGgBYWotWfNoL74qdRD6GzhA8vW6-TKxbJf6lK7FZtwMVzj4r9a4mgtp_vB1gm1irF17GoK2SJUdv9qxlZtyX75uT3g7CYSumdfVu0p9l4gefbRXmmfohMHDnG8UuvW2JF5lpVJ8B0Icg4kLUoTiU1k1GmM9zrZHeKocONPC8X1V6xyMw8vEAtmDLTlILK-qDJICUCDE8XI7zCfU51yeELuw3KZnwIMa9-liSuI2_zZ2FNkeBwh-i_IOeGctmGixx09tPRu4JsOFKEORvKY_epImn3Pg_AOsjx2c5Rt99TibtA9rVNZz_Dq6nezsu8tHklqwZpit5DNLcvlcMchQWkWYcjNSVvWsA7B9-zdaEIOucKmiFDJC8vd9fABRxuaNAtTcw-taaxKafU6g2fUlPKZ7NGwZ3RqWgFIGOAsukZ9cEzqOhRB0XYla0qJrBMjjyADLt51--5_qHDbOnsyDBZUdTLrV6oQd0KXjbiyW7k7ynuCy-THbX8Lg5q5fW2u83-aq9n0Uce8_F865c661gUDWxe_pfYiw-_ENszr_e9NUG-ieSREVDWrtiuKHHPEpC0EfusjtSBdfTFKG6XrSoMYgAPnhrTssYLbQoHM6M7x_dnMffDLJi9sYmxl0Wn5wTgo_kHTKsrx86GSKhd-KuqTprl6BTLXTEnoSxJQkQk_uOtoKkGxmXBIj6ZkYNkh3QQmv9qV13qeGqrkgwpUm1DFHOSL5Tf9L5qrdWbpBjJ_Wzz6lxQIxTzYk3kg27o6uF7_WAEIiiU61O2-wvfwfFjH7BEFKrcyIv6WjFpPZwvsMP4basKARBA8z-JfAlxZTjCr1vBSjiNvyWIANtAp94oaRY18-IY0YS_7Pi7wZCVddU22M_LV8-FnbTzkryRweJhRds5eF5yitkAjWZQXtN4Y_CnqhubnKCCj788mg3JKcdpPR92ks72eWKYKPrixGNNo1Zcgggkg3QadQZLRK76KddU_bIF2FqwnyNpDYWKeHbezDavO1Ajw-SS0ioAlSvTBFxRlmQUhd2WjTjAee6sK_cQg2Hl26oNMY_bBiXHLc_Tx828Xr3BOyWUIjffyz0MBVvu9bTyC-t-44871Bv6eQIKL9xbV8LCeNXp2vwptWDa1QCfTQO2VzQCpgK5BcM-LBwp-ms_0Pjybq1mwfFniCylEgIKZ2VXgJoDcoOVJURe3AnyrGYgkXcRvJWybqMZD-BaAkOsp9PNhYyiW54wAJBXpgbhtJZeQ8NDo8YAzmXoFnuuIDwTdo0VV4-vE2LMSm_OINmYJr-GluVkNuxrEeVsbSsmcOwVSqKBqfLMorsmrVFRyMglYebZgjx6e7dSAC_vLLT7nxvrsLUvNvSJrgNecRk-YjrHm14bpDts9VUTei1xkEOPok4JD_1EdzfmJwf_-CGh4oAqzkMuGDa6OP0lOvC6B-lUjAJFWNOrASheFMhMF_phgiKsIKDoDP7VgxCnfNJE6oEsOK7jfEv7SGyodWQS0hKYBhDopVQEmmAfCDkqo0wAWSw_k-5sSEEAP-Ytyn9ZVmrriaq7AiYKiko_K6S49IQrhAZJRtSdETBojyQsDMKli4j274UDnNPfI4PTrRHNKPULeGh5qra2tXCA81ctrPeMzSbATDLDX90uxr3Iq7StFSknLQnLkvIcZvA5R7oDEhISMa1LJSGI534hIAao2q5YVs90Q52mbfhk4AYbxJyZ9_9gxb0x9FuRFLoFN-m4YZ6SAxonF4r8H0T29wvPFFXzxRs1l5sa3J83WBCmpBR_ugHyQdAUsqkY58xqbyXQgIApCwtMnoT8p0mx6j8epHPmXMj1GYTqoFP_EC15Uqr6nLcY4AkrSVAQgaaA17tYEEPDuSukrJ7fZCyBI4x4ToYk4Usf1QafXpLzWc_20RD3U-lkyTfKGVLwBMLJ2Sago9iR179UotGNgR_JWPGbdWygQgLhsg0qViRXEyl9bk0o0Mi91Su3uScRvPGDNi_dew_KMLF91Zy4pNAYJ4ySsRkHyu-qbU6NCs_XFswM8iZc3zRBCCNfd57aUYhYVU7duE6NOGpZwp4HwnOnDVcneCPLHLUAHEiqBk8xoQLIm0F8-Pglj8bSZ630vVzVh927I10y4Z1A1YablslFN-KwktCBMNOJRo953bG3_7pAMGryRjfsUa-ymxXv0Yt10liVzFdNo_DJeR2xN3HwZz-u30Pscu9oF1NVVduMrWVVqJAo1FnXgXFEmbCiKQImX6gjB6aqT66vb43VZIus84lS0fafkb-a4Zdi5gsn1QCWPx1zmPpuegaNf8KYKB8bLsHD1msvxLW4RlwkH94at9QuZ0zlewAbF8f5ZBsbphYOee8_vZMw6c4ilpwvM_vD-690vLJGu3c3PKsuraRjPQZaSrONtYx8YVmKFXKec2WP6O5PTmw_TYpz6hG-gqlI6CHYEy-KskQ1zP6-FwrPYL_sFkxCtW9iNyQ8D2SXqo0Y1FhFBmwpTUO12im7uhEXN37np-V7DqCdHypazofFUOEu_p5ov8SWYpwydFadatmvPSNY3pe_f1eG5qbzHp2ewsytCeA7f-lxAnFggt-GHoW1tFbfMRPhhdvXhUhZCraJ_pyVL32zrwOheEsC7agQ3lBwfvw7dcbyBL2jiGG51roiAYBmg9uL5v439n2klYJspqVcEgS3cy87QVBUz-RPQiSX_-Oz6TY7NH9M8oFPTQM3oNGsohnoGpDPQZuHy9iM5VyWy9lVDCFHSLFfg06FlT52QLtJ1zE-NZiOx3G6QPGXJ06oU8pYep7alvYRsHg4Ca6jpCxhhJGngLi-xUWUtmetQjvu99--egOlz0pLf8ImYp9Rrl3cEXxR7KDQU2Gz3hgljH_VObpMbXL0Jm0X-ntCAvF6zsbaZN3BpRPz9BDE3xjdZ7LvcbmfBjfbRhF3JlGFlJYLLc9MU9wXHf5FZgI_fQubcHtK16v5YHJTZXP5CFohwd4e2E2h47aB7G27CtqaN0CUf6aLOWG1c6r9yW_1joSCIfrdpfZCG33f4YsYLzRLc75L-mG8S9byQhr0bOvXsJM4a5K4wSDl6okG9ucjCja5Dt8CX6QGlreQQE8SvoJ0xQEQWmUvcA64ppysDLecYLssqlUqyfA_WNz0sx5asOP8Yc5vZ0UrJMWzHIiKqFyboo229jQvM7sW3mUogiaOIFzL3G1zi5sSytwNQh_BQzTPw8pN6P8-4QfvKKZj7YlPgN4sWFk0aavf5cHIudXtSLiRb2ClibaUclbjDU9Go98PhHNlUEq-n4hy1cH3iG4z9D8FLfVNil1yLjEmmFHhd0Yr2Nt5z3wzJ6ZOdBHjLf5SZ3f65Yb3kyIrZPzT7JJtEmcCF8ESjn5WO2M5L83ikLFeyZMc9GbmP9Q_-QU9OVJJsrqnnINlk8RjE4owhLjIgV5xtAliRJQDU5jqHAEZwNWpJubPzcAueIRIwP9I_5s","summary":[{"type":"summary_text","text":"**Finalizing the response**\n\nI can mention the time of day, but since that wasn't provided, I'll just stick with \"right now.\" I think it’s best not to overcomplicate things. The returned value could reflect the midday high or other specifics. I’ll keep the tone friendly and straightforward. It's important to me that the final response is clear and user-friendly without unnecessary complexity. Let’s get this right!"}]},"output_index":0,"sequence_number":84} event: response.output_item.added - data: {"type":"response.output_item.added","item":{"id":"msg_0ccfefab56fc1e6b0169b319859c508191bfedb302db1a61b3","type":"message","status":"in_progress","content":[],"role":"assistant"},"output_index":0,"sequence_number":2} + data: {"type":"response.output_item.added","item":{"id":"msg_065915db01d8635a016a3c125c524c81a39e48ac0ebbcb6b30","type":"message","status":"in_progress","content":[],"role":"assistant"},"output_index":1,"sequence_number":85} event: response.content_part.added - data: {"type":"response.content_part.added","content_index":0,"item_id":"msg_0ccfefab56fc1e6b0169b319859c508191bfedb302db1a61b3","output_index":0,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":""},"sequence_number":3} + data: {"type":"response.content_part.added","content_index":0,"item_id":"msg_065915db01d8635a016a3c125c524c81a39e48ac0ebbcb6b30","output_index":1,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":""},"sequence_number":86} + + event: response.output_text.delta + data: {"type":"response.output_text.delta","content_index":0,"delta":"Right","item_id":"msg_065915db01d8635a016a3c125c524c81a39e48ac0ebbcb6b30","logprobs":[],"obfuscation":"bQHwqldZeg0","output_index":1,"sequence_number":87} + + event: response.output_text.delta + data: {"type":"response.output_text.delta","content_index":0,"delta":" now","item_id":"msg_065915db01d8635a016a3c125c524c81a39e48ac0ebbcb6b30","logprobs":[],"obfuscation":"oUuEh3DiAb9G","output_index":1,"sequence_number":88} + + event: response.output_text.delta + data: {"type":"response.output_text.delta","content_index":0,"delta":" in","item_id":"msg_065915db01d8635a016a3c125c524c81a39e48ac0ebbcb6b30","logprobs":[],"obfuscation":"eDjVaXxC5Nxqw","output_index":1,"sequence_number":89} + + event: response.output_text.delta + data: {"type":"response.output_text.delta","content_index":0,"delta":" Florence","item_id":"msg_065915db01d8635a016a3c125c524c81a39e48ac0ebbcb6b30","logprobs":[],"obfuscation":"q1m3IAl","output_index":1,"sequence_number":90} + + event: response.output_text.delta + data: {"type":"response.output_text.delta","content_index":0,"delta":",","item_id":"msg_065915db01d8635a016a3c125c524c81a39e48ac0ebbcb6b30","logprobs":[],"obfuscation":"avobKV4bQ0tEMIE","output_index":1,"sequence_number":91} + + event: response.output_text.delta + data: {"type":"response.output_text.delta","content_index":0,"delta":" Italy","item_id":"msg_065915db01d8635a016a3c125c524c81a39e48ac0ebbcb6b30","logprobs":[],"obfuscation":"y19bj1t7ij","output_index":1,"sequence_number":92} + + event: response.output_text.delta + data: {"type":"response.output_text.delta","content_index":0,"delta":",","item_id":"msg_065915db01d8635a016a3c125c524c81a39e48ac0ebbcb6b30","logprobs":[],"obfuscation":"ee98EyYKZh1lVFB","output_index":1,"sequence_number":93} + + event: response.output_text.delta + data: {"type":"response.output_text.delta","content_index":0,"delta":" it","item_id":"msg_065915db01d8635a016a3c125c524c81a39e48ac0ebbcb6b30","logprobs":[],"obfuscation":"csp6guiFfjklT","output_index":1,"sequence_number":94} + + event: response.output_text.delta + data: {"type":"response.output_text.delta","content_index":0,"delta":"’s","item_id":"msg_065915db01d8635a016a3c125c524c81a39e48ac0ebbcb6b30","logprobs":[],"obfuscation":"hY3g1kQJgu4aYA","output_index":1,"sequence_number":95} + + event: response.output_text.delta + data: {"type":"response.output_text.delta","content_index":0,"delta":" about","item_id":"msg_065915db01d8635a016a3c125c524c81a39e48ac0ebbcb6b30","logprobs":[],"obfuscation":"BtREGyuB32","output_index":1,"sequence_number":96} + + event: response.output_text.delta + data: {"type":"response.output_text.delta","content_index":0,"delta":" ","item_id":"msg_065915db01d8635a016a3c125c524c81a39e48ac0ebbcb6b30","logprobs":[],"obfuscation":"EoBhWiXTUBvo7Cf","output_index":1,"sequence_number":97} + + event: response.output_text.delta + data: {"type":"response.output_text.delta","content_index":0,"delta":"40","item_id":"msg_065915db01d8635a016a3c125c524c81a39e48ac0ebbcb6b30","logprobs":[],"obfuscation":"4kFxHyosozR4lb","output_index":1,"sequence_number":98} + + event: response.output_text.delta + data: {"type":"response.output_text.delta","content_index":0,"delta":"°C","item_id":"msg_065915db01d8635a016a3c125c524c81a39e48ac0ebbcb6b30","logprobs":[],"obfuscation":"zzHqoSJeWvzGv8","output_index":1,"sequence_number":99} + + event: response.output_text.delta + data: {"type":"response.output_text.delta","content_index":0,"delta":" (","item_id":"msg_065915db01d8635a016a3c125c524c81a39e48ac0ebbcb6b30","logprobs":[],"obfuscation":"OsaGFPCHRSkByE","output_index":1,"sequence_number":100} + + event: response.output_text.delta + data: {"type":"response.output_text.delta","content_index":0,"delta":"104","item_id":"msg_065915db01d8635a016a3c125c524c81a39e48ac0ebbcb6b30","logprobs":[],"obfuscation":"jyxR2J9TxMv4H","output_index":1,"sequence_number":101} + + event: response.output_text.delta + data: {"type":"response.output_text.delta","content_index":0,"delta":"°F","item_id":"msg_065915db01d8635a016a3c125c524c81a39e48ac0ebbcb6b30","logprobs":[],"obfuscation":"Toy1pS3ghygp5N","output_index":1,"sequence_number":102} + + event: response.output_text.delta + data: {"type":"response.output_text.delta","content_index":0,"delta":").","item_id":"msg_065915db01d8635a016a3c125c524c81a39e48ac0ebbcb6b30","logprobs":[],"obfuscation":"XP6TdnXLGiDysp","output_index":1,"sequence_number":103} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":"It","item_id":"msg_0ccfefab56fc1e6b0169b319859c508191bfedb302db1a61b3","logprobs":[],"obfuscation":"d4vAop82iKJzKu","output_index":0,"sequence_number":4} + data: {"type":"response.output_text.delta","content_index":0,"delta":" Would","item_id":"msg_065915db01d8635a016a3c125c524c81a39e48ac0ebbcb6b30","logprobs":[],"obfuscation":"MdEEl50thq","output_index":1,"sequence_number":104} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":"’s","item_id":"msg_0ccfefab56fc1e6b0169b319859c508191bfedb302db1a61b3","logprobs":[],"obfuscation":"kJaGYSAaOIKtVl","output_index":0,"sequence_number":5} + data: {"type":"response.output_text.delta","content_index":0,"delta":" you","item_id":"msg_065915db01d8635a016a3c125c524c81a39e48ac0ebbcb6b30","logprobs":[],"obfuscation":"d8tr08WIWvuT","output_index":1,"sequence_number":105} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" currently","item_id":"msg_0ccfefab56fc1e6b0169b319859c508191bfedb302db1a61b3","logprobs":[],"obfuscation":"hdnccA","output_index":0,"sequence_number":6} + data: {"type":"response.output_text.delta","content_index":0,"delta":" like","item_id":"msg_065915db01d8635a016a3c125c524c81a39e48ac0ebbcb6b30","logprobs":[],"obfuscation":"fnoZxIURtQ2","output_index":1,"sequence_number":106} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" about","item_id":"msg_0ccfefab56fc1e6b0169b319859c508191bfedb302db1a61b3","logprobs":[],"obfuscation":"y9piFMXEwA","output_index":0,"sequence_number":7} + data: {"type":"response.output_text.delta","content_index":0,"delta":" a","item_id":"msg_065915db01d8635a016a3c125c524c81a39e48ac0ebbcb6b30","logprobs":[],"obfuscation":"hUUFFJjWlBkekW","output_index":1,"sequence_number":107} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" ","item_id":"msg_0ccfefab56fc1e6b0169b319859c508191bfedb302db1a61b3","logprobs":[],"obfuscation":"Q2RkLXsLRaNeRlH","output_index":0,"sequence_number":8} + data: {"type":"response.output_text.delta","content_index":0,"delta":" forecast","item_id":"msg_065915db01d8635a016a3c125c524c81a39e48ac0ebbcb6b30","logprobs":[],"obfuscation":"s4VT01C","output_index":1,"sequence_number":108} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":"40","item_id":"msg_0ccfefab56fc1e6b0169b319859c508191bfedb302db1a61b3","logprobs":[],"obfuscation":"a4F08v739YZJYR","output_index":0,"sequence_number":9} + data: {"type":"response.output_text.delta","content_index":0,"delta":" or","item_id":"msg_065915db01d8635a016a3c125c524c81a39e48ac0ebbcb6b30","logprobs":[],"obfuscation":"ySdPzww37T4V4","output_index":1,"sequence_number":109} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":"°C","item_id":"msg_0ccfefab56fc1e6b0169b319859c508191bfedb302db1a61b3","logprobs":[],"obfuscation":"qKXfKjG7tOF7s7","output_index":0,"sequence_number":10} + data: {"type":"response.output_text.delta","content_index":0,"delta":" details","item_id":"msg_065915db01d8635a016a3c125c524c81a39e48ac0ebbcb6b30","logprobs":[],"obfuscation":"YMZAfE9G","output_index":1,"sequence_number":110} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" in","item_id":"msg_0ccfefab56fc1e6b0169b319859c508191bfedb302db1a61b3","logprobs":[],"obfuscation":"tnV9j0eLVCIdJ","output_index":0,"sequence_number":11} + data: {"type":"response.output_text.delta","content_index":0,"delta":" like","item_id":"msg_065915db01d8635a016a3c125c524c81a39e48ac0ebbcb6b30","logprobs":[],"obfuscation":"xwfL3vNTotA","output_index":1,"sequence_number":111} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" Florence","item_id":"msg_0ccfefab56fc1e6b0169b319859c508191bfedb302db1a61b3","logprobs":[],"obfuscation":"tsXE1KZ","output_index":0,"sequence_number":12} + data: {"type":"response.output_text.delta","content_index":0,"delta":" wind","item_id":"msg_065915db01d8635a016a3c125c524c81a39e48ac0ebbcb6b30","logprobs":[],"obfuscation":"C2OzUYFxofD","output_index":1,"sequence_number":112} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":",","item_id":"msg_0ccfefab56fc1e6b0169b319859c508191bfedb302db1a61b3","logprobs":[],"obfuscation":"Qaq2RKasMMLem5D","output_index":0,"sequence_number":13} + data: {"type":"response.output_text.delta","content_index":0,"delta":" and","item_id":"msg_065915db01d8635a016a3c125c524c81a39e48ac0ebbcb6b30","logprobs":[],"obfuscation":"9TUezPrNAMWo","output_index":1,"sequence_number":113} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" Italy","item_id":"msg_0ccfefab56fc1e6b0169b319859c508191bfedb302db1a61b3","logprobs":[],"obfuscation":"WB9wBWEySD","output_index":0,"sequence_number":14} + data: {"type":"response.output_text.delta","content_index":0,"delta":" humidity","item_id":"msg_065915db01d8635a016a3c125c524c81a39e48ac0ebbcb6b30","logprobs":[],"obfuscation":"IMBbDeK","output_index":1,"sequence_number":114} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":".","item_id":"msg_0ccfefab56fc1e6b0169b319859c508191bfedb302db1a61b3","logprobs":[],"obfuscation":"yGRLy8fWPesJP77","output_index":0,"sequence_number":15} + data: {"type":"response.output_text.delta","content_index":0,"delta":"?","item_id":"msg_065915db01d8635a016a3c125c524c81a39e48ac0ebbcb6b30","logprobs":[],"obfuscation":"MDZnVmCa5QRk96J","output_index":1,"sequence_number":115} event: response.output_text.done - data: {"type":"response.output_text.done","content_index":0,"item_id":"msg_0ccfefab56fc1e6b0169b319859c508191bfedb302db1a61b3","logprobs":[],"output_index":0,"sequence_number":16,"text":"It’s currently about 40°C in Florence, Italy."} + data: {"type":"response.output_text.done","content_index":0,"item_id":"msg_065915db01d8635a016a3c125c524c81a39e48ac0ebbcb6b30","logprobs":[],"output_index":1,"sequence_number":116,"text":"Right now in Florence, Italy, it’s about 40°C (104°F). Would you like a forecast or details like wind and humidity?"} event: response.content_part.done - data: {"type":"response.content_part.done","content_index":0,"item_id":"msg_0ccfefab56fc1e6b0169b319859c508191bfedb302db1a61b3","output_index":0,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":"It’s currently about 40°C in Florence, Italy."},"sequence_number":17} + data: {"type":"response.content_part.done","content_index":0,"item_id":"msg_065915db01d8635a016a3c125c524c81a39e48ac0ebbcb6b30","output_index":1,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":"Right now in Florence, Italy, it’s about 40°C (104°F). Would you like a forecast or details like wind and humidity?"},"sequence_number":117} event: response.output_item.done - data: {"type":"response.output_item.done","item":{"id":"msg_0ccfefab56fc1e6b0169b319859c508191bfedb302db1a61b3","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"It’s currently about 40°C in Florence, Italy."}],"role":"assistant"},"output_index":0,"sequence_number":18} + data: {"type":"response.output_item.done","item":{"id":"msg_065915db01d8635a016a3c125c524c81a39e48ac0ebbcb6b30","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"Right now in Florence, Italy, it’s about 40°C (104°F). Would you like a forecast or details like wind and humidity?"}],"role":"assistant"},"output_index":1,"sequence_number":118} event: response.completed - data: {"type":"response.completed","response":{"id":"resp_0ccfefab56fc1e6b0169b31984ef988191b502d872c2499f4c","object":"response","created_at":1773345156,"status":"completed","background":false,"completed_at":1773345158,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":null,"max_tool_calls":null,"model":"gpt-5-2025-08-07","output":[{"id":"msg_0ccfefab56fc1e6b0169b319859c508191bfedb302db1a61b3","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"It’s currently about 40°C in Florence, Italy."}],"role":"assistant"}],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":"high","summary":"detailed"},"safety_identifier":null,"service_tier":"default","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":{"input_tokens":99,"input_tokens_details":{"cached_tokens":0},"output_tokens":16,"output_tokens_details":{"reasoning_tokens":0},"total_tokens":115},"user":null,"metadata":{}},"sequence_number":19} + data: {"type":"response.completed","response":{"id":"resp_065915db01d8635a016a3c125658a081a38159e7d307d23d65","object":"response","created_at":1782321750,"status":"completed","background":false,"completed_at":1782321756,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":null,"max_tool_calls":null,"model":"gpt-5-2025-08-07","moderation":null,"output":[{"id":"rs_065915db01d8635a016a3c1256d2dc81a3a6206cbb8ad411b6","type":"reasoning","content":[],"encrypted_content":"gAAAAABqPBJcKfP7v0YMwSxc8wKU2ENQiAD85ZKhtt3Nnoew5TYz_F6XMiSk-RRoH3I2d8fIHXALYQzvCayS6FsAf8-VnXrEJL8d2fF6OLBbXI3DERkcebxt8D53I7vds-1er127wynKn9QmtbvsYppdNWszxVH1wNogPLc2ajE_jtA0wArqG1uSbUgIlzM37KJjSHdoBrY6HioDQilmHg3hr5h_ssSvWvGYl7v3TFprPE7bgagB-oyCmNO2CQRAuBHtXn-BXGbXvS7QFmigr2VboyzPr1iTcLHWy-VqXf92fICuCs7NekfONRr09EoJjzxONZVrqurfcTwvwc_OpH3NQHl7pO9C0WnxgJpaQQ6d9CAlincLhlYQ17BkubQ87_oFjxfZpZsb9zBcZDmrzutRJ-m03zuR6m9azzeWV08Ca873zVupjzDM0SyiT5WSfQ8vbZ9xfumRs6_-R3sD7_mMBG5AZT7ns3sFKLzdSbPNR10UMgdyIHdkEx9ZA2uWrvfDMxI1L2KsSXHquca6WlVxmwcpsPTZWtqvYJFdqLoMFmCKBschJZ2Jizv12OwE-iUIbKsE2rLppHc8IXGLqKgW4arXM4Ir1Cd_CnyAkNiXi_MAs4mD5PBelppLsAHYoI2b4uiqJMpeG1XQfd2Aygj0NBBvJmG7BwtLbjak90GhLBkuIJfopXrSBYR5fgKslvd9ac1DjYNY3OmZyTcpdj19rTaicN-qEsMYfVxxoDvZHiC1EMt3Mn9jls7CYRewsMptL5EN6fsvitRw92mXYlX5Z9-gjP5JloPRXxkeHXhqHzWzVeSW3jO3-DJnZqaDESN55jS9h_yONT7jBOggNwecGVJ4d74cfZ5iLj8bZSQGDYD56qyLlpI4ek0ujZGdP8uzUsvHQ1QxyFL-KmNsRe2l47aX-tT-fu3XfwPBdsV7OXBV3jzDnwIBF4tThEzKDh_PLrMw3AaN6INS7tw9sbkMNUPCw2VGM7GtxNJ02YNYYiFtCfFBbRGwsPoK5RwGQi3RucyO5mcUz7oyuCBgm-qhwkFVCRT0fUzu7jQswCOaGq2iAHxrgONCMeu6FbFkgIK3kyy84g5Tzq14nxUBE0gNZ8DAOaH9RVOwurdVpSidk8a5SOiDAQqarKUdI0DHWD91YVJnm7IKTQK4ZrMBhRvetgDS2wRvavoJ8AxbI8CHTMNtD5waaDi_DPw_G5yVqK2-axjcVgjSgvQcxM4Fm36_PC-3x2i1tEe2bI9UhKKPmQkpwJQ99DCfTZlpNvDseH76bkjThUabDGl5fzNAhnF11CubLjm56cco85-NHzfqj60EUN83T_8ILfXrpdyks_-RnfaARtaeIAgYLtAUzIstas6Srx2Eu2TvqvzQ_VJKEyPoi9UhqYNDSOibHSddwOJXalW9cSmHgxFl4CiN7IjgySFEKWjXI-DaIcmyOF0ENXQ4ERgNjEAfk29HnXPML1F20pLDcDLwpGFcxwvRSGvsAq81N793nhEbxQJnHAoD_Kr2IyulKTTEh-enueof6YWilp5RxQ7MY2Kzkeg5AaWoNg1JFqicH92aif8is8gn_660c018bsir0MwkEVLjVuvuEDRoA0dDDN0olMl7cCSNp_PJD5LTWkYUlLrKoSaCHiUUGJLb8bLWUiUbte_YS3G_wcmInId5xSpnSZOvA5io305_nxZ389tzqLtAlXvjsvGmczkVpacfK08u0_NY02bUv4TqkwlITKyyo9WGRnu1NCuptqetpuyF70qFM4CbwgmuY_8wIJoQNAZ3ALWgNDgUB0Gt2oBN8xNw2CFEPscRFX8y2Z663HunfneXvi-xKS0ZzhZ3AXOC2ZwbjR9WjWP9mxD6RzDRM5Q5FXI6OGS4D_mEt_tcI_DHZn46LokfOK8Lopdc9N5doK9sP-tAYcVjiJd-hvI-sPXAYzDqHdWEPdR_fDVw3hrLeVZqe9zWnjRhfcnGGu4S5jLtknpFtKVNNO6oyJV1BzaMCwm0RUEmYazYxRa0yCSpDH9xjnYkwrSSKNk7xQyOgi2WRabjKR2n9FDUR1Ju-jE61pbZwlsh5RwH19Su1dgld9LfR6bpg90r5hwR0OlaZR3wra6CE53SjqHZQsC4_eRNApPju6YHwLaisVCVzT6vFC19_2tCQYCtErEdW2f6yv6qLt9WnDkZyUuhzs29DkB70Htn1HmQIe13zUAyPI62-ViIUattWIXL8vlICWIcRH229Zgr4pHc3Jnr7RE6vqD0EaTa2-RBxHiDF9So_70Isham9MoyoMYveUU6gfTg-wviffRH5M-gRg4AeGm5cKHLHS3oTnJRYzVzMliUW_5ZgcN_wGMsGwTdMyW8kuvGyClFWF244BjKGlMIuq0CUg7vR8Zi03RZaHLEOCLo29HbWOGroYfqvJbgm-kjw9y9yZQPGuURHjQ_92dNJIhFXjOSpjleIRZNreSE1_CyxBGzwe3YQP4kY7syLV5M0c0Y-tse2y4evzLUxqI-07R3cGAeMFw57Lt-3E8CpcpTbMyaKMPYSjJQcEmBeuwqlgf3nji8WIii5ZWZ-RCl-o7v4nplX8jKm6_Cr22CVh7NIqZiibF1M-rRvXeln-x6sRtBNwMv2nmp1eEhnmhDVDjSkhn72PQadNTHXo-zJNuQv332zDQm7KV0fCyCSf2a2qALaOMovXHYbdJrtqk77IfRA6lFzphuNhE0pSg9vbLYw1QhECYYGQnX9Oav5El47XjFry-7qz_FvShOhur8grzxNJFcdTrxtuWFDJRZCJRJ_8RmTbas3nvhylbgAK6pSLiJyM7BVKLiA99zArRmQquoJzlmv7awACKq3kFkXBZvhGAwbn1rrL-G2g9Td7YRNn5RB8zdd8s8b0cH-wPnPOslcnnsODZvj3b1yWTRZLJy4lA_VuZoTi5R4zDzGRhs1DSTjx2em7R0HTbZ3_bKs47e0fmXgtZzVNBQxFRZhXpAm9msyUNvZPoy78nzE8F6R0asdgd9rkdGmYqe8KRpSAUbab_an3_r7SpCLYLVYSgm3MfDrUAibeXCSGCobVW8sP_SCBl_bMkwEiYPmUIvteAaYM7XMx_TxKV3v9xTdPVS0vuqmOWcNUXKe1IJisR8aPOSLTrkizUMgsJEgHkcY0_qn3I8lqKhgCaxRQwfi-O5L_VVlZekBNqv_iE2DqKoET3pELTePeMgxAtuDdL7E3dB3ftU1cwDRYF58UcQmIn0khe_0TK5vqr6Lg5iOels7Uf6DgGodLpT7O09_mTmZGvpmc57r2OVvjbJVoviIcqoZhJHYuPK9Cl-JM1Al0evi4lRGfzznDogFJjeOngCKrjs-YUeAkXQsDX7ktTxe8axGpsAnpnwgv8A99VZa5o4tAGl3WSkTSdnmYhYc1VaKeMBS6h3aKSAMyHzRUEEXiF6zhpO6QR1esRSVn6Vn2qjDmqZkVe5qKllS2zIskWlksv7kD0RuTxEi--i9nk8ijEjxoPlNn8_7MTrGJJthDJ1TxCfbEhWuvHwuLpVuRCfhVkCIK2tWGhYInlzgvWpTwm9akbNq2LWKTZJRwcthUEPJayVv3iFiadgAeRHhnGqLwvY","summary":[{"type":"summary_text","text":"**Finalizing the response**\n\nI can mention the time of day, but since that wasn't provided, I'll just stick with \"right now.\" I think it’s best not to overcomplicate things. The returned value could reflect the midday high or other specifics. I’ll keep the tone friendly and straightforward. It's important to me that the final response is clear and user-friendly without unnecessary complexity. Let’s get this right!"}]},{"id":"msg_065915db01d8635a016a3c125c524c81a39e48ac0ebbcb6b30","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"Right now in Florence, Italy, it’s about 40°C (104°F). Would you like a forecast or details like wind and humidity?"}],"role":"assistant"}],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":"current_turn","effort":"high","summary":"detailed"},"safety_identifier":null,"service_tier":"default","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":{"input_tokens":92,"input_tokens_details":{"cached_tokens":0},"output_tokens":456,"output_tokens_details":{"reasoning_tokens":384},"total_tokens":548},"user":null,"metadata":{}},"sequence_number":119} headers: Content-Type: - text/event-stream; charset=utf-8 status: 200 OK code: 200 - duration: 255.065ms + duration: 338.27775ms diff --git a/providertests/testdata/TestOpenAIResponsesWithSummaryThinking/openai-gpt-5/thinking.yaml b/providertests/testdata/TestOpenAIResponsesWithSummaryThinking/openai-gpt-5/thinking.yaml index 8ad7bd43e..b5a65298c 100644 --- a/providertests/testdata/TestOpenAIResponsesWithSummaryThinking/openai-gpt-5/thinking.yaml +++ b/providertests/testdata/TestOpenAIResponsesWithSummaryThinking/openai-gpt-5/thinking.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://api.openai.com/v1/responses method: POST response: @@ -26,15 +26,15 @@ interactions: uncompressed: true body: |- { - "id": "resp_075b435690aee51e0169b3196ee5ec819ea14e6d34ecdd4aed", + "id": "resp_0d8949369356df9a016a3c12432020819c956937a00dcc1a84", "object": "response", - "created_at": 1773345134, + "created_at": 1782321731, "status": "completed", "background": false, "billing": { "payer": "developer" }, - "completed_at": 1773345139, + "completed_at": 1782321735, "error": null, "frequency_penalty": 0.0, "incomplete_details": null, @@ -42,24 +42,26 @@ interactions: "max_output_tokens": null, "max_tool_calls": null, "model": "gpt-5-2025-08-07", + "moderation": null, "output": [ { - "id": "rs_075b435690aee51e0169b3196f54a8819e9a33c038fdc1f932", + "id": "rs_0d8949369356df9a016a3c1243e5a0819c87655df5f53e767e", "type": "reasoning", - "encrypted_content": "gAAAAABpsxlz3zqwjvVFph3GpyCoNOUWPvEYHgvC39jVaRRd3SQ2K3vbO0ocwgzzM5dsBis4F8Ow3j5jcd3B8xKCqy7Wsxsfe2zz_DaERYO_bLZc3NjID8kelhxHKcuocSNx9tVQWpNTxUoYCveFyCyveaZ3lt0u4SZGWK_ZAkfIgmsGfddN-UeUH2lyheldZajgTPwa_PZQgTpcY7ERXCM_jh__IT1zibygPsb4u5G-XPvtkjA2oirQ8KbzaWqWhjj_hOJ43g_jePL0v1LHSNC9SiIVMmbifsBoQ6smsOYl3e_227AwvLspEWH10T1FtajmyfOPGYhRr1ZPfyx2eRDcP0vMPIejfDgLfKZklJUeErKVZrx785QR4ugWM7Qr2nggdM15H2rWQoZumX-RNQNtAVYTXmnyQPwoWbtL0fQ7oZDmEw9o0rQo987rawE2cjgrE9yic4wPw14g2fciUgluYaESuuJnNa4ebOawL2iIRWzrV6GNF6B6dkxmByHv8BGwZbZV3afroFwRc3C9-3M0wglbNlwyPiWWL0VMcaHUNlyk2cEFn-sgzBv2bYPtu3KSK0ww54r2iwxoPr7BvLf61HnPeiaWVxdcrhYWexAaUjMyAtDTWzwHKVwDVVCk-uspqH_PRxu5bxq6KkOjA6COUlwCEoGeopc5f6WdopbFlYekzY4hd73DiFJYfArUfcFyLf0kB475TTeLhCQtdlsAjwZyqk2rNKxV1D4Td0RsibuanFKcKc3WsShVypvNWd7WjByl13xUHXOFZ_LN6dX_ZhfDAW21N4Yp5XWHBT59xlvF7oeh6CvdgN21SJ0HfyurQBbI4TyhwX3xB9doC-Qhh-rDURnA3LZUCN3Iudg0Eo0RjJCbmT_Crv-PthflMMT95TR6M4LXv7puGvx94Xemc7H2BtFy9E3If0Zsf8uRksxr89Er23vwkaKTtRsMvX1wGPUgpcaxyMqV5FWwLj2-dennw2lDHTk2k46YeeaeSrn0lkV-s1-pQw9GwPIy-Mcmo6Aa_ncLETgyRGHLSTH28SElvWXgsa4oa8XypwNISTATjwzgM9yGhXbmA9CVbXCuhQ0uKzGgNzsYOwBqtxS8aVigdTPj9ktCZJD2Y4GziE-i7q4FLc511fiIMQZC-MUNMQO4d7A1kEveveZZntjiP-ZfBvdXMSb24fxfKWhAguFREzVm-7V8tbweipr5s950Ae7uJqjM_TJ4xGs66lg-TLTJLCCho4EnfYqjAmU-cR1o3l6A9RQXTzW4Okmh4oKyhlsWkL2LbMKU5UUfIfnWYM8vsJA75CPR633cGscm2Ku5SNdu5bY6cReO2YN8yRqViEUi4K04ORzaO9xNLnS3tf0FYsv7g2yM88eOEsLoCpHRsXdpvslmxKYb6K4Kjo24wvLuduTy19OzCsF4v69vcgUUOAwvPnJMfdYK9mQOTUmNyxqJ-wErLLn3FkUXylUvLDsb7bQtGZqwYh2e65YuQvOzRA2Djv_dUAaVquf3bl0TQAu0iQp9ddOSfwjfH96B1ZUH2KIP", + "content": [], + "encrypted_content": "gAAAAABqPBJHBSKG_nXh83EjSbUBB9eggmyznkwZRs4IUnoYzx8pqWme8xiPKPConFGIXMh8itxBDReAXMM3jSl96JfpmY6F2yGE23HWP-lugk2JGIWFOH0sRWQ0yrenoEiz2DiRZPJRRYroUJJcOIQV29aFyDdJeORQDsoaxo0RKlLzcohfNnbi-8HfA4G-j_bz9mUUiT4CfEUDQLMBQogTqKkNizJcSGZhEJLPwerzxs1ZpihTvZMMZxFEcmB3pdqfLL3nUrwgPbnvzKTCK2UQPm08dxHZ9Cgg7irWmVsBUhAgj_CFCzPwXYiHgcO9_U7kj6a6z51pu2el3-Q9XRX1Y_56Qkgm8bI7-PRcklwhMNG28efNmkx2kAHdwguI_XXvDaHQ6o6owcAUU5gums8r-6X1_7yfjD62pRHCcnwIleCBdOS1vudfeWz9eWo87vMc3uEi_JY6EiJweRRy3oR8b0m-zDhKTK4uWaInsFJOhpy-HL3oDYGH27Nx78rvt2yDhKTuoLZ_9Z-FnicMgdC3ijSF0nERHgxewbeC3mA4nAg0iH3Z71I42HsvzJy3bDvlCScrjdhxyuo1_RyLl8CxleNCJp9LZcg-FLC3l0OCSO71VKFjb_9ZPKqaZcnxH8PF-cv__NfZ7SjvgxsHqeNZ-mE5-eEAedqVNMEGhGXSmK6xkcpqAe3XLFgjl_xUrmD7QHEYjbe1K3PYw7u3y0aDH_Wdcaa_Iif2ZqvwOHeH5ssJqFme3-kIQyo7GqmVvLXQ5Dwb4uI5jXC_T8kfRYLaf0T1cOGzvq1p2zR8CxIzdiP1wBLgxTiHHSu9WZEeIMiDw4YsmFubpKLrrIs24H0DYl_Oovsm-j7sSrfDARyWtCNhDqKqcZ8FSQuhb2tnGk2kW4IAynktLRk-fDym3nyDowxjiaUWlKfOjOWVZQibwhKTnuWShCLvEu6ouCrjaW2Jw1Kg4tqCsLYCpBCKWndN6CB00BrMpCt4f3oT_VBH-DdcWNsQooWsZQDzIfQxH0MFQGqyNl9iRr-6qVlZ2boREdZP8HwF6JvMHyZcjbButvDHOhM_e6qiwVVghrjvDyUX2zPYhdL_lQEEZXATz4N0bWQonpxJzT2Z1hSQNhhlpQcHpyFLa7rTMbuPkUqWJAYzliFVMmpa3vrRbpVjl3dy5Gb43H2Jre7-_JI62HrpgXlbwd1xr6wA7iapeYkh_9ElOBTbXl4mbt6WQkTLYlq5ZzYdH4uUC2kzciHfk2XekzSM7lVciD9Fnq-0KViZ8jD7NqQwo2vKY7zeRLfuO1hCrAH0SxiTEXcj4fHczDcgO8Ia3f5E2F3_rreQWAx_tlYUqVeGKpLEdgKtiIva0fdHME_Mz0oaQTSk2shjXwzoeAW8LxWUMKt_WFXoZOuigbmuMPHHq0RxDFgy3Bdyp4tr2LO6RUlgZnrvkm_A_tsxHP4-sb7wrsYMKTrGKI4mZoEokaoKINhBM-Ty0GnerQMePgi23WxNEgf-vq5pYphP147jtO5JoOeWvq1HZdjECHuko6lJ5zrHv0J70ecMhiLTiXL5RmXfYOvTZTGNJ4kPJ-ahE1GxsduEMCiuKpsTlcblp_JVXUagIL5TQ6v4RNNg-IFAy6jjV1DVOYiUukpULXkVf9LRECdCxJQ3Tyy-sn6C5lPHyC0gb9ePxwFntZ0wpKZ27N0-at9-kgO8vm3nNu83yIUIDEXdZ1-uK07DDUCL37KJaLmvrbW6YyZ2g-bxtdoAVRgLzFoWP8K8tJPolofFIUVWREbiM2Hz5toLmfi5BBOAM9t9613BacUiBpBZDRubyMra4qXIGFo-EZTHnuGezfjNSW0NnRqQpCs7Q32MgH9E5KWMDdmnsGbKLCvod3XdOnJqfP2yhI0koWkkqP2Uo0bguhtS10qGsNcOV3UfBh1V5MTLs275JaAKy66bthgGE2LTNzGfiwPdTkfEp-0VBJ2rE-dY-M3thKXR2BC65_SggyIeqPltzTapdxSrQOD80R7iq9wfl9R6CCmW9IipMW-rtT4waLjmQ1o3pRVlBuCoxOS_FUFp-WNrTbr3nhidFN59OUjUaqCjvqGzvedTLBoDHm55lkVthaDrQNdlt67deXErEO4wc0ea9Tf3cQ5M3TNwmSE5waJcaBPxZPYXcMg_Dorx4V1lqLEjPOj2hEVJFuRK", "summary": [ { "type": "summary_text", - "text": "**Getting weather information**\n\nI need to gather weather info, and I see that the tool functions.weather is here for that. Since we only need one call, using multi_tool_use.parallel isn't necessary. I'll go ahead and use functions.weather with the location \"Florence, Italy.\" There\u2019s no need for parallel execution. It's important to use this tool and provide the output based on whatever it returns. Time to make that call!" + "text": "**Checking weather in Florence**\n\nI need to provide a weather update for Florence, Italy. To do this, I\u2019ll call the weather function with the location specified. It seems that I only need to use one tool, so I\u2019ll stick with that. Once I make the call, I\u2019ll need to handle the response, which might come back as a JSON object. I\u2019ll aim to present the key details like temperature and conditions in a simple format." } ] }, { - "id": "fc_075b435690aee51e0169b319730394819e92318d9404c5f97f", + "id": "fc_0d8949369356df9a016a3c1247af3c819cbf1cd335423c29d9", "type": "function_call", "status": "completed", "arguments": "{\"location\":\"Florence, Italy\"}", - "call_id": "call_1z70BexeUjpiAcqPgwQiiVRh", + "call_id": "call_4QfIn5gPKIOWzKqBb5D2uuh4", "name": "weather" } ], @@ -67,8 +69,9 @@ interactions: "presence_penalty": 0.0, "previous_response_id": null, "prompt_cache_key": null, - "prompt_cache_retention": null, + "prompt_cache_retention": "in_memory", "reasoning": { + "context": "current_turn", "effort": "high", "summary": "detailed" }, @@ -111,11 +114,11 @@ interactions: "input_tokens_details": { "cached_tokens": 0 }, - "output_tokens": 128, + "output_tokens": 212, "output_tokens_details": { - "reasoning_tokens": 64 + "reasoning_tokens": 128 }, - "total_tokens": 191 + "total_tokens": 275 }, "user": null, "metadata": {} @@ -125,22 +128,22 @@ interactions: - application/json status: 200 OK code: 200 - duration: 4.511691209s + duration: 4.997731709s - id: 1 request: proto: HTTP/1.1 proto_major: 1 proto_minor: 1 - content_length: 786 + content_length: 774 host: "" - body: '{"store":false,"include":["reasoning.encrypted_content"],"input":[{"content":"You are a helpful assistant","role":"developer"},{"content":[{"text":"What''s the weather in Florence, Italy?","type":"input_text"}],"role":"user"},{"arguments":"\"{\\\"location\\\":\\\"Florence, Italy\\\"}\"","call_id":"call_1z70BexeUjpiAcqPgwQiiVRh","name":"weather","type":"function_call"},{"call_id":"call_1z70BexeUjpiAcqPgwQiiVRh","output":"40 C","type":"function_call_output"}],"model":"gpt-5","reasoning":{"effort":"high","summary":"auto"},"tool_choice":"auto","tools":[{"strict":false,"parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"name":"weather","description":"Get weather information for a location","type":"function"}]}' + body: '{"store":false,"include":["reasoning.encrypted_content"],"input":[{"content":"You are a helpful assistant","role":"developer"},{"content":[{"text":"What''s the weather in Florence, Italy?","type":"input_text"}],"role":"user"},{"arguments":"{\"location\":\"Florence, Italy\"}","call_id":"call_4QfIn5gPKIOWzKqBb5D2uuh4","name":"weather","type":"function_call"},{"call_id":"call_4QfIn5gPKIOWzKqBb5D2uuh4","output":"40 C","type":"function_call_output"}],"model":"gpt-5","reasoning":{"effort":"high","summary":"auto"},"tool_choice":"auto","tools":[{"strict":false,"parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"name":"weather","description":"Get weather information for a location","type":"function"}]}' headers: Accept: - application/json Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://api.openai.com/v1/responses method: POST response: @@ -151,15 +154,15 @@ interactions: uncompressed: true body: |- { - "id": "resp_075b435690aee51e0169b319736be0819ea63b2b27ecbb91a2", + "id": "resp_05e35f9a375fc3bf016a3c12481804819fa1f19c7594267c8a", "object": "response", - "created_at": 1773345139, + "created_at": 1782321736, "status": "completed", "background": false, "billing": { "payer": "developer" }, - "completed_at": 1773345151, + "completed_at": 1782321745, "error": null, "frequency_penalty": 0.0, "incomplete_details": null, @@ -167,20 +170,26 @@ interactions: "max_output_tokens": null, "max_tool_calls": null, "model": "gpt-5-2025-08-07", + "moderation": null, "output": [ { - "id": "rs_075b435690aee51e0169b319741a8c819e9ddb8e4886799617", + "id": "rs_05e35f9a375fc3bf016a3c12487890819fa2d595493eb1ce5c", "type": "reasoning", - "encrypted_content": "gAAAAABpsxl_jPfSWqxtyp8aqpWzeHLs-fmW8jdC7aCqvNYybxg4Ak0bpb1vy_YXoPoRThh25H6aM4URRDaMxHPduZ3osUmb4HRdgSaiKsw1I709PL44HxeHqE6fXbUmiGeLA5iJhg_kF4W_UN2zwrFzRZjFTnS13nKCK3AS5_fqbcSpVQ0RXSL5jM_hSk0J36IPJuTa7TB-J0KBgO1VwzHC_WeKjG-nXeejNb31312q6Fje8BP-YOeK_lYlT9GWeOxQ5K2ZTV49UGr_qhx6z2WpWfvETvCDmIHzy9P6oY5SA-J5xBly2ould4sfaxCM2c6eEX8g8SMdpvB6pERZwDN8j3MRLlgje6dAM90b6KlksvOpXCBBCYBrDS8-GbNejTZ_8etg7wVtgBtMnfEpLv2DarDZ1nS3naCFrcJuAqOPzfyxDEmREJhAN5pwUrKIHzkhQzfYQ2eVdJYOPANjGL_T1j6D6MSNcBDLjRwpjsC27Wer_XhsD-wKCAf1P-ylTuLwMRMiSLqhcicbt2yzW8OrPkqi8-Rxqa_nYqHmfHq7hZZ5s6FfjEeh-iK1vWBcgRlzPgFOM9a2DdpIB1WqXHb2ysCACImyqrxY6OY3J5YDN6cE8N5K4gC3simNtBLiNDae3_dbt9233ituqprv9j52u5BUbvJhqUUShKYQDLX9bP3qEi1TOcwAGI6X5JmckFz6obUWaoWZgjhM3-88Z_d-aY-oJFy2CbltjM3JVw9xM9E5VyfvmrLkLJEl0Nb5ImiH48_ICoGd2PFJl3OyjpuxVferrVtOz9ngJxju9ENha4UqnpGBmyaIqokrynH0FgUcil7Vb0BC1IWtg5Cou22i7oOW1khuOLr9bsTcmabDaQ8rIFZXITBA1Wt6Rk2FC3t1-OAWwB27RLrSbvRt5PfuBIu7J9kgGYt4jJPLDl-_vw3YHQBzDGj3t6miz_JyrAOVw0UBwuLcQgW_7sLHE6LMUXdIPX3mjqxhdAvS0WY_HUoxFznrhUCYIRWpcOFlGiUSujic8usPtXZIJDw79NSZph0e2B-WTIueFU4iYE2FAMG3PW3QKHUCib49z_YCBYIGzPfENFGJSCO8eKH33WB4dKNc7AoBsZ5WPLvDf3qHJvqNDnkMc94voQ9bf-C7syDSeTaC37H1Pb_YOk-d5oWlcruBgo_4n5Evh24tAj-U7i86VHhlmWXu0itarRB16XeRqbIDT28o_pBtCVJxhTEyJtGYwp91azDWC18V8HeIM1q9eTsyWuCKBUEb2wTxH36wIoGKiwhPpyIvj-ZqckI9-qqI4Mb5HRSp8HG6_flICJL8ukp5-idrLfVEP2YelTMYeR3af4me3fdproSWXHUWU_k6tXEaeh6O_sR9ppdYQvUeGNL5Oja3mN156PSnvImqnmisu5sWe17AcqnIGx1CV-wmIBXtgSusphHf2cs9H8d5VBHotWtdJAzlG8ZKYvWlAZZxYWmsGeWW0u55h_nzy-ubHxPs3OfHTtpvZ3zGVxq4hliWsQFHqIcV-PU9KQKU_lGV4NFIecV1Z_EpxVme__vpskB3nDWwbH_y0Y_XPiUYljC3M7sEuJqs5xGlYTeTQKHnJZh8DduFnim5f72Zh-M-pKKd7AjO7w3TkfC8mAnUEShiH4of5mX5T6x4aAQqWOrKzgM231J0QTL9kFyo95wI6ttjLSvwLvo3W0PavUuHQcRgW6uQ7RWzFoBr1GtZn521pKsCZwzuHAEQCm527jUinRAPkSm4Qq37wkBPQMpa3NS4h-S2OwFccdxCTP4fvBFqP7maapwJ6vdqOH2R-TBp-2Bc6nmRun17y0TxoRm2IQ3uDT5nzpkbVYzfGiN1Q-RXw4Tf8H0QBJdAerbpUIdpmUVkwoORRxGNmL_P_emhQX3MtAdQHIxZat31Vqvge6B3uvV40vqB4wWSgi9O055dEr_kla5ZSjuCxhR42N4Zf3OwV6bongH9gMsQRdLEGOhDWI_QEGEYTpktr_6xDmsrEuAczwLo8d6F24NDCYITLG8h3g572EfxAGvgN5XbFwwbTq2ma_sq5xmouepK824sX08s6uNo1YlQbmp4SuBpgWzSHQ_WiZxiUuG9hKuSQ_J30vdrhVFCLDc4CWMKs-m89fZY0GuawduDnTN3pGsIUwXywAegQWbTkcQobxmbtDgaHAJ8-6P9TlrsLBhGykIgtxIgcdaCdo-slzY7bmXb0AbGQpE9WSaAYFoHRW0Y4WyKVhTc_pE0mXkjJLWrW5AtivxYi-KxfwLMLc9E5bnPEXkrXf48MSzKbhrtt4pYI9NbnZv42x88G3KGZR-PznUOoslqvX7I_hqyySKW303-AYJQrDeCVHIImZ4P4YCrHs0aGfnoZpW2uy5waYJXNCpWgruAbDl4xr8bds2MfGVoFyiyA9xpNnrJ2yyyZ00iMvcO3NHqL3dti07xUon26HZ7mclCFBTmhIYqDv_HFXtyZ8yuy3qHm4t_UtO856U1kkQNztsYb4BGXglw_mTB4ktLStV8UfjmNK2PAyJFNOeQ2dod9NHD1SmsxJ3gRZd9zglvodYBfVmKrSot0ftLCvij3sAr505QaFQcQ6Hxh4TY8781dn8xdMHjZ8HTofpsZLz5itt9ec26jjbyAL5FzndJuHREWqzTvQrwgiWGkKkGdNswPJTBKSG2CoFJaDpQYfeC2STqQwLU9Xfxc33GrOHyzcGjQF4SbMErSrqFf5rMxBO3QqkXSKtxWwweD0cnWysjJwBMRal3K-8gBqMIAcJwMjwt0djQfYxdqvpCfMFNjH3MYui_jjPDmpgHYPXw2Z6u7YZ_Aw4nM2ae94soQ9AoHKVJ-nz9wUXbw-zj67nxGe1KqtCaxXtx5ua9FY_XlEZqm2lSb6RDjzrKP8Uy9hLxwoL_jD4IVdYisHzofLLBzvnyBpS6ebrj30MzpownlhlJ5UA9qvbaUKFhqLiGalwnEUA7L4maXxe_8ZnXFnwM8d3KxLDJ0mnfomZMTNgDy6ELYWrI5pOuwO4pee844EbMEnJnwzGL94RVPp69RkZivRxzg8AWn16OlrqIjjutMXg1ig8y3cL7ijv5jzHx60ys7_tvRMjIVmcCR5sbeVY_TTBnDQ3Mg5NpxWfakFwHLSL_B25z19VdIq3fctvhFVGIS_mN-eXyTTmDrNL2YizGIzWGBxy4y4TPWufSvu0O1_IS3nlSz5V1ivRy6zdZIuAtSLTOlOQpjxVfq-Dq4w66wo5sGGTwzrglQmjyj30gv8uIcODqepNtVlV_DSK3hfEymnZlWlH0ec6Akv2pF_QQWl4r7jH0Zk-oS2gvyrgUeyn7EAWUs_UrfS4059Ny77HXJ_8L4jod7SLubwBl_2IvgxvtgvOca9zMv020ceNVrW7x_kR1y3eM30XIXDRr4QyL4-sAYJ0sODI5KrTSS6jIbHrtC__5jaeLFypAFkhofVJL59Kf", + "content": [], + "encrypted_content": "gAAAAABqPBJRqcvGx5J_ZGligZTix8qLAVmVv1vM7Esg1D-4TkgljY9-cFocjYQcKEeYwshJ5YJOp34NRhMuZ-T8RsE6sbSNPRfzVgN0ELLjMyfJ_NuSFF_AZDzyn80KWicMU8YxYF67QrXn1klP8S5c2Y0UWhqn5CT8rM5kTVLNRsTnWikgg5ZfuIL0uQ_s-VlgzKhq_utXmlrTfRpePdRxsrc8mQAY_9Ym7vhz-fjYnxs3KOsZbADxxSWn7EMtb5Au7Pmzhf7Y-0QQ2dErK2jruaFKTnR5oGRMqGYitDcv1oIzRI4p_luHVRD0k8x9DujCtga3b8soxS65RS4FbFHqgCxx1HkOf0cCbCJ2JG30VmsoY-TZV-728TBFK3SM2WOYeXL6W5SmuRpXrF_4dhq8qAlVE8O-iCRbV5OkWTu3QoAbIAiZuEaWmq85O3UE90WFrhypXzTMHC685cLR_fGi57W2gNLga6I8zRZrcT4riPpnBLErgmLUJl_MO5OgIFVPuH90SdQxWCVY1qN4HjenMjyHRYRy7_y1NQdQJd1emYLrLHsXZVmq9VVCYpq3lZOgXeTfNbq3tNlxMC_ZKq0n-NDBdgQtDg4hgB31_GU_K_BGuL8CheU8Zf1se0as6h03tIXK18HnFnHjnuTMzoBBkWF0PgbmP_L2mfquKCZJ4B6YCYh4PvO0xCRJXMnXi3y2stn7RZ77jRzkqirxx3znp1ho6CAFNFu2IYtCoefPDDR8hpHpSpS6tZXWRJlW4ieLTg7xYeDshnnoy2PknReLERuYDeywiWJembUEq0ZtXh8efLkpw2XHlKW5QOa00sJL_whw5zurovyOPhHbKIusRr5YXxX9ZeerNBhAv-uUteNGKVyJbROQu4b6Ihw-YIduAtcurbzaiVgLyn9FRDsDhAhDH1-rBBB6atfvu198yMG7bRtnuLKZ4_6CfqZWtZ66zH1DfyBmb8v1unh7jsSUhWfGby8Uv-UCivUuExJQJx1zCbFd90rFt4wO7Y8JDQzlBTFq_VUrRkdpEv41un-YLRcL0Hl6H3T0exJK-4SHy8ijauHyyvG9MdrxZ9XXfPOBgHq3eIFIF_AYc4bK1Z3jDT5wbJATQYnU9A9Ep7hLh-tfvuzWUQbZ8qmD_QMr3XcYmAfosHGD4CpqbzKAuSloD8gTVVYeLdz_aQl-4q5NHZIwozjkaw6Pt3sZjDOvE_ovJvXmWdX8zROk6mSfPqumK4d1V75K_ZcIm3EoU7SU9Ymor441rs7Q4vq8oFGCliYWT5Bhv2xg0Hnc_INMnG1u3lV0Lclxv46YVUdUmHwxjCB4vFhU7ar5kEjDtcjI1HIRKaM0hNbN_VTURMFpq0E2HFakXQvp40_0VTnhBscL-q7_z7TSRvhjOcX3tvbqlMLuw2JD8ow1rmLv5OtD-nEGtTyUjQjOfXG5YI2xpOqiyPhEkKAbx1ESWaLmr8W7T0Cjx9NQI_Wc5kv8dKaliXPyN1RSjzqh42QuzsZ6eJ7GUunFx5XqQDpmnO-4h5UEYopPBBAtTknesE6vMHxs7Zss6j_qF2lA6OlfjKRkJYoLCu0kW-a0nrIUCdlb9MXxP6d3FcVWpnTNqoX0mXX113PIRx7sE4CfX0FAW4Zm5k5YQdsZ5iX5sXD35RJXy_PL6oYcfAXAxsN568w1ZuOS-2hqT-dAZKhxWywnudLSHQsvPah9VYHliENXnWr1MQltADE63liF9vkxpuGAX-QnqpigpHHH1E17of0GsF3BVw7GcGnp_t4DvsZl9VfMHs5Em32dd67Gf3N9B--E4zBiXOKn6NdQAICy3fzYfYOrfGdLlZJo60UTjYIjCFXTYpOKuj_LvE--GWoC53dFS4KFN-zKczAzN3H43XOCyDL8Mkqr2Uvhfcxt1ebf50DVUvRw6df8GWT7QBHIdQbFNIFMC1FUy1DjMcIJxXlh09NBzaeG88FzU2fCzHNH2biEET24anIKZ5CMXlJiq53opbhvkgB0P-Zm4TPCaHVhOYi2Z_wS1d4hXyA0WFeOQivQKxC-J43VU6ZxmDSloXCJtZnR3QoUgS-6-vki47xVtLWsJnJHVHAI7Mj_TMSczr5op_MQlnlWTYf4zfhR_pUgPWtDOK_GxB6SXHdtLto10ov5xp326b1huVIJWpbOfJecQ60NXKPiyEl5pd2IZOWxVFHOSdQ88Ei4Z76XgFt2z1WEWcJgvANkOJSbQisp-gHxv3f1ZlWqN4Ft-ChCOcZ7FBMhBakPwRalID_epcqDZ_iRJEptCNtHPywJPQpGrT8EkCsgmEyrt1RUjRriFlnrESCCo7K0r-Revwa6xZ3UOQuJ4a3dgvSmxBjpf6dJKxJ_PlcNOhqX1OfvY10ZFa84BZXxvXidysCMVA0SaLcFvH-fdS5m9fvrYEHjgvGDcrNoq1uUI7CHlpR2oYmeYeeW7ZxrMhZgOdQW4nHpFjwR4aSULg7bJ2Vw6G0LLBewTGK3l682cF514htgNmprditQlY5zrRYiQWmgRo0Zaa3ZqWdlpwNOYGaCZxuLj15GE-fWtxcIal0-fE4uvgAUEHNGHd46aLqvCJLg0usF1GS5k6mqsKhyWPKcdAm4JWhexZtTaF6rUORhlB_fNt410OXjIgo_hmjB5UTAjEDnlJvG8J5zT7KRPNitgftxxSZNHWHw283qI8y9ce9s9Uqk7-PBM5qNSvACUCX9fcrKOJ3zxvMfZM8fSvCo7uPQZw40u-rCP2xLF9Bnv6_OTDlR_45_cWKZEDjXk3bNJ1Mmpp8LNqIc5kX3dzhmQLb3JYZs_HCC9X0YTWnpAv8XdZ95FKOA2vq8KFCSd-2H7cvzNWUZmt5-OkFH9BlvlAdaZ01I4TXnxCuMSeKnNE2xVsPwZJk1omdlN5zv_OpM7GhWjJlAQ-dZT4HHuoq9pMCfT-Ka2YsOCYMH_SCY4tXOyO9-wpD7_7HqAs8XHN0himnTxOaRowTxXe6yO6h2ihxOT9LZmwC0jI_M8pBvFwyjkc-KLoGyLp05yHzVyL0rFCN_0HA4sBtZfhKr5cYqt_7eToxisPuuJfxbKYbULq24e58RoWZ0wz7AbM6MCbJlAeTP9jJ0j0zZt8YOyKgrPfu1BguF-cLIdEXMJ2tr3nNyGnrJjGIJiftTw0A_2wisZF-iRC_I9d8J1720A4LnuJYgE_rbiRUa-4xgSi5nXaASo1wjHvLAURFmyr-L_bCAam_9A39pGWPWfLVaBV-OsYiXsR6U8_CqH8CMKa6X8BS7eN3t5QXvcQYOmgerrumOroyOs-y0PlWa03ZF7VObEyZOyWyIkKPq5jPKJvErpLGAfztCQFjGdPmRhRW-lnE9TzXIvkIe-J5M0HdiCZbE0_LwMyODOg0hxHinv-v3ECLx8y1Giafj4jVA2ysV8oK3JVaFR5tvQXuTt28_3de99DaoFPE5RqMQ0exUmrfNE-TCb_1WSZC30n7lAwVMe8TaIz-Okyt3faaEXGWnSTrt4rj1UP2Vqu-LcdJgDLpS7NqkU_PAckfoZcW2ZV45-pF1OUSVF4XV-8BLGxzY_oLqrDjjOBfhLWXzkIEwZE8wrSR0Jgs-nmdsT8spsNuo0-Aqabw61tKXygeo2RR968F9zm600R8Z5ORZp8sSoKqp44wzEhtjvMVe8Y2DakO8KCDH_uKVOzLe7F1Y3ma9Y9dPQ6B5hHM2Nzvg9A231adCS3HuI5qEB8vm8XzV2F18t8I_BOfouGmWkXgrQc7NL9EmBdH_kPH7d9SQw1u16TwsYhDZGeBMwerXi9U-JQ9qhyAe8JnE02JcH7GLz9LhP6krxkDC5pjLnijH0pTnAQudRjfcDmpNekjhETpyUNkve32b3bMxgPSOJL2rR1JdbtdGVnzLA6l-XLDQkSlsGFIIoTcgbRJHCYY6zeN2HS4Wf9Sj-3jwvhG5iAemR5jYFZkDO2APOUy3x7phQP7th4CkA6r6AhC6DGyeGORZ_AEH_dB_hwZwJ2_ATCMUTRLoobEyiQvQRIT9MGx9BHfJWE9lWIletn0pw-Wk2VE7Gh61o5-r5emCT3qB-e-1UyN5jfFzp13MRetnt_H-vgDhY2hKkzHLHDmU", "summary": [ { "type": "summary_text", - "text": "**Providing weather update**\n\nOkay, I need to give the current weather in Florence, Italy. It's about 40\u00b0C, which converts to 104\u00b0F. I should ask if the user wants a forecast for today or the next few days. It might also be helpful to remind them to stay hydrated since it's very hot. But I need to keep it straightforward and minimal. So, here\u2019s what I\u2019ll present: \"Current weather in Florence, Italy: 40\u00b0C (104\u00b0F). Want the hourly or 7-day forecast?\"" + "text": "**Clarifying weather details**\n\nFirst, I should ask the user what timeframe they want since they asked about the weather in Florence, Italy. They likely expect to know the current conditions. Right now, I can only provide the temperature of about 40\u00b0C, which is 104\u00b0F. I\u2019ll say something like, \u201cThe current temperature is around 40\u00b0C (104\u00b0F).\u201d I should also offer to fetch more details if they want a forecast or hourly breakdown. Keeping it brief and helpful is key!" + }, + { + "type": "summary_text", + "text": "**Finalizing weather response**\n\nI need to ensure that the tool call is done correctly via the functions namespace, and it looks like I\u2019ve got that covered. Now, I\u2019ll keep the response simple. I can say, \u201cIt\u2019s about 40\u00b0C (104\u00b0F) in Florence right now.\u201d I might also add, \u201cWant the forecast?\u201d or mention, \u201cIf you want a 5-day forecast or tips, I can provide that.\u201d I\u2019ll keep it to just 1 or 2 sentences to maintain clarity!" } ] }, { - "id": "msg_075b435690aee51e0169b3197f2a24819e815e6689dfc4d1e7", + "id": "msg_05e35f9a375fc3bf016a3c1251221c819f8d58814cc2f09af0", "type": "message", "status": "completed", "content": [ @@ -188,7 +197,7 @@ interactions: "type": "output_text", "annotations": [], "logprobs": [], - "text": "It\u2019s currently about 40\u00b0C (104\u00b0F) in Florence, Italy. Would you like the hourly or 7-day forecast?" + "text": "It\u2019s currently about 40\u00b0C (104\u00b0F) in Florence, Italy. Want a forecast or more details like wind and humidity?" } ], "role": "assistant" @@ -198,8 +207,9 @@ interactions: "presence_penalty": 0.0, "previous_response_id": null, "prompt_cache_key": null, - "prompt_cache_retention": null, + "prompt_cache_retention": "in_memory", "reasoning": { + "context": "current_turn", "effort": "high", "summary": "detailed" }, @@ -238,15 +248,15 @@ interactions: "top_p": 1.0, "truncation": "disabled", "usage": { - "input_tokens": 202, + "input_tokens": 92, "input_tokens_details": { "cached_tokens": 0 }, - "output_tokens": 471, + "output_tokens": 544, "output_tokens_details": { - "reasoning_tokens": 384 + "reasoning_tokens": 448 }, - "total_tokens": 673 + "total_tokens": 636 }, "user": null, "metadata": {} @@ -256,4 +266,4 @@ interactions: - application/json status: 200 OK code: 200 - duration: 12.040060083s + duration: 9.456836833s diff --git a/providertests/testdata/TestOpenAIResponsesWithSummaryThinking/openai-o4-mini/thinking-streaming.yaml b/providertests/testdata/TestOpenAIResponsesWithSummaryThinking/openai-o4-mini/thinking-streaming.yaml index 2a3161f27..6bae8ccff 100644 --- a/providertests/testdata/TestOpenAIResponsesWithSummaryThinking/openai-o4-mini/thinking-streaming.yaml +++ b/providertests/testdata/TestOpenAIResponsesWithSummaryThinking/openai-o4-mini/thinking-streaming.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://api.openai.com/v1/responses method: POST response: @@ -25,74 +25,74 @@ interactions: content_length: -1 body: |+ event: response.created - data: {"type":"response.created","response":{"id":"resp_0f5967458d374a400169b3198a8ba8819296ec831ef38577b8","object":"response","created_at":1773345162,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":null,"max_tool_calls":null,"model":"o4-mini-2025-04-16","output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":"high","summary":"detailed"},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":0} + data: {"type":"response.created","response":{"id":"resp_0c6e197b73d08e53016a3c126426ec81918293fa39c14f6d03","object":"response","created_at":1782321764,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":null,"max_tool_calls":null,"model":"o4-mini-2025-04-16","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":"current_turn","effort":"high","summary":"detailed"},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":0} event: response.in_progress - data: {"type":"response.in_progress","response":{"id":"resp_0f5967458d374a400169b3198a8ba8819296ec831ef38577b8","object":"response","created_at":1773345162,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":null,"max_tool_calls":null,"model":"o4-mini-2025-04-16","output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":"high","summary":"detailed"},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":1} + data: {"type":"response.in_progress","response":{"id":"resp_0c6e197b73d08e53016a3c126426ec81918293fa39c14f6d03","object":"response","created_at":1782321764,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":null,"max_tool_calls":null,"model":"o4-mini-2025-04-16","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":"current_turn","effort":"high","summary":"detailed"},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":1} event: response.output_item.added - data: {"type":"response.output_item.added","item":{"id":"rs_0f5967458d374a400169b3198b5c3c81929593ebae4f73c5a1","type":"reasoning","encrypted_content":"gAAAAABpsxmLfnaOVal-y1QoHC_f-xrEAHfOq_qqSPrfAeXEWaMIRDyeacLClp6l-Vn-sNI-IuHFPaXqQ-ouC_xjew1q9ZitVbGtiDoECwwahI7c8YMTsT7HO-tinnZ-q5XvaKzf9LdE-xJjN5_PQijx-EquAQWmJjD7v0FXxY7YMhsek1xazkBcHHDNRme7_Khg-PTGmEqbKhFpnZe7fRd9_yP96iiVv4sE9wOz7jLzFP9-0Tjd6nb3zQyhFf9FD0ybIfskuaTOcWh194gVuedscufgzUxngb8Ana5RtYCt8kPrq6qczQ1V9A04DLzy_my-Ldj1Wx5BL-ttfi3xSONVQ4w_3e8CJPllUx0lX3ptyE3aobZYBmKJpaYcy8Mxv05jty-7eWujTVwn2a5WESDG8GvftqElgQ5Kk-2yyjCd_okXg4xeMGPsPINn7wtJTS1KQZr1IvS5dlI6sOvX74ImepjHAxJ2Fzo2Jbw-NYccd3sq8YBdKbtFo8ACByATsHL9_nMISTSsX0QwPzpoavFcj84O5d4-c38_SSjzC_iS9r2kZpOnwfhuVCRIsBpVETxWHMrCCsFwcvhh9uUX7OQ9kY3zLplvlNwLq45JcXgB2oaD3yayLv9SCffO4DutwTv8Aaxptj60fSUiE-33N1QlWjn3j8h-B5KjQWX7YoTy-iFDqmuG4I8S6x0whxP4pC3wPXAduVS-hsuYX25j-OKKJgtQwrWfuNd5s662lddwrLrCtYsocuA2kAgqrihUewYcYLARsdJuVud52nenSWov7F6UXHN8sHIgB9q9J16chB2WH_gOWnhsUtdigDR78hjpafKLlQKJ","summary":[]},"output_index":0,"sequence_number":2} + data: {"type":"response.output_item.added","item":{"id":"rs_0c6e197b73d08e53016a3c12649ee48191b28ab7a0e20a3eac","type":"reasoning","content":[],"encrypted_content":"gAAAAABqPBJkfbXpQ205JdlqVjV2CzfhyWSam6N0oAGAa8Z3u4T1mtS7DLTGF1hBtg6lDv4WEDtqKIe7-gzRkviV7UovDkzjlWbWWvNvEAzjBmGhjspBNvzCPQERaz9ebqafwIpNMHJwl1vuGOIGvh1BlnSoSWzmVd7ZwL9ci1QY5NCI76hj7J10Z69_NoFv-_PxeU4MYcjj-fp7tME9RwBuwWpbbbC9zomcrvHXUPXS0rXVLda9cQC9nS86t8sDhwd-bSNWtuaQVEkGSuoZ8cchu8p0z_FCQKx9bbSf2l4kxOjtAAysmkkJX5Yd9DH-LmjJLDecyFV9pR05dsYsH8S1HKLEyO2Eprj8c6USPz7ZUpL9hRCryed0zfeFQt08L6U-73UrOCD58ei5BLABsA10Qmm7apl1GSunTxaoz_SjiqEF8SF4uWKpsm_IeALOdopPvA8Ss-od52w78ZnFAM2QBuEva9hf3SbUwqbG6ECX_5iJZgu-8lbJ7nViYNOGh2D-eEgTCVPx4bxuts8hiaghzLc9bwdhc7VImmLSgjSAziO7zjcAJJX1xA8yMLyWdjafzFjXaevA_pTBrDnjc8cZO2MhqJBTXxXfoHBiv45RmMQWbXd6zNkP9zwRq5of5TMr4i3B3zC-KklM3RM5G1Gsjlng3P3LCCQ-IG7oIuCZWmH6DhCopGywa1AxE8duCmiZS1LW6KoX73zYCetTH4FhAH5D1v6Pg6kVMnxdiTOq39SVwHKue_8ckBcLIfGp2UouEc2g_xEGmO1l-KheLUta_AuwF3BTiQyOqvVyNFvoAWd-gYqTkBJkZtOZ8fvrOZuQlPNQ-V8V4TB5TthFITzuUWcv06oN-rovuMJreQIRc4x09vPRR-ZfSHQ8LTValSMQcpjUZhaKnXuUBb2xf3MC--OqdWBENo-zhumAiBzUuTzrzs-BwbY=","summary":[]},"output_index":0,"sequence_number":2} event: response.output_item.done - data: {"type":"response.output_item.done","item":{"id":"rs_0f5967458d374a400169b3198b5c3c81929593ebae4f73c5a1","type":"reasoning","encrypted_content":"gAAAAABpsxmNq391WiqEa9VknUKZSqMO7_4N-dqE_moo0lodMuMYwnyjCZwI582xnw8B_MfoLm6nnYxzr57R8c4CeDegwbH6SW15-0SXrDZ-IFgFh-etTH3A3AeJi_Z0sUEft160Bdkum9fmjouS2KKSFnIJ43UZ82UH2F34xT5ApBB0PrxzydwOIZOdXJ1yMrJdE5Z1dsRMOSc0qn_iWoMUjlkFKzFg0gAiYj6OrOuIpk-Gjgcr7HkVpAgdu94Q0eLyFcpDcf4egfuDB7Zr4H5eBSncDVm2JnMI2CGfKzHHc0Y7Y8UYu3wknh_S0Kc0DMnu39zM6PAgXI3nnFsiOGZWdXztrCh_T6R73AAjS2_2FObG9D8_KpzNkwmOc-Hfp4l08QCeiMw87k_JSVXKd21BvKSoK5F-oVDBg3ZCyECeI6ZRteWSMB15ypKSQX8nLwTCIUAJsJ7Lw7yACnjDChGcQIQfxeWVlpaPbLhzaD4cGPIp331fXwfegrHk5msyn7BSHhQamUF6UHS8w4L9Mt7JSLfgi4gJgDd7ZPA4rCGRPX1g0KgAB5EWHxrb3m2ASH3F9ROg83d1F7NMOVdFc0ngwqoMsDbPJyzKijJYwHPFJpf1xxKxYWFfiX-IgvVhRU7c60yIoEY_r2YjNyFrmz9Lhp4-Rw7zp0EE1Nfoem2MRqxE8RqGjRztPX8Q7eMdNlpC8bdI-w8EaELnqO3LOGZHSSI_B0nlF-ebKFUkITHKRe9Nhx8PqUGZhQPWchzPEzDEvhX7oGyYPMtxCU76TY0wFOVN8Q9_o-4quiEIPzqnQQwOY0SETrbpKJllucPB3ul58sNAEvYlp8im1nxCUK8lLixH56QIGuYJtqahMeyEAdkEUJrNjQ8Lp50M5vZlSPNNQHbdG8mCaXkTFDu3ELxwjTM-rvKp6Cqs0mjhz0xV6ITLmAHLkNa9dOXI89tebmXWPleiJwyzscOdFXGs_2639efr-VyMVunEwM8pkZeBDKZhR1bCVlFwdYBHVT-vR_6eyWZKkbM8STeKFybcraSMsTOtw6DqxHu5MWMyD8dlNx_-cu1PGZRTSgALwGhqIMTpyB3r0Ub2PcanqGhk9U2YtTJdl0y64MAFDJviBNQ-BuSNYrdygGRYVtOJqYAonNtItgGG2dTefF0N3WLftlyyz2H0bsB2bRdlpFFR70noxf8MMCb1Jr3rt4UeV5JAKnzZeF8bKCGzi42D7ESVPb9KBaFdvUItE0PJQ_SMOOj-4fHl_2vO8qy3XZ6F8z4vY4mMiS2lIU-fF3cGlf5JxalEVQF3rmalFbv8NgnYYxDy5Qm04h96eJmSwLNDT2VXywgX1zF0iDaH8bnnrD4AbSfaglAQny-QyP4OxGekvGCVByvukNW3Blbjm7yf--30aN5_ezcYrrUHtUO__Ua-QjvEZObGZhj-J6a0lidhTZgR8rPtApPfMg8CMCC_t8U6EGAtBUErdRGFg0cTm3hfazCFACEBTrgZCtm7HXYNV5VtuPa4mZOrRQcTLqT2CKkgequMteu5l7CxWspN1T8cHmTVA0fQmK55UAZrdP6dcAuNS5SxMSQQYb5O7zifWYu2tke9pP0XSaWdx2QpD-KKswqm3cg9WwI1LPUu124J9DX49gqWUsfevcAwUevdZ-2VfTUgYUX03wgkC2RaIzpbDcT3Rc7RbRbvrdJnI3mKVyaEQGYeXELkoCjAEAnsej65AKR7GSvB3peGVRMJ40yy5KlqQKJ96NDh59J2HLzMQGxj---3o0AFCdz5XR4nLehrLt9lQ2c8NfYegjSPhwAnhiMFbw_vNxDE4dJfN6EvMUPiHHmE_67lGTifDXPNayLtGTuPzGG-9t-OK-HfeO_cZK0TTcexT2LH32noRtA-aAt7qE0yZJ19NFSCsCTTYgIzG_vzFYrDxKBQecO1b4T6kN2MIWRxW9xM2ic-Ll9SCH14b2AlNEanxVytQXDJ74dVFjTyTZd8q9XrNHFZcxgaWkTZ1Ea__CajoN2XJeaMKL8AynTZ4Pt0nQUL_rHx2qjdIJ2cPw6QM5CP36BaIfmd0HLaxCmyGzjttc2Cx8TiutWb2KLhwrLEPiOT-I91oPKw4isjzWcjRg8_","summary":[]},"output_index":0,"sequence_number":3} + data: {"type":"response.output_item.done","item":{"id":"rs_0c6e197b73d08e53016a3c12649ee48191b28ab7a0e20a3eac","type":"reasoning","content":[],"encrypted_content":"gAAAAABqPBJmJTvJgPss_1zxH8E1qpCzpWfjk3KCUjvjwPEgI04ZFCAVfYQY6FU89vjWbxnA2DetSC3ARxET9fjg2gvVf4ujDMvvP2dXzaXE_BqmXnb_YVpSZEAX--iWtaQtwIUzKEzc-xiax0i0ivBKwG3qEjPw6ySMv-EqJFNzuMwu-zYCJSqrXrkSmWzowBw3JdRW97bqK9dZIv-2RUmXv8Nf39uIVuhaCXvSUu0L-cEyQ8Tf3fDHn8NvDLjO5H4QG21eHBo0TGzFsEB07X_M7PvzV5vFLRywHMnF25TxDnzJzRIa8BBaB7ecECqjc2NZbS4sKcY2C76hRdW_cc5wWy_wIbgo5-9XYMz8DJU-cXYhA71uLYookLitC4mJFTGCIXGOXt7_1iz9LLLa7Hbz7crNHkpqZ1q6aQphSN9umjvHD9Q3RejN0R7rSi9wQDuRPRgc7MhOqpEZxNeIdWcgqnLHG0FGqEAx37-AKAQ6tC1xFoqXH5Y4sCCbZMCLbrpcKwAylvY2T3-fbbgu7WEhUzrz2mm7weaM2novr_dc-sOrIWQIPozjZPyEytBBR6Y6G5a-TI5KkIw_KM7vzo2jKn5OZRnuaxDFaGpu1heTQ0YQjITyBquyMlHKxb6l1GAb19-Ws78sI0R3XbE5zVSSXbwNoJImLHhSEA2cFM7B1b_72V9M77q5eVgRsLeHamdEBPfTc4bo0N5-DBU0pz9qcK_eF8Cq_THK6ketneY0yLJ32I0Qj4-nv4kkEqXC5UVOhcOTe_KXdL9rxaOf0OiZBGbWFhuh9SAwZ8sT8SpxAxHuldQdUjTEWM3ymwNBcdxM41DK_zOdOuHQPpvxKYP1Wdm_XNfuwgdBfJy9ie9o1fOEbzjI7etPup7RNgF2prIcwVtRQGHxQRZI0t8ORigyMV3-FkbgAYjV6LZUc_8Hc_I4D6wD43c8dufu1pNaiCDr0o3JNFrmP6BJtGA5_0UqmFW43BHTrQ5jUPR-nnouXUX4sTOXwFO-C95jkSzi4zOTkdV_5S1F43iAQNbcFiMXbExBP4cECmt4OMq7a4dheUhGDmw9mcknS56ZMqEZVHLDbO692E4SvyDz_XbGpyXbPKcG09vPsLCAMhXjuoL3hdYQUT5vDu8JZqcmn1HAYMco8Sh8sALKwAUHtAArqdn4ox1FU-n6aIMYNWhsp7g7EZa1ElMYQxFDN3mIqzGI_EqjBeMC3lQO5yxIj21CUZvvXpTq7KFQ0nJ6NFuokZjgLhzZOe2NyPpzNPn37UZeyYCWFEhRgaSyTXRFgjFdLpBqlDH90aKb68HXz_3KXCMi-BEpt00Gq3VF17lWYdndJhMHXomTxfCqxsHjoU3s98e1mygzlRciY-LQ4bWrRsdeRsE1H6YWpQFpOaGKuQ1x_AStFZ4Bd4EAgHhO76ywkLkFD5bRbP-srnqgJaRkUTJZfujLxphaXigsGK2kyVXofsGS85fYDuegBSobj3VNMMoaiPSxw7sG8zLTx3OzPnE-R4boW9QUwjtgpCLKj887r6wZI5nIzH9bRYsRljMMyLc_vdZY9aM77U6jifbuuPFO0ZH7KpinuIuxKY39zCx6Z42u3m0NEyYPyQXWZz4qk3NqiscIpJjiY6143imr0mB8y7wGflnoQiZ837p5004k6UW27PHWBZOeBIRlENHw1iKM_hGifXdNMXPP6EZRjkbu7__12yxo8eNvPu2E2BQZUs6ojgMz3-f_-5bPezveaIKyK4Pybi11cgS9anVhN20kYxb2zbUV_PDnVzTE3Dq1mklNyc5fnxsMHqWYNLROKhwuPG5rAFfuTKScweersJ91euW8P6x0Hy7mdLFzyoPSOW6p5jotuP5K7K4KAgNfg1ye4URY3OMdFDriFnC-g77WZ40ZbkPJ-UN8L6zzjCWuYkIzNxoJwiVQZK0ZFqNF9mALHamXq16BeRrfOvUYQVsf1c76ge2UkLeafkO1ive1EaK4SazhS4SAZfc-lZd1AjnS_-yDzTCw434bJY9eK9HmmrFZLKcHHpQ-zm10zRhNnXfCVauUzoNj4LdBsjJiwPVBOqB-u9_3tFIJBbDyiCIYrPhKYZ6ACzQe1vMjKTxIHilxQIABhfDU8Vp6gZ-BRDYFVmsZrPcHBvxN7BIGi5YF3LWCc26Q_cd3VQpk8bfVxcEpy6HBLuQblCAcfmTjs-Yi9c4dv3L_pw==","summary":[]},"output_index":0,"sequence_number":3} event: response.output_item.added - data: {"type":"response.output_item.added","item":{"id":"fc_0f5967458d374a400169b3198d3a7c8192bd4fc65dc0923068","type":"function_call","status":"in_progress","arguments":"","call_id":"call_OC2f35aKdph1vnwdji5XnSu3","name":"weather"},"output_index":1,"sequence_number":4} + data: {"type":"response.output_item.added","item":{"id":"fc_0c6e197b73d08e53016a3c1266504c8191975a5dba87645ec1","type":"function_call","status":"in_progress","arguments":"","call_id":"call_EDay3PkaZNpmYHDVyeY69wF9","name":"weather"},"output_index":1,"sequence_number":4} event: response.function_call_arguments.delta - data: {"type":"response.function_call_arguments.delta","delta":"{\"","item_id":"fc_0f5967458d374a400169b3198d3a7c8192bd4fc65dc0923068","obfuscation":"2SU7gmR6VqpXg4","output_index":1,"sequence_number":5} + data: {"type":"response.function_call_arguments.delta","delta":"{\"","item_id":"fc_0c6e197b73d08e53016a3c1266504c8191975a5dba87645ec1","obfuscation":"ZHxImI89t45jtk","output_index":1,"sequence_number":5} event: response.function_call_arguments.delta - data: {"type":"response.function_call_arguments.delta","delta":"location","item_id":"fc_0f5967458d374a400169b3198d3a7c8192bd4fc65dc0923068","obfuscation":"ZrNJylLh","output_index":1,"sequence_number":6} + data: {"type":"response.function_call_arguments.delta","delta":"location","item_id":"fc_0c6e197b73d08e53016a3c1266504c8191975a5dba87645ec1","obfuscation":"i8kTwMq0","output_index":1,"sequence_number":6} event: response.function_call_arguments.delta - data: {"type":"response.function_call_arguments.delta","delta":"\":\"","item_id":"fc_0f5967458d374a400169b3198d3a7c8192bd4fc65dc0923068","obfuscation":"Lcvv8lSS7nn2O","output_index":1,"sequence_number":7} + data: {"type":"response.function_call_arguments.delta","delta":"\":\"","item_id":"fc_0c6e197b73d08e53016a3c1266504c8191975a5dba87645ec1","obfuscation":"C1aSu7jdfHRbA","output_index":1,"sequence_number":7} event: response.function_call_arguments.delta - data: {"type":"response.function_call_arguments.delta","delta":"Flor","item_id":"fc_0f5967458d374a400169b3198d3a7c8192bd4fc65dc0923068","obfuscation":"m3cOnHhdTgNN","output_index":1,"sequence_number":8} + data: {"type":"response.function_call_arguments.delta","delta":"Flor","item_id":"fc_0c6e197b73d08e53016a3c1266504c8191975a5dba87645ec1","obfuscation":"DY8vGJBFc0Bl","output_index":1,"sequence_number":8} event: response.function_call_arguments.delta - data: {"type":"response.function_call_arguments.delta","delta":"ence","item_id":"fc_0f5967458d374a400169b3198d3a7c8192bd4fc65dc0923068","obfuscation":"PbnJ4bu7yK44","output_index":1,"sequence_number":9} + data: {"type":"response.function_call_arguments.delta","delta":"ence","item_id":"fc_0c6e197b73d08e53016a3c1266504c8191975a5dba87645ec1","obfuscation":"7lxem9Zfdegn","output_index":1,"sequence_number":9} event: response.function_call_arguments.delta - data: {"type":"response.function_call_arguments.delta","delta":",","item_id":"fc_0f5967458d374a400169b3198d3a7c8192bd4fc65dc0923068","obfuscation":"Isq3ubXRYBZGCPr","output_index":1,"sequence_number":10} + data: {"type":"response.function_call_arguments.delta","delta":",","item_id":"fc_0c6e197b73d08e53016a3c1266504c8191975a5dba87645ec1","obfuscation":"5iDU6FeO3MpHuwW","output_index":1,"sequence_number":10} event: response.function_call_arguments.delta - data: {"type":"response.function_call_arguments.delta","delta":" Italy","item_id":"fc_0f5967458d374a400169b3198d3a7c8192bd4fc65dc0923068","obfuscation":"48nky2hUKN","output_index":1,"sequence_number":11} + data: {"type":"response.function_call_arguments.delta","delta":" Italy","item_id":"fc_0c6e197b73d08e53016a3c1266504c8191975a5dba87645ec1","obfuscation":"jjh9mVFHu6","output_index":1,"sequence_number":11} event: response.function_call_arguments.delta - data: {"type":"response.function_call_arguments.delta","delta":"\"}","item_id":"fc_0f5967458d374a400169b3198d3a7c8192bd4fc65dc0923068","obfuscation":"1uOMb2wWBLuuEI","output_index":1,"sequence_number":12} + data: {"type":"response.function_call_arguments.delta","delta":"\"}","item_id":"fc_0c6e197b73d08e53016a3c1266504c8191975a5dba87645ec1","obfuscation":"AdLfhfczPpgx2m","output_index":1,"sequence_number":12} event: response.function_call_arguments.done - data: {"type":"response.function_call_arguments.done","arguments":"{\"location\":\"Florence, Italy\"}","item_id":"fc_0f5967458d374a400169b3198d3a7c8192bd4fc65dc0923068","output_index":1,"sequence_number":13} + data: {"type":"response.function_call_arguments.done","arguments":"{\"location\":\"Florence, Italy\"}","item_id":"fc_0c6e197b73d08e53016a3c1266504c8191975a5dba87645ec1","output_index":1,"sequence_number":13} event: response.output_item.done - data: {"type":"response.output_item.done","item":{"id":"fc_0f5967458d374a400169b3198d3a7c8192bd4fc65dc0923068","type":"function_call","status":"completed","arguments":"{\"location\":\"Florence, Italy\"}","call_id":"call_OC2f35aKdph1vnwdji5XnSu3","name":"weather"},"output_index":1,"sequence_number":14} + data: {"type":"response.output_item.done","item":{"id":"fc_0c6e197b73d08e53016a3c1266504c8191975a5dba87645ec1","type":"function_call","status":"completed","arguments":"{\"location\":\"Florence, Italy\"}","call_id":"call_EDay3PkaZNpmYHDVyeY69wF9","name":"weather"},"output_index":1,"sequence_number":14} event: response.completed - data: {"type":"response.completed","response":{"id":"resp_0f5967458d374a400169b3198a8ba8819296ec831ef38577b8","object":"response","created_at":1773345162,"status":"completed","background":false,"completed_at":1773345165,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":null,"max_tool_calls":null,"model":"o4-mini-2025-04-16","output":[{"id":"rs_0f5967458d374a400169b3198b5c3c81929593ebae4f73c5a1","type":"reasoning","encrypted_content":"gAAAAABpsxmNqS1BdNeuGCGkyQdrxdeoO9HPbTffHEFYmHXM7vx9NZFWU6lvrZC32qk23AOcrXCM-Q1OMW9XfWNdTu60bnxBJ_bbWAiq86SaKs1pT68Hh7vr5dfGi8t2tNwa-p8ytI4hQlfRqf8lu65qIonohkTclPrlFVSfOGmnlvU4HiWso5ZvDPuL01MrisaK2GSyeV8ddDBWYuiMkJveXRuL2FhOQGeWrFgMZ3-IN5eZuTxrJntTIZ7gNlvKWihYj83RxXl0WaIkz9dpSDnWLAeQD2cFvrnfOzGknIQ06eiyFd6kOKIzE5QG8d6zcfIax6xvZeje7fCcaxGQXt407GbHGMUG6IZf21NEhVv8TOYhFg3YBd8e6xbaJrPozxD6caYO5tpC9pGxSMpo53U6WTg1XPCMDA1WxKWneoRUElg86Rx7rXZIl2fnCCCUHTbD5xUiYH_eKcHL98rGtbPz0R19EqPe7hkCFHbagblmx07N--TRcPcDFb26Z4ueN5R1jgS-0a1epg7GgZoF0X1-ht8g2jGTw0GitxmQyHL5lQYy6GwzROcozQ-0jla4ARNobVRpAGElk-_Ml6gdvSK8K_rFna2xsRLl1JUmSoSHJSza_aJjlHT_LvJsO_JBp0BBUFYs3uWY4q8kdnb0O1QA1n8dH9xc1FU2G23RWg2NT4iXRjZ59snEWrNHNTY3KfnXdwXI8f7EcuqhJbVRHk7-q52E0TgjpQUBx3NtwKZckMXtTms4NlBGsqBgTFggCIXenK62DSTkr170-EqGbaWpixdjB-lHXD2DcRJlWcNla6xMwxLLXQf_JFIfl4AavGplLB2rOThLoE9iCrsq1CscrBTUFQjHOlWr9lJlxU-Fx0zg9wU6IHbGYnpJRX2T2Qdid8DBIkrlEaD0ctyO1xNO80UEktaRVXNwr-Lp9qjWfF0iUTDBQgB1DlMpAPC2mSpKkycH2nt_pohXzWbDcq_taajdSV-ZluQrhGg36-Lkc8GVi_LkWvn48_aVi18NCFpCWNgWYuEQ-RcBCHM9Ojnrj0TLIJtoFe9ajREk1VsuqM8CHSNMkcv72OZ0CK-I9NxxNBMCI-4_TOQA-1k224bMjqRF3ZR8FWRa64KU-k0C_z5qjut-lgx3NyegUT6sQDl16NzrkfLuAIb0LetOajPtoKVFqskUPTTUPscyGEb5K_ZgX-EPw5aCyoWyoaof7FDjFG7_xZQpNpn0ibq-E72JBUgFtgAWLJj9DBYrefb1EmPhzeb82_R5Uk0pLJRGTB3qiesOyOMESMnj7zuSRZFGMJolBOyCnQE-hpnvJD7u4twU3Ob1404G2QBB7jlQyh6KClS1kVczp2HQYa-PIZITW4bWY25HhG1bmx-OxW9hYG99ECGnkM6vh86NnIK_64OAkpGSI_Sm1rWMvDNu2y6QoyVcMh7TFjGYEVCM9ZzJZD4ds1SvqQhOndAKFYzyv_1FtWKJQU04MohejM5CNW4sytdQdQdOeInum98rmeD8W07bGphnuCJahCGeTaTCKgey-75M3cf7VtNj38zReUfhdQ4H_DpAgqWggNRV3SFDKH5wlYTamxNv1dBQB6zAZSgO6x5PrVoQgZluH1dxD3CJWsHoFGbSKhlLFpE3F0RW46GoHsLrBG64ka-xY6Wr-ObBmtfrIa1k5tZOkO4Xqg9i4u_JI5DQaCckfpb-jARDZcgFqgwNEj8ZkzU_U3QfWktnPGgs3lC223kEde-DUXEjfTV8pN6fGXaxWFIu1yyf7ek4VxxitrURlusJR8ctE4YPZwAcwa2ZqESHix39D_-04a_jqkBMRtJFRCMFybvnKrriTgjBCpXZm7UUFTYQ-s8gUzy40wKIrBssf4bfudJz7_wX9uv5gHInFZFZVN3GrIZlP28cTjhVBmR85MbhMUB4-RC9JuvNs5K-gRBovk74hjoV5Jyb-nbWPlHbr9KQAlKmq53dKYBRc0l3Be_-VSJQLZC8vuGdeP4O-lfRXouceUDRQYjsDr6kk1vauMg5Kp6_LNGtr_5uLmuRwYQgi-nrORMedH0lF8_0ijxhqiHg4L8OymIFfV4tZ3qd0mefZd21gpX7DDdHgpsUgdymMzIHUNi2ctNr","summary":[]},{"id":"fc_0f5967458d374a400169b3198d3a7c8192bd4fc65dc0923068","type":"function_call","status":"completed","arguments":"{\"location\":\"Florence, Italy\"}","call_id":"call_OC2f35aKdph1vnwdji5XnSu3","name":"weather"}],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":"high","summary":"detailed"},"safety_identifier":null,"service_tier":"default","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":{"input_tokens":60,"input_tokens_details":{"cached_tokens":0},"output_tokens":226,"output_tokens_details":{"reasoning_tokens":192},"total_tokens":286},"user":null,"metadata":{}},"sequence_number":15} + data: {"type":"response.completed","response":{"id":"resp_0c6e197b73d08e53016a3c126426ec81918293fa39c14f6d03","object":"response","created_at":1782321764,"status":"completed","background":false,"completed_at":1782321766,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":null,"max_tool_calls":null,"model":"o4-mini-2025-04-16","moderation":null,"output":[{"id":"rs_0c6e197b73d08e53016a3c12649ee48191b28ab7a0e20a3eac","type":"reasoning","content":[],"encrypted_content":"gAAAAABqPBJm6voeL1niy1RcJvIKwHXTysU9drj7ZS7mrbOhW_wJT3oGWVWPmVH3CVG2UuGzd14crVqge9qCpOk0trcYmM-MbBAwavqf0Et37EVdvOKKE077Uyr5AYLHmG7jkGUijE_gAPdZMfpjXDnirc2CNUocL4TbSOsJEXbG1_-iSW6N6kMF_khOoecNwPU7rQYmj_RSKU8yndwgUcSv1S3TigPpvvdTsZkELvLZAyjceYWtuTXRYKdlMEeK6oDHxUhUcOEIkbPtbARopDo9enhuKRahMkedzwL4O4dQ4lgc0h6RJNL7ZdPck3MIHdsMA8n52n7jSRCqoMa2pQxLUGQe_O5wK7lbDhAQUX-JxkVGv6OQPXue-mwoLxRa4NnZYmmcCqmm8OyuxSj4deizCX2Gg83-G0mHG5AFdvSOaNQO5oTK70xrWRrxqEpFJARQtxvAEwenndjTLo-0RgSkNkvSMLID_xOaqpmsCrqoUxV-37NZZvV3HgMuHW0HHPsjBRujO3928czeQjKYmBzqGLJOr6lU1E5cyP8Y50-a5j5ua9CMjrlVu_9I6h6bYxh0jRNOZ1_Z7lXCF1CDu4yLnLFHfkct5qhpj4qjtnf_igSV8GBusRfEI1js7fu3nJWywn0TiQCt_KSkP7HgYhVwojMds7nxUgOTetDAgQ-OXLeQK9ocTiP0PXshxALJB6iDTg8oNlY0L3Ce-NfAq5Mubi1_F3EoWj3c3xAio7JIE3WedT3g5f_lBf-Zbst6eZX3CNh0PYMHV6X_tWE32MBnSKj-4BmiqtVk9Fxhf3JXgepsL2wCcm41-jb84yfZIJe2H1jxFNwNcqo5apYHrVGcgamCo6K2ma9i6JOdV8uWQnJzNV3Khae1ROrZtD_7uV1XgA0WrzM8XZ-0Q-m0atDarQtE9eKHgFVwgOzJlN0FS4iUx5XB2EUJDfCNjT9O9uWvXDLXLMezgfZLQfkRoaK3UfAuLzKMolu7MvRDS3HUk4ct--GuYdu9kMQWdFbTmgpqOZb8nZ6rMVAJJ3lLv_qP628uDCB8PzpNOC2ibFjzyqvwVnRfht1PBlllKGiCiPEQRNm0_mCKiiAXOPWJfvG0wa5PyZ7j5c6lwOicxI3hCGA79mpiiC2164f0GOMnj7b8PwtjsLESBDPMVNT9IzdZils-nrfeWxjCBr1XUuV4Xn0GTV1mWpLul42ZfOR-xatgmoBuweilHRlaFrlQQJNM3O1UD_Pfhy8SaVE0Im6IDMzXdQQ4oVEbQhmiN24YetTi_jHLl2S3Cpsh9Kr6ftAioKd73CryM4TZo75o6Xs__KKS78InqysxuP6Am6tqhT9iIwNGOfs6akUL4XTA5ntU_CII6n1jTSSlisOJqd_2cS-2-5VYJgNKL9EuvfhYXBA1i21lJUtYzJXkp8_8JE_yDTBxSHpDP_lKfAEVJz_phwPatWo5kZJbnrEdx_J_SsT9yKN5sOEt9zKjv3b7Vwequ8Oy3BAUwL43HhLj_sBNxvzEhO1bYvmrSPrQCDqdQhhAEBz-mC5UfAZ2izEYefVBcDu3SE1b4nZ65Ckzsp7PerN2GOyazotkW_HqN0ELGx8StAys3eCNfqmxfw9NLuXHQark5yJpeoA5Wsc_HKVjsEelXodl-mUNGfaEFWjAqlCZmMQwdTrqiUb0J0GedD7w3YxC5wgF5w3iR3r9LlsCXXPE7a_jVsquwsUtZi-PG_70c-vb5NpnzkR9ZovzkWlZAECl8_bMGfc6KBwWmoHbp48X20ltLzZcJJ36F_VlZMAvlBCvzP6uYTnHRs8gmllwfeS7mKSDlAEEGmM-zOHCeKh6W7KxGbFbOrR2CrmnmmUCR0EesANematU63jRZum2KeGqo-DywoALb3HQg6SVlU-NsmTdF_IVOtHMfsgZ1YF9QgJQfEupe0cQmfdxE8_p3Pjw1HzMnp1VVS1rZRel7pbgzLjh5EQWnNoc8NZty18IMulAi9VdzSO-ouuwAxln-mRuCOB53fI_2wUQ0cgjqAUUzw1LndAKhs9VwmgfYTpeC2m63JTi68MG4o1TlLpdQXQ9mksX-oNy2mAai883qrHP-K5I6BU6O8fuce9cnQnZkwjlxqxLj6apJ4Ui3S2xqsMJ7kmQvVgFzWxrk1rT33H83318ouz5kK7MP9OVqlAliBn0s_OoUjUBHryjkbMHopChvv-zHg==","summary":[]},{"id":"fc_0c6e197b73d08e53016a3c1266504c8191975a5dba87645ec1","type":"function_call","status":"completed","arguments":"{\"location\":\"Florence, Italy\"}","call_id":"call_EDay3PkaZNpmYHDVyeY69wF9","name":"weather"}],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":"current_turn","effort":"high","summary":"detailed"},"safety_identifier":null,"service_tier":"default","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":{"input_tokens":60,"input_tokens_details":{"cached_tokens":0},"output_tokens":225,"output_tokens_details":{"reasoning_tokens":192},"total_tokens":285},"user":null,"metadata":{}},"sequence_number":15} headers: Content-Type: - text/event-stream; charset=utf-8 status: 200 OK code: 200 - duration: 309.979125ms + duration: 376.097125ms - id: 1 request: proto: HTTP/1.1 proto_major: 1 proto_minor: 1 - content_length: 802 + content_length: 790 host: "" - body: '{"store":false,"include":["reasoning.encrypted_content"],"input":[{"content":"You are a helpful assistant","role":"developer"},{"content":[{"text":"What''s the weather in Florence, Italy?","type":"input_text"}],"role":"user"},{"arguments":"\"{\\\"location\\\":\\\"Florence, Italy\\\"}\"","call_id":"call_OC2f35aKdph1vnwdji5XnSu3","name":"weather","type":"function_call"},{"call_id":"call_OC2f35aKdph1vnwdji5XnSu3","output":"40 C","type":"function_call_output"}],"model":"o4-mini","reasoning":{"effort":"high","summary":"auto"},"tool_choice":"auto","tools":[{"strict":false,"parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"name":"weather","description":"Get weather information for a location","type":"function"}],"stream":true}' + body: '{"store":false,"include":["reasoning.encrypted_content"],"input":[{"content":"You are a helpful assistant","role":"developer"},{"content":[{"text":"What''s the weather in Florence, Italy?","type":"input_text"}],"role":"user"},{"arguments":"{\"location\":\"Florence, Italy\"}","call_id":"call_EDay3PkaZNpmYHDVyeY69wF9","name":"weather","type":"function_call"},{"call_id":"call_EDay3PkaZNpmYHDVyeY69wF9","output":"40 C","type":"function_call_output"}],"model":"o4-mini","reasoning":{"effort":"high","summary":"auto"},"tool_choice":"auto","tools":[{"strict":false,"parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"name":"weather","description":"Get weather information for a location","type":"function"}],"stream":true}' headers: Accept: - application/json Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://api.openai.com/v1/responses method: POST response: @@ -102,221 +102,515 @@ interactions: content_length: -1 body: |+ event: response.created - data: {"type":"response.created","response":{"id":"resp_0f5967458d374a400169b3198d90008192ab373708b985eeb4","object":"response","created_at":1773345165,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":null,"max_tool_calls":null,"model":"o4-mini-2025-04-16","output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":"high","summary":"detailed"},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":0} + data: {"type":"response.created","response":{"id":"resp_027ec5e155f266ec016a3c1266a9048191bfb7df1a95ba9ad7","object":"response","created_at":1782321766,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":null,"max_tool_calls":null,"model":"o4-mini-2025-04-16","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":"current_turn","effort":"high","summary":"detailed"},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":0} event: response.in_progress - data: {"type":"response.in_progress","response":{"id":"resp_0f5967458d374a400169b3198d90008192ab373708b985eeb4","object":"response","created_at":1773345165,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":null,"max_tool_calls":null,"model":"o4-mini-2025-04-16","output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":"high","summary":"detailed"},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":1} + data: {"type":"response.in_progress","response":{"id":"resp_027ec5e155f266ec016a3c1266a9048191bfb7df1a95ba9ad7","object":"response","created_at":1782321766,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":null,"max_tool_calls":null,"model":"o4-mini-2025-04-16","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":"current_turn","effort":"high","summary":"detailed"},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":1} event: response.output_item.added - data: {"type":"response.output_item.added","item":{"id":"msg_0f5967458d374a400169b3198e0a188192b4ea23b03f3a9c9c","type":"message","status":"in_progress","content":[],"role":"assistant"},"output_index":0,"sequence_number":2} + data: {"type":"response.output_item.added","item":{"id":"rs_027ec5e155f266ec016a3c12675f308191aa4cbc320785b520","type":"reasoning","content":[],"encrypted_content":"gAAAAABqPBJnRMKAXBDpAyQ44LEAVtfH12vQym1jaUYwNXdqFZ7dJjR7nMegXrBntICf9APaqV40wTeeCY-nrb6U9XZJ8zec846oekA03tNf_K77A0m5oOPdbG2SNpZ523HF4sl6xW7PM7ZPkhb1CRLdtv6DcuhubU_01CU8l-prl3j8z1lGI55tmoMM3M5i5rhrdhhkH9OAD6ZLqlJlPz1wCbbzRxJSwXgvsQvPrjevpvNWYETl-Jo7cJNd1H7sWbLiygP4l--rSALoX_d8ZaVpHAZOSEMP7tWiU2_tiWsS1eQQLICVioBqmHELsAfg1LEEE1XFvedZ5LVJWhA55URafUl6FxMAnsvrSXf88wbde3-DbmfVNgUhocoIoOO5MTPkc1bQy6t0NG3IdjupazbniRz8rgpKnzns_lDg_7fjIFALMfk9L14wWlwmduf7JNiZvWi10QpbJDfqKck1OhecbIB41fdgMrGT8tZtdfBA8g0AkKFtZ77J52iDr1kAY2kGTJIH0pvy0wvswKjCivf_fBitOlip9w8ZBMiEINOZ89JsEtMHjWUZzdUzn5aLkydPRyPdwFlAVqFr-aZRSAaqeRnS-jklIAjZD6tFF9KO4ocR8JyezDELiEjfaJmBVd32HyZOf_qe9QdTI5e2sU2jEM5OMlEFEtf8JVANrwfOourUUBQS8oQ8CAfeq1_x6mpqhflwq9zTZ6L7G-nRzTCJMbhHhosXPK3Yy1t9c_Y5XLLbklKu4m2gRNn91M1pPlt9FV6hpV21-0v4QoMAMua9a7Mq4zEOJLUHb-sYlm01IeJ9IaVbri3eCqMypSTSyu8y2eehNgBsbHFRDWppDARcBNCOAQt8-QEhUaXVF7f3Xw3ArIS0lglEHX0DkRRtM4J51kVrKIN03B6I2B3U8-3_Nxq9LKMHFzeEROc7NYB_WcIyUE0CZag=","summary":[]},"output_index":0,"sequence_number":2} + + event: response.reasoning_summary_part.added + data: {"type":"response.reasoning_summary_part.added","item_id":"rs_027ec5e155f266ec016a3c12675f308191aa4cbc320785b520","output_index":0,"part":{"type":"summary_text","text":""},"sequence_number":3,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":"**Summarizing Florence's weather**\n\nThe","item_id":"rs_027ec5e155f266ec016a3c12675f308191aa4cbc320785b520","obfuscation":"GlViTLZl5","output_index":0,"sequence_number":4,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" user","item_id":"rs_027ec5e155f266ec016a3c12675f308191aa4cbc320785b520","obfuscation":"rtfV66lbDik","output_index":0,"sequence_number":5,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" asked","item_id":"rs_027ec5e155f266ec016a3c12675f308191aa4cbc320785b520","obfuscation":"92Z0uCWO8k","output_index":0,"sequence_number":6,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" about","item_id":"rs_027ec5e155f266ec016a3c12675f308191aa4cbc320785b520","obfuscation":"mG1hL9mLFv","output_index":0,"sequence_number":7,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" the","item_id":"rs_027ec5e155f266ec016a3c12675f308191aa4cbc320785b520","obfuscation":"wCA7xgpV0DlC","output_index":0,"sequence_number":8,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" weather","item_id":"rs_027ec5e155f266ec016a3c12675f308191aa4cbc320785b520","obfuscation":"WQbxU5uC","output_index":0,"sequence_number":9,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" in","item_id":"rs_027ec5e155f266ec016a3c12675f308191aa4cbc320785b520","obfuscation":"Rxo6Re7rMtXPw","output_index":0,"sequence_number":10,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" Florence","item_id":"rs_027ec5e155f266ec016a3c12675f308191aa4cbc320785b520","obfuscation":"QEdNvlA","output_index":0,"sequence_number":11,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":",","item_id":"rs_027ec5e155f266ec016a3c12675f308191aa4cbc320785b520","obfuscation":"QKU0fE3PU0dQ1sW","output_index":0,"sequence_number":12,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" Italy","item_id":"rs_027ec5e155f266ec016a3c12675f308191aa4cbc320785b520","obfuscation":"Hh4xl6bVpG","output_index":0,"sequence_number":13,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":",","item_id":"rs_027ec5e155f266ec016a3c12675f308191aa4cbc320785b520","obfuscation":"Y723et0vnVLOkPB","output_index":0,"sequence_number":14,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" and","item_id":"rs_027ec5e155f266ec016a3c12675f308191aa4cbc320785b520","obfuscation":"DESCauSgGfDM","output_index":0,"sequence_number":15,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" I","item_id":"rs_027ec5e155f266ec016a3c12675f308191aa4cbc320785b520","obfuscation":"BB6azUuPJEA3oa","output_index":0,"sequence_number":16,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" got","item_id":"rs_027ec5e155f266ec016a3c12675f308191aa4cbc320785b520","obfuscation":"fZUYfkmUQriU","output_index":0,"sequence_number":17,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" a","item_id":"rs_027ec5e155f266ec016a3c12675f308191aa4cbc320785b520","obfuscation":"63ICoYep5TiEBj","output_index":0,"sequence_number":18,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" return","item_id":"rs_027ec5e155f266ec016a3c12675f308191aa4cbc320785b520","obfuscation":"0bVhcXhwL","output_index":0,"sequence_number":19,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" of","item_id":"rs_027ec5e155f266ec016a3c12675f308191aa4cbc320785b520","obfuscation":"DMbZWLlHNc5Mk","output_index":0,"sequence_number":20,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" 40","item_id":"rs_027ec5e155f266ec016a3c12675f308191aa4cbc320785b520","obfuscation":"Ipkff5snX9h3i","output_index":0,"sequence_number":21,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":"°C","item_id":"rs_027ec5e155f266ec016a3c12675f308191aa4cbc320785b520","obfuscation":"C3Imycy8dM875Y","output_index":0,"sequence_number":22,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":".","item_id":"rs_027ec5e155f266ec016a3c12675f308191aa4cbc320785b520","obfuscation":"Z9J9Lh1thMGIC13","output_index":0,"sequence_number":23,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" This","item_id":"rs_027ec5e155f266ec016a3c12675f308191aa4cbc320785b520","obfuscation":"FLyBVtgMrXI","output_index":0,"sequence_number":24,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" suggests","item_id":"rs_027ec5e155f266ec016a3c12675f308191aa4cbc320785b520","obfuscation":"kXb8crk","output_index":0,"sequence_number":25,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" it's","item_id":"rs_027ec5e155f266ec016a3c12675f308191aa4cbc320785b520","obfuscation":"oRyuBgSwrwK","output_index":0,"sequence_number":26,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" blazing","item_id":"rs_027ec5e155f266ec016a3c12675f308191aa4cbc320785b520","obfuscation":"WdylU6eJ","output_index":0,"sequence_number":27,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" hot","item_id":"rs_027ec5e155f266ec016a3c12675f308191aa4cbc320785b520","obfuscation":"0l355SVnZmcx","output_index":0,"sequence_number":28,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":"!","item_id":"rs_027ec5e155f266ec016a3c12675f308191aa4cbc320785b520","obfuscation":"pvxuaON7LbUW83T","output_index":0,"sequence_number":29,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" Even","item_id":"rs_027ec5e155f266ec016a3c12675f308191aa4cbc320785b520","obfuscation":"cLPEqmQXgGT","output_index":0,"sequence_number":30,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" though","item_id":"rs_027ec5e155f266ec016a3c12675f308191aa4cbc320785b520","obfuscation":"9f6T9NLak","output_index":0,"sequence_number":31,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" the","item_id":"rs_027ec5e155f266ec016a3c12675f308191aa4cbc320785b520","obfuscation":"7ybPfcSGz1d9","output_index":0,"sequence_number":32,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" information","item_id":"rs_027ec5e155f266ec016a3c12675f308191aa4cbc320785b520","obfuscation":"YPRx","output_index":0,"sequence_number":33,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" seems","item_id":"rs_027ec5e155f266ec016a3c12675f308191aa4cbc320785b520","obfuscation":"83HAv3cEwO","output_index":0,"sequence_number":34,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" limited","item_id":"rs_027ec5e155f266ec016a3c12675f308191aa4cbc320785b520","obfuscation":"wV2pwaWU","output_index":0,"sequence_number":35,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":",","item_id":"rs_027ec5e155f266ec016a3c12675f308191aa4cbc320785b520","obfuscation":"SsbNSdXYSBGFOIh","output_index":0,"sequence_number":36,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" I","item_id":"rs_027ec5e155f266ec016a3c12675f308191aa4cbc320785b520","obfuscation":"II8k7IGuqEvwgh","output_index":0,"sequence_number":37,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":"’ll","item_id":"rs_027ec5e155f266ec016a3c12675f308191aa4cbc320785b520","obfuscation":"PdHW7Cc3sqCNY","output_index":0,"sequence_number":38,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" interpret","item_id":"rs_027ec5e155f266ec016a3c12675f308191aa4cbc320785b520","obfuscation":"SVVyNC","output_index":0,"sequence_number":39,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" that","item_id":"rs_027ec5e155f266ec016a3c12675f308191aa4cbc320785b520","obfuscation":"L67KuQ9UkBE","output_index":0,"sequence_number":40,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" as","item_id":"rs_027ec5e155f266ec016a3c12675f308191aa4cbc320785b520","obfuscation":"Cmn9nN35AckLx","output_index":0,"sequence_number":41,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" the","item_id":"rs_027ec5e155f266ec016a3c12675f308191aa4cbc320785b520","obfuscation":"3WpBuoV1uavw","output_index":0,"sequence_number":42,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" current","item_id":"rs_027ec5e155f266ec016a3c12675f308191aa4cbc320785b520","obfuscation":"zKcGsPQf","output_index":0,"sequence_number":43,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" temperature","item_id":"rs_027ec5e155f266ec016a3c12675f308191aa4cbc320785b520","obfuscation":"zhDS","output_index":0,"sequence_number":44,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":".","item_id":"rs_027ec5e155f266ec016a3c12675f308191aa4cbc320785b520","obfuscation":"p7XV1EeS9q2dNxH","output_index":0,"sequence_number":45,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" I","item_id":"rs_027ec5e155f266ec016a3c12675f308191aa4cbc320785b520","obfuscation":"e0hzmXWIzeuY1O","output_index":0,"sequence_number":46,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":"’ll","item_id":"rs_027ec5e155f266ec016a3c12675f308191aa4cbc320785b520","obfuscation":"C1aNpjP0JrgPt","output_index":0,"sequence_number":47,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" frame","item_id":"rs_027ec5e155f266ec016a3c12675f308191aa4cbc320785b520","obfuscation":"tI6L1pnYGa","output_index":0,"sequence_number":48,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" my","item_id":"rs_027ec5e155f266ec016a3c12675f308191aa4cbc320785b520","obfuscation":"V2IY84r2wbbiU","output_index":0,"sequence_number":49,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" response","item_id":"rs_027ec5e155f266ec016a3c12675f308191aa4cbc320785b520","obfuscation":"bb8ayGL","output_index":0,"sequence_number":50,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" like","item_id":"rs_027ec5e155f266ec016a3c12675f308191aa4cbc320785b520","obfuscation":"SFmThhrXBpR","output_index":0,"sequence_number":51,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":":","item_id":"rs_027ec5e155f266ec016a3c12675f308191aa4cbc320785b520","obfuscation":"EV5q9iQK3o5YZrX","output_index":0,"sequence_number":52,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" “","item_id":"rs_027ec5e155f266ec016a3c12675f308191aa4cbc320785b520","obfuscation":"3bJAQQn3DbTfXY","output_index":0,"sequence_number":53,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":"It","item_id":"rs_027ec5e155f266ec016a3c12675f308191aa4cbc320785b520","obfuscation":"hcfuiOeqfmLgP2","output_index":0,"sequence_number":54,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":"’s","item_id":"rs_027ec5e155f266ec016a3c12675f308191aa4cbc320785b520","obfuscation":"diuOu6n0ANrfkJ","output_index":0,"sequence_number":55,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" currently","item_id":"rs_027ec5e155f266ec016a3c12675f308191aa4cbc320785b520","obfuscation":"xD0Csf","output_index":0,"sequence_number":56,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" 40","item_id":"rs_027ec5e155f266ec016a3c12675f308191aa4cbc320785b520","obfuscation":"vZDXdkdyha8gb","output_index":0,"sequence_number":57,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":"°C","item_id":"rs_027ec5e155f266ec016a3c12675f308191aa4cbc320785b520","obfuscation":"sarO8GLleWKF5q","output_index":0,"sequence_number":58,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" in","item_id":"rs_027ec5e155f266ec016a3c12675f308191aa4cbc320785b520","obfuscation":"XUsRYbgSRmRWD","output_index":0,"sequence_number":59,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" Florence","item_id":"rs_027ec5e155f266ec016a3c12675f308191aa4cbc320785b520","obfuscation":"gjlbWKN","output_index":0,"sequence_number":60,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":",","item_id":"rs_027ec5e155f266ec016a3c12675f308191aa4cbc320785b520","obfuscation":"paPGE7idU0ptY5a","output_index":0,"sequence_number":61,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" Italy","item_id":"rs_027ec5e155f266ec016a3c12675f308191aa4cbc320785b520","obfuscation":"ig7EUOjD6r","output_index":0,"sequence_number":62,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":",","item_id":"rs_027ec5e155f266ec016a3c12675f308191aa4cbc320785b520","obfuscation":"0CBpwkMzTBG2WP0","output_index":0,"sequence_number":63,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" which","item_id":"rs_027ec5e155f266ec016a3c12675f308191aa4cbc320785b520","obfuscation":"bMmUCdIqY2","output_index":0,"sequence_number":64,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" is","item_id":"rs_027ec5e155f266ec016a3c12675f308191aa4cbc320785b520","obfuscation":"JDcf4hgvLnHkZ","output_index":0,"sequence_number":65,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" extremely","item_id":"rs_027ec5e155f266ec016a3c12675f308191aa4cbc320785b520","obfuscation":"EQUCRx","output_index":0,"sequence_number":66,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" hot","item_id":"rs_027ec5e155f266ec016a3c12675f308191aa4cbc320785b520","obfuscation":"FC15TITlAx3K","output_index":0,"sequence_number":67,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":".”","item_id":"rs_027ec5e155f266ec016a3c12675f308191aa4cbc320785b520","obfuscation":"XXEkUSG1vRUmkl","output_index":0,"sequence_number":68,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" It","item_id":"rs_027ec5e155f266ec016a3c12675f308191aa4cbc320785b520","obfuscation":"QbzhNVDS9zHlA","output_index":0,"sequence_number":69,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" makes","item_id":"rs_027ec5e155f266ec016a3c12675f308191aa4cbc320785b520","obfuscation":"oYEBCcItql","output_index":0,"sequence_number":70,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" sense","item_id":"rs_027ec5e155f266ec016a3c12675f308191aa4cbc320785b520","obfuscation":"Okrg3EHj8A","output_index":0,"sequence_number":71,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" to","item_id":"rs_027ec5e155f266ec016a3c12675f308191aa4cbc320785b520","obfuscation":"aZX16Z6GS0zMJ","output_index":0,"sequence_number":72,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" encourage","item_id":"rs_027ec5e155f266ec016a3c12675f308191aa4cbc320785b520","obfuscation":"JBgFkY","output_index":0,"sequence_number":73,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" the","item_id":"rs_027ec5e155f266ec016a3c12675f308191aa4cbc320785b520","obfuscation":"9UuLZx2pnpBu","output_index":0,"sequence_number":74,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" user","item_id":"rs_027ec5e155f266ec016a3c12675f308191aa4cbc320785b520","obfuscation":"eTWVI44ZKwQ","output_index":0,"sequence_number":75,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" to","item_id":"rs_027ec5e155f266ec016a3c12675f308191aa4cbc320785b520","obfuscation":"hACSQl8Hnd9f0","output_index":0,"sequence_number":76,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" stay","item_id":"rs_027ec5e155f266ec016a3c12675f308191aa4cbc320785b520","obfuscation":"KBnvHHjTsrp","output_index":0,"sequence_number":77,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" hydrated","item_id":"rs_027ec5e155f266ec016a3c12675f308191aa4cbc320785b520","obfuscation":"cELrmvH","output_index":0,"sequence_number":78,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" and","item_id":"rs_027ec5e155f266ec016a3c12675f308191aa4cbc320785b520","obfuscation":"a81CcGzj7TQY","output_index":0,"sequence_number":79,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" take","item_id":"rs_027ec5e155f266ec016a3c12675f308191aa4cbc320785b520","obfuscation":"7yhygG7GHbH","output_index":0,"sequence_number":80,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" necessary","item_id":"rs_027ec5e155f266ec016a3c12675f308191aa4cbc320785b520","obfuscation":"GpT4nu","output_index":0,"sequence_number":81,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" precautions","item_id":"rs_027ec5e155f266ec016a3c12675f308191aa4cbc320785b520","obfuscation":"aG1e","output_index":0,"sequence_number":82,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":".","item_id":"rs_027ec5e155f266ec016a3c12675f308191aa4cbc320785b520","obfuscation":"h5boRJiZKKCBsqR","output_index":0,"sequence_number":83,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" I'll","item_id":"rs_027ec5e155f266ec016a3c12675f308191aa4cbc320785b520","obfuscation":"ladns986sBS","output_index":0,"sequence_number":84,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" put","item_id":"rs_027ec5e155f266ec016a3c12675f308191aa4cbc320785b520","obfuscation":"wBHD8vpF0BNr","output_index":0,"sequence_number":85,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" that","item_id":"rs_027ec5e155f266ec016a3c12675f308191aa4cbc320785b520","obfuscation":"XH5GDxTgCFE","output_index":0,"sequence_number":86,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" all","item_id":"rs_027ec5e155f266ec016a3c12675f308191aa4cbc320785b520","obfuscation":"hmrJj7fgn6V9","output_index":0,"sequence_number":87,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" together","item_id":"rs_027ec5e155f266ec016a3c12675f308191aa4cbc320785b520","obfuscation":"6se5Ecv","output_index":0,"sequence_number":88,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" in","item_id":"rs_027ec5e155f266ec016a3c12675f308191aa4cbc320785b520","obfuscation":"gIApz6XL9ZMzV","output_index":0,"sequence_number":89,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" a","item_id":"rs_027ec5e155f266ec016a3c12675f308191aa4cbc320785b520","obfuscation":"pDWaFfb1sU9SRD","output_index":0,"sequence_number":90,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" clear","item_id":"rs_027ec5e155f266ec016a3c12675f308191aa4cbc320785b520","obfuscation":"wuDCVgf2Ye","output_index":0,"sequence_number":91,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":" response","item_id":"rs_027ec5e155f266ec016a3c12675f308191aa4cbc320785b520","obfuscation":"wpQJjMZ","output_index":0,"sequence_number":92,"summary_index":0} + + event: response.reasoning_summary_text.delta + data: {"type":"response.reasoning_summary_text.delta","delta":".","item_id":"rs_027ec5e155f266ec016a3c12675f308191aa4cbc320785b520","obfuscation":"Ril5sLhZf7RjqWl","output_index":0,"sequence_number":93,"summary_index":0} + + event: response.reasoning_summary_text.done + data: {"type":"response.reasoning_summary_text.done","item_id":"rs_027ec5e155f266ec016a3c12675f308191aa4cbc320785b520","output_index":0,"sequence_number":94,"summary_index":0,"text":"**Summarizing Florence's weather**\n\nThe user asked about the weather in Florence, Italy, and I got a return of 40°C. This suggests it's blazing hot! Even though the information seems limited, I’ll interpret that as the current temperature. I’ll frame my response like: “It’s currently 40°C in Florence, Italy, which is extremely hot.” It makes sense to encourage the user to stay hydrated and take necessary precautions. I'll put that all together in a clear response."} + + event: response.reasoning_summary_part.done + data: {"type":"response.reasoning_summary_part.done","item_id":"rs_027ec5e155f266ec016a3c12675f308191aa4cbc320785b520","output_index":0,"part":{"type":"summary_text","text":"**Summarizing Florence's weather**\n\nThe user asked about the weather in Florence, Italy, and I got a return of 40°C. This suggests it's blazing hot! Even though the information seems limited, I’ll interpret that as the current temperature. I’ll frame my response like: “It’s currently 40°C in Florence, Italy, which is extremely hot.” It makes sense to encourage the user to stay hydrated and take necessary precautions. I'll put that all together in a clear response."},"sequence_number":95,"summary_index":0} + + event: response.output_item.done + data: {"type":"response.output_item.done","item":{"id":"rs_027ec5e155f266ec016a3c12675f308191aa4cbc320785b520","type":"reasoning","content":[],"encrypted_content":"gAAAAABqPBJqdCAWGIm0robYDjIivYwZEwlJYdaIBdSG42-xNVbdj-TIFXS3me2yt5l8j3i49VlyG7_OmEPtOAgn7SMBE4jh4vnf4u2eW56yv7b-cxTeEeR2xxS0thoz8spdZk17iBZSzyEulk0KpDRoJ-DrmOxE1IjNfc1YBiFN_FdNQOzOsEeisoKQQl6AlK8F2DA_UhRKGqEzz5Rnt8OWrf2zd28jLPVBTvmLroyia6dHFUigZnggEiBcmzuAiaHCj2sw2kQ3FTtClFNMk3u1wENcF0S2NWMB8S4Hz_ITA_WtylRrJA88x65AZUAqkth3OiL1YhPy584ymFvOLfAZxBdrrirju9S4wLz9_GB5MIZC_3TLgOsu4-wa6S3pUfdycMBsjprANzZikvYdiECCz9Pxz1f4QBPR_suRdXkcW1ggb7gww0IsVCGxnXViLIX7DvPgTU5FkRPSrX0ehYwypiAwgVQUdX0p3oh0zGAuJ1EU0JNkJejJy7VFUU7qQeEh3Ca0OXJY-xxjQAEU1omn4gQ2miru6ZsaO3kyOexpNRe4M0JzNajAA52XNSZzhtuKeJaM6GoXNEIgP0AVgfTqIRq3qn_AIQkllYAcMR-MIyyZsOi_0stLssFWkaluG99JVa18KG4UUz_KoWRKESZPUusU4-_QnWOz3b3jPruPcgGkV11Px_e0-uLdNmdxNsYyfa3b1MlR-o_kCHIURWAwqLHYhiRqHcfMr0rbeRMlG7Bgz5zENHE1_rKjytEuv9DU7echDTqLpaa4zR-EPsybI0zcVt2tH7n4gPGlh8sCfyPAzznmMb3BS8yCRek1lEfStWxHHQ7jmE9Kqb-w4jQeo14rGnB-lTFCEDXS3rS5ejX7fGCkzyKi06-iXb7IjLd7iwQdfy8hbQ9eXOJ4peKKUAoY6Lw8wfufa_AXw5NIOKferJF2esqMzvQj7_49JSWaE2AYEjGTLcPAarRcGxcyCRS3Rvs6NWmZVh80al3mNpsZCHwqmErGpJ7nU4fqhjNtAZSvmCP6BtOYaHN7Bp_xho4i8aQE_rd2bMM9DNne82rftuA5VwHIIEePjLeXLTohPQc6H7UdvcoJdh57mBJl69Rzr5AaHKDVIo0isYxoSVWCD32zN0-l1ZWZiu15G-8h5ZSfCQGeOrOmhaSTE_IhKTnCJqeHX2Q_KwDLFz-kCaB8DiNEhs5KvTrnJWOXg73N8XD1PB0cBaT82VaY8ueB7fBqZUBoA7MF4Mf5Bc1Qi8TmnpTnghd433sDI0-N5NN7KDeEdtJDbbS9qi7jAAtoxaDQyy907v3RN3DlJiBJljAMD3Ehe-qCjvacp96KpSTAR-cY7gU0bM0k-4l14xKc4uAIf76Srouc8F9uOKuTEgJh_ShxXxbSCULLA1pBAgCWBM-TpUsH-iGDTJsRaJfknxfArKPJnidAUYv1x9_ittvOd2AMrKpvjLRm3njfg5dPJmbN1p6LGAKywjnZcc6udHpAiYOkNIAueFlh3ZZOZjAvhJvR7d_TJ8Rs8ENcM3qTjc0ksMv9r0_m86ekjtZ0gSKN8Z-vptlCTIW5BM5vsmfgN2hk4n3n4USKW3zKqwMr7S97lWz4q0SkvvqFjisqC96H0EptlUwDPcPUapjjMBL-y2MjehKHCIe5ckkmCY2mFweYPI41","summary":[{"type":"summary_text","text":"**Summarizing Florence's weather**\n\nThe user asked about the weather in Florence, Italy, and I got a return of 40°C. This suggests it's blazing hot! Even though the information seems limited, I’ll interpret that as the current temperature. I’ll frame my response like: “It’s currently 40°C in Florence, Italy, which is extremely hot.” It makes sense to encourage the user to stay hydrated and take necessary precautions. I'll put that all together in a clear response."}]},"output_index":0,"sequence_number":96} + + event: response.output_item.added + data: {"type":"response.output_item.added","item":{"id":"msg_027ec5e155f266ec016a3c126ae79c819192cac59929b168ad","type":"message","status":"in_progress","content":[],"role":"assistant"},"output_index":1,"sequence_number":97} event: response.content_part.added - data: {"type":"response.content_part.added","content_index":0,"item_id":"msg_0f5967458d374a400169b3198e0a188192b4ea23b03f3a9c9c","output_index":0,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":""},"sequence_number":3} + data: {"type":"response.content_part.added","content_index":0,"item_id":"msg_027ec5e155f266ec016a3c126ae79c819192cac59929b168ad","output_index":1,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":""},"sequence_number":98} + + event: response.output_text.delta + data: {"type":"response.output_text.delta","content_index":0,"delta":"The","item_id":"msg_027ec5e155f266ec016a3c126ae79c819192cac59929b168ad","logprobs":[],"obfuscation":"TW4qEdDqwwdnO","output_index":1,"sequence_number":99} + + event: response.output_text.delta + data: {"type":"response.output_text.delta","content_index":0,"delta":" current","item_id":"msg_027ec5e155f266ec016a3c126ae79c819192cac59929b168ad","logprobs":[],"obfuscation":"97GARpD2","output_index":1,"sequence_number":100} + + event: response.output_text.delta + data: {"type":"response.output_text.delta","content_index":0,"delta":" temperature","item_id":"msg_027ec5e155f266ec016a3c126ae79c819192cac59929b168ad","logprobs":[],"obfuscation":"xAXI","output_index":1,"sequence_number":101} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":"The","item_id":"msg_0f5967458d374a400169b3198e0a188192b4ea23b03f3a9c9c","logprobs":[],"obfuscation":"ONr4uSmBIKwBc","output_index":0,"sequence_number":4} + data: {"type":"response.output_text.delta","content_index":0,"delta":" in","item_id":"msg_027ec5e155f266ec016a3c126ae79c819192cac59929b168ad","logprobs":[],"obfuscation":"YZ6Wb017oSGJh","output_index":1,"sequence_number":102} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" current","item_id":"msg_0f5967458d374a400169b3198e0a188192b4ea23b03f3a9c9c","logprobs":[],"obfuscation":"Zc3AWWFQ","output_index":0,"sequence_number":5} + data: {"type":"response.output_text.delta","content_index":0,"delta":" Florence","item_id":"msg_027ec5e155f266ec016a3c126ae79c819192cac59929b168ad","logprobs":[],"obfuscation":"ZZpvJ5K","output_index":1,"sequence_number":103} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" temperature","item_id":"msg_0f5967458d374a400169b3198e0a188192b4ea23b03f3a9c9c","logprobs":[],"obfuscation":"p6gN","output_index":0,"sequence_number":6} + data: {"type":"response.output_text.delta","content_index":0,"delta":",","item_id":"msg_027ec5e155f266ec016a3c126ae79c819192cac59929b168ad","logprobs":[],"obfuscation":"aOGOC4r5XNDaUGd","output_index":1,"sequence_number":104} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" in","item_id":"msg_0f5967458d374a400169b3198e0a188192b4ea23b03f3a9c9c","logprobs":[],"obfuscation":"cfOIUpArSSsOS","output_index":0,"sequence_number":7} + data: {"type":"response.output_text.delta","content_index":0,"delta":" Italy","item_id":"msg_027ec5e155f266ec016a3c126ae79c819192cac59929b168ad","logprobs":[],"obfuscation":"7ngqGYrJCN","output_index":1,"sequence_number":105} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" Florence","item_id":"msg_0f5967458d374a400169b3198e0a188192b4ea23b03f3a9c9c","logprobs":[],"obfuscation":"TSCgdt5","output_index":0,"sequence_number":8} + data: {"type":"response.output_text.delta","content_index":0,"delta":" is","item_id":"msg_027ec5e155f266ec016a3c126ae79c819192cac59929b168ad","logprobs":[],"obfuscation":"H1PkmS36eYrVJ","output_index":1,"sequence_number":106} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":",","item_id":"msg_0f5967458d374a400169b3198e0a188192b4ea23b03f3a9c9c","logprobs":[],"obfuscation":"4I9V6IN3uvtGivp","output_index":0,"sequence_number":9} + data: {"type":"response.output_text.delta","content_index":0,"delta":" ","item_id":"msg_027ec5e155f266ec016a3c126ae79c819192cac59929b168ad","logprobs":[],"obfuscation":"pqCIhjeeHL7ndwv","output_index":1,"sequence_number":107} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" Italy","item_id":"msg_0f5967458d374a400169b3198e0a188192b4ea23b03f3a9c9c","logprobs":[],"obfuscation":"MrEjnNTU2C","output_index":0,"sequence_number":10} + data: {"type":"response.output_text.delta","content_index":0,"delta":"40","item_id":"msg_027ec5e155f266ec016a3c126ae79c819192cac59929b168ad","logprobs":[],"obfuscation":"J9OP5CBSY0Eq4M","output_index":1,"sequence_number":108} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" is","item_id":"msg_0f5967458d374a400169b3198e0a188192b4ea23b03f3a9c9c","logprobs":[],"obfuscation":"70CEgLpK0HcuC","output_index":0,"sequence_number":11} + data: {"type":"response.output_text.delta","content_index":0,"delta":" ","item_id":"msg_027ec5e155f266ec016a3c126ae79c819192cac59929b168ad","logprobs":[],"obfuscation":"Jg4jVsglHkkq2zV","output_index":1,"sequence_number":109} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" ","item_id":"msg_0f5967458d374a400169b3198e0a188192b4ea23b03f3a9c9c","logprobs":[],"obfuscation":"fLFo8UsEVoAz5C6","output_index":0,"sequence_number":12} + data: {"type":"response.output_text.delta","content_index":0,"delta":"°C","item_id":"msg_027ec5e155f266ec016a3c126ae79c819192cac59929b168ad","logprobs":[],"obfuscation":"kccB6np7U9eERr","output_index":1,"sequence_number":110} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":"40","item_id":"msg_0f5967458d374a400169b3198e0a188192b4ea23b03f3a9c9c","logprobs":[],"obfuscation":"G4XFp9RRyAcRGY","output_index":0,"sequence_number":13} + data: {"type":"response.output_text.delta","content_index":0,"delta":" —","item_id":"msg_027ec5e155f266ec016a3c126ae79c819192cac59929b168ad","logprobs":[],"obfuscation":"1QMtgb6wuqYY33","output_index":1,"sequence_number":111} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":"°C","item_id":"msg_0f5967458d374a400169b3198e0a188192b4ea23b03f3a9c9c","logprobs":[],"obfuscation":"hJ9vF0eSbEJbjf","output_index":0,"sequence_number":14} + data: {"type":"response.output_text.delta","content_index":0,"delta":" it","item_id":"msg_027ec5e155f266ec016a3c126ae79c819192cac59929b168ad","logprobs":[],"obfuscation":"FeG2AB3nyL8ZW","output_index":1,"sequence_number":112} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":".","item_id":"msg_0f5967458d374a400169b3198e0a188192b4ea23b03f3a9c9c","logprobs":[],"obfuscation":"J4At1vWlr1PphtH","output_index":0,"sequence_number":15} + data: {"type":"response.output_text.delta","content_index":0,"delta":"’s","item_id":"msg_027ec5e155f266ec016a3c126ae79c819192cac59929b168ad","logprobs":[],"obfuscation":"mSTzcBBcaxJVUM","output_index":1,"sequence_number":113} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" It's","item_id":"msg_0f5967458d374a400169b3198e0a188192b4ea23b03f3a9c9c","logprobs":[],"obfuscation":"npYaIwptxbW","output_index":0,"sequence_number":16} + data: {"type":"response.output_text.delta","content_index":0,"delta":" very","item_id":"msg_027ec5e155f266ec016a3c126ae79c819192cac59929b168ad","logprobs":[],"obfuscation":"3qXHqWtA5JH","output_index":1,"sequence_number":114} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" quite","item_id":"msg_0f5967458d374a400169b3198e0a188192b4ea23b03f3a9c9c","logprobs":[],"obfuscation":"jmMw6IZ4yh","output_index":0,"sequence_number":17} + data: {"type":"response.output_text.delta","content_index":0,"delta":" hot","item_id":"msg_027ec5e155f266ec016a3c126ae79c819192cac59929b168ad","logprobs":[],"obfuscation":"gfBCjms0KKh4","output_index":1,"sequence_number":115} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" hot","item_id":"msg_0f5967458d374a400169b3198e0a188192b4ea23b03f3a9c9c","logprobs":[],"obfuscation":"n6Gv3TYQn3x5","output_index":0,"sequence_number":18} + data: {"type":"response.output_text.delta","content_index":0,"delta":".","item_id":"msg_027ec5e155f266ec016a3c126ae79c819192cac59929b168ad","logprobs":[],"obfuscation":"u3c8N5cwTbShfbf","output_index":1,"sequence_number":116} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":",","item_id":"msg_0f5967458d374a400169b3198e0a188192b4ea23b03f3a9c9c","logprobs":[],"obfuscation":"EGfgOfTNqiYHipr","output_index":0,"sequence_number":19} + data: {"type":"response.output_text.delta","content_index":0,"delta":" If","item_id":"msg_027ec5e155f266ec016a3c126ae79c819192cac59929b168ad","logprobs":[],"obfuscation":"MUcc5GzKgIB1J","output_index":1,"sequence_number":117} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" so","item_id":"msg_0f5967458d374a400169b3198e0a188192b4ea23b03f3a9c9c","logprobs":[],"obfuscation":"zEEIPCe437By0","output_index":0,"sequence_number":20} + data: {"type":"response.output_text.delta","content_index":0,"delta":" you","item_id":"msg_027ec5e155f266ec016a3c126ae79c819192cac59929b168ad","logprobs":[],"obfuscation":"5kcom7JpzJN5","output_index":1,"sequence_number":118} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" if","item_id":"msg_0f5967458d374a400169b3198e0a188192b4ea23b03f3a9c9c","logprobs":[],"obfuscation":"uvwsiGnrMY9Gx","output_index":0,"sequence_number":21} + data: {"type":"response.output_text.delta","content_index":0,"delta":"’re","item_id":"msg_027ec5e155f266ec016a3c126ae79c819192cac59929b168ad","logprobs":[],"obfuscation":"7r2ByWMRRRfbb","output_index":1,"sequence_number":119} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" you","item_id":"msg_0f5967458d374a400169b3198e0a188192b4ea23b03f3a9c9c","logprobs":[],"obfuscation":"pgLOCp3ZkLFv","output_index":0,"sequence_number":22} + data: {"type":"response.output_text.delta","content_index":0,"delta":" heading","item_id":"msg_027ec5e155f266ec016a3c126ae79c819192cac59929b168ad","logprobs":[],"obfuscation":"tOPH0uv5","output_index":1,"sequence_number":120} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":"’re","item_id":"msg_0f5967458d374a400169b3198e0a188192b4ea23b03f3a9c9c","logprobs":[],"obfuscation":"9pfWgoEbmLia1","output_index":0,"sequence_number":23} + data: {"type":"response.output_text.delta","content_index":0,"delta":" outdoors","item_id":"msg_027ec5e155f266ec016a3c126ae79c819192cac59929b168ad","logprobs":[],"obfuscation":"fS2cMTM","output_index":1,"sequence_number":121} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" heading","item_id":"msg_0f5967458d374a400169b3198e0a188192b4ea23b03f3a9c9c","logprobs":[],"obfuscation":"6hlfru7B","output_index":0,"sequence_number":24} + data: {"type":"response.output_text.delta","content_index":0,"delta":",","item_id":"msg_027ec5e155f266ec016a3c126ae79c819192cac59929b168ad","logprobs":[],"obfuscation":"UlY8I7AZP0iQziQ","output_index":1,"sequence_number":122} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" outdoors","item_id":"msg_0f5967458d374a400169b3198e0a188192b4ea23b03f3a9c9c","logprobs":[],"obfuscation":"MGGcHby","output_index":0,"sequence_number":25} + data: {"type":"response.output_text.delta","content_index":0,"delta":" make","item_id":"msg_027ec5e155f266ec016a3c126ae79c819192cac59929b168ad","logprobs":[],"obfuscation":"ihOm2se59Ii","output_index":1,"sequence_number":123} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":",","item_id":"msg_0f5967458d374a400169b3198e0a188192b4ea23b03f3a9c9c","logprobs":[],"obfuscation":"C34ol21zirWTlPb","output_index":0,"sequence_number":26} + data: {"type":"response.output_text.delta","content_index":0,"delta":" sure","item_id":"msg_027ec5e155f266ec016a3c126ae79c819192cac59929b168ad","logprobs":[],"obfuscation":"79opDlsgQkg","output_index":1,"sequence_number":124} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" consider","item_id":"msg_0f5967458d374a400169b3198e0a188192b4ea23b03f3a9c9c","logprobs":[],"obfuscation":"P0V6Jhj","output_index":0,"sequence_number":27} + data: {"type":"response.output_text.delta","content_index":0,"delta":" to","item_id":"msg_027ec5e155f266ec016a3c126ae79c819192cac59929b168ad","logprobs":[],"obfuscation":"SvZ4K5tH6QxhL","output_index":1,"sequence_number":125} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" staying","item_id":"msg_0f5967458d374a400169b3198e0a188192b4ea23b03f3a9c9c","logprobs":[],"obfuscation":"ot09qFTe","output_index":0,"sequence_number":28} + data: {"type":"response.output_text.delta","content_index":0,"delta":":\n\n","item_id":"msg_027ec5e155f266ec016a3c126ae79c819192cac59929b168ad","logprobs":[],"obfuscation":"aueZ0wLqbH93k","output_index":1,"sequence_number":126} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" hydrated","item_id":"msg_0f5967458d374a400169b3198e0a188192b4ea23b03f3a9c9c","logprobs":[],"obfuscation":"5kr63tm","output_index":0,"sequence_number":29} + data: {"type":"response.output_text.delta","content_index":0,"delta":"•","item_id":"msg_027ec5e155f266ec016a3c126ae79c819192cac59929b168ad","logprobs":[],"obfuscation":"CzYaArhnTR2zMdd","output_index":1,"sequence_number":127} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":",","item_id":"msg_0f5967458d374a400169b3198e0a188192b4ea23b03f3a9c9c","logprobs":[],"obfuscation":"tmr6uS8z09L6why","output_index":0,"sequence_number":30} + data: {"type":"response.output_text.delta","content_index":0,"delta":" Stay","item_id":"msg_027ec5e155f266ec016a3c126ae79c819192cac59929b168ad","logprobs":[],"obfuscation":"qN1UwqENxqD","output_index":1,"sequence_number":128} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" wearing","item_id":"msg_0f5967458d374a400169b3198e0a188192b4ea23b03f3a9c9c","logprobs":[],"obfuscation":"DLok2f5m","output_index":0,"sequence_number":31} + data: {"type":"response.output_text.delta","content_index":0,"delta":" hydrated","item_id":"msg_027ec5e155f266ec016a3c126ae79c819192cac59929b168ad","logprobs":[],"obfuscation":"oJz76Zw","output_index":1,"sequence_number":129} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" light","item_id":"msg_0f5967458d374a400169b3198e0a188192b4ea23b03f3a9c9c","logprobs":[],"obfuscation":"2ansue0Ppc","output_index":0,"sequence_number":32} + data: {"type":"response.output_text.delta","content_index":0,"delta":" \n","item_id":"msg_027ec5e155f266ec016a3c126ae79c819192cac59929b168ad","logprobs":[],"obfuscation":"H6ow3ieyv6T83","output_index":1,"sequence_number":130} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":",","item_id":"msg_0f5967458d374a400169b3198e0a188192b4ea23b03f3a9c9c","logprobs":[],"obfuscation":"0cO7Ntq05vymUbW","output_index":0,"sequence_number":33} + data: {"type":"response.output_text.delta","content_index":0,"delta":"•","item_id":"msg_027ec5e155f266ec016a3c126ae79c819192cac59929b168ad","logprobs":[],"obfuscation":"y9YC7AEXM2Qtayh","output_index":1,"sequence_number":131} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" breathable","item_id":"msg_0f5967458d374a400169b3198e0a188192b4ea23b03f3a9c9c","logprobs":[],"obfuscation":"4l8Zn","output_index":0,"sequence_number":34} + data: {"type":"response.output_text.delta","content_index":0,"delta":" Wear","item_id":"msg_027ec5e155f266ec016a3c126ae79c819192cac59929b168ad","logprobs":[],"obfuscation":"COZGuTLj1h1","output_index":1,"sequence_number":132} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" clothing","item_id":"msg_0f5967458d374a400169b3198e0a188192b4ea23b03f3a9c9c","logprobs":[],"obfuscation":"rfgv4zM","output_index":0,"sequence_number":35} + data: {"type":"response.output_text.delta","content_index":0,"delta":" light","item_id":"msg_027ec5e155f266ec016a3c126ae79c819192cac59929b168ad","logprobs":[],"obfuscation":"aEMhDNMYkg","output_index":1,"sequence_number":133} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":",","item_id":"msg_0f5967458d374a400169b3198e0a188192b4ea23b03f3a9c9c","logprobs":[],"obfuscation":"T6QWfZxA80oTjIk","output_index":0,"sequence_number":36} + data: {"type":"response.output_text.delta","content_index":0,"delta":",","item_id":"msg_027ec5e155f266ec016a3c126ae79c819192cac59929b168ad","logprobs":[],"obfuscation":"GKVLPcaeL61vtGH","output_index":1,"sequence_number":134} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" and","item_id":"msg_0f5967458d374a400169b3198e0a188192b4ea23b03f3a9c9c","logprobs":[],"obfuscation":"vJ6ZgFoyq5cq","output_index":0,"sequence_number":37} + data: {"type":"response.output_text.delta","content_index":0,"delta":" breathable","item_id":"msg_027ec5e155f266ec016a3c126ae79c819192cac59929b168ad","logprobs":[],"obfuscation":"XnptE","output_index":1,"sequence_number":135} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" seeking","item_id":"msg_0f5967458d374a400169b3198e0a188192b4ea23b03f3a9c9c","logprobs":[],"obfuscation":"o2hP0xaJ","output_index":0,"sequence_number":38} + data: {"type":"response.output_text.delta","content_index":0,"delta":" clothing","item_id":"msg_027ec5e155f266ec016a3c126ae79c819192cac59929b168ad","logprobs":[],"obfuscation":"ZSPSfBQ","output_index":1,"sequence_number":136} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" shade","item_id":"msg_0f5967458d374a400169b3198e0a188192b4ea23b03f3a9c9c","logprobs":[],"obfuscation":"FYhcueAAcT","output_index":0,"sequence_number":39} + data: {"type":"response.output_text.delta","content_index":0,"delta":" \n","item_id":"msg_027ec5e155f266ec016a3c126ae79c819192cac59929b168ad","logprobs":[],"obfuscation":"1hbMUlGcSTGY2","output_index":1,"sequence_number":137} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" or","item_id":"msg_0f5967458d374a400169b3198e0a188192b4ea23b03f3a9c9c","logprobs":[],"obfuscation":"HkpzX4cyRiHZC","output_index":0,"sequence_number":40} + data: {"type":"response.output_text.delta","content_index":0,"delta":"•","item_id":"msg_027ec5e155f266ec016a3c126ae79c819192cac59929b168ad","logprobs":[],"obfuscation":"Tcqt2LKOFiBnwhj","output_index":1,"sequence_number":138} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" air","item_id":"msg_0f5967458d374a400169b3198e0a188192b4ea23b03f3a9c9c","logprobs":[],"obfuscation":"qd2UeFhVFAWx","output_index":0,"sequence_number":41} + data: {"type":"response.output_text.delta","content_index":0,"delta":" Avoid","item_id":"msg_027ec5e155f266ec016a3c126ae79c819192cac59929b168ad","logprobs":[],"obfuscation":"A74wDgCBWm","output_index":1,"sequence_number":139} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":"-conditioned","item_id":"msg_0f5967458d374a400169b3198e0a188192b4ea23b03f3a9c9c","logprobs":[],"obfuscation":"CSg6","output_index":0,"sequence_number":42} + data: {"type":"response.output_text.delta","content_index":0,"delta":" extended","item_id":"msg_027ec5e155f266ec016a3c126ae79c819192cac59929b168ad","logprobs":[],"obfuscation":"35NVEJ5","output_index":1,"sequence_number":140} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" spaces","item_id":"msg_0f5967458d374a400169b3198e0a188192b4ea23b03f3a9c9c","logprobs":[],"obfuscation":"tyJeuMTo2","output_index":0,"sequence_number":43} + data: {"type":"response.output_text.delta","content_index":0,"delta":" sun","item_id":"msg_027ec5e155f266ec016a3c126ae79c819192cac59929b168ad","logprobs":[],"obfuscation":"XKfxffKU8Eip","output_index":1,"sequence_number":141} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" when","item_id":"msg_0f5967458d374a400169b3198e0a188192b4ea23b03f3a9c9c","logprobs":[],"obfuscation":"wmJtIM2cQ5H","output_index":0,"sequence_number":44} + data: {"type":"response.output_text.delta","content_index":0,"delta":" exposure","item_id":"msg_027ec5e155f266ec016a3c126ae79c819192cac59929b168ad","logprobs":[],"obfuscation":"eNxKluu","output_index":1,"sequence_number":142} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" possible","item_id":"msg_0f5967458d374a400169b3198e0a188192b4ea23b03f3a9c9c","logprobs":[],"obfuscation":"Zfj3nAa","output_index":0,"sequence_number":45} + data: {"type":"response.output_text.delta","content_index":0,"delta":" during","item_id":"msg_027ec5e155f266ec016a3c126ae79c819192cac59929b168ad","logprobs":[],"obfuscation":"qjp9zILSQ","output_index":1,"sequence_number":143} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":".","item_id":"msg_0f5967458d374a400169b3198e0a188192b4ea23b03f3a9c9c","logprobs":[],"obfuscation":"0THGPWMaBEYYSpG","output_index":0,"sequence_number":46} + data: {"type":"response.output_text.delta","content_index":0,"delta":" peak","item_id":"msg_027ec5e155f266ec016a3c126ae79c819192cac59929b168ad","logprobs":[],"obfuscation":"YbBW5uWvj2L","output_index":1,"sequence_number":144} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" Let","item_id":"msg_0f5967458d374a400169b3198e0a188192b4ea23b03f3a9c9c","logprobs":[],"obfuscation":"JQAKbv2z87AF","output_index":0,"sequence_number":47} + data: {"type":"response.output_text.delta","content_index":0,"delta":" afternoon","item_id":"msg_027ec5e155f266ec016a3c126ae79c819192cac59929b168ad","logprobs":[],"obfuscation":"XOs8SD","output_index":1,"sequence_number":145} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" me","item_id":"msg_0f5967458d374a400169b3198e0a188192b4ea23b03f3a9c9c","logprobs":[],"obfuscation":"ivnSborJuB9vI","output_index":0,"sequence_number":48} + data: {"type":"response.output_text.delta","content_index":0,"delta":" hours","item_id":"msg_027ec5e155f266ec016a3c126ae79c819192cac59929b168ad","logprobs":[],"obfuscation":"HTqx5jz4wq","output_index":1,"sequence_number":146} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" know","item_id":"msg_0f5967458d374a400169b3198e0a188192b4ea23b03f3a9c9c","logprobs":[],"obfuscation":"oFJ8WeKijZM","output_index":0,"sequence_number":49} + data: {"type":"response.output_text.delta","content_index":0,"delta":" \n","item_id":"msg_027ec5e155f266ec016a3c126ae79c819192cac59929b168ad","logprobs":[],"obfuscation":"kCcok7BF5lqRs","output_index":1,"sequence_number":147} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" if","item_id":"msg_0f5967458d374a400169b3198e0a188192b4ea23b03f3a9c9c","logprobs":[],"obfuscation":"WaInxNtOXCnYz","output_index":0,"sequence_number":50} + data: {"type":"response.output_text.delta","content_index":0,"delta":"•","item_id":"msg_027ec5e155f266ec016a3c126ae79c819192cac59929b168ad","logprobs":[],"obfuscation":"lJtKim6QXAr1Olp","output_index":1,"sequence_number":148} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" you","item_id":"msg_0f5967458d374a400169b3198e0a188192b4ea23b03f3a9c9c","logprobs":[],"obfuscation":"QDzU0aZw25b4","output_index":0,"sequence_number":51} + data: {"type":"response.output_text.delta","content_index":0,"delta":" Take","item_id":"msg_027ec5e155f266ec016a3c126ae79c819192cac59929b168ad","logprobs":[],"obfuscation":"qSLuPE80QZk","output_index":1,"sequence_number":149} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":"’d","item_id":"msg_0f5967458d374a400169b3198e0a188192b4ea23b03f3a9c9c","logprobs":[],"obfuscation":"srcyXarzaxbYzG","output_index":0,"sequence_number":52} + data: {"type":"response.output_text.delta","content_index":0,"delta":" breaks","item_id":"msg_027ec5e155f266ec016a3c126ae79c819192cac59929b168ad","logprobs":[],"obfuscation":"2OOrbrP2j","output_index":1,"sequence_number":150} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" like","item_id":"msg_0f5967458d374a400169b3198e0a188192b4ea23b03f3a9c9c","logprobs":[],"obfuscation":"cHnkCxyP949","output_index":0,"sequence_number":53} + data: {"type":"response.output_text.delta","content_index":0,"delta":" in","item_id":"msg_027ec5e155f266ec016a3c126ae79c819192cac59929b168ad","logprobs":[],"obfuscation":"wCmJiCUjMJCrh","output_index":1,"sequence_number":151} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" more","item_id":"msg_0f5967458d374a400169b3198e0a188192b4ea23b03f3a9c9c","logprobs":[],"obfuscation":"u7qG8BHDQP9","output_index":0,"sequence_number":54} + data: {"type":"response.output_text.delta","content_index":0,"delta":" air","item_id":"msg_027ec5e155f266ec016a3c126ae79c819192cac59929b168ad","logprobs":[],"obfuscation":"rbu5peyhMMSF","output_index":1,"sequence_number":152} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" details","item_id":"msg_0f5967458d374a400169b3198e0a188192b4ea23b03f3a9c9c","logprobs":[],"obfuscation":"G08bJXRy","output_index":0,"sequence_number":55} + data: {"type":"response.output_text.delta","content_index":0,"delta":"-","item_id":"msg_027ec5e155f266ec016a3c126ae79c819192cac59929b168ad","logprobs":[],"obfuscation":"4fFoVCWERhbuspx","output_index":1,"sequence_number":153} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":"—","item_id":"msg_0f5967458d374a400169b3198e0a188192b4ea23b03f3a9c9c","logprobs":[],"obfuscation":"robkwdicftaRgGx","output_index":0,"sequence_number":56} + data: {"type":"response.output_text.delta","content_index":0,"delta":"condition","item_id":"msg_027ec5e155f266ec016a3c126ae79c819192cac59929b168ad","logprobs":[],"obfuscation":"VsJRaSg","output_index":1,"sequence_number":154} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":"like","item_id":"msg_0f5967458d374a400169b3198e0a188192b4ea23b03f3a9c9c","logprobs":[],"obfuscation":"wCIPLRkJbK2h","output_index":0,"sequence_number":57} + data: {"type":"response.output_text.delta","content_index":0,"delta":"ed","item_id":"msg_027ec5e155f266ec016a3c126ae79c819192cac59929b168ad","logprobs":[],"obfuscation":"AfHMUyDUA42iSL","output_index":1,"sequence_number":155} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" humidity","item_id":"msg_0f5967458d374a400169b3198e0a188192b4ea23b03f3a9c9c","logprobs":[],"obfuscation":"4YPc5bD","output_index":0,"sequence_number":58} + data: {"type":"response.output_text.delta","content_index":0,"delta":" or","item_id":"msg_027ec5e155f266ec016a3c126ae79c819192cac59929b168ad","logprobs":[],"obfuscation":"xfH0V6mvXOGe5","output_index":1,"sequence_number":156} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":",","item_id":"msg_0f5967458d374a400169b3198e0a188192b4ea23b03f3a9c9c","logprobs":[],"obfuscation":"Dt7iL7ey31cNvaL","output_index":0,"sequence_number":59} + data: {"type":"response.output_text.delta","content_index":0,"delta":" shaded","item_id":"msg_027ec5e155f266ec016a3c126ae79c819192cac59929b168ad","logprobs":[],"obfuscation":"jQQ41kQ6P","output_index":1,"sequence_number":157} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" wind","item_id":"msg_0f5967458d374a400169b3198e0a188192b4ea23b03f3a9c9c","logprobs":[],"obfuscation":"n5oiaCKrLUE","output_index":0,"sequence_number":60} + data: {"type":"response.output_text.delta","content_index":0,"delta":" areas","item_id":"msg_027ec5e155f266ec016a3c126ae79c819192cac59929b168ad","logprobs":[],"obfuscation":"NaU8bu1Y3Q","output_index":1,"sequence_number":158} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" conditions","item_id":"msg_0f5967458d374a400169b3198e0a188192b4ea23b03f3a9c9c","logprobs":[],"obfuscation":"dWIu1","output_index":0,"sequence_number":61} + data: {"type":"response.output_text.delta","content_index":0,"delta":" \n\n","item_id":"msg_027ec5e155f266ec016a3c126ae79c819192cac59929b168ad","logprobs":[],"obfuscation":"Wj21XCRy8FmE","output_index":1,"sequence_number":159} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":",","item_id":"msg_0f5967458d374a400169b3198e0a188192b4ea23b03f3a9c9c","logprobs":[],"obfuscation":"EMbPz5kuNHPLP6L","output_index":0,"sequence_number":62} + data: {"type":"response.output_text.delta","content_index":0,"delta":"Stay","item_id":"msg_027ec5e155f266ec016a3c126ae79c819192cac59929b168ad","logprobs":[],"obfuscation":"NzxVwrtg8Tue","output_index":1,"sequence_number":160} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" or","item_id":"msg_0f5967458d374a400169b3198e0a188192b4ea23b03f3a9c9c","logprobs":[],"obfuscation":"mnK49w7Ej1698","output_index":0,"sequence_number":63} + data: {"type":"response.output_text.delta","content_index":0,"delta":" cool","item_id":"msg_027ec5e155f266ec016a3c126ae79c819192cac59929b168ad","logprobs":[],"obfuscation":"dDbBKzMVt3F","output_index":1,"sequence_number":161} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" a","item_id":"msg_0f5967458d374a400169b3198e0a188192b4ea23b03f3a9c9c","logprobs":[],"obfuscation":"icxFx5GViv6z51","output_index":0,"sequence_number":64} + data: {"type":"response.output_text.delta","content_index":0,"delta":" and","item_id":"msg_027ec5e155f266ec016a3c126ae79c819192cac59929b168ad","logprobs":[],"obfuscation":"NibSaJhK7rjQ","output_index":1,"sequence_number":162} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" forecast","item_id":"msg_0f5967458d374a400169b3198e0a188192b4ea23b03f3a9c9c","logprobs":[],"obfuscation":"eOwSpec","output_index":0,"sequence_number":65} + data: {"type":"response.output_text.delta","content_index":0,"delta":" safe","item_id":"msg_027ec5e155f266ec016a3c126ae79c819192cac59929b168ad","logprobs":[],"obfuscation":"ZRs5TsIgc70","output_index":1,"sequence_number":163} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":"!","item_id":"msg_0f5967458d374a400169b3198e0a188192b4ea23b03f3a9c9c","logprobs":[],"obfuscation":"PTKmmbXwRG7zDm7","output_index":0,"sequence_number":66} + data: {"type":"response.output_text.delta","content_index":0,"delta":"!","item_id":"msg_027ec5e155f266ec016a3c126ae79c819192cac59929b168ad","logprobs":[],"obfuscation":"eyVPGAZybddHkQ5","output_index":1,"sequence_number":164} event: response.output_text.done - data: {"type":"response.output_text.done","content_index":0,"item_id":"msg_0f5967458d374a400169b3198e0a188192b4ea23b03f3a9c9c","logprobs":[],"output_index":0,"sequence_number":67,"text":"The current temperature in Florence, Italy is 40°C. It's quite hot, so if you’re heading outdoors, consider staying hydrated, wearing light, breathable clothing, and seeking shade or air-conditioned spaces when possible. Let me know if you’d like more details—like humidity, wind conditions, or a forecast!"} + data: {"type":"response.output_text.done","content_index":0,"item_id":"msg_027ec5e155f266ec016a3c126ae79c819192cac59929b168ad","logprobs":[],"output_index":1,"sequence_number":165,"text":"The current temperature in Florence, Italy is 40 °C — it’s very hot. If you’re heading outdoors, make sure to:\n\n• Stay hydrated \n• Wear light, breathable clothing \n• Avoid extended sun exposure during peak afternoon hours \n• Take breaks in air-conditioned or shaded areas \n\nStay cool and safe!"} event: response.content_part.done - data: {"type":"response.content_part.done","content_index":0,"item_id":"msg_0f5967458d374a400169b3198e0a188192b4ea23b03f3a9c9c","output_index":0,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":"The current temperature in Florence, Italy is 40°C. It's quite hot, so if you’re heading outdoors, consider staying hydrated, wearing light, breathable clothing, and seeking shade or air-conditioned spaces when possible. Let me know if you’d like more details—like humidity, wind conditions, or a forecast!"},"sequence_number":68} + data: {"type":"response.content_part.done","content_index":0,"item_id":"msg_027ec5e155f266ec016a3c126ae79c819192cac59929b168ad","output_index":1,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":"The current temperature in Florence, Italy is 40 °C — it’s very hot. If you’re heading outdoors, make sure to:\n\n• Stay hydrated \n• Wear light, breathable clothing \n• Avoid extended sun exposure during peak afternoon hours \n• Take breaks in air-conditioned or shaded areas \n\nStay cool and safe!"},"sequence_number":166} event: response.output_item.done - data: {"type":"response.output_item.done","item":{"id":"msg_0f5967458d374a400169b3198e0a188192b4ea23b03f3a9c9c","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"The current temperature in Florence, Italy is 40°C. It's quite hot, so if you’re heading outdoors, consider staying hydrated, wearing light, breathable clothing, and seeking shade or air-conditioned spaces when possible. Let me know if you’d like more details—like humidity, wind conditions, or a forecast!"}],"role":"assistant"},"output_index":0,"sequence_number":69} + data: {"type":"response.output_item.done","item":{"id":"msg_027ec5e155f266ec016a3c126ae79c819192cac59929b168ad","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"The current temperature in Florence, Italy is 40 °C — it’s very hot. If you’re heading outdoors, make sure to:\n\n• Stay hydrated \n• Wear light, breathable clothing \n• Avoid extended sun exposure during peak afternoon hours \n• Take breaks in air-conditioned or shaded areas \n\nStay cool and safe!"}],"role":"assistant"},"output_index":1,"sequence_number":167} event: response.completed - data: {"type":"response.completed","response":{"id":"resp_0f5967458d374a400169b3198d90008192ab373708b985eeb4","object":"response","created_at":1773345165,"status":"completed","background":false,"completed_at":1773345166,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":null,"max_tool_calls":null,"model":"o4-mini-2025-04-16","output":[{"id":"msg_0f5967458d374a400169b3198e0a188192b4ea23b03f3a9c9c","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"The current temperature in Florence, Italy is 40°C. It's quite hot, so if you’re heading outdoors, consider staying hydrated, wearing light, breathable clothing, and seeking shade or air-conditioned spaces when possible. Let me know if you’d like more details—like humidity, wind conditions, or a forecast!"}],"role":"assistant"}],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":"high","summary":"detailed"},"safety_identifier":null,"service_tier":"default","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":{"input_tokens":96,"input_tokens_details":{"cached_tokens":0},"output_tokens":67,"output_tokens_details":{"reasoning_tokens":0},"total_tokens":163},"user":null,"metadata":{}},"sequence_number":70} + data: {"type":"response.completed","response":{"id":"resp_027ec5e155f266ec016a3c1266a9048191bfb7df1a95ba9ad7","object":"response","created_at":1782321766,"status":"completed","background":false,"completed_at":1782321771,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":null,"max_tool_calls":null,"model":"o4-mini-2025-04-16","moderation":null,"output":[{"id":"rs_027ec5e155f266ec016a3c12675f308191aa4cbc320785b520","type":"reasoning","content":[],"encrypted_content":"gAAAAABqPBJrrojORnC9bACcd8uOOaAEpXfB0pmxd9ECaeJXExO-J_SHGk2IUfTRMrcauXSZk4U4CXvc0Fk7xx-X7GBPxZIWeFXAZ2wknDJvGBlryeLoz-qOAkMGtXXHQTe5SXTMJ33J1b5s8GWnt2kd1cXAy0nkUvchkaBNEowE3cCYX-V2-IGfJYgMyWQXzMYgpy64Mdi26Ktvu_9MtQSGXKdeRrEh2p9LvDW0YyD4ay7pJfwAbxnt-IVfR4t9sHyDv5t84vUhBNR-v2Tnmb5hQjBEpCOl-WeCexBTfYjI7saqO07HaJJfXkaTt1H13aaiPuIfhRdWMB5AiyolElJOAcUkN5DbHyXaw5AIrtIGJXhP_tOPsGZ8M096ZF1ns1efo2qVXo9mcxhsNV68NV2SzVJBLRnO7aZ8Ps73hnSUPORCdubnpvp6WRaT16fcozpdKqiuEu5W5XG70ZEhFEY2qKnqOF4aJEiK4coM76eIW4WOKI1Xl8NQYv8x_wFpgvLStdRcmlfjLxtfdhK9DBv5IhwVHZ4D8CgiqYdiv3XeSgR0Iv2pLfBs4zVzJ6JDGw199dw6yReczi81OP14a0xiP6QXfzlL_nRXTRZu_VFmqa9YWpvFYY1BvcCYPaRX5gYXHCPU4-1D60ETQQJERCoQ5emjr5BRb4tZRjiW7-qiVVGNEq7Zmly5MYMdQuW-dOwHqfhs4bM07DB4LxQU2GIPNQnaSrN8eGKUwLfBnA9NQ7qB-rJWIzvkzcwCLVQZ_yN38kQOeloHNahKwNSy0mG16APlnkpevyVE45KlMAD6dJ6gdLWhjNn1VMuMOC68iSICqT6CZtpLKckwQGhcPk3fWHf0GfNr-QcERVytS8g_D179agJ-E-Z4yp8cyLyQc-kbvcpQpN0vGYPOmOuBOr9tIZxo_PUhJmZ-xLBABC-9dO4hjfk93XmnXUkpytV7RY11XXlnZ0aznzLKFA9bJodb-IRNFWccPruPffE1nn4SSOk4rjHnEMVRBxGtnoMwemZmFS5SQikraDa63u_ZwmYwgjyE0R0i8TNYGbxzX0kHpWOdhuRvptjM-rPMvbQxXhZ5Ekzr3Usv4iV7mnOiIhb7exsc_UOeLWbfC7L6LlD8RRIOR8spjd8A2NpQmLedjF6LLE4V6KRet8GdVFSf2qIlq4WJVtsXK4Unkj4FrMPBJ-98PU4frJTW3oFULL6qOCpCi4KpLmz4fis7t5BH-gEqS-zat_QVGOpzvFlgQCHBAQTCtaeelIqo4cN2YBrKPeuRNd1zRjl_iNtMvvxy4s5UGM-_-9MRoYltImHiQvtG90pHVBU0oDHNMF8NBUA1ToFVqTrsSh2W4lRCXvVi5todiCqNDbTQrLA4iJWFeZ_E--l8kEZ5mWtCPz02ks0nZFlJOY5Wj7jyAU8CHZ8yyUuQ5obyhiAtsptZBfCCYdqd7Sz2dj_MAVZUHIZ1M_UUAo9Y4u3GvphzWtUzXHQwHTj2fUTPW5G7RKIuruOk0pZ9jUvfDIxidt6CKxFcMKYik-rnmv_wHpzdAmZEAL23g_zupdpIaXcJx8ZqVBoxi1wy1DYJjZDZZlk2bdN7aNJ45H2tjKA2FRNximRDzNIKxEzXm6M-80eiqeglcbulPd3f4J3UfTy-5wKEjXcY16Qpxb1I8tKtRsIE","summary":[{"type":"summary_text","text":"**Summarizing Florence's weather**\n\nThe user asked about the weather in Florence, Italy, and I got a return of 40°C. This suggests it's blazing hot! Even though the information seems limited, I’ll interpret that as the current temperature. I’ll frame my response like: “It’s currently 40°C in Florence, Italy, which is extremely hot.” It makes sense to encourage the user to stay hydrated and take necessary precautions. I'll put that all together in a clear response."}]},{"id":"msg_027ec5e155f266ec016a3c126ae79c819192cac59929b168ad","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"The current temperature in Florence, Italy is 40 °C — it’s very hot. If you’re heading outdoors, make sure to:\n\n• Stay hydrated \n• Wear light, breathable clothing \n• Avoid extended sun exposure during peak afternoon hours \n• Take breaks in air-conditioned or shaded areas \n\nStay cool and safe!"}],"role":"assistant"}],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":"current_turn","effort":"high","summary":"detailed"},"safety_identifier":null,"service_tier":"default","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"function","description":"Get weather information for a location","name":"weather","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"strict":false}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":{"input_tokens":89,"input_tokens_details":{"cached_tokens":0},"output_tokens":196,"output_tokens_details":{"reasoning_tokens":64},"total_tokens":285},"user":null,"metadata":{}},"sequence_number":168} headers: Content-Type: - text/event-stream; charset=utf-8 status: 200 OK code: 200 - duration: 284.378709ms + duration: 299.982291ms diff --git a/providertests/testdata/TestOpenAIResponsesWithSummaryThinking/openai-o4-mini/thinking.yaml b/providertests/testdata/TestOpenAIResponsesWithSummaryThinking/openai-o4-mini/thinking.yaml index 00eba4196..39a8d082e 100644 --- a/providertests/testdata/TestOpenAIResponsesWithSummaryThinking/openai-o4-mini/thinking.yaml +++ b/providertests/testdata/TestOpenAIResponsesWithSummaryThinking/openai-o4-mini/thinking.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://api.openai.com/v1/responses method: POST response: @@ -26,15 +26,15 @@ interactions: uncompressed: true body: |- { - "id": "resp_07143e0d7cf2d4a90169b3198740e48195bd0ad4784a508ade", + "id": "resp_06b7826bd379fde8016a3c125cfdb481a39b33c8c4426e10d1", "object": "response", - "created_at": 1773345159, + "created_at": 1782321757, "status": "completed", "background": false, "billing": { "payer": "developer" }, - "completed_at": 1773345161, + "completed_at": 1782321758, "error": null, "frequency_penalty": 0.0, "incomplete_details": null, @@ -42,19 +42,21 @@ interactions: "max_output_tokens": null, "max_tool_calls": null, "model": "o4-mini-2025-04-16", + "moderation": null, "output": [ { - "id": "rs_07143e0d7cf2d4a90169b319885cb88195a1bb7a952052db4d", + "id": "rs_06b7826bd379fde8016a3c125dce3081a39b07f4dc0689501e", "type": "reasoning", - "encrypted_content": "gAAAAABpsxmJpUPkUo9BjVWMoB5IqOc2z9YhXBk9pRPu4S82H045OpdoDwncDJLq9E2oM9wg0lxTAC8V6qS7iTVcsO4UEgnN9jf08KJ1wSkb24kZdqNdmH3t_DehH6IEFsu5SkcnVbS9YgUA8dzt72y3W3IwtmbkVTCG-LEs4feMXasSu8WMx0KHtrX6eMc-Q3yKeoJab5b3YHb7Qu2mRjH5MSOHq2QzUV2LK5FRM9jnEkLqDf3WmdhgsR66d05XBREni-DY8-xn8LgvoEJERdtdeVIUALW2mKVVfrNO9NuA91-J6rpe4beppxwFxocvcotju6CZ3ommhjgRuaqQ7wu7TlyiJLCPlR-QjO4warTnLHWYTg2tMCNlxFOrL9nrd5ee1DxjcCdLrgDuvOFg69J4ySm3ToxIe48x8GyX9-Wp5OJPV8vOj8x2jeoR8wdzO7r-FKt5hxkTPsfqxHJ0_R3LPW5PkvvRjpx7LNgKnegVOoqCmvwrkKAje1pOimebBWc0-V2LqC4OWFNGH8RZ6Kobc91aQfWya1PjoKe10Ou8S5IgwJBNnZEtZoXzYpMeJi22awSPiZW4kGItJYLm3RufuuZcfLPdRfrRa4wJDo_Tq4FadTcZxgsM6q5vqIlRNbJ8pGm4vumUljmpI_ApG3275lPq5lknYbZCR59OMsI_nPx2TR6syRxqxbc_g1szaLSUNfUnwtvel6jIVaRH8Rq4USszB_P8Ksd28RCUVGNiDrAJz3AYZq7OSXsoKFJsCoia2qY2Ck5w8xDq1T1qp_wmADLqbfzLjqpdH54gDF5NUIphiWj6lPZG6w_xdoEKdam0whGz1z0SL3_eXsy_UDPV89pv8RUrlBMAogUvDirUAhNXzMHQg_XEj6TpxBE9JSiaHObZzX62GIjLCP162Bj1f0KbHnnsOcLtKFeKNoJU0qaqihpA2uNHsGCi_i2MIvkk_WKQyfJfMo_Jysv5s7A0nITsyZod9imwNEwzXeTWffdUxQATJkuYeAZYVwF6iQ4obxWj4gsIQjjWeMXHAWHewQMWYMk0aaL8iqC8_rOQooAfU3tvyDdpmIJ-rNuoL6DPdCgp2974VCGkUzAvatFQBs5Z_IcFJzv1YhDwuojmk3H4j0JruDCzfELVAAZJQpfc_UZcpN05bFGNy9u0xBvbjqXjn3sIjC95RMwV0oGil8oDkAGrVOCtDg2_sag7gysWX8p42DpLO3BrErOhv2prFh15le2Q6nyNT29d1u6KGRMttA56VQtlhto5OxSLdrC6owHlIDnEA8A4NG7ba9XLTn3hLVFqiDhwCCpEo01nxqF6hJ2SqXPxAxkLnPcBXNIWdeIKrPqWl2fGITO5UTXwCmyg82hGoWb5khd754FmQj4ywnW24h96QADS01RXQ3J3w2oOGwuUjx9BvFPsvtVS6kJXI2izzA==", + "content": [], + "encrypted_content": "gAAAAABqPBJeFhsPCjOVtLmFf9nqhrg3Q1346dfxKYy3Vws8VXbV3OGvpwoWg4Wshy_IoQ8jPB1S15BsaAE_veYu-XIN39owL-gxMBOEOgD5StVx9sDxgIEuWJVK8QJM2HgzTWZrAb-ZO_Yo3_4pY4MNaaSgAHU3IWEBw-xIm-iIJgOd6c57UO9OnTQUORRBKwpTHLhoni8sahWj_gsOpvBE4-dlYuqZuRxyd7yp7-PdA3iCA3cO7iU2eLuiA38FhclKvrBdAllD5SqxMMFv1BMT1TqeLJwemm9rz6J4O6rEYqi6zEpXTbDRV0d5sbFLZDm4nluZ7yjyk0znAf4oNcu3c3g19x0vYu1DAfWVTCVvhG5gXdmTaWuSabtWl8UvQ7aXKefX9QUdZxTLIFF-4kgJBaYHqZQLc3tEX3-4aZRG49BxikwU6LNRdzVgupWJqRnNfL82d2lJulBo4HaaZEIE2nyVmv6aGulRXEmpW4atQjRPj435LumsjOmscLE4WSl5Lhri8bGXKw5yb6FOCWFingPQxFqZbTLWL6wAqXklMlrxISKkkSH7bBOccP4SZizhbSgWxqWYSTk3AQTRbLSPmdjIIjVEqI-usaRqcjeQnKeuTmqdcmyX8i4IKeeD2PYGxda4GzduZwFJ9l19RBaT-zfXjoYmiba79AOsivYysqIKXJmqJDKj2hhir0-gQiYq0PYHJUkV8JUfbVOtn9GTqQ_4ZnbqdBgsDbN78v4zSsf0n27AtqY7rW8Buqz5aZKbI3yKqN_v9ytKP--lcIzehWcGkz_2isWj0E3eTejkky49ZqopuDOnv0nQDjLCgs-ghNRnIhz8XPCvBI_M37Old15UGGbTyzpB47wBTSLSjUy_OHroGmYTAltpeVUvjrjey6waUrI32Tq04wTiNjO1cJ6i3CR6un6Amza2WIgO0Du9elz0lanohG2WAmbVSftJIiZ1VMbJGjWyIHo3yciqlEonIWKaGzyu42vS6VnfqdaS2npoTN3TrvcTEfo7ljYCC474mo8-tYr14UUgl6wW4tBA5Ixc7psQCaAB0XQfH7tEDtd6OKvFD6I8BQXXQFxIwiZXpn12bq4c3aVxF3fSHXuo9_vTb2FzpoCF3-GcD1OOnHU_U2VgxwN9mOxEmcHvXtkZZT7G5LK9BTWZpOb_vi7rUAGfD8TDW5td6dSqAiSIhQi0_ijyzW5HO5dWDCBQbd_X2P8Gb_Z_3zMmYUyY2utEoX0NjWu058esLQm2UAhoHap9qgefh1GuNPT55qRh8odkJ9SMgkgttHjhMjGkPKDhhq5zndVszAYtjY_NJlYEoNLCtbm6u8zOyq8qUQJkc2DoftoNyhzFX0XPwjv_OQ8dS524PA==", "summary": [] }, { - "id": "fc_07143e0d7cf2d4a90169b319895df48195bcdc573701298c28", + "id": "fc_06b7826bd379fde8016a3c125ec1d881a385bb93f77693343d", "type": "function_call", "status": "completed", "arguments": "{\"location\":\"Florence, Italy\"}", - "call_id": "call_ZgWM9rbt3Yxv1cu7zAUUqGID", + "call_id": "call_eoYbwZiQUHtJHV4AFsy3T5iq", "name": "weather" } ], @@ -62,8 +64,9 @@ interactions: "presence_penalty": 0.0, "previous_response_id": null, "prompt_cache_key": null, - "prompt_cache_retention": null, + "prompt_cache_retention": "in_memory", "reasoning": { + "context": "current_turn", "effort": "high", "summary": "detailed" }, @@ -106,11 +109,11 @@ interactions: "input_tokens_details": { "cached_tokens": 0 }, - "output_tokens": 120, + "output_tokens": 93, "output_tokens_details": { "reasoning_tokens": 64 }, - "total_tokens": 180 + "total_tokens": 153 }, "user": null, "metadata": {} @@ -120,22 +123,22 @@ interactions: - application/json status: 200 OK code: 200 - duration: 2.594735541s + duration: 2.083992667s - id: 1 request: proto: HTTP/1.1 proto_major: 1 proto_minor: 1 - content_length: 788 + content_length: 776 host: "" - body: '{"store":false,"include":["reasoning.encrypted_content"],"input":[{"content":"You are a helpful assistant","role":"developer"},{"content":[{"text":"What''s the weather in Florence, Italy?","type":"input_text"}],"role":"user"},{"arguments":"\"{\\\"location\\\":\\\"Florence, Italy\\\"}\"","call_id":"call_ZgWM9rbt3Yxv1cu7zAUUqGID","name":"weather","type":"function_call"},{"call_id":"call_ZgWM9rbt3Yxv1cu7zAUUqGID","output":"40 C","type":"function_call_output"}],"model":"o4-mini","reasoning":{"effort":"high","summary":"auto"},"tool_choice":"auto","tools":[{"strict":false,"parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"name":"weather","description":"Get weather information for a location","type":"function"}]}' + body: '{"store":false,"include":["reasoning.encrypted_content"],"input":[{"content":"You are a helpful assistant","role":"developer"},{"content":[{"text":"What''s the weather in Florence, Italy?","type":"input_text"}],"role":"user"},{"arguments":"{\"location\":\"Florence, Italy\"}","call_id":"call_eoYbwZiQUHtJHV4AFsy3T5iq","name":"weather","type":"function_call"},{"call_id":"call_eoYbwZiQUHtJHV4AFsy3T5iq","output":"40 C","type":"function_call_output"}],"model":"o4-mini","reasoning":{"effort":"high","summary":"auto"},"tool_choice":"auto","tools":[{"strict":false,"parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"},"name":"weather","description":"Get weather information for a location","type":"function"}]}' headers: Accept: - application/json Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.2 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://api.openai.com/v1/responses method: POST response: @@ -146,15 +149,15 @@ interactions: uncompressed: true body: |- { - "id": "resp_07143e0d7cf2d4a90169b31989c5d48195846c36cab6292c48", + "id": "resp_086f159f77042e6f016a3c125f17c0819fbb8c6f121a7724de", "object": "response", - "created_at": 1773345161, + "created_at": 1782321759, "status": "completed", "background": false, "billing": { "payer": "developer" }, - "completed_at": 1773345162, + "completed_at": 1782321763, "error": null, "frequency_penalty": 0.0, "incomplete_details": null, @@ -162,9 +165,22 @@ interactions: "max_output_tokens": null, "max_tool_calls": null, "model": "o4-mini-2025-04-16", + "moderation": null, "output": [ { - "id": "msg_07143e0d7cf2d4a90169b3198a14908195ba86b07ab2eaeac0", + "id": "rs_086f159f77042e6f016a3c125f9628819faaac9bb3c4683854", + "type": "reasoning", + "content": [], + "encrypted_content": "gAAAAABqPBJjj8uFPiiTcWITHYoG0LPg5rA8hOck2bLawNDuPCW9Ggxa_ctupFxdSQHuEq-pN2Kijnfek4ITSsfkPdmUQdvsOrUwq6GLYTl3DlQ5QAebi_68PmwwdS3yrQ7ASqDdCx2WrzVz8J1XrwE9E1NIBnRwMpdbAXqKNYROcwsWrH2p0i-9r1CHo9d1miXyZKawVdfx9dgrVF0jhI_NkyCrFJyFEkQOb5K3fhpTeF0SIKRPR2p16rjp60NSXEcyLmUT4y6Do3M90qmtuXlTc80n57KOzVq40Bbk0wmGHVeKhKjymRrU5tJwdSXxBfwbtWKmRcj2_Zosg9veDakrPaWZwfpwTGCHcEAavLEkWYiIgdaUYww8XnzYTtjEzp1TIGtaxYaNHtHhb1TD2JvzsERz2aOULeSQQqVa7cv5SfZ9frFXfYELtgxSiJLcR6RPzoTmp3Aak-m8KiKSgtlDt29z4RyOs8_zTRcHa8FkCMdIoz-IW-dB80FeoCMBqUA_C4Jg4faCoTZIgWN8yb3tNTkjZnh2kg4hXgg963EIV_wCh1b2dy-8T3l59ntD0DQCcLUYptacCBpjHpH3l7aSsj3A8Qnl6lZPU8V9r-ywY81__3MQ8L5-5aK1Nvt9Z1cjLoeepi5qTR79veM-X4hTFqaeMQudQrSAYvLlDHq3uPmY9nZhYCW9DpvdTZyTxnKrCTg6puK6f9QBmxnC21SIUfFgdYkH9eX7IgvNpeRu0Lt80nVcnrrv6i1oMw2SI1hLwKiUZ2VkFHf3EWeJNVbCeKUMuQIIjYxYPa-w7rrk-Kq5qXlubCcmDa3lTV7kiusGcqsgr1wfcudTHsObOil_wM3WIlEnU-9ekiv1K191ITwVXSAdjM6I-U2-CB5uWB-fcIVPXAoqLI1kAAxIPRvlpAfA69yuUFlrJX9UxEK2eB7spsvDJ7ldGVqBKnlOzxcWba3l3bSWE5ktafktX_hNAIaBzKmVYDjxg28x2iIJJ7LnBVBe3JiMLyp-_2q7P07aOpT4dQtBZTo8VZsM2CIFQMA_31HMJokMigouzuUA6Q7cY4DTE7xHaTYv4T1SO6AzqbP05WlA2fqJ50dkgfAR_XHv1wlH8X4z8wRQdPVcfZ7OGFmbCQrG0TKyUGIhrwwDoX24gOFG69jUKkiw3ZcSs7ns1yhjStLvUT4xY-rCMp_5fuBArIJDMCaZkfXEELY_fb5a36pKtS_eQ8tmvT22FvGl7VLIIZF4FnQTumNeVCTy3V2iVAhYb36pDFrlGwLmTy5cXxC87wi35kAb5O2LZ5mXGPPHq8xw6YMuf3NIhjLfIOuHc6tOLLJMaJh1VG4xX9tEqFn8itcdNaMX_vZlSLqF9V6NpJWVQstnxy9yyoDdI0EgECD6o2BR51Y4nncI-36ezXuUGWL1eNv_xhJT-W61a11D9cnGaoLZBfnyaiyyQfe80SL6uLrDSWhnerzKDQ34o0-KxpUbqM0qAc3W3JOZ_SKz6I6DY_EZUjJj4RaI3CADqaperAz_jd69-FyJsenpPoyoaV4J5oPk-8AUJ3KJIulx0GQL5-EdKT_bqlG9xVADt2CFOrhZZmutD-7B8H02JFl3V5tcOAx5JfhntPR3Uf3Mne2UhgejN3VCqXRw7ggwqAT2AtOs6cZESjb4N0W6TrBeY0q5mCEfsSc__eDmuPBlQ3EGB7bcE3SD1bZi_JLFnTv2fUxSEhM1ihr7v_tKcRI1AjqqH3oYcBNMCCgWEpEQ_GJVz3CxZhSOg2ZwqCRmZbTZ2kdjl7S5741RIXGmfmscFsYddocTmPkcuWkWanoEf7INHoZy2Q-2cSEPA0jN9_v6rDf_qgm7ZLrXCZvpIaEkB9c1brJa35NfwKFOvP84E3Ptdwxk7Q4ZOjYOsuiP9Mgo__dlXfEOhmZjnCTeDE-0fHc6BXc-jgaVPHwPJOe7oQ==", + "summary": [ + { + "type": "summary_text", + "text": "**Summarizing weather in Florence**\n\nThe user asked about the weather in Florence, Italy, and the response shows it's currently 40\u00b0C, which is extremely hot. I should respond politely and informatively, suggesting they stay hydrated and avoid too much sun exposure. Though I only have the temperature, I can still mention it feels quite hot. So, my answer could be: \"The current temperature in Florence, Italy, is 40\u00b0C. That's very hot\u2014please stay hydrated and seek shade if you're going out!\"" + } + ] + }, + { + "id": "msg_086f159f77042e6f016a3c1263257c819f9bc983a8f9821429", "type": "message", "status": "completed", "content": [ @@ -172,7 +188,7 @@ interactions: "type": "output_text", "annotations": [], "logprobs": [], - "text": "The current temperature in Florence, Italy is 40\u00b0C." + "text": "The current temperature in Florence, Italy, is 40 \u00b0C. That\u2019s quite hot\u2014be sure to stay hydrated, wear sunscreen, and take breaks in the shade if you\u2019re outside." } ], "role": "assistant" @@ -182,8 +198,9 @@ interactions: "presence_penalty": 0.0, "previous_response_id": null, "prompt_cache_key": null, - "prompt_cache_retention": null, + "prompt_cache_retention": "in_memory", "reasoning": { + "context": "current_turn", "effort": "high", "summary": "detailed" }, @@ -222,15 +239,15 @@ interactions: "top_p": 1.0, "truncation": "disabled", "usage": { - "input_tokens": 191, + "input_tokens": 89, "input_tokens_details": { "cached_tokens": 0 }, - "output_tokens": 16, + "output_tokens": 209, "output_tokens_details": { - "reasoning_tokens": 0 + "reasoning_tokens": 128 }, - "total_tokens": 207 + "total_tokens": 298 }, "user": null, "metadata": {} @@ -240,4 +257,4 @@ interactions: - application/json status: 200 OK code: 200 - duration: 767.910625ms + duration: 5.039661s diff --git a/providertests/testdata/TestOpenAIWebSearch/generate.yaml b/providertests/testdata/TestOpenAIWebSearch/generate.yaml index 9c0ccf090..8591a4402 100644 --- a/providertests/testdata/TestOpenAIWebSearch/generate.yaml +++ b/providertests/testdata/TestOpenAIWebSearch/generate.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.3 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://api.openai.com/v1/responses method: POST response: @@ -26,15 +26,15 @@ interactions: uncompressed: true body: |- { - "id": "resp_07bce1382dabd6c50169b960ccf2d481969a4addb2d83e8781", + "id": "resp_032814a9038cfb27016a3c13acb58c8192925156b4193041ea", "object": "response", - "created_at": 1773756620, + "created_at": 1782322092, "status": "completed", "background": false, "billing": { "payer": "developer" }, - "completed_at": 1773756625, + "completed_at": 1782322099, "error": null, "frequency_penalty": 0.0, "incomplete_details": null, @@ -42,9 +42,10 @@ interactions: "max_output_tokens": 4000, "max_tool_calls": null, "model": "gpt-4.1-2025-04-14", + "moderation": null, "output": [ { - "id": "ws_07bce1382dabd6c50169b960cdd08c8196820826087ad7361b", + "id": "ws_032814a9038cfb27016a3c13ad26608192bf08bba827aa04d2", "type": "web_search_call", "status": "completed", "action": { @@ -56,7 +57,7 @@ interactions: } }, { - "id": "msg_07bce1382dabd6c50169b960cf63b881969452b2b9ab51a3a7", + "id": "msg_032814a9038cfb27016a3c13b1005481928ac017f3e5b8f7eb", "type": "message", "status": "completed", "content": [ @@ -65,28 +66,42 @@ interactions: "annotations": [ { "type": "url_citation", - "end_index": 566, - "start_index": 488, - "title": "Tokyo Third in UN Ranking of Global Megacities at 33.4 Million | Nippon.com", - "url": "https://www.nippon.com/en/japan-data/h02639/?utm_source=openai" + "end_index": 474, + "start_index": 367, + "title": "\u4f4f\u6c11\u57fa\u672c\u53f0\u5e33\u306b\u3088\u308b\u4e16\u5e2f\u3068\u4eba\u53e3 7\u5e741\u6708\u73fe\u5728|3\u6708|\u90fd\u5e81\u7dcf\u5408\u30db\u30fc\u30e0\u30da\u30fc\u30b8", + "url": "https://www.metro.tokyo.lg.jp/information/press/2025/03/2025031902?utm_source=openai" }, { "type": "url_citation", "end_index": 898, - "start_index": 807, - "title": "Demographics of Tokyo", - "url": "https://en.wikipedia.org/wiki/Demographics_of_Tokyo?utm_source=openai" + "start_index": 671, + "title": "Fact Check: The Tokyo Metropolitan Government reports an official population of 14,094,034 residents as of September 2025, encompassing the 23 special wards and Tokyo Prefecture | AIME by AInvest", + "url": "https://www.ainvest.com/aime/share/fact-check-tokyo-metropolitan-government-reports-official-population-14094034-residents-september-2025-encompassing-23-special-wards-tokyo-prefecture-54f325/?utm_source=openai" }, { "type": "url_citation", - "end_index": 1240, - "start_index": 1152, - "title": "Greater Tokyo Area", - "url": "https://en.wikipedia.org/wiki/Greater_Tokyo_Area?utm_source=openai" + "end_index": 1496, + "start_index": 1395, + "title": "Tokyo Population 2026", + "url": "https://worldpopulationreview.com/cities/japan/tokyo?utm_source=openai" + }, + { + "type": "url_citation", + "end_index": 1817, + "start_index": 1590, + "title": "Fact Check: The Tokyo Metropolitan Government reports an official population of 14,094,034 residents as of September 2025, encompassing the 23 special wards and Tokyo Prefecture | AIME by AInvest", + "url": "https://www.ainvest.com/aime/share/fact-check-tokyo-metropolitan-government-reports-official-population-14094034-residents-september-2025-encompassing-23-special-wards-tokyo-prefecture-54f325/?utm_source=openai" + }, + { + "type": "url_citation", + "end_index": 1988, + "start_index": 1881, + "title": "\u4f4f\u6c11\u57fa\u672c\u53f0\u5e33\u306b\u3088\u308b\u4e16\u5e2f\u3068\u4eba\u53e3 7\u5e741\u6708\u73fe\u5728|3\u6708|\u90fd\u5e81\u7dcf\u5408\u30db\u30fc\u30e0\u30da\u30fc\u30b8", + "url": "https://www.metro.tokyo.lg.jp/information/press/2025/03/2025031902?utm_source=openai" } ], "logprobs": [], - "text": "Here is the most current and reliable information on Tokyo\u2019s population as of early 2026, based on authoritative sources:\n\nFirst, if you're referring to Tokyo as a broader **urban agglomeration** (commonly defined by the United Nations as the metropolitan area including Tokyo and surrounding prefectures like Saitama, Chiba, and Kanagawa), the population is approximately **33.4 million** as of 2025. This makes Tokyo the **third-largest megacity** in the world behind Jakarta and Dhaka ([nippon.com](https://www.nippon.com/en/japan-data/h02639/?utm_source=openai)).\n\nIf your interest is in the **administrative population** of **Tokyo Metropolis** (which includes the 23 special wards, as well as the western Tama area and outlying islands), the estimated population is about **14.20 million** as of 2025 ([en.wikipedia.org](https://en.wikipedia.org/wiki/Demographics_of_Tokyo?utm_source=openai)).\n\nAdditionally, if someone refers to the **Greater Tokyo Area** (which includes a wider region encompassing additional prefectures beyond Tokyo Metropolis), the United Nations estimates its total population at approximately **36.95 million** as of 2026 ([en.wikipedia.org](https://en.wikipedia.org/wiki/Greater_Tokyo_Area?utm_source=openai)).\n\nTo summarize, depending on how \"Tokyo\" is defined:\n\n\u2022 Urban agglomeration (metro area including adjacent prefectures): **\u2248\u202f33.4 million** (2025) \n\u2022 Tokyo Metropolis (actual administrative area): **\u2248\u202f14.20 million** (2025) \n\u2022 Greater Tokyo Area (extensive metropolitan region): **\u2248\u202f36.95 million** (2026)\n\nLet me know which specific definition you're interested in if you'd like further details." + "text": "Here are the most reliable and up-to-date figures for Tokyo\u2019s current population, based on the latest official data:\n\n\u2022 As of **January 1, 2025**, the **Tokyo Metropolis** (equivalent to Tokyo Prefecture, including the 23 special wards, western Tama area, islands, etc.) had a population of **14,002,534** residents, according to the Basic Resident Register (\u4f4f\u6c11\u57fa\u672c\u53f0\u5e33) ([metro.tokyo.lg.jp](https://www.metro.tokyo.lg.jp/information/press/2025/03/2025031902?utm_source=openai)).\n\n\u2022 Meanwhile, the Tokyo Metropolitan Government\u2019s official \u201cPopulation of Tokyo (estimate)\u201d for **September 1, 2025** reports a slightly higher figure of **14,263,372** for the entire Metropolis ([ainvest.com](https://www.ainvest.com/aime/share/fact-check-tokyo-metropolitan-government-reports-official-population-14094034-residents-september-2025-encompassing-23-special-wards-tokyo-prefecture-54f325/?utm_source=openai)).\n\nBecause these values come from the same source (the Tokyo Metropolitan Government), the September 2025 figure is the most recent official estimate. Therefore, the current population of Tokyo Metropolis is approximately **14.26 million**.\n\nIf you're specifically interested in the population of Tokyo\u2019s central **23 special wards** (sometimes referred to as \u201ccity proper\u201d), that number is considerably lower and typically around 9.7 to 10.3 million depending on the source and estimation method ([worldpopulationreview.com](https://worldpopulationreview.com/cities/japan/tokyo?utm_source=openai)).\n\nIn summary:\n\n- Tokyo Metropolis total population (as of September 1, 2025): **14,263,372** ([ainvest.com](https://www.ainvest.com/aime/share/fact-check-tokyo-metropolitan-government-reports-official-population-14094034-residents-september-2025-encompassing-23-special-wards-tokyo-prefecture-54f325/?utm_source=openai)) \n- Verified earlier data from January 1, 2025: **14,002,534** ([metro.tokyo.lg.jp](https://www.metro.tokyo.lg.jp/information/press/2025/03/2025031902?utm_source=openai))\n\nThus, the most current and authoritative estimate is approximately **14.26 million residents**.\n\nLet me know if you\u2019d like a breakdown by wards, the greater metro area figures, or trends over time!" } ], "role": "assistant" @@ -96,8 +111,9 @@ interactions: "presence_penalty": 0.0, "previous_response_id": null, "prompt_cache_key": null, - "prompt_cache_retention": null, + "prompt_cache_retention": "in_memory", "reasoning": { + "context": null, "effort": null, "summary": null }, @@ -115,6 +131,10 @@ interactions: "tools": [ { "type": "web_search", + "return_token_budget": "default", + "search_content_types": [ + "text" + ], "search_context_size": "medium", "user_location": { "type": "approximate", @@ -129,15 +149,15 @@ interactions: "top_p": 1.0, "truncation": "disabled", "usage": { - "input_tokens": 17106, + "input_tokens": 17432, "input_tokens_details": { "cached_tokens": 0 }, - "output_tokens": 386, + "output_tokens": 438, "output_tokens_details": { "reasoning_tokens": 0 }, - "total_tokens": 17492 + "total_tokens": 17870 }, "user": null, "metadata": {} @@ -147,4 +167,4 @@ interactions: - application/json status: 200 OK code: 200 - duration: 5.104430812s + duration: 7.581892042s diff --git a/providertests/testdata/TestOpenAIWebSearch/stream.yaml b/providertests/testdata/TestOpenAIWebSearch/stream.yaml index e76a65e25..4d8f9a8e0 100644 --- a/providertests/testdata/TestOpenAIWebSearch/stream.yaml +++ b/providertests/testdata/TestOpenAIWebSearch/stream.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.12.3 (https://charm.land/fantasy) + - Charm-Fantasy/0.33.1 (https://charm.land/fantasy) url: https://api.openai.com/v1/responses method: POST response: @@ -25,137 +25,89 @@ interactions: content_length: -1 body: |+ event: response.created - data: {"type":"response.created","response":{"id":"resp_0dfea6230b48ad890169b960d9319881969c27da66ed1c1378","object":"response","created_at":1773756633,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-4.1-2025-04-14","output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":null,"summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"web_search","search_context_size":"medium","user_location":{"type":"approximate","city":null,"country":"US","region":null,"timezone":null}}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":0} + data: {"type":"response.created","response":{"id":"resp_0200025d411b0585016a3c13b4018c81a3852ca4fd5be2b6a6","object":"response","created_at":1782322100,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-4.1-2025-04-14","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":null,"effort":null,"summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"web_search","return_token_budget":"default","search_content_types":["text"],"search_context_size":"medium","user_location":{"type":"approximate","city":null,"country":"US","region":null,"timezone":null}}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":0} event: response.in_progress - data: {"type":"response.in_progress","response":{"id":"resp_0dfea6230b48ad890169b960d9319881969c27da66ed1c1378","object":"response","created_at":1773756633,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-4.1-2025-04-14","output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":null,"summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"web_search","search_context_size":"medium","user_location":{"type":"approximate","city":null,"country":"US","region":null,"timezone":null}}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":1} + data: {"type":"response.in_progress","response":{"id":"resp_0200025d411b0585016a3c13b4018c81a3852ca4fd5be2b6a6","object":"response","created_at":1782322100,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-4.1-2025-04-14","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":null,"effort":null,"summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"web_search","return_token_budget":"default","search_content_types":["text"],"search_context_size":"medium","user_location":{"type":"approximate","city":null,"country":"US","region":null,"timezone":null}}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":1} event: response.output_item.added - data: {"type":"response.output_item.added","item":{"id":"ws_0dfea6230b48ad890169b960da1f848196860f801e11b24193","type":"web_search_call","status":"in_progress","action":{"type":"search"}},"output_index":0,"sequence_number":2} + data: {"type":"response.output_item.added","item":{"id":"ws_0200025d411b0585016a3c13b4825c81a391999cec332e6f02","type":"web_search_call","status":"in_progress","action":{"type":"search"}},"output_index":0,"sequence_number":2} event: response.web_search_call.in_progress - data: {"type":"response.web_search_call.in_progress","item_id":"ws_0dfea6230b48ad890169b960da1f848196860f801e11b24193","output_index":0,"sequence_number":3} + data: {"type":"response.web_search_call.in_progress","item_id":"ws_0200025d411b0585016a3c13b4825c81a391999cec332e6f02","output_index":0,"sequence_number":3} event: response.web_search_call.searching - data: {"type":"response.web_search_call.searching","item_id":"ws_0dfea6230b48ad890169b960da1f848196860f801e11b24193","output_index":0,"sequence_number":4} + data: {"type":"response.web_search_call.searching","item_id":"ws_0200025d411b0585016a3c13b4825c81a391999cec332e6f02","output_index":0,"sequence_number":4} event: response.web_search_call.completed - data: {"type":"response.web_search_call.completed","item_id":"ws_0dfea6230b48ad890169b960da1f848196860f801e11b24193","output_index":0,"sequence_number":5} + data: {"type":"response.web_search_call.completed","item_id":"ws_0200025d411b0585016a3c13b4825c81a391999cec332e6f02","output_index":0,"sequence_number":5} event: response.output_item.done - data: {"type":"response.output_item.done","item":{"id":"ws_0dfea6230b48ad890169b960da1f848196860f801e11b24193","type":"web_search_call","status":"completed","action":{"type":"search","queries":["current population of Tokyo 2024"],"query":"current population of Tokyo 2024"}},"output_index":0,"sequence_number":6} + data: {"type":"response.output_item.done","item":{"id":"ws_0200025d411b0585016a3c13b4825c81a391999cec332e6f02","type":"web_search_call","status":"completed","action":{"type":"search","queries":["current population of Tokyo 2024"],"query":"current population of Tokyo 2024"}},"output_index":0,"sequence_number":6} event: response.output_item.added - data: {"type":"response.output_item.added","item":{"id":"msg_0dfea6230b48ad890169b960db86348196bfedf4dc41325e1e","type":"message","status":"in_progress","content":[],"role":"assistant"},"output_index":1,"sequence_number":7} + data: {"type":"response.output_item.added","item":{"id":"msg_0200025d411b0585016a3c13b6174481a392b9817b2c15a5b4","type":"message","status":"in_progress","content":[],"role":"assistant"},"output_index":1,"sequence_number":7} event: response.content_part.added - data: {"type":"response.content_part.added","content_index":0,"item_id":"msg_0dfea6230b48ad890169b960db86348196bfedf4dc41325e1e","output_index":1,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":""},"sequence_number":8} + data: {"type":"response.content_part.added","content_index":0,"item_id":"msg_0200025d411b0585016a3c13b6174481a392b9817b2c15a5b4","output_index":1,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":""},"sequence_number":8} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":"Here’s the most current and accurate information regarding the population","item_id":"msg_0dfea6230b48ad890169b960db86348196bfedf4dc41325e1e","logprobs":[],"obfuscation":"w0I9gLz","output_index":1,"sequence_number":9} + data: {"type":"response.output_text.delta","content_index":0,"delta":"Here is the most recent and reliable","item_id":"msg_0200025d411b0585016a3c13b6174481a392b9817b2c15a5b4","logprobs":[],"obfuscation":"DQVHD6AboERE","output_index":1,"sequence_number":9} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" of Tokyo as of March 17, ","item_id":"msg_0dfea6230b48ad890169b960db86348196bfedf4dc41325e1e","logprobs":[],"obfuscation":"OFMsBb","output_index":1,"sequence_number":10} + data: {"type":"response.output_text.delta","content_index":0,"delta":" official estimate for the population of Tokyo:\n\nAs of **May ","item_id":"msg_0200025d411b0585016a3c13b6174481a392b9817b2c15a5b4","logprobs":[],"obfuscation":"0Qc","output_index":1,"sequence_number":10} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":"2026:\n\n- For the **Tokyo metropolitan area**","item_id":"msg_0dfea6230b48ad890169b960db86348196bfedf4dc41325e1e","logprobs":[],"obfuscation":"wGWX","output_index":1,"sequence_number":11} + data: {"type":"response.output_text.delta","content_index":0,"delta":"1, 2026**, the **","item_id":"msg_0200025d411b0585016a3c13b6174481a392b9817b2c15a5b4","logprobs":[],"obfuscation":"6cNsksSFn4eHSHI","output_index":1,"sequence_number":11} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":"—also referred to as Greater Tokyo, which includes the city","item_id":"msg_0dfea6230b48ad890169b960db86348196bfedf4dc41325e1e","logprobs":[],"obfuscation":"qBRGY","output_index":1,"sequence_number":12} + data: {"type":"response.output_text.delta","content_index":0,"delta":"Tokyo Metropolitan Government** reports that the total population of","item_id":"msg_0200025d411b0585016a3c13b6174481a392b9817b2c15a5b4","logprobs":[],"obfuscation":"uUpi7XJV1fGK","output_index":1,"sequence_number":12} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" proper along with its surrounding prefectures—the United Nations estimates","item_id":"msg_0dfea6230b48ad890169b960db86348196bfedf4dc41325e1e","logprobs":[],"obfuscation":"2HV4J","output_index":1,"sequence_number":13} + data: {"type":"response.output_text.delta","content_index":0,"delta":" Tokyo (the entire prefecture) is **","item_id":"msg_0200025d411b0585016a3c13b6174481a392b9817b2c15a5b4","logprobs":[],"obfuscation":"IMtFcLkykFF8","output_index":1,"sequence_number":13} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" the 2025 population at approximately **33.4","item_id":"msg_0dfea6230b48ad890169b960db86348196bfedf4dc41325e1e","logprobs":[],"obfuscation":"J17k","output_index":1,"sequence_number":14} + data: {"type":"response.output_text.delta","content_index":0,"delta":"14,328,115** people. ","item_id":"msg_0200025d411b0585016a3c13b6174481a392b9817b2c15a5b4","logprobs":[],"obfuscation":"Wv8ISvft6Ve","output_index":1,"sequence_number":14} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" million**. This makes it the **third-largest urban","item_id":"msg_0dfea6230b48ad890169b960db86348196bfedf4dc41325e1e","logprobs":[],"obfuscation":"wFYK9go4C5VzD","output_index":1,"sequence_number":15} - - event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" agglomeration in the world**, following Jakarta and Dhaka","item_id":"msg_0dfea6230b48ad890169b960db86348196bfedf4dc41325e1e","logprobs":[],"obfuscation":"Xq5n8f","output_index":1,"sequence_number":16} - - event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":". Estimates near **33 million** are commonly cited across reputable","item_id":"msg_0dfea6230b48ad890169b960db86348196bfedf4dc41325e1e","logprobs":[],"obfuscation":"FNtzTsTaOnDlq","output_index":1,"sequence_number":17} - - event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" sources. ","item_id":"msg_0dfea6230b48ad890169b960db86348196bfedf4dc41325e1e","logprobs":[],"obfuscation":"2IKKku","output_index":1,"sequence_number":18} - - event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":"([nippon.com](https://www.nippon.com/en/japan-data/h02639/tokyo-third-in-un-ranking-of-global-megacities-at-33-4-million.html?utm_source=openai)","item_id":"msg_0dfea6230b48ad890169b960db86348196bfedf4dc41325e1e","logprobs":[],"obfuscation":"","output_index":1,"sequence_number":19} - - event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":")\n\n- However,","item_id":"msg_0dfea6230b48ad890169b960db86348196bfedf4dc41325e1e","logprobs":[],"obfuscation":"r2q","output_index":1,"sequence_number":20} - - event: response.output_text.annotation.added - data: {"type":"response.output_text.annotation.added","annotation":{"type":"url_citation","end_index":652,"start_index":507,"title":"Tokyo Third in UN Ranking of Global Megacities at 33.4 Million | Nippon.com","url":"https://www.nippon.com/en/japan-data/h02639/tokyo-third-in-un-ranking-of-global-megacities-at-33-4-million.html?utm_source=openai"},"annotation_index":0,"content_index":0,"item_id":"msg_0dfea6230b48ad890169b960db86348196bfedf4dc41325e1e","output_index":1,"sequence_number":21} - - event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" for the **Tokyo prefecture or “city proper”**","item_id":"msg_0dfea6230b48ad890169b960db86348196bfedf4dc41325e1e","logprobs":[],"obfuscation":"GW","output_index":1,"sequence_number":22} - - event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":"—the 23 special wards and other administrative areas—the estimated","item_id":"msg_0dfea6230b48ad890169b960db86348196bfedf4dc41325e1e","logprobs":[],"obfuscation":"IuWuYpBPoq4jE6","output_index":1,"sequence_number":23} - - event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" population for 2025 is **14,195","item_id":"msg_0dfea6230b48ad890169b960db86348196bfedf4dc41325e1e","logprobs":[],"obfuscation":"","output_index":1,"sequence_number":24} - - event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":",730**. ","item_id":"msg_0dfea6230b48ad890169b960db86348196bfedf4dc41325e1e","logprobs":[],"obfuscation":"68Mp8WuT","output_index":1,"sequence_number":25} - - event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":"([en.wikipedia.org](https://en.wikipedia.org/wiki/Demographics_of_Tokyo?utm_source=openai))\n\nTo clarify:\n\n- When","item_id":"msg_0dfea6230b48ad890169b960db86348196bfedf4dc41325e1e","logprobs":[],"obfuscation":"","output_index":1,"sequence_number":26} + data: {"type":"response.output_text.delta","content_index":0,"delta":"([toukei.metro.tokyo.lg.jp](https://www.toukei.metro.tokyo.lg.jp/index.htm?utm_source=openai))\n","item_id":"msg_0200025d411b0585016a3c13b6174481a392b9817b2c15a5b4","logprobs":[],"obfuscation":"T","output_index":1,"sequence_number":15} event: response.output_text.annotation.added - data: {"type":"response.output_text.annotation.added","annotation":{"type":"url_citation","end_index":907,"start_index":816,"title":"Demographics of Tokyo","url":"https://en.wikipedia.org/wiki/Demographics_of_Tokyo?utm_source=openai"},"annotation_index":1,"content_index":0,"item_id":"msg_0dfea6230b48ad890169b960db86348196bfedf4dc41325e1e","output_index":1,"sequence_number":27} - - event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" someone refers to **“Tokyo’s population,”** they may","item_id":"msg_0dfea6230b48ad890169b960db86348196bfedf4dc41325e1e","logprobs":[],"obfuscation":"LKfvzRMroEL","output_index":1,"sequence_number":28} - - event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" mean one of two things:\n ","item_id":"msg_0dfea6230b48ad890169b960db86348196bfedf4dc41325e1e","logprobs":[],"obfuscation":"eN1MP","output_index":1,"sequence_number":29} - - event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":"1. The **metropolitan area**, which is the expansive","item_id":"msg_0dfea6230b48ad890169b960db86348196bfedf4dc41325e1e","logprobs":[],"obfuscation":"F1esowqlu7GO","output_index":1,"sequence_number":30} - - event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" urban zone including suburban regions—around **33 million**","item_id":"msg_0dfea6230b48ad890169b960db86348196bfedf4dc41325e1e","logprobs":[],"obfuscation":"13js","output_index":1,"sequence_number":31} - - event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" people.\n 2. The **administrative city/p","item_id":"msg_0dfea6230b48ad890169b960db86348196bfedf4dc41325e1e","logprobs":[],"obfuscation":"uRvlwpX","output_index":1,"sequence_number":32} + data: {"type":"response.output_text.annotation.added","annotation":{"type":"url_citation","end_index":333,"start_index":239,"title":"東京都の統計","url":"https://www.toukei.metro.tokyo.lg.jp/index.htm?utm_source=openai"},"annotation_index":0,"content_index":0,"item_id":"msg_0200025d411b0585016a3c13b6174481a392b9817b2c15a5b4","output_index":1,"sequence_number":16} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":"refecture itself**—about **14.2 million**","item_id":"msg_0dfea6230b48ad890169b960db86348196bfedf4dc41325e1e","logprobs":[],"obfuscation":"orK5bC1","output_index":1,"sequence_number":33} + data: {"type":"response.output_text.delta","content_index":0,"delta":"\nThis figure is the latest available from the metropolitan government’s","item_id":"msg_0200025d411b0585016a3c13b6174481a392b9817b2c15a5b4","logprobs":[],"obfuscation":"ZRp0P4A9Q","output_index":1,"sequence_number":17} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" people.\n\nSo depending on your intended definition, both figures","item_id":"msg_0dfea6230b48ad890169b960db86348196bfedf4dc41325e1e","logprobs":[],"obfuscation":"","output_index":1,"sequence_number":34} + data: {"type":"response.output_text.delta","content_index":0,"delta":" statistical department. If you were asking about a different","item_id":"msg_0200025d411b0585016a3c13b6174481a392b9817b2c15a5b4","logprobs":[],"obfuscation":"99H","output_index":1,"sequence_number":18} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":" are accurate for 2025—just measuring different scales","item_id":"msg_0dfea6230b48ad890169b960db86348196bfedf4dc41325e1e","logprobs":[],"obfuscation":"n6NvYi494h","output_index":1,"sequence_number":35} + data: {"type":"response.output_text.delta","content_index":0,"delta":" area defined as \"Tokyo\" — such as just the ","item_id":"msg_0200025d411b0585016a3c13b6174481a392b9817b2c15a5b4","logprobs":[],"obfuscation":"dRK2","output_index":1,"sequence_number":19} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":".\n\nLet me know if you’d like data on historical trends","item_id":"msg_0dfea6230b48ad890169b960db86348196bfedf4dc41325e1e","logprobs":[],"obfuscation":"a0fxr1kC00","output_index":1,"sequence_number":36} + data: {"type":"response.output_text.delta","content_index":0,"delta":"23 special wards (区部) or the","item_id":"msg_0200025d411b0585016a3c13b6174481a392b9817b2c15a5b4","logprobs":[],"obfuscation":"zzLe","output_index":1,"sequence_number":20} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":", future projections, or comparisons with other global megac","item_id":"msg_0dfea6230b48ad890169b960db86348196bfedf4dc41325e1e","logprobs":[],"obfuscation":"2Ba6","output_index":1,"sequence_number":37} + data: {"type":"response.output_text.delta","content_index":0,"delta":" broader metropolitan area — let me know, and I","item_id":"msg_0200025d411b0585016a3c13b6174481a392b9817b2c15a5b4","logprobs":[],"obfuscation":"u","output_index":1,"sequence_number":21} event: response.output_text.delta - data: {"type":"response.output_text.delta","content_index":0,"delta":"ities!","item_id":"msg_0dfea6230b48ad890169b960db86348196bfedf4dc41325e1e","logprobs":[],"obfuscation":"91BomkbK8p","output_index":1,"sequence_number":38} + data: {"type":"response.output_text.delta","content_index":0,"delta":"’d be happy to provide that breakdown as well.","item_id":"msg_0200025d411b0585016a3c13b6174481a392b9817b2c15a5b4","logprobs":[],"obfuscation":"Hk","output_index":1,"sequence_number":22} event: response.output_text.done - data: {"type":"response.output_text.done","content_index":0,"item_id":"msg_0dfea6230b48ad890169b960db86348196bfedf4dc41325e1e","logprobs":[],"output_index":1,"sequence_number":39,"text":"Here’s the most current and accurate information regarding the population of Tokyo as of March 17, 2026:\n\n- For the **Tokyo metropolitan area**—also referred to as Greater Tokyo, which includes the city proper along with its surrounding prefectures—the United Nations estimates the 2025 population at approximately **33.4 million**. This makes it the **third-largest urban agglomeration in the world**, following Jakarta and Dhaka. Estimates near **33 million** are commonly cited across reputable sources. ([nippon.com](https://www.nippon.com/en/japan-data/h02639/tokyo-third-in-un-ranking-of-global-megacities-at-33-4-million.html?utm_source=openai))\n\n- However, for the **Tokyo prefecture or “city proper”**—the 23 special wards and other administrative areas—the estimated population for 2025 is **14,195,730**. ([en.wikipedia.org](https://en.wikipedia.org/wiki/Demographics_of_Tokyo?utm_source=openai))\n\nTo clarify:\n\n- When someone refers to **“Tokyo’s population,”** they may mean one of two things:\n 1. The **metropolitan area**, which is the expansive urban zone including suburban regions—around **33 million** people.\n 2. The **administrative city/prefecture itself**—about **14.2 million** people.\n\nSo depending on your intended definition, both figures are accurate for 2025—just measuring different scales.\n\nLet me know if you’d like data on historical trends, future projections, or comparisons with other global megacities!"} + data: {"type":"response.output_text.done","content_index":0,"item_id":"msg_0200025d411b0585016a3c13b6174481a392b9817b2c15a5b4","logprobs":[],"output_index":1,"sequence_number":23,"text":"Here is the most recent and reliable official estimate for the population of Tokyo:\n\nAs of **May 1, 2026**, the **Tokyo Metropolitan Government** reports that the total population of Tokyo (the entire prefecture) is **14,328,115** people. ([toukei.metro.tokyo.lg.jp](https://www.toukei.metro.tokyo.lg.jp/index.htm?utm_source=openai))\n\nThis figure is the latest available from the metropolitan government’s statistical department. If you were asking about a different area defined as \"Tokyo\" — such as just the 23 special wards (区部) or the broader metropolitan area — let me know, and I’d be happy to provide that breakdown as well."} event: response.content_part.done - data: {"type":"response.content_part.done","content_index":0,"item_id":"msg_0dfea6230b48ad890169b960db86348196bfedf4dc41325e1e","output_index":1,"part":{"type":"output_text","annotations":[{"type":"url_citation","end_index":652,"start_index":507,"title":"Tokyo Third in UN Ranking of Global Megacities at 33.4 Million | Nippon.com","url":"https://www.nippon.com/en/japan-data/h02639/tokyo-third-in-un-ranking-of-global-megacities-at-33-4-million.html?utm_source=openai"},{"type":"url_citation","end_index":907,"start_index":816,"title":"Demographics of Tokyo","url":"https://en.wikipedia.org/wiki/Demographics_of_Tokyo?utm_source=openai"}],"logprobs":[],"text":"Here’s the most current and accurate information regarding the population of Tokyo as of March 17, 2026:\n\n- For the **Tokyo metropolitan area**—also referred to as Greater Tokyo, which includes the city proper along with its surrounding prefectures—the United Nations estimates the 2025 population at approximately **33.4 million**. This makes it the **third-largest urban agglomeration in the world**, following Jakarta and Dhaka. Estimates near **33 million** are commonly cited across reputable sources. ([nippon.com](https://www.nippon.com/en/japan-data/h02639/tokyo-third-in-un-ranking-of-global-megacities-at-33-4-million.html?utm_source=openai))\n\n- However, for the **Tokyo prefecture or “city proper”**—the 23 special wards and other administrative areas—the estimated population for 2025 is **14,195,730**. ([en.wikipedia.org](https://en.wikipedia.org/wiki/Demographics_of_Tokyo?utm_source=openai))\n\nTo clarify:\n\n- When someone refers to **“Tokyo’s population,”** they may mean one of two things:\n 1. The **metropolitan area**, which is the expansive urban zone including suburban regions—around **33 million** people.\n 2. The **administrative city/prefecture itself**—about **14.2 million** people.\n\nSo depending on your intended definition, both figures are accurate for 2025—just measuring different scales.\n\nLet me know if you’d like data on historical trends, future projections, or comparisons with other global megacities!"},"sequence_number":40} + data: {"type":"response.content_part.done","content_index":0,"item_id":"msg_0200025d411b0585016a3c13b6174481a392b9817b2c15a5b4","output_index":1,"part":{"type":"output_text","annotations":[{"type":"url_citation","end_index":333,"start_index":239,"title":"東京都の統計","url":"https://www.toukei.metro.tokyo.lg.jp/index.htm?utm_source=openai"}],"logprobs":[],"text":"Here is the most recent and reliable official estimate for the population of Tokyo:\n\nAs of **May 1, 2026**, the **Tokyo Metropolitan Government** reports that the total population of Tokyo (the entire prefecture) is **14,328,115** people. ([toukei.metro.tokyo.lg.jp](https://www.toukei.metro.tokyo.lg.jp/index.htm?utm_source=openai))\n\nThis figure is the latest available from the metropolitan government’s statistical department. If you were asking about a different area defined as \"Tokyo\" — such as just the 23 special wards (区部) or the broader metropolitan area — let me know, and I’d be happy to provide that breakdown as well."},"sequence_number":24} event: response.output_item.done - data: {"type":"response.output_item.done","item":{"id":"msg_0dfea6230b48ad890169b960db86348196bfedf4dc41325e1e","type":"message","status":"completed","content":[{"type":"output_text","annotations":[{"type":"url_citation","end_index":652,"start_index":507,"title":"Tokyo Third in UN Ranking of Global Megacities at 33.4 Million | Nippon.com","url":"https://www.nippon.com/en/japan-data/h02639/tokyo-third-in-un-ranking-of-global-megacities-at-33-4-million.html?utm_source=openai"},{"type":"url_citation","end_index":907,"start_index":816,"title":"Demographics of Tokyo","url":"https://en.wikipedia.org/wiki/Demographics_of_Tokyo?utm_source=openai"}],"logprobs":[],"text":"Here’s the most current and accurate information regarding the population of Tokyo as of March 17, 2026:\n\n- For the **Tokyo metropolitan area**—also referred to as Greater Tokyo, which includes the city proper along with its surrounding prefectures—the United Nations estimates the 2025 population at approximately **33.4 million**. This makes it the **third-largest urban agglomeration in the world**, following Jakarta and Dhaka. Estimates near **33 million** are commonly cited across reputable sources. ([nippon.com](https://www.nippon.com/en/japan-data/h02639/tokyo-third-in-un-ranking-of-global-megacities-at-33-4-million.html?utm_source=openai))\n\n- However, for the **Tokyo prefecture or “city proper”**—the 23 special wards and other administrative areas—the estimated population for 2025 is **14,195,730**. ([en.wikipedia.org](https://en.wikipedia.org/wiki/Demographics_of_Tokyo?utm_source=openai))\n\nTo clarify:\n\n- When someone refers to **“Tokyo’s population,”** they may mean one of two things:\n 1. The **metropolitan area**, which is the expansive urban zone including suburban regions—around **33 million** people.\n 2. The **administrative city/prefecture itself**—about **14.2 million** people.\n\nSo depending on your intended definition, both figures are accurate for 2025—just measuring different scales.\n\nLet me know if you’d like data on historical trends, future projections, or comparisons with other global megacities!"}],"role":"assistant"},"output_index":1,"sequence_number":41} + data: {"type":"response.output_item.done","item":{"id":"msg_0200025d411b0585016a3c13b6174481a392b9817b2c15a5b4","type":"message","status":"completed","content":[{"type":"output_text","annotations":[{"type":"url_citation","end_index":333,"start_index":239,"title":"東京都の統計","url":"https://www.toukei.metro.tokyo.lg.jp/index.htm?utm_source=openai"}],"logprobs":[],"text":"Here is the most recent and reliable official estimate for the population of Tokyo:\n\nAs of **May 1, 2026**, the **Tokyo Metropolitan Government** reports that the total population of Tokyo (the entire prefecture) is **14,328,115** people. ([toukei.metro.tokyo.lg.jp](https://www.toukei.metro.tokyo.lg.jp/index.htm?utm_source=openai))\n\nThis figure is the latest available from the metropolitan government’s statistical department. If you were asking about a different area defined as \"Tokyo\" — such as just the 23 special wards (区部) or the broader metropolitan area — let me know, and I’d be happy to provide that breakdown as well."}],"role":"assistant"},"output_index":1,"sequence_number":25} event: response.completed - data: {"type":"response.completed","response":{"id":"resp_0dfea6230b48ad890169b960d9319881969c27da66ed1c1378","object":"response","created_at":1773756633,"status":"completed","background":false,"completed_at":1773756637,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-4.1-2025-04-14","output":[{"id":"ws_0dfea6230b48ad890169b960da1f848196860f801e11b24193","type":"web_search_call","status":"completed","action":{"type":"search","queries":["current population of Tokyo 2024"],"query":"current population of Tokyo 2024"}},{"id":"msg_0dfea6230b48ad890169b960db86348196bfedf4dc41325e1e","type":"message","status":"completed","content":[{"type":"output_text","annotations":[{"type":"url_citation","end_index":652,"start_index":507,"title":"Tokyo Third in UN Ranking of Global Megacities at 33.4 Million | Nippon.com","url":"https://www.nippon.com/en/japan-data/h02639/tokyo-third-in-un-ranking-of-global-megacities-at-33-4-million.html?utm_source=openai"},{"type":"url_citation","end_index":907,"start_index":816,"title":"Demographics of Tokyo","url":"https://en.wikipedia.org/wiki/Demographics_of_Tokyo?utm_source=openai"}],"logprobs":[],"text":"Here’s the most current and accurate information regarding the population of Tokyo as of March 17, 2026:\n\n- For the **Tokyo metropolitan area**—also referred to as Greater Tokyo, which includes the city proper along with its surrounding prefectures—the United Nations estimates the 2025 population at approximately **33.4 million**. This makes it the **third-largest urban agglomeration in the world**, following Jakarta and Dhaka. Estimates near **33 million** are commonly cited across reputable sources. ([nippon.com](https://www.nippon.com/en/japan-data/h02639/tokyo-third-in-un-ranking-of-global-megacities-at-33-4-million.html?utm_source=openai))\n\n- However, for the **Tokyo prefecture or “city proper”**—the 23 special wards and other administrative areas—the estimated population for 2025 is **14,195,730**. ([en.wikipedia.org](https://en.wikipedia.org/wiki/Demographics_of_Tokyo?utm_source=openai))\n\nTo clarify:\n\n- When someone refers to **“Tokyo’s population,”** they may mean one of two things:\n 1. The **metropolitan area**, which is the expansive urban zone including suburban regions—around **33 million** people.\n 2. The **administrative city/prefecture itself**—about **14.2 million** people.\n\nSo depending on your intended definition, both figures are accurate for 2025—just measuring different scales.\n\nLet me know if you’d like data on historical trends, future projections, or comparisons with other global megacities!"}],"role":"assistant"}],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":null,"summary":null},"safety_identifier":null,"service_tier":"default","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"web_search","search_context_size":"medium","user_location":{"type":"approximate","city":null,"country":"US","region":null,"timezone":null}}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":{"input_tokens":16828,"input_tokens_details":{"cached_tokens":0},"output_tokens":337,"output_tokens_details":{"reasoning_tokens":0},"total_tokens":17165},"user":null,"metadata":{}},"sequence_number":42} + data: {"type":"response.completed","response":{"id":"resp_0200025d411b0585016a3c13b4018c81a3852ca4fd5be2b6a6","object":"response","created_at":1782322100,"status":"completed","background":false,"completed_at":1782322103,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":4000,"max_tool_calls":null,"model":"gpt-4.1-2025-04-14","moderation":null,"output":[{"id":"ws_0200025d411b0585016a3c13b4825c81a391999cec332e6f02","type":"web_search_call","status":"completed","action":{"type":"search","queries":["current population of Tokyo 2024"],"query":"current population of Tokyo 2024"}},{"id":"msg_0200025d411b0585016a3c13b6174481a392b9817b2c15a5b4","type":"message","status":"completed","content":[{"type":"output_text","annotations":[{"type":"url_citation","end_index":333,"start_index":239,"title":"東京都の統計","url":"https://www.toukei.metro.tokyo.lg.jp/index.htm?utm_source=openai"}],"logprobs":[],"text":"Here is the most recent and reliable official estimate for the population of Tokyo:\n\nAs of **May 1, 2026**, the **Tokyo Metropolitan Government** reports that the total population of Tokyo (the entire prefecture) is **14,328,115** people. ([toukei.metro.tokyo.lg.jp](https://www.toukei.metro.tokyo.lg.jp/index.htm?utm_source=openai))\n\nThis figure is the latest available from the metropolitan government’s statistical department. If you were asking about a different area defined as \"Tokyo\" — such as just the 23 special wards (区部) or the broader metropolitan area — let me know, and I’d be happy to provide that breakdown as well."}],"role":"assistant"}],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":null,"effort":null,"summary":null},"safety_identifier":null,"service_tier":"default","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"web_search","return_token_budget":"default","search_content_types":["text"],"search_context_size":"medium","user_location":{"type":"approximate","city":null,"country":"US","region":null,"timezone":null}}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":{"input_tokens":17407,"input_tokens_details":{"cached_tokens":0},"output_tokens":164,"output_tokens_details":{"reasoning_tokens":0},"total_tokens":17571},"user":null,"metadata":{}},"sequence_number":26} headers: Content-Type: - text/event-stream; charset=utf-8 status: 200 OK code: 200 - duration: 768.756726ms + duration: 444.511042ms From cb0b97872e8b87232a69d66319a1207d51ef0c0c Mon Sep 17 00:00:00 2001 From: William Kennedy Date: Wed, 24 Jun 2026 16:59:41 -0400 Subject: [PATCH 021/156] chore(deps): update kronk (#296) --- examples/go.mod | 64 ++++++++++++------------ examples/go.sum | 128 ++++++++++++++++++++++++------------------------ go.mod | 22 ++++----- go.sum | 44 ++++++++--------- 4 files changed, 129 insertions(+), 129 deletions(-) diff --git a/examples/go.mod b/examples/go.mod index 16e6e6710..05d0fd10f 100644 --- a/examples/go.mod +++ b/examples/go.mod @@ -24,24 +24,24 @@ require ( github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.57.0 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.57.0 // indirect github.com/ardanlabs/jinja v1.4.0 // indirect - github.com/ardanlabs/kronk v1.27.4 // indirect - github.com/aws/aws-sdk-go-v2 v1.41.12 // indirect + github.com/ardanlabs/kronk v1.28.4 // indirect + github.com/aws/aws-sdk-go-v2 v1.42.0 // indirect github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.13 // indirect - github.com/aws/aws-sdk-go-v2/config v1.32.23 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.19.22 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.28 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.28 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.28 // indirect - github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.29 // indirect + github.com/aws/aws-sdk-go-v2/config v1.32.25 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.19.24 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.29 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.29 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.29 // indirect + github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.30 // indirect github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.12 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.21 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.28 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.28 // indirect - github.com/aws/aws-sdk-go-v2/service/s3 v1.103.2 // indirect - github.com/aws/aws-sdk-go-v2/service/signin v1.1.4 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.31.2 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.36.5 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.43.2 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.22 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.29 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.29 // indirect + github.com/aws/aws-sdk-go-v2/service/s3 v1.104.0 // indirect + github.com/aws/aws-sdk-go-v2/service/signin v1.2.0 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.31.3 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.36.6 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.43.3 // indirect github.com/aws/smithy-go v1.27.2 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d // indirect @@ -49,7 +49,7 @@ require ( github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/charmbracelet/anthropic-sdk-go v0.0.0-20260223140439-63879b0b8dab // indirect github.com/charmbracelet/colorprofile v0.3.2 // indirect - github.com/charmbracelet/openai-go v0.0.0-20260319145158-d0740cc34266 // indirect + github.com/charmbracelet/openai-go v0.0.0-20260617131321-5e4b9c18c4be // indirect github.com/charmbracelet/x/ansi v0.10.2 // indirect github.com/charmbracelet/x/cellbuf v0.0.14-0.20250811133356-e0c5dbe5ea4a // indirect github.com/charmbracelet/x/exp/slice v0.0.0-20250904123553-b4e2667e5ad5 // indirect @@ -59,7 +59,7 @@ require ( github.com/ebitengine/purego v0.10.1 // indirect github.com/envoyproxy/go-control-plane/envoy v1.37.0 // indirect github.com/envoyproxy/protoc-gen-validate v1.3.3 // indirect - github.com/felixge/httpsnoop v1.0.4 // indirect + github.com/felixge/httpsnoop v1.1.0 // indirect github.com/go-jose/go-jose/v4 v4.1.4 // indirect github.com/go-json-experiment/json v0.0.0-20260601182631-00ed12fed2a6 // indirect github.com/go-logfmt/logfmt v0.6.0 // indirect @@ -70,7 +70,7 @@ require ( github.com/google/go-cmp v0.7.0 // indirect github.com/google/s2a-go v0.1.9 // indirect github.com/google/uuid v1.6.0 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.3.16 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.3.17 // indirect github.com/googleapis/gax-go/v2 v2.22.0 // indirect github.com/gorilla/websocket v1.5.3 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.29.0 // indirect @@ -78,10 +78,10 @@ require ( github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-getter v1.8.6 // indirect github.com/hashicorp/go-version v1.9.0 // indirect - github.com/hybridgroup/yzma v1.16.1 // indirect + github.com/hybridgroup/yzma v1.18.0 // indirect github.com/jupiterrider/ffi v0.7.0 // indirect github.com/kaptinlin/jsonpointer v0.4.26 // indirect - github.com/kaptinlin/jsonschema v0.8.0 // indirect + github.com/kaptinlin/jsonschema v0.9.2 // indirect github.com/klauspost/compress v1.18.6 // indirect github.com/lucasb-eyer/go-colorful v1.3.0 // indirect github.com/mattn/go-runewidth v0.0.17 // indirect @@ -91,10 +91,10 @@ require ( github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect github.com/prometheus/client_golang v1.23.2 // indirect github.com/prometheus/client_model v0.6.2 // indirect - github.com/prometheus/common v0.68.1 // indirect + github.com/prometheus/common v0.69.0 // indirect github.com/prometheus/procfs v0.20.1 // indirect github.com/rivo/uniseg v0.4.7 // indirect - github.com/spiffe/go-spiffe/v2 v2.7.0 // indirect + github.com/spiffe/go-spiffe/v2 v2.8.1 // indirect github.com/tidwall/gjson v1.18.0 // indirect github.com/tidwall/match v1.1.1 // indirect github.com/tidwall/pretty v1.2.1 // indirect @@ -114,20 +114,20 @@ require ( go.opentelemetry.io/otel/trace v1.44.0 // indirect go.opentelemetry.io/proto/otlp v1.10.0 // indirect go.yaml.in/yaml/v2 v2.4.4 // indirect - golang.org/x/crypto v0.52.0 // indirect + golang.org/x/crypto v0.53.0 // indirect golang.org/x/exp v0.0.0-20260312153236-7ab1446f8b90 // indirect - golang.org/x/image v0.41.0 // indirect - golang.org/x/net v0.55.0 // indirect + golang.org/x/image v0.43.0 // indirect + golang.org/x/net v0.56.0 // indirect golang.org/x/oauth2 v0.36.0 // indirect golang.org/x/sync v0.21.0 // indirect golang.org/x/sys v0.46.0 // indirect - golang.org/x/text v0.37.0 // indirect + golang.org/x/text v0.38.0 // indirect golang.org/x/time v0.15.0 // indirect - google.golang.org/api v0.283.0 // indirect - google.golang.org/genai v1.59.0 // indirect - google.golang.org/genproto v0.0.0-20260526163538-3dc84a4a5aaa // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20260526163538-3dc84a4a5aaa // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20260526163538-3dc84a4a5aaa // indirect + google.golang.org/api v0.286.0 // indirect + google.golang.org/genai v1.61.0 // indirect + google.golang.org/genproto v0.0.0-20260622175928-b703f567277d // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20260622175928-b703f567277d // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20260622175928-b703f567277d // indirect google.golang.org/grpc v1.81.1 // indirect google.golang.org/protobuf v1.36.11 // indirect ) diff --git a/examples/go.sum b/examples/go.sum index 87c260441..a3030562e 100644 --- a/examples/go.sum +++ b/examples/go.sum @@ -30,42 +30,42 @@ github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapp github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.57.0/go.mod h1:YqwkQPrWSC7+byyc1VlKbWLBF5JsW5IoL6xUkemYSXk= github.com/ardanlabs/jinja v1.4.0 h1:9iE0/wF4zhcws1CYZCWqJTQP8YuhC4FjycBGzCTuOFw= github.com/ardanlabs/jinja v1.4.0/go.mod h1:aXXzlJfjA+T3XNKA/YT5ZtDq2VJxt5a5siZ8cl9B35Q= -github.com/ardanlabs/kronk v1.27.4 h1:YtPAIn2m4wA5fzWXYrXcby5Q6x4vWh9YaYF7z75CFiQ= -github.com/ardanlabs/kronk v1.27.4/go.mod h1:fXpZDjYdLYXev7ynzIeG4/S3BL//Pr8EliQ2FdZ8Ocg= -github.com/aws/aws-sdk-go-v2 v1.41.12 h1:DIKX2c31ekm9RA2D9FBj1EWXx++9AdAqRw+e78Tq2Ck= -github.com/aws/aws-sdk-go-v2 v1.41.12/go.mod h1:27+ACypSLljLAEKsCYOmrjKh83vuTRkuAe9Uv/3A4bg= +github.com/ardanlabs/kronk v1.28.4 h1:dfyvJLnCmi3xgNASI4bzA9rfhPITTbd8WfbYeCUw+Fs= +github.com/ardanlabs/kronk v1.28.4/go.mod h1:Gq9Rjp+GGgpWcsgsOF73TCo8nl5JHaBld1K5BMYWcao= +github.com/aws/aws-sdk-go-v2 v1.42.0 h1:XvXMJTkFQtpBKIWZnmr9ZEOc2InWM2yldjXEJ/bymhA= +github.com/aws/aws-sdk-go-v2 v1.42.0/go.mod h1:27+ACypSLljLAEKsCYOmrjKh83vuTRkuAe9Uv/3A4bg= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.13 h1:p1BBrg/Hhp6uK7zpejeI8QFXHJeC/mynzi04Sl03k9g= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.13/go.mod h1:8cIfkE9MDhkRZGpQ22aV6/lkYeYSozpz16Smrs5x4Ls= -github.com/aws/aws-sdk-go-v2/config v1.32.23 h1:PYDobtcsJXK6bQe9I8RQk6s19Bz3xa3xRU08Hy1Em3Y= -github.com/aws/aws-sdk-go-v2/config v1.32.23/go.mod h1:QID4dqUQVgEOYPKsPWd1sNWCCR2c5g7o3jeEtIXPOZU= -github.com/aws/aws-sdk-go-v2/credentials v1.19.22 h1:SHfH6wyPsEgG7fVsi5rQxWEt7tuIcN2PGhb1mTFv6tE= -github.com/aws/aws-sdk-go-v2/credentials v1.19.22/go.mod h1:54nO8lKD4aQPOntM/VTWjnR+DYzTwx0YkSMZMhAgewQ= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.28 h1:b+kcDejJrXc30zU/w8Tc9klISwaO5wh+6T0sMBdDoHM= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.28/go.mod h1:LnI62O9GnSv6GcuLXxOYqlq0C8EmxMcgnF6m7LdYuOY= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.28 h1:Xf2j7NdVcUKomlZ4iihOP4AZ3Fzlr8h4yKpXeP+OFPg= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.28/go.mod h1:O8cDo1dW63jU7ki//kRe1z+tLGcpnD1jrouitsQddDw= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.28 h1:KqIfN9kpkKkcBqBbNpNGTIrXO6ExTUvFKvXkC+YAzVo= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.28/go.mod h1:uxtQiKvLtNS4iXVsH2McVD/ls8FKN/uUhe1hGxPjrw0= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.29 h1:VkE9FuzTQVjBBrnj4+oCdxCLFIz7aqLYKUCjtvxVcOs= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.29/go.mod h1:H32Z2Qth9b+9LqjyBsCnozMQ8H2N7YBUDVXwbs0iggg= +github.com/aws/aws-sdk-go-v2/config v1.32.25 h1:ACCejvStYoilgwrfegSt5ZntCbPrk52qfwyNcnl3omM= +github.com/aws/aws-sdk-go-v2/config v1.32.25/go.mod h1:LJyU8sDRbXUxFn8xMJIGP+v9QYYwveNLI8a/giAOiAs= +github.com/aws/aws-sdk-go-v2/credentials v1.19.24 h1:2hQqYCV9yqyePQ9o6dCrZc/zO8U3TwPr9mIKlZnPu/I= +github.com/aws/aws-sdk-go-v2/credentials v1.19.24/go.mod h1:IDwpACtwqHLISdzfwUUNq4P9DsB/h5BLg4FwJPNfqFY= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.29 h1:r6qZHbT+wxgWO/e9vYNUEtg7lv5+UN3pRqKhLXvnArg= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.29/go.mod h1:QRnaRcTVGKPGRy8w78HMQtKUGRYcnMZAANATkeVA6Mo= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.29 h1:f3vKqSo13fhTYb+JEcXwXefZQE26I1FB5eTSniU67ko= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.29/go.mod h1:MzoLFUArKGpGD+ukmPiTPG1X5x4o6M2kq4v2dr1FiEc= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.29 h1:RdwIf/CuUsvJX3RgJagbOyotl/cxoLY4xviKuE7p2GY= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.29/go.mod h1:71wt8W2EgswdZy9Mf9KNnzxZ3TiZlv4caKghPktDOkA= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.30 h1:VTGy885W5DKBxWRUJbym9hytNaYzsyaPkCHGRRMAOhU= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.30/go.mod h1:AS0HycUvJRFvTt613AYDOgO2jzw+00cVSMny8XB3yMY= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.12 h1:ZD2+BSw9vFsNlKYIasSNt3uDbjqqXIBcM13UJv/Lx2k= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.12/go.mod h1:Ms4zlcVBbXbiP7EVLhl+lgjvA/a7YphqQ3Ih3174EmI= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.21 h1:FsZxbPiVgEHYofziwfylouMki8b1Z7mI4CMU/7bhwBA= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.21/go.mod h1:Mmm30OV+JLXYQUcbSd84THnv3P5JtjhVDujLwMqRG0U= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.28 h1:axj4mEDletwKmTm/9jR+DkIMmCfcn5vE4jBMAAN+3Vg= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.28/go.mod h1:3Aaz69M0jqfSHLKqxgolgUBFT4hpwSNc7DzC95orEi8= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.28 h1:li8rTZAAb22g4UsxbjwMdaNVWbgVcDzPqI7nDTI+mF4= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.28/go.mod h1:/brXioSGIMEdcBFoubpSdmighSVp6poP+mma/wB7iHA= -github.com/aws/aws-sdk-go-v2/service/s3 v1.103.2 h1:b4ikkRk22T4xYkEgaWc3Voe+3xbt5YbbFhNehOWyUiY= -github.com/aws/aws-sdk-go-v2/service/s3 v1.103.2/go.mod h1:Gp7eHZ0NZ8ZK5RXpoIUp/C8OeAmJqpCgdwEK1D/QOek= -github.com/aws/aws-sdk-go-v2/service/signin v1.1.4 h1:YcpVyIPLCbiypN6KSphijN5fC7DDjX114SqA7prnnxg= -github.com/aws/aws-sdk-go-v2/service/signin v1.1.4/go.mod h1:5ZICS++oFTRPfa1GsBqFDWX/8WamZ/QQOcCzIuU/zLw= -github.com/aws/aws-sdk-go-v2/service/sso v1.31.2 h1:ySNWu7TPmj5fKFIa1GYvX+Ddxd5ccruqC20aMNuyWDM= -github.com/aws/aws-sdk-go-v2/service/sso v1.31.2/go.mod h1:A+U9luAOwFeB1kseyWCITVg7/NntoPebCFR9pQ4ch9A= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.36.5 h1:KSzGGqfk39O+WU3OEyYbx6F7sLDQCqxlOJ+2IksfK6U= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.36.5/go.mod h1:ATs88lXDeQB6CZOgQ5BIl9JbYS+EsCWUSDyff6L/oVo= -github.com/aws/aws-sdk-go-v2/service/sts v1.43.2 h1:RTO7mmGyedgnNmcPh3yQizNfc6GKoV5iqfdJavuf9vw= -github.com/aws/aws-sdk-go-v2/service/sts v1.43.2/go.mod h1:fBhUZXDin9YYqhcpOMjIcpdik25rVwWyxLdPH1RZd9s= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.22 h1:V51LGlOq/1VsDsHUdoklAQi7rMmx4qQubvFYAlP2254= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.22/go.mod h1:4Pzhyz8hJOm2bepgl+NjvRx8vlUFAIIvJnZ/MkcNPpU= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.29 h1:DRebniUGZ2MqiiIVmQJ04vIXr918hubdHMnarSLEWyU= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.29/go.mod h1:LfRkPCD8YHDM2E5eTkos2UpwYeZnBcVarTa8L59bJHA= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.29 h1:hiME6pBzC7OTl9LMtlyTWBuEl1f4QBcUmFDKC7MLXtc= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.29/go.mod h1:G7RP+uhagpKtKhd1BM9N6JQqjCcGEU47K5lBVZQyRQw= +github.com/aws/aws-sdk-go-v2/service/s3 v1.104.0 h1:ta8csKy5vN91F3i5gGR85lFV0srBqySEji7Jroes6rE= +github.com/aws/aws-sdk-go-v2/service/s3 v1.104.0/go.mod h1:77ZAgynvx1txMvDG8gGWoWkO1augYDxkp9JElWFgjQU= +github.com/aws/aws-sdk-go-v2/service/signin v1.2.0 h1:3nXpRcFwRCW8n7HgO2QGy0Dc20eQNfBuUemGQhpF8m8= +github.com/aws/aws-sdk-go-v2/service/signin v1.2.0/go.mod h1:LxYujSTLPRlp2vTtcUO/+1ilrew8ytt6SvQyOgejzFQ= +github.com/aws/aws-sdk-go-v2/service/sso v1.31.3 h1:ey1XLTYXb9PcLt4535632o5kCGXNXEhNb620Dqwuylo= +github.com/aws/aws-sdk-go-v2/service/sso v1.31.3/go.mod h1:Lk7PlmoTYryQmyBG0EXqj5BcUbj3whXdU2s3yGI3EAc= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.36.6 h1:yLr03zQE/5Eu5l3QU0Si+xMbLMbSDF2YXsigqXngs6g= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.36.6/go.mod h1:Q5N6icH+KJZDLh+ESNwzdv6cZ6vLFF/egy3IOxWhmz4= +github.com/aws/aws-sdk-go-v2/service/sts v1.43.3 h1:VrIhKRCSK1umelSgB9RghvA9RTUYeQffyAS5ApXehNI= +github.com/aws/aws-sdk-go-v2/service/sts v1.43.3/go.mod h1:r8wkDOuLaaMFqFiYAb8dGY2A3gJCOujMc6CFOVC4Zhc= github.com/aws/smithy-go v1.27.2 h1:y9NPmSE6am6LjEFPfqHqG/jJk7AauQvhCJONKh7kpzk= github.com/aws/smithy-go v1.27.2/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc= github.com/aymanbagabas/go-udiff v0.2.0 h1:TK0fH4MteXUDspT88n8CKzvK0X9O2xu9yQjWpi6yML8= @@ -86,8 +86,8 @@ github.com/charmbracelet/lipgloss/v2 v2.0.0-beta1 h1:SOylT6+BQzPHEjn15TIzawBPVD0 github.com/charmbracelet/lipgloss/v2 v2.0.0-beta1/go.mod h1:tRlx/Hu0lo/j9viunCN2H+Ze6JrmdjQlXUQvvArgaOc= github.com/charmbracelet/log/v2 v2.0.0-20251001162505-358b5269b546 h1:ZcOMUkKhtM6TbQKfB6C/GusIG6hdTMybJ4gNboQpjYg= github.com/charmbracelet/log/v2 v2.0.0-20251001162505-358b5269b546/go.mod h1:ooW2QKtnlCj7Kc5Atb7TQPRo699Fy+jhtLgX6a/EAh8= -github.com/charmbracelet/openai-go v0.0.0-20260319145158-d0740cc34266 h1:BW/sZtyd1JyYy0h5adMm3tzpNyL857LWjuTRET6OhpY= -github.com/charmbracelet/openai-go v0.0.0-20260319145158-d0740cc34266/go.mod h1:1DahUaExbUZx/jD+FNT2PKP4L9rLE5+ZBRuI8mZjd/E= +github.com/charmbracelet/openai-go v0.0.0-20260617131321-5e4b9c18c4be h1:pg+OWlIkk9HOe/8P5J95aKe2wGDzFUiiyFOUpwR30B4= +github.com/charmbracelet/openai-go v0.0.0-20260617131321-5e4b9c18c4be/go.mod h1:1DahUaExbUZx/jD+FNT2PKP4L9rLE5+ZBRuI8mZjd/E= github.com/charmbracelet/x/ansi v0.10.2 h1:ith2ArZS0CJG30cIUfID1LXN7ZFXRCww6RUvAPA+Pzw= github.com/charmbracelet/x/ansi v0.10.2/go.mod h1:HbLdJjQH4UH4AqA2HpRWuWNluRE6zxJH/yteYEYCFa8= github.com/charmbracelet/x/cellbuf v0.0.14-0.20250811133356-e0c5dbe5ea4a h1:zYSNtEJM9jwHbJts2k+Hroj+xQwsW1yxc4Wopdv7KaI= @@ -118,8 +118,8 @@ github.com/envoyproxy/go-control-plane/ratelimit v0.1.0 h1:/G9QYbddjL25KvtKTv3an github.com/envoyproxy/go-control-plane/ratelimit v0.1.0/go.mod h1:Wk+tMFAFbCXaJPzVVHnPgRKdUdwW/KdbRt94AzgRee4= github.com/envoyproxy/protoc-gen-validate v1.3.3 h1:MVQghNeW+LZcmXe7SY1V36Z+WFMDjpqGAGacLe2T0ds= github.com/envoyproxy/protoc-gen-validate v1.3.3/go.mod h1:TsndJ/ngyIdQRhMcVVGDDHINPLWB7C82oDArY51KfB0= -github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= -github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/felixge/httpsnoop v1.1.0 h1:3YtUj32ZZkqZtt3sZZsClsymw/QDuVfpNhoA31zeORc= +github.com/felixge/httpsnoop v1.1.0/go.mod h1:Zqxgdd+1Rkcz8euOqdr7lqgCRJztwr5hp9vDSi5UZCE= github.com/go-jose/go-jose/v4 v4.1.4 h1:moDMcTHmvE6Groj34emNPLs/qtYXRVcd6S7NHbHz3kA= github.com/go-jose/go-jose/v4 v4.1.4/go.mod h1:x4oUasVrzR7071A4TnHLGSPpNOm2a21K9Kf04k1rs08= github.com/go-json-experiment/json v0.0.0-20260601182631-00ed12fed2a6 h1:nxP4pPoyqOAgX8lYDFCfl3DyKeXErCvSvhcyzwGV9CE= @@ -145,8 +145,8 @@ github.com/google/s2a-go v0.1.9 h1:LGD7gtMgezd8a/Xak7mEWL0PjoTQFvpRudN895yqKW0= github.com/google/s2a-go v0.1.9/go.mod h1:YA0Ei2ZQL3acow2O62kdp9UlnvMmU7kA6Eutn0dXayM= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.3.16 h1:F/VPrx0YPBdksZJQdCAp0WUsqnNmZpUZszzfYt0M5Dw= -github.com/googleapis/enterprise-certificate-proxy v0.3.16/go.mod h1:9Yb0eAkH/Xqhvv3zbeKf/+wMJqCeocWc6KIhDvEAuYE= +github.com/googleapis/enterprise-certificate-proxy v0.3.17 h1:73NfMHdiqo9JFU9+7a5ExpVa10/R29pXfZIaW559nrg= +github.com/googleapis/enterprise-certificate-proxy v0.3.17/go.mod h1:rSEsBUemEBZEexP2y6jPp16LUmUbjmSbcPMQizR0o4k= github.com/googleapis/gax-go/v2 v2.22.0 h1:PjIWBpgGIVKGoCXuiCoP64altEJCj3/Ei+kSU5vlZD4= github.com/googleapis/gax-go/v2 v2.22.0/go.mod h1:irWBbALSr0Sk3qlqb9SyJ1h68WjgeFuiOzI4Rqw5+aY= github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= @@ -161,14 +161,14 @@ github.com/hashicorp/go-getter v1.8.6 h1:9sQboWULaydVphxc4S64oAI4YqpuCk7nPmvbk13 github.com/hashicorp/go-getter v1.8.6/go.mod h1:nVH12eOV2P58dIiL3rsU6Fh3wLeJEKBOJzhMmzlSWoo= github.com/hashicorp/go-version v1.9.0 h1:CeOIz6k+LoN3qX9Z0tyQrPtiB1DFYRPfCIBtaXPSCnA= github.com/hashicorp/go-version v1.9.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hybridgroup/yzma v1.16.1 h1:t1uA0Jsv5D9YzBa1D4CapK8kZA/uYrgaCHR33brVqjg= -github.com/hybridgroup/yzma v1.16.1/go.mod h1:DAsHYcX7ze7iFZH6PT57oCuqaVd/AXdALhjnOSgWbaE= +github.com/hybridgroup/yzma v1.18.0 h1:M4ja0zt2ZBkTskMrHsGSls9/jts8hD83uuYMBYo9+c4= +github.com/hybridgroup/yzma v1.18.0/go.mod h1:DAsHYcX7ze7iFZH6PT57oCuqaVd/AXdALhjnOSgWbaE= github.com/jupiterrider/ffi v0.7.0 h1:RKsl6Ascal+3kyAqR5Qcbp83LceQMLc1VZbPfHWoNzs= github.com/jupiterrider/ffi v0.7.0/go.mod h1:9dauhpOfNqrqk28fxuu0kkdeFtT9Qr4vbfigiuIXN7c= github.com/kaptinlin/jsonpointer v0.4.26 h1:tw616yszHek+B3/GtDSia+uzBa3sLXGpmo4tYeMhBZw= github.com/kaptinlin/jsonpointer v0.4.26/go.mod h1:wVOBaXGGnP42YsMb6zev/3W5POTvspdNfh8DXzf8XS8= -github.com/kaptinlin/jsonschema v0.8.0 h1:GhY966O2q3ZQsg1zkQj988KF2MADJ6EA7pKBMpGmb9A= -github.com/kaptinlin/jsonschema v0.8.0/go.mod h1:dxt7s98W5NEuWEwCnAwGrhYGQdaRLqXZImR28DuxcMU= +github.com/kaptinlin/jsonschema v0.9.2 h1:zqowDnBkpg80OeIt4Bl1bOyfKY1/KVVzst1m3MCsxd4= +github.com/kaptinlin/jsonschema v0.9.2/go.mod h1:mCH2W5lXd29tdDjvoFfY32nedPORnlk7pCVrrcs/NkQ= github.com/klauspost/compress v1.18.6 h1:2jupLlAwFm95+YDR+NwD2MEfFO9d4z4Prjl1XXDjuao= github.com/klauspost/compress v1.18.6/go.mod h1:cwPg85FWrGar70rWktvGQj8/hthj3wpl0PGDogxkrSQ= github.com/lucasb-eyer/go-colorful v1.3.0 h1:2/yBRLdWBZKrf7gB40FoiKfAWYQ0lqNcbuQwVHXptag= @@ -189,15 +189,15 @@ github.com/prometheus/client_golang v1.23.2 h1:Je96obch5RDVy3FDMndoUsjAhG5Edi49h github.com/prometheus/client_golang v1.23.2/go.mod h1:Tb1a6LWHB3/SPIzCoaDXI4I8UHKeFTEQ1YCr+0Gyqmg= github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= -github.com/prometheus/common v0.68.1 h1:omjRRl4QP4komogpXuhfeOiisQg7xdy8VM1UY+pStaY= -github.com/prometheus/common v0.68.1/go.mod h1:ZzL3f6u94qUxh9p+tJTrF+FvBS1XXbbRAZCQkytAL0Y= +github.com/prometheus/common v0.69.0 h1:OA85nJQS/T/MaYh/Q2CcgDKSGWqNIgrBDvDH85CuiNk= +github.com/prometheus/common v0.69.0/go.mod h1:ZzL3f6u94qUxh9p+tJTrF+FvBS1XXbbRAZCQkytAL0Y= github.com/prometheus/procfs v0.20.1 h1:XwbrGOIplXW/AU3YhIhLODXMJYyC1isLFfYCsTEycfc= github.com/prometheus/procfs v0.20.1/go.mod h1:o9EMBZGRyvDrSPH1RqdxhojkuXstoe4UlK79eF5TGGo= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= -github.com/spiffe/go-spiffe/v2 v2.7.0 h1:uXe1MflJoHw58wAUvxVlcM7WpKtijWG7I1UidcGh6g4= -github.com/spiffe/go-spiffe/v2 v2.7.0/go.mod h1:47Q0Q9/AqGha8QLHp+kxpH4Wca7X7EnOtlIJy3mxZ3U= +github.com/spiffe/go-spiffe/v2 v2.8.1 h1:eXZMLsu+3MLEPJyGJkolqtVrteZfQdUpOWj6LTiDl/E= +github.com/spiffe/go-spiffe/v2 v2.8.1/go.mod h1:47Q0Q9/AqGha8QLHp+kxpH4Wca7X7EnOtlIJy3mxZ3U= github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= github.com/tidwall/gjson v1.14.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= @@ -246,36 +246,36 @@ go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.yaml.in/yaml/v2 v2.4.4 h1:tuyd0P+2Ont/d6e2rl3be67goVK4R6deVxCUX5vyPaQ= go.yaml.in/yaml/v2 v2.4.4/go.mod h1:gMZqIpDtDqOfM0uNfy0SkpRhvUryYH0Z6wdMYcacYXQ= -golang.org/x/crypto v0.52.0 h1:RMs7fP2rXdep0CftQlK8Uf+kibLm7qkCcradZWYz988= -golang.org/x/crypto v0.52.0/go.mod h1:1QgfPxDqh0T2M/elOJtp9RvuR95kVjir0e6/BvEmGbc= +golang.org/x/crypto v0.53.0 h1:QZ4Muo8THX6CizN2vPPd5fBGHyogrdK9fG4wLPFUsto= +golang.org/x/crypto v0.53.0/go.mod h1:DNLU434OwVakk9PzuwV8w62mAJpRJL3vsgcfp4Qnsio= golang.org/x/exp v0.0.0-20260312153236-7ab1446f8b90 h1:jiDhWWeC7jfWqR9c/uplMOqJ0sbNlNWv0UkzE0vX1MA= golang.org/x/exp v0.0.0-20260312153236-7ab1446f8b90/go.mod h1:xE1HEv6b+1SCZ5/uscMRjUBKtIxworgEcEi+/n9NQDQ= -golang.org/x/image v0.41.0 h1:8wS72eGJMJaBxK6okTzd4WaXumUlTVlb753MlsSvTCo= -golang.org/x/image v0.41.0/go.mod h1:uIc348UZMSvS5Z65CVZ7iDPaNobNFEPeJ4kbqTOszmA= -golang.org/x/net v0.55.0 h1:bcvxaJn3e1U6InsFWt1JUq1aSjnRxLzT2rtD2KfkDF8= -golang.org/x/net v0.55.0/go.mod h1:L5U2KuzuOe1lY7Z+aWVIKK6qEeJXnXV9yzGA+WCHJww= +golang.org/x/image v0.43.0 h1:FLxcP4ec2350nTfOC8ysKtqYSIFbk/QGjw1ZHNP4tsY= +golang.org/x/image v0.43.0/go.mod h1:rrpelvGFt+kLPAjPM4HeWPgrl0FtafueU//e5N0qk/Q= +golang.org/x/net v0.56.0 h1:Rw8j/hFzGvJUZwNBXnAtf5sVDVt+65SK2C7IxCxZt5o= +golang.org/x/net v0.56.0/go.mod h1:D3Ku6r+V6JROoZK144D2XfMHFcMq/0zSfLelVTCFKec= golang.org/x/oauth2 v0.36.0 h1:peZ/1z27fi9hUOFCAZaHyrpWG5lwe0RJEEEeH0ThlIs= golang.org/x/oauth2 v0.36.0/go.mod h1:YDBUJMTkDnJS+A4BP4eZBjCqtokkg1hODuPjwiGPO7Q= golang.org/x/sync v0.21.0 h1:HLII4xRRTtCRkxYp4HNFF0Js/Og6q2i++KXbg0gHCwM= golang.org/x/sync v0.21.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= golang.org/x/sys v0.46.0 h1:noSf2Fq6F8DBgS+LysIkx7rIExoNHJsxOAtPp4rthXw= golang.org/x/sys v0.46.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= -golang.org/x/text v0.37.0 h1:Cqjiwd9eSg8e0QAkyCaQTNHFIIzWtidPahFWR83rTrc= -golang.org/x/text v0.37.0/go.mod h1:a5sjxXGs9hsn/AJVwuElvCAo9v8QYLzvavO5z2PiM38= +golang.org/x/text v0.38.0 h1:sXmwo9DwP3OK9EZ7PqAdaooSGozfl/3a6/xJcbzPRhE= +golang.org/x/text v0.38.0/go.mod h1:YXZt3QhHUKYT53r2lLKFIVi6Ao1jdzrTR/KQ09qyxF4= golang.org/x/time v0.15.0 h1:bbrp8t3bGUeFOx08pvsMYRTCVSMk89u4tKbNOZbp88U= golang.org/x/time v0.15.0/go.mod h1:Y4YMaQmXwGQZoFaVFk4YpCt4FLQMYKZe9oeV/f4MSno= gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4= gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E= -google.golang.org/api v0.283.0 h1:0lkp8u0MPwJVHqRL+nJlMAoZVVzbmiXmFHXMOTmSPik= -google.golang.org/api v0.283.0/go.mod h1:6Wssta4c5n9qHq5CBhmlai5h/PUa1djdDAIhYEHyvcM= -google.golang.org/genai v1.59.0 h1:xp+ydkJFW8hO0hTUaAkr8TrLM9HFP3NYAwFhPd0nDqA= -google.golang.org/genai v1.59.0/go.mod h1:mDdPDFXo1Ats7f1WXVyZgWb/CkMzFWTWJruIMy7hGIU= -google.golang.org/genproto v0.0.0-20260526163538-3dc84a4a5aaa h1:mfj8IS4EA4VAR9a6QDVxTQkLY64iBybb5QI1B4pXrpE= -google.golang.org/genproto v0.0.0-20260526163538-3dc84a4a5aaa/go.mod h1:fuT7yonGw1Iq2oa+YC0fyqPPQJkgo/54gPNC6VitOkI= -google.golang.org/genproto/googleapis/api v0.0.0-20260526163538-3dc84a4a5aaa h1:Kjn0N0tCrDgiAFW+lGO4JZ3ck44CehvJQMAwj9QF0G8= -google.golang.org/genproto/googleapis/api v0.0.0-20260526163538-3dc84a4a5aaa/go.mod h1:q4lMZS6kskjT5HvCPrnnypcDPVJqT/f4nfxmkE7gryY= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260526163538-3dc84a4a5aaa h1:mZHHdPZl0dbGHCflZgAq/Q468DWVFcU2whhB2KAo8fk= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260526163538-3dc84a4a5aaa/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= +google.golang.org/api v0.286.0 h1:TdTXMvzYKnWV1/lPbCdbXRqBrkDqjPto22H2xeZZ8LI= +google.golang.org/api v0.286.0/go.mod h1:NlOlUIr8MPoIhT9Bb/oUnRuHbJOLwxb6JSYJM8Yz+jQ= +google.golang.org/genai v1.61.0 h1:wCyNGiaC9q5A59B80zuEtNBhq3ypEvICFkZYOfK7IO0= +google.golang.org/genai v1.61.0/go.mod h1:mDdPDFXo1Ats7f1WXVyZgWb/CkMzFWTWJruIMy7hGIU= +google.golang.org/genproto v0.0.0-20260622175928-b703f567277d h1:CP5omUq8AJTiWMrPKM1WRLJ7zZeXd9OPcQD3TbBNAyY= +google.golang.org/genproto v0.0.0-20260622175928-b703f567277d/go.mod h1:DrwuGJgFSEVNpv3S5Q5VxhRTvdnjauw9GtvwVOEARfA= +google.golang.org/genproto/googleapis/api v0.0.0-20260622175928-b703f567277d h1:xr2lwHI91bn3UiXcnyzRMQjp2LRiM8wEHzwUaE0YhTs= +google.golang.org/genproto/googleapis/api v0.0.0-20260622175928-b703f567277d/go.mod h1:O0ZOWSrfWfJ+Z5HbwZ+wNtHsg/vk1k2C/w67eww8PfQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260622175928-b703f567277d h1:mpAgMyM9vQHxycBlDq50y1VHpfSfVwzXvrQKtYbXuUY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260622175928-b703f567277d/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= google.golang.org/grpc v1.81.1 h1:VnnIIZ88UzOOKLukQi+ImGz8O1Wdp8nAGGnvOfEIWQQ= google.golang.org/grpc v1.81.1/go.mod h1:xGH9GfzOyMTGIOXBJmXt+BX/V0kcdQbdcuwQ/zNw42I= google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= diff --git a/go.mod b/go.mod index b3b9c33a9..9c7718473 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.26.4 require ( charm.land/x/vcr v0.1.1 cloud.google.com/go/auth v0.20.0 - github.com/ardanlabs/kronk v1.28.0 + github.com/ardanlabs/kronk v1.28.4 github.com/aws/aws-sdk-go-v2 v1.42.0 github.com/aws/aws-sdk-go-v2/config v1.32.25 github.com/aws/smithy-go v1.27.2 @@ -47,7 +47,7 @@ require ( github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.22 // indirect github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.29 // indirect github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.29 // indirect - github.com/aws/aws-sdk-go-v2/service/s3 v1.103.3 // indirect + github.com/aws/aws-sdk-go-v2/service/s3 v1.104.0 // indirect github.com/aws/aws-sdk-go-v2/service/signin v1.2.0 // indirect github.com/aws/aws-sdk-go-v2/service/sso v1.31.3 // indirect github.com/aws/aws-sdk-go-v2/service/ssooidc v1.36.6 // indirect @@ -69,7 +69,7 @@ require ( github.com/goccy/go-yaml v1.19.2 // indirect github.com/google/go-cmp v0.7.0 // indirect github.com/google/s2a-go v0.1.9 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.3.16 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.3.17 // indirect github.com/googleapis/gax-go/v2 v2.22.0 // indirect github.com/gorilla/websocket v1.5.3 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.29.0 // indirect @@ -77,7 +77,7 @@ require ( github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-getter v1.8.6 // indirect github.com/hashicorp/go-version v1.9.0 // indirect - github.com/hybridgroup/yzma v1.17.1 // indirect + github.com/hybridgroup/yzma v1.18.0 // indirect github.com/jupiterrider/ffi v0.7.0 // indirect github.com/kaptinlin/jsonpointer v0.4.26 // indirect github.com/klauspost/compress v1.18.6 // indirect @@ -87,9 +87,9 @@ require ( github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/prometheus/client_golang v1.23.2 // indirect github.com/prometheus/client_model v0.6.2 // indirect - github.com/prometheus/common v0.68.1 // indirect + github.com/prometheus/common v0.69.0 // indirect github.com/prometheus/procfs v0.20.1 // indirect - github.com/spiffe/go-spiffe/v2 v2.7.0 // indirect + github.com/spiffe/go-spiffe/v2 v2.8.1 // indirect github.com/tidwall/gjson v1.18.0 // indirect github.com/tidwall/match v1.1.1 // indirect github.com/tidwall/pretty v1.2.1 // indirect @@ -110,16 +110,16 @@ require ( go.yaml.in/yaml/v2 v2.4.4 // indirect go.yaml.in/yaml/v4 v4.0.0-rc.3 // indirect golang.org/x/crypto v0.53.0 // indirect - golang.org/x/image v0.42.0 // indirect + golang.org/x/image v0.43.0 // indirect golang.org/x/net v0.56.0 // indirect golang.org/x/sync v0.21.0 // indirect golang.org/x/sys v0.46.0 // indirect golang.org/x/text v0.38.0 // indirect golang.org/x/time v0.15.0 // indirect - google.golang.org/api v0.284.0 // indirect - google.golang.org/genproto v0.0.0-20260610212136-7ab31c22f7ad // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20260610212136-7ab31c22f7ad // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20260610212136-7ab31c22f7ad // indirect + google.golang.org/api v0.286.0 // indirect + google.golang.org/genproto v0.0.0-20260622175928-b703f567277d // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20260622175928-b703f567277d // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20260622175928-b703f567277d // indirect google.golang.org/grpc v1.81.1 // indirect google.golang.org/protobuf v1.36.11 // indirect gopkg.in/dnaeon/go-vcr.v4 v4.0.6-0.20251110073552-01de4eb40290 // indirect diff --git a/go.sum b/go.sum index 66b0a4780..a1568821c 100644 --- a/go.sum +++ b/go.sum @@ -40,8 +40,8 @@ github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapp github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.57.0/go.mod h1:YqwkQPrWSC7+byyc1VlKbWLBF5JsW5IoL6xUkemYSXk= github.com/ardanlabs/jinja v1.4.0 h1:9iE0/wF4zhcws1CYZCWqJTQP8YuhC4FjycBGzCTuOFw= github.com/ardanlabs/jinja v1.4.0/go.mod h1:aXXzlJfjA+T3XNKA/YT5ZtDq2VJxt5a5siZ8cl9B35Q= -github.com/ardanlabs/kronk v1.28.0 h1:Jx0gqJqeL615ToFSuV48h8Uubo49zoAQ2cHOsliP1NQ= -github.com/ardanlabs/kronk v1.28.0/go.mod h1:dLd1F38v+1URf5Vsa/P4ENS9VhZw4vwX7EEhHFAAdkA= +github.com/ardanlabs/kronk v1.28.4 h1:dfyvJLnCmi3xgNASI4bzA9rfhPITTbd8WfbYeCUw+Fs= +github.com/ardanlabs/kronk v1.28.4/go.mod h1:Gq9Rjp+GGgpWcsgsOF73TCo8nl5JHaBld1K5BMYWcao= github.com/aws/aws-sdk-go-v2 v1.42.0 h1:XvXMJTkFQtpBKIWZnmr9ZEOc2InWM2yldjXEJ/bymhA= github.com/aws/aws-sdk-go-v2 v1.42.0/go.mod h1:27+ACypSLljLAEKsCYOmrjKh83vuTRkuAe9Uv/3A4bg= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.13 h1:p1BBrg/Hhp6uK7zpejeI8QFXHJeC/mynzi04Sl03k9g= @@ -66,8 +66,8 @@ github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.29 h1:DRebniUG github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.29/go.mod h1:LfRkPCD8YHDM2E5eTkos2UpwYeZnBcVarTa8L59bJHA= github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.29 h1:hiME6pBzC7OTl9LMtlyTWBuEl1f4QBcUmFDKC7MLXtc= github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.29/go.mod h1:G7RP+uhagpKtKhd1BM9N6JQqjCcGEU47K5lBVZQyRQw= -github.com/aws/aws-sdk-go-v2/service/s3 v1.103.3 h1:JRseEu/vIDMaWis4bSw0QbXL+cvIGc1XnX076H5ZXLE= -github.com/aws/aws-sdk-go-v2/service/s3 v1.103.3/go.mod h1:77ZAgynvx1txMvDG8gGWoWkO1augYDxkp9JElWFgjQU= +github.com/aws/aws-sdk-go-v2/service/s3 v1.104.0 h1:ta8csKy5vN91F3i5gGR85lFV0srBqySEji7Jroes6rE= +github.com/aws/aws-sdk-go-v2/service/s3 v1.104.0/go.mod h1:77ZAgynvx1txMvDG8gGWoWkO1augYDxkp9JElWFgjQU= github.com/aws/aws-sdk-go-v2/service/signin v1.2.0 h1:3nXpRcFwRCW8n7HgO2QGy0Dc20eQNfBuUemGQhpF8m8= github.com/aws/aws-sdk-go-v2/service/signin v1.2.0/go.mod h1:LxYujSTLPRlp2vTtcUO/+1ilrew8ytt6SvQyOgejzFQ= github.com/aws/aws-sdk-go-v2/service/sso v1.31.3 h1:ey1XLTYXb9PcLt4535632o5kCGXNXEhNb620Dqwuylo= @@ -139,8 +139,8 @@ github.com/google/s2a-go v0.1.9 h1:LGD7gtMgezd8a/Xak7mEWL0PjoTQFvpRudN895yqKW0= github.com/google/s2a-go v0.1.9/go.mod h1:YA0Ei2ZQL3acow2O62kdp9UlnvMmU7kA6Eutn0dXayM= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.3.16 h1:F/VPrx0YPBdksZJQdCAp0WUsqnNmZpUZszzfYt0M5Dw= -github.com/googleapis/enterprise-certificate-proxy v0.3.16/go.mod h1:9Yb0eAkH/Xqhvv3zbeKf/+wMJqCeocWc6KIhDvEAuYE= +github.com/googleapis/enterprise-certificate-proxy v0.3.17 h1:73NfMHdiqo9JFU9+7a5ExpVa10/R29pXfZIaW559nrg= +github.com/googleapis/enterprise-certificate-proxy v0.3.17/go.mod h1:rSEsBUemEBZEexP2y6jPp16LUmUbjmSbcPMQizR0o4k= github.com/googleapis/gax-go/v2 v2.22.0 h1:PjIWBpgGIVKGoCXuiCoP64altEJCj3/Ei+kSU5vlZD4= github.com/googleapis/gax-go/v2 v2.22.0/go.mod h1:irWBbALSr0Sk3qlqb9SyJ1h68WjgeFuiOzI4Rqw5+aY= github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= @@ -155,8 +155,8 @@ github.com/hashicorp/go-getter v1.8.6 h1:9sQboWULaydVphxc4S64oAI4YqpuCk7nPmvbk13 github.com/hashicorp/go-getter v1.8.6/go.mod h1:nVH12eOV2P58dIiL3rsU6Fh3wLeJEKBOJzhMmzlSWoo= github.com/hashicorp/go-version v1.9.0 h1:CeOIz6k+LoN3qX9Z0tyQrPtiB1DFYRPfCIBtaXPSCnA= github.com/hashicorp/go-version v1.9.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hybridgroup/yzma v1.17.1 h1:T841QThcR+LrdEGp5ISGMKIJFUGQHgWXvjXfIIUEDFI= -github.com/hybridgroup/yzma v1.17.1/go.mod h1:DAsHYcX7ze7iFZH6PT57oCuqaVd/AXdALhjnOSgWbaE= +github.com/hybridgroup/yzma v1.18.0 h1:M4ja0zt2ZBkTskMrHsGSls9/jts8hD83uuYMBYo9+c4= +github.com/hybridgroup/yzma v1.18.0/go.mod h1:DAsHYcX7ze7iFZH6PT57oCuqaVd/AXdALhjnOSgWbaE= github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= github.com/jupiterrider/ffi v0.7.0 h1:RKsl6Ascal+3kyAqR5Qcbp83LceQMLc1VZbPfHWoNzs= @@ -187,14 +187,14 @@ github.com/prometheus/client_golang v1.23.2 h1:Je96obch5RDVy3FDMndoUsjAhG5Edi49h github.com/prometheus/client_golang v1.23.2/go.mod h1:Tb1a6LWHB3/SPIzCoaDXI4I8UHKeFTEQ1YCr+0Gyqmg= github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= -github.com/prometheus/common v0.68.1 h1:omjRRl4QP4komogpXuhfeOiisQg7xdy8VM1UY+pStaY= -github.com/prometheus/common v0.68.1/go.mod h1:ZzL3f6u94qUxh9p+tJTrF+FvBS1XXbbRAZCQkytAL0Y= +github.com/prometheus/common v0.69.0 h1:OA85nJQS/T/MaYh/Q2CcgDKSGWqNIgrBDvDH85CuiNk= +github.com/prometheus/common v0.69.0/go.mod h1:ZzL3f6u94qUxh9p+tJTrF+FvBS1XXbbRAZCQkytAL0Y= github.com/prometheus/procfs v0.20.1 h1:XwbrGOIplXW/AU3YhIhLODXMJYyC1isLFfYCsTEycfc= github.com/prometheus/procfs v0.20.1/go.mod h1:o9EMBZGRyvDrSPH1RqdxhojkuXstoe4UlK79eF5TGGo= github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= -github.com/spiffe/go-spiffe/v2 v2.7.0 h1:uXe1MflJoHw58wAUvxVlcM7WpKtijWG7I1UidcGh6g4= -github.com/spiffe/go-spiffe/v2 v2.7.0/go.mod h1:47Q0Q9/AqGha8QLHp+kxpH4Wca7X7EnOtlIJy3mxZ3U= +github.com/spiffe/go-spiffe/v2 v2.8.1 h1:eXZMLsu+3MLEPJyGJkolqtVrteZfQdUpOWj6LTiDl/E= +github.com/spiffe/go-spiffe/v2 v2.8.1/go.mod h1:47Q0Q9/AqGha8QLHp+kxpH4Wca7X7EnOtlIJy3mxZ3U= github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= github.com/tidwall/gjson v1.14.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= @@ -245,8 +245,8 @@ go.yaml.in/yaml/v4 v4.0.0-rc.3 h1:3h1fjsh1CTAPjW7q/EMe+C8shx5d8ctzZTrLcs/j8Go= go.yaml.in/yaml/v4 v4.0.0-rc.3/go.mod h1:aZqd9kCMsGL7AuUv/m/PvWLdg5sjJsZ4oHDEnfPPfY0= golang.org/x/crypto v0.53.0 h1:QZ4Muo8THX6CizN2vPPd5fBGHyogrdK9fG4wLPFUsto= golang.org/x/crypto v0.53.0/go.mod h1:DNLU434OwVakk9PzuwV8w62mAJpRJL3vsgcfp4Qnsio= -golang.org/x/image v0.42.0 h1:1gSs6ehNWXLbkHBIPcWztk3D/6aIA/8hauiAYtlodVY= -golang.org/x/image v0.42.0/go.mod h1:rrpelvGFt+kLPAjPM4HeWPgrl0FtafueU//e5N0qk/Q= +golang.org/x/image v0.43.0 h1:FLxcP4ec2350nTfOC8ysKtqYSIFbk/QGjw1ZHNP4tsY= +golang.org/x/image v0.43.0/go.mod h1:rrpelvGFt+kLPAjPM4HeWPgrl0FtafueU//e5N0qk/Q= golang.org/x/net v0.56.0 h1:Rw8j/hFzGvJUZwNBXnAtf5sVDVt+65SK2C7IxCxZt5o= golang.org/x/net v0.56.0/go.mod h1:D3Ku6r+V6JROoZK144D2XfMHFcMq/0zSfLelVTCFKec= golang.org/x/oauth2 v0.36.0 h1:peZ/1z27fi9hUOFCAZaHyrpWG5lwe0RJEEEeH0ThlIs= @@ -261,16 +261,16 @@ golang.org/x/time v0.15.0 h1:bbrp8t3bGUeFOx08pvsMYRTCVSMk89u4tKbNOZbp88U= golang.org/x/time v0.15.0/go.mod h1:Y4YMaQmXwGQZoFaVFk4YpCt4FLQMYKZe9oeV/f4MSno= gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4= gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E= -google.golang.org/api v0.284.0 h1:i+cKTgeQRcRySkP7QTl5PDO7/pAm8EcMFIUMlNbk4Vc= -google.golang.org/api v0.284.0/go.mod h1:AU44fU+XVZOCcd8uLaBIa/ZgzgPf/0qqY3+m7lQaado= +google.golang.org/api v0.286.0 h1:TdTXMvzYKnWV1/lPbCdbXRqBrkDqjPto22H2xeZZ8LI= +google.golang.org/api v0.286.0/go.mod h1:NlOlUIr8MPoIhT9Bb/oUnRuHbJOLwxb6JSYJM8Yz+jQ= google.golang.org/genai v1.61.0 h1:wCyNGiaC9q5A59B80zuEtNBhq3ypEvICFkZYOfK7IO0= google.golang.org/genai v1.61.0/go.mod h1:mDdPDFXo1Ats7f1WXVyZgWb/CkMzFWTWJruIMy7hGIU= -google.golang.org/genproto v0.0.0-20260610212136-7ab31c22f7ad h1:cYL1DPJAQr4JMvhfGao0PDXoaf03ifMljAuDyrbMBd0= -google.golang.org/genproto v0.0.0-20260610212136-7ab31c22f7ad/go.mod h1:cVHIikDNAdx8ISZeW+2rYkEMf3xn0GSaBYmVnWXQBUo= -google.golang.org/genproto/googleapis/api v0.0.0-20260610212136-7ab31c22f7ad h1:3iLyITS/sySRwbUKoC7ogfj2Yr1Cjs0pfaRKj5U5HEw= -google.golang.org/genproto/googleapis/api v0.0.0-20260610212136-7ab31c22f7ad/go.mod h1:KdNqO+rCIWgFumrNBSEDlDNrkrQnpkax7Tv1WxNY8V4= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260610212136-7ab31c22f7ad h1:45WmJvIV6C2+O/jjLkPUH+F3aOj/1miDoU2DD0+NWbg= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260610212136-7ab31c22f7ad/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= +google.golang.org/genproto v0.0.0-20260622175928-b703f567277d h1:CP5omUq8AJTiWMrPKM1WRLJ7zZeXd9OPcQD3TbBNAyY= +google.golang.org/genproto v0.0.0-20260622175928-b703f567277d/go.mod h1:DrwuGJgFSEVNpv3S5Q5VxhRTvdnjauw9GtvwVOEARfA= +google.golang.org/genproto/googleapis/api v0.0.0-20260622175928-b703f567277d h1:xr2lwHI91bn3UiXcnyzRMQjp2LRiM8wEHzwUaE0YhTs= +google.golang.org/genproto/googleapis/api v0.0.0-20260622175928-b703f567277d/go.mod h1:O0ZOWSrfWfJ+Z5HbwZ+wNtHsg/vk1k2C/w67eww8PfQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260622175928-b703f567277d h1:mpAgMyM9vQHxycBlDq50y1VHpfSfVwzXvrQKtYbXuUY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260622175928-b703f567277d/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= google.golang.org/grpc v1.81.1 h1:VnnIIZ88UzOOKLukQi+ImGz8O1Wdp8nAGGnvOfEIWQQ= google.golang.org/grpc v1.81.1/go.mod h1:xGH9GfzOyMTGIOXBJmXt+BX/V0kcdQbdcuwQ/zNw42I= google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= From ceb45c45a70113735c852ba3eb34e0e16c03d2b5 Mon Sep 17 00:00:00 2001 From: Antonio Lobato Date: Thu, 25 Jun 2026 10:31:35 -0700 Subject: [PATCH 022/156] fix(google): prevent parallel tool calls from dropping thought_signature (#298) --- providers/google/google.go | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/providers/google/google.go b/providers/google/google.go index f82314102..5930ba93d 100644 --- a/providers/google/google.go +++ b/providers/google/google.go @@ -1359,12 +1359,15 @@ func (g languageModel) mapResponse(response *genai.GenerateContentResponse, warn if !ok { continue } - reasoningContent.ProviderMetadata = fantasy.ProviderMetadata{ - Name: metadata, + // Only use it if it doesn't already have a signature! + if reasoningContent.ProviderMetadata == nil || reasoningContent.ProviderMetadata[Name] == nil { + reasoningContent.ProviderMetadata = fantasy.ProviderMetadata{ + Name: metadata, + } + content[i] = reasoningContent + foundReasoning = true + break } - content[i] = reasoningContent - foundReasoning = true - break } } if !foundReasoning { From 629b6ad805dedf57763afcb4e93ca7c2913649e1 Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Fri, 26 Jun 2026 10:10:55 -0300 Subject: [PATCH 023/156] feat(vercel): add vercel context limit error parsing (#299) Parse "Input too long" errors from Vercel AI Gateway to extract token counts and mark as context-too-large errors. Assisted-by: Crush:qwen3.7-plus --- providers/openai/error.go | 7 +++++++ providers/openai/openai_test.go | 7 +++++++ 2 files changed, 14 insertions(+) diff --git a/providers/openai/error.go b/providers/openai/error.go index 873105f71..12dff7511 100644 --- a/providers/openai/error.go +++ b/providers/openai/error.go @@ -16,6 +16,7 @@ import ( var ( openaiContextPattern = regexp.MustCompile(`maximum context length (?:is|of) (\d+) tokens.*?(?:resulted in|requested) ~?(\d+) tokens`) alibabaContextPattern = regexp.MustCompile(`Range of input length should be \[\d+,\s*(\d+)\]`) + vercelContextPattern = regexp.MustCompile(`Input too long:\s*(\d+)\s*input tokens,\s*limit is\s*(\d+)`) ) func toProviderErr(err error) error { @@ -58,6 +59,12 @@ func parseContextTooLargeError(message string, providerErr *fantasy.ProviderErro if matches := alibabaContextPattern.FindStringSubmatch(message); matches != nil { providerErr.ContextTooLargeErr = true providerErr.ContextMaxTokens, _ = strconv.Atoi(matches[1]) + return + } + if matches := vercelContextPattern.FindStringSubmatch(message); matches != nil { + providerErr.ContextTooLargeErr = true + providerErr.ContextUsedTokens, _ = strconv.Atoi(matches[1]) + providerErr.ContextMaxTokens, _ = strconv.Atoi(matches[2]) } } diff --git a/providers/openai/openai_test.go b/providers/openai/openai_test.go index 7663a0405..2d4a8785d 100644 --- a/providers/openai/openai_test.go +++ b/providers/openai/openai_test.go @@ -3856,6 +3856,13 @@ func TestParseContextTooLargeError(t *testing.T) { wantErr: true, wantMax: 245760, }, + { + name: "matches vercel format", + message: "Input too long: 518063 input tokens, limit is 262144 for this model", + wantErr: true, + wantUsed: 518063, + wantMax: 262144, + }, { name: "does not match unrelated error", message: "invalid api key", From 0cfad67fef53df5c1fcb7cb3fc43979dae5f4364 Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Fri, 26 Jun 2026 10:11:28 -0300 Subject: [PATCH 024/156] v0.34.0 --- version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.txt b/version.txt index c9ec1d542..85e60ed18 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -0.33.2 +0.34.0 From 34ed8e7ce851f3e31665e30b5827393e287ebedc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 29 Jun 2026 09:18:32 +0000 Subject: [PATCH 025/156] chore(deps): bump github.com/ardanlabs/kronk in the kronk group (#301) Bumps the kronk group with 1 update: [github.com/ardanlabs/kronk](https://github.com/ardanlabs/kronk). Updates `github.com/ardanlabs/kronk` from 1.28.4 to 1.28.5 - [Release notes](https://github.com/ardanlabs/kronk/releases) - [Commits](https://github.com/ardanlabs/kronk/compare/v1.28.4...v1.28.5) --- updated-dependencies: - dependency-name: github.com/ardanlabs/kronk dependency-version: 1.28.5 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: kronk ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 9c7718473..b7d417e10 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.26.4 require ( charm.land/x/vcr v0.1.1 cloud.google.com/go/auth v0.20.0 - github.com/ardanlabs/kronk v1.28.4 + github.com/ardanlabs/kronk v1.28.5 github.com/aws/aws-sdk-go-v2 v1.42.0 github.com/aws/aws-sdk-go-v2/config v1.32.25 github.com/aws/smithy-go v1.27.2 diff --git a/go.sum b/go.sum index a1568821c..10e17bca4 100644 --- a/go.sum +++ b/go.sum @@ -40,8 +40,8 @@ github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapp github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.57.0/go.mod h1:YqwkQPrWSC7+byyc1VlKbWLBF5JsW5IoL6xUkemYSXk= github.com/ardanlabs/jinja v1.4.0 h1:9iE0/wF4zhcws1CYZCWqJTQP8YuhC4FjycBGzCTuOFw= github.com/ardanlabs/jinja v1.4.0/go.mod h1:aXXzlJfjA+T3XNKA/YT5ZtDq2VJxt5a5siZ8cl9B35Q= -github.com/ardanlabs/kronk v1.28.4 h1:dfyvJLnCmi3xgNASI4bzA9rfhPITTbd8WfbYeCUw+Fs= -github.com/ardanlabs/kronk v1.28.4/go.mod h1:Gq9Rjp+GGgpWcsgsOF73TCo8nl5JHaBld1K5BMYWcao= +github.com/ardanlabs/kronk v1.28.5 h1:MAXucuRdKm1DkSHwy77EA8Hulwq+5CFdi3yQ4LDlkpE= +github.com/ardanlabs/kronk v1.28.5/go.mod h1:Gq9Rjp+GGgpWcsgsOF73TCo8nl5JHaBld1K5BMYWcao= github.com/aws/aws-sdk-go-v2 v1.42.0 h1:XvXMJTkFQtpBKIWZnmr9ZEOc2InWM2yldjXEJ/bymhA= github.com/aws/aws-sdk-go-v2 v1.42.0/go.mod h1:27+ACypSLljLAEKsCYOmrjKh83vuTRkuAe9Uv/3A4bg= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.13 h1:p1BBrg/Hhp6uK7zpejeI8QFXHJeC/mynzi04Sl03k9g= From 6cb700a4c0c7965e17741cd292e1eb24ae34a7c7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 29 Jun 2026 09:19:42 +0000 Subject: [PATCH 026/156] chore(deps): bump the all group with 2 updates (#300) Bumps the all group with 2 updates: [github.com/aws/smithy-go](https://github.com/aws/smithy-go) and [google.golang.org/genai](https://github.com/googleapis/go-genai). Updates `github.com/aws/smithy-go` from 1.27.2 to 1.27.3 - [Release notes](https://github.com/aws/smithy-go/releases) - [Changelog](https://github.com/aws/smithy-go/blob/main/CHANGELOG.md) - [Commits](https://github.com/aws/smithy-go/compare/v1.27.2...v1.27.3) Updates `google.golang.org/genai` from 1.61.0 to 1.62.0 - [Release notes](https://github.com/googleapis/go-genai/releases) - [Changelog](https://github.com/googleapis/go-genai/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/go-genai/compare/v1.61.0...v1.62.0) --- updated-dependencies: - dependency-name: github.com/aws/smithy-go dependency-version: 1.27.3 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all - dependency-name: google.golang.org/genai dependency-version: 1.62.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: all ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 4 ++-- go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index b7d417e10..36a79b265 100644 --- a/go.mod +++ b/go.mod @@ -8,7 +8,7 @@ require ( github.com/ardanlabs/kronk v1.28.5 github.com/aws/aws-sdk-go-v2 v1.42.0 github.com/aws/aws-sdk-go-v2/config v1.32.25 - github.com/aws/smithy-go v1.27.2 + github.com/aws/smithy-go v1.27.3 github.com/charmbracelet/anthropic-sdk-go v0.0.0-20260223140439-63879b0b8dab github.com/charmbracelet/openai-go v0.0.0-20260617131321-5e4b9c18c4be github.com/charmbracelet/x/exp/slice v0.0.0-20250904123553-b4e2667e5ad5 @@ -20,7 +20,7 @@ require ( github.com/kaptinlin/jsonschema v0.9.2 github.com/stretchr/testify v1.11.1 golang.org/x/oauth2 v0.36.0 - google.golang.org/genai v1.61.0 + google.golang.org/genai v1.62.0 ) require ( diff --git a/go.sum b/go.sum index 10e17bca4..8edcbf458 100644 --- a/go.sum +++ b/go.sum @@ -76,8 +76,8 @@ github.com/aws/aws-sdk-go-v2/service/ssooidc v1.36.6 h1:yLr03zQE/5Eu5l3QU0Si+xMb github.com/aws/aws-sdk-go-v2/service/ssooidc v1.36.6/go.mod h1:Q5N6icH+KJZDLh+ESNwzdv6cZ6vLFF/egy3IOxWhmz4= github.com/aws/aws-sdk-go-v2/service/sts v1.43.3 h1:VrIhKRCSK1umelSgB9RghvA9RTUYeQffyAS5ApXehNI= github.com/aws/aws-sdk-go-v2/service/sts v1.43.3/go.mod h1:r8wkDOuLaaMFqFiYAb8dGY2A3gJCOujMc6CFOVC4Zhc= -github.com/aws/smithy-go v1.27.2 h1:y9NPmSE6am6LjEFPfqHqG/jJk7AauQvhCJONKh7kpzk= -github.com/aws/smithy-go v1.27.2/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc= +github.com/aws/smithy-go v1.27.3 h1:F3Zb497UhhskkfpJmfkXswyo+t0sh9OTBnIHjogWbVY= +github.com/aws/smithy-go v1.27.3/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d h1:xDfNPAt8lFiC1UJrqV3uuy861HCTo708pDMbjHHdCas= @@ -263,8 +263,8 @@ gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4= gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E= google.golang.org/api v0.286.0 h1:TdTXMvzYKnWV1/lPbCdbXRqBrkDqjPto22H2xeZZ8LI= google.golang.org/api v0.286.0/go.mod h1:NlOlUIr8MPoIhT9Bb/oUnRuHbJOLwxb6JSYJM8Yz+jQ= -google.golang.org/genai v1.61.0 h1:wCyNGiaC9q5A59B80zuEtNBhq3ypEvICFkZYOfK7IO0= -google.golang.org/genai v1.61.0/go.mod h1:mDdPDFXo1Ats7f1WXVyZgWb/CkMzFWTWJruIMy7hGIU= +google.golang.org/genai v1.62.0 h1:PaBju84orf4Vbcc6OfHe4vxhxhjwulKTgOpEc3iIc00= +google.golang.org/genai v1.62.0/go.mod h1:mDdPDFXo1Ats7f1WXVyZgWb/CkMzFWTWJruIMy7hGIU= google.golang.org/genproto v0.0.0-20260622175928-b703f567277d h1:CP5omUq8AJTiWMrPKM1WRLJ7zZeXd9OPcQD3TbBNAyY= google.golang.org/genproto v0.0.0-20260622175928-b703f567277d/go.mod h1:DrwuGJgFSEVNpv3S5Q5VxhRTvdnjauw9GtvwVOEARfA= google.golang.org/genproto/googleapis/api v0.0.0-20260622175928-b703f567277d h1:xr2lwHI91bn3UiXcnyzRMQjp2LRiM8wEHzwUaE0YhTs= From bfdb4ad69389517ef79024b6471e891e3e3ab417 Mon Sep 17 00:00:00 2001 From: Kieran Klukas Date: Tue, 30 Jun 2026 13:08:44 -0400 Subject: [PATCH 027/156] feat: enable prompt caching for OpenAI-compatible models that need per-message cache markers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Some providers (notably Alibaba Qwen 3.6) only cache prompts when each cached message block is explicitly tagged, unlike providers that cache automatically. Previously there was no way to attach those tags, so cache hits were always zero for those models and every request paid full price. This adds a general way to attach non-standard fields onto individual message content blocks, mirroring the existing root-level extra-body mechanism. When such fields are present the message is sent in the array form the provider requires; otherwise the simpler plain-text form is kept. The same mechanism covers any future provider extension without further changes. 💘 Generated with Crush Assisted-by: Crush:us.anthropic.claude-opus-4-8 --- .../openaicompat/language_model_hooks.go | 79 +++- providers/openaicompat/openaicompat_test.go | 363 ++++++++++++++++++ providers/openaicompat/provider_options.go | 80 +++- 3 files changed, 507 insertions(+), 15 deletions(-) diff --git a/providers/openaicompat/language_model_hooks.go b/providers/openaicompat/language_model_hooks.go index 4bbdd2c03..acdb62fb1 100644 --- a/providers/openaicompat/language_model_hooks.go +++ b/providers/openaicompat/language_model_hooks.go @@ -15,6 +15,23 @@ import ( const reasoningStartedCtx = "reasoning_started" +// buildTextBlock creates a text content block, applying any provider-specific extra +// fields (e.g. Qwen's cache_control) onto it. Part-level fields override message-level +// fields. Returns the block and whether any extra fields were applied; when they were, +// the message content must be serialized in array form. +func buildTextBlock(text string, partOpts, msgOpts fantasy.ProviderOptions) (*openaisdk.ChatCompletionContentPartTextParam, bool) { + block := &openaisdk.ChatCompletionContentPartTextParam{Text: text} + fields := getContentExtraFields(partOpts) + if len(fields) == 0 { + fields = getContentExtraFields(msgOpts) + } + if len(fields) > 0 { + block.SetExtraFields(fields) + return block, true + } + return block, false +} + // PrepareCallFunc prepares the call for the language model. func PrepareCallFunc(model fantasy.LanguageModel, params *openaisdk.ChatCompletionNewParams, call fantasy.Call) ([]fantasy.CallWarning, error) { providerOptions := &ProviderOptions{} @@ -147,7 +164,9 @@ func ToPromptFunc(prompt fantasy.Prompt, _, _ string) ([]openaisdk.ChatCompletio for _, msg := range prompt { switch msg.Role { case fantasy.MessageRoleSystem: - var systemPromptParts []string + var blocks []openaisdk.ChatCompletionContentPartTextParam + useArrayForm := false + for _, c := range msg.Content { if c.GetType() != fantasy.ContentTypeText { warnings = append(warnings, fantasy.CallWarning{ @@ -164,22 +183,38 @@ func ToPromptFunc(prompt fantasy.Prompt, _, _ string) ([]openaisdk.ChatCompletio }) continue } - text := textPart.Text - if strings.TrimSpace(text) != "" { - systemPromptParts = append(systemPromptParts, textPart.Text) + if strings.TrimSpace(textPart.Text) == "" { + continue } + + block, hasExtra := buildTextBlock(textPart.Text, textPart.ProviderOptions, msg.ProviderOptions) + useArrayForm = useArrayForm || hasExtra + blocks = append(blocks, *block) } - if len(systemPromptParts) == 0 { + + if len(blocks) == 0 { warnings = append(warnings, fantasy.CallWarning{ Type: fantasy.CallWarningTypeOther, Message: "system prompt has no text parts", }) continue } - messages = append(messages, openaisdk.SystemMessage(strings.Join(systemPromptParts, "\n"))) + + if useArrayForm { + messages = append(messages, openaisdk.SystemMessage(blocks)) + } else { + texts := make([]string, len(blocks)) + for i, b := range blocks { + texts[i] = b.Text + } + messages = append(messages, openaisdk.SystemMessage(strings.Join(texts, "\n"))) + } case fantasy.MessageRoleUser: - // simple user message just text content - if len(msg.Content) == 1 && msg.Content[0].GetType() == fantasy.ContentTypeText { + // simple user message just text content. Messages carrying extra + // content fields fall through to the array path below, which applies + // them via buildTextBlock. + if len(msg.Content) == 1 && msg.Content[0].GetType() == fantasy.ContentTypeText && + !hasContentExtraFields(msg.Content[0].Options(), msg.ProviderOptions) { textPart, ok := fantasy.AsContentType[fantasy.TextPart](msg.Content[0]) if !ok { warnings = append(warnings, fantasy.CallWarning{ @@ -204,10 +239,9 @@ func ToPromptFunc(prompt fantasy.Prompt, _, _ string) ([]openaisdk.ChatCompletio }) continue } + textBlock, _ := buildTextBlock(textPart.Text, textPart.ProviderOptions, msg.ProviderOptions) content = append(content, openaisdk.ChatCompletionContentPartUnionParam{ - OfText: &openaisdk.ChatCompletionContentPartTextParam{ - Text: textPart.Text, - }, + OfText: textBlock, }) case fantasy.ContentTypeFile: filePart, ok := fantasy.AsContentType[fantasy.FilePart](c) @@ -324,7 +358,15 @@ func ToPromptFunc(prompt fantasy.Prompt, _, _ string) ([]openaisdk.ChatCompletio }) continue } - messages = append(messages, openaisdk.AssistantMessage(textPart.Text)) + // Extra content fields (e.g. cache_control) require array form. + textBlock, hasExtra := buildTextBlock(textPart.Text, textPart.ProviderOptions, msg.ProviderOptions) + if hasExtra { + messages = append(messages, openaisdk.AssistantMessage([]openaisdk.ChatCompletionAssistantMessageParamContentArrayOfContentPartUnion{ + {OfText: textBlock}, + })) + } else { + messages = append(messages, openaisdk.AssistantMessage(textPart.Text)) + } continue } assistantMsg := openaisdk.ChatCompletionAssistantMessageParam{ @@ -342,8 +384,17 @@ func ToPromptFunc(prompt fantasy.Prompt, _, _ string) ([]openaisdk.ChatCompletio }) continue } - assistantMsg.Content = openaisdk.ChatCompletionAssistantMessageParamContentUnion{ - OfString: param.NewOpt(textPart.Text), + textBlock, hasExtra := buildTextBlock(textPart.Text, textPart.ProviderOptions, msg.ProviderOptions) + if hasExtra { + assistantMsg.Content = openaisdk.ChatCompletionAssistantMessageParamContentUnion{ + OfArrayOfContentParts: []openaisdk.ChatCompletionAssistantMessageParamContentArrayOfContentPartUnion{ + {OfText: textBlock}, + }, + } + } else { + assistantMsg.Content = openaisdk.ChatCompletionAssistantMessageParamContentUnion{ + OfString: param.NewOpt(textPart.Text), + } } case fantasy.ContentTypeReasoning: reasoningPart, ok := fantasy.AsContentType[fantasy.ReasoningPart](c) diff --git a/providers/openaicompat/openaicompat_test.go b/providers/openaicompat/openaicompat_test.go index c48eb087d..3482a3d58 100644 --- a/providers/openaicompat/openaicompat_test.go +++ b/providers/openaicompat/openaicompat_test.go @@ -487,3 +487,366 @@ func TestToPromptFunc_DropsEmptyMessages(t *testing.T) { require.Empty(t, warnings) }) } + +func TestToPromptFunc_ContentExtraFields(t *testing.T) { + t.Parallel() + + t.Run("should add cache_control to user message with content array", func(t *testing.T) { + t.Parallel() + + prompt := fantasy.Prompt{ + { + Role: fantasy.MessageRoleUser, + Content: []fantasy.MessagePart{ + fantasy.TextPart{ + Text: "Analyze this document.", + ProviderOptions: fantasy.ProviderOptions{ + Name: &ContentExtraFields{ + Fields: map[string]any{"cache_control": map[string]string{"type": "ephemeral"}}, + }, + }, + }, + }, + }, + } + + messages, warnings := ToPromptFunc(prompt, "", "") + + require.Empty(t, warnings) + require.Len(t, messages, 1) + + msg := messages[0].OfUser + require.NotNil(t, msg) + // Should use content array format when cache_control is present + require.Equal(t, "", msg.Content.OfString.Value) + require.NotNil(t, msg.Content.OfArrayOfContentParts) + require.Len(t, msg.Content.OfArrayOfContentParts, 1) + + textBlock := msg.Content.OfArrayOfContentParts[0].OfText + require.NotNil(t, textBlock) + require.Equal(t, "Analyze this document.", textBlock.Text) + + // Check cache_control in extra fields + extraFields := textBlock.ExtraFields() + cacheControl, hasCacheControl := extraFields["cache_control"] + require.True(t, hasCacheControl) + cacheMap, ok := cacheControl.(map[string]string) + require.True(t, ok) + require.Equal(t, "ephemeral", cacheMap["type"]) + }) + + t.Run("should add cache_control to system message with content array", func(t *testing.T) { + t.Parallel() + + prompt := fantasy.Prompt{ + { + Role: fantasy.MessageRoleSystem, + Content: []fantasy.MessagePart{ + fantasy.TextPart{ + Text: "You are a helpful assistant.", + ProviderOptions: fantasy.ProviderOptions{ + Name: &ContentExtraFields{ + Fields: map[string]any{"cache_control": map[string]string{"type": "ephemeral"}}, + }, + }, + }, + }, + }, + { + Role: fantasy.MessageRoleUser, + Content: []fantasy.MessagePart{ + fantasy.TextPart{Text: "Hello"}, + }, + }, + } + + messages, warnings := ToPromptFunc(prompt, "", "") + + require.Empty(t, warnings) + require.Len(t, messages, 2) + + systemMsg := messages[0].OfSystem + require.NotNil(t, systemMsg) + // Should use content array format when cache_control is present + require.Equal(t, "", systemMsg.Content.OfString.Value) + require.NotNil(t, systemMsg.Content.OfArrayOfContentParts) + require.Len(t, systemMsg.Content.OfArrayOfContentParts, 1) + + textBlock := systemMsg.Content.OfArrayOfContentParts[0] + require.Equal(t, "You are a helpful assistant.", textBlock.Text) + + // Check cache_control in extra fields + extraFields := textBlock.ExtraFields() + cacheControl, hasCacheControl := extraFields["cache_control"] + require.True(t, hasCacheControl) + cacheMap, ok := cacheControl.(map[string]string) + require.True(t, ok) + require.Equal(t, "ephemeral", cacheMap["type"]) + }) + + t.Run("should add cache_control to assistant message with content array", func(t *testing.T) { + t.Parallel() + + prompt := fantasy.Prompt{ + { + Role: fantasy.MessageRoleUser, + Content: []fantasy.MessagePart{ + fantasy.TextPart{Text: "Hello"}, + }, + }, + { + Role: fantasy.MessageRoleAssistant, + Content: []fantasy.MessagePart{ + fantasy.TextPart{ + Text: "Hi there!", + ProviderOptions: fantasy.ProviderOptions{ + Name: &ContentExtraFields{ + Fields: map[string]any{"cache_control": map[string]string{"type": "ephemeral"}}, + }, + }, + }, + }, + }, + } + + messages, warnings := ToPromptFunc(prompt, "", "") + + require.Empty(t, warnings) + require.Len(t, messages, 2) + + assistantMsg := messages[1].OfAssistant + require.NotNil(t, assistantMsg) + // Should use content array format when cache_control is present + require.Equal(t, "", assistantMsg.Content.OfString.Value) + require.NotNil(t, assistantMsg.Content.OfArrayOfContentParts) + require.Len(t, assistantMsg.Content.OfArrayOfContentParts, 1) + + textBlock := assistantMsg.Content.OfArrayOfContentParts[0].OfText + require.NotNil(t, textBlock) + require.Equal(t, "Hi there!", textBlock.Text) + + // Check cache_control in extra fields + extraFields := textBlock.ExtraFields() + cacheControl, hasCacheControl := extraFields["cache_control"] + require.True(t, hasCacheControl) + cacheMap, ok := cacheControl.(map[string]string) + require.True(t, ok) + require.Equal(t, "ephemeral", cacheMap["type"]) + }) + + t.Run("should not use content array for messages without cache_control", func(t *testing.T) { + t.Parallel() + + prompt := fantasy.Prompt{ + { + Role: fantasy.MessageRoleUser, + Content: []fantasy.MessagePart{ + fantasy.TextPart{Text: "Hello"}, + }, + }, + } + + messages, warnings := ToPromptFunc(prompt, "", "") + + require.Empty(t, warnings) + require.Len(t, messages, 1) + + msg := messages[0].OfUser + require.NotNil(t, msg) + // Should use string format when no cache_control + require.NotEqual(t, "", msg.Content.OfString.Value) + require.Equal(t, "Hello", msg.Content.OfString.Value) + require.Nil(t, msg.Content.OfArrayOfContentParts) + }) + + t.Run("should handle multiple content parts with mixed cache_control", func(t *testing.T) { + t.Parallel() + + prompt := fantasy.Prompt{ + { + Role: fantasy.MessageRoleUser, + Content: []fantasy.MessagePart{ + fantasy.TextPart{Text: "Context: "}, + fantasy.TextPart{ + Text: "Large document here...", + ProviderOptions: fantasy.ProviderOptions{ + Name: &ContentExtraFields{ + Fields: map[string]any{"cache_control": map[string]string{"type": "ephemeral"}}, + }, + }, + }, + }, + }, + } + + messages, warnings := ToPromptFunc(prompt, "", "") + + require.Empty(t, warnings) + require.Len(t, messages, 1) + + msg := messages[0].OfUser + require.NotNil(t, msg) + // Should use content array format since one part has cache_control + require.Equal(t, "", msg.Content.OfString.Value) + require.NotNil(t, msg.Content.OfArrayOfContentParts) + require.Len(t, msg.Content.OfArrayOfContentParts, 2) + + // First part should not have cache_control + firstBlock := msg.Content.OfArrayOfContentParts[0].OfText + require.NotNil(t, firstBlock) + require.Equal(t, "Context: ", firstBlock.Text) + require.Empty(t, firstBlock.ExtraFields()) + + // Second part should have cache_control + secondBlock := msg.Content.OfArrayOfContentParts[1].OfText + require.NotNil(t, secondBlock) + require.Equal(t, "Large document here...", secondBlock.Text) + extraFields := secondBlock.ExtraFields() + cacheControl, hasCacheControl := extraFields["cache_control"] + require.True(t, hasCacheControl) + cacheMap, ok := cacheControl.(map[string]string) + require.True(t, ok) + require.Equal(t, "ephemeral", cacheMap["type"]) + }) + + t.Run("should fall back to message-level cache_control when part has none", func(t *testing.T) { + t.Parallel() + + prompt := fantasy.Prompt{ + { + Role: fantasy.MessageRoleUser, + Content: []fantasy.MessagePart{ + fantasy.TextPart{ + Text: "Hello", + // No cache_control on this part + }, + }, + // But cache_control on the message itself + ProviderOptions: fantasy.ProviderOptions{ + Name: &ContentExtraFields{ + Fields: map[string]any{"cache_control": map[string]string{"type": "ephemeral"}}, + }, + }, + }, + } + + messages, warnings := ToPromptFunc(prompt, "", "") + + require.Empty(t, warnings) + require.Len(t, messages, 1) + + msg := messages[0].OfUser + require.NotNil(t, msg) + // Should use content array format due to message-level cache_control + require.Equal(t, "", msg.Content.OfString.Value) + require.NotNil(t, msg.Content.OfArrayOfContentParts) + require.Len(t, msg.Content.OfArrayOfContentParts, 1) + + textBlock := msg.Content.OfArrayOfContentParts[0].OfText + require.NotNil(t, textBlock) + require.Equal(t, "Hello", textBlock.Text) + + // Check cache_control in extra fields + extraFields := textBlock.ExtraFields() + cacheControl, hasCacheControl := extraFields["cache_control"] + require.True(t, hasCacheControl) + cacheMap, ok := cacheControl.(map[string]string) + require.True(t, ok) + require.Equal(t, "ephemeral", cacheMap["type"]) + }) + + t.Run("should prefer part-level cache_control over message-level", func(t *testing.T) { + t.Parallel() + + prompt := fantasy.Prompt{ + { + Role: fantasy.MessageRoleUser, + Content: []fantasy.MessagePart{ + fantasy.TextPart{ + Text: "First part", + // Part-level cache_control with different type + ProviderOptions: fantasy.ProviderOptions{ + Name: &ContentExtraFields{ + Fields: map[string]any{"cache_control": map[string]string{"type": "ephemeral"}}, + }, + }, + }, + fantasy.TextPart{Text: "Second part"}, // No part-level + }, + // Message-level cache_control + ProviderOptions: fantasy.ProviderOptions{ + Name: &ContentExtraFields{ + Fields: map[string]any{"cache_control": map[string]string{"type": "persistent"}}, + }, + }, + }, + } + + messages, warnings := ToPromptFunc(prompt, "", "") + + require.Empty(t, warnings) + require.Len(t, messages, 1) + + msg := messages[0].OfUser + require.NotNil(t, msg) + require.NotNil(t, msg.Content.OfArrayOfContentParts) + require.Len(t, msg.Content.OfArrayOfContentParts, 2) + + // First part should have ephemeral (part-level wins) + firstBlock := msg.Content.OfArrayOfContentParts[0].OfText + require.NotNil(t, firstBlock) + extraFields := firstBlock.ExtraFields() + cacheControl := extraFields["cache_control"].(map[string]string) + require.Equal(t, "ephemeral", cacheControl["type"]) + + // Second part should have persistent (message-level fallback) + secondBlock := msg.Content.OfArrayOfContentParts[1].OfText + require.NotNil(t, secondBlock) + extraFields = secondBlock.ExtraFields() + cacheControl = extraFields["cache_control"].(map[string]string) + require.Equal(t, "persistent", cacheControl["type"]) + }) + + t.Run("should add cache_control to multi-part assistant message with tool calls", func(t *testing.T) { + t.Parallel() + + prompt := fantasy.Prompt{ + { + Role: fantasy.MessageRoleAssistant, + Content: []fantasy.MessagePart{ + fantasy.TextPart{ + Text: "Let me check that.", + ProviderOptions: fantasy.ProviderOptions{ + Name: &ContentExtraFields{ + Fields: map[string]any{"cache_control": map[string]string{"type": "ephemeral"}}, + }, + }, + }, + fantasy.ToolCallPart{ + ToolCallID: "call_1", + ToolName: "lookup", + Input: "{}", + }, + }, + }, + } + + messages, warnings := ToPromptFunc(prompt, "", "") + + require.Empty(t, warnings) + require.Len(t, messages, 1) + + assistantMsg := messages[0].OfAssistant + require.NotNil(t, assistantMsg) + // Tool calls force the multi-part path; cache_control must still survive. + require.Equal(t, "", assistantMsg.Content.OfString.Value) + require.Len(t, assistantMsg.Content.OfArrayOfContentParts, 1) + require.Len(t, assistantMsg.ToolCalls, 1) + + textBlock := assistantMsg.Content.OfArrayOfContentParts[0].OfText + require.NotNil(t, textBlock) + require.Equal(t, "Let me check that.", textBlock.Text) + cacheControl := textBlock.ExtraFields()["cache_control"].(map[string]string) + require.Equal(t, "ephemeral", cacheControl["type"]) + }) +} diff --git a/providers/openaicompat/provider_options.go b/providers/openaicompat/provider_options.go index 1c5662c3c..8c16db999 100644 --- a/providers/openaicompat/provider_options.go +++ b/providers/openaicompat/provider_options.go @@ -10,7 +10,8 @@ import ( // Global type identifiers for OpenAI-compatible provider data. const ( - TypeProviderOptions = Name + ".options" + TypeProviderOptions = Name + ".options" + TypeContentExtraFields = Name + ".content_extra_fields" ) // Register OpenAI-compatible provider-specific types with the global registry. @@ -22,6 +23,13 @@ func init() { } return &v, nil }) + fantasy.RegisterProviderType(TypeContentExtraFields, func(data []byte) (fantasy.ProviderOptionsData, error) { + var v ContentExtraFields + if err := json.Unmarshal(data, &v); err != nil { + return nil, err + } + return &v, nil + }) } // ProviderOptions represents additional options for the OpenAI-compatible provider. @@ -81,3 +89,73 @@ func ParseOptions(data map[string]any) (*ProviderOptions, error) { } return &options, nil } + +// ContentExtraFields injects non-standard JSON fields onto an individual message +// content block. It is the content-block analogue of ProviderOptions.ExtraBody +// (which injects fields onto the request root), and exists to support provider +// extensions that the OpenAI API format does not model. +// +// When a content part carries this option, its content is automatically serialized +// in array form (rather than as a plain string), and the given fields are merged +// onto the text block. +// +// The primary use case is explicit prompt caching on Alibaba Cloud Qwen 3.6 models, +// which expect a non-standard cache_control field on cached content blocks: +// +// textPart := fantasy.TextPart{ +// Text: "Large system prompt or document (min 1024 tokens)...", +// ProviderOptions: fantasy.ProviderOptions{ +// "openai-compat": &openaicompat.ContentExtraFields{ +// Fields: map[string]any{ +// "cache_control": map[string]string{"type": "ephemeral"}, +// }, +// }, +// }, +// } +// +// Providers that do not recognize the injected fields will ignore them. +// +// Note: at the message level this shares a provider-options key with +// ProviderOptions, so a single message cannot carry both message-level +// ProviderOptions and message-level ContentExtraFields. Set ContentExtraFields +// at the content-part level to avoid that conflict. +type ContentExtraFields struct { + Fields map[string]any `json:"fields"` +} + +// Options implements the ProviderOptions interface. +func (*ContentExtraFields) Options() {} + +// MarshalJSON implements custom JSON marshaling with type info for ContentExtraFields. +func (o ContentExtraFields) MarshalJSON() ([]byte, error) { + type plain ContentExtraFields + return fantasy.MarshalProviderType(TypeContentExtraFields, plain(o)) +} + +// UnmarshalJSON implements custom JSON unmarshaling with type info for ContentExtraFields. +func (o *ContentExtraFields) UnmarshalJSON(data []byte) error { + type plain ContentExtraFields + var p plain + if err := fantasy.UnmarshalProviderType(data, &p); err != nil { + return err + } + *o = ContentExtraFields(p) + return nil +} + +// getContentExtraFields returns the extra content-block fields from provider options, +// or nil if none are set. +func getContentExtraFields(providerOptions fantasy.ProviderOptions) map[string]any { + if options, ok := providerOptions[Name]; ok { + if options, ok := options.(*ContentExtraFields); ok { + return options.Fields + } + } + return nil +} + +// hasContentExtraFields reports whether extra content-block fields are present on +// either the part-level or message-level provider options. +func hasContentExtraFields(partOpts, msgOpts fantasy.ProviderOptions) bool { + return len(getContentExtraFields(partOpts)) > 0 || len(getContentExtraFields(msgOpts)) > 0 +} From 59d70cae06163c87abf1974950e77e2da90e573a Mon Sep 17 00:00:00 2001 From: Kieran Klukas Date: Tue, 30 Jun 2026 16:11:58 -0400 Subject: [PATCH 028/156] v0.35.0 --- version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.txt b/version.txt index 85e60ed18..7b52f5e51 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -0.34.0 +0.35.0 From ff1376076f2369387e4257758196f66b0c771bfe Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 6 Jul 2026 09:19:23 +0000 Subject: [PATCH 029/156] chore(deps): bump the all group with 3 updates (#306) Bumps the all group with 3 updates: [github.com/aws/aws-sdk-go-v2](https://github.com/aws/aws-sdk-go-v2), [github.com/aws/aws-sdk-go-v2/config](https://github.com/aws/aws-sdk-go-v2) and [github.com/kaptinlin/jsonschema](https://github.com/kaptinlin/jsonschema). Updates `github.com/aws/aws-sdk-go-v2` from 1.42.0 to 1.42.1 - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/v1.42.0...v1.42.1) Updates `github.com/aws/aws-sdk-go-v2/config` from 1.32.25 to 1.32.27 - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/config/v1.32.25...config/v1.32.27) Updates `github.com/kaptinlin/jsonschema` from 0.9.2 to 0.9.3 - [Release notes](https://github.com/kaptinlin/jsonschema/releases) - [Commits](https://github.com/kaptinlin/jsonschema/compare/v0.9.2...v0.9.3) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2 dependency-version: 1.42.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all - dependency-name: github.com/aws/aws-sdk-go-v2/config dependency-version: 1.32.27 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all - dependency-name: github.com/kaptinlin/jsonschema dependency-version: 0.9.3 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 32 ++++++++++++++--------------- go.sum | 64 +++++++++++++++++++++++++++++----------------------------- 2 files changed, 48 insertions(+), 48 deletions(-) diff --git a/go.mod b/go.mod index 36a79b265..e99a09da8 100644 --- a/go.mod +++ b/go.mod @@ -6,8 +6,8 @@ require ( charm.land/x/vcr v0.1.1 cloud.google.com/go/auth v0.20.0 github.com/ardanlabs/kronk v1.28.5 - github.com/aws/aws-sdk-go-v2 v1.42.0 - github.com/aws/aws-sdk-go-v2/config v1.32.25 + github.com/aws/aws-sdk-go-v2 v1.42.1 + github.com/aws/aws-sdk-go-v2/config v1.32.27 github.com/aws/smithy-go v1.27.3 github.com/charmbracelet/anthropic-sdk-go v0.0.0-20260223140439-63879b0b8dab github.com/charmbracelet/openai-go v0.0.0-20260617131321-5e4b9c18c4be @@ -17,7 +17,7 @@ require ( github.com/go-viper/mapstructure/v2 v2.5.0 github.com/google/uuid v1.6.0 github.com/joho/godotenv v1.5.1 - github.com/kaptinlin/jsonschema v0.9.2 + github.com/kaptinlin/jsonschema v0.9.3 github.com/stretchr/testify v1.11.1 golang.org/x/oauth2 v0.36.0 google.golang.org/genai v1.62.0 @@ -38,20 +38,20 @@ require ( github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.57.0 // indirect github.com/ardanlabs/jinja v1.4.0 // indirect github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.13 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.19.24 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.29 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.29 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.29 // indirect - github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.30 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.12 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.19.26 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.30 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.30 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.30 // indirect + github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.31 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.13 // indirect github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.22 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.29 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.30 // indirect github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.29 // indirect github.com/aws/aws-sdk-go-v2/service/s3 v1.104.0 // indirect - github.com/aws/aws-sdk-go-v2/service/signin v1.2.0 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.31.3 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.36.6 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.43.3 // indirect + github.com/aws/aws-sdk-go-v2/service/signin v1.2.2 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.31.5 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.36.8 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.43.5 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d // indirect github.com/cenkalti/backoff/v5 v5.0.3 // indirect @@ -63,7 +63,7 @@ require ( github.com/envoyproxy/protoc-gen-validate v1.3.3 // indirect github.com/felixge/httpsnoop v1.1.0 // indirect github.com/go-jose/go-jose/v4 v4.1.4 // indirect - github.com/go-json-experiment/json v0.0.0-20260601182631-00ed12fed2a6 // indirect + github.com/go-json-experiment/json v0.0.0-20260623181947-01eb4420fa68 // indirect github.com/go-logr/logr v1.4.3 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/goccy/go-yaml v1.19.2 // indirect @@ -79,7 +79,7 @@ require ( github.com/hashicorp/go-version v1.9.0 // indirect github.com/hybridgroup/yzma v1.18.0 // indirect github.com/jupiterrider/ffi v0.7.0 // indirect - github.com/kaptinlin/jsonpointer v0.4.26 // indirect + github.com/kaptinlin/jsonpointer v0.4.27 // indirect github.com/klauspost/compress v1.18.6 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect diff --git a/go.sum b/go.sum index 8edcbf458..18e628eaf 100644 --- a/go.sum +++ b/go.sum @@ -42,40 +42,40 @@ github.com/ardanlabs/jinja v1.4.0 h1:9iE0/wF4zhcws1CYZCWqJTQP8YuhC4FjycBGzCTuOFw github.com/ardanlabs/jinja v1.4.0/go.mod h1:aXXzlJfjA+T3XNKA/YT5ZtDq2VJxt5a5siZ8cl9B35Q= github.com/ardanlabs/kronk v1.28.5 h1:MAXucuRdKm1DkSHwy77EA8Hulwq+5CFdi3yQ4LDlkpE= github.com/ardanlabs/kronk v1.28.5/go.mod h1:Gq9Rjp+GGgpWcsgsOF73TCo8nl5JHaBld1K5BMYWcao= -github.com/aws/aws-sdk-go-v2 v1.42.0 h1:XvXMJTkFQtpBKIWZnmr9ZEOc2InWM2yldjXEJ/bymhA= -github.com/aws/aws-sdk-go-v2 v1.42.0/go.mod h1:27+ACypSLljLAEKsCYOmrjKh83vuTRkuAe9Uv/3A4bg= +github.com/aws/aws-sdk-go-v2 v1.42.1 h1:9eOTgu1z/dVtYpNZ3/8/XbbaX0x/BqE3HUzAzs6K0ek= +github.com/aws/aws-sdk-go-v2 v1.42.1/go.mod h1:5pKeft2eJj+gElQ38Jqg4ibCqh+/AK33/0X3hip7IjM= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.13 h1:p1BBrg/Hhp6uK7zpejeI8QFXHJeC/mynzi04Sl03k9g= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.13/go.mod h1:8cIfkE9MDhkRZGpQ22aV6/lkYeYSozpz16Smrs5x4Ls= -github.com/aws/aws-sdk-go-v2/config v1.32.25 h1:ACCejvStYoilgwrfegSt5ZntCbPrk52qfwyNcnl3omM= -github.com/aws/aws-sdk-go-v2/config v1.32.25/go.mod h1:LJyU8sDRbXUxFn8xMJIGP+v9QYYwveNLI8a/giAOiAs= -github.com/aws/aws-sdk-go-v2/credentials v1.19.24 h1:2hQqYCV9yqyePQ9o6dCrZc/zO8U3TwPr9mIKlZnPu/I= -github.com/aws/aws-sdk-go-v2/credentials v1.19.24/go.mod h1:IDwpACtwqHLISdzfwUUNq4P9DsB/h5BLg4FwJPNfqFY= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.29 h1:r6qZHbT+wxgWO/e9vYNUEtg7lv5+UN3pRqKhLXvnArg= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.29/go.mod h1:QRnaRcTVGKPGRy8w78HMQtKUGRYcnMZAANATkeVA6Mo= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.29 h1:f3vKqSo13fhTYb+JEcXwXefZQE26I1FB5eTSniU67ko= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.29/go.mod h1:MzoLFUArKGpGD+ukmPiTPG1X5x4o6M2kq4v2dr1FiEc= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.29 h1:RdwIf/CuUsvJX3RgJagbOyotl/cxoLY4xviKuE7p2GY= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.29/go.mod h1:71wt8W2EgswdZy9Mf9KNnzxZ3TiZlv4caKghPktDOkA= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.30 h1:VTGy885W5DKBxWRUJbym9hytNaYzsyaPkCHGRRMAOhU= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.30/go.mod h1:AS0HycUvJRFvTt613AYDOgO2jzw+00cVSMny8XB3yMY= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.12 h1:ZD2+BSw9vFsNlKYIasSNt3uDbjqqXIBcM13UJv/Lx2k= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.12/go.mod h1:Ms4zlcVBbXbiP7EVLhl+lgjvA/a7YphqQ3Ih3174EmI= +github.com/aws/aws-sdk-go-v2/config v1.32.27 h1:SJwJ9Q4kM7v5QVSYYyXj3znRr6lNyZEhSgAXmXXcVbI= +github.com/aws/aws-sdk-go-v2/config v1.32.27/go.mod h1:uBfrzTRedDmB2u+b6+UlaKJy2O6VSH5un2jP24t/KvQ= +github.com/aws/aws-sdk-go-v2/credentials v1.19.26 h1:Si8kk1kyJnuJWCEgiwpBtTdtgSdR7i611596NnC0YIQ= +github.com/aws/aws-sdk-go-v2/credentials v1.19.26/go.mod h1:lBckz+W9SAdNtSDw3pYgQUJDJFcBBWry0GSzw+bK0TY= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.30 h1:/hi1JADLEW9YYryEz1w4GQu0EtP23pP553Cf9KgsDV4= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.30/go.mod h1:/3AOgy4K17Dm4ucMZVC/MJkzy5kmfKUcINRHZyo0koQ= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.30 h1:xM/Is9cKMHa8Jj8zkvWhvrFkZsXJV9E+BB4g0HW0duQ= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.30/go.mod h1:WueJeNDZvK1fMYEWJIkcivBfEzUkTpBhzlrUKKY8EuA= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.30 h1:jn46zC9LdsVR/ZpMIJqMqb8hHv31BlLx3ulVqNspUOk= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.30/go.mod h1:1hTMsAgbdS/AtUi4bw8+gUuh1pceo+eXRLfpSuSQj3M= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.31 h1:3GUprIsfmGcC5SACIyB0e7E0BM1O1b3Erl5CePYIAeQ= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.31/go.mod h1:7PuV1yl5e2xnUbm+RqvVg5i2iBM8EyijZNoI9wsOoOc= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.13 h1:mbRIur/BiHK6SKPjoBIXSE/hJ6g6JGRLuxQy1jGjlN4= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.13/go.mod h1:ITg9em2KbJx1s0y4aqRX5OYWG6HBZ5TVR//OdpEZ2CQ= github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.22 h1:V51LGlOq/1VsDsHUdoklAQi7rMmx4qQubvFYAlP2254= github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.22/go.mod h1:4Pzhyz8hJOm2bepgl+NjvRx8vlUFAIIvJnZ/MkcNPpU= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.29 h1:DRebniUGZ2MqiiIVmQJ04vIXr918hubdHMnarSLEWyU= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.29/go.mod h1:LfRkPCD8YHDM2E5eTkos2UpwYeZnBcVarTa8L59bJHA= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.30 h1:/Z5jmNrKsSD7EmDjzAPsm/3L9IuOkzaynklJZ1qX7S4= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.30/go.mod h1:lEzEZnOosE7zi8Z6royW1cFJTD9fpab4Ul1SBrllewk= github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.29 h1:hiME6pBzC7OTl9LMtlyTWBuEl1f4QBcUmFDKC7MLXtc= github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.29/go.mod h1:G7RP+uhagpKtKhd1BM9N6JQqjCcGEU47K5lBVZQyRQw= github.com/aws/aws-sdk-go-v2/service/s3 v1.104.0 h1:ta8csKy5vN91F3i5gGR85lFV0srBqySEji7Jroes6rE= github.com/aws/aws-sdk-go-v2/service/s3 v1.104.0/go.mod h1:77ZAgynvx1txMvDG8gGWoWkO1augYDxkp9JElWFgjQU= -github.com/aws/aws-sdk-go-v2/service/signin v1.2.0 h1:3nXpRcFwRCW8n7HgO2QGy0Dc20eQNfBuUemGQhpF8m8= -github.com/aws/aws-sdk-go-v2/service/signin v1.2.0/go.mod h1:LxYujSTLPRlp2vTtcUO/+1ilrew8ytt6SvQyOgejzFQ= -github.com/aws/aws-sdk-go-v2/service/sso v1.31.3 h1:ey1XLTYXb9PcLt4535632o5kCGXNXEhNb620Dqwuylo= -github.com/aws/aws-sdk-go-v2/service/sso v1.31.3/go.mod h1:Lk7PlmoTYryQmyBG0EXqj5BcUbj3whXdU2s3yGI3EAc= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.36.6 h1:yLr03zQE/5Eu5l3QU0Si+xMbLMbSDF2YXsigqXngs6g= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.36.6/go.mod h1:Q5N6icH+KJZDLh+ESNwzdv6cZ6vLFF/egy3IOxWhmz4= -github.com/aws/aws-sdk-go-v2/service/sts v1.43.3 h1:VrIhKRCSK1umelSgB9RghvA9RTUYeQffyAS5ApXehNI= -github.com/aws/aws-sdk-go-v2/service/sts v1.43.3/go.mod h1:r8wkDOuLaaMFqFiYAb8dGY2A3gJCOujMc6CFOVC4Zhc= +github.com/aws/aws-sdk-go-v2/service/signin v1.2.2 h1:69JEZSDTQ+UNbTWQJCZMmbpQb5sfc79KUt0O7Pyfjmo= +github.com/aws/aws-sdk-go-v2/service/signin v1.2.2/go.mod h1:mxC0nT/C8wMMS97DemZPzvUZxvIt+2Iq+eS3JdFZGgg= +github.com/aws/aws-sdk-go-v2/service/sso v1.31.5 h1:xlK3Tdc8FO7Tq1k0+hL+otF33glj+dE+qeM5iINiDvU= +github.com/aws/aws-sdk-go-v2/service/sso v1.31.5/go.mod h1:u8af9Nqkmqnr96f7v9nHqzZT9XBwbXEkTiqT4ROuJSE= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.36.8 h1:yX1IbiBfC7SdEgDwIGnRaZyPPDRbQPDOJxl8102PcGk= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.36.8/go.mod h1:DMPWJBjYs6+3+f/qhBFEFPPlQ6NlhWjai3dJNvipJ84= +github.com/aws/aws-sdk-go-v2/service/sts v1.43.5 h1:T3ANO8QWDbzQD8f4+UaX+fvJlyGnOFMKLbW+NGBHg04= +github.com/aws/aws-sdk-go-v2/service/sts v1.43.5/go.mod h1:9gdl4RrflIdpDb2TlXshWgR1F9TeCkvqDx77Vpr4Z/Q= github.com/aws/smithy-go v1.27.3 h1:F3Zb497UhhskkfpJmfkXswyo+t0sh9OTBnIHjogWbVY= github.com/aws/smithy-go v1.27.3/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= @@ -116,8 +116,8 @@ github.com/felixge/httpsnoop v1.1.0 h1:3YtUj32ZZkqZtt3sZZsClsymw/QDuVfpNhoA31zeO github.com/felixge/httpsnoop v1.1.0/go.mod h1:Zqxgdd+1Rkcz8euOqdr7lqgCRJztwr5hp9vDSi5UZCE= github.com/go-jose/go-jose/v4 v4.1.4 h1:moDMcTHmvE6Groj34emNPLs/qtYXRVcd6S7NHbHz3kA= github.com/go-jose/go-jose/v4 v4.1.4/go.mod h1:x4oUasVrzR7071A4TnHLGSPpNOm2a21K9Kf04k1rs08= -github.com/go-json-experiment/json v0.0.0-20260601182631-00ed12fed2a6 h1:nxP4pPoyqOAgX8lYDFCfl3DyKeXErCvSvhcyzwGV9CE= -github.com/go-json-experiment/json v0.0.0-20260601182631-00ed12fed2a6/go.mod h1:tphK2c80bpPhMOI4v6bIc2xWywPfbqi1Z06+RcrMkDg= +github.com/go-json-experiment/json v0.0.0-20260623181947-01eb4420fa68 h1:KZaTBSyshWX3MP5jukJcNSuXDQTO+rNpt0J564dX/eg= +github.com/go-json-experiment/json v0.0.0-20260623181947-01eb4420fa68/go.mod h1:tphK2c80bpPhMOI4v6bIc2xWywPfbqi1Z06+RcrMkDg= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= @@ -161,10 +161,10 @@ github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= github.com/jupiterrider/ffi v0.7.0 h1:RKsl6Ascal+3kyAqR5Qcbp83LceQMLc1VZbPfHWoNzs= github.com/jupiterrider/ffi v0.7.0/go.mod h1:9dauhpOfNqrqk28fxuu0kkdeFtT9Qr4vbfigiuIXN7c= -github.com/kaptinlin/jsonpointer v0.4.26 h1:tw616yszHek+B3/GtDSia+uzBa3sLXGpmo4tYeMhBZw= -github.com/kaptinlin/jsonpointer v0.4.26/go.mod h1:wVOBaXGGnP42YsMb6zev/3W5POTvspdNfh8DXzf8XS8= -github.com/kaptinlin/jsonschema v0.9.2 h1:zqowDnBkpg80OeIt4Bl1bOyfKY1/KVVzst1m3MCsxd4= -github.com/kaptinlin/jsonschema v0.9.2/go.mod h1:mCH2W5lXd29tdDjvoFfY32nedPORnlk7pCVrrcs/NkQ= +github.com/kaptinlin/jsonpointer v0.4.27 h1:5FOnhlkqQ4/lvHudaAWS8HJCXjN4yAHSIGl7aPKHI0Q= +github.com/kaptinlin/jsonpointer v0.4.27/go.mod h1:dfub/n58cWS32Dyf3AZsnKblSAgrz9PyOU76GDPpx8Q= +github.com/kaptinlin/jsonschema v0.9.3 h1:uDVd3w4aXwO0tbycblKYvFofhl3hVuE31vOl5JkDXI0= +github.com/kaptinlin/jsonschema v0.9.3/go.mod h1:LvtQ/mO0E1e/3c3DiOWTj05LTeot8cTv7DyQq7eJMQg= github.com/klauspost/compress v1.18.6 h1:2jupLlAwFm95+YDR+NwD2MEfFO9d4z4Prjl1XXDjuao= github.com/klauspost/compress v1.18.6/go.mod h1:cwPg85FWrGar70rWktvGQj8/hthj3wpl0PGDogxkrSQ= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= From 213d6e2c80b900f726b4d5119c4f1076af4d2891 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 6 Jul 2026 09:25:35 +0000 Subject: [PATCH 030/156] chore(deps): bump github.com/ardanlabs/kronk (#307) Bumps the kronk group with 1 update in the / directory: [github.com/ardanlabs/kronk](https://github.com/ardanlabs/kronk). Updates `github.com/ardanlabs/kronk` from 1.28.5 to 1.28.6 - [Release notes](https://github.com/ardanlabs/kronk/releases) - [Commits](https://github.com/ardanlabs/kronk/compare/v1.28.5...v1.28.6) --- updated-dependencies: - dependency-name: github.com/ardanlabs/kronk dependency-version: 1.28.6 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: kronk ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index e99a09da8..7008ccb67 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.26.4 require ( charm.land/x/vcr v0.1.1 cloud.google.com/go/auth v0.20.0 - github.com/ardanlabs/kronk v1.28.5 + github.com/ardanlabs/kronk v1.28.6 github.com/aws/aws-sdk-go-v2 v1.42.1 github.com/aws/aws-sdk-go-v2/config v1.32.27 github.com/aws/smithy-go v1.27.3 diff --git a/go.sum b/go.sum index 18e628eaf..ca7c4c5b3 100644 --- a/go.sum +++ b/go.sum @@ -40,8 +40,8 @@ github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapp github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.57.0/go.mod h1:YqwkQPrWSC7+byyc1VlKbWLBF5JsW5IoL6xUkemYSXk= github.com/ardanlabs/jinja v1.4.0 h1:9iE0/wF4zhcws1CYZCWqJTQP8YuhC4FjycBGzCTuOFw= github.com/ardanlabs/jinja v1.4.0/go.mod h1:aXXzlJfjA+T3XNKA/YT5ZtDq2VJxt5a5siZ8cl9B35Q= -github.com/ardanlabs/kronk v1.28.5 h1:MAXucuRdKm1DkSHwy77EA8Hulwq+5CFdi3yQ4LDlkpE= -github.com/ardanlabs/kronk v1.28.5/go.mod h1:Gq9Rjp+GGgpWcsgsOF73TCo8nl5JHaBld1K5BMYWcao= +github.com/ardanlabs/kronk v1.28.6 h1:pFu3JhGmmK2CVQ9Jwa08qzyUu4bHsUaLBwZf17dZVpk= +github.com/ardanlabs/kronk v1.28.6/go.mod h1:Gq9Rjp+GGgpWcsgsOF73TCo8nl5JHaBld1K5BMYWcao= github.com/aws/aws-sdk-go-v2 v1.42.1 h1:9eOTgu1z/dVtYpNZ3/8/XbbaX0x/BqE3HUzAzs6K0ek= github.com/aws/aws-sdk-go-v2 v1.42.1/go.mod h1:5pKeft2eJj+gElQ38Jqg4ibCqh+/AK33/0X3hip7IjM= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.13 h1:p1BBrg/Hhp6uK7zpejeI8QFXHJeC/mynzi04Sl03k9g= From 4ab0142f4dfee717a93656792e7c1580fb17cc53 Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Tue, 7 Jul 2026 17:50:11 -0300 Subject: [PATCH 031/156] v0.35.1 --- version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.txt b/version.txt index 7b52f5e51..731b95d7f 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -0.35.0 +0.35.1 From 263de1d023c0a5c4456207ac6d03a05c6e477ed1 Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Wed, 8 Jul 2026 15:33:54 -0300 Subject: [PATCH 032/156] ci: fix govulncheck --- go.mod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 7008ccb67..7734638bf 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module charm.land/fantasy -go 1.26.4 +go 1.26.5 require ( charm.land/x/vcr v0.1.1 From 29b1da1e853064723dc7e9762e448708f1b971ab Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Wed, 8 Jul 2026 15:34:58 -0300 Subject: [PATCH 033/156] chore: prepare for gpt-5.6 (#308) This tells Fantasy and Crush to use the Responses API instead of Chat Completions. --- providers/openai/responses_options.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/providers/openai/responses_options.go b/providers/openai/responses_options.go index a06e948af..9d74411a0 100644 --- a/providers/openai/responses_options.go +++ b/providers/openai/responses_options.go @@ -222,6 +222,14 @@ var responsesReasoningModelIDs = []string{ "gpt-5.4-codex", "gpt-5.5", "gpt-5.5-pro", + "gpt-5.5-mini", + "gpt-5.5-nano", + "gpt-5.5-codex", + "gpt-5.6", + "gpt-5.6-pro", + "gpt-5.6-mini", + "gpt-5.6-nano", + "gpt-5.6-codex", "gpt-oss-120b", } From 4f5ec5ae6cddbef3c9c70e005c0195af21074def Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Wed, 8 Jul 2026 15:35:14 -0300 Subject: [PATCH 034/156] ci: only run lint on ubuntu --- .github/workflows/lint.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index d71849463..ed3a1af7b 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -1,6 +1,7 @@ name: lint on: push: + branches: [main] pull_request: jobs: @@ -10,3 +11,4 @@ jobs: golangci_path: .golangci.yml golangci_version: v2.9 timeout: 10m + os: '["ubuntu-latest"]' From 49274e4e85fa36c406c7a6aea0015781c82d6326 Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Wed, 8 Jul 2026 15:39:08 -0300 Subject: [PATCH 035/156] v0.35.2 --- version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.txt b/version.txt index 731b95d7f..abc2aab9b 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -0.35.1 +0.35.2 From f78b5d6d9e7bd5c7c82627ee3e289e7a854613f1 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Thu, 9 Jul 2026 15:14:28 -0400 Subject: [PATCH 036/156] feat: support per-call HTTP headers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add a Headers field to Call, ObjectCall, and AgentCall (already existed on AgentStreamCall but was dead code). Thread per-call headers through the agent and all providers (anthropic, openai, google) so they override matching provider-level headers on each request. 💘 Generated with Crush Assisted-by: Crush:glm-5.2 --- agent.go | 8 +++++++ model.go | 3 +++ object.go | 3 +++ object/object.go | 4 ++++ providers/anthropic/anthropic.go | 1 + providers/anthropic/call_useragent.go | 12 ++++++++++ providers/google/call_useragent.go | 21 ++++++++++++++-- providers/internal/httpheaders/httpheaders.go | 10 ++++++++ providers/openai/call_useragent.go | 24 +++++++++++++++++++ providers/openai/language_model.go | 8 +++---- providers/openai/responses_language_model.go | 8 +++---- 11 files changed, 92 insertions(+), 10 deletions(-) diff --git a/agent.go b/agent.go index ad43fbef1..401f53473 100644 --- a/agent.go +++ b/agent.go @@ -172,6 +172,7 @@ type AgentCall struct { FrequencyPenalty *float64 `json:"frequency_penalty"` ActiveTools []string `json:"active_tools"` ToolChoice *ToolChoice `json:"tool_choice"` + Headers map[string]string ProviderOptions ProviderOptions OnRetry OnRetryCallback MaxRetries *int @@ -402,6 +403,10 @@ func (a *agent) prepareCall(call AgentCall) AgentCall { if a.settings.headers != nil { maps.Copy(headers, a.settings.headers) } + if call.Headers != nil { + maps.Copy(headers, call.Headers) + } + call.Headers = headers return call } @@ -499,6 +504,7 @@ func (a *agent) Generate(ctx context.Context, opts AgentCall) (*AgentResult, err Tools: preparedTools, ToolChoice: &stepToolChoice, UserAgent: a.settings.userAgent, + Headers: opts.Headers, ProviderOptions: opts.ProviderOptions, }) }) @@ -830,6 +836,7 @@ func (a *agent) Stream(ctx context.Context, opts AgentStreamCall) (*AgentResult, FrequencyPenalty: opts.FrequencyPenalty, ActiveTools: opts.ActiveTools, ToolChoice: opts.ToolChoice, + Headers: opts.Headers, ProviderOptions: opts.ProviderOptions, MaxRetries: opts.MaxRetries, OnRetry: opts.OnRetry, @@ -934,6 +941,7 @@ func (a *agent) Stream(ctx context.Context, opts AgentStreamCall) (*AgentResult, Tools: preparedTools, ToolChoice: &stepToolChoice, UserAgent: a.settings.userAgent, + Headers: call.Headers, ProviderOptions: call.ProviderOptions, } diff --git a/model.go b/model.go index 2811a4d04..9e63c9323 100644 --- a/model.go +++ b/model.go @@ -221,6 +221,9 @@ type Call struct { // UserAgent overrides the provider-level User-Agent header for this call. UserAgent string `json:"-"` + // Headers overrides matching provider-level headers for this call. + Headers map[string]string `json:"-"` + // for provider specific options, the key is the provider id ProviderOptions ProviderOptions `json:"provider_options"` } diff --git a/object.go b/object.go index 3cbcbd3eb..1e6780333 100644 --- a/object.go +++ b/object.go @@ -44,6 +44,9 @@ type ObjectCall struct { // UserAgent overrides the provider-level User-Agent header for this call. UserAgent string `json:"-"` + // Headers overrides matching provider-level headers for this call. + Headers map[string]string `json:"-"` + ProviderOptions ProviderOptions RepairText schema.ObjectRepairFunc diff --git a/object/object.go b/object/object.go index 16c77d1cf..cd1bc6382 100644 --- a/object/object.go +++ b/object/object.go @@ -121,6 +121,7 @@ func GenerateWithTool( PresencePenalty: call.PresencePenalty, FrequencyPenalty: call.FrequencyPenalty, UserAgent: call.UserAgent, + Headers: call.Headers, ProviderOptions: call.ProviderOptions, }) if err != nil { @@ -214,6 +215,7 @@ func GenerateWithText( PresencePenalty: call.PresencePenalty, FrequencyPenalty: call.FrequencyPenalty, UserAgent: call.UserAgent, + Headers: call.Headers, ProviderOptions: call.ProviderOptions, }) if err != nil { @@ -297,6 +299,7 @@ func StreamWithTool( PresencePenalty: call.PresencePenalty, FrequencyPenalty: call.FrequencyPenalty, UserAgent: call.UserAgent, + Headers: call.Headers, ProviderOptions: call.ProviderOptions, }) if err != nil { @@ -507,6 +510,7 @@ func StreamWithText( PresencePenalty: call.PresencePenalty, FrequencyPenalty: call.FrequencyPenalty, UserAgent: call.UserAgent, + Headers: call.Headers, ProviderOptions: call.ProviderOptions, }) if err != nil { diff --git a/providers/anthropic/anthropic.go b/providers/anthropic/anthropic.go index d00ebe09e..a1816bd8f 100644 --- a/providers/anthropic/anthropic.go +++ b/providers/anthropic/anthropic.go @@ -94,6 +94,7 @@ func buildRequestOptions(call fantasy.Call, rawTools []json.RawMessage, betaFlag } reqOpts := callUARequestOptions(call) + reqOpts = append(reqOpts, callHeadersRequestOptions(call)...) if len(rawTools) > 0 { // Tools are injected as raw JSON rather than via params.Tools // because the SDK doesn't model beta tool types (e.g. computer diff --git a/providers/anthropic/call_useragent.go b/providers/anthropic/call_useragent.go index 4aaffcf87..47d451efa 100644 --- a/providers/anthropic/call_useragent.go +++ b/providers/anthropic/call_useragent.go @@ -12,3 +12,15 @@ func callUARequestOptions(call fantasy.Call) []option.RequestOption { } return nil } + +func callHeadersRequestOptions(call fantasy.Call) []option.RequestOption { + headers, ok := httpheaders.CallHeaders(call.Headers) + if !ok { + return nil + } + opts := make([]option.RequestOption, 0, len(headers)) + for k, v := range headers { + opts = append(opts, option.WithHeader(k, v)) + } + return opts +} diff --git a/providers/google/call_useragent.go b/providers/google/call_useragent.go index a3521dd75..8c11196ff 100644 --- a/providers/google/call_useragent.go +++ b/providers/google/call_useragent.go @@ -10,16 +10,24 @@ import ( type callUAKey struct{} +type callHeadersKey struct{} + func withCallUA(ctx context.Context, call fantasy.Call) context.Context { if ua, ok := httpheaders.CallUserAgent(call.UserAgent); ok { - return context.WithValue(ctx, callUAKey{}, ua) + ctx = context.WithValue(ctx, callUAKey{}, ua) + } + if headers, ok := httpheaders.CallHeaders(call.Headers); ok { + ctx = context.WithValue(ctx, callHeadersKey{}, headers) } return ctx } func withObjectCallUA(ctx context.Context, call fantasy.ObjectCall) context.Context { if ua, ok := httpheaders.CallUserAgent(call.UserAgent); ok { - return context.WithValue(ctx, callUAKey{}, ua) + ctx = context.WithValue(ctx, callUAKey{}, ua) + } + if headers, ok := httpheaders.CallHeaders(call.Headers); ok { + ctx = context.WithValue(ctx, callHeadersKey{}, headers) } return ctx } @@ -49,5 +57,14 @@ func (t *uaTransport) RoundTrip(req *http.Request) (*http.Response, error) { req = req.Clone(req.Context()) req.Header.Set("User-Agent", ua) } + if headers, ok := req.Context().Value(callHeadersKey{}).(map[string]string); ok && len(headers) > 0 { + if req.Header.Get("User-Agent") == "" { + // Clone already happened above if UA was set; clone here otherwise. + req = req.Clone(req.Context()) + } + for k, v := range headers { + req.Header.Set(k, v) + } + } return t.base.RoundTrip(req) } diff --git a/providers/internal/httpheaders/httpheaders.go b/providers/internal/httpheaders/httpheaders.go index 128e2228a..81f0572d1 100644 --- a/providers/internal/httpheaders/httpheaders.go +++ b/providers/internal/httpheaders/httpheaders.go @@ -58,3 +58,13 @@ func CallUserAgent(callUA string) (string, bool) { } return "", false } + +// CallHeaders resolves per-call headers. It returns the headers map and true +// if per-call headers should be applied, or nil and false if the client-level +// headers should be used as-is. +func CallHeaders(headers map[string]string) (map[string]string, bool) { + if len(headers) > 0 { + return headers, true + } + return nil, false +} diff --git a/providers/openai/call_useragent.go b/providers/openai/call_useragent.go index fe9b4822d..baee1775e 100644 --- a/providers/openai/call_useragent.go +++ b/providers/openai/call_useragent.go @@ -29,3 +29,27 @@ func objectCallUARequestOptions(call fantasy.ObjectCall) []option.RequestOption } return nil } + +func callHeadersRequestOptions(call fantasy.Call) []option.RequestOption { + headers, ok := httpheaders.CallHeaders(call.Headers) + if !ok { + return nil + } + opts := make([]option.RequestOption, 0, len(headers)) + for k, v := range headers { + opts = append(opts, option.WithHeader(k, v)) + } + return opts +} + +func objectCallHeadersRequestOptions(call fantasy.ObjectCall) []option.RequestOption { + headers, ok := httpheaders.CallHeaders(call.Headers) + if !ok { + return nil + } + opts := make([]option.RequestOption, 0, len(headers)) + for k, v := range headers { + opts = append(opts, option.WithHeader(k, v)) + } + return opts +} diff --git a/providers/openai/language_model.go b/providers/openai/language_model.go index c73d14253..5ba94450b 100644 --- a/providers/openai/language_model.go +++ b/providers/openai/language_model.go @@ -247,7 +247,7 @@ func (o languageModel) Generate(ctx context.Context, call fantasy.Call) (*fantas if err != nil { return nil, err } - response, err := o.client.Chat.Completions.New(ctx, *params, callUARequestOptions(call)...) + response, err := o.client.Chat.Completions.New(ctx, *params, append(callUARequestOptions(call), callHeadersRequestOptions(call)...)...) if err != nil { return nil, toProviderErr(err) } @@ -318,7 +318,7 @@ func (o languageModel) Stream(ctx context.Context, call fantasy.Call) (fantasy.S IncludeUsage: openai.Bool(true), } - stream := o.client.Chat.Completions.NewStreaming(ctx, *params, callUARequestOptions(call)...) + stream := o.client.Chat.Completions.NewStreaming(ctx, *params, append(callUARequestOptions(call), callHeadersRequestOptions(call)...)...) isActiveText := false toolCalls := make(map[int64]streamToolCall) @@ -764,7 +764,7 @@ func (o languageModel) generateObjectWithJSONMode(ctx context.Context, call fant }, } - response, err := o.client.Chat.Completions.New(ctx, *params, objectCallUARequestOptions(call)...) + response, err := o.client.Chat.Completions.New(ctx, *params, append(objectCallUARequestOptions(call), objectCallHeadersRequestOptions(call)...)...) if err != nil { return nil, toProviderErr(err) } @@ -848,7 +848,7 @@ func (o languageModel) streamObjectWithJSONMode(ctx context.Context, call fantas IncludeUsage: openai.Bool(true), } - stream := o.client.Chat.Completions.NewStreaming(ctx, *params, objectCallUARequestOptions(call)...) + stream := o.client.Chat.Completions.NewStreaming(ctx, *params, append(objectCallUARequestOptions(call), objectCallHeadersRequestOptions(call)...)...) return func(yield func(fantasy.ObjectStreamPart) bool) { if len(warnings) > 0 { diff --git a/providers/openai/responses_language_model.go b/providers/openai/responses_language_model.go index 0be05f693..746f46edd 100644 --- a/providers/openai/responses_language_model.go +++ b/providers/openai/responses_language_model.go @@ -776,7 +776,7 @@ func (o responsesLanguageModel) Generate(ctx context.Context, call fantasy.Call) return nil, err } - response, err := o.client.Responses.New(ctx, *params, callUARequestOptions(call)...) + response, err := o.client.Responses.New(ctx, *params, append(callUARequestOptions(call), callHeadersRequestOptions(call)...)...) if err != nil { return nil, toProviderErr(err) } @@ -931,7 +931,7 @@ func (o responsesLanguageModel) Stream(ctx context.Context, call fantasy.Call) ( return nil, err } - stream := o.client.Responses.NewStreaming(ctx, *params, callUARequestOptions(call)...) + stream := o.client.Responses.NewStreaming(ctx, *params, append(callUARequestOptions(call), callHeadersRequestOptions(call)...)...) finishReason := fantasy.FinishReasonUnknown var usage fantasy.Usage @@ -1418,7 +1418,7 @@ func (o responsesLanguageModel) generateObjectWithJSONMode(ctx context.Context, } // Make request - response, err := o.client.Responses.New(ctx, *params, objectCallUARequestOptions(call)...) + response, err := o.client.Responses.New(ctx, *params, append(objectCallUARequestOptions(call), objectCallHeadersRequestOptions(call)...)...) if err != nil { return nil, toProviderErr(err) } @@ -1521,7 +1521,7 @@ func (o responsesLanguageModel) streamObjectWithJSONMode(ctx context.Context, ca Format: responses.ResponseFormatTextConfigParamOfJSONSchema(schemaName, jsonSchemaMap), } - stream := o.client.Responses.NewStreaming(ctx, *params, objectCallUARequestOptions(call)...) + stream := o.client.Responses.NewStreaming(ctx, *params, append(objectCallUARequestOptions(call), objectCallHeadersRequestOptions(call)...)...) return func(yield func(fantasy.ObjectStreamPart) bool) { if len(warnings) > 0 { From 8563ff449bc9bde7942a7bc4e3e82d5ed2436c4c Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Thu, 9 Jul 2026 16:29:11 -0400 Subject: [PATCH 037/156] v0.36.0 --- version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.txt b/version.txt index abc2aab9b..93d4c1ef0 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -0.35.2 +0.36.0 From d666763ff9d9bd7e111188d6ba61d9b52eb3f41f Mon Sep 17 00:00:00 2001 From: Kieran Klukas Date: Mon, 13 Jul 2026 16:45:24 -0400 Subject: [PATCH 038/156] feat: unauthorized hook (#295) --- agent.go | 45 ++++++++++++- retry.go | 34 +++++++++- retry_test.go | 171 ++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 247 insertions(+), 3 deletions(-) diff --git a/agent.go b/agent.go index 401f53473..4a4465601 100644 --- a/agent.go +++ b/agent.go @@ -175,8 +175,15 @@ type AgentCall struct { Headers map[string]string ProviderOptions ProviderOptions OnRetry OnRetryCallback + OnAuthRefresh OnAuthRefreshFunc MaxRetries *int + // ModelProvider, when non-nil, is called on each retry attempt to + // obtain the language model. This allows callers to swap in a + // refreshed model after OnAuthRefresh rebuilds credentials. When + // nil, the model captured at step preparation time is used. + ModelProvider func() LanguageModel + StopWhen []StopCondition PrepareStep PrepareStepFunction RepairToolCall RepairToolCallFunction @@ -201,6 +208,16 @@ type ( // OnErrorFunc is called when an error occurs. OnErrorFunc func(error) + + // OnAuthRefreshFunc is called when a stream fails with an authentication + // error that the caller may be able to resolve (e.g. an expired SSO + // session or OAuth token). The function should perform whatever credential + // refresh is needed and return nil on success, in which case fantasy + // retries the operation transparently. Returning an error surfaces the + // original auth error to the caller without retry. Pair this with + // ModelProvider to supply a rebuilt model carrying the refreshed + // credentials on the retry attempt. + OnAuthRefreshFunc func(ctx context.Context, err *ProviderError) error ) // Stream part callbacks - called for each corresponding stream part type. @@ -267,8 +284,15 @@ type AgentStreamCall struct { Headers map[string]string ProviderOptions ProviderOptions OnRetry OnRetryCallback + OnAuthRefresh OnAuthRefreshFunc MaxRetries *int + // ModelProvider, when non-nil, is called on each retry attempt to + // obtain the language model. This allows callers to swap in a + // refreshed model after OnAuthRefresh rebuilds credentials. When + // nil, the model captured at step preparation time is used. + ModelProvider func() LanguageModel + StopWhen []StopCondition PrepareStep PrepareStepFunction RepairToolCall RepairToolCallFunction @@ -491,9 +515,17 @@ func (a *agent) Generate(ctx context.Context, opts AgentCall) (*AgentResult, err retryOptions.MaxRetries = *opts.MaxRetries } retryOptions.OnRetry = opts.OnRetry + retryOptions.OnAuthRefresh = opts.OnAuthRefresh retry := RetryWithExponentialBackoffRespectingRetryHeaders[*Response](retryOptions) result, err := retry(ctx, func() (*Response, error) { - return stepModel.Generate(ctx, Call{ + // Re-read the model on each retry attempt so that + // OnAuthRefresh can swap in a model with fresh credentials. + retryModel := stepModel + if opts.ModelProvider != nil { + retryModel = opts.ModelProvider() + } + + return retryModel.Generate(ctx, Call{ Prompt: stepInputMessages, MaxOutputTokens: opts.MaxOutputTokens, Temperature: opts.Temperature, @@ -840,6 +872,7 @@ func (a *agent) Stream(ctx context.Context, opts AgentStreamCall) (*AgentResult, ProviderOptions: opts.ProviderOptions, MaxRetries: opts.MaxRetries, OnRetry: opts.OnRetry, + OnAuthRefresh: opts.OnAuthRefresh, StopWhen: opts.StopWhen, PrepareStep: opts.PrepareStep, RepairToolCall: opts.RepairToolCall, @@ -951,11 +984,19 @@ func (a *agent) Stream(ctx context.Context, opts AgentStreamCall) (*AgentResult, retryOptions.MaxRetries = *call.MaxRetries } retryOptions.OnRetry = call.OnRetry + retryOptions.OnAuthRefresh = call.OnAuthRefresh retry := RetryWithExponentialBackoffRespectingRetryHeaders[stepExecutionResult](retryOptions) result, err := retry(ctx, func() (stepExecutionResult, error) { + // Re-read the model on each retry attempt so that + // OnAuthRefresh can swap in a model with fresh credentials. + retryModel := stepModel + if call.ModelProvider != nil { + retryModel = call.ModelProvider() + } + // Create the stream - stream, err := stepModel.Stream(ctx, streamCall) + stream, err := retryModel.Stream(ctx, streamCall) if err != nil { return stepExecutionResult{}, err } diff --git a/retry.go b/retry.go index 894e5aea7..3aaabd56d 100644 --- a/retry.go +++ b/retry.go @@ -4,6 +4,7 @@ import ( "context" "errors" "net" + "net/http" "strconv" "time" ) @@ -55,8 +56,25 @@ func getRetryDelayInMs(err error, exponentialBackoffDelay time.Duration) time.Du // RetryWithExponentialBackoffRespectingRetryHeaders creates a retry function that retries // a failed operation with exponential backoff, while respecting rate limit headers // (retry-after-ms and retry-after) if they are provided and reasonable (0-60 seconds). +// +// When OnAuthRefresh is set and the operation ends in an authentication error, +// the hook is given one chance to refresh credentials. On success the entire +// retry pass runs again with a fresh budget; on failure the original auth +// error is returned. At most one refresh is attempted, so a credential that +// stays invalid cannot spin. func RetryWithExponentialBackoffRespectingRetryHeaders[T any](options RetryOptions) RetryFunction[T] { return func(ctx context.Context, fn RetryFn[T]) (T, error) { + result, err := retryWithExponentialBackoff(ctx, fn, options, nil) + if err == nil || options.OnAuthRefresh == nil { + return result, err + } + var authErr *ProviderError + if !errors.As(err, &authErr) || !isAuthError(authErr) { + return result, err + } + if refreshErr := options.OnAuthRefresh(ctx, authErr); refreshErr != nil { + return result, err // refresh failed: surface the original auth error + } return retryWithExponentialBackoff(ctx, fn, options, nil) } } @@ -67,12 +85,20 @@ type RetryOptions struct { InitialDelayIn time.Duration BackoffFactor float64 OnRetry OnRetryCallback + + // OnAuthRefresh is called when an operation fails with an authentication + // error the caller may be able to resolve (e.g. an expired SSO session). + // If it returns nil, the entire retry pass restarts with a fresh retry + // budget; if it returns an error, the original auth error is returned + // without retry. At most one refresh is attempted, since auth refresh is + // a one-shot human-in-the-loop step and a second attempt would not fare + // better. + OnAuthRefresh OnAuthRefreshFunc } // OnRetryCallback defines a function that is called when a retry occurs. type OnRetryCallback = func(err *ProviderError, delay time.Duration) -// DefaultRetryOptions returns the default retry options. // DefaultRetryOptions returns the default retry options. func DefaultRetryOptions() RetryOptions { return RetryOptions{ @@ -133,6 +159,12 @@ func retryWithExponentialBackoff[T any](ctx context.Context, fn RetryFn[T], opti return zero, &RetryError{newErrors} } +// isAuthError reports whether the error is an authentication failure that a +// caller-supplied OnAuthRefresh hook may be able to resolve. +func isAuthError(err *ProviderError) bool { + return err.StatusCode == http.StatusUnauthorized +} + // isRetryableError reports whether the error should be retried. // It checks for retryable ProviderError and also retries network-level // connection errors (DNS failures, TCP timeouts, connection refused, etc.) diff --git a/retry_test.go b/retry_test.go index e6a26da8a..7acca3cac 100644 --- a/retry_test.go +++ b/retry_test.go @@ -142,3 +142,174 @@ func TestRetryWithExponentialBackoff_ConnectionErrors(t *testing.T) { } }) } + +func TestRetryWithAuthRefresh(t *testing.T) { + t.Parallel() + + authErr := func() error { return &ProviderError{StatusCode: 401, Message: "unauthorized"} } + + t.Run("refreshes and retries transparently on 401", func(t *testing.T) { + t.Parallel() + attempts := 0 + refreshed := 0 + opts := RetryOptions{ + MaxRetries: 2, + InitialDelayIn: 1 * time.Millisecond, + BackoffFactor: 2.0, + OnAuthRefresh: func(_ context.Context, _ *ProviderError) error { + refreshed++ + return nil + }, + } + + retryFn := RetryWithExponentialBackoffRespectingRetryHeaders[int](opts) + result, err := retryFn(context.Background(), func() (int, error) { + attempts++ + if attempts == 1 { + return 0, authErr() + } + return 7, nil + }) + if err != nil { + t.Fatalf("expected no error, got %v", err) + } + if result != 7 { + t.Fatalf("expected result 7, got %d", result) + } + if refreshed != 1 { + t.Fatalf("expected 1 refresh, got %d", refreshed) + } + if attempts != 2 { + t.Fatalf("expected 2 attempts, got %d", attempts) + } + }) + + t.Run("returns original error when refresh fails", func(t *testing.T) { + t.Parallel() + attempts := 0 + opts := RetryOptions{ + MaxRetries: 2, + InitialDelayIn: 1 * time.Millisecond, + BackoffFactor: 2.0, + OnAuthRefresh: func(_ context.Context, _ *ProviderError) error { + return errors.New("login canceled") + }, + } + + retryFn := RetryWithExponentialBackoffRespectingRetryHeaders[int](opts) + _, err := retryFn(context.Background(), func() (int, error) { + attempts++ + return 0, authErr() + }) + + var providerErr *ProviderError + if !errors.As(err, &providerErr) || providerErr.StatusCode != 401 { + t.Fatalf("expected original 401 ProviderError, got %T: %v", err, err) + } + if attempts != 1 { + t.Fatalf("expected 1 attempt (no retry after failed refresh), got %d", attempts) + } + }) + + t.Run("attempts at most one refresh", func(t *testing.T) { + t.Parallel() + attempts := 0 + refreshed := 0 + opts := RetryOptions{ + MaxRetries: 2, + InitialDelayIn: 1 * time.Millisecond, + BackoffFactor: 2.0, + OnAuthRefresh: func(_ context.Context, _ *ProviderError) error { + refreshed++ + return nil + }, + } + + retryFn := RetryWithExponentialBackoffRespectingRetryHeaders[int](opts) + _, err := retryFn(context.Background(), func() (int, error) { + attempts++ + return 0, authErr() + }) + if err == nil { + t.Fatal("expected error, got nil") + } + if refreshed != 1 { + t.Fatalf("expected exactly 1 refresh, got %d", refreshed) + } + // 1 initial + 1 retry after refresh = 2 attempts. + if attempts != 2 { + t.Fatalf("expected 2 attempts, got %d", attempts) + } + }) + + t.Run("does not refresh on non-auth errors", func(t *testing.T) { + t.Parallel() + refreshed := 0 + opts := RetryOptions{ + MaxRetries: 2, + InitialDelayIn: 1 * time.Millisecond, + BackoffFactor: 2.0, + OnAuthRefresh: func(_ context.Context, _ *ProviderError) error { + refreshed++ + return nil + }, + } + + retryFn := RetryWithExponentialBackoffRespectingRetryHeaders[int](opts) + _, _ = retryFn(context.Background(), func() (int, error) { + return 0, &ProviderError{StatusCode: 429, Message: "rate limited"} + }) + if refreshed != 0 { + t.Fatalf("expected no refresh on 429, got %d", refreshed) + } + }) + + t.Run("auth retry does not consume general retry budget", func(t *testing.T) { + t.Parallel() + attempts := 0 + opts := RetryOptions{ + MaxRetries: 2, + InitialDelayIn: 1 * time.Millisecond, + BackoffFactor: 2.0, + OnAuthRefresh: func(_ context.Context, _ *ProviderError) error { + return nil + }, + } + + retryFn := RetryWithExponentialBackoffRespectingRetryHeaders[int](opts) + result, err := retryFn(context.Background(), func() (int, error) { + attempts++ + switch attempts { + case 1: + return 0, authErr() // resolved via refresh, not the retry budget + case 2, 3: + return 0, &ProviderError{StatusCode: 500, Message: "server error"} + default: + return 99, nil + } + }) + if err != nil { + t.Fatalf("expected success after auth refresh + 2 transport retries, got %v", err) + } + if result != 99 { + t.Fatalf("expected result 99, got %d", result) + } + if attempts != 4 { + t.Fatalf("expected 4 attempts, got %d", attempts) + } + }) +} + +func TestIsAuthError(t *testing.T) { + t.Parallel() + + if !isAuthError(&ProviderError{StatusCode: 401}) { + t.Error("expected 401 to be an auth error") + } + if isAuthError(&ProviderError{StatusCode: 403}) { + t.Error("expected 403 to not be an auth error") + } + if isAuthError(&ProviderError{StatusCode: 500}) { + t.Error("expected 500 to not be an auth error") + } +} From b212c87641e08ca3ee636ad49fd1321658fbec13 Mon Sep 17 00:00:00 2001 From: Kieran Klukas Date: Mon, 13 Jul 2026 16:46:10 -0400 Subject: [PATCH 039/156] v0.37.0 --- version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.txt b/version.txt index 93d4c1ef0..0f1a7dfc7 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -0.36.0 +0.37.0 From d4fdb9b92c8793bc50211fde86f1e685a2896c5e Mon Sep 17 00:00:00 2001 From: Kieran Klukas Date: Mon, 13 Jul 2026 21:12:15 -0400 Subject: [PATCH 040/156] fix: copy ModelProvider when deepcopying fix: apply refreshed credentials on stream retry --- agent.go | 1 + 1 file changed, 1 insertion(+) diff --git a/agent.go b/agent.go index 4a4465601..ba3b53c7e 100644 --- a/agent.go +++ b/agent.go @@ -873,6 +873,7 @@ func (a *agent) Stream(ctx context.Context, opts AgentStreamCall) (*AgentResult, MaxRetries: opts.MaxRetries, OnRetry: opts.OnRetry, OnAuthRefresh: opts.OnAuthRefresh, + ModelProvider: opts.ModelProvider, StopWhen: opts.StopWhen, PrepareStep: opts.PrepareStep, RepairToolCall: opts.RepairToolCall, From bc2ff36b6abaaff6b27bf49f80a467e21673968a Mon Sep 17 00:00:00 2001 From: Kieran Klukas Date: Mon, 13 Jul 2026 21:13:28 -0400 Subject: [PATCH 041/156] v0.37.1 --- version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.txt b/version.txt index 0f1a7dfc7..9b1bb8512 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -0.37.0 +0.37.1 From 6504cf79ec4970c8d926fc3a33b6ab38a173f2fb Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Wed, 15 Jul 2026 09:59:46 -0300 Subject: [PATCH 042/156] chore: switch back to upstream openai sdk (#313) * Crush PR: https://github.com/charmbracelet/crush/pull/3308 * Ref: https://github.com/openai/openai-go/issues/556 * Ref: https://github.com/openai/openai-go/pull/621 We were using our own fork with a fix for SSE comment breaking the SDK. (Only specific providers send SSE comments and were failing with it, like OpenRouter). This was fixed and now we can use upstream again. --- go.mod | 2 +- go.sum | 4 ++-- providers/azure/azure.go | 4 ++-- providers/openai/call_useragent.go | 2 +- providers/openai/error.go | 2 +- providers/openai/language_model.go | 6 +++--- providers/openai/language_model_hooks.go | 6 +++--- providers/openai/openai.go | 4 ++-- providers/openai/openai_test.go | 2 +- providers/openai/provider_options.go | 4 ++-- providers/openai/responses_language_model.go | 8 ++++---- providers/openaicompat/language_model_hooks.go | 6 +++--- providers/openaicompat/openaicompat.go | 2 +- providers/openrouter/language_model_hooks.go | 4 ++-- providers/openrouter/openrouter.go | 2 +- providers/vercel/language_model_hooks.go | 4 ++-- providers/vercel/vercel.go | 2 +- 17 files changed, 32 insertions(+), 32 deletions(-) diff --git a/go.mod b/go.mod index 7734638bf..77ba44b95 100644 --- a/go.mod +++ b/go.mod @@ -10,7 +10,6 @@ require ( github.com/aws/aws-sdk-go-v2/config v1.32.27 github.com/aws/smithy-go v1.27.3 github.com/charmbracelet/anthropic-sdk-go v0.0.0-20260223140439-63879b0b8dab - github.com/charmbracelet/openai-go v0.0.0-20260617131321-5e4b9c18c4be github.com/charmbracelet/x/exp/slice v0.0.0-20250904123553-b4e2667e5ad5 github.com/charmbracelet/x/exp/strings v0.1.0 github.com/charmbracelet/x/json v0.2.0 @@ -18,6 +17,7 @@ require ( github.com/google/uuid v1.6.0 github.com/joho/godotenv v1.5.1 github.com/kaptinlin/jsonschema v0.9.3 + github.com/openai/openai-go/v3 v3.43.0 github.com/stretchr/testify v1.11.1 golang.org/x/oauth2 v0.36.0 google.golang.org/genai v1.62.0 diff --git a/go.sum b/go.sum index ca7c4c5b3..933e4b6f2 100644 --- a/go.sum +++ b/go.sum @@ -88,8 +88,6 @@ github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UF github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/charmbracelet/anthropic-sdk-go v0.0.0-20260223140439-63879b0b8dab h1:J7XQLgl9sefgTnTGrmX3xqvp5o6MCiBzEjGv5igAlc4= github.com/charmbracelet/anthropic-sdk-go v0.0.0-20260223140439-63879b0b8dab/go.mod h1:hqlYqR7uPKOKfnNeicUbZp0Ps0GeYFlKYtwh5HGDCx8= -github.com/charmbracelet/openai-go v0.0.0-20260617131321-5e4b9c18c4be h1:pg+OWlIkk9HOe/8P5J95aKe2wGDzFUiiyFOUpwR30B4= -github.com/charmbracelet/openai-go v0.0.0-20260617131321-5e4b9c18c4be/go.mod h1:1DahUaExbUZx/jD+FNT2PKP4L9rLE5+ZBRuI8mZjd/E= github.com/charmbracelet/x/exp/slice v0.0.0-20250904123553-b4e2667e5ad5 h1:DTSZxdV9qQagD4iGcAt9RgaRBZtJl01bfKgdLzUzUPI= github.com/charmbracelet/x/exp/slice v0.0.0-20250904123553-b4e2667e5ad5/go.mod h1:vI5nDVMWi6veaYH+0Fmvpbe/+cv/iJfMntdh+N0+Tms= github.com/charmbracelet/x/exp/strings v0.1.0 h1:i69S2XI7uG1u4NLGeJPSYU++Nmjvpo9nwd6aoEm7gkA= @@ -177,6 +175,8 @@ github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/openai/openai-go/v3 v3.43.0 h1:C+MFVUMU3TJNgES+Ikt7HF8xcX7J0wynKeR9ST22hZM= +github.com/openai/openai-go/v3 v3.43.0/go.mod h1:cdufnVK14cWcT9qA1rRtrXx4FTRsgbDPW7Ia7SS5cZo= github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ= github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU= github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= diff --git a/providers/azure/azure.go b/providers/azure/azure.go index bec505cdb..7435198dc 100644 --- a/providers/azure/azure.go +++ b/providers/azure/azure.go @@ -8,8 +8,8 @@ import ( "charm.land/fantasy" "charm.land/fantasy/providers/openai" - "github.com/charmbracelet/openai-go/azure" - "github.com/charmbracelet/openai-go/option" + "github.com/openai/openai-go/v3/azure" + "github.com/openai/openai-go/v3/option" ) type options struct { diff --git a/providers/openai/call_useragent.go b/providers/openai/call_useragent.go index baee1775e..2602c0dab 100644 --- a/providers/openai/call_useragent.go +++ b/providers/openai/call_useragent.go @@ -3,7 +3,7 @@ package openai import ( "charm.land/fantasy" "charm.land/fantasy/providers/internal/httpheaders" - "github.com/charmbracelet/openai-go/option" + "github.com/openai/openai-go/v3/option" ) // callUARequestOptions returns per-request options that override the diff --git a/providers/openai/error.go b/providers/openai/error.go index 12dff7511..c3153a019 100644 --- a/providers/openai/error.go +++ b/providers/openai/error.go @@ -10,7 +10,7 @@ import ( "strings" "charm.land/fantasy" - "github.com/charmbracelet/openai-go" + "github.com/openai/openai-go/v3" ) var ( diff --git a/providers/openai/language_model.go b/providers/openai/language_model.go index 5ba94450b..f9b03ff0c 100644 --- a/providers/openai/language_model.go +++ b/providers/openai/language_model.go @@ -14,10 +14,10 @@ import ( "charm.land/fantasy" "charm.land/fantasy/object" "charm.land/fantasy/schema" - "github.com/charmbracelet/openai-go" - "github.com/charmbracelet/openai-go/packages/param" - "github.com/charmbracelet/openai-go/shared" "github.com/google/uuid" + "github.com/openai/openai-go/v3" + "github.com/openai/openai-go/v3/packages/param" + "github.com/openai/openai-go/v3/shared" ) type languageModel struct { diff --git a/providers/openai/language_model_hooks.go b/providers/openai/language_model_hooks.go index 4d2ab5f2d..b4cc5de1f 100644 --- a/providers/openai/language_model_hooks.go +++ b/providers/openai/language_model_hooks.go @@ -6,9 +6,9 @@ import ( "strings" "charm.land/fantasy" - "github.com/charmbracelet/openai-go" - "github.com/charmbracelet/openai-go/packages/param" - "github.com/charmbracelet/openai-go/shared" + "github.com/openai/openai-go/v3" + "github.com/openai/openai-go/v3/packages/param" + "github.com/openai/openai-go/v3/shared" ) // LanguageModelPrepareCallFunc is a function that prepares the call for the language model. diff --git a/providers/openai/openai.go b/providers/openai/openai.go index 3e5714e51..b4878966a 100644 --- a/providers/openai/openai.go +++ b/providers/openai/openai.go @@ -8,8 +8,8 @@ import ( "charm.land/fantasy" "charm.land/fantasy/providers/internal/httpheaders" - "github.com/charmbracelet/openai-go" - "github.com/charmbracelet/openai-go/option" + "github.com/openai/openai-go/v3" + "github.com/openai/openai-go/v3/option" ) const ( diff --git a/providers/openai/openai_test.go b/providers/openai/openai_test.go index 2d4a8785d..1ee97495a 100644 --- a/providers/openai/openai_test.go +++ b/providers/openai/openai_test.go @@ -12,7 +12,7 @@ import ( "testing" "charm.land/fantasy" - "github.com/charmbracelet/openai-go/packages/param" + "github.com/openai/openai-go/v3/packages/param" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) diff --git a/providers/openai/provider_options.go b/providers/openai/provider_options.go index 2aa482fce..cf558ab40 100644 --- a/providers/openai/provider_options.go +++ b/providers/openai/provider_options.go @@ -5,8 +5,8 @@ import ( "encoding/json" "charm.land/fantasy" - "github.com/charmbracelet/openai-go" - "github.com/charmbracelet/openai-go/packages/respjson" + "github.com/openai/openai-go/v3" + "github.com/openai/openai-go/v3/packages/respjson" ) // ReasoningEffort represents the reasoning effort level for OpenAI models. diff --git a/providers/openai/responses_language_model.go b/providers/openai/responses_language_model.go index 746f46edd..77ac84539 100644 --- a/providers/openai/responses_language_model.go +++ b/providers/openai/responses_language_model.go @@ -12,11 +12,11 @@ import ( "charm.land/fantasy" "charm.land/fantasy/object" "charm.land/fantasy/schema" - "github.com/charmbracelet/openai-go" - "github.com/charmbracelet/openai-go/packages/param" - "github.com/charmbracelet/openai-go/responses" - "github.com/charmbracelet/openai-go/shared" "github.com/google/uuid" + "github.com/openai/openai-go/v3" + "github.com/openai/openai-go/v3/packages/param" + "github.com/openai/openai-go/v3/responses" + "github.com/openai/openai-go/v3/shared" ) const topLogprobsMax = 20 diff --git a/providers/openaicompat/language_model_hooks.go b/providers/openaicompat/language_model_hooks.go index acdb62fb1..0b9b64210 100644 --- a/providers/openaicompat/language_model_hooks.go +++ b/providers/openaicompat/language_model_hooks.go @@ -8,9 +8,9 @@ import ( "charm.land/fantasy" "charm.land/fantasy/providers/openai" - openaisdk "github.com/charmbracelet/openai-go" - "github.com/charmbracelet/openai-go/packages/param" - "github.com/charmbracelet/openai-go/shared" + openaisdk "github.com/openai/openai-go/v3" + "github.com/openai/openai-go/v3/packages/param" + "github.com/openai/openai-go/v3/shared" ) const reasoningStartedCtx = "reasoning_started" diff --git a/providers/openaicompat/openaicompat.go b/providers/openaicompat/openaicompat.go index 9bd9a13b2..af8948579 100644 --- a/providers/openaicompat/openaicompat.go +++ b/providers/openaicompat/openaicompat.go @@ -4,7 +4,7 @@ package openaicompat import ( "charm.land/fantasy" "charm.land/fantasy/providers/openai" - "github.com/charmbracelet/openai-go/option" + "github.com/openai/openai-go/v3/option" ) type options struct { diff --git a/providers/openrouter/language_model_hooks.go b/providers/openrouter/language_model_hooks.go index 265c0c098..8cc4d3407 100644 --- a/providers/openrouter/language_model_hooks.go +++ b/providers/openrouter/language_model_hooks.go @@ -11,9 +11,9 @@ import ( "charm.land/fantasy/providers/anthropic" "charm.land/fantasy/providers/google" "charm.land/fantasy/providers/openai" - openaisdk "github.com/charmbracelet/openai-go" - "github.com/charmbracelet/openai-go/packages/param" xstrings "github.com/charmbracelet/x/exp/strings" + openaisdk "github.com/openai/openai-go/v3" + "github.com/openai/openai-go/v3/packages/param" ) const reasoningStartedCtx = "reasoning_started" diff --git a/providers/openrouter/openrouter.go b/providers/openrouter/openrouter.go index 623186bc6..fc9c9756b 100644 --- a/providers/openrouter/openrouter.go +++ b/providers/openrouter/openrouter.go @@ -6,7 +6,7 @@ import ( "charm.land/fantasy" "charm.land/fantasy/providers/openai" - "github.com/charmbracelet/openai-go/option" + "github.com/openai/openai-go/v3/option" ) type options struct { diff --git a/providers/vercel/language_model_hooks.go b/providers/vercel/language_model_hooks.go index e01ed1aaa..3361ecf4d 100644 --- a/providers/vercel/language_model_hooks.go +++ b/providers/vercel/language_model_hooks.go @@ -11,8 +11,8 @@ import ( "charm.land/fantasy/providers/anthropic" "charm.land/fantasy/providers/google" openaipkg "charm.land/fantasy/providers/openai" - openaisdk "github.com/charmbracelet/openai-go" - "github.com/charmbracelet/openai-go/packages/param" + openaisdk "github.com/openai/openai-go/v3" + "github.com/openai/openai-go/v3/packages/param" ) const reasoningStartedCtx = "reasoning_started" diff --git a/providers/vercel/vercel.go b/providers/vercel/vercel.go index 65e8d31c3..79f31f1df 100644 --- a/providers/vercel/vercel.go +++ b/providers/vercel/vercel.go @@ -4,7 +4,7 @@ package vercel import ( "charm.land/fantasy" "charm.land/fantasy/providers/openai" - "github.com/charmbracelet/openai-go/option" + "github.com/openai/openai-go/v3/option" ) type options struct { From b4af693934bcd0b6218017307d69db24f63754ba Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 15 Jul 2026 13:06:59 +0000 Subject: [PATCH 043/156] chore(deps): bump the all group across 1 directory with 3 updates (#311) Bumps the all group with 3 updates in the / directory: [cloud.google.com/go/auth](https://github.com/googleapis/google-cloud-go), [github.com/aws/aws-sdk-go-v2/config](https://github.com/aws/aws-sdk-go-v2) and [google.golang.org/genai](https://github.com/googleapis/go-genai). Updates `cloud.google.com/go/auth` from 0.20.0 to 0.22.0 - [Release notes](https://github.com/googleapis/google-cloud-go/releases) - [Changelog](https://github.com/googleapis/google-cloud-go/blob/main/CHANGES.md) - [Commits](https://github.com/googleapis/google-cloud-go/compare/v0.20.0...v0.22.0) Updates `github.com/aws/aws-sdk-go-v2/config` from 1.32.27 to 1.32.30 - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/config/v1.32.27...config/v1.32.30) Updates `google.golang.org/genai` from 1.62.0 to 1.63.0 - [Release notes](https://github.com/googleapis/go-genai/releases) - [Changelog](https://github.com/googleapis/go-genai/blob/v1.63.0/CHANGELOG.md) - [Commits](https://github.com/googleapis/go-genai/compare/v1.62.0...v1.63.0) --- updated-dependencies: - dependency-name: cloud.google.com/go/auth dependency-version: 0.21.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: all - dependency-name: github.com/aws/aws-sdk-go-v2/config dependency-version: 1.32.29 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all - dependency-name: google.golang.org/genai dependency-version: 1.63.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: all ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 26 +++++++++++++------------- go.sum | 52 ++++++++++++++++++++++++++-------------------------- 2 files changed, 39 insertions(+), 39 deletions(-) diff --git a/go.mod b/go.mod index 77ba44b95..d5dcb6123 100644 --- a/go.mod +++ b/go.mod @@ -4,10 +4,10 @@ go 1.26.5 require ( charm.land/x/vcr v0.1.1 - cloud.google.com/go/auth v0.20.0 + cloud.google.com/go/auth v0.22.0 github.com/ardanlabs/kronk v1.28.6 github.com/aws/aws-sdk-go-v2 v1.42.1 - github.com/aws/aws-sdk-go-v2/config v1.32.27 + github.com/aws/aws-sdk-go-v2/config v1.32.30 github.com/aws/smithy-go v1.27.3 github.com/charmbracelet/anthropic-sdk-go v0.0.0-20260223140439-63879b0b8dab github.com/charmbracelet/x/exp/slice v0.0.0-20250904123553-b4e2667e5ad5 @@ -20,7 +20,7 @@ require ( github.com/openai/openai-go/v3 v3.43.0 github.com/stretchr/testify v1.11.1 golang.org/x/oauth2 v0.36.0 - google.golang.org/genai v1.62.0 + google.golang.org/genai v1.63.0 ) require ( @@ -38,7 +38,7 @@ require ( github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.57.0 // indirect github.com/ardanlabs/jinja v1.4.0 // indirect github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.13 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.19.26 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.19.29 // indirect github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.30 // indirect github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.30 // indirect github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.30 // indirect @@ -48,10 +48,10 @@ require ( github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.30 // indirect github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.29 // indirect github.com/aws/aws-sdk-go-v2/service/s3 v1.104.0 // indirect - github.com/aws/aws-sdk-go-v2/service/signin v1.2.2 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.31.5 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.36.8 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.43.5 // indirect + github.com/aws/aws-sdk-go-v2/service/signin v1.4.1 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.32.1 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.37.1 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.44.1 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d // indirect github.com/cenkalti/backoff/v5 v5.0.3 // indirect @@ -70,7 +70,7 @@ require ( github.com/google/go-cmp v0.7.0 // indirect github.com/google/s2a-go v0.1.9 // indirect github.com/googleapis/enterprise-certificate-proxy v0.3.17 // indirect - github.com/googleapis/gax-go/v2 v2.22.0 // indirect + github.com/googleapis/gax-go/v2 v2.23.0 // indirect github.com/gorilla/websocket v1.5.3 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.29.0 // indirect github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.73 // indirect @@ -116,11 +116,11 @@ require ( golang.org/x/sys v0.46.0 // indirect golang.org/x/text v0.38.0 // indirect golang.org/x/time v0.15.0 // indirect - google.golang.org/api v0.286.0 // indirect + google.golang.org/api v0.287.1 // indirect google.golang.org/genproto v0.0.0-20260622175928-b703f567277d // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20260622175928-b703f567277d // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20260622175928-b703f567277d // indirect - google.golang.org/grpc v1.81.1 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20260630182238-925bb5da69e7 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20260630182238-925bb5da69e7 // indirect + google.golang.org/grpc v1.82.0 // indirect google.golang.org/protobuf v1.36.11 // indirect gopkg.in/dnaeon/go-vcr.v4 v4.0.6-0.20251110073552-01de4eb40290 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/go.sum b/go.sum index 933e4b6f2..efb2329f3 100644 --- a/go.sum +++ b/go.sum @@ -4,8 +4,8 @@ charm.land/x/vcr v0.1.1 h1:PXCFMUG0rPtyk35rhfzYCJEduOzWXCIbrXTFq4OF/9Q= charm.land/x/vcr v0.1.1/go.mod h1:eByq2gqzWvcct/8XE2XO5KznoWEBiXH56+y2gphbltM= cloud.google.com/go v0.123.0 h1:2NAUJwPR47q+E35uaJeYoNhuNEM9kM8SjgRgdeOJUSE= cloud.google.com/go v0.123.0/go.mod h1:xBoMV08QcqUGuPW65Qfm1o9Y4zKZBpGS+7bImXLTAZU= -cloud.google.com/go/auth v0.20.0 h1:kXTssoVb4azsVDoUiF8KvxAqrsQcQtB53DcSgta74CA= -cloud.google.com/go/auth v0.20.0/go.mod h1:942/yi/itH1SsmpyrbnTMDgGfdy2BUqIKyd0cyYLc5Q= +cloud.google.com/go/auth v0.22.0 h1:Xp9wAKkLoeaYb5pYZZoQGz4E9sdPxIbzS3gywZE3ciQ= +cloud.google.com/go/auth v0.22.0/go.mod h1:M9o2Oz+YI2jAfxewJgb1vyI3vceHF+eohmxyzmrl+9s= cloud.google.com/go/auth/oauth2adapt v0.2.8 h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIiLpZnkHRbnc= cloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c= cloud.google.com/go/compute/metadata v0.9.0 h1:pDUj4QMoPejqq20dK0Pg2N4yG9zIkYGdBtwLoEkH9Zs= @@ -46,10 +46,10 @@ github.com/aws/aws-sdk-go-v2 v1.42.1 h1:9eOTgu1z/dVtYpNZ3/8/XbbaX0x/BqE3HUzAzs6K github.com/aws/aws-sdk-go-v2 v1.42.1/go.mod h1:5pKeft2eJj+gElQ38Jqg4ibCqh+/AK33/0X3hip7IjM= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.13 h1:p1BBrg/Hhp6uK7zpejeI8QFXHJeC/mynzi04Sl03k9g= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.13/go.mod h1:8cIfkE9MDhkRZGpQ22aV6/lkYeYSozpz16Smrs5x4Ls= -github.com/aws/aws-sdk-go-v2/config v1.32.27 h1:SJwJ9Q4kM7v5QVSYYyXj3znRr6lNyZEhSgAXmXXcVbI= -github.com/aws/aws-sdk-go-v2/config v1.32.27/go.mod h1:uBfrzTRedDmB2u+b6+UlaKJy2O6VSH5un2jP24t/KvQ= -github.com/aws/aws-sdk-go-v2/credentials v1.19.26 h1:Si8kk1kyJnuJWCEgiwpBtTdtgSdR7i611596NnC0YIQ= -github.com/aws/aws-sdk-go-v2/credentials v1.19.26/go.mod h1:lBckz+W9SAdNtSDw3pYgQUJDJFcBBWry0GSzw+bK0TY= +github.com/aws/aws-sdk-go-v2/config v1.32.30 h1:XwsEzpTJfQYJbFicz/QMLwAZdyeNVVoOEkbF7R3gPJk= +github.com/aws/aws-sdk-go-v2/config v1.32.30/go.mod h1:Ud32SuMc+/9BGxfpSVld7HrE2o05JwKmXY4M3jOQNZU= +github.com/aws/aws-sdk-go-v2/credentials v1.19.29 h1:WHZGssHH887cO0ox07SIQZsFx3MKD4ps6w0xUEmnKYQ= +github.com/aws/aws-sdk-go-v2/credentials v1.19.29/go.mod h1:Mhl0xR6zjguiuj00XRx2wMx22sAltk7oya39sT7fdg8= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.30 h1:/hi1JADLEW9YYryEz1w4GQu0EtP23pP553Cf9KgsDV4= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.30/go.mod h1:/3AOgy4K17Dm4ucMZVC/MJkzy5kmfKUcINRHZyo0koQ= github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.30 h1:xM/Is9cKMHa8Jj8zkvWhvrFkZsXJV9E+BB4g0HW0duQ= @@ -68,14 +68,14 @@ github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.29 h1:hiME6pBzC7OTl github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.29/go.mod h1:G7RP+uhagpKtKhd1BM9N6JQqjCcGEU47K5lBVZQyRQw= github.com/aws/aws-sdk-go-v2/service/s3 v1.104.0 h1:ta8csKy5vN91F3i5gGR85lFV0srBqySEji7Jroes6rE= github.com/aws/aws-sdk-go-v2/service/s3 v1.104.0/go.mod h1:77ZAgynvx1txMvDG8gGWoWkO1augYDxkp9JElWFgjQU= -github.com/aws/aws-sdk-go-v2/service/signin v1.2.2 h1:69JEZSDTQ+UNbTWQJCZMmbpQb5sfc79KUt0O7Pyfjmo= -github.com/aws/aws-sdk-go-v2/service/signin v1.2.2/go.mod h1:mxC0nT/C8wMMS97DemZPzvUZxvIt+2Iq+eS3JdFZGgg= -github.com/aws/aws-sdk-go-v2/service/sso v1.31.5 h1:xlK3Tdc8FO7Tq1k0+hL+otF33glj+dE+qeM5iINiDvU= -github.com/aws/aws-sdk-go-v2/service/sso v1.31.5/go.mod h1:u8af9Nqkmqnr96f7v9nHqzZT9XBwbXEkTiqT4ROuJSE= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.36.8 h1:yX1IbiBfC7SdEgDwIGnRaZyPPDRbQPDOJxl8102PcGk= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.36.8/go.mod h1:DMPWJBjYs6+3+f/qhBFEFPPlQ6NlhWjai3dJNvipJ84= -github.com/aws/aws-sdk-go-v2/service/sts v1.43.5 h1:T3ANO8QWDbzQD8f4+UaX+fvJlyGnOFMKLbW+NGBHg04= -github.com/aws/aws-sdk-go-v2/service/sts v1.43.5/go.mod h1:9gdl4RrflIdpDb2TlXshWgR1F9TeCkvqDx77Vpr4Z/Q= +github.com/aws/aws-sdk-go-v2/service/signin v1.4.1 h1:V7ZZ300WPXGjvkyore5DGe0ljVPOxCXie/thWdtSBXE= +github.com/aws/aws-sdk-go-v2/service/signin v1.4.1/go.mod h1:mxC0nT/C8wMMS97DemZPzvUZxvIt+2Iq+eS3JdFZGgg= +github.com/aws/aws-sdk-go-v2/service/sso v1.32.1 h1:gYFYh4iLLcAOJRLNPY2aD2g9DIhKn4eof8UkIrr1rTk= +github.com/aws/aws-sdk-go-v2/service/sso v1.32.1/go.mod h1:u8af9Nqkmqnr96f7v9nHqzZT9XBwbXEkTiqT4ROuJSE= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.37.1 h1:arjT9Cm3/WYbGmD5TUZHk4UQn4Lle1fUNZs5FC6CtF0= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.37.1/go.mod h1:DMPWJBjYs6+3+f/qhBFEFPPlQ6NlhWjai3dJNvipJ84= +github.com/aws/aws-sdk-go-v2/service/sts v1.44.1 h1:RvfHDg+xvAeZ+5741vUEjpOVtYSIm93W2zhx10Xtydw= +github.com/aws/aws-sdk-go-v2/service/sts v1.44.1/go.mod h1:9gdl4RrflIdpDb2TlXshWgR1F9TeCkvqDx77Vpr4Z/Q= github.com/aws/smithy-go v1.27.3 h1:F3Zb497UhhskkfpJmfkXswyo+t0sh9OTBnIHjogWbVY= github.com/aws/smithy-go v1.27.3/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= @@ -139,8 +139,8 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/enterprise-certificate-proxy v0.3.17 h1:73NfMHdiqo9JFU9+7a5ExpVa10/R29pXfZIaW559nrg= github.com/googleapis/enterprise-certificate-proxy v0.3.17/go.mod h1:rSEsBUemEBZEexP2y6jPp16LUmUbjmSbcPMQizR0o4k= -github.com/googleapis/gax-go/v2 v2.22.0 h1:PjIWBpgGIVKGoCXuiCoP64altEJCj3/Ei+kSU5vlZD4= -github.com/googleapis/gax-go/v2 v2.22.0/go.mod h1:irWBbALSr0Sk3qlqb9SyJ1h68WjgeFuiOzI4Rqw5+aY= +github.com/googleapis/gax-go/v2 v2.23.0 h1:Tchl7qkvE7Ip3y+ztvNufYFvkfqTe7NfLTYGIdJRLuE= +github.com/googleapis/gax-go/v2 v2.23.0/go.mod h1:rBQKOVJCdb8IFEzg+FCwlt1LP/xMDGuqUXhUG+XMXEg= github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/grpc-ecosystem/grpc-gateway/v2 v2.29.0 h1:5VipnvEpbqr2gA2VbM+nYVbkIF28c5ZQfqCBQ5g2xfk= @@ -261,18 +261,18 @@ golang.org/x/time v0.15.0 h1:bbrp8t3bGUeFOx08pvsMYRTCVSMk89u4tKbNOZbp88U= golang.org/x/time v0.15.0/go.mod h1:Y4YMaQmXwGQZoFaVFk4YpCt4FLQMYKZe9oeV/f4MSno= gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4= gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E= -google.golang.org/api v0.286.0 h1:TdTXMvzYKnWV1/lPbCdbXRqBrkDqjPto22H2xeZZ8LI= -google.golang.org/api v0.286.0/go.mod h1:NlOlUIr8MPoIhT9Bb/oUnRuHbJOLwxb6JSYJM8Yz+jQ= -google.golang.org/genai v1.62.0 h1:PaBju84orf4Vbcc6OfHe4vxhxhjwulKTgOpEc3iIc00= -google.golang.org/genai v1.62.0/go.mod h1:mDdPDFXo1Ats7f1WXVyZgWb/CkMzFWTWJruIMy7hGIU= +google.golang.org/api v0.287.1 h1:LiyJx32VU3cwQfLchn/513qKhc25hq0pEANYJoWNnnI= +google.golang.org/api v0.287.1/go.mod h1:lM2kYRzYUCBY91P9h6VF1PYmvhxii3O5hji37qRvIcY= +google.golang.org/genai v1.63.0 h1:Iryg+4TBco5HaRbwVhAV/ROKVcWiZkuvQzKb4u1QggY= +google.golang.org/genai v1.63.0/go.mod h1:mDdPDFXo1Ats7f1WXVyZgWb/CkMzFWTWJruIMy7hGIU= google.golang.org/genproto v0.0.0-20260622175928-b703f567277d h1:CP5omUq8AJTiWMrPKM1WRLJ7zZeXd9OPcQD3TbBNAyY= google.golang.org/genproto v0.0.0-20260622175928-b703f567277d/go.mod h1:DrwuGJgFSEVNpv3S5Q5VxhRTvdnjauw9GtvwVOEARfA= -google.golang.org/genproto/googleapis/api v0.0.0-20260622175928-b703f567277d h1:xr2lwHI91bn3UiXcnyzRMQjp2LRiM8wEHzwUaE0YhTs= -google.golang.org/genproto/googleapis/api v0.0.0-20260622175928-b703f567277d/go.mod h1:O0ZOWSrfWfJ+Z5HbwZ+wNtHsg/vk1k2C/w67eww8PfQ= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260622175928-b703f567277d h1:mpAgMyM9vQHxycBlDq50y1VHpfSfVwzXvrQKtYbXuUY= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260622175928-b703f567277d/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= -google.golang.org/grpc v1.81.1 h1:VnnIIZ88UzOOKLukQi+ImGz8O1Wdp8nAGGnvOfEIWQQ= -google.golang.org/grpc v1.81.1/go.mod h1:xGH9GfzOyMTGIOXBJmXt+BX/V0kcdQbdcuwQ/zNw42I= +google.golang.org/genproto/googleapis/api v0.0.0-20260630182238-925bb5da69e7 h1:jQ9p21COKWjP3VwuFrNRiiOTMh3mPpN45R7SLrH/HUU= +google.golang.org/genproto/googleapis/api v0.0.0-20260630182238-925bb5da69e7/go.mod h1:KqHwBx2upmfa1XSi1WuRvC+2VGCLtooKkfmyvRbUmqA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260630182238-925bb5da69e7 h1:eM/YSd5bBFagF51o1E745Ta7RwzpW0h+z+QDNZOgmQ8= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260630182238-925bb5da69e7/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= +google.golang.org/grpc v1.82.0 h1:vguDnZUPjE26w09A63VoxZPnvPjB5Riyc0mkXPFmAIU= +google.golang.org/grpc v1.82.0/go.mod h1:yzTZ1TB1Z3SG+LIYaI+WiE8D5+PZ3ArnrSp8zF3+/ZA= google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= From 412729365c1af5998663dc3cd68f5c4824c4b0f8 Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Wed, 15 Jul 2026 10:10:39 -0300 Subject: [PATCH 044/156] v0.37.2 --- version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.txt b/version.txt index 9b1bb8512..8570a3aeb 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -0.37.1 +0.37.2 From 92ff5633638cf12293f1bef6545bd6e4eaf751f0 Mon Sep 17 00:00:00 2001 From: William Kennedy Date: Wed, 15 Jul 2026 10:01:07 -0500 Subject: [PATCH 045/156] chore(deps): upgrading kronk (#315) --- examples/go.mod | 98 +++++++++++------------ examples/go.sum | 204 ++++++++++++++++++++++++------------------------ go.mod | 52 ++++++------ go.sum | 116 +++++++++++++-------------- 4 files changed, 235 insertions(+), 235 deletions(-) diff --git a/examples/go.mod b/examples/go.mod index 05d0fd10f..bc4a4bfde 100644 --- a/examples/go.mod +++ b/examples/go.mod @@ -1,6 +1,6 @@ module charm.land/fantasy/examples -go 1.26.4 +go 1.26.5 replace charm.land/fantasy => ../ @@ -14,42 +14,41 @@ require ( require ( cel.dev/expr v0.25.2 // indirect cloud.google.com/go v0.123.0 // indirect - cloud.google.com/go/auth v0.20.0 // indirect + cloud.google.com/go/auth v0.22.0 // indirect cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect cloud.google.com/go/compute/metadata v0.9.0 // indirect - cloud.google.com/go/iam v1.11.0 // indirect - cloud.google.com/go/monitoring v1.29.0 // indirect - cloud.google.com/go/storage v1.62.3 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.33.0 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.57.0 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.57.0 // indirect + cloud.google.com/go/iam v1.12.0 // indirect + cloud.google.com/go/monitoring v1.30.0 // indirect + cloud.google.com/go/storage v1.63.1 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.34.0 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.58.0 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.58.0 // indirect github.com/ardanlabs/jinja v1.4.0 // indirect - github.com/ardanlabs/kronk v1.28.4 // indirect - github.com/aws/aws-sdk-go-v2 v1.42.0 // indirect - github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.13 // indirect - github.com/aws/aws-sdk-go-v2/config v1.32.25 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.19.24 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.29 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.29 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.29 // indirect - github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.30 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.12 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.22 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.29 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.29 // indirect - github.com/aws/aws-sdk-go-v2/service/s3 v1.104.0 // indirect - github.com/aws/aws-sdk-go-v2/service/signin v1.2.0 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.31.3 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.36.6 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.43.3 // indirect - github.com/aws/smithy-go v1.27.2 // indirect + github.com/ardanlabs/kronk v1.28.7 // indirect + github.com/aws/aws-sdk-go-v2 v1.42.1 // indirect + github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.14 // indirect + github.com/aws/aws-sdk-go-v2/config v1.32.30 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.19.29 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.30 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.30 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.30 // indirect + github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.31 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.13 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.23 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.30 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.31 // indirect + github.com/aws/aws-sdk-go-v2/service/s3 v1.105.1 // indirect + github.com/aws/aws-sdk-go-v2/service/signin v1.4.1 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.32.1 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.37.1 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.44.1 // indirect + github.com/aws/smithy-go v1.27.3 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d // indirect github.com/cenkalti/backoff/v5 v5.0.3 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/charmbracelet/anthropic-sdk-go v0.0.0-20260223140439-63879b0b8dab // indirect github.com/charmbracelet/colorprofile v0.3.2 // indirect - github.com/charmbracelet/openai-go v0.0.0-20260617131321-5e4b9c18c4be // indirect github.com/charmbracelet/x/ansi v0.10.2 // indirect github.com/charmbracelet/x/cellbuf v0.0.14-0.20250811133356-e0c5dbe5ea4a // indirect github.com/charmbracelet/x/exp/slice v0.0.0-20250904123553-b4e2667e5ad5 // indirect @@ -61,7 +60,7 @@ require ( github.com/envoyproxy/protoc-gen-validate v1.3.3 // indirect github.com/felixge/httpsnoop v1.1.0 // indirect github.com/go-jose/go-jose/v4 v4.1.4 // indirect - github.com/go-json-experiment/json v0.0.0-20260601182631-00ed12fed2a6 // indirect + github.com/go-json-experiment/json v0.0.0-20260623181947-01eb4420fa68 // indirect github.com/go-logfmt/logfmt v0.6.0 // indirect github.com/go-logr/logr v1.4.3 // indirect github.com/go-logr/stdr v1.2.2 // indirect @@ -70,29 +69,30 @@ require ( github.com/google/go-cmp v0.7.0 // indirect github.com/google/s2a-go v0.1.9 // indirect github.com/google/uuid v1.6.0 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.3.17 // indirect - github.com/googleapis/gax-go/v2 v2.22.0 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.3.18 // indirect + github.com/googleapis/gax-go/v2 v2.23.0 // indirect github.com/gorilla/websocket v1.5.3 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.29.0 // indirect github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.73 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-getter v1.8.6 // indirect github.com/hashicorp/go-version v1.9.0 // indirect - github.com/hybridgroup/yzma v1.18.0 // indirect + github.com/hybridgroup/yzma v1.19.0 // indirect github.com/jupiterrider/ffi v0.7.0 // indirect - github.com/kaptinlin/jsonpointer v0.4.26 // indirect - github.com/kaptinlin/jsonschema v0.9.2 // indirect - github.com/klauspost/compress v1.18.6 // indirect + github.com/kaptinlin/jsonpointer v0.4.27 // indirect + github.com/kaptinlin/jsonschema v0.9.3 // indirect + github.com/klauspost/compress v1.19.0 // indirect github.com/lucasb-eyer/go-colorful v1.3.0 // indirect github.com/mattn/go-runewidth v0.0.17 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/muesli/cancelreader v0.2.2 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect + github.com/openai/openai-go/v3 v3.43.0 // indirect github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect github.com/prometheus/client_golang v1.23.2 // indirect github.com/prometheus/client_model v0.6.2 // indirect - github.com/prometheus/common v0.69.0 // indirect - github.com/prometheus/procfs v0.20.1 // indirect + github.com/prometheus/common v0.70.0 // indirect + github.com/prometheus/procfs v0.21.1 // indirect github.com/rivo/uniseg v0.4.7 // indirect github.com/spiffe/go-spiffe/v2 v2.8.1 // indirect github.com/tidwall/gjson v1.18.0 // indirect @@ -114,20 +114,20 @@ require ( go.opentelemetry.io/otel/trace v1.44.0 // indirect go.opentelemetry.io/proto/otlp v1.10.0 // indirect go.yaml.in/yaml/v2 v2.4.4 // indirect - golang.org/x/crypto v0.53.0 // indirect + golang.org/x/crypto v0.54.0 // indirect golang.org/x/exp v0.0.0-20260312153236-7ab1446f8b90 // indirect - golang.org/x/image v0.43.0 // indirect - golang.org/x/net v0.56.0 // indirect + golang.org/x/image v0.44.0 // indirect + golang.org/x/net v0.57.0 // indirect golang.org/x/oauth2 v0.36.0 // indirect - golang.org/x/sync v0.21.0 // indirect - golang.org/x/sys v0.46.0 // indirect - golang.org/x/text v0.38.0 // indirect + golang.org/x/sync v0.22.0 // indirect + golang.org/x/sys v0.47.0 // indirect + golang.org/x/text v0.40.0 // indirect golang.org/x/time v0.15.0 // indirect - google.golang.org/api v0.286.0 // indirect - google.golang.org/genai v1.61.0 // indirect - google.golang.org/genproto v0.0.0-20260622175928-b703f567277d // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20260622175928-b703f567277d // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20260622175928-b703f567277d // indirect - google.golang.org/grpc v1.81.1 // indirect + google.golang.org/api v0.288.0 // indirect + google.golang.org/genai v1.63.0 // indirect + google.golang.org/genproto v0.0.0-20260713224248-f5fc221cf8c4 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20260713224248-f5fc221cf8c4 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20260713224248-f5fc221cf8c4 // indirect + google.golang.org/grpc v1.82.0 // indirect google.golang.org/protobuf v1.36.11 // indirect ) diff --git a/examples/go.sum b/examples/go.sum index a3030562e..6fd7fbc12 100644 --- a/examples/go.sum +++ b/examples/go.sum @@ -2,72 +2,72 @@ cel.dev/expr v0.25.2 h1:K6j46C81hXtZQfuX60cVWQFBJahKSE2gfRbNuvr5bFs= cel.dev/expr v0.25.2/go.mod h1:hrXvqGP6G6gyx8UAHSHJ5RGk//1Oj5nXQ2NI02Nrsg4= cloud.google.com/go v0.123.0 h1:2NAUJwPR47q+E35uaJeYoNhuNEM9kM8SjgRgdeOJUSE= cloud.google.com/go v0.123.0/go.mod h1:xBoMV08QcqUGuPW65Qfm1o9Y4zKZBpGS+7bImXLTAZU= -cloud.google.com/go/auth v0.20.0 h1:kXTssoVb4azsVDoUiF8KvxAqrsQcQtB53DcSgta74CA= -cloud.google.com/go/auth v0.20.0/go.mod h1:942/yi/itH1SsmpyrbnTMDgGfdy2BUqIKyd0cyYLc5Q= +cloud.google.com/go/auth v0.22.0 h1:Xp9wAKkLoeaYb5pYZZoQGz4E9sdPxIbzS3gywZE3ciQ= +cloud.google.com/go/auth v0.22.0/go.mod h1:M9o2Oz+YI2jAfxewJgb1vyI3vceHF+eohmxyzmrl+9s= cloud.google.com/go/auth/oauth2adapt v0.2.8 h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIiLpZnkHRbnc= cloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c= cloud.google.com/go/compute/metadata v0.9.0 h1:pDUj4QMoPejqq20dK0Pg2N4yG9zIkYGdBtwLoEkH9Zs= cloud.google.com/go/compute/metadata v0.9.0/go.mod h1:E0bWwX5wTnLPedCKqk3pJmVgCBSM6qQI1yTBdEb3C10= -cloud.google.com/go/iam v1.11.0 h1:KieQ9Pb+LLPak1O3Rv3GgCxhnmkYf7Xyh0P5HfF1jFM= -cloud.google.com/go/iam v1.11.0/go.mod h1:KP+nKGugNJW4LcLx1uEZcq1ok5sQHFaQehQNl4QDgV4= +cloud.google.com/go/iam v1.12.0 h1:Aki3bX9aHUDKPHfnRJfDcTdVedvy6quGBQcTqx3DRXk= +cloud.google.com/go/iam v1.12.0/go.mod h1:FEZ4lXpADAC2AIpQY7LANNjjwyQ2jK439CI2VaD+sLY= cloud.google.com/go/logging v1.18.0 h1:KhzZq+1cSkPH9YUaKLLhLtQxIHitVayBmk0sGfoM9+k= cloud.google.com/go/logging v1.18.0/go.mod h1:ZGKnpBaURITh+g/uom2VhbiFoFWvejcrHPDhxFtU/gI= -cloud.google.com/go/longrunning v1.0.0 h1:lwzWEYD8+NkYV7dhexOz6kmlvajZA70+bW/xMhRVVdY= -cloud.google.com/go/longrunning v1.0.0/go.mod h1:8nqFBPOO1U/XkhWl0I19AMZEphrHi73VNABIpKYaTwM= -cloud.google.com/go/monitoring v1.29.0 h1:AHhDsFaSax1/4k+qlIDX/SDGe6hggnfXJ9dkgD9qBPY= -cloud.google.com/go/monitoring v1.29.0/go.mod h1:72NOVjJXHY/HBfoLT0+qlCZBT059+9VXLeAnL2PeeVM= -cloud.google.com/go/storage v1.62.3 h1:SZq1t23NCI+e96dH77Dg3PEfsNNEjqO8zE5AnD8gVD0= -cloud.google.com/go/storage v1.62.3/go.mod h1:cpYz/kRVZ+UQAF1uHeea10/9ewcRbxGoGNKsS9daSXA= +cloud.google.com/go/longrunning v1.2.0 h1:WjYH3YHBGCxGJP9M4dWGHBfXr/cFIjMkNgWcJj7/iMM= +cloud.google.com/go/longrunning v1.2.0/go.mod h1:5KMQALFGOCtFoi2xSOA1u3H7WKlhmckgiyFw7+LGQp0= +cloud.google.com/go/monitoring v1.30.0 h1:r/d+JUbyKmJ8b07iznuKfzVzrIXTWxHQ3lBRm3x2LlY= +cloud.google.com/go/monitoring v1.30.0/go.mod h1:htlUR0QWVMrjFzZmN4LGnMAve9xB/eduwjmINxVZ8RM= +cloud.google.com/go/storage v1.63.1 h1:CYXILV9G4CH0C18IQ9+V0h4XiqD2LhKnMLO0o7uJWNs= +cloud.google.com/go/storage v1.63.1/go.mod h1:lWyAtwvDZHdL3k68WVKbESP6bmWaV23ZJJ/JEVw/ZaQ= cloud.google.com/go/trace v1.16.0 h1:GmQovzFc5F0CNfl0VLgL64aoTtu7xsM0YajW2GlG9+E= cloud.google.com/go/trace v1.16.0/go.mod h1:r+bdAn16dKLSV1G2D5v3e58IlQlizfxWrUfjx7kM7X0= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.33.0 h1:l7+6kwRMJNwdCvYdDl7Eax+wzEYHSnNY7zrrfbhDdTA= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.33.0/go.mod h1:pJTkW8hEUIIi3Pf65lPZOnn4Y81yCllX6IWk2jNXdkM= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.57.0 h1:jLdiS1vO+XJFyDSWRHBx56r4s/NNtcl5J6KyCcWUX/w= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.57.0/go.mod h1:8lmpHY+1VRoteiOwyrQMDt1YGXOrFKCz+1wJW7n3ODY= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.57.0 h1:cSjUzZ7KU8hicTgzaSv9NmSyM9fTVK3y5lsBUl3wOis= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.57.0/go.mod h1:dzcEjy1WJ0Q4u9twNR3LcLhNoYMRCrMCMafpxa0TjPQ= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.57.0 h1:RoO5+d7uCmDqovLrHCr2/BuViUXvdcrNxyNM1pN9dDQ= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.57.0/go.mod h1:YqwkQPrWSC7+byyc1VlKbWLBF5JsW5IoL6xUkemYSXk= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.34.0 h1:yzIYdwuro811Z27D3T80Wkd3rqZzb0K43nner7Eh1yE= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.34.0/go.mod h1:pJTkW8hEUIIi3Pf65lPZOnn4Y81yCllX6IWk2jNXdkM= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.58.0 h1:ZYGajzJNcirVZpT1rltgf9iM+j9zZ4v8V9DrF+xKRJ8= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.58.0/go.mod h1:PDQyYBOzGtQgvshQI//UiXyzuMHCz0ndyu+4W8X82vM= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.58.0 h1:IBF8BbhKJkMsON/eY+LMu3aF3XMiotCb9KvkUmEkOJo= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.58.0/go.mod h1:dzcEjy1WJ0Q4u9twNR3LcLhNoYMRCrMCMafpxa0TjPQ= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.58.0 h1:SBZzZCiPmDrUV7NSCWY54OnKikO/oTydPCvyEyYaDDE= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.58.0/go.mod h1:YqwkQPrWSC7+byyc1VlKbWLBF5JsW5IoL6xUkemYSXk= github.com/ardanlabs/jinja v1.4.0 h1:9iE0/wF4zhcws1CYZCWqJTQP8YuhC4FjycBGzCTuOFw= github.com/ardanlabs/jinja v1.4.0/go.mod h1:aXXzlJfjA+T3XNKA/YT5ZtDq2VJxt5a5siZ8cl9B35Q= -github.com/ardanlabs/kronk v1.28.4 h1:dfyvJLnCmi3xgNASI4bzA9rfhPITTbd8WfbYeCUw+Fs= -github.com/ardanlabs/kronk v1.28.4/go.mod h1:Gq9Rjp+GGgpWcsgsOF73TCo8nl5JHaBld1K5BMYWcao= -github.com/aws/aws-sdk-go-v2 v1.42.0 h1:XvXMJTkFQtpBKIWZnmr9ZEOc2InWM2yldjXEJ/bymhA= -github.com/aws/aws-sdk-go-v2 v1.42.0/go.mod h1:27+ACypSLljLAEKsCYOmrjKh83vuTRkuAe9Uv/3A4bg= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.13 h1:p1BBrg/Hhp6uK7zpejeI8QFXHJeC/mynzi04Sl03k9g= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.13/go.mod h1:8cIfkE9MDhkRZGpQ22aV6/lkYeYSozpz16Smrs5x4Ls= -github.com/aws/aws-sdk-go-v2/config v1.32.25 h1:ACCejvStYoilgwrfegSt5ZntCbPrk52qfwyNcnl3omM= -github.com/aws/aws-sdk-go-v2/config v1.32.25/go.mod h1:LJyU8sDRbXUxFn8xMJIGP+v9QYYwveNLI8a/giAOiAs= -github.com/aws/aws-sdk-go-v2/credentials v1.19.24 h1:2hQqYCV9yqyePQ9o6dCrZc/zO8U3TwPr9mIKlZnPu/I= -github.com/aws/aws-sdk-go-v2/credentials v1.19.24/go.mod h1:IDwpACtwqHLISdzfwUUNq4P9DsB/h5BLg4FwJPNfqFY= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.29 h1:r6qZHbT+wxgWO/e9vYNUEtg7lv5+UN3pRqKhLXvnArg= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.29/go.mod h1:QRnaRcTVGKPGRy8w78HMQtKUGRYcnMZAANATkeVA6Mo= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.29 h1:f3vKqSo13fhTYb+JEcXwXefZQE26I1FB5eTSniU67ko= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.29/go.mod h1:MzoLFUArKGpGD+ukmPiTPG1X5x4o6M2kq4v2dr1FiEc= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.29 h1:RdwIf/CuUsvJX3RgJagbOyotl/cxoLY4xviKuE7p2GY= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.29/go.mod h1:71wt8W2EgswdZy9Mf9KNnzxZ3TiZlv4caKghPktDOkA= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.30 h1:VTGy885W5DKBxWRUJbym9hytNaYzsyaPkCHGRRMAOhU= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.30/go.mod h1:AS0HycUvJRFvTt613AYDOgO2jzw+00cVSMny8XB3yMY= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.12 h1:ZD2+BSw9vFsNlKYIasSNt3uDbjqqXIBcM13UJv/Lx2k= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.12/go.mod h1:Ms4zlcVBbXbiP7EVLhl+lgjvA/a7YphqQ3Ih3174EmI= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.22 h1:V51LGlOq/1VsDsHUdoklAQi7rMmx4qQubvFYAlP2254= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.22/go.mod h1:4Pzhyz8hJOm2bepgl+NjvRx8vlUFAIIvJnZ/MkcNPpU= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.29 h1:DRebniUGZ2MqiiIVmQJ04vIXr918hubdHMnarSLEWyU= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.29/go.mod h1:LfRkPCD8YHDM2E5eTkos2UpwYeZnBcVarTa8L59bJHA= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.29 h1:hiME6pBzC7OTl9LMtlyTWBuEl1f4QBcUmFDKC7MLXtc= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.29/go.mod h1:G7RP+uhagpKtKhd1BM9N6JQqjCcGEU47K5lBVZQyRQw= -github.com/aws/aws-sdk-go-v2/service/s3 v1.104.0 h1:ta8csKy5vN91F3i5gGR85lFV0srBqySEji7Jroes6rE= -github.com/aws/aws-sdk-go-v2/service/s3 v1.104.0/go.mod h1:77ZAgynvx1txMvDG8gGWoWkO1augYDxkp9JElWFgjQU= -github.com/aws/aws-sdk-go-v2/service/signin v1.2.0 h1:3nXpRcFwRCW8n7HgO2QGy0Dc20eQNfBuUemGQhpF8m8= -github.com/aws/aws-sdk-go-v2/service/signin v1.2.0/go.mod h1:LxYujSTLPRlp2vTtcUO/+1ilrew8ytt6SvQyOgejzFQ= -github.com/aws/aws-sdk-go-v2/service/sso v1.31.3 h1:ey1XLTYXb9PcLt4535632o5kCGXNXEhNb620Dqwuylo= -github.com/aws/aws-sdk-go-v2/service/sso v1.31.3/go.mod h1:Lk7PlmoTYryQmyBG0EXqj5BcUbj3whXdU2s3yGI3EAc= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.36.6 h1:yLr03zQE/5Eu5l3QU0Si+xMbLMbSDF2YXsigqXngs6g= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.36.6/go.mod h1:Q5N6icH+KJZDLh+ESNwzdv6cZ6vLFF/egy3IOxWhmz4= -github.com/aws/aws-sdk-go-v2/service/sts v1.43.3 h1:VrIhKRCSK1umelSgB9RghvA9RTUYeQffyAS5ApXehNI= -github.com/aws/aws-sdk-go-v2/service/sts v1.43.3/go.mod h1:r8wkDOuLaaMFqFiYAb8dGY2A3gJCOujMc6CFOVC4Zhc= -github.com/aws/smithy-go v1.27.2 h1:y9NPmSE6am6LjEFPfqHqG/jJk7AauQvhCJONKh7kpzk= -github.com/aws/smithy-go v1.27.2/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc= +github.com/ardanlabs/kronk v1.28.7 h1:HHEByuL9DjQsaRDS8UXq/D295p73xzDGLBM2pr5+CuE= +github.com/ardanlabs/kronk v1.28.7/go.mod h1:gqLBRpREyPor3n+RMmAeQavg15VBkYrjZjW1oW6DG3o= +github.com/aws/aws-sdk-go-v2 v1.42.1 h1:9eOTgu1z/dVtYpNZ3/8/XbbaX0x/BqE3HUzAzs6K0ek= +github.com/aws/aws-sdk-go-v2 v1.42.1/go.mod h1:5pKeft2eJj+gElQ38Jqg4ibCqh+/AK33/0X3hip7IjM= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.14 h1:3IZY0XAJquT3aHzbkHfPzy4ACPcEjVG0x87KOwtpqGY= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.14/go.mod h1:zwM6veDkhGgQFqkBy+uT28AAYpLu+uFMlPl+rCg/73E= +github.com/aws/aws-sdk-go-v2/config v1.32.30 h1:XwsEzpTJfQYJbFicz/QMLwAZdyeNVVoOEkbF7R3gPJk= +github.com/aws/aws-sdk-go-v2/config v1.32.30/go.mod h1:Ud32SuMc+/9BGxfpSVld7HrE2o05JwKmXY4M3jOQNZU= +github.com/aws/aws-sdk-go-v2/credentials v1.19.29 h1:WHZGssHH887cO0ox07SIQZsFx3MKD4ps6w0xUEmnKYQ= +github.com/aws/aws-sdk-go-v2/credentials v1.19.29/go.mod h1:Mhl0xR6zjguiuj00XRx2wMx22sAltk7oya39sT7fdg8= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.30 h1:/hi1JADLEW9YYryEz1w4GQu0EtP23pP553Cf9KgsDV4= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.30/go.mod h1:/3AOgy4K17Dm4ucMZVC/MJkzy5kmfKUcINRHZyo0koQ= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.30 h1:xM/Is9cKMHa8Jj8zkvWhvrFkZsXJV9E+BB4g0HW0duQ= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.30/go.mod h1:WueJeNDZvK1fMYEWJIkcivBfEzUkTpBhzlrUKKY8EuA= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.30 h1:jn46zC9LdsVR/ZpMIJqMqb8hHv31BlLx3ulVqNspUOk= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.30/go.mod h1:1hTMsAgbdS/AtUi4bw8+gUuh1pceo+eXRLfpSuSQj3M= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.31 h1:3GUprIsfmGcC5SACIyB0e7E0BM1O1b3Erl5CePYIAeQ= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.31/go.mod h1:7PuV1yl5e2xnUbm+RqvVg5i2iBM8EyijZNoI9wsOoOc= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.13 h1:mbRIur/BiHK6SKPjoBIXSE/hJ6g6JGRLuxQy1jGjlN4= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.13/go.mod h1:ITg9em2KbJx1s0y4aqRX5OYWG6HBZ5TVR//OdpEZ2CQ= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.23 h1:9Fjh6fi/U5JEStVZijmaMpUwE/gvBJj7x2B/PjbO9To= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.23/go.mod h1:iMoT2f1tClxrWAAnKCXjZQ6LOmfLrMG14wmnWpM+F14= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.30 h1:/Z5jmNrKsSD7EmDjzAPsm/3L9IuOkzaynklJZ1qX7S4= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.30/go.mod h1:lEzEZnOosE7zi8Z6royW1cFJTD9fpab4Ul1SBrllewk= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.31 h1:uao4A3QZ5UmB326V6KF+qRpv9Tjz7IlnlnTbbANntlU= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.31/go.mod h1:I/1+z0VwL1GhQyLgkoHDlygpUZ+iTAwOQ/NsftiUL2I= +github.com/aws/aws-sdk-go-v2/service/s3 v1.105.1 h1:LkBKxAOE5WXjlFuFZqPG1rREnl6I6QCMElcXFDEidos= +github.com/aws/aws-sdk-go-v2/service/s3 v1.105.1/go.mod h1:zdmCoFO/dSI7GlrwsPqFJI+WlFnSU4Tc8TJnlXrM1Do= +github.com/aws/aws-sdk-go-v2/service/signin v1.4.1 h1:V7ZZ300WPXGjvkyore5DGe0ljVPOxCXie/thWdtSBXE= +github.com/aws/aws-sdk-go-v2/service/signin v1.4.1/go.mod h1:mxC0nT/C8wMMS97DemZPzvUZxvIt+2Iq+eS3JdFZGgg= +github.com/aws/aws-sdk-go-v2/service/sso v1.32.1 h1:gYFYh4iLLcAOJRLNPY2aD2g9DIhKn4eof8UkIrr1rTk= +github.com/aws/aws-sdk-go-v2/service/sso v1.32.1/go.mod h1:u8af9Nqkmqnr96f7v9nHqzZT9XBwbXEkTiqT4ROuJSE= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.37.1 h1:arjT9Cm3/WYbGmD5TUZHk4UQn4Lle1fUNZs5FC6CtF0= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.37.1/go.mod h1:DMPWJBjYs6+3+f/qhBFEFPPlQ6NlhWjai3dJNvipJ84= +github.com/aws/aws-sdk-go-v2/service/sts v1.44.1 h1:RvfHDg+xvAeZ+5741vUEjpOVtYSIm93W2zhx10Xtydw= +github.com/aws/aws-sdk-go-v2/service/sts v1.44.1/go.mod h1:9gdl4RrflIdpDb2TlXshWgR1F9TeCkvqDx77Vpr4Z/Q= +github.com/aws/smithy-go v1.27.3 h1:F3Zb497UhhskkfpJmfkXswyo+t0sh9OTBnIHjogWbVY= +github.com/aws/smithy-go v1.27.3/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc= github.com/aymanbagabas/go-udiff v0.2.0 h1:TK0fH4MteXUDspT88n8CKzvK0X9O2xu9yQjWpi6yML8= github.com/aymanbagabas/go-udiff v0.2.0/go.mod h1:RE4Ex0qsGkTAJoQdQQCA0uG+nAzJO/pI/QwceO5fgrA= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= @@ -86,8 +86,6 @@ github.com/charmbracelet/lipgloss/v2 v2.0.0-beta1 h1:SOylT6+BQzPHEjn15TIzawBPVD0 github.com/charmbracelet/lipgloss/v2 v2.0.0-beta1/go.mod h1:tRlx/Hu0lo/j9viunCN2H+Ze6JrmdjQlXUQvvArgaOc= github.com/charmbracelet/log/v2 v2.0.0-20251001162505-358b5269b546 h1:ZcOMUkKhtM6TbQKfB6C/GusIG6hdTMybJ4gNboQpjYg= github.com/charmbracelet/log/v2 v2.0.0-20251001162505-358b5269b546/go.mod h1:ooW2QKtnlCj7Kc5Atb7TQPRo699Fy+jhtLgX6a/EAh8= -github.com/charmbracelet/openai-go v0.0.0-20260617131321-5e4b9c18c4be h1:pg+OWlIkk9HOe/8P5J95aKe2wGDzFUiiyFOUpwR30B4= -github.com/charmbracelet/openai-go v0.0.0-20260617131321-5e4b9c18c4be/go.mod h1:1DahUaExbUZx/jD+FNT2PKP4L9rLE5+ZBRuI8mZjd/E= github.com/charmbracelet/x/ansi v0.10.2 h1:ith2ArZS0CJG30cIUfID1LXN7ZFXRCww6RUvAPA+Pzw= github.com/charmbracelet/x/ansi v0.10.2/go.mod h1:HbLdJjQH4UH4AqA2HpRWuWNluRE6zxJH/yteYEYCFa8= github.com/charmbracelet/x/cellbuf v0.0.14-0.20250811133356-e0c5dbe5ea4a h1:zYSNtEJM9jwHbJts2k+Hroj+xQwsW1yxc4Wopdv7KaI= @@ -122,8 +120,8 @@ github.com/felixge/httpsnoop v1.1.0 h1:3YtUj32ZZkqZtt3sZZsClsymw/QDuVfpNhoA31zeO github.com/felixge/httpsnoop v1.1.0/go.mod h1:Zqxgdd+1Rkcz8euOqdr7lqgCRJztwr5hp9vDSi5UZCE= github.com/go-jose/go-jose/v4 v4.1.4 h1:moDMcTHmvE6Groj34emNPLs/qtYXRVcd6S7NHbHz3kA= github.com/go-jose/go-jose/v4 v4.1.4/go.mod h1:x4oUasVrzR7071A4TnHLGSPpNOm2a21K9Kf04k1rs08= -github.com/go-json-experiment/json v0.0.0-20260601182631-00ed12fed2a6 h1:nxP4pPoyqOAgX8lYDFCfl3DyKeXErCvSvhcyzwGV9CE= -github.com/go-json-experiment/json v0.0.0-20260601182631-00ed12fed2a6/go.mod h1:tphK2c80bpPhMOI4v6bIc2xWywPfbqi1Z06+RcrMkDg= +github.com/go-json-experiment/json v0.0.0-20260623181947-01eb4420fa68 h1:KZaTBSyshWX3MP5jukJcNSuXDQTO+rNpt0J564dX/eg= +github.com/go-json-experiment/json v0.0.0-20260623181947-01eb4420fa68/go.mod h1:tphK2c80bpPhMOI4v6bIc2xWywPfbqi1Z06+RcrMkDg= github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4= github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= @@ -145,10 +143,10 @@ github.com/google/s2a-go v0.1.9 h1:LGD7gtMgezd8a/Xak7mEWL0PjoTQFvpRudN895yqKW0= github.com/google/s2a-go v0.1.9/go.mod h1:YA0Ei2ZQL3acow2O62kdp9UlnvMmU7kA6Eutn0dXayM= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.3.17 h1:73NfMHdiqo9JFU9+7a5ExpVa10/R29pXfZIaW559nrg= -github.com/googleapis/enterprise-certificate-proxy v0.3.17/go.mod h1:rSEsBUemEBZEexP2y6jPp16LUmUbjmSbcPMQizR0o4k= -github.com/googleapis/gax-go/v2 v2.22.0 h1:PjIWBpgGIVKGoCXuiCoP64altEJCj3/Ei+kSU5vlZD4= -github.com/googleapis/gax-go/v2 v2.22.0/go.mod h1:irWBbALSr0Sk3qlqb9SyJ1h68WjgeFuiOzI4Rqw5+aY= +github.com/googleapis/enterprise-certificate-proxy v0.3.18 h1:hvVi34VucdrV1IIsiWuqYM8kutw/92MxNEFxCJZEh0k= +github.com/googleapis/enterprise-certificate-proxy v0.3.18/go.mod h1:rSEsBUemEBZEexP2y6jPp16LUmUbjmSbcPMQizR0o4k= +github.com/googleapis/gax-go/v2 v2.23.0 h1:Tchl7qkvE7Ip3y+ztvNufYFvkfqTe7NfLTYGIdJRLuE= +github.com/googleapis/gax-go/v2 v2.23.0/go.mod h1:rBQKOVJCdb8IFEzg+FCwlt1LP/xMDGuqUXhUG+XMXEg= github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/grpc-ecosystem/grpc-gateway/v2 v2.29.0 h1:5VipnvEpbqr2gA2VbM+nYVbkIF28c5ZQfqCBQ5g2xfk= @@ -161,16 +159,16 @@ github.com/hashicorp/go-getter v1.8.6 h1:9sQboWULaydVphxc4S64oAI4YqpuCk7nPmvbk13 github.com/hashicorp/go-getter v1.8.6/go.mod h1:nVH12eOV2P58dIiL3rsU6Fh3wLeJEKBOJzhMmzlSWoo= github.com/hashicorp/go-version v1.9.0 h1:CeOIz6k+LoN3qX9Z0tyQrPtiB1DFYRPfCIBtaXPSCnA= github.com/hashicorp/go-version v1.9.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hybridgroup/yzma v1.18.0 h1:M4ja0zt2ZBkTskMrHsGSls9/jts8hD83uuYMBYo9+c4= -github.com/hybridgroup/yzma v1.18.0/go.mod h1:DAsHYcX7ze7iFZH6PT57oCuqaVd/AXdALhjnOSgWbaE= +github.com/hybridgroup/yzma v1.19.0 h1:L3L5ryeJ5dt6yku0oRgcO/VNJdO2ObPkpCebd8S69o4= +github.com/hybridgroup/yzma v1.19.0/go.mod h1:DAsHYcX7ze7iFZH6PT57oCuqaVd/AXdALhjnOSgWbaE= github.com/jupiterrider/ffi v0.7.0 h1:RKsl6Ascal+3kyAqR5Qcbp83LceQMLc1VZbPfHWoNzs= github.com/jupiterrider/ffi v0.7.0/go.mod h1:9dauhpOfNqrqk28fxuu0kkdeFtT9Qr4vbfigiuIXN7c= -github.com/kaptinlin/jsonpointer v0.4.26 h1:tw616yszHek+B3/GtDSia+uzBa3sLXGpmo4tYeMhBZw= -github.com/kaptinlin/jsonpointer v0.4.26/go.mod h1:wVOBaXGGnP42YsMb6zev/3W5POTvspdNfh8DXzf8XS8= -github.com/kaptinlin/jsonschema v0.9.2 h1:zqowDnBkpg80OeIt4Bl1bOyfKY1/KVVzst1m3MCsxd4= -github.com/kaptinlin/jsonschema v0.9.2/go.mod h1:mCH2W5lXd29tdDjvoFfY32nedPORnlk7pCVrrcs/NkQ= -github.com/klauspost/compress v1.18.6 h1:2jupLlAwFm95+YDR+NwD2MEfFO9d4z4Prjl1XXDjuao= -github.com/klauspost/compress v1.18.6/go.mod h1:cwPg85FWrGar70rWktvGQj8/hthj3wpl0PGDogxkrSQ= +github.com/kaptinlin/jsonpointer v0.4.27 h1:5FOnhlkqQ4/lvHudaAWS8HJCXjN4yAHSIGl7aPKHI0Q= +github.com/kaptinlin/jsonpointer v0.4.27/go.mod h1:dfub/n58cWS32Dyf3AZsnKblSAgrz9PyOU76GDPpx8Q= +github.com/kaptinlin/jsonschema v0.9.3 h1:uDVd3w4aXwO0tbycblKYvFofhl3hVuE31vOl5JkDXI0= +github.com/kaptinlin/jsonschema v0.9.3/go.mod h1:LvtQ/mO0E1e/3c3DiOWTj05LTeot8cTv7DyQq7eJMQg= +github.com/klauspost/compress v1.19.0 h1:sXLILfc9jV2QYWkzFOPWStmcUVH2RHEB1JCdY2oVvCQ= +github.com/klauspost/compress v1.19.0/go.mod h1:cwPg85FWrGar70rWktvGQj8/hthj3wpl0PGDogxkrSQ= github.com/lucasb-eyer/go-colorful v1.3.0 h1:2/yBRLdWBZKrf7gB40FoiKfAWYQ0lqNcbuQwVHXptag= github.com/lucasb-eyer/go-colorful v1.3.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= github.com/mattn/go-runewidth v0.0.17 h1:78v8ZlW0bP43XfmAfPsdXcoNCelfMHsDmd/pkENfrjQ= @@ -181,6 +179,8 @@ github.com/muesli/cancelreader v0.2.2 h1:3I4Kt4BQjOR54NavqnDogx/MIoWBFa0StPA8ELU github.com/muesli/cancelreader v0.2.2/go.mod h1:3XuTXfFS2VjM+HTLZY9Ak0l6eUKfijIfMUZ4EgX0QYo= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/openai/openai-go/v3 v3.43.0 h1:C+MFVUMU3TJNgES+Ikt7HF8xcX7J0wynKeR9ST22hZM= +github.com/openai/openai-go/v3 v3.43.0/go.mod h1:cdufnVK14cWcT9qA1rRtrXx4FTRsgbDPW7Ia7SS5cZo= github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= @@ -189,10 +189,10 @@ github.com/prometheus/client_golang v1.23.2 h1:Je96obch5RDVy3FDMndoUsjAhG5Edi49h github.com/prometheus/client_golang v1.23.2/go.mod h1:Tb1a6LWHB3/SPIzCoaDXI4I8UHKeFTEQ1YCr+0Gyqmg= github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= -github.com/prometheus/common v0.69.0 h1:OA85nJQS/T/MaYh/Q2CcgDKSGWqNIgrBDvDH85CuiNk= -github.com/prometheus/common v0.69.0/go.mod h1:ZzL3f6u94qUxh9p+tJTrF+FvBS1XXbbRAZCQkytAL0Y= -github.com/prometheus/procfs v0.20.1 h1:XwbrGOIplXW/AU3YhIhLODXMJYyC1isLFfYCsTEycfc= -github.com/prometheus/procfs v0.20.1/go.mod h1:o9EMBZGRyvDrSPH1RqdxhojkuXstoe4UlK79eF5TGGo= +github.com/prometheus/common v0.70.0 h1:bcpru3tWPVnxGnETLgOV5jbp/JRXgYEyv65CuBLAMMI= +github.com/prometheus/common v0.70.0/go.mod h1:S/SFasQmgGiYH6C81LKCtYa8QACgthGg5zxL2udV7SY= +github.com/prometheus/procfs v0.21.1 h1:GljZCt+zSTS+NZq88cyQ1LjZ+RCHp3uVuabBWA5+OJI= +github.com/prometheus/procfs v0.21.1/go.mod h1:aB55Cww9pdSJVHk0hUf0inxWyyjPogFIjmHKYgMKmtY= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= @@ -228,8 +228,8 @@ go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.44.0 h1:4YsVu3B8+3qtWYYrsUY go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.44.0/go.mod h1:+wnlSn0mD1ADVMe3v9Z/WIaiz6q6gL2J/ejaAmdmv80= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.44.0 h1:qazEJlUOQzhCpzQpFETGby7EdqjI1wsd0W+6Gg1SCTU= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.44.0/go.mod h1:fOD2Yefuxixkx3ahVNf0O/PERb6r4OlbxfATVnYvzCo= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.43.0 h1:TC+BewnDpeiAmcscXbGMfxkO+mwYUwE/VySwvw88PfA= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.43.0/go.mod h1:J/ZyF4vfPwsSr9xJSPyQ4LqtcTPULFR64KwTikGLe+A= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.44.0 h1:hqxVTu/GtBF+vJ8d1fzW7fRxZFvgoDjWcxwwCaFDYpU= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.44.0/go.mod h1:z5fVEF4X5v0ESvlJqBrrFlBVoj5EQuefZpzsu7R+x5Q= go.opentelemetry.io/otel/metric v1.44.0 h1:1w0gILTcHdr3YI+ixLyjemwrVnsMURbTZFrSYCdDdmc= go.opentelemetry.io/otel/metric v1.44.0/go.mod h1:8O7hanEPBNgEMmybD3s2VBKcgWOCsA6tzHBPODAiquo= go.opentelemetry.io/otel/metric/x v0.66.0 h1:YkCrx1zLOChi9ZcZ6euupOcsgzbVlec7D/xoEU1+cTA= @@ -246,38 +246,38 @@ go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.yaml.in/yaml/v2 v2.4.4 h1:tuyd0P+2Ont/d6e2rl3be67goVK4R6deVxCUX5vyPaQ= go.yaml.in/yaml/v2 v2.4.4/go.mod h1:gMZqIpDtDqOfM0uNfy0SkpRhvUryYH0Z6wdMYcacYXQ= -golang.org/x/crypto v0.53.0 h1:QZ4Muo8THX6CizN2vPPd5fBGHyogrdK9fG4wLPFUsto= -golang.org/x/crypto v0.53.0/go.mod h1:DNLU434OwVakk9PzuwV8w62mAJpRJL3vsgcfp4Qnsio= +golang.org/x/crypto v0.54.0 h1:YLIA59K4fiNzHzjnZt2tUJQjQtUWfWbeHBqKtk3eScw= +golang.org/x/crypto v0.54.0/go.mod h1:KWL8ny2AZdGR2cWmzeHrp2azQPGogOv+HeQaVEXC2dk= golang.org/x/exp v0.0.0-20260312153236-7ab1446f8b90 h1:jiDhWWeC7jfWqR9c/uplMOqJ0sbNlNWv0UkzE0vX1MA= golang.org/x/exp v0.0.0-20260312153236-7ab1446f8b90/go.mod h1:xE1HEv6b+1SCZ5/uscMRjUBKtIxworgEcEi+/n9NQDQ= -golang.org/x/image v0.43.0 h1:FLxcP4ec2350nTfOC8ysKtqYSIFbk/QGjw1ZHNP4tsY= -golang.org/x/image v0.43.0/go.mod h1:rrpelvGFt+kLPAjPM4HeWPgrl0FtafueU//e5N0qk/Q= -golang.org/x/net v0.56.0 h1:Rw8j/hFzGvJUZwNBXnAtf5sVDVt+65SK2C7IxCxZt5o= -golang.org/x/net v0.56.0/go.mod h1:D3Ku6r+V6JROoZK144D2XfMHFcMq/0zSfLelVTCFKec= +golang.org/x/image v0.44.0 h1:+tDekMZED9+LrtB3G5xzRggpVh9CARjZqROla3R3R+I= +golang.org/x/image v0.44.0/go.mod h1:V8K3KE9KKKE+pLpQDOeN18w9oacNSvy1tDOirTu4xtY= +golang.org/x/net v0.57.0 h1:K5+3DljvIuDG9/Jv9rvyMywYNFCQ9RSUY6OOTTkT+tE= +golang.org/x/net v0.57.0/go.mod h1:KpXc8iv+r3XplLAG/f7Jsf9RPszJzdR0f58q9vGOuEU= golang.org/x/oauth2 v0.36.0 h1:peZ/1z27fi9hUOFCAZaHyrpWG5lwe0RJEEEeH0ThlIs= golang.org/x/oauth2 v0.36.0/go.mod h1:YDBUJMTkDnJS+A4BP4eZBjCqtokkg1hODuPjwiGPO7Q= -golang.org/x/sync v0.21.0 h1:HLII4xRRTtCRkxYp4HNFF0Js/Og6q2i++KXbg0gHCwM= -golang.org/x/sync v0.21.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= -golang.org/x/sys v0.46.0 h1:noSf2Fq6F8DBgS+LysIkx7rIExoNHJsxOAtPp4rthXw= -golang.org/x/sys v0.46.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= -golang.org/x/text v0.38.0 h1:sXmwo9DwP3OK9EZ7PqAdaooSGozfl/3a6/xJcbzPRhE= -golang.org/x/text v0.38.0/go.mod h1:YXZt3QhHUKYT53r2lLKFIVi6Ao1jdzrTR/KQ09qyxF4= +golang.org/x/sync v0.22.0 h1:SZjpbeLmrCk4xhRSZFNZW5gFUeCeFgjekvI/+gfScek= +golang.org/x/sync v0.22.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= +golang.org/x/sys v0.47.0 h1:o7XGOvZQCADBQQ4Y7VNq2dRWQR7JmOUW8Kxx4ZsNgWs= +golang.org/x/sys v0.47.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= +golang.org/x/text v0.40.0 h1:Ub2Z6/xjgF1WrYQz2nuITOEegKFtiIy+rieRJ5lHZKs= +golang.org/x/text v0.40.0/go.mod h1:hpnzDAfGV753zIKo+wk3u1bVKCGPbrnF7+7LBF/UHVY= golang.org/x/time v0.15.0 h1:bbrp8t3bGUeFOx08pvsMYRTCVSMk89u4tKbNOZbp88U= golang.org/x/time v0.15.0/go.mod h1:Y4YMaQmXwGQZoFaVFk4YpCt4FLQMYKZe9oeV/f4MSno= gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4= gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E= -google.golang.org/api v0.286.0 h1:TdTXMvzYKnWV1/lPbCdbXRqBrkDqjPto22H2xeZZ8LI= -google.golang.org/api v0.286.0/go.mod h1:NlOlUIr8MPoIhT9Bb/oUnRuHbJOLwxb6JSYJM8Yz+jQ= -google.golang.org/genai v1.61.0 h1:wCyNGiaC9q5A59B80zuEtNBhq3ypEvICFkZYOfK7IO0= -google.golang.org/genai v1.61.0/go.mod h1:mDdPDFXo1Ats7f1WXVyZgWb/CkMzFWTWJruIMy7hGIU= -google.golang.org/genproto v0.0.0-20260622175928-b703f567277d h1:CP5omUq8AJTiWMrPKM1WRLJ7zZeXd9OPcQD3TbBNAyY= -google.golang.org/genproto v0.0.0-20260622175928-b703f567277d/go.mod h1:DrwuGJgFSEVNpv3S5Q5VxhRTvdnjauw9GtvwVOEARfA= -google.golang.org/genproto/googleapis/api v0.0.0-20260622175928-b703f567277d h1:xr2lwHI91bn3UiXcnyzRMQjp2LRiM8wEHzwUaE0YhTs= -google.golang.org/genproto/googleapis/api v0.0.0-20260622175928-b703f567277d/go.mod h1:O0ZOWSrfWfJ+Z5HbwZ+wNtHsg/vk1k2C/w67eww8PfQ= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260622175928-b703f567277d h1:mpAgMyM9vQHxycBlDq50y1VHpfSfVwzXvrQKtYbXuUY= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260622175928-b703f567277d/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= -google.golang.org/grpc v1.81.1 h1:VnnIIZ88UzOOKLukQi+ImGz8O1Wdp8nAGGnvOfEIWQQ= -google.golang.org/grpc v1.81.1/go.mod h1:xGH9GfzOyMTGIOXBJmXt+BX/V0kcdQbdcuwQ/zNw42I= +google.golang.org/api v0.288.0 h1:glhO/J88obKP5I269W3hB73dvBKrjU56ZfmNlNXpgTU= +google.golang.org/api v0.288.0/go.mod h1:lM2kYRzYUCBY91P9h6VF1PYmvhxii3O5hji37qRvIcY= +google.golang.org/genai v1.63.0 h1:Iryg+4TBco5HaRbwVhAV/ROKVcWiZkuvQzKb4u1QggY= +google.golang.org/genai v1.63.0/go.mod h1:mDdPDFXo1Ats7f1WXVyZgWb/CkMzFWTWJruIMy7hGIU= +google.golang.org/genproto v0.0.0-20260713224248-f5fc221cf8c4 h1:PWVFocb6Y93aqxY7m9ArHu5zQiLkIrXBLr+ajQxRHH0= +google.golang.org/genproto v0.0.0-20260713224248-f5fc221cf8c4/go.mod h1:v47/Kzm6KzB/2uGxuDjGww+7Dk7ny/VFIaIw4WxEtu0= +google.golang.org/genproto/googleapis/api v0.0.0-20260713224248-f5fc221cf8c4 h1:lI0NbdWVmT6lOJJNDd7vyeTdfxP/7ouCLSJUKNNXa0k= +google.golang.org/genproto/googleapis/api v0.0.0-20260713224248-f5fc221cf8c4/go.mod h1:WRrQ7/7N19PypuT0fxLOL5Lq0waoiRri4FbtHDEKrGE= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260713224248-f5fc221cf8c4 h1:7RtFDizMtT9eZzHzKxifoMGfcDBBy+LYZlgfg24ZmOM= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260713224248-f5fc221cf8c4/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= +google.golang.org/grpc v1.82.0 h1:vguDnZUPjE26w09A63VoxZPnvPjB5Riyc0mkXPFmAIU= +google.golang.org/grpc v1.82.0/go.mod h1:yzTZ1TB1Z3SG+LIYaI+WiE8D5+PZ3ArnrSp8zF3+/ZA= google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= diff --git a/go.mod b/go.mod index d5dcb6123..f28812258 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.26.5 require ( charm.land/x/vcr v0.1.1 cloud.google.com/go/auth v0.22.0 - github.com/ardanlabs/kronk v1.28.6 + github.com/ardanlabs/kronk v1.28.7 github.com/aws/aws-sdk-go-v2 v1.42.1 github.com/aws/aws-sdk-go-v2/config v1.32.30 github.com/aws/smithy-go v1.27.3 @@ -28,26 +28,26 @@ require ( cloud.google.com/go v0.123.0 // indirect cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect cloud.google.com/go/compute/metadata v0.9.0 // indirect - cloud.google.com/go/iam v1.11.0 // indirect - cloud.google.com/go/monitoring v1.29.0 // indirect - cloud.google.com/go/storage v1.62.3 // indirect + cloud.google.com/go/iam v1.12.0 // indirect + cloud.google.com/go/monitoring v1.30.0 // indirect + cloud.google.com/go/storage v1.63.1 // indirect github.com/Azure/azure-sdk-for-go/sdk/azcore v1.17.0 // indirect github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.33.0 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.57.0 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.57.0 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.34.0 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.58.0 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.58.0 // indirect github.com/ardanlabs/jinja v1.4.0 // indirect - github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.13 // indirect + github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.14 // indirect github.com/aws/aws-sdk-go-v2/credentials v1.19.29 // indirect github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.30 // indirect github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.30 // indirect github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.30 // indirect github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.31 // indirect github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.13 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.22 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.23 // indirect github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.30 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.29 // indirect - github.com/aws/aws-sdk-go-v2/service/s3 v1.104.0 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.31 // indirect + github.com/aws/aws-sdk-go-v2/service/s3 v1.105.1 // indirect github.com/aws/aws-sdk-go-v2/service/signin v1.4.1 // indirect github.com/aws/aws-sdk-go-v2/service/sso v1.32.1 // indirect github.com/aws/aws-sdk-go-v2/service/ssooidc v1.37.1 // indirect @@ -69,7 +69,7 @@ require ( github.com/goccy/go-yaml v1.19.2 // indirect github.com/google/go-cmp v0.7.0 // indirect github.com/google/s2a-go v0.1.9 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.3.17 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.3.18 // indirect github.com/googleapis/gax-go/v2 v2.23.0 // indirect github.com/gorilla/websocket v1.5.3 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.29.0 // indirect @@ -77,18 +77,18 @@ require ( github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-getter v1.8.6 // indirect github.com/hashicorp/go-version v1.9.0 // indirect - github.com/hybridgroup/yzma v1.18.0 // indirect + github.com/hybridgroup/yzma v1.19.0 // indirect github.com/jupiterrider/ffi v0.7.0 // indirect github.com/kaptinlin/jsonpointer v0.4.27 // indirect - github.com/klauspost/compress v1.18.6 // indirect + github.com/klauspost/compress v1.19.0 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/prometheus/client_golang v1.23.2 // indirect github.com/prometheus/client_model v0.6.2 // indirect - github.com/prometheus/common v0.69.0 // indirect - github.com/prometheus/procfs v0.20.1 // indirect + github.com/prometheus/common v0.70.0 // indirect + github.com/prometheus/procfs v0.21.1 // indirect github.com/spiffe/go-spiffe/v2 v2.8.1 // indirect github.com/tidwall/gjson v1.18.0 // indirect github.com/tidwall/match v1.1.1 // indirect @@ -109,17 +109,17 @@ require ( go.opentelemetry.io/proto/otlp v1.10.0 // indirect go.yaml.in/yaml/v2 v2.4.4 // indirect go.yaml.in/yaml/v4 v4.0.0-rc.3 // indirect - golang.org/x/crypto v0.53.0 // indirect - golang.org/x/image v0.43.0 // indirect - golang.org/x/net v0.56.0 // indirect - golang.org/x/sync v0.21.0 // indirect - golang.org/x/sys v0.46.0 // indirect - golang.org/x/text v0.38.0 // indirect + golang.org/x/crypto v0.54.0 // indirect + golang.org/x/image v0.44.0 // indirect + golang.org/x/net v0.57.0 // indirect + golang.org/x/sync v0.22.0 // indirect + golang.org/x/sys v0.47.0 // indirect + golang.org/x/text v0.40.0 // indirect golang.org/x/time v0.15.0 // indirect - google.golang.org/api v0.287.1 // indirect - google.golang.org/genproto v0.0.0-20260622175928-b703f567277d // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20260630182238-925bb5da69e7 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20260630182238-925bb5da69e7 // indirect + google.golang.org/api v0.288.0 // indirect + google.golang.org/genproto v0.0.0-20260713224248-f5fc221cf8c4 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20260713224248-f5fc221cf8c4 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20260713224248-f5fc221cf8c4 // indirect google.golang.org/grpc v1.82.0 // indirect google.golang.org/protobuf v1.36.11 // indirect gopkg.in/dnaeon/go-vcr.v4 v4.0.6-0.20251110073552-01de4eb40290 // indirect diff --git a/go.sum b/go.sum index efb2329f3..03ecdaec9 100644 --- a/go.sum +++ b/go.sum @@ -10,16 +10,16 @@ cloud.google.com/go/auth/oauth2adapt v0.2.8 h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIi cloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c= cloud.google.com/go/compute/metadata v0.9.0 h1:pDUj4QMoPejqq20dK0Pg2N4yG9zIkYGdBtwLoEkH9Zs= cloud.google.com/go/compute/metadata v0.9.0/go.mod h1:E0bWwX5wTnLPedCKqk3pJmVgCBSM6qQI1yTBdEb3C10= -cloud.google.com/go/iam v1.11.0 h1:KieQ9Pb+LLPak1O3Rv3GgCxhnmkYf7Xyh0P5HfF1jFM= -cloud.google.com/go/iam v1.11.0/go.mod h1:KP+nKGugNJW4LcLx1uEZcq1ok5sQHFaQehQNl4QDgV4= +cloud.google.com/go/iam v1.12.0 h1:Aki3bX9aHUDKPHfnRJfDcTdVedvy6quGBQcTqx3DRXk= +cloud.google.com/go/iam v1.12.0/go.mod h1:FEZ4lXpADAC2AIpQY7LANNjjwyQ2jK439CI2VaD+sLY= cloud.google.com/go/logging v1.18.0 h1:KhzZq+1cSkPH9YUaKLLhLtQxIHitVayBmk0sGfoM9+k= cloud.google.com/go/logging v1.18.0/go.mod h1:ZGKnpBaURITh+g/uom2VhbiFoFWvejcrHPDhxFtU/gI= -cloud.google.com/go/longrunning v1.0.0 h1:lwzWEYD8+NkYV7dhexOz6kmlvajZA70+bW/xMhRVVdY= -cloud.google.com/go/longrunning v1.0.0/go.mod h1:8nqFBPOO1U/XkhWl0I19AMZEphrHi73VNABIpKYaTwM= -cloud.google.com/go/monitoring v1.29.0 h1:AHhDsFaSax1/4k+qlIDX/SDGe6hggnfXJ9dkgD9qBPY= -cloud.google.com/go/monitoring v1.29.0/go.mod h1:72NOVjJXHY/HBfoLT0+qlCZBT059+9VXLeAnL2PeeVM= -cloud.google.com/go/storage v1.62.3 h1:SZq1t23NCI+e96dH77Dg3PEfsNNEjqO8zE5AnD8gVD0= -cloud.google.com/go/storage v1.62.3/go.mod h1:cpYz/kRVZ+UQAF1uHeea10/9ewcRbxGoGNKsS9daSXA= +cloud.google.com/go/longrunning v1.2.0 h1:WjYH3YHBGCxGJP9M4dWGHBfXr/cFIjMkNgWcJj7/iMM= +cloud.google.com/go/longrunning v1.2.0/go.mod h1:5KMQALFGOCtFoi2xSOA1u3H7WKlhmckgiyFw7+LGQp0= +cloud.google.com/go/monitoring v1.30.0 h1:r/d+JUbyKmJ8b07iznuKfzVzrIXTWxHQ3lBRm3x2LlY= +cloud.google.com/go/monitoring v1.30.0/go.mod h1:htlUR0QWVMrjFzZmN4LGnMAve9xB/eduwjmINxVZ8RM= +cloud.google.com/go/storage v1.63.1 h1:CYXILV9G4CH0C18IQ9+V0h4XiqD2LhKnMLO0o7uJWNs= +cloud.google.com/go/storage v1.63.1/go.mod h1:lWyAtwvDZHdL3k68WVKbESP6bmWaV23ZJJ/JEVw/ZaQ= cloud.google.com/go/trace v1.16.0 h1:GmQovzFc5F0CNfl0VLgL64aoTtu7xsM0YajW2GlG9+E= cloud.google.com/go/trace v1.16.0/go.mod h1:r+bdAn16dKLSV1G2D5v3e58IlQlizfxWrUfjx7kM7X0= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.17.0 h1:g0EZJwz7xkXQiZAI5xi9f3WWFYBlX1CPTrR+NDToRkQ= @@ -30,22 +30,22 @@ github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0 h1:ywEEhmNahHBihViHepv3xP github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0/go.mod h1:iZDifYGJTIgIIkYRNWPENUnqx6bJ2xnSDFI2tjwZNuY= github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2 h1:XHOnouVk1mxXfQidrMEnLlPk9UMeRtyBTnEFtxkV0kU= github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.33.0 h1:l7+6kwRMJNwdCvYdDl7Eax+wzEYHSnNY7zrrfbhDdTA= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.33.0/go.mod h1:pJTkW8hEUIIi3Pf65lPZOnn4Y81yCllX6IWk2jNXdkM= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.57.0 h1:jLdiS1vO+XJFyDSWRHBx56r4s/NNtcl5J6KyCcWUX/w= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.57.0/go.mod h1:8lmpHY+1VRoteiOwyrQMDt1YGXOrFKCz+1wJW7n3ODY= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.57.0 h1:cSjUzZ7KU8hicTgzaSv9NmSyM9fTVK3y5lsBUl3wOis= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.57.0/go.mod h1:dzcEjy1WJ0Q4u9twNR3LcLhNoYMRCrMCMafpxa0TjPQ= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.57.0 h1:RoO5+d7uCmDqovLrHCr2/BuViUXvdcrNxyNM1pN9dDQ= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.57.0/go.mod h1:YqwkQPrWSC7+byyc1VlKbWLBF5JsW5IoL6xUkemYSXk= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.34.0 h1:yzIYdwuro811Z27D3T80Wkd3rqZzb0K43nner7Eh1yE= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.34.0/go.mod h1:pJTkW8hEUIIi3Pf65lPZOnn4Y81yCllX6IWk2jNXdkM= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.58.0 h1:ZYGajzJNcirVZpT1rltgf9iM+j9zZ4v8V9DrF+xKRJ8= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.58.0/go.mod h1:PDQyYBOzGtQgvshQI//UiXyzuMHCz0ndyu+4W8X82vM= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.58.0 h1:IBF8BbhKJkMsON/eY+LMu3aF3XMiotCb9KvkUmEkOJo= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.58.0/go.mod h1:dzcEjy1WJ0Q4u9twNR3LcLhNoYMRCrMCMafpxa0TjPQ= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.58.0 h1:SBZzZCiPmDrUV7NSCWY54OnKikO/oTydPCvyEyYaDDE= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.58.0/go.mod h1:YqwkQPrWSC7+byyc1VlKbWLBF5JsW5IoL6xUkemYSXk= github.com/ardanlabs/jinja v1.4.0 h1:9iE0/wF4zhcws1CYZCWqJTQP8YuhC4FjycBGzCTuOFw= github.com/ardanlabs/jinja v1.4.0/go.mod h1:aXXzlJfjA+T3XNKA/YT5ZtDq2VJxt5a5siZ8cl9B35Q= -github.com/ardanlabs/kronk v1.28.6 h1:pFu3JhGmmK2CVQ9Jwa08qzyUu4bHsUaLBwZf17dZVpk= -github.com/ardanlabs/kronk v1.28.6/go.mod h1:Gq9Rjp+GGgpWcsgsOF73TCo8nl5JHaBld1K5BMYWcao= +github.com/ardanlabs/kronk v1.28.7 h1:HHEByuL9DjQsaRDS8UXq/D295p73xzDGLBM2pr5+CuE= +github.com/ardanlabs/kronk v1.28.7/go.mod h1:gqLBRpREyPor3n+RMmAeQavg15VBkYrjZjW1oW6DG3o= github.com/aws/aws-sdk-go-v2 v1.42.1 h1:9eOTgu1z/dVtYpNZ3/8/XbbaX0x/BqE3HUzAzs6K0ek= github.com/aws/aws-sdk-go-v2 v1.42.1/go.mod h1:5pKeft2eJj+gElQ38Jqg4ibCqh+/AK33/0X3hip7IjM= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.13 h1:p1BBrg/Hhp6uK7zpejeI8QFXHJeC/mynzi04Sl03k9g= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.13/go.mod h1:8cIfkE9MDhkRZGpQ22aV6/lkYeYSozpz16Smrs5x4Ls= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.14 h1:3IZY0XAJquT3aHzbkHfPzy4ACPcEjVG0x87KOwtpqGY= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.14/go.mod h1:zwM6veDkhGgQFqkBy+uT28AAYpLu+uFMlPl+rCg/73E= github.com/aws/aws-sdk-go-v2/config v1.32.30 h1:XwsEzpTJfQYJbFicz/QMLwAZdyeNVVoOEkbF7R3gPJk= github.com/aws/aws-sdk-go-v2/config v1.32.30/go.mod h1:Ud32SuMc+/9BGxfpSVld7HrE2o05JwKmXY4M3jOQNZU= github.com/aws/aws-sdk-go-v2/credentials v1.19.29 h1:WHZGssHH887cO0ox07SIQZsFx3MKD4ps6w0xUEmnKYQ= @@ -60,14 +60,14 @@ github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.31 h1:3GUprIsfmGcC5SACIyB0e7E0BM1 github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.31/go.mod h1:7PuV1yl5e2xnUbm+RqvVg5i2iBM8EyijZNoI9wsOoOc= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.13 h1:mbRIur/BiHK6SKPjoBIXSE/hJ6g6JGRLuxQy1jGjlN4= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.13/go.mod h1:ITg9em2KbJx1s0y4aqRX5OYWG6HBZ5TVR//OdpEZ2CQ= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.22 h1:V51LGlOq/1VsDsHUdoklAQi7rMmx4qQubvFYAlP2254= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.22/go.mod h1:4Pzhyz8hJOm2bepgl+NjvRx8vlUFAIIvJnZ/MkcNPpU= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.23 h1:9Fjh6fi/U5JEStVZijmaMpUwE/gvBJj7x2B/PjbO9To= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.23/go.mod h1:iMoT2f1tClxrWAAnKCXjZQ6LOmfLrMG14wmnWpM+F14= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.30 h1:/Z5jmNrKsSD7EmDjzAPsm/3L9IuOkzaynklJZ1qX7S4= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.30/go.mod h1:lEzEZnOosE7zi8Z6royW1cFJTD9fpab4Ul1SBrllewk= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.29 h1:hiME6pBzC7OTl9LMtlyTWBuEl1f4QBcUmFDKC7MLXtc= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.29/go.mod h1:G7RP+uhagpKtKhd1BM9N6JQqjCcGEU47K5lBVZQyRQw= -github.com/aws/aws-sdk-go-v2/service/s3 v1.104.0 h1:ta8csKy5vN91F3i5gGR85lFV0srBqySEji7Jroes6rE= -github.com/aws/aws-sdk-go-v2/service/s3 v1.104.0/go.mod h1:77ZAgynvx1txMvDG8gGWoWkO1augYDxkp9JElWFgjQU= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.31 h1:uao4A3QZ5UmB326V6KF+qRpv9Tjz7IlnlnTbbANntlU= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.31/go.mod h1:I/1+z0VwL1GhQyLgkoHDlygpUZ+iTAwOQ/NsftiUL2I= +github.com/aws/aws-sdk-go-v2/service/s3 v1.105.1 h1:LkBKxAOE5WXjlFuFZqPG1rREnl6I6QCMElcXFDEidos= +github.com/aws/aws-sdk-go-v2/service/s3 v1.105.1/go.mod h1:zdmCoFO/dSI7GlrwsPqFJI+WlFnSU4Tc8TJnlXrM1Do= github.com/aws/aws-sdk-go-v2/service/signin v1.4.1 h1:V7ZZ300WPXGjvkyore5DGe0ljVPOxCXie/thWdtSBXE= github.com/aws/aws-sdk-go-v2/service/signin v1.4.1/go.mod h1:mxC0nT/C8wMMS97DemZPzvUZxvIt+2Iq+eS3JdFZGgg= github.com/aws/aws-sdk-go-v2/service/sso v1.32.1 h1:gYFYh4iLLcAOJRLNPY2aD2g9DIhKn4eof8UkIrr1rTk= @@ -137,8 +137,8 @@ github.com/google/s2a-go v0.1.9 h1:LGD7gtMgezd8a/Xak7mEWL0PjoTQFvpRudN895yqKW0= github.com/google/s2a-go v0.1.9/go.mod h1:YA0Ei2ZQL3acow2O62kdp9UlnvMmU7kA6Eutn0dXayM= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.3.17 h1:73NfMHdiqo9JFU9+7a5ExpVa10/R29pXfZIaW559nrg= -github.com/googleapis/enterprise-certificate-proxy v0.3.17/go.mod h1:rSEsBUemEBZEexP2y6jPp16LUmUbjmSbcPMQizR0o4k= +github.com/googleapis/enterprise-certificate-proxy v0.3.18 h1:hvVi34VucdrV1IIsiWuqYM8kutw/92MxNEFxCJZEh0k= +github.com/googleapis/enterprise-certificate-proxy v0.3.18/go.mod h1:rSEsBUemEBZEexP2y6jPp16LUmUbjmSbcPMQizR0o4k= github.com/googleapis/gax-go/v2 v2.23.0 h1:Tchl7qkvE7Ip3y+ztvNufYFvkfqTe7NfLTYGIdJRLuE= github.com/googleapis/gax-go/v2 v2.23.0/go.mod h1:rBQKOVJCdb8IFEzg+FCwlt1LP/xMDGuqUXhUG+XMXEg= github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= @@ -153,8 +153,8 @@ github.com/hashicorp/go-getter v1.8.6 h1:9sQboWULaydVphxc4S64oAI4YqpuCk7nPmvbk13 github.com/hashicorp/go-getter v1.8.6/go.mod h1:nVH12eOV2P58dIiL3rsU6Fh3wLeJEKBOJzhMmzlSWoo= github.com/hashicorp/go-version v1.9.0 h1:CeOIz6k+LoN3qX9Z0tyQrPtiB1DFYRPfCIBtaXPSCnA= github.com/hashicorp/go-version v1.9.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hybridgroup/yzma v1.18.0 h1:M4ja0zt2ZBkTskMrHsGSls9/jts8hD83uuYMBYo9+c4= -github.com/hybridgroup/yzma v1.18.0/go.mod h1:DAsHYcX7ze7iFZH6PT57oCuqaVd/AXdALhjnOSgWbaE= +github.com/hybridgroup/yzma v1.19.0 h1:L3L5ryeJ5dt6yku0oRgcO/VNJdO2ObPkpCebd8S69o4= +github.com/hybridgroup/yzma v1.19.0/go.mod h1:DAsHYcX7ze7iFZH6PT57oCuqaVd/AXdALhjnOSgWbaE= github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= github.com/jupiterrider/ffi v0.7.0 h1:RKsl6Ascal+3kyAqR5Qcbp83LceQMLc1VZbPfHWoNzs= @@ -163,8 +163,8 @@ github.com/kaptinlin/jsonpointer v0.4.27 h1:5FOnhlkqQ4/lvHudaAWS8HJCXjN4yAHSIGl7 github.com/kaptinlin/jsonpointer v0.4.27/go.mod h1:dfub/n58cWS32Dyf3AZsnKblSAgrz9PyOU76GDPpx8Q= github.com/kaptinlin/jsonschema v0.9.3 h1:uDVd3w4aXwO0tbycblKYvFofhl3hVuE31vOl5JkDXI0= github.com/kaptinlin/jsonschema v0.9.3/go.mod h1:LvtQ/mO0E1e/3c3DiOWTj05LTeot8cTv7DyQq7eJMQg= -github.com/klauspost/compress v1.18.6 h1:2jupLlAwFm95+YDR+NwD2MEfFO9d4z4Prjl1XXDjuao= -github.com/klauspost/compress v1.18.6/go.mod h1:cwPg85FWrGar70rWktvGQj8/hthj3wpl0PGDogxkrSQ= +github.com/klauspost/compress v1.19.0 h1:sXLILfc9jV2QYWkzFOPWStmcUVH2RHEB1JCdY2oVvCQ= +github.com/klauspost/compress v1.19.0/go.mod h1:cwPg85FWrGar70rWktvGQj8/hthj3wpl0PGDogxkrSQ= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -187,10 +187,10 @@ github.com/prometheus/client_golang v1.23.2 h1:Je96obch5RDVy3FDMndoUsjAhG5Edi49h github.com/prometheus/client_golang v1.23.2/go.mod h1:Tb1a6LWHB3/SPIzCoaDXI4I8UHKeFTEQ1YCr+0Gyqmg= github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= -github.com/prometheus/common v0.69.0 h1:OA85nJQS/T/MaYh/Q2CcgDKSGWqNIgrBDvDH85CuiNk= -github.com/prometheus/common v0.69.0/go.mod h1:ZzL3f6u94qUxh9p+tJTrF+FvBS1XXbbRAZCQkytAL0Y= -github.com/prometheus/procfs v0.20.1 h1:XwbrGOIplXW/AU3YhIhLODXMJYyC1isLFfYCsTEycfc= -github.com/prometheus/procfs v0.20.1/go.mod h1:o9EMBZGRyvDrSPH1RqdxhojkuXstoe4UlK79eF5TGGo= +github.com/prometheus/common v0.70.0 h1:bcpru3tWPVnxGnETLgOV5jbp/JRXgYEyv65CuBLAMMI= +github.com/prometheus/common v0.70.0/go.mod h1:S/SFasQmgGiYH6C81LKCtYa8QACgthGg5zxL2udV7SY= +github.com/prometheus/procfs v0.21.1 h1:GljZCt+zSTS+NZq88cyQ1LjZ+RCHp3uVuabBWA5+OJI= +github.com/prometheus/procfs v0.21.1/go.mod h1:aB55Cww9pdSJVHk0hUf0inxWyyjPogFIjmHKYgMKmtY= github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= github.com/spiffe/go-spiffe/v2 v2.8.1 h1:eXZMLsu+3MLEPJyGJkolqtVrteZfQdUpOWj6LTiDl/E= @@ -223,8 +223,8 @@ go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.44.0 h1:4YsVu3B8+3qtWYYrsUY go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.44.0/go.mod h1:+wnlSn0mD1ADVMe3v9Z/WIaiz6q6gL2J/ejaAmdmv80= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.44.0 h1:qazEJlUOQzhCpzQpFETGby7EdqjI1wsd0W+6Gg1SCTU= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.44.0/go.mod h1:fOD2Yefuxixkx3ahVNf0O/PERb6r4OlbxfATVnYvzCo= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.43.0 h1:TC+BewnDpeiAmcscXbGMfxkO+mwYUwE/VySwvw88PfA= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.43.0/go.mod h1:J/ZyF4vfPwsSr9xJSPyQ4LqtcTPULFR64KwTikGLe+A= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.44.0 h1:hqxVTu/GtBF+vJ8d1fzW7fRxZFvgoDjWcxwwCaFDYpU= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.44.0/go.mod h1:z5fVEF4X5v0ESvlJqBrrFlBVoj5EQuefZpzsu7R+x5Q= go.opentelemetry.io/otel/metric v1.44.0 h1:1w0gILTcHdr3YI+ixLyjemwrVnsMURbTZFrSYCdDdmc= go.opentelemetry.io/otel/metric v1.44.0/go.mod h1:8O7hanEPBNgEMmybD3s2VBKcgWOCsA6tzHBPODAiquo= go.opentelemetry.io/otel/metric/x v0.66.0 h1:YkCrx1zLOChi9ZcZ6euupOcsgzbVlec7D/xoEU1+cTA= @@ -243,34 +243,34 @@ go.yaml.in/yaml/v2 v2.4.4 h1:tuyd0P+2Ont/d6e2rl3be67goVK4R6deVxCUX5vyPaQ= go.yaml.in/yaml/v2 v2.4.4/go.mod h1:gMZqIpDtDqOfM0uNfy0SkpRhvUryYH0Z6wdMYcacYXQ= go.yaml.in/yaml/v4 v4.0.0-rc.3 h1:3h1fjsh1CTAPjW7q/EMe+C8shx5d8ctzZTrLcs/j8Go= go.yaml.in/yaml/v4 v4.0.0-rc.3/go.mod h1:aZqd9kCMsGL7AuUv/m/PvWLdg5sjJsZ4oHDEnfPPfY0= -golang.org/x/crypto v0.53.0 h1:QZ4Muo8THX6CizN2vPPd5fBGHyogrdK9fG4wLPFUsto= -golang.org/x/crypto v0.53.0/go.mod h1:DNLU434OwVakk9PzuwV8w62mAJpRJL3vsgcfp4Qnsio= -golang.org/x/image v0.43.0 h1:FLxcP4ec2350nTfOC8ysKtqYSIFbk/QGjw1ZHNP4tsY= -golang.org/x/image v0.43.0/go.mod h1:rrpelvGFt+kLPAjPM4HeWPgrl0FtafueU//e5N0qk/Q= -golang.org/x/net v0.56.0 h1:Rw8j/hFzGvJUZwNBXnAtf5sVDVt+65SK2C7IxCxZt5o= -golang.org/x/net v0.56.0/go.mod h1:D3Ku6r+V6JROoZK144D2XfMHFcMq/0zSfLelVTCFKec= +golang.org/x/crypto v0.54.0 h1:YLIA59K4fiNzHzjnZt2tUJQjQtUWfWbeHBqKtk3eScw= +golang.org/x/crypto v0.54.0/go.mod h1:KWL8ny2AZdGR2cWmzeHrp2azQPGogOv+HeQaVEXC2dk= +golang.org/x/image v0.44.0 h1:+tDekMZED9+LrtB3G5xzRggpVh9CARjZqROla3R3R+I= +golang.org/x/image v0.44.0/go.mod h1:V8K3KE9KKKE+pLpQDOeN18w9oacNSvy1tDOirTu4xtY= +golang.org/x/net v0.57.0 h1:K5+3DljvIuDG9/Jv9rvyMywYNFCQ9RSUY6OOTTkT+tE= +golang.org/x/net v0.57.0/go.mod h1:KpXc8iv+r3XplLAG/f7Jsf9RPszJzdR0f58q9vGOuEU= golang.org/x/oauth2 v0.36.0 h1:peZ/1z27fi9hUOFCAZaHyrpWG5lwe0RJEEEeH0ThlIs= golang.org/x/oauth2 v0.36.0/go.mod h1:YDBUJMTkDnJS+A4BP4eZBjCqtokkg1hODuPjwiGPO7Q= -golang.org/x/sync v0.21.0 h1:HLII4xRRTtCRkxYp4HNFF0Js/Og6q2i++KXbg0gHCwM= -golang.org/x/sync v0.21.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= -golang.org/x/sys v0.46.0 h1:noSf2Fq6F8DBgS+LysIkx7rIExoNHJsxOAtPp4rthXw= -golang.org/x/sys v0.46.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= -golang.org/x/text v0.38.0 h1:sXmwo9DwP3OK9EZ7PqAdaooSGozfl/3a6/xJcbzPRhE= -golang.org/x/text v0.38.0/go.mod h1:YXZt3QhHUKYT53r2lLKFIVi6Ao1jdzrTR/KQ09qyxF4= +golang.org/x/sync v0.22.0 h1:SZjpbeLmrCk4xhRSZFNZW5gFUeCeFgjekvI/+gfScek= +golang.org/x/sync v0.22.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= +golang.org/x/sys v0.47.0 h1:o7XGOvZQCADBQQ4Y7VNq2dRWQR7JmOUW8Kxx4ZsNgWs= +golang.org/x/sys v0.47.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= +golang.org/x/text v0.40.0 h1:Ub2Z6/xjgF1WrYQz2nuITOEegKFtiIy+rieRJ5lHZKs= +golang.org/x/text v0.40.0/go.mod h1:hpnzDAfGV753zIKo+wk3u1bVKCGPbrnF7+7LBF/UHVY= golang.org/x/time v0.15.0 h1:bbrp8t3bGUeFOx08pvsMYRTCVSMk89u4tKbNOZbp88U= golang.org/x/time v0.15.0/go.mod h1:Y4YMaQmXwGQZoFaVFk4YpCt4FLQMYKZe9oeV/f4MSno= gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4= gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E= -google.golang.org/api v0.287.1 h1:LiyJx32VU3cwQfLchn/513qKhc25hq0pEANYJoWNnnI= -google.golang.org/api v0.287.1/go.mod h1:lM2kYRzYUCBY91P9h6VF1PYmvhxii3O5hji37qRvIcY= +google.golang.org/api v0.288.0 h1:glhO/J88obKP5I269W3hB73dvBKrjU56ZfmNlNXpgTU= +google.golang.org/api v0.288.0/go.mod h1:lM2kYRzYUCBY91P9h6VF1PYmvhxii3O5hji37qRvIcY= google.golang.org/genai v1.63.0 h1:Iryg+4TBco5HaRbwVhAV/ROKVcWiZkuvQzKb4u1QggY= google.golang.org/genai v1.63.0/go.mod h1:mDdPDFXo1Ats7f1WXVyZgWb/CkMzFWTWJruIMy7hGIU= -google.golang.org/genproto v0.0.0-20260622175928-b703f567277d h1:CP5omUq8AJTiWMrPKM1WRLJ7zZeXd9OPcQD3TbBNAyY= -google.golang.org/genproto v0.0.0-20260622175928-b703f567277d/go.mod h1:DrwuGJgFSEVNpv3S5Q5VxhRTvdnjauw9GtvwVOEARfA= -google.golang.org/genproto/googleapis/api v0.0.0-20260630182238-925bb5da69e7 h1:jQ9p21COKWjP3VwuFrNRiiOTMh3mPpN45R7SLrH/HUU= -google.golang.org/genproto/googleapis/api v0.0.0-20260630182238-925bb5da69e7/go.mod h1:KqHwBx2upmfa1XSi1WuRvC+2VGCLtooKkfmyvRbUmqA= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260630182238-925bb5da69e7 h1:eM/YSd5bBFagF51o1E745Ta7RwzpW0h+z+QDNZOgmQ8= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260630182238-925bb5da69e7/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= +google.golang.org/genproto v0.0.0-20260713224248-f5fc221cf8c4 h1:PWVFocb6Y93aqxY7m9ArHu5zQiLkIrXBLr+ajQxRHH0= +google.golang.org/genproto v0.0.0-20260713224248-f5fc221cf8c4/go.mod h1:v47/Kzm6KzB/2uGxuDjGww+7Dk7ny/VFIaIw4WxEtu0= +google.golang.org/genproto/googleapis/api v0.0.0-20260713224248-f5fc221cf8c4 h1:lI0NbdWVmT6lOJJNDd7vyeTdfxP/7ouCLSJUKNNXa0k= +google.golang.org/genproto/googleapis/api v0.0.0-20260713224248-f5fc221cf8c4/go.mod h1:WRrQ7/7N19PypuT0fxLOL5Lq0waoiRri4FbtHDEKrGE= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260713224248-f5fc221cf8c4 h1:7RtFDizMtT9eZzHzKxifoMGfcDBBy+LYZlgfg24ZmOM= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260713224248-f5fc221cf8c4/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= google.golang.org/grpc v1.82.0 h1:vguDnZUPjE26w09A63VoxZPnvPjB5Riyc0mkXPFmAIU= google.golang.org/grpc v1.82.0/go.mod h1:yzTZ1TB1Z3SG+LIYaI+WiE8D5+PZ3ArnrSp8zF3+/ZA= google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= From ec2dfd064f8e7bc3edd87726ac5bacd81f511b44 Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Wed, 15 Jul 2026 14:36:55 -0300 Subject: [PATCH 046/156] fix: increase default retry backoff to 5s and 3 max retries (#314) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Previous defaults (2 retries, 2s initial delay) were too aggressive for transient provider errors like rate limits and service unavailable. New sequence is 5s → 10s → 20s (35s worst case). Assisted-by: Crush:glm-5.2 --- retry.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/retry.go b/retry.go index 3aaabd56d..efa559f47 100644 --- a/retry.go +++ b/retry.go @@ -102,8 +102,8 @@ type OnRetryCallback = func(err *ProviderError, delay time.Duration) // DefaultRetryOptions returns the default retry options. func DefaultRetryOptions() RetryOptions { return RetryOptions{ - MaxRetries: 2, - InitialDelayIn: 2000 * time.Millisecond, + MaxRetries: 3, + InitialDelayIn: 5000 * time.Millisecond, BackoffFactor: 2.0, } } From 720ab8be7cafe016963d7aad420f340dc0d02864 Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Wed, 15 Jul 2026 14:37:20 -0300 Subject: [PATCH 047/156] v0.37.3 --- version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.txt b/version.txt index 8570a3aeb..88e18b18f 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -0.37.2 +0.37.3 From f8664d5324826187ada9e6ce5274d4611c118ffc Mon Sep 17 00:00:00 2001 From: Kieran Klukas Date: Thu, 16 Jul 2026 12:09:01 -0400 Subject: [PATCH 048/156] feat(stream): catch transport errors and retry (#312) --- errors.go | 131 +++++++++++++++++++++++++- errors_test.go | 113 ++++++++++++++++++++++ go.mod | 2 +- providers/anthropic/error.go | 12 +-- providers/google/error.go | 12 +-- providers/openai/error.go | 11 +-- providers/openai/stream_reset_test.go | 72 ++++++++++++++ retry.go | 24 ++++- retry_test.go | 58 ++++++++++++ 9 files changed, 398 insertions(+), 37 deletions(-) create mode 100644 errors_test.go create mode 100644 providers/openai/stream_reset_test.go diff --git a/errors.go b/errors.go index 08d8f73a0..8319fe687 100644 --- a/errors.go +++ b/errors.go @@ -9,6 +9,7 @@ import ( "strings" "github.com/charmbracelet/x/exp/slice" + "golang.org/x/net/http2" ) // Error is a custom error type for the fantasy package. @@ -53,16 +54,26 @@ func (m *ProviderError) Error() string { return fmt.Sprintf("%s: %s", m.Title, m.Message) } +// Unwrap returns the underlying cause so errors.Is and errors.As can +// inspect the wrapped error (e.g. an HTTP/2 transport error). +func (m *ProviderError) Unwrap() error { + return m.Cause +} + // IsRetryable reports whether the error should be retried. // It returns true if the underlying cause is io.ErrUnexpectedEOF, if the -// "x-should-retry" response header evaluates to true, or if the HTTP status -// code indicates a retryable condition (408, 409, 429, or any 5xx). +// "x-should-retry" response header evaluates to true, if the HTTP status +// code indicates a retryable condition (408, 409, 429, or any 5xx), or +// if the cause is a transient HTTP/2 transport error. func (m *ProviderError) IsRetryable() bool { // We're mostly mimicking OpenAI's Go SDK here: // https://github.com/openai/openai-go/blob/b9d280a37149430982e9dfeed16c41d27d45cfc5/internal/requestconfig/requestconfig.go#L244 if errors.Is(m.Cause, io.ErrUnexpectedEOF) { return true } + if IsTransportError(m.Cause) { + return true + } if m.shouldRetryHeader() { return true } @@ -103,6 +114,122 @@ func NewIncompleteStreamError() *ProviderError { } } +// http2TransportErrorFragments are message fragments that identify a +// transient HTTP/2 transport failure. Go's standard library bundles its +// own copy of the http2 package whose error types are unexported, so they +// cannot be matched with errors.As. We fall back to matching these stable +// fragments, which both the stdlib and x/net/http2 use. The list is kept +// tight to avoid misclassifying application-level errors as transport +// failures. +var http2TransportErrorFragments = []string{ + "stream error:", // RST_STREAM: INTERNAL_ERROR, REFUSED_STREAM, CANCEL, etc. + "connection error:", // connection-level protocol error +} + +// IsTransportError reports whether err or any error in its chain is a +// transient transport-level failure that is safe to retry on a fresh +// connection. In practice these are HTTP/2 stream resets, connection +// errors, and GOAWAY frames, which originate from the transport rather +// than the application. +// +// x/net/http2 error types are matched by type; Go's stdlib-bundled http2 +// uses unexported types, so those are matched by their message fragments. +func IsTransportError(err error) bool { + if err == nil { + return false + } + var ( + streamErr http2.StreamError + connErr http2.ConnectionError + goAwayErr http2.GoAwayError + ) + if errors.As(err, &streamErr) || + errors.As(err, &connErr) || + errors.As(err, &goAwayErr) { + return true + } + // Wrapped errors embed the inner message, so scanning the top-level + // string covers the whole chain. + msg := err.Error() + for _, fragment := range http2TransportErrorFragments { + if strings.Contains(msg, fragment) { + return true + } + } + return false +} + +// NewTransportError wraps a transient transport error into a retryable +// ProviderError with a human-friendly title and message. +func NewTransportError(err error) *ProviderError { + return &ProviderError{ + Title: "stream transport error", + Message: extractHTTP2ErrorMessage(err), + Cause: err, + } +} + +// WrapTransportError wraps a transient transport failure in a retryable +// ProviderError so callers get a clean message and .IsRetryable() reports +// true. It recognizes an unexpected mid-stream EOF and HTTP/2 stream, +// connection, and GOAWAY resets. Any other error is returned unchanged. +// +// This is the canonical entry point for provider error handlers: they can +// hand off whatever the transport surfaced without re-encoding which +// failures count as transient. +func WrapTransportError(err error) error { + switch { + case errors.Is(err, io.ErrUnexpectedEOF): + return &ProviderError{ + Title: "stream transport error", + Message: err.Error(), + Cause: err, + } + case IsTransportError(err): + return NewTransportError(err) + default: + return err + } +} + +// extractHTTP2ErrorMessage locates the HTTP/2 error fragment within a +// possibly-wrapped error message and returns a concise, cleaned form for +// display. It falls back to the full message when no fragment is found. +// +// "stream error: stream ID 27; INTERNAL_ERROR; received from peer" → "INTERNAL_ERROR (received from peer)" +// "stream error: stream ID 5; REFUSED_STREAM" → "REFUSED_STREAM" +// "http2: connection error: INTERNAL_ERROR" → "INTERNAL_ERROR" +func extractHTTP2ErrorMessage(err error) string { + msg := err.Error() + for _, fragment := range http2TransportErrorFragments { + if i := strings.Index(msg, fragment); i != -1 { + return cleanHTTP2ErrorMessage(msg[i:]) + } + } + return msg +} + +// cleanHTTP2ErrorMessage trims the verbose framing from an HTTP/2 error +// string that begins at a known fragment. "stream error: stream ID N; CODE" +// collapses to "CODE" (with any trailing cause in parentheses), and +// "connection error: CODE" collapses to "CODE". +func cleanHTTP2ErrorMessage(msg string) string { + // "stream error: stream ID N; CODE[; cause]". + if idx := strings.Index(msg, "; "); idx != -1 { + rest := msg[idx+2:] + code, cause, hasCause := strings.Cut(rest, "; ") + if hasCause { + return fmt.Sprintf("%s (%s)", code, cause) + } + return code + } + // "connection error: CODE". + if _, code, ok := strings.Cut(msg, ": "); ok { + return code + } + return msg +} + // RetryError represents an error that occurred during retry operations. type RetryError struct { Errors []error diff --git a/errors_test.go b/errors_test.go new file mode 100644 index 000000000..aaec57f3d --- /dev/null +++ b/errors_test.go @@ -0,0 +1,113 @@ +package fantasy + +import ( + "fmt" + "testing" + + "golang.org/x/net/http2" +) + +func TestIsTransportError(t *testing.T) { + t.Parallel() + + tests := []struct { + name string + err error + want bool + }{ + {"nil error", nil, false}, + {"stream error with peer", newTestError("stream error: stream ID 27; INTERNAL_ERROR; received from peer"), true}, + {"stream error without peer", newTestError("stream error: stream ID 5; REFUSED_STREAM"), true}, + {"connection error", newTestError("connection error: INTERNAL_ERROR"), true}, + {"http2-prefixed connection error", newTestError("http2: connection error: PROTOCOL_ERROR: bad frame"), true}, + {"generic error", newTestError("something went wrong"), false}, + {"EOF", newTestError("EOF"), false}, + {"empty error", newTestError(""), false}, + {"wrapped stream error", fmt.Errorf("reading body: %w", newTestError("stream error: stream ID 3; INTERNAL_ERROR")), true}, + {"x/net StreamError", http2.StreamError{StreamID: 1, Code: http2.ErrCodeInternal}, true}, + {"x/net ConnectionError", http2.ConnectionError(http2.ErrCodeInternal), true}, + {"x/net GoAwayError", http2.GoAwayError{LastStreamID: 1, ErrCode: http2.ErrCodeInternal}, true}, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + if got := IsTransportError(tt.err); got != tt.want { + t.Errorf("IsTransportError(%v) = %v, want %v", tt.err, got, tt.want) + } + }) + } +} + +func TestCleanHTTP2ErrorMessage(t *testing.T) { + t.Parallel() + + tests := []struct { + input string + want string + }{ + { + "stream error: stream ID 27; INTERNAL_ERROR; received from peer", + "INTERNAL_ERROR (received from peer)", + }, + { + "stream error: stream ID 5; REFUSED_STREAM", + "REFUSED_STREAM", + }, + { + "connection error: INTERNAL_ERROR", + "INTERNAL_ERROR", + }, + { + "some other error", + "some other error", + }, + } + + for _, tt := range tests { + t.Run(tt.input, func(t *testing.T) { + t.Parallel() + if got := cleanHTTP2ErrorMessage(tt.input); got != tt.want { + t.Errorf("cleanHTTP2ErrorMessage(%q) = %q, want %q", tt.input, got, tt.want) + } + }) + } +} + +func TestNewTransportError(t *testing.T) { + t.Parallel() + + rawErr := newTestError("stream error: stream ID 27; INTERNAL_ERROR; received from peer") + err := NewTransportError(rawErr) + + if err.Title != "stream transport error" { + t.Errorf("Title = %q, want %q", err.Title, "stream transport error") + } + if err.Message != "INTERNAL_ERROR (received from peer)" { + t.Errorf("Message = %q, want %q", err.Message, "INTERNAL_ERROR (received from peer)") + } + if !err.IsRetryable() { + t.Error("expected HTTP/2 transport error to be retryable") + } +} + +func TestNewTransportErrorWrapped(t *testing.T) { + t.Parallel() + + rawErr := fmt.Errorf("reading response body: %w", + newTestError("stream error: stream ID 12; REFUSED_STREAM")) + err := NewTransportError(rawErr) + + if err.Message != "REFUSED_STREAM" { + t.Errorf("Message = %q, want %q", err.Message, "REFUSED_STREAM") + } + if !err.IsRetryable() { + t.Error("expected wrapped HTTP/2 transport error to be retryable") + } +} + +type testError struct{ msg string } + +func (e *testError) Error() string { return e.msg } + +func newTestError(msg string) error { return &testError{msg: msg} } diff --git a/go.mod b/go.mod index f28812258..82f06dfef 100644 --- a/go.mod +++ b/go.mod @@ -19,6 +19,7 @@ require ( github.com/kaptinlin/jsonschema v0.9.3 github.com/openai/openai-go/v3 v3.43.0 github.com/stretchr/testify v1.11.1 + golang.org/x/net v0.57.0 golang.org/x/oauth2 v0.36.0 google.golang.org/genai v1.63.0 ) @@ -111,7 +112,6 @@ require ( go.yaml.in/yaml/v4 v4.0.0-rc.3 // indirect golang.org/x/crypto v0.54.0 // indirect golang.org/x/image v0.44.0 // indirect - golang.org/x/net v0.57.0 // indirect golang.org/x/sync v0.22.0 // indirect golang.org/x/sys v0.47.0 // indirect golang.org/x/text v0.40.0 // indirect diff --git a/providers/anthropic/error.go b/providers/anthropic/error.go index a2a351d50..8ff25ebac 100644 --- a/providers/anthropic/error.go +++ b/providers/anthropic/error.go @@ -3,7 +3,6 @@ package anthropic import ( "cmp" "errors" - "io" "net/http" "regexp" "strconv" @@ -33,15 +32,8 @@ func toProviderErr(err error) error { return providerErr } - // Wrap in a `ProviderError` so `.IsRetriable()` works. - if errors.Is(err, io.ErrUnexpectedEOF) { - return &fantasy.ProviderError{ - Title: "stream transport error", - Message: err.Error(), - Cause: err, - } - } - return err + // Wrap transient transport failures so `.IsRetryable()` works. + return fantasy.WrapTransportError(err) } func parseContextTooLargeError(message string, providerErr *fantasy.ProviderError) { diff --git a/providers/google/error.go b/providers/google/error.go index cd706384e..05a17666e 100644 --- a/providers/google/error.go +++ b/providers/google/error.go @@ -3,7 +3,6 @@ package google import ( "cmp" "errors" - "io" "regexp" "strconv" @@ -16,15 +15,8 @@ var googleContextPattern = regexp.MustCompile(`input token count.*?(\d+).*?excee func toProviderErr(err error) error { var apiErr genai.APIError if !errors.As(err, &apiErr) { - // Wrap in a `ProviderError` so `.IsRetriable()` works. - if errors.Is(err, io.ErrUnexpectedEOF) { - return &fantasy.ProviderError{ - Title: "stream transport error", - Message: err.Error(), - Cause: err, - } - } - return err + // Wrap transient transport failures so `.IsRetryable()` works. + return fantasy.WrapTransportError(err) } providerErr := &fantasy.ProviderError{ diff --git a/providers/openai/error.go b/providers/openai/error.go index c3153a019..582d21a84 100644 --- a/providers/openai/error.go +++ b/providers/openai/error.go @@ -38,15 +38,8 @@ func toProviderErr(err error) error { return providerErr } - // Wrap in a `ProviderError` so `.IsRetriable()` works. - if errors.Is(err, io.ErrUnexpectedEOF) { - return &fantasy.ProviderError{ - Title: "stream transport error", - Message: err.Error(), - Cause: err, - } - } - return err + // Wrap transient transport failures so `.IsRetryable()` works. + return fantasy.WrapTransportError(err) } func parseContextTooLargeError(message string, providerErr *fantasy.ProviderError) { diff --git a/providers/openai/stream_reset_test.go b/providers/openai/stream_reset_test.go new file mode 100644 index 000000000..8d24ef552 --- /dev/null +++ b/providers/openai/stream_reset_test.go @@ -0,0 +1,72 @@ +package openai + +import ( + "context" + "fmt" + "net/http" + "net/http/httptest" + "testing" + + "charm.land/fantasy" + "github.com/stretchr/testify/require" +) + +// TestStreamHTTP2StreamReset proves the full chain end to end: a real +// HTTP/2 RST_STREAM sent mid-response surfaces as a retryable +// ProviderError so the agent's retry middleware re-runs the step. +// +// The server streams a partial SSE chunk, flushes, then aborts the +// handler. On an HTTP/2 connection this makes the transport send an +// RST_STREAM(INTERNAL_ERROR) to the client, which is exactly the +// "stream error: stream ID N; INTERNAL_ERROR; received from peer" +// failure observed in production. +func TestStreamHTTP2StreamReset(t *testing.T) { + t.Parallel() + + srv := httptest.NewUnstartedServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "text/event-stream") + w.WriteHeader(http.StatusOK) + // Stream a valid partial chunk so the client is mid-stream. + fmt.Fprint(w, "data: {\"id\":\"1\",\"object\":\"chat.completion.chunk\","+ + "\"choices\":[{\"index\":0,\"delta\":{\"content\":\"partial\"}}]}\n\n") + w.(http.Flusher).Flush() + // Abort mid-stream: on HTTP/2 this emits RST_STREAM to the peer. + panic(http.ErrAbortHandler) + })) + srv.EnableHTTP2 = true + srv.StartTLS() + defer srv.Close() + + provider, err := New( + WithAPIKey("test-api-key"), + WithBaseURL(srv.URL), + // srv.Client() trusts the test cert and negotiates HTTP/2. + WithHTTPClient(srv.Client()), + ) + require.NoError(t, err) + + model, err := provider.LanguageModel(t.Context(), "gpt-3.5-turbo") + require.NoError(t, err) + + stream, err := model.Stream(context.Background(), fantasy.Call{Prompt: testPrompt}) + require.NoError(t, err) + + var streamErr error + for part := range stream { + if part.Type == fantasy.StreamPartTypeError { + streamErr = part.Error + } + } + + require.Error(t, streamErr, "expected a stream error from the RST_STREAM") + + // The error must be classified as a transient HTTP/2 transport error. + require.True(t, fantasy.IsTransportError(streamErr), + "error should be detected as HTTP/2 transport error, got: %v", streamErr) + + // It must be wrapped as a retryable ProviderError so the retry + // middleware engages. + var provErr *fantasy.ProviderError + require.ErrorAs(t, streamErr, &provErr) + require.True(t, provErr.IsRetryable(), "provider error should be retryable") +} diff --git a/retry.go b/retry.go index efa559f47..00fba2627 100644 --- a/retry.go +++ b/retry.go @@ -96,7 +96,17 @@ type RetryOptions struct { OnAuthRefresh OnAuthRefreshFunc } -// OnRetryCallback defines a function that is called when a retry occurs. +// OnRetryCallback is called before each retry attempt, after the retry +// delay is chosen but before it elapses. err is the failure that triggered +// the retry (nil if the failure was not a *ProviderError) and delay is how +// long the middleware will wait before the next attempt. +// +// A retry re-runs the entire step from scratch: the stream is recreated and +// the stream callbacks (OnTextStart, OnTextDelta, OnReasoningStart, +// OnReasoningDelta, OnToolInputStart, etc.) fire again from the beginning of +// the new response. Consumers that accumulate streamed content must reset +// that accumulated state here, otherwise the retried response is appended to +// the partial content from the failed attempt. type OnRetryCallback = func(err *ProviderError, delay time.Duration) // DefaultRetryOptions returns the default retry options. @@ -166,9 +176,10 @@ func isAuthError(err *ProviderError) bool { } // isRetryableError reports whether the error should be retried. -// It checks for retryable ProviderError and also retries network-level -// connection errors (DNS failures, TCP timeouts, connection refused, etc.) -// that never produce an HTTP response and therefore aren't wrapped in ProviderError. +// It checks for retryable ProviderError, network-level connection errors +// (DNS failures, TCP timeouts, connection refused), and HTTP/2 stream- +// level transport errors. The latter two categories may not be wrapped +// in ProviderError when they occur outside the provider's error handler. func isRetryableError(err error) bool { var providerErr *ProviderError if errors.As(err, &providerErr) { @@ -178,7 +189,10 @@ func isRetryableError(err error) bool { return false } var netErr net.Error - return errors.As(err, &netErr) + if errors.As(err, &netErr) { + return true + } + return IsTransportError(err) } // isAbortError checks if the error is a context cancellation error. diff --git a/retry_test.go b/retry_test.go index 7acca3cac..99005e9ca 100644 --- a/retry_test.go +++ b/retry_test.go @@ -64,6 +64,35 @@ func TestIsRetryableError(t *testing.T) { t.Error("expected generic error to not be retryable") } }) + + t.Run("HTTP/2 stream error is retryable", func(t *testing.T) { + t.Parallel() + err := errors.New("stream error: stream ID 27; INTERNAL_ERROR; received from peer") + if !isRetryableError(err) { + t.Error("expected HTTP/2 stream error to be retryable") + } + }) + + t.Run("HTTP/2 connection error is retryable", func(t *testing.T) { + t.Parallel() + err := errors.New("connection error: INTERNAL_ERROR") + if !isRetryableError(err) { + t.Error("expected HTTP/2 connection error to be retryable") + } + }) + + t.Run("ProviderError wrapping HTTP/2 stream error is retryable", func(t *testing.T) { + t.Parallel() + rawErr := errors.New("stream error: stream ID 5; REFUSED_STREAM") + err := &ProviderError{ + Title: "stream transport error", + Message: "REFUSED_STREAM", + Cause: rawErr, + } + if !isRetryableError(err) { + t.Error("expected ProviderError wrapping HTTP/2 stream error to be retryable") + } + }) } func TestRetryWithExponentialBackoff_ConnectionErrors(t *testing.T) { @@ -141,6 +170,35 @@ func TestRetryWithExponentialBackoff_ConnectionErrors(t *testing.T) { t.Fatalf("expected RetryError, got %T: %v", err, err) } }) + + t.Run("retries on HTTP/2 stream error", func(t *testing.T) { + t.Parallel() + attempts := 0 + opts := RetryOptions{ + MaxRetries: 2, + InitialDelayIn: 1 * time.Millisecond, + BackoffFactor: 2.0, + } + + retryFn := RetryWithExponentialBackoffRespectingRetryHeaders[int](opts) + + result, err := retryFn(context.Background(), func() (int, error) { + attempts++ + if attempts < 3 { + return 0, errors.New("stream error: stream ID 27; INTERNAL_ERROR; received from peer") + } + return 42, nil + }) + if err != nil { + t.Fatalf("expected no error, got %v", err) + } + if result != 42 { + t.Fatalf("expected result 42, got %d", result) + } + if attempts != 3 { + t.Fatalf("expected 3 attempts, got %d", attempts) + } + }) } func TestRetryWithAuthRefresh(t *testing.T) { From c90637fc228ade11b7b12182906ef2cff0a83e44 Mon Sep 17 00:00:00 2001 From: Kieran Klukas Date: Thu, 16 Jul 2026 12:10:17 -0400 Subject: [PATCH 049/156] v0.38.0 --- version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.txt b/version.txt index 88e18b18f..ca75280b0 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -0.37.3 +0.38.0 From 09bfaccd044c2b9088c56208112fe3add41bff00 Mon Sep 17 00:00:00 2001 From: Kieran Klukas Date: Thu, 16 Jul 2026 14:12:53 -0400 Subject: [PATCH 050/156] fix: include bedrock auth errors --- errors.go | 6 +++++ providers/anthropic/error.go | 16 ++++++++++++ providers/anthropic/error_test.go | 26 ++++++++++++++++++++ retry.go | 2 +- retry_test.go | 41 +++++++++++++++++++++++++++++++ 5 files changed, 90 insertions(+), 1 deletion(-) diff --git a/errors.go b/errors.go index 8319fe687..25cd84f63 100644 --- a/errors.go +++ b/errors.go @@ -45,6 +45,12 @@ type ProviderError struct { ContextUsedTokens int ContextMaxTokens int ContextTooLargeErr bool + + // AuthError marks the error as an authentication failure a provider + // flagged as resolvable by refreshing credentials (e.g. re-running an + // interactive login). It covers auth failures that do not carry an HTTP + // 401 status, so a caller-supplied OnAuthRefresh hook still engages. + AuthError bool } func (m *ProviderError) Error() string { diff --git a/providers/anthropic/error.go b/providers/anthropic/error.go index 8ff25ebac..0de43de6e 100644 --- a/providers/anthropic/error.go +++ b/providers/anthropic/error.go @@ -14,6 +14,12 @@ import ( var anthropicContextPattern = regexp.MustCompile(`prompt is too long:\s*(\d+)\s*tokens?\s*>\s*(\d+)\s*maximum`) +// awsCredentialErrorFragment identifies an expired AWS credential-chain +// failure. Bedrock runs through this provider, so when its SSO/role +// credentials need refreshing the AWS SDK surfaces this message locally +// rather than as an HTTP 401. Direct Anthropic API calls never produce it. +const awsCredentialErrorFragment = "failed to refresh cached credentials" + func toProviderErr(err error) error { var apiErr *anthropic.Error if errors.As(err, &apiErr) { @@ -32,6 +38,16 @@ func toProviderErr(err error) error { return providerErr } + // Expired Bedrock (AWS) credentials surface from the local credential + // chain, not as a 401. Flag them so OnAuthRefresh can engage. + if strings.Contains(err.Error(), awsCredentialErrorFragment) { + return &fantasy.ProviderError{ + Title: "authentication error", + Message: err.Error(), + Cause: err, + AuthError: true, + } + } // Wrap transient transport failures so `.IsRetryable()` works. return fantasy.WrapTransportError(err) } diff --git a/providers/anthropic/error_test.go b/providers/anthropic/error_test.go index 26273a352..7fdf25ac3 100644 --- a/providers/anthropic/error_test.go +++ b/providers/anthropic/error_test.go @@ -65,3 +65,29 @@ func TestToProviderErr_PassesThroughPlainEOF(t *testing.T) { t.Errorf("toProviderErr wrapped io.EOF as ProviderError; should pass through") } } + +func TestToProviderErr_FlagsExpiredBedrockCredentials(t *testing.T) { + t.Parallel() + + cases := []struct { + name string + err error + }{ + {"direct", errors.New("failed to refresh cached credentials")}, + {"wrapped", fmt.Errorf("operation error Bedrock: %w", errors.New("failed to refresh cached credentials"))}, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + t.Parallel() + + var providerErr *fantasy.ProviderError + if !errors.As(toProviderErr(tc.err), &providerErr) { + t.Fatalf("toProviderErr did not wrap %v as *fantasy.ProviderError", tc.err) + } + if !providerErr.AuthError { + t.Error("expected AuthError flag so OnAuthRefresh engages") + } + }) + } +} diff --git a/retry.go b/retry.go index 00fba2627..92e2e0d41 100644 --- a/retry.go +++ b/retry.go @@ -172,7 +172,7 @@ func retryWithExponentialBackoff[T any](ctx context.Context, fn RetryFn[T], opti // isAuthError reports whether the error is an authentication failure that a // caller-supplied OnAuthRefresh hook may be able to resolve. func isAuthError(err *ProviderError) bool { - return err.StatusCode == http.StatusUnauthorized + return err.StatusCode == http.StatusUnauthorized || err.AuthError } // isRetryableError reports whether the error should be retried. diff --git a/retry_test.go b/retry_test.go index 99005e9ca..d2a58326b 100644 --- a/retry_test.go +++ b/retry_test.go @@ -206,6 +206,44 @@ func TestRetryWithAuthRefresh(t *testing.T) { authErr := func() error { return &ProviderError{StatusCode: 401, Message: "unauthorized"} } + t.Run("refreshes and retries transparently on a flagged non-401 auth error", func(t *testing.T) { + t.Parallel() + attempts := 0 + refreshed := 0 + opts := RetryOptions{ + MaxRetries: 2, + InitialDelayIn: 1 * time.Millisecond, + BackoffFactor: 2.0, + OnAuthRefresh: func(_ context.Context, _ *ProviderError) error { + refreshed++ + return nil + }, + } + + retryFn := RetryWithExponentialBackoffRespectingRetryHeaders[int](opts) + result, err := retryFn(context.Background(), func() (int, error) { + attempts++ + if attempts == 1 { + // No 401 status; classified as auth purely via the flag, + // mirroring an expired AWS SSO session. + return 0, &ProviderError{Message: "failed to refresh cached credentials", AuthError: true} + } + return 7, nil + }) + if err != nil { + t.Fatalf("expected no error, got %v", err) + } + if result != 7 { + t.Fatalf("expected result 7, got %d", result) + } + if refreshed != 1 { + t.Fatalf("expected 1 refresh, got %d", refreshed) + } + if attempts != 2 { + t.Fatalf("expected 2 attempts, got %d", attempts) + } + }) + t.Run("refreshes and retries transparently on 401", func(t *testing.T) { t.Parallel() attempts := 0 @@ -370,4 +408,7 @@ func TestIsAuthError(t *testing.T) { if isAuthError(&ProviderError{StatusCode: 500}) { t.Error("expected 500 to not be an auth error") } + if !isAuthError(&ProviderError{AuthError: true}) { + t.Error("expected an AuthError-flagged error to be an auth error") + } } From 5b5ac148e5fc1872cf03845e55ca6afa61c22f27 Mon Sep 17 00:00:00 2001 From: Kieran Klukas Date: Thu, 16 Jul 2026 14:13:01 -0400 Subject: [PATCH 051/156] v0.38.1 --- version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.txt b/version.txt index ca75280b0..bb22182d4 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -0.38.0 +0.38.1 From 1f73dea7bc747146ef82cfbcd262253332821aa6 Mon Sep 17 00:00:00 2001 From: Kieran Klukas Date: Thu, 16 Jul 2026 14:25:17 -0400 Subject: [PATCH 052/156] fix: gosec lint warning --- providers/anthropic/error.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/providers/anthropic/error.go b/providers/anthropic/error.go index 0de43de6e..b1a7e6dd9 100644 --- a/providers/anthropic/error.go +++ b/providers/anthropic/error.go @@ -18,7 +18,7 @@ var anthropicContextPattern = regexp.MustCompile(`prompt is too long:\s*(\d+)\s* // failure. Bedrock runs through this provider, so when its SSO/role // credentials need refreshing the AWS SDK surfaces this message locally // rather than as an HTTP 401. Direct Anthropic API calls never produce it. -const awsCredentialErrorFragment = "failed to refresh cached credentials" +const awsCredentialErrorFragment = "failed to refresh cached credentials" //nolint:gosec // false positive: error message fragment, not a credential func toProviderErr(err error) error { var apiErr *anthropic.Error From ca86309a29f2970c516fb10472dd9e24a81fa64a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 20 Jul 2026 09:20:51 +0000 Subject: [PATCH 053/156] chore(deps): bump the all group with 3 updates (#317) Bumps the all group with 3 updates: [github.com/aws/smithy-go](https://github.com/aws/smithy-go), [github.com/openai/openai-go/v3](https://github.com/openai/openai-go) and [google.golang.org/genai](https://github.com/googleapis/go-genai). Updates `github.com/aws/smithy-go` from 1.27.3 to 1.27.4 - [Release notes](https://github.com/aws/smithy-go/releases) - [Changelog](https://github.com/aws/smithy-go/blob/main/CHANGELOG.md) - [Commits](https://github.com/aws/smithy-go/compare/v1.27.3...v1.27.4) Updates `github.com/openai/openai-go/v3` from 3.43.0 to 3.44.0 - [Release notes](https://github.com/openai/openai-go/releases) - [Changelog](https://github.com/openai/openai-go/blob/main/CHANGELOG.md) - [Commits](https://github.com/openai/openai-go/compare/v3.43.0...v3.44.0) Updates `google.golang.org/genai` from 1.63.0 to 1.64.0 - [Release notes](https://github.com/googleapis/go-genai/releases) - [Changelog](https://github.com/googleapis/go-genai/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/go-genai/compare/v1.63.0...v1.64.0) --- updated-dependencies: - dependency-name: github.com/aws/smithy-go dependency-version: 1.27.4 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all - dependency-name: github.com/openai/openai-go/v3 dependency-version: 3.44.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: all - dependency-name: google.golang.org/genai dependency-version: 1.64.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: all ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 6 +++--- go.sum | 12 ++++++------ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/go.mod b/go.mod index 82f06dfef..e158ea274 100644 --- a/go.mod +++ b/go.mod @@ -8,7 +8,7 @@ require ( github.com/ardanlabs/kronk v1.28.7 github.com/aws/aws-sdk-go-v2 v1.42.1 github.com/aws/aws-sdk-go-v2/config v1.32.30 - github.com/aws/smithy-go v1.27.3 + github.com/aws/smithy-go v1.27.4 github.com/charmbracelet/anthropic-sdk-go v0.0.0-20260223140439-63879b0b8dab github.com/charmbracelet/x/exp/slice v0.0.0-20250904123553-b4e2667e5ad5 github.com/charmbracelet/x/exp/strings v0.1.0 @@ -17,11 +17,11 @@ require ( github.com/google/uuid v1.6.0 github.com/joho/godotenv v1.5.1 github.com/kaptinlin/jsonschema v0.9.3 - github.com/openai/openai-go/v3 v3.43.0 + github.com/openai/openai-go/v3 v3.44.0 github.com/stretchr/testify v1.11.1 golang.org/x/net v0.57.0 golang.org/x/oauth2 v0.36.0 - google.golang.org/genai v1.63.0 + google.golang.org/genai v1.64.0 ) require ( diff --git a/go.sum b/go.sum index 03ecdaec9..5fb65e6e0 100644 --- a/go.sum +++ b/go.sum @@ -76,8 +76,8 @@ github.com/aws/aws-sdk-go-v2/service/ssooidc v1.37.1 h1:arjT9Cm3/WYbGmD5TUZHk4UQ github.com/aws/aws-sdk-go-v2/service/ssooidc v1.37.1/go.mod h1:DMPWJBjYs6+3+f/qhBFEFPPlQ6NlhWjai3dJNvipJ84= github.com/aws/aws-sdk-go-v2/service/sts v1.44.1 h1:RvfHDg+xvAeZ+5741vUEjpOVtYSIm93W2zhx10Xtydw= github.com/aws/aws-sdk-go-v2/service/sts v1.44.1/go.mod h1:9gdl4RrflIdpDb2TlXshWgR1F9TeCkvqDx77Vpr4Z/Q= -github.com/aws/smithy-go v1.27.3 h1:F3Zb497UhhskkfpJmfkXswyo+t0sh9OTBnIHjogWbVY= -github.com/aws/smithy-go v1.27.3/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc= +github.com/aws/smithy-go v1.27.4 h1:JQcphmBN4f0q/sPqXqROIItRNV/hy10cgu7CsFy616M= +github.com/aws/smithy-go v1.27.4/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d h1:xDfNPAt8lFiC1UJrqV3uuy861HCTo708pDMbjHHdCas= @@ -175,8 +175,8 @@ github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/openai/openai-go/v3 v3.43.0 h1:C+MFVUMU3TJNgES+Ikt7HF8xcX7J0wynKeR9ST22hZM= -github.com/openai/openai-go/v3 v3.43.0/go.mod h1:cdufnVK14cWcT9qA1rRtrXx4FTRsgbDPW7Ia7SS5cZo= +github.com/openai/openai-go/v3 v3.44.0 h1:kkGh+jb/sKfSh5P74Jk5mCRufaQ0q7oH+lq+pNlWjsk= +github.com/openai/openai-go/v3 v3.44.0/go.mod h1:cdufnVK14cWcT9qA1rRtrXx4FTRsgbDPW7Ia7SS5cZo= github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ= github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU= github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= @@ -263,8 +263,8 @@ gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4= gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E= google.golang.org/api v0.288.0 h1:glhO/J88obKP5I269W3hB73dvBKrjU56ZfmNlNXpgTU= google.golang.org/api v0.288.0/go.mod h1:lM2kYRzYUCBY91P9h6VF1PYmvhxii3O5hji37qRvIcY= -google.golang.org/genai v1.63.0 h1:Iryg+4TBco5HaRbwVhAV/ROKVcWiZkuvQzKb4u1QggY= -google.golang.org/genai v1.63.0/go.mod h1:mDdPDFXo1Ats7f1WXVyZgWb/CkMzFWTWJruIMy7hGIU= +google.golang.org/genai v1.64.0 h1:Yb+Y3tL8EIh6LFBibC7xUgxAFb98l34y7byOcBBYNho= +google.golang.org/genai v1.64.0/go.mod h1:mDdPDFXo1Ats7f1WXVyZgWb/CkMzFWTWJruIMy7hGIU= google.golang.org/genproto v0.0.0-20260713224248-f5fc221cf8c4 h1:PWVFocb6Y93aqxY7m9ArHu5zQiLkIrXBLr+ajQxRHH0= google.golang.org/genproto v0.0.0-20260713224248-f5fc221cf8c4/go.mod h1:v47/Kzm6KzB/2uGxuDjGww+7Dk7ny/VFIaIw4WxEtu0= google.golang.org/genproto/googleapis/api v0.0.0-20260713224248-f5fc221cf8c4 h1:lI0NbdWVmT6lOJJNDd7vyeTdfxP/7ouCLSJUKNNXa0k= From d0dac4150f5291a35bdc4f4d10983a1848a7dfee Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 20 Jul 2026 09:26:34 +0000 Subject: [PATCH 054/156] chore(deps): bump github.com/ardanlabs/kronk (#318) Bumps the kronk group with 1 update in the / directory: [github.com/ardanlabs/kronk](https://github.com/ardanlabs/kronk). Updates `github.com/ardanlabs/kronk` from 1.28.7 to 1.29.0 - [Release notes](https://github.com/ardanlabs/kronk/releases) - [Commits](https://github.com/ardanlabs/kronk/compare/v1.28.7...v1.29.0) --- updated-dependencies: - dependency-name: github.com/ardanlabs/kronk dependency-version: 1.29.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: kronk ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 4 ++-- go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index e158ea274..1708080ff 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.26.5 require ( charm.land/x/vcr v0.1.1 cloud.google.com/go/auth v0.22.0 - github.com/ardanlabs/kronk v1.28.7 + github.com/ardanlabs/kronk v1.29.0 github.com/aws/aws-sdk-go-v2 v1.42.1 github.com/aws/aws-sdk-go-v2/config v1.32.30 github.com/aws/smithy-go v1.27.4 @@ -37,7 +37,7 @@ require ( github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.34.0 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.58.0 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.58.0 // indirect - github.com/ardanlabs/jinja v1.4.0 // indirect + github.com/ardanlabs/jinja v1.5.0 // indirect github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.14 // indirect github.com/aws/aws-sdk-go-v2/credentials v1.19.29 // indirect github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.30 // indirect diff --git a/go.sum b/go.sum index 5fb65e6e0..dc5e52e7b 100644 --- a/go.sum +++ b/go.sum @@ -38,10 +38,10 @@ github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0 github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.58.0/go.mod h1:dzcEjy1WJ0Q4u9twNR3LcLhNoYMRCrMCMafpxa0TjPQ= github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.58.0 h1:SBZzZCiPmDrUV7NSCWY54OnKikO/oTydPCvyEyYaDDE= github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.58.0/go.mod h1:YqwkQPrWSC7+byyc1VlKbWLBF5JsW5IoL6xUkemYSXk= -github.com/ardanlabs/jinja v1.4.0 h1:9iE0/wF4zhcws1CYZCWqJTQP8YuhC4FjycBGzCTuOFw= -github.com/ardanlabs/jinja v1.4.0/go.mod h1:aXXzlJfjA+T3XNKA/YT5ZtDq2VJxt5a5siZ8cl9B35Q= -github.com/ardanlabs/kronk v1.28.7 h1:HHEByuL9DjQsaRDS8UXq/D295p73xzDGLBM2pr5+CuE= -github.com/ardanlabs/kronk v1.28.7/go.mod h1:gqLBRpREyPor3n+RMmAeQavg15VBkYrjZjW1oW6DG3o= +github.com/ardanlabs/jinja v1.5.0 h1:OkNpmq9fXiCDRHMLCsd+VO/uk8L/tVwNJE+yA3JAhhM= +github.com/ardanlabs/jinja v1.5.0/go.mod h1:aXXzlJfjA+T3XNKA/YT5ZtDq2VJxt5a5siZ8cl9B35Q= +github.com/ardanlabs/kronk v1.29.0 h1:0oQYfA1ydYH6fWiRyyxg2+p+/7qtjmPkiqvwSces/+g= +github.com/ardanlabs/kronk v1.29.0/go.mod h1:g/Tfn97v/ULKdtjzOJMl1uIUxWh37VEJPyKU3W+vBjc= github.com/aws/aws-sdk-go-v2 v1.42.1 h1:9eOTgu1z/dVtYpNZ3/8/XbbaX0x/BqE3HUzAzs6K0ek= github.com/aws/aws-sdk-go-v2 v1.42.1/go.mod h1:5pKeft2eJj+gElQ38Jqg4ibCqh+/AK33/0X3hip7IjM= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.14 h1:3IZY0XAJquT3aHzbkHfPzy4ACPcEjVG0x87KOwtpqGY= From 33bcef7d6ab4185bec1ede49e5f3cab985f1220f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 27 Jul 2026 09:18:54 +0000 Subject: [PATCH 055/156] chore(deps): bump the all group with 4 updates (#321) Bumps the all group with 4 updates: [github.com/aws/aws-sdk-go-v2](https://github.com/aws/aws-sdk-go-v2), [github.com/aws/aws-sdk-go-v2/config](https://github.com/aws/aws-sdk-go-v2), [github.com/openai/openai-go/v3](https://github.com/openai/openai-go) and [google.golang.org/genai](https://github.com/googleapis/go-genai). Updates `github.com/aws/aws-sdk-go-v2` from 1.42.1 to 1.43.0 - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/v1.42.1...v1.43.0) Updates `github.com/aws/aws-sdk-go-v2/config` from 1.32.30 to 1.32.31 - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/config/v1.32.30...config/v1.32.31) Updates `github.com/openai/openai-go/v3` from 3.44.0 to 3.46.0 - [Release notes](https://github.com/openai/openai-go/releases) - [Changelog](https://github.com/openai/openai-go/blob/main/CHANGELOG.md) - [Commits](https://github.com/openai/openai-go/compare/v3.44.0...v3.46.0) Updates `google.golang.org/genai` from 1.64.0 to 1.65.0 - [Release notes](https://github.com/googleapis/go-genai/releases) - [Changelog](https://github.com/googleapis/go-genai/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/go-genai/compare/v1.64.0...v1.65.0) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2 dependency-version: 1.43.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: all - dependency-name: github.com/aws/aws-sdk-go-v2/config dependency-version: 1.32.31 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all - dependency-name: github.com/openai/openai-go/v3 dependency-version: 3.46.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: all - dependency-name: google.golang.org/genai dependency-version: 1.65.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: all ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 34 +++++++++++++------------- go.sum | 76 +++++++++++++++++++++++++++++----------------------------- 2 files changed, 55 insertions(+), 55 deletions(-) diff --git a/go.mod b/go.mod index 1708080ff..3a039a8c5 100644 --- a/go.mod +++ b/go.mod @@ -6,8 +6,8 @@ require ( charm.land/x/vcr v0.1.1 cloud.google.com/go/auth v0.22.0 github.com/ardanlabs/kronk v1.29.0 - github.com/aws/aws-sdk-go-v2 v1.42.1 - github.com/aws/aws-sdk-go-v2/config v1.32.30 + github.com/aws/aws-sdk-go-v2 v1.43.0 + github.com/aws/aws-sdk-go-v2/config v1.32.31 github.com/aws/smithy-go v1.27.4 github.com/charmbracelet/anthropic-sdk-go v0.0.0-20260223140439-63879b0b8dab github.com/charmbracelet/x/exp/slice v0.0.0-20250904123553-b4e2667e5ad5 @@ -17,11 +17,11 @@ require ( github.com/google/uuid v1.6.0 github.com/joho/godotenv v1.5.1 github.com/kaptinlin/jsonschema v0.9.3 - github.com/openai/openai-go/v3 v3.44.0 + github.com/openai/openai-go/v3 v3.46.0 github.com/stretchr/testify v1.11.1 golang.org/x/net v0.57.0 golang.org/x/oauth2 v0.36.0 - google.golang.org/genai v1.64.0 + google.golang.org/genai v1.65.0 ) require ( @@ -32,27 +32,27 @@ require ( cloud.google.com/go/iam v1.12.0 // indirect cloud.google.com/go/monitoring v1.30.0 // indirect cloud.google.com/go/storage v1.63.1 // indirect - github.com/Azure/azure-sdk-for-go/sdk/azcore v1.17.0 // indirect - github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0 // indirect + github.com/Azure/azure-sdk-for-go/sdk/azcore v1.22.0 // indirect + github.com/Azure/azure-sdk-for-go/sdk/internal v1.12.0 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.34.0 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.58.0 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.58.0 // indirect github.com/ardanlabs/jinja v1.5.0 // indirect github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.14 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.19.29 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.30 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.30 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.30 // indirect - github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.31 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.19.30 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.31 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.31 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.31 // indirect + github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.32 // indirect github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.13 // indirect github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.23 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.30 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.31 // indirect github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.31 // indirect github.com/aws/aws-sdk-go-v2/service/s3 v1.105.1 // indirect - github.com/aws/aws-sdk-go-v2/service/signin v1.4.1 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.32.1 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.37.1 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.44.1 // indirect + github.com/aws/aws-sdk-go-v2/service/signin v1.5.0 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.33.0 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.38.0 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.45.0 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d // indirect github.com/cenkalti/backoff/v5 v5.0.3 // indirect @@ -91,7 +91,7 @@ require ( github.com/prometheus/common v0.70.0 // indirect github.com/prometheus/procfs v0.21.1 // indirect github.com/spiffe/go-spiffe/v2 v2.8.1 // indirect - github.com/tidwall/gjson v1.18.0 // indirect + github.com/tidwall/gjson v1.19.0 // indirect github.com/tidwall/match v1.1.1 // indirect github.com/tidwall/pretty v1.2.1 // indirect github.com/tidwall/sjson v1.2.5 // indirect diff --git a/go.sum b/go.sum index dc5e52e7b..c7e58c27d 100644 --- a/go.sum +++ b/go.sum @@ -22,14 +22,14 @@ cloud.google.com/go/storage v1.63.1 h1:CYXILV9G4CH0C18IQ9+V0h4XiqD2LhKnMLO0o7uJW cloud.google.com/go/storage v1.63.1/go.mod h1:lWyAtwvDZHdL3k68WVKbESP6bmWaV23ZJJ/JEVw/ZaQ= cloud.google.com/go/trace v1.16.0 h1:GmQovzFc5F0CNfl0VLgL64aoTtu7xsM0YajW2GlG9+E= cloud.google.com/go/trace v1.16.0/go.mod h1:r+bdAn16dKLSV1G2D5v3e58IlQlizfxWrUfjx7kM7X0= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.17.0 h1:g0EZJwz7xkXQiZAI5xi9f3WWFYBlX1CPTrR+NDToRkQ= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.17.0/go.mod h1:XCW7KnZet0Opnr7HccfUw1PLc4CjHqpcaxW8DHklNkQ= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.7.0 h1:tfLQ34V6F7tVSwoTf/4lH5sE0o6eCJuNDTmH09nDpbc= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.7.0/go.mod h1:9kIvujWAA58nmPmWB1m23fyWic1kYZMxD9CxaWn4Qpg= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0 h1:ywEEhmNahHBihViHepv3xPBn1663uRv2t2q/ESv9seY= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0/go.mod h1:iZDifYGJTIgIIkYRNWPENUnqx6bJ2xnSDFI2tjwZNuY= -github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2 h1:XHOnouVk1mxXfQidrMEnLlPk9UMeRtyBTnEFtxkV0kU= -github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.22.0 h1:aokoqcHvaGjiM3VpjKDfMMnF/8epJ+Q1HLJ7CudztqE= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.22.0/go.mod h1:/WYEx9pcM9Y+Dd/APJaNlSvVSvzl54rrMdZT5+Oi2LM= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.14.0 h1:CU4+EJeJi3TKYWEcYuSdWsjzw0nVsK/H0MSQOiPcymU= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.14.0/go.mod h1:q0+UTSRvShwUCrR/s5HtyInYphN7Wvxb7snFM3u+SLA= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.12.0 h1:fhqpLE3UEXi9lPaBRpQ6XuRW0nU7hgg4zlmZZa+a9q4= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.12.0/go.mod h1:7dCRMLwisfRH3dBupKeNCioWYUZ4SS09Z14H+7i8ZoY= +github.com/AzureAD/microsoft-authentication-library-for-go v1.7.2 h1:RHK7bS+HQMslb1sZpAokUt+zTVmue0hKSs2C791hhzU= +github.com/AzureAD/microsoft-authentication-library-for-go v1.7.2/go.mod h1:HKpQxkWaGLJ+D/5H8QRpyQXA1eKjxkFlOMwck5+33Jk= github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.34.0 h1:yzIYdwuro811Z27D3T80Wkd3rqZzb0K43nner7Eh1yE= github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.34.0/go.mod h1:pJTkW8hEUIIi3Pf65lPZOnn4Y81yCllX6IWk2jNXdkM= github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.58.0 h1:ZYGajzJNcirVZpT1rltgf9iM+j9zZ4v8V9DrF+xKRJ8= @@ -42,40 +42,40 @@ github.com/ardanlabs/jinja v1.5.0 h1:OkNpmq9fXiCDRHMLCsd+VO/uk8L/tVwNJE+yA3JAhhM github.com/ardanlabs/jinja v1.5.0/go.mod h1:aXXzlJfjA+T3XNKA/YT5ZtDq2VJxt5a5siZ8cl9B35Q= github.com/ardanlabs/kronk v1.29.0 h1:0oQYfA1ydYH6fWiRyyxg2+p+/7qtjmPkiqvwSces/+g= github.com/ardanlabs/kronk v1.29.0/go.mod h1:g/Tfn97v/ULKdtjzOJMl1uIUxWh37VEJPyKU3W+vBjc= -github.com/aws/aws-sdk-go-v2 v1.42.1 h1:9eOTgu1z/dVtYpNZ3/8/XbbaX0x/BqE3HUzAzs6K0ek= -github.com/aws/aws-sdk-go-v2 v1.42.1/go.mod h1:5pKeft2eJj+gElQ38Jqg4ibCqh+/AK33/0X3hip7IjM= +github.com/aws/aws-sdk-go-v2 v1.43.0 h1:fharf/WhbRAVZ1du0QL7roNFxZ6T/sWr+4Ni617bwSI= +github.com/aws/aws-sdk-go-v2 v1.43.0/go.mod h1:5pKeft2eJj+gElQ38Jqg4ibCqh+/AK33/0X3hip7IjM= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.14 h1:3IZY0XAJquT3aHzbkHfPzy4ACPcEjVG0x87KOwtpqGY= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.14/go.mod h1:zwM6veDkhGgQFqkBy+uT28AAYpLu+uFMlPl+rCg/73E= -github.com/aws/aws-sdk-go-v2/config v1.32.30 h1:XwsEzpTJfQYJbFicz/QMLwAZdyeNVVoOEkbF7R3gPJk= -github.com/aws/aws-sdk-go-v2/config v1.32.30/go.mod h1:Ud32SuMc+/9BGxfpSVld7HrE2o05JwKmXY4M3jOQNZU= -github.com/aws/aws-sdk-go-v2/credentials v1.19.29 h1:WHZGssHH887cO0ox07SIQZsFx3MKD4ps6w0xUEmnKYQ= -github.com/aws/aws-sdk-go-v2/credentials v1.19.29/go.mod h1:Mhl0xR6zjguiuj00XRx2wMx22sAltk7oya39sT7fdg8= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.30 h1:/hi1JADLEW9YYryEz1w4GQu0EtP23pP553Cf9KgsDV4= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.30/go.mod h1:/3AOgy4K17Dm4ucMZVC/MJkzy5kmfKUcINRHZyo0koQ= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.30 h1:xM/Is9cKMHa8Jj8zkvWhvrFkZsXJV9E+BB4g0HW0duQ= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.30/go.mod h1:WueJeNDZvK1fMYEWJIkcivBfEzUkTpBhzlrUKKY8EuA= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.30 h1:jn46zC9LdsVR/ZpMIJqMqb8hHv31BlLx3ulVqNspUOk= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.30/go.mod h1:1hTMsAgbdS/AtUi4bw8+gUuh1pceo+eXRLfpSuSQj3M= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.31 h1:3GUprIsfmGcC5SACIyB0e7E0BM1O1b3Erl5CePYIAeQ= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.31/go.mod h1:7PuV1yl5e2xnUbm+RqvVg5i2iBM8EyijZNoI9wsOoOc= +github.com/aws/aws-sdk-go-v2/config v1.32.31 h1:n4nY9O3QKoHIkL85EX+V8RcMFtOhlpTFhGArg915PXk= +github.com/aws/aws-sdk-go-v2/config v1.32.31/go.mod h1:PN0NYDCCoOpGGsZ2+elDUidmHfQBPyYzN2GCgl8HEBs= +github.com/aws/aws-sdk-go-v2/credentials v1.19.30 h1:TTCvvzFU6gXa4iJecNG/0F/B0oYTiazoRECr2XyLHrY= +github.com/aws/aws-sdk-go-v2/credentials v1.19.30/go.mod h1:jKxAp2AEncnliinzpgOSZDFv6+VjvWhjw/AtbfsWT9U= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.31 h1:kfVL5wAunCJycL6MOQ6aNh6PlAYEymflcjuKmrWUA0o= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.31/go.mod h1:nWfRNDAppujCQgOUd43lKT4yeLv9z3nJ3bw1G3BgQKo= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.31 h1:Z8F3hfCY33IGpJjFAnv0wvtv1FIKj1GHmRDEYqy64tw= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.31/go.mod h1:aVyUoytEyOViR6jhq6jula0xkc5NfBE2hgeF6BvOrao= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.31 h1:hyOxUyXdh3AyjE93gBgsfziJag9ACwcs+ZpDBLzi8mw= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.31/go.mod h1:OERqI9k0draSLB8O8woxY3q25ZWTELRK4RRoLMuMZFo= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.32 h1:0MrUL35H/Y4kdFfItoR5jCgtDQ4Z/8LudAoIHRfA4hE= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.32/go.mod h1:2tNZkuWz54arj8mHVf+8Y7cKkcD8Wr/fBpENgEXpjLc= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.13 h1:mbRIur/BiHK6SKPjoBIXSE/hJ6g6JGRLuxQy1jGjlN4= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.13/go.mod h1:ITg9em2KbJx1s0y4aqRX5OYWG6HBZ5TVR//OdpEZ2CQ= github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.23 h1:9Fjh6fi/U5JEStVZijmaMpUwE/gvBJj7x2B/PjbO9To= github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.23/go.mod h1:iMoT2f1tClxrWAAnKCXjZQ6LOmfLrMG14wmnWpM+F14= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.30 h1:/Z5jmNrKsSD7EmDjzAPsm/3L9IuOkzaynklJZ1qX7S4= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.30/go.mod h1:lEzEZnOosE7zi8Z6royW1cFJTD9fpab4Ul1SBrllewk= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.31 h1:w2SIhW92DZPFrSL4ksVCr8IYff5OZwIcxg8+95tzvAI= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.31/go.mod h1:wAhpCQbkov+IcvjozJbd2xRCoZybUEHNkcFunssNACg= github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.31 h1:uao4A3QZ5UmB326V6KF+qRpv9Tjz7IlnlnTbbANntlU= github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.31/go.mod h1:I/1+z0VwL1GhQyLgkoHDlygpUZ+iTAwOQ/NsftiUL2I= github.com/aws/aws-sdk-go-v2/service/s3 v1.105.1 h1:LkBKxAOE5WXjlFuFZqPG1rREnl6I6QCMElcXFDEidos= github.com/aws/aws-sdk-go-v2/service/s3 v1.105.1/go.mod h1:zdmCoFO/dSI7GlrwsPqFJI+WlFnSU4Tc8TJnlXrM1Do= -github.com/aws/aws-sdk-go-v2/service/signin v1.4.1 h1:V7ZZ300WPXGjvkyore5DGe0ljVPOxCXie/thWdtSBXE= -github.com/aws/aws-sdk-go-v2/service/signin v1.4.1/go.mod h1:mxC0nT/C8wMMS97DemZPzvUZxvIt+2Iq+eS3JdFZGgg= -github.com/aws/aws-sdk-go-v2/service/sso v1.32.1 h1:gYFYh4iLLcAOJRLNPY2aD2g9DIhKn4eof8UkIrr1rTk= -github.com/aws/aws-sdk-go-v2/service/sso v1.32.1/go.mod h1:u8af9Nqkmqnr96f7v9nHqzZT9XBwbXEkTiqT4ROuJSE= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.37.1 h1:arjT9Cm3/WYbGmD5TUZHk4UQn4Lle1fUNZs5FC6CtF0= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.37.1/go.mod h1:DMPWJBjYs6+3+f/qhBFEFPPlQ6NlhWjai3dJNvipJ84= -github.com/aws/aws-sdk-go-v2/service/sts v1.44.1 h1:RvfHDg+xvAeZ+5741vUEjpOVtYSIm93W2zhx10Xtydw= -github.com/aws/aws-sdk-go-v2/service/sts v1.44.1/go.mod h1:9gdl4RrflIdpDb2TlXshWgR1F9TeCkvqDx77Vpr4Z/Q= +github.com/aws/aws-sdk-go-v2/service/signin v1.5.0 h1:OHH5iTQvVGmfHjX/5Q+vFuA/Rf2x6/95aJ/75QCQSm4= +github.com/aws/aws-sdk-go-v2/service/signin v1.5.0/go.mod h1:mCF3AK9PpL49oOrhniUXWAfhVBVQ/XbytoE5eccZUIs= +github.com/aws/aws-sdk-go-v2/service/sso v1.33.0 h1:CaJyYhxBE0M/HJX/YvSaSmQlsI91VHB0lKU8LtLxL3A= +github.com/aws/aws-sdk-go-v2/service/sso v1.33.0/go.mod h1:+e6BMRMPjBQoCw/WovYR9GLy2IU0z4Q77smOB1DraSg= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.38.0 h1:tC323YV77QdafeBr6LUhLDTsboyuyHLNRwAyCP44kGU= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.38.0/go.mod h1:SfLK1sgviHmbI+MozR9iDwDjL4cdCVZtahsjoR+z7wg= +github.com/aws/aws-sdk-go-v2/service/sts v1.45.0 h1:Pd6PNlp4t8PTXxqzstICl52Wsy78vpjFZ7PRUj44mJc= +github.com/aws/aws-sdk-go-v2/service/sts v1.45.0/go.mod h1:rmQ0TnHzuLPmabgjPcsywhsSOmaBDgzR4zvDxSPsGdg= github.com/aws/smithy-go v1.27.4 h1:JQcphmBN4f0q/sPqXqROIItRNV/hy10cgu7CsFy616M= github.com/aws/smithy-go v1.27.4/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= @@ -175,8 +175,8 @@ github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/openai/openai-go/v3 v3.44.0 h1:kkGh+jb/sKfSh5P74Jk5mCRufaQ0q7oH+lq+pNlWjsk= -github.com/openai/openai-go/v3 v3.44.0/go.mod h1:cdufnVK14cWcT9qA1rRtrXx4FTRsgbDPW7Ia7SS5cZo= +github.com/openai/openai-go/v3 v3.46.0 h1:9HzL4DOybwOHAAcsGpMQyELuw0e9OqynJOPV8SH8g5M= +github.com/openai/openai-go/v3 v3.46.0/go.mod h1:b8MgNMpR3lPifYnaOH8XwcG8qRHwhzZxuDgM9lL7h5k= github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ= github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU= github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= @@ -198,8 +198,8 @@ github.com/spiffe/go-spiffe/v2 v2.8.1/go.mod h1:47Q0Q9/AqGha8QLHp+kxpH4Wca7X7EnO github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= github.com/tidwall/gjson v1.14.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= -github.com/tidwall/gjson v1.18.0 h1:FIDeeyB800efLX89e5a8Y0BNH+LOngJyGrIWxG2FKQY= -github.com/tidwall/gjson v1.18.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/gjson v1.19.0 h1:xwxm7n691Uf3u5OFjzngavjGTh55KX5q/9w9xHW88JU= +github.com/tidwall/gjson v1.19.0/go.mod h1:V37/opeE/JbLUOfH0QTXiNez2l0RUjYUhpT4szFQAfc= github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= @@ -263,8 +263,8 @@ gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4= gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E= google.golang.org/api v0.288.0 h1:glhO/J88obKP5I269W3hB73dvBKrjU56ZfmNlNXpgTU= google.golang.org/api v0.288.0/go.mod h1:lM2kYRzYUCBY91P9h6VF1PYmvhxii3O5hji37qRvIcY= -google.golang.org/genai v1.64.0 h1:Yb+Y3tL8EIh6LFBibC7xUgxAFb98l34y7byOcBBYNho= -google.golang.org/genai v1.64.0/go.mod h1:mDdPDFXo1Ats7f1WXVyZgWb/CkMzFWTWJruIMy7hGIU= +google.golang.org/genai v1.65.0 h1:6QK3Rjsx0iuJjbDCE1vf1VUr1IEjRDpvexGGnhxoAIk= +google.golang.org/genai v1.65.0/go.mod h1:mDdPDFXo1Ats7f1WXVyZgWb/CkMzFWTWJruIMy7hGIU= google.golang.org/genproto v0.0.0-20260713224248-f5fc221cf8c4 h1:PWVFocb6Y93aqxY7m9ArHu5zQiLkIrXBLr+ajQxRHH0= google.golang.org/genproto v0.0.0-20260713224248-f5fc221cf8c4/go.mod h1:v47/Kzm6KzB/2uGxuDjGww+7Dk7ny/VFIaIw4WxEtu0= google.golang.org/genproto/googleapis/api v0.0.0-20260713224248-f5fc221cf8c4 h1:lI0NbdWVmT6lOJJNDd7vyeTdfxP/7ouCLSJUKNNXa0k= From 7f72ca685c496d25f5dc6be39d834f61c117cfb4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 27 Jul 2026 09:24:47 +0000 Subject: [PATCH 056/156] chore(deps): bump github.com/ardanlabs/kronk (#322) Bumps the kronk group with 1 update in the / directory: [github.com/ardanlabs/kronk](https://github.com/ardanlabs/kronk). Updates `github.com/ardanlabs/kronk` from 1.29.0 to 1.29.3 - [Release notes](https://github.com/ardanlabs/kronk/releases) - [Commits](https://github.com/ardanlabs/kronk/compare/v1.29.0...v1.29.3) --- updated-dependencies: - dependency-name: github.com/ardanlabs/kronk dependency-version: 1.29.3 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: kronk ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 44 +++++++++++++-------------- go.sum | 96 +++++++++++++++++++++++++++++----------------------------- 2 files changed, 70 insertions(+), 70 deletions(-) diff --git a/go.mod b/go.mod index 3a039a8c5..93bf783ef 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.26.5 require ( charm.land/x/vcr v0.1.1 cloud.google.com/go/auth v0.22.0 - github.com/ardanlabs/kronk v1.29.0 + github.com/ardanlabs/kronk v1.29.3 github.com/aws/aws-sdk-go-v2 v1.43.0 github.com/aws/aws-sdk-go-v2/config v1.32.31 github.com/aws/smithy-go v1.27.4 @@ -31,12 +31,12 @@ require ( cloud.google.com/go/compute/metadata v0.9.0 // indirect cloud.google.com/go/iam v1.12.0 // indirect cloud.google.com/go/monitoring v1.30.0 // indirect - cloud.google.com/go/storage v1.63.1 // indirect + cloud.google.com/go/storage v1.64.0 // indirect github.com/Azure/azure-sdk-for-go/sdk/azcore v1.22.0 // indirect github.com/Azure/azure-sdk-for-go/sdk/internal v1.12.0 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.34.0 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.58.0 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.58.0 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.35.0 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.59.0 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.59.0 // indirect github.com/ardanlabs/jinja v1.5.0 // indirect github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.14 // indirect github.com/aws/aws-sdk-go-v2/credentials v1.19.30 // indirect @@ -45,10 +45,10 @@ require ( github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.31 // indirect github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.32 // indirect github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.13 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.23 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.24 // indirect github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.31 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.31 // indirect - github.com/aws/aws-sdk-go-v2/service/s3 v1.105.1 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.32 // indirect + github.com/aws/aws-sdk-go-v2/service/s3 v1.106.0 // indirect github.com/aws/aws-sdk-go-v2/service/signin v1.5.0 // indirect github.com/aws/aws-sdk-go-v2/service/sso v1.33.0 // indirect github.com/aws/aws-sdk-go-v2/service/ssooidc v1.38.0 // indirect @@ -59,18 +59,18 @@ require ( github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/cncf/xds/go v0.0.0-20260202195803-dba9d589def2 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect - github.com/ebitengine/purego v0.10.1 // indirect + github.com/ebitengine/purego v0.10.2 // indirect github.com/envoyproxy/go-control-plane/envoy v1.37.0 // indirect github.com/envoyproxy/protoc-gen-validate v1.3.3 // indirect github.com/felixge/httpsnoop v1.1.0 // indirect github.com/go-jose/go-jose/v4 v4.1.4 // indirect github.com/go-json-experiment/json v0.0.0-20260623181947-01eb4420fa68 // indirect - github.com/go-logr/logr v1.4.3 // indirect + github.com/go-logr/logr v1.4.4 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/goccy/go-yaml v1.19.2 // indirect github.com/google/go-cmp v0.7.0 // indirect github.com/google/s2a-go v0.1.9 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.3.18 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.3.19 // indirect github.com/googleapis/gax-go/v2 v2.23.0 // indirect github.com/gorilla/websocket v1.5.3 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.29.0 // indirect @@ -78,24 +78,24 @@ require ( github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-getter v1.8.6 // indirect github.com/hashicorp/go-version v1.9.0 // indirect - github.com/hybridgroup/yzma v1.19.0 // indirect + github.com/hybridgroup/yzma v1.20.0 // indirect github.com/jupiterrider/ffi v0.7.0 // indirect github.com/kaptinlin/jsonpointer v0.4.27 // indirect - github.com/klauspost/compress v1.19.0 // indirect + github.com/klauspost/compress v1.19.1 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect - github.com/prometheus/client_golang v1.23.2 // indirect + github.com/prometheus/client_golang v1.24.1 // indirect github.com/prometheus/client_model v0.6.2 // indirect - github.com/prometheus/common v0.70.0 // indirect + github.com/prometheus/common v0.70.1 // indirect github.com/prometheus/procfs v0.21.1 // indirect github.com/spiffe/go-spiffe/v2 v2.8.1 // indirect github.com/tidwall/gjson v1.19.0 // indirect github.com/tidwall/match v1.1.1 // indirect github.com/tidwall/pretty v1.2.1 // indirect github.com/tidwall/sjson v1.2.5 // indirect - github.com/ulikunitz/xz v0.5.15 // indirect + github.com/ulikunitz/xz v0.5.16 // indirect go.opentelemetry.io/auto/sdk v1.2.1 // indirect go.opentelemetry.io/contrib/detectors/gcp v1.44.0 // indirect go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.69.0 // indirect @@ -107,7 +107,7 @@ require ( go.opentelemetry.io/otel/sdk v1.44.0 // indirect go.opentelemetry.io/otel/sdk/metric v1.44.0 // indirect go.opentelemetry.io/otel/trace v1.44.0 // indirect - go.opentelemetry.io/proto/otlp v1.10.0 // indirect + go.opentelemetry.io/proto/otlp v1.11.0 // indirect go.yaml.in/yaml/v2 v2.4.4 // indirect go.yaml.in/yaml/v4 v4.0.0-rc.3 // indirect golang.org/x/crypto v0.54.0 // indirect @@ -116,11 +116,11 @@ require ( golang.org/x/sys v0.47.0 // indirect golang.org/x/text v0.40.0 // indirect golang.org/x/time v0.15.0 // indirect - google.golang.org/api v0.288.0 // indirect - google.golang.org/genproto v0.0.0-20260713224248-f5fc221cf8c4 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20260713224248-f5fc221cf8c4 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20260713224248-f5fc221cf8c4 // indirect - google.golang.org/grpc v1.82.0 // indirect + google.golang.org/api v0.290.0 // indirect + google.golang.org/genproto v0.0.0-20260724162435-b2f20204f0df // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20260724162435-b2f20204f0df // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20260724162435-b2f20204f0df // indirect + google.golang.org/grpc v1.82.1 // indirect google.golang.org/protobuf v1.36.11 // indirect gopkg.in/dnaeon/go-vcr.v4 v4.0.6-0.20251110073552-01de4eb40290 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/go.sum b/go.sum index c7e58c27d..17d555a22 100644 --- a/go.sum +++ b/go.sum @@ -12,14 +12,14 @@ cloud.google.com/go/compute/metadata v0.9.0 h1:pDUj4QMoPejqq20dK0Pg2N4yG9zIkYGdB cloud.google.com/go/compute/metadata v0.9.0/go.mod h1:E0bWwX5wTnLPedCKqk3pJmVgCBSM6qQI1yTBdEb3C10= cloud.google.com/go/iam v1.12.0 h1:Aki3bX9aHUDKPHfnRJfDcTdVedvy6quGBQcTqx3DRXk= cloud.google.com/go/iam v1.12.0/go.mod h1:FEZ4lXpADAC2AIpQY7LANNjjwyQ2jK439CI2VaD+sLY= -cloud.google.com/go/logging v1.18.0 h1:KhzZq+1cSkPH9YUaKLLhLtQxIHitVayBmk0sGfoM9+k= -cloud.google.com/go/logging v1.18.0/go.mod h1:ZGKnpBaURITh+g/uom2VhbiFoFWvejcrHPDhxFtU/gI= +cloud.google.com/go/logging v1.19.0 h1:NCqhdVUg3wQ8Cobdf16FDSuTGi3+6+hdSBHrY5TsR6Q= +cloud.google.com/go/logging v1.19.0/go.mod h1:i40NZCHC9Gqvod4yE+yQfDWwlgwW/SrshkkGibCHxcA= cloud.google.com/go/longrunning v1.2.0 h1:WjYH3YHBGCxGJP9M4dWGHBfXr/cFIjMkNgWcJj7/iMM= cloud.google.com/go/longrunning v1.2.0/go.mod h1:5KMQALFGOCtFoi2xSOA1u3H7WKlhmckgiyFw7+LGQp0= cloud.google.com/go/monitoring v1.30.0 h1:r/d+JUbyKmJ8b07iznuKfzVzrIXTWxHQ3lBRm3x2LlY= cloud.google.com/go/monitoring v1.30.0/go.mod h1:htlUR0QWVMrjFzZmN4LGnMAve9xB/eduwjmINxVZ8RM= -cloud.google.com/go/storage v1.63.1 h1:CYXILV9G4CH0C18IQ9+V0h4XiqD2LhKnMLO0o7uJWNs= -cloud.google.com/go/storage v1.63.1/go.mod h1:lWyAtwvDZHdL3k68WVKbESP6bmWaV23ZJJ/JEVw/ZaQ= +cloud.google.com/go/storage v1.64.0 h1:KLpxI/oX9LxeRsNqn877d2WyeT3ryiEwnGt8pwcSPZg= +cloud.google.com/go/storage v1.64.0/go.mod h1:lWyAtwvDZHdL3k68WVKbESP6bmWaV23ZJJ/JEVw/ZaQ= cloud.google.com/go/trace v1.16.0 h1:GmQovzFc5F0CNfl0VLgL64aoTtu7xsM0YajW2GlG9+E= cloud.google.com/go/trace v1.16.0/go.mod h1:r+bdAn16dKLSV1G2D5v3e58IlQlizfxWrUfjx7kM7X0= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.22.0 h1:aokoqcHvaGjiM3VpjKDfMMnF/8epJ+Q1HLJ7CudztqE= @@ -30,18 +30,18 @@ github.com/Azure/azure-sdk-for-go/sdk/internal v1.12.0 h1:fhqpLE3UEXi9lPaBRpQ6Xu github.com/Azure/azure-sdk-for-go/sdk/internal v1.12.0/go.mod h1:7dCRMLwisfRH3dBupKeNCioWYUZ4SS09Z14H+7i8ZoY= github.com/AzureAD/microsoft-authentication-library-for-go v1.7.2 h1:RHK7bS+HQMslb1sZpAokUt+zTVmue0hKSs2C791hhzU= github.com/AzureAD/microsoft-authentication-library-for-go v1.7.2/go.mod h1:HKpQxkWaGLJ+D/5H8QRpyQXA1eKjxkFlOMwck5+33Jk= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.34.0 h1:yzIYdwuro811Z27D3T80Wkd3rqZzb0K43nner7Eh1yE= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.34.0/go.mod h1:pJTkW8hEUIIi3Pf65lPZOnn4Y81yCllX6IWk2jNXdkM= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.58.0 h1:ZYGajzJNcirVZpT1rltgf9iM+j9zZ4v8V9DrF+xKRJ8= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.58.0/go.mod h1:PDQyYBOzGtQgvshQI//UiXyzuMHCz0ndyu+4W8X82vM= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.58.0 h1:IBF8BbhKJkMsON/eY+LMu3aF3XMiotCb9KvkUmEkOJo= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.58.0/go.mod h1:dzcEjy1WJ0Q4u9twNR3LcLhNoYMRCrMCMafpxa0TjPQ= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.58.0 h1:SBZzZCiPmDrUV7NSCWY54OnKikO/oTydPCvyEyYaDDE= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.58.0/go.mod h1:YqwkQPrWSC7+byyc1VlKbWLBF5JsW5IoL6xUkemYSXk= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.35.0 h1:bN1gA3of5bXtbnLsRPrwfmbbe7A5UWFlcTHseujLnpc= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.35.0/go.mod h1:Yj5vHEz/aAepZGliRJsA6uvHAVAQyEwajq9ORCHPxzM= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.59.0 h1:c/Ivw7FuawPLfrr+zB0LZKeCchO2cAHQpF2qZ6OV7rQ= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.59.0/go.mod h1:Zba7lknY/d78oxbKqFTmCsaGwfpzeJ3ktrrLXtnTV6g= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.59.0 h1:xTXsqDOj5k9mK3VVWHYUryryJCIdYfXxdjKFwpzINUw= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.59.0/go.mod h1:V9g30lTKzfUsEW+gpWssck6u9IhARajmipodImLLcwI= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.59.0 h1:18FRm6ZcN/x9+ZmhMr96hLcTtlLn2/gHPuDLVeg7XcY= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.59.0/go.mod h1:YqwkQPrWSC7+byyc1VlKbWLBF5JsW5IoL6xUkemYSXk= github.com/ardanlabs/jinja v1.5.0 h1:OkNpmq9fXiCDRHMLCsd+VO/uk8L/tVwNJE+yA3JAhhM= github.com/ardanlabs/jinja v1.5.0/go.mod h1:aXXzlJfjA+T3XNKA/YT5ZtDq2VJxt5a5siZ8cl9B35Q= -github.com/ardanlabs/kronk v1.29.0 h1:0oQYfA1ydYH6fWiRyyxg2+p+/7qtjmPkiqvwSces/+g= -github.com/ardanlabs/kronk v1.29.0/go.mod h1:g/Tfn97v/ULKdtjzOJMl1uIUxWh37VEJPyKU3W+vBjc= +github.com/ardanlabs/kronk v1.29.3 h1:lRA2wm+YsXff3KtUIfT8Qs2tA5CptyJPApGP4b/6jX8= +github.com/ardanlabs/kronk v1.29.3/go.mod h1:dQ/DYe0cDfirGUfFG7gIRRN90HA5/sO9ZsO0Tq4ZgbA= github.com/aws/aws-sdk-go-v2 v1.43.0 h1:fharf/WhbRAVZ1du0QL7roNFxZ6T/sWr+4Ni617bwSI= github.com/aws/aws-sdk-go-v2 v1.43.0/go.mod h1:5pKeft2eJj+gElQ38Jqg4ibCqh+/AK33/0X3hip7IjM= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.14 h1:3IZY0XAJquT3aHzbkHfPzy4ACPcEjVG0x87KOwtpqGY= @@ -60,14 +60,14 @@ github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.32 h1:0MrUL35H/Y4kdFfItoR5jCgtDQ4 github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.32/go.mod h1:2tNZkuWz54arj8mHVf+8Y7cKkcD8Wr/fBpENgEXpjLc= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.13 h1:mbRIur/BiHK6SKPjoBIXSE/hJ6g6JGRLuxQy1jGjlN4= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.13/go.mod h1:ITg9em2KbJx1s0y4aqRX5OYWG6HBZ5TVR//OdpEZ2CQ= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.23 h1:9Fjh6fi/U5JEStVZijmaMpUwE/gvBJj7x2B/PjbO9To= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.23/go.mod h1:iMoT2f1tClxrWAAnKCXjZQ6LOmfLrMG14wmnWpM+F14= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.24 h1:mdPwDQPqxlw9Sc62Nt15yjEcARaDbPXkjRYtXsUripo= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.24/go.mod h1:ls5ytnwLTcQaUu32fMYXFI3MjpKuTwL840PAm9iqyEg= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.31 h1:w2SIhW92DZPFrSL4ksVCr8IYff5OZwIcxg8+95tzvAI= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.31/go.mod h1:wAhpCQbkov+IcvjozJbd2xRCoZybUEHNkcFunssNACg= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.31 h1:uao4A3QZ5UmB326V6KF+qRpv9Tjz7IlnlnTbbANntlU= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.31/go.mod h1:I/1+z0VwL1GhQyLgkoHDlygpUZ+iTAwOQ/NsftiUL2I= -github.com/aws/aws-sdk-go-v2/service/s3 v1.105.1 h1:LkBKxAOE5WXjlFuFZqPG1rREnl6I6QCMElcXFDEidos= -github.com/aws/aws-sdk-go-v2/service/s3 v1.105.1/go.mod h1:zdmCoFO/dSI7GlrwsPqFJI+WlFnSU4Tc8TJnlXrM1Do= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.32 h1:jWXtZdCnhXa9sGFixRaU2AxT4DIVse9HS4E2f+/KwV0= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.32/go.mod h1:9JS1UpfVvyD/ZPX8GsKb/Pq8scEM+7GP5fqh9SwH7po= +github.com/aws/aws-sdk-go-v2/service/s3 v1.106.0 h1:7QZWVJZWzHivHWIa+5TELLaBBkbuoj0GPwQtMlJ0sqk= +github.com/aws/aws-sdk-go-v2/service/s3 v1.106.0/go.mod h1:fcvq5L7dK+5cQFicEJwpI6e6Wn8NY2i6yT5wRLYVc7s= github.com/aws/aws-sdk-go-v2/service/signin v1.5.0 h1:OHH5iTQvVGmfHjX/5Q+vFuA/Rf2x6/95aJ/75QCQSm4= github.com/aws/aws-sdk-go-v2/service/signin v1.5.0/go.mod h1:mCF3AK9PpL49oOrhniUXWAfhVBVQ/XbytoE5eccZUIs= github.com/aws/aws-sdk-go-v2/service/sso v1.33.0 h1:CaJyYhxBE0M/HJX/YvSaSmQlsI91VHB0lKU8LtLxL3A= @@ -100,8 +100,8 @@ github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1 github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dnaeon/go-vcr v1.2.0 h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI= github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= -github.com/ebitengine/purego v0.10.1 h1:dewVBCBT2GaMu1SrNTYxQhgQBethzfhiwvZiLGP/qyY= -github.com/ebitengine/purego v0.10.1/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/ebitengine/purego v0.10.2 h1:W809HbnvzAxgdm+aOvlSekrM16wGCdT/e76+9tS7gzE= +github.com/ebitengine/purego v0.10.2/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= github.com/envoyproxy/go-control-plane v0.14.0 h1:hbG2kr4RuFj222B6+7T83thSPqLjwBIfQawTkC++2HA= github.com/envoyproxy/go-control-plane v0.14.0/go.mod h1:NcS5X47pLl/hfqxU70yPwL9ZMkUlwlKxtAohpi2wBEU= github.com/envoyproxy/go-control-plane/envoy v1.37.0 h1:u3riX6BoYRfF4Dr7dwSOroNfdSbEPe9Yyl09/B6wBrQ= @@ -117,8 +117,8 @@ github.com/go-jose/go-jose/v4 v4.1.4/go.mod h1:x4oUasVrzR7071A4TnHLGSPpNOm2a21K9 github.com/go-json-experiment/json v0.0.0-20260623181947-01eb4420fa68 h1:KZaTBSyshWX3MP5jukJcNSuXDQTO+rNpt0J564dX/eg= github.com/go-json-experiment/json v0.0.0-20260623181947-01eb4420fa68/go.mod h1:tphK2c80bpPhMOI4v6bIc2xWywPfbqi1Z06+RcrMkDg= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= -github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.4 h1:tG4xh9yMsRCAiodLVTxyrkzSZ9+o0L1Kg/+cPVcbP/8= +github.com/go-logr/logr v1.4.4/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-viper/mapstructure/v2 v2.5.0 h1:vM5IJoUAy3d7zRSVtIwQgBj7BiWtMPfmPEgAXnvj1Ro= @@ -137,8 +137,8 @@ github.com/google/s2a-go v0.1.9 h1:LGD7gtMgezd8a/Xak7mEWL0PjoTQFvpRudN895yqKW0= github.com/google/s2a-go v0.1.9/go.mod h1:YA0Ei2ZQL3acow2O62kdp9UlnvMmU7kA6Eutn0dXayM= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.3.18 h1:hvVi34VucdrV1IIsiWuqYM8kutw/92MxNEFxCJZEh0k= -github.com/googleapis/enterprise-certificate-proxy v0.3.18/go.mod h1:rSEsBUemEBZEexP2y6jPp16LUmUbjmSbcPMQizR0o4k= +github.com/googleapis/enterprise-certificate-proxy v0.3.19 h1:mMOE7DN2+p76/EdIrmAy9B9bH+yC4563vmnJ34QR8i4= +github.com/googleapis/enterprise-certificate-proxy v0.3.19/go.mod h1:rSEsBUemEBZEexP2y6jPp16LUmUbjmSbcPMQizR0o4k= github.com/googleapis/gax-go/v2 v2.23.0 h1:Tchl7qkvE7Ip3y+ztvNufYFvkfqTe7NfLTYGIdJRLuE= github.com/googleapis/gax-go/v2 v2.23.0/go.mod h1:rBQKOVJCdb8IFEzg+FCwlt1LP/xMDGuqUXhUG+XMXEg= github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= @@ -153,8 +153,8 @@ github.com/hashicorp/go-getter v1.8.6 h1:9sQboWULaydVphxc4S64oAI4YqpuCk7nPmvbk13 github.com/hashicorp/go-getter v1.8.6/go.mod h1:nVH12eOV2P58dIiL3rsU6Fh3wLeJEKBOJzhMmzlSWoo= github.com/hashicorp/go-version v1.9.0 h1:CeOIz6k+LoN3qX9Z0tyQrPtiB1DFYRPfCIBtaXPSCnA= github.com/hashicorp/go-version v1.9.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hybridgroup/yzma v1.19.0 h1:L3L5ryeJ5dt6yku0oRgcO/VNJdO2ObPkpCebd8S69o4= -github.com/hybridgroup/yzma v1.19.0/go.mod h1:DAsHYcX7ze7iFZH6PT57oCuqaVd/AXdALhjnOSgWbaE= +github.com/hybridgroup/yzma v1.20.0 h1:pv94eHUGshHnimaOtRTgaLz3GvpjX5wA9xJdA3yHqWA= +github.com/hybridgroup/yzma v1.20.0/go.mod h1:wAMtNTjSnE79jTWzaeFSsuraam0TXKCPajMHA5s+OX8= github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= github.com/jupiterrider/ffi v0.7.0 h1:RKsl6Ascal+3kyAqR5Qcbp83LceQMLc1VZbPfHWoNzs= @@ -163,8 +163,8 @@ github.com/kaptinlin/jsonpointer v0.4.27 h1:5FOnhlkqQ4/lvHudaAWS8HJCXjN4yAHSIGl7 github.com/kaptinlin/jsonpointer v0.4.27/go.mod h1:dfub/n58cWS32Dyf3AZsnKblSAgrz9PyOU76GDPpx8Q= github.com/kaptinlin/jsonschema v0.9.3 h1:uDVd3w4aXwO0tbycblKYvFofhl3hVuE31vOl5JkDXI0= github.com/kaptinlin/jsonschema v0.9.3/go.mod h1:LvtQ/mO0E1e/3c3DiOWTj05LTeot8cTv7DyQq7eJMQg= -github.com/klauspost/compress v1.19.0 h1:sXLILfc9jV2QYWkzFOPWStmcUVH2RHEB1JCdY2oVvCQ= -github.com/klauspost/compress v1.19.0/go.mod h1:cwPg85FWrGar70rWktvGQj8/hthj3wpl0PGDogxkrSQ= +github.com/klauspost/compress v1.19.1 h1:VsB4HPswih7mmZ8WleSFQ75c/Ui1M4trX5oAsJnhSlk= +github.com/klauspost/compress v1.19.1/go.mod h1:cwPg85FWrGar70rWktvGQj8/hthj3wpl0PGDogxkrSQ= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -183,12 +183,12 @@ github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgm github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.23.2 h1:Je96obch5RDVy3FDMndoUsjAhG5Edi49h0RJWRi/o0o= -github.com/prometheus/client_golang v1.23.2/go.mod h1:Tb1a6LWHB3/SPIzCoaDXI4I8UHKeFTEQ1YCr+0Gyqmg= +github.com/prometheus/client_golang v1.24.1 h1:JnJkREXzWxUdCuPFpIWZiPispT9xVV59uiuyR2bPlnU= +github.com/prometheus/client_golang v1.24.1/go.mod h1:F+oSRECHg4sse5ucfYpYDeIv/hu68Zo0uoHKetWnzcE= github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= -github.com/prometheus/common v0.70.0 h1:bcpru3tWPVnxGnETLgOV5jbp/JRXgYEyv65CuBLAMMI= -github.com/prometheus/common v0.70.0/go.mod h1:S/SFasQmgGiYH6C81LKCtYa8QACgthGg5zxL2udV7SY= +github.com/prometheus/common v0.70.1 h1:1HvjP4D5oL3t8RsPlwxA9onvvStjtIHYE5XuuwOi/PY= +github.com/prometheus/common v0.70.1/go.mod h1:VdFUQDMZK3VLkurFUVhia6uys/0suUp86TJz5qbJRhc= github.com/prometheus/procfs v0.21.1 h1:GljZCt+zSTS+NZq88cyQ1LjZ+RCHp3uVuabBWA5+OJI= github.com/prometheus/procfs v0.21.1/go.mod h1:aB55Cww9pdSJVHk0hUf0inxWyyjPogFIjmHKYgMKmtY= github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= @@ -207,8 +207,8 @@ github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4= github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY= github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28= -github.com/ulikunitz/xz v0.5.15 h1:9DNdB5s+SgV3bQ2ApL10xRc35ck0DuIX/isZvIk+ubY= -github.com/ulikunitz/xz v0.5.15/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= +github.com/ulikunitz/xz v0.5.16 h1:ld6NyySjx5lowVKwJvMRLnW5nxKX/xnpSiFYZ/Lxur0= +github.com/ulikunitz/xz v0.5.16/go.mod h1:H9Rt/W6/Qj27PGauhQc6nfCDy7vHpzsOThBSaYDoEhw= go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= go.opentelemetry.io/contrib/detectors/gcp v1.44.0 h1:NmLfL734pJhM0JKaYd2Y28+nY9dPRWYAAbxhRCrKXPw= @@ -235,8 +235,8 @@ go.opentelemetry.io/otel/sdk/metric v1.44.0 h1:3LlKgI+VjbVsjNRFZJZAJ30WjXC5VkNRk go.opentelemetry.io/otel/sdk/metric v1.44.0/go.mod h1:5B5pMARnXxKhltooO4xUuCBorl65a4EpnTalObqOigA= go.opentelemetry.io/otel/trace v1.44.0 h1:jxF5CsGYCe74MCRx2X4g7WsY/VBKRqqpNvXlX/6gtIk= go.opentelemetry.io/otel/trace v1.44.0/go.mod h1:oLl1jrMQAVo6v3GAggN+1VH9VIz9iUSvW53sW1Q8PIE= -go.opentelemetry.io/proto/otlp v1.10.0 h1:IQRWgT5srOCYfiWnpqUYz9CVmbO8bFmKcwYxpuCSL2g= -go.opentelemetry.io/proto/otlp v1.10.0/go.mod h1:/CV4QoCR/S9yaPj8utp3lvQPoqMtxXdzn7ozvvozVqk= +go.opentelemetry.io/proto/otlp v1.11.0 h1:5rrYs0Ykyj50sdU/JU0x8etU+LubXWb+gED6TbEdMIk= +go.opentelemetry.io/proto/otlp v1.11.0/go.mod h1:SmVizdCOAm3XBtG1g1NnOdhW6jtddT72hLMhv8VwA8E= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.yaml.in/yaml/v2 v2.4.4 h1:tuyd0P+2Ont/d6e2rl3be67goVK4R6deVxCUX5vyPaQ= @@ -261,18 +261,18 @@ golang.org/x/time v0.15.0 h1:bbrp8t3bGUeFOx08pvsMYRTCVSMk89u4tKbNOZbp88U= golang.org/x/time v0.15.0/go.mod h1:Y4YMaQmXwGQZoFaVFk4YpCt4FLQMYKZe9oeV/f4MSno= gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4= gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E= -google.golang.org/api v0.288.0 h1:glhO/J88obKP5I269W3hB73dvBKrjU56ZfmNlNXpgTU= -google.golang.org/api v0.288.0/go.mod h1:lM2kYRzYUCBY91P9h6VF1PYmvhxii3O5hji37qRvIcY= +google.golang.org/api v0.290.0 h1:eMw0Xo+IfbbMlKmW7aHvpyQRv9RCXuWx/vs8AD+0x9A= +google.golang.org/api v0.290.0/go.mod h1:weJZ3lldHFYI0DBFNKpJelUDNnusTt5YaOEgxvt8ci8= google.golang.org/genai v1.65.0 h1:6QK3Rjsx0iuJjbDCE1vf1VUr1IEjRDpvexGGnhxoAIk= google.golang.org/genai v1.65.0/go.mod h1:mDdPDFXo1Ats7f1WXVyZgWb/CkMzFWTWJruIMy7hGIU= -google.golang.org/genproto v0.0.0-20260713224248-f5fc221cf8c4 h1:PWVFocb6Y93aqxY7m9ArHu5zQiLkIrXBLr+ajQxRHH0= -google.golang.org/genproto v0.0.0-20260713224248-f5fc221cf8c4/go.mod h1:v47/Kzm6KzB/2uGxuDjGww+7Dk7ny/VFIaIw4WxEtu0= -google.golang.org/genproto/googleapis/api v0.0.0-20260713224248-f5fc221cf8c4 h1:lI0NbdWVmT6lOJJNDd7vyeTdfxP/7ouCLSJUKNNXa0k= -google.golang.org/genproto/googleapis/api v0.0.0-20260713224248-f5fc221cf8c4/go.mod h1:WRrQ7/7N19PypuT0fxLOL5Lq0waoiRri4FbtHDEKrGE= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260713224248-f5fc221cf8c4 h1:7RtFDizMtT9eZzHzKxifoMGfcDBBy+LYZlgfg24ZmOM= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260713224248-f5fc221cf8c4/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= -google.golang.org/grpc v1.82.0 h1:vguDnZUPjE26w09A63VoxZPnvPjB5Riyc0mkXPFmAIU= -google.golang.org/grpc v1.82.0/go.mod h1:yzTZ1TB1Z3SG+LIYaI+WiE8D5+PZ3ArnrSp8zF3+/ZA= +google.golang.org/genproto v0.0.0-20260724162435-b2f20204f0df h1:A7u56ilVtWR3CySHErsWAsimNwD4FoX9KWd8SUCn6vc= +google.golang.org/genproto v0.0.0-20260724162435-b2f20204f0df/go.mod h1:4RPHZcXMGptb7aRZb+M43xI7ixmjEtASEf2VtOOBZbU= +google.golang.org/genproto/googleapis/api v0.0.0-20260724162435-b2f20204f0df h1:NsJx+hCSwIBI6+C4BuJIkb8xOG1M+nfQDsqIrQHT92k= +google.golang.org/genproto/googleapis/api v0.0.0-20260724162435-b2f20204f0df/go.mod h1:1brfde68Npq6+WA75c1EHWPijZEG1kMus61ygPZfn4A= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260724162435-b2f20204f0df h1:O3ig1i5WDDzsVzRp+cCdgelT9vXnlnOFdlEeFtL4HCc= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260724162435-b2f20204f0df/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= +google.golang.org/grpc v1.82.1 h1:NnAxzGRA0677vCa4BUkOAnO5+FfQqVl9iUXeD0IqcGE= +google.golang.org/grpc v1.82.1/go.mod h1:yzTZ1TB1Z3SG+LIYaI+WiE8D5+PZ3ArnrSp8zF3+/ZA= google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= From 070e912ecd3ae49fec6863bda68a0c94e1645d5b Mon Sep 17 00:00:00 2001 From: Sven Date: Wed, 29 Jul 2026 06:49:02 -0700 Subject: [PATCH 057/156] fix(anthropic): map refusal and context-window stop reasons (#316) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The Anthropic API can end a response with stop_reason "refusal" (safety classifier intervention) or "model_context_window_exceeded", but both fell through to FinishReasonUnknown, leaving clients unable to distinguish them from a missing stop reason. Map "refusal" to FinishReasonContentFilter, matching how the OpenAI and Google providers already surface their native content-filter stops, and map "model_context_window_exceeded" to FinishReasonLength alongside "max_tokens". 💘 Generated with Crush Assisted-by: Kimi K3 (max thinking) via Crush --- providers/anthropic/anthropic.go | 4 +++- providers/anthropic/anthropic_test.go | 23 +++++++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/providers/anthropic/anthropic.go b/providers/anthropic/anthropic.go index a1816bd8f..007a4edbf 100644 --- a/providers/anthropic/anthropic.go +++ b/providers/anthropic/anthropic.go @@ -1268,10 +1268,12 @@ func mapFinishReason(finishReason string) fantasy.FinishReason { switch finishReason { case "end_turn", "pause_turn", "stop_sequence": return fantasy.FinishReasonStop - case "max_tokens": + case "max_tokens", "model_context_window_exceeded": return fantasy.FinishReasonLength case "tool_use": return fantasy.FinishReasonToolCalls + case "refusal": + return fantasy.FinishReasonContentFilter default: return fantasy.FinishReasonUnknown } diff --git a/providers/anthropic/anthropic_test.go b/providers/anthropic/anthropic_test.go index 2ee0cfe70..c4854be99 100644 --- a/providers/anthropic/anthropic_test.go +++ b/providers/anthropic/anthropic_test.go @@ -3237,3 +3237,26 @@ func TestStream_TruncatedWithoutStopReason(t *testing.T) { require.True(t, providerErr.IsRetryable()) require.ErrorIs(t, providerErr.Cause, io.ErrUnexpectedEOF) } + +func TestMapFinishReason(t *testing.T) { + t.Parallel() + + tests := []struct { + reason string + expected fantasy.FinishReason + }{ + {"end_turn", fantasy.FinishReasonStop}, + {"pause_turn", fantasy.FinishReasonStop}, + {"stop_sequence", fantasy.FinishReasonStop}, + {"max_tokens", fantasy.FinishReasonLength}, + {"model_context_window_exceeded", fantasy.FinishReasonLength}, + {"tool_use", fantasy.FinishReasonToolCalls}, + {"refusal", fantasy.FinishReasonContentFilter}, + {"", fantasy.FinishReasonUnknown}, + {"unrecognized_future_reason", fantasy.FinishReasonUnknown}, + } + + for _, tc := range tests { + require.Equal(t, tc.expected, mapFinishReason(tc.reason), "stop_reason %q", tc.reason) + } +} From 02c02ef45181fff1a9fc1759af934a2d87ed67c2 Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Wed, 29 Jul 2026 10:59:24 -0300 Subject: [PATCH 058/156] v0.38.2 --- version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.txt b/version.txt index bb22182d4..f2e78d495 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -0.38.1 +0.38.2 From 0d01548f623a68acda0d2dbe3921799d981fccad Mon Sep 17 00:00:00 2001 From: carsonfarmer Date: Wed, 29 Jul 2026 12:34:22 -0700 Subject: [PATCH 059/156] feat: add ClientMetadata to ToolResultPart (#258) --- agent.go | 1 + agent_test.go | 7 +++++-- content.go | 1 + content_json.go | 4 ++++ json_test.go | 4 ++++ 5 files changed, 15 insertions(+), 2 deletions(-) diff --git a/agent.go b/agent.go index ba3b53c7e..b86a2727b 100644 --- a/agent.go +++ b/agent.go @@ -715,6 +715,7 @@ func toResponseMessages(content []Content) []Message { Output: result.Result, ProviderExecuted: result.ProviderExecuted, ProviderOptions: ProviderOptions(result.ProviderMetadata), + ClientMetadata: result.ClientMetadata, } if result.ProviderExecuted { // Provider-executed tool results (e.g. web search) diff --git a/agent_test.go b/agent_test.go index 6b626754a..f42008a1a 100644 --- a/agent_test.go +++ b/agent_test.go @@ -2079,8 +2079,9 @@ func TestToResponseMessages_ProviderExecutedRouting(t *testing.T) { }, // Regular tool result. &ToolResultContent{ - ToolCallID: "toolu_02", - Result: ToolResultOutputContentText{Text: "2"}, + ToolCallID: "toolu_02", + Result: ToolResultOutputContentText{Text: "2"}, + ClientMetadata: `{"precision":"high"}`, }, // Some trailing text. &TextContent{Text: "Done."}, @@ -2128,9 +2129,11 @@ func TestToResponseMessages_ProviderExecutedRouting(t *testing.T) { require.Equal(t, MessageRoleTool, toolMsg.Role) require.Len(t, toolMsg.Content, 1) + // Verify regular tool result is in tool message and client metadata survived. tr2, ok := AsMessagePart[ToolResultPart](toolMsg.Content[0]) require.True(t, ok) require.Equal(t, "toolu_02", tr2.ToolCallID) + require.Equal(t, `{"precision":"high"}`, tr2.ClientMetadata) require.False(t, tr2.ProviderExecuted) } diff --git a/content.go b/content.go index f2a122ec4..1318d08c8 100644 --- a/content.go +++ b/content.go @@ -259,6 +259,7 @@ type ToolResultPart struct { Output ToolResultOutputContent `json:"output"` ProviderExecuted bool `json:"provider_executed"` ProviderOptions ProviderOptions `json:"provider_options"` + ClientMetadata string `json:"client_metadata,omitempty"` } // GetType returns the type of the tool result part. diff --git a/content_json.go b/content_json.go index ee1cc8212..8295eea1e 100644 --- a/content_json.go +++ b/content_json.go @@ -715,11 +715,13 @@ func (t ToolResultPart) MarshalJSON() ([]byte, error) { Output ToolResultOutputContent `json:"output"` ProviderExecuted bool `json:"provider_executed"` ProviderOptions ProviderOptions `json:"provider_options,omitempty"` + ClientMetadata string `json:"client_metadata,omitempty"` }{ ToolCallID: t.ToolCallID, Output: t.Output, ProviderExecuted: t.ProviderExecuted, ProviderOptions: t.ProviderOptions, + ClientMetadata: t.ClientMetadata, }) if err != nil { return nil, err @@ -743,6 +745,7 @@ func (t *ToolResultPart) UnmarshalJSON(data []byte) error { Output json.RawMessage `json:"output"` ProviderExecuted bool `json:"provider_executed"` ProviderOptions map[string]json.RawMessage `json:"provider_options,omitempty"` + ClientMetadata string `json:"client_metadata,omitempty"` } if err := json.Unmarshal(mpj.Data, &aux); err != nil { @@ -751,6 +754,7 @@ func (t *ToolResultPart) UnmarshalJSON(data []byte) error { t.ToolCallID = aux.ToolCallID t.ProviderExecuted = aux.ProviderExecuted + t.ClientMetadata = aux.ClientMetadata // Unmarshal the Output field output, err := UnmarshalToolResultOutputContent(aux.Output) diff --git a/json_test.go b/json_test.go index b1088434a..23958d97b 100644 --- a/json_test.go +++ b/json_test.go @@ -80,6 +80,7 @@ func TestMessageJSONSerialization(t *testing.T) { Output: ToolResultOutputContentText{ Text: "The weather is sunny, 72°F", }, + ClientMetadata: `{"units":"imperial"}`, }, }, }, @@ -245,6 +246,9 @@ func compareMessagePart(t *testing.T, index int, original, decoded MessagePart) if orig.ToolCallID != dec.ToolCallID { t.Errorf("content[%d] tool result call id mismatch: got %q, want %q", index, dec.ToolCallID, orig.ToolCallID) } + if orig.ClientMetadata != dec.ClientMetadata { + t.Errorf("content[%d] tool result client metadata mismatch: got %q, want %q", index, dec.ClientMetadata, orig.ClientMetadata) + } compareToolResultOutput(t, index, orig.Output, dec.Output) } } From 435d5506fcc5cc92d2cf4f1f95aad04c500cb8f9 Mon Sep 17 00:00:00 2001 From: William Kennedy Date: Fri, 31 Jul 2026 09:22:02 -0400 Subject: [PATCH 060/156] chore(deps) update kronk to v1.29.9 (#324) --- examples/go.mod | 84 +++++++++++------------ examples/go.sum | 176 ++++++++++++++++++++++++------------------------ go.mod | 52 +++++++------- go.sum | 104 ++++++++++++++-------------- 4 files changed, 208 insertions(+), 208 deletions(-) diff --git a/examples/go.mod b/examples/go.mod index bc4a4bfde..dc159aed4 100644 --- a/examples/go.mod +++ b/examples/go.mod @@ -19,30 +19,30 @@ require ( cloud.google.com/go/compute/metadata v0.9.0 // indirect cloud.google.com/go/iam v1.12.0 // indirect cloud.google.com/go/monitoring v1.30.0 // indirect - cloud.google.com/go/storage v1.63.1 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.34.0 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.58.0 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.58.0 // indirect - github.com/ardanlabs/jinja v1.4.0 // indirect - github.com/ardanlabs/kronk v1.28.7 // indirect - github.com/aws/aws-sdk-go-v2 v1.42.1 // indirect - github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.14 // indirect - github.com/aws/aws-sdk-go-v2/config v1.32.30 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.19.29 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.30 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.30 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.30 // indirect - github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.31 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.13 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.23 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.30 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.31 // indirect - github.com/aws/aws-sdk-go-v2/service/s3 v1.105.1 // indirect - github.com/aws/aws-sdk-go-v2/service/signin v1.4.1 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.32.1 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.37.1 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.44.1 // indirect - github.com/aws/smithy-go v1.27.3 // indirect + cloud.google.com/go/storage v1.64.0 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.35.0 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.59.0 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.59.0 // indirect + github.com/ardanlabs/jinja v1.5.0 // indirect + github.com/ardanlabs/kronk v1.29.9 // indirect + github.com/aws/aws-sdk-go-v2 v1.43.2 // indirect + github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.15 // indirect + github.com/aws/aws-sdk-go-v2/config v1.32.33 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.19.32 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.33 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.33 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.33 // indirect + github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.34 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.14 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.26 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.33 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.34 // indirect + github.com/aws/aws-sdk-go-v2/service/s3 v1.106.2 // indirect + github.com/aws/aws-sdk-go-v2/service/signin v1.5.2 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.33.2 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.38.2 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.45.2 // indirect + github.com/aws/smithy-go v1.27.5 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d // indirect github.com/cenkalti/backoff/v5 v5.0.3 // indirect @@ -55,51 +55,51 @@ require ( github.com/charmbracelet/x/exp/strings v0.1.0 // indirect github.com/charmbracelet/x/json v0.2.0 // indirect github.com/cncf/xds/go v0.0.0-20260202195803-dba9d589def2 // indirect - github.com/ebitengine/purego v0.10.1 // indirect + github.com/ebitengine/purego v0.10.2 // indirect github.com/envoyproxy/go-control-plane/envoy v1.37.0 // indirect github.com/envoyproxy/protoc-gen-validate v1.3.3 // indirect github.com/felixge/httpsnoop v1.1.0 // indirect github.com/go-jose/go-jose/v4 v4.1.4 // indirect github.com/go-json-experiment/json v0.0.0-20260623181947-01eb4420fa68 // indirect github.com/go-logfmt/logfmt v0.6.0 // indirect - github.com/go-logr/logr v1.4.3 // indirect + github.com/go-logr/logr v1.4.4 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-viper/mapstructure/v2 v2.5.0 // indirect github.com/goccy/go-yaml v1.19.2 // indirect github.com/google/go-cmp v0.7.0 // indirect github.com/google/s2a-go v0.1.9 // indirect github.com/google/uuid v1.6.0 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.3.18 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.3.19 // indirect github.com/googleapis/gax-go/v2 v2.23.0 // indirect github.com/gorilla/websocket v1.5.3 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.29.0 // indirect - github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.73 // indirect + github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.74 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-getter v1.8.6 // indirect github.com/hashicorp/go-version v1.9.0 // indirect - github.com/hybridgroup/yzma v1.19.0 // indirect + github.com/hybridgroup/yzma v1.21.0 // indirect github.com/jupiterrider/ffi v0.7.0 // indirect github.com/kaptinlin/jsonpointer v0.4.27 // indirect github.com/kaptinlin/jsonschema v0.9.3 // indirect - github.com/klauspost/compress v1.19.0 // indirect + github.com/klauspost/compress v1.19.1 // indirect github.com/lucasb-eyer/go-colorful v1.3.0 // indirect github.com/mattn/go-runewidth v0.0.17 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/muesli/cancelreader v0.2.2 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect - github.com/openai/openai-go/v3 v3.43.0 // indirect + github.com/openai/openai-go/v3 v3.46.0 // indirect github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect - github.com/prometheus/client_golang v1.23.2 // indirect + github.com/prometheus/client_golang v1.24.1 // indirect github.com/prometheus/client_model v0.6.2 // indirect - github.com/prometheus/common v0.70.0 // indirect + github.com/prometheus/common v0.70.1 // indirect github.com/prometheus/procfs v0.21.1 // indirect github.com/rivo/uniseg v0.4.7 // indirect github.com/spiffe/go-spiffe/v2 v2.8.1 // indirect - github.com/tidwall/gjson v1.18.0 // indirect + github.com/tidwall/gjson v1.19.0 // indirect github.com/tidwall/match v1.1.1 // indirect github.com/tidwall/pretty v1.2.1 // indirect github.com/tidwall/sjson v1.2.5 // indirect - github.com/ulikunitz/xz v0.5.15 // indirect + github.com/ulikunitz/xz v0.5.16 // indirect github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect go.opentelemetry.io/auto/sdk v1.2.1 // indirect go.opentelemetry.io/contrib/detectors/gcp v1.44.0 // indirect @@ -112,7 +112,7 @@ require ( go.opentelemetry.io/otel/sdk v1.44.0 // indirect go.opentelemetry.io/otel/sdk/metric v1.44.0 // indirect go.opentelemetry.io/otel/trace v1.44.0 // indirect - go.opentelemetry.io/proto/otlp v1.10.0 // indirect + go.opentelemetry.io/proto/otlp v1.11.0 // indirect go.yaml.in/yaml/v2 v2.4.4 // indirect golang.org/x/crypto v0.54.0 // indirect golang.org/x/exp v0.0.0-20260312153236-7ab1446f8b90 // indirect @@ -123,11 +123,11 @@ require ( golang.org/x/sys v0.47.0 // indirect golang.org/x/text v0.40.0 // indirect golang.org/x/time v0.15.0 // indirect - google.golang.org/api v0.288.0 // indirect - google.golang.org/genai v1.63.0 // indirect - google.golang.org/genproto v0.0.0-20260713224248-f5fc221cf8c4 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20260713224248-f5fc221cf8c4 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20260713224248-f5fc221cf8c4 // indirect - google.golang.org/grpc v1.82.0 // indirect + google.golang.org/api v0.291.0 // indirect + google.golang.org/genai v1.65.0 // indirect + google.golang.org/genproto v0.0.0-20260729162451-8efbd57d26e0 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20260729162451-8efbd57d26e0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20260729162451-8efbd57d26e0 // indirect + google.golang.org/grpc v1.83.0 // indirect google.golang.org/protobuf v1.36.11 // indirect ) diff --git a/examples/go.sum b/examples/go.sum index 6fd7fbc12..497d05d47 100644 --- a/examples/go.sum +++ b/examples/go.sum @@ -10,64 +10,64 @@ cloud.google.com/go/compute/metadata v0.9.0 h1:pDUj4QMoPejqq20dK0Pg2N4yG9zIkYGdB cloud.google.com/go/compute/metadata v0.9.0/go.mod h1:E0bWwX5wTnLPedCKqk3pJmVgCBSM6qQI1yTBdEb3C10= cloud.google.com/go/iam v1.12.0 h1:Aki3bX9aHUDKPHfnRJfDcTdVedvy6quGBQcTqx3DRXk= cloud.google.com/go/iam v1.12.0/go.mod h1:FEZ4lXpADAC2AIpQY7LANNjjwyQ2jK439CI2VaD+sLY= -cloud.google.com/go/logging v1.18.0 h1:KhzZq+1cSkPH9YUaKLLhLtQxIHitVayBmk0sGfoM9+k= -cloud.google.com/go/logging v1.18.0/go.mod h1:ZGKnpBaURITh+g/uom2VhbiFoFWvejcrHPDhxFtU/gI= +cloud.google.com/go/logging v1.19.0 h1:NCqhdVUg3wQ8Cobdf16FDSuTGi3+6+hdSBHrY5TsR6Q= +cloud.google.com/go/logging v1.19.0/go.mod h1:i40NZCHC9Gqvod4yE+yQfDWwlgwW/SrshkkGibCHxcA= cloud.google.com/go/longrunning v1.2.0 h1:WjYH3YHBGCxGJP9M4dWGHBfXr/cFIjMkNgWcJj7/iMM= cloud.google.com/go/longrunning v1.2.0/go.mod h1:5KMQALFGOCtFoi2xSOA1u3H7WKlhmckgiyFw7+LGQp0= cloud.google.com/go/monitoring v1.30.0 h1:r/d+JUbyKmJ8b07iznuKfzVzrIXTWxHQ3lBRm3x2LlY= cloud.google.com/go/monitoring v1.30.0/go.mod h1:htlUR0QWVMrjFzZmN4LGnMAve9xB/eduwjmINxVZ8RM= -cloud.google.com/go/storage v1.63.1 h1:CYXILV9G4CH0C18IQ9+V0h4XiqD2LhKnMLO0o7uJWNs= -cloud.google.com/go/storage v1.63.1/go.mod h1:lWyAtwvDZHdL3k68WVKbESP6bmWaV23ZJJ/JEVw/ZaQ= +cloud.google.com/go/storage v1.64.0 h1:KLpxI/oX9LxeRsNqn877d2WyeT3ryiEwnGt8pwcSPZg= +cloud.google.com/go/storage v1.64.0/go.mod h1:lWyAtwvDZHdL3k68WVKbESP6bmWaV23ZJJ/JEVw/ZaQ= cloud.google.com/go/trace v1.16.0 h1:GmQovzFc5F0CNfl0VLgL64aoTtu7xsM0YajW2GlG9+E= cloud.google.com/go/trace v1.16.0/go.mod h1:r+bdAn16dKLSV1G2D5v3e58IlQlizfxWrUfjx7kM7X0= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.34.0 h1:yzIYdwuro811Z27D3T80Wkd3rqZzb0K43nner7Eh1yE= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.34.0/go.mod h1:pJTkW8hEUIIi3Pf65lPZOnn4Y81yCllX6IWk2jNXdkM= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.58.0 h1:ZYGajzJNcirVZpT1rltgf9iM+j9zZ4v8V9DrF+xKRJ8= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.58.0/go.mod h1:PDQyYBOzGtQgvshQI//UiXyzuMHCz0ndyu+4W8X82vM= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.58.0 h1:IBF8BbhKJkMsON/eY+LMu3aF3XMiotCb9KvkUmEkOJo= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.58.0/go.mod h1:dzcEjy1WJ0Q4u9twNR3LcLhNoYMRCrMCMafpxa0TjPQ= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.58.0 h1:SBZzZCiPmDrUV7NSCWY54OnKikO/oTydPCvyEyYaDDE= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.58.0/go.mod h1:YqwkQPrWSC7+byyc1VlKbWLBF5JsW5IoL6xUkemYSXk= -github.com/ardanlabs/jinja v1.4.0 h1:9iE0/wF4zhcws1CYZCWqJTQP8YuhC4FjycBGzCTuOFw= -github.com/ardanlabs/jinja v1.4.0/go.mod h1:aXXzlJfjA+T3XNKA/YT5ZtDq2VJxt5a5siZ8cl9B35Q= -github.com/ardanlabs/kronk v1.28.7 h1:HHEByuL9DjQsaRDS8UXq/D295p73xzDGLBM2pr5+CuE= -github.com/ardanlabs/kronk v1.28.7/go.mod h1:gqLBRpREyPor3n+RMmAeQavg15VBkYrjZjW1oW6DG3o= -github.com/aws/aws-sdk-go-v2 v1.42.1 h1:9eOTgu1z/dVtYpNZ3/8/XbbaX0x/BqE3HUzAzs6K0ek= -github.com/aws/aws-sdk-go-v2 v1.42.1/go.mod h1:5pKeft2eJj+gElQ38Jqg4ibCqh+/AK33/0X3hip7IjM= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.14 h1:3IZY0XAJquT3aHzbkHfPzy4ACPcEjVG0x87KOwtpqGY= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.14/go.mod h1:zwM6veDkhGgQFqkBy+uT28AAYpLu+uFMlPl+rCg/73E= -github.com/aws/aws-sdk-go-v2/config v1.32.30 h1:XwsEzpTJfQYJbFicz/QMLwAZdyeNVVoOEkbF7R3gPJk= -github.com/aws/aws-sdk-go-v2/config v1.32.30/go.mod h1:Ud32SuMc+/9BGxfpSVld7HrE2o05JwKmXY4M3jOQNZU= -github.com/aws/aws-sdk-go-v2/credentials v1.19.29 h1:WHZGssHH887cO0ox07SIQZsFx3MKD4ps6w0xUEmnKYQ= -github.com/aws/aws-sdk-go-v2/credentials v1.19.29/go.mod h1:Mhl0xR6zjguiuj00XRx2wMx22sAltk7oya39sT7fdg8= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.30 h1:/hi1JADLEW9YYryEz1w4GQu0EtP23pP553Cf9KgsDV4= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.30/go.mod h1:/3AOgy4K17Dm4ucMZVC/MJkzy5kmfKUcINRHZyo0koQ= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.30 h1:xM/Is9cKMHa8Jj8zkvWhvrFkZsXJV9E+BB4g0HW0duQ= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.30/go.mod h1:WueJeNDZvK1fMYEWJIkcivBfEzUkTpBhzlrUKKY8EuA= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.30 h1:jn46zC9LdsVR/ZpMIJqMqb8hHv31BlLx3ulVqNspUOk= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.30/go.mod h1:1hTMsAgbdS/AtUi4bw8+gUuh1pceo+eXRLfpSuSQj3M= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.31 h1:3GUprIsfmGcC5SACIyB0e7E0BM1O1b3Erl5CePYIAeQ= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.31/go.mod h1:7PuV1yl5e2xnUbm+RqvVg5i2iBM8EyijZNoI9wsOoOc= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.13 h1:mbRIur/BiHK6SKPjoBIXSE/hJ6g6JGRLuxQy1jGjlN4= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.13/go.mod h1:ITg9em2KbJx1s0y4aqRX5OYWG6HBZ5TVR//OdpEZ2CQ= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.23 h1:9Fjh6fi/U5JEStVZijmaMpUwE/gvBJj7x2B/PjbO9To= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.23/go.mod h1:iMoT2f1tClxrWAAnKCXjZQ6LOmfLrMG14wmnWpM+F14= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.30 h1:/Z5jmNrKsSD7EmDjzAPsm/3L9IuOkzaynklJZ1qX7S4= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.30/go.mod h1:lEzEZnOosE7zi8Z6royW1cFJTD9fpab4Ul1SBrllewk= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.31 h1:uao4A3QZ5UmB326V6KF+qRpv9Tjz7IlnlnTbbANntlU= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.31/go.mod h1:I/1+z0VwL1GhQyLgkoHDlygpUZ+iTAwOQ/NsftiUL2I= -github.com/aws/aws-sdk-go-v2/service/s3 v1.105.1 h1:LkBKxAOE5WXjlFuFZqPG1rREnl6I6QCMElcXFDEidos= -github.com/aws/aws-sdk-go-v2/service/s3 v1.105.1/go.mod h1:zdmCoFO/dSI7GlrwsPqFJI+WlFnSU4Tc8TJnlXrM1Do= -github.com/aws/aws-sdk-go-v2/service/signin v1.4.1 h1:V7ZZ300WPXGjvkyore5DGe0ljVPOxCXie/thWdtSBXE= -github.com/aws/aws-sdk-go-v2/service/signin v1.4.1/go.mod h1:mxC0nT/C8wMMS97DemZPzvUZxvIt+2Iq+eS3JdFZGgg= -github.com/aws/aws-sdk-go-v2/service/sso v1.32.1 h1:gYFYh4iLLcAOJRLNPY2aD2g9DIhKn4eof8UkIrr1rTk= -github.com/aws/aws-sdk-go-v2/service/sso v1.32.1/go.mod h1:u8af9Nqkmqnr96f7v9nHqzZT9XBwbXEkTiqT4ROuJSE= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.37.1 h1:arjT9Cm3/WYbGmD5TUZHk4UQn4Lle1fUNZs5FC6CtF0= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.37.1/go.mod h1:DMPWJBjYs6+3+f/qhBFEFPPlQ6NlhWjai3dJNvipJ84= -github.com/aws/aws-sdk-go-v2/service/sts v1.44.1 h1:RvfHDg+xvAeZ+5741vUEjpOVtYSIm93W2zhx10Xtydw= -github.com/aws/aws-sdk-go-v2/service/sts v1.44.1/go.mod h1:9gdl4RrflIdpDb2TlXshWgR1F9TeCkvqDx77Vpr4Z/Q= -github.com/aws/smithy-go v1.27.3 h1:F3Zb497UhhskkfpJmfkXswyo+t0sh9OTBnIHjogWbVY= -github.com/aws/smithy-go v1.27.3/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.35.0 h1:bN1gA3of5bXtbnLsRPrwfmbbe7A5UWFlcTHseujLnpc= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.35.0/go.mod h1:Yj5vHEz/aAepZGliRJsA6uvHAVAQyEwajq9ORCHPxzM= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.59.0 h1:c/Ivw7FuawPLfrr+zB0LZKeCchO2cAHQpF2qZ6OV7rQ= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.59.0/go.mod h1:Zba7lknY/d78oxbKqFTmCsaGwfpzeJ3ktrrLXtnTV6g= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.59.0 h1:xTXsqDOj5k9mK3VVWHYUryryJCIdYfXxdjKFwpzINUw= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.59.0/go.mod h1:V9g30lTKzfUsEW+gpWssck6u9IhARajmipodImLLcwI= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.59.0 h1:18FRm6ZcN/x9+ZmhMr96hLcTtlLn2/gHPuDLVeg7XcY= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.59.0/go.mod h1:YqwkQPrWSC7+byyc1VlKbWLBF5JsW5IoL6xUkemYSXk= +github.com/ardanlabs/jinja v1.5.0 h1:OkNpmq9fXiCDRHMLCsd+VO/uk8L/tVwNJE+yA3JAhhM= +github.com/ardanlabs/jinja v1.5.0/go.mod h1:aXXzlJfjA+T3XNKA/YT5ZtDq2VJxt5a5siZ8cl9B35Q= +github.com/ardanlabs/kronk v1.29.9 h1:ThmbRCKSXGLl68tOHCMp5gNBCmyEV1Syi66aP+HMoxo= +github.com/ardanlabs/kronk v1.29.9/go.mod h1:419Te3wIWthLXzUvkP0LIh6FVA9Hh1JsCKA2XY+M3jU= +github.com/aws/aws-sdk-go-v2 v1.43.2 h1:cl+IXwWb3qazClUcm08tGSsB6OiuV83JVJO9B0jQcPc= +github.com/aws/aws-sdk-go-v2 v1.43.2/go.mod h1:WEzLKBh/mEjXvx1FtQMWgSxMSTVqxQzjkRtk5fa3wkg= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.15 h1:rq/p1VNFfygoKEQ9hHMKsKBE98lspPvT8IxaFs5mFhw= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.15/go.mod h1:bELIhlPfW8OkpDhP1MvCjHDtvv8NhiBTz+K4o26zrXA= +github.com/aws/aws-sdk-go-v2/config v1.32.33 h1:M1m/Q6f0OKDEDGwhiNOqx1OjTdrewe3v+GDbHmKczWk= +github.com/aws/aws-sdk-go-v2/config v1.32.33/go.mod h1:fGj1iQj2QpIZzp7jE4aQQ+71TE8cd4z9K4+xCd6EqmE= +github.com/aws/aws-sdk-go-v2/credentials v1.19.32 h1:eNE0JnIblBo1NCvd3tqEYuZz9XDefn69R74CHd3nT7U= +github.com/aws/aws-sdk-go-v2/credentials v1.19.32/go.mod h1:yYJu+6tqKUYZuJSYcpSGjz/6sV/SUaAaKIufnWKx2OU= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.33 h1:MobhiR6KIerWxmO74Zit5I3379+mSc2DOdZ3DeRFB9w= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.33/go.mod h1:xu02847OdZfNr/jAfZpHtyRk0b3v4d0kaoxNHxZGG/w= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.33 h1:HAp1wLFZzch054uh3FK7rcVYg4v7J2FxVf3h3IGNZas= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.33/go.mod h1:mJk5fmqnF+WUlMdPG37pR2Fh3oh6r8F6ZGUgPKvzu0c= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.33 h1:0YA0aCKgsJyno6xkFfaIgjE3/wK08+Qxo9nQfe1UrWM= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.33/go.mod h1:UZqj4WIdTH+ga8Y/DgpAuy/8cGjM3h7gDCliJYGg2SE= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.34 h1:HQYnjFnXpX8EbPW5M1QT8mXzesRPwly0HEPTcFlS02Y= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.34/go.mod h1:tGzj56niKYZBbDIRhwPGDqrULzmWv5b6uBQGqyNaFZw= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.14 h1:SA43nfaY7+1jjMNIc2ywu99JLJLButtIdLP6j+bT870= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.14/go.mod h1:Du3llKcwbQvHsTXSLzTOGQz0DTDBMEzdg7DAGu7inrY= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.26 h1:Eflerh7atY6HN0yz60peNLOkJA2ZKUyYjZexMbqwMCE= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.26/go.mod h1:dCAXNDmik9NuTjfsvCvW22S6ZFpxmtoliFoQu5XFkh8= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.33 h1:mqI7OrxN/DUH85F5OqVn3cIfuZ3+HVcebUm2N8mLlgQ= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.33/go.mod h1:eZ5jdEpvaaOU8nWWE4cTAJETSEA5FZoWxvNRao4piHY= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.34 h1:Lercr2QB2rOrCwyOusmnQ7IiopfkGcZAgMJbjcSdK/s= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.34/go.mod h1:W0xXPPCb2HAqa3cp2f/nRvE+jGgBmchiuXrfBRlfb1I= +github.com/aws/aws-sdk-go-v2/service/s3 v1.106.2 h1:lFSYDEyC1JHucMH3fdczMTnDaghqNttyRXKM8JY9EJQ= +github.com/aws/aws-sdk-go-v2/service/s3 v1.106.2/go.mod h1:aw1E7RCjxs5Sd8N6WdICMcMroff12Tzxte+ELXXNqRU= +github.com/aws/aws-sdk-go-v2/service/signin v1.5.2 h1:EjI1CZzDcBxPkTa3j1BdtIrUDbqnOGssFMeyUS+6W0I= +github.com/aws/aws-sdk-go-v2/service/signin v1.5.2/go.mod h1:vN3eb5H8MEAZ4dx0F5Wc9LT8eb3eW7bZZ5BjGJdbw9k= +github.com/aws/aws-sdk-go-v2/service/sso v1.33.2 h1:zMP1FDFE08L7sM5f1QqkH/ZgKKg8Uc0Dz7KhSSYqWkw= +github.com/aws/aws-sdk-go-v2/service/sso v1.33.2/go.mod h1:0LoIZSUKjdo2BleHfT1hv/jlD33LQS00IrBlzoUsoUQ= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.38.2 h1:9eTqUYl+SyVmaRPMyBXSO9wwqC6TRwZB82pKENK2hdQ= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.38.2/go.mod h1:DThweuz22kiLc7lGHop5vQ9c3bx5W6Azs/YqSHa2fu8= +github.com/aws/aws-sdk-go-v2/service/sts v1.45.2 h1:EJd8vZO3E8SE6nmPqxuxlQ1NeSb8as50sf6eGdV4Saw= +github.com/aws/aws-sdk-go-v2/service/sts v1.45.2/go.mod h1:OgpPvKzsO2Ranjpli/20djMkg6UrV5mw4W3pZpq1Mqo= +github.com/aws/smithy-go v1.27.5 h1:d1ro7KpYOYwP6m73YFa+Kc/A130VsAdX68SpsJwARMM= +github.com/aws/smithy-go v1.27.5/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc= github.com/aymanbagabas/go-udiff v0.2.0 h1:TK0fH4MteXUDspT88n8CKzvK0X9O2xu9yQjWpi6yML8= github.com/aymanbagabas/go-udiff v0.2.0/go.mod h1:RE4Ex0qsGkTAJoQdQQCA0uG+nAzJO/pI/QwceO5fgrA= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= @@ -106,8 +106,8 @@ github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1 github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dnaeon/go-vcr v1.2.0 h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI= github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= -github.com/ebitengine/purego v0.10.1 h1:dewVBCBT2GaMu1SrNTYxQhgQBethzfhiwvZiLGP/qyY= -github.com/ebitengine/purego v0.10.1/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/ebitengine/purego v0.10.2 h1:W809HbnvzAxgdm+aOvlSekrM16wGCdT/e76+9tS7gzE= +github.com/ebitengine/purego v0.10.2/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= github.com/envoyproxy/go-control-plane v0.14.0 h1:hbG2kr4RuFj222B6+7T83thSPqLjwBIfQawTkC++2HA= github.com/envoyproxy/go-control-plane v0.14.0/go.mod h1:NcS5X47pLl/hfqxU70yPwL9ZMkUlwlKxtAohpi2wBEU= github.com/envoyproxy/go-control-plane/envoy v1.37.0 h1:u3riX6BoYRfF4Dr7dwSOroNfdSbEPe9Yyl09/B6wBrQ= @@ -125,8 +125,8 @@ github.com/go-json-experiment/json v0.0.0-20260623181947-01eb4420fa68/go.mod h1: github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4= github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= -github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.4 h1:tG4xh9yMsRCAiodLVTxyrkzSZ9+o0L1Kg/+cPVcbP/8= +github.com/go-logr/logr v1.4.4/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-viper/mapstructure/v2 v2.5.0 h1:vM5IJoUAy3d7zRSVtIwQgBj7BiWtMPfmPEgAXnvj1Ro= @@ -143,32 +143,32 @@ github.com/google/s2a-go v0.1.9 h1:LGD7gtMgezd8a/Xak7mEWL0PjoTQFvpRudN895yqKW0= github.com/google/s2a-go v0.1.9/go.mod h1:YA0Ei2ZQL3acow2O62kdp9UlnvMmU7kA6Eutn0dXayM= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.3.18 h1:hvVi34VucdrV1IIsiWuqYM8kutw/92MxNEFxCJZEh0k= -github.com/googleapis/enterprise-certificate-proxy v0.3.18/go.mod h1:rSEsBUemEBZEexP2y6jPp16LUmUbjmSbcPMQizR0o4k= +github.com/googleapis/enterprise-certificate-proxy v0.3.19 h1:mMOE7DN2+p76/EdIrmAy9B9bH+yC4563vmnJ34QR8i4= +github.com/googleapis/enterprise-certificate-proxy v0.3.19/go.mod h1:rSEsBUemEBZEexP2y6jPp16LUmUbjmSbcPMQizR0o4k= github.com/googleapis/gax-go/v2 v2.23.0 h1:Tchl7qkvE7Ip3y+ztvNufYFvkfqTe7NfLTYGIdJRLuE= github.com/googleapis/gax-go/v2 v2.23.0/go.mod h1:rBQKOVJCdb8IFEzg+FCwlt1LP/xMDGuqUXhUG+XMXEg= github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/grpc-ecosystem/grpc-gateway/v2 v2.29.0 h1:5VipnvEpbqr2gA2VbM+nYVbkIF28c5ZQfqCBQ5g2xfk= github.com/grpc-ecosystem/grpc-gateway/v2 v2.29.0/go.mod h1:Hyl3n6Twe1hvtd9XUXDec4pTvgMSEixRuQKPTMH2bNs= -github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.73 h1:LXhjywNxHsex3qFY2p2iOaHK4nFvdqVp9T9QLdZfpjQ= -github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.73/go.mod h1:AsbUhwFfdK9ipM8G0i8WVHS0IesKck6M0M9NcuMQTJ8= +github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.74 h1:mymLUKThnV9wFvogOK8NnsMP9/vlhnjXY98gr2QIGW8= +github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.74/go.mod h1:Bh9qYL8ehmDxSg14Tk8oxFCP90XHfs6NxV1D84884xA= github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= github.com/hashicorp/go-getter v1.8.6 h1:9sQboWULaydVphxc4S64oAI4YqpuCk7nPmvbk131ebY= github.com/hashicorp/go-getter v1.8.6/go.mod h1:nVH12eOV2P58dIiL3rsU6Fh3wLeJEKBOJzhMmzlSWoo= github.com/hashicorp/go-version v1.9.0 h1:CeOIz6k+LoN3qX9Z0tyQrPtiB1DFYRPfCIBtaXPSCnA= github.com/hashicorp/go-version v1.9.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hybridgroup/yzma v1.19.0 h1:L3L5ryeJ5dt6yku0oRgcO/VNJdO2ObPkpCebd8S69o4= -github.com/hybridgroup/yzma v1.19.0/go.mod h1:DAsHYcX7ze7iFZH6PT57oCuqaVd/AXdALhjnOSgWbaE= +github.com/hybridgroup/yzma v1.21.0 h1:xBgCH9ziielLeexci8eJ/PvnxCzgLktOaoHH5p/ef30= +github.com/hybridgroup/yzma v1.21.0/go.mod h1:wAMtNTjSnE79jTWzaeFSsuraam0TXKCPajMHA5s+OX8= github.com/jupiterrider/ffi v0.7.0 h1:RKsl6Ascal+3kyAqR5Qcbp83LceQMLc1VZbPfHWoNzs= github.com/jupiterrider/ffi v0.7.0/go.mod h1:9dauhpOfNqrqk28fxuu0kkdeFtT9Qr4vbfigiuIXN7c= github.com/kaptinlin/jsonpointer v0.4.27 h1:5FOnhlkqQ4/lvHudaAWS8HJCXjN4yAHSIGl7aPKHI0Q= github.com/kaptinlin/jsonpointer v0.4.27/go.mod h1:dfub/n58cWS32Dyf3AZsnKblSAgrz9PyOU76GDPpx8Q= github.com/kaptinlin/jsonschema v0.9.3 h1:uDVd3w4aXwO0tbycblKYvFofhl3hVuE31vOl5JkDXI0= github.com/kaptinlin/jsonschema v0.9.3/go.mod h1:LvtQ/mO0E1e/3c3DiOWTj05LTeot8cTv7DyQq7eJMQg= -github.com/klauspost/compress v1.19.0 h1:sXLILfc9jV2QYWkzFOPWStmcUVH2RHEB1JCdY2oVvCQ= -github.com/klauspost/compress v1.19.0/go.mod h1:cwPg85FWrGar70rWktvGQj8/hthj3wpl0PGDogxkrSQ= +github.com/klauspost/compress v1.19.1 h1:VsB4HPswih7mmZ8WleSFQ75c/Ui1M4trX5oAsJnhSlk= +github.com/klauspost/compress v1.19.1/go.mod h1:cwPg85FWrGar70rWktvGQj8/hthj3wpl0PGDogxkrSQ= github.com/lucasb-eyer/go-colorful v1.3.0 h1:2/yBRLdWBZKrf7gB40FoiKfAWYQ0lqNcbuQwVHXptag= github.com/lucasb-eyer/go-colorful v1.3.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= github.com/mattn/go-runewidth v0.0.17 h1:78v8ZlW0bP43XfmAfPsdXcoNCelfMHsDmd/pkENfrjQ= @@ -179,18 +179,18 @@ github.com/muesli/cancelreader v0.2.2 h1:3I4Kt4BQjOR54NavqnDogx/MIoWBFa0StPA8ELU github.com/muesli/cancelreader v0.2.2/go.mod h1:3XuTXfFS2VjM+HTLZY9Ak0l6eUKfijIfMUZ4EgX0QYo= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/openai/openai-go/v3 v3.43.0 h1:C+MFVUMU3TJNgES+Ikt7HF8xcX7J0wynKeR9ST22hZM= -github.com/openai/openai-go/v3 v3.43.0/go.mod h1:cdufnVK14cWcT9qA1rRtrXx4FTRsgbDPW7Ia7SS5cZo= +github.com/openai/openai-go/v3 v3.46.0 h1:9HzL4DOybwOHAAcsGpMQyELuw0e9OqynJOPV8SH8g5M= +github.com/openai/openai-go/v3 v3.46.0/go.mod h1:b8MgNMpR3lPifYnaOH8XwcG8qRHwhzZxuDgM9lL7h5k= github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.23.2 h1:Je96obch5RDVy3FDMndoUsjAhG5Edi49h0RJWRi/o0o= -github.com/prometheus/client_golang v1.23.2/go.mod h1:Tb1a6LWHB3/SPIzCoaDXI4I8UHKeFTEQ1YCr+0Gyqmg= +github.com/prometheus/client_golang v1.24.1 h1:JnJkREXzWxUdCuPFpIWZiPispT9xVV59uiuyR2bPlnU= +github.com/prometheus/client_golang v1.24.1/go.mod h1:F+oSRECHg4sse5ucfYpYDeIv/hu68Zo0uoHKetWnzcE= github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= -github.com/prometheus/common v0.70.0 h1:bcpru3tWPVnxGnETLgOV5jbp/JRXgYEyv65CuBLAMMI= -github.com/prometheus/common v0.70.0/go.mod h1:S/SFasQmgGiYH6C81LKCtYa8QACgthGg5zxL2udV7SY= +github.com/prometheus/common v0.70.1 h1:1HvjP4D5oL3t8RsPlwxA9onvvStjtIHYE5XuuwOi/PY= +github.com/prometheus/common v0.70.1/go.mod h1:VdFUQDMZK3VLkurFUVhia6uys/0suUp86TJz5qbJRhc= github.com/prometheus/procfs v0.21.1 h1:GljZCt+zSTS+NZq88cyQ1LjZ+RCHp3uVuabBWA5+OJI= github.com/prometheus/procfs v0.21.1/go.mod h1:aB55Cww9pdSJVHk0hUf0inxWyyjPogFIjmHKYgMKmtY= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= @@ -201,8 +201,8 @@ github.com/spiffe/go-spiffe/v2 v2.8.1/go.mod h1:47Q0Q9/AqGha8QLHp+kxpH4Wca7X7EnO github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= github.com/tidwall/gjson v1.14.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= -github.com/tidwall/gjson v1.18.0 h1:FIDeeyB800efLX89e5a8Y0BNH+LOngJyGrIWxG2FKQY= -github.com/tidwall/gjson v1.18.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/gjson v1.19.0 h1:xwxm7n691Uf3u5OFjzngavjGTh55KX5q/9w9xHW88JU= +github.com/tidwall/gjson v1.19.0/go.mod h1:V37/opeE/JbLUOfH0QTXiNez2l0RUjYUhpT4szFQAfc= github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= @@ -210,8 +210,8 @@ github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4= github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY= github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28= -github.com/ulikunitz/xz v0.5.15 h1:9DNdB5s+SgV3bQ2ApL10xRc35ck0DuIX/isZvIk+ubY= -github.com/ulikunitz/xz v0.5.15/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= +github.com/ulikunitz/xz v0.5.16 h1:ld6NyySjx5lowVKwJvMRLnW5nxKX/xnpSiFYZ/Lxur0= +github.com/ulikunitz/xz v0.5.16/go.mod h1:H9Rt/W6/Qj27PGauhQc6nfCDy7vHpzsOThBSaYDoEhw= github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavMF/ppJZNG9ZpyihvCd0w101no= github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM= go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= @@ -240,8 +240,8 @@ go.opentelemetry.io/otel/sdk/metric v1.44.0 h1:3LlKgI+VjbVsjNRFZJZAJ30WjXC5VkNRk go.opentelemetry.io/otel/sdk/metric v1.44.0/go.mod h1:5B5pMARnXxKhltooO4xUuCBorl65a4EpnTalObqOigA= go.opentelemetry.io/otel/trace v1.44.0 h1:jxF5CsGYCe74MCRx2X4g7WsY/VBKRqqpNvXlX/6gtIk= go.opentelemetry.io/otel/trace v1.44.0/go.mod h1:oLl1jrMQAVo6v3GAggN+1VH9VIz9iUSvW53sW1Q8PIE= -go.opentelemetry.io/proto/otlp v1.10.0 h1:IQRWgT5srOCYfiWnpqUYz9CVmbO8bFmKcwYxpuCSL2g= -go.opentelemetry.io/proto/otlp v1.10.0/go.mod h1:/CV4QoCR/S9yaPj8utp3lvQPoqMtxXdzn7ozvvozVqk= +go.opentelemetry.io/proto/otlp v1.11.0 h1:5rrYs0Ykyj50sdU/JU0x8etU+LubXWb+gED6TbEdMIk= +go.opentelemetry.io/proto/otlp v1.11.0/go.mod h1:SmVizdCOAm3XBtG1g1NnOdhW6jtddT72hLMhv8VwA8E= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.yaml.in/yaml/v2 v2.4.4 h1:tuyd0P+2Ont/d6e2rl3be67goVK4R6deVxCUX5vyPaQ= @@ -266,18 +266,18 @@ golang.org/x/time v0.15.0 h1:bbrp8t3bGUeFOx08pvsMYRTCVSMk89u4tKbNOZbp88U= golang.org/x/time v0.15.0/go.mod h1:Y4YMaQmXwGQZoFaVFk4YpCt4FLQMYKZe9oeV/f4MSno= gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4= gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E= -google.golang.org/api v0.288.0 h1:glhO/J88obKP5I269W3hB73dvBKrjU56ZfmNlNXpgTU= -google.golang.org/api v0.288.0/go.mod h1:lM2kYRzYUCBY91P9h6VF1PYmvhxii3O5hji37qRvIcY= -google.golang.org/genai v1.63.0 h1:Iryg+4TBco5HaRbwVhAV/ROKVcWiZkuvQzKb4u1QggY= -google.golang.org/genai v1.63.0/go.mod h1:mDdPDFXo1Ats7f1WXVyZgWb/CkMzFWTWJruIMy7hGIU= -google.golang.org/genproto v0.0.0-20260713224248-f5fc221cf8c4 h1:PWVFocb6Y93aqxY7m9ArHu5zQiLkIrXBLr+ajQxRHH0= -google.golang.org/genproto v0.0.0-20260713224248-f5fc221cf8c4/go.mod h1:v47/Kzm6KzB/2uGxuDjGww+7Dk7ny/VFIaIw4WxEtu0= -google.golang.org/genproto/googleapis/api v0.0.0-20260713224248-f5fc221cf8c4 h1:lI0NbdWVmT6lOJJNDd7vyeTdfxP/7ouCLSJUKNNXa0k= -google.golang.org/genproto/googleapis/api v0.0.0-20260713224248-f5fc221cf8c4/go.mod h1:WRrQ7/7N19PypuT0fxLOL5Lq0waoiRri4FbtHDEKrGE= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260713224248-f5fc221cf8c4 h1:7RtFDizMtT9eZzHzKxifoMGfcDBBy+LYZlgfg24ZmOM= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260713224248-f5fc221cf8c4/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= -google.golang.org/grpc v1.82.0 h1:vguDnZUPjE26w09A63VoxZPnvPjB5Riyc0mkXPFmAIU= -google.golang.org/grpc v1.82.0/go.mod h1:yzTZ1TB1Z3SG+LIYaI+WiE8D5+PZ3ArnrSp8zF3+/ZA= +google.golang.org/api v0.291.0 h1:wfPbbY+mr9c7wZLqqzrHJLft/q8iFKREd6IgTBUene0= +google.golang.org/api v0.291.0/go.mod h1:at7kwWbuonglBFEBoeMDAV1bguHqL3qf0BHFsv3coa0= +google.golang.org/genai v1.65.0 h1:6QK3Rjsx0iuJjbDCE1vf1VUr1IEjRDpvexGGnhxoAIk= +google.golang.org/genai v1.65.0/go.mod h1:mDdPDFXo1Ats7f1WXVyZgWb/CkMzFWTWJruIMy7hGIU= +google.golang.org/genproto v0.0.0-20260729162451-8efbd57d26e0 h1:xJf8e9ReUqiexuIT3OWJkvA4RdgR8K4Hfheq8gaKxIM= +google.golang.org/genproto v0.0.0-20260729162451-8efbd57d26e0/go.mod h1:0MNk3ibJAyOwDZVlp18knQe3jRyFxpcU06xjxhgjx0M= +google.golang.org/genproto/googleapis/api v0.0.0-20260729162451-8efbd57d26e0 h1:ybvH/ZpOcpCrjtkb7oW/fdlzbEmRVeumw19SRQmNFKU= +google.golang.org/genproto/googleapis/api v0.0.0-20260729162451-8efbd57d26e0/go.mod h1:HJ9MpJLeDSstBkx1LILTpd5f41ADSMZcTPypw02qEGw= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260729162451-8efbd57d26e0 h1:mJiOtnGp0k/BcSgdu03G2NwnscCfCH+h2QKUBZr18KI= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260729162451-8efbd57d26e0/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= +google.golang.org/grpc v1.83.0 h1:JeNZEKJFbQxArAMl+hiytHauacDNqJUllNfmIMmpqnQ= +google.golang.org/grpc v1.83.0/go.mod h1:kDyl6SKsiHKt0uylY5gtn5cEjkrIOhQOGDgIc4JGwzQ= google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= diff --git a/go.mod b/go.mod index 93bf783ef..219eebcf4 100644 --- a/go.mod +++ b/go.mod @@ -5,10 +5,10 @@ go 1.26.5 require ( charm.land/x/vcr v0.1.1 cloud.google.com/go/auth v0.22.0 - github.com/ardanlabs/kronk v1.29.3 - github.com/aws/aws-sdk-go-v2 v1.43.0 - github.com/aws/aws-sdk-go-v2/config v1.32.31 - github.com/aws/smithy-go v1.27.4 + github.com/ardanlabs/kronk v1.29.9 + github.com/aws/aws-sdk-go-v2 v1.43.2 + github.com/aws/aws-sdk-go-v2/config v1.32.33 + github.com/aws/smithy-go v1.27.5 github.com/charmbracelet/anthropic-sdk-go v0.0.0-20260223140439-63879b0b8dab github.com/charmbracelet/x/exp/slice v0.0.0-20250904123553-b4e2667e5ad5 github.com/charmbracelet/x/exp/strings v0.1.0 @@ -38,21 +38,21 @@ require ( github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.59.0 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.59.0 // indirect github.com/ardanlabs/jinja v1.5.0 // indirect - github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.14 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.19.30 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.31 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.31 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.31 // indirect - github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.32 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.13 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.24 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.31 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.32 // indirect - github.com/aws/aws-sdk-go-v2/service/s3 v1.106.0 // indirect - github.com/aws/aws-sdk-go-v2/service/signin v1.5.0 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.33.0 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.38.0 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.45.0 // indirect + github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.15 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.19.32 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.33 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.33 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.33 // indirect + github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.34 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.14 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.26 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.33 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.34 // indirect + github.com/aws/aws-sdk-go-v2/service/s3 v1.106.2 // indirect + github.com/aws/aws-sdk-go-v2/service/signin v1.5.2 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.33.2 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.38.2 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.45.2 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d // indirect github.com/cenkalti/backoff/v5 v5.0.3 // indirect @@ -74,11 +74,11 @@ require ( github.com/googleapis/gax-go/v2 v2.23.0 // indirect github.com/gorilla/websocket v1.5.3 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.29.0 // indirect - github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.73 // indirect + github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.74 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-getter v1.8.6 // indirect github.com/hashicorp/go-version v1.9.0 // indirect - github.com/hybridgroup/yzma v1.20.0 // indirect + github.com/hybridgroup/yzma v1.21.0 // indirect github.com/jupiterrider/ffi v0.7.0 // indirect github.com/kaptinlin/jsonpointer v0.4.27 // indirect github.com/klauspost/compress v1.19.1 // indirect @@ -116,11 +116,11 @@ require ( golang.org/x/sys v0.47.0 // indirect golang.org/x/text v0.40.0 // indirect golang.org/x/time v0.15.0 // indirect - google.golang.org/api v0.290.0 // indirect - google.golang.org/genproto v0.0.0-20260724162435-b2f20204f0df // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20260724162435-b2f20204f0df // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20260724162435-b2f20204f0df // indirect - google.golang.org/grpc v1.82.1 // indirect + google.golang.org/api v0.291.0 // indirect + google.golang.org/genproto v0.0.0-20260729162451-8efbd57d26e0 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20260729162451-8efbd57d26e0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20260729162451-8efbd57d26e0 // indirect + google.golang.org/grpc v1.83.0 // indirect google.golang.org/protobuf v1.36.11 // indirect gopkg.in/dnaeon/go-vcr.v4 v4.0.6-0.20251110073552-01de4eb40290 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/go.sum b/go.sum index 17d555a22..b22013caf 100644 --- a/go.sum +++ b/go.sum @@ -40,44 +40,44 @@ github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapp github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.59.0/go.mod h1:YqwkQPrWSC7+byyc1VlKbWLBF5JsW5IoL6xUkemYSXk= github.com/ardanlabs/jinja v1.5.0 h1:OkNpmq9fXiCDRHMLCsd+VO/uk8L/tVwNJE+yA3JAhhM= github.com/ardanlabs/jinja v1.5.0/go.mod h1:aXXzlJfjA+T3XNKA/YT5ZtDq2VJxt5a5siZ8cl9B35Q= -github.com/ardanlabs/kronk v1.29.3 h1:lRA2wm+YsXff3KtUIfT8Qs2tA5CptyJPApGP4b/6jX8= -github.com/ardanlabs/kronk v1.29.3/go.mod h1:dQ/DYe0cDfirGUfFG7gIRRN90HA5/sO9ZsO0Tq4ZgbA= -github.com/aws/aws-sdk-go-v2 v1.43.0 h1:fharf/WhbRAVZ1du0QL7roNFxZ6T/sWr+4Ni617bwSI= -github.com/aws/aws-sdk-go-v2 v1.43.0/go.mod h1:5pKeft2eJj+gElQ38Jqg4ibCqh+/AK33/0X3hip7IjM= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.14 h1:3IZY0XAJquT3aHzbkHfPzy4ACPcEjVG0x87KOwtpqGY= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.14/go.mod h1:zwM6veDkhGgQFqkBy+uT28AAYpLu+uFMlPl+rCg/73E= -github.com/aws/aws-sdk-go-v2/config v1.32.31 h1:n4nY9O3QKoHIkL85EX+V8RcMFtOhlpTFhGArg915PXk= -github.com/aws/aws-sdk-go-v2/config v1.32.31/go.mod h1:PN0NYDCCoOpGGsZ2+elDUidmHfQBPyYzN2GCgl8HEBs= -github.com/aws/aws-sdk-go-v2/credentials v1.19.30 h1:TTCvvzFU6gXa4iJecNG/0F/B0oYTiazoRECr2XyLHrY= -github.com/aws/aws-sdk-go-v2/credentials v1.19.30/go.mod h1:jKxAp2AEncnliinzpgOSZDFv6+VjvWhjw/AtbfsWT9U= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.31 h1:kfVL5wAunCJycL6MOQ6aNh6PlAYEymflcjuKmrWUA0o= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.31/go.mod h1:nWfRNDAppujCQgOUd43lKT4yeLv9z3nJ3bw1G3BgQKo= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.31 h1:Z8F3hfCY33IGpJjFAnv0wvtv1FIKj1GHmRDEYqy64tw= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.31/go.mod h1:aVyUoytEyOViR6jhq6jula0xkc5NfBE2hgeF6BvOrao= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.31 h1:hyOxUyXdh3AyjE93gBgsfziJag9ACwcs+ZpDBLzi8mw= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.31/go.mod h1:OERqI9k0draSLB8O8woxY3q25ZWTELRK4RRoLMuMZFo= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.32 h1:0MrUL35H/Y4kdFfItoR5jCgtDQ4Z/8LudAoIHRfA4hE= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.32/go.mod h1:2tNZkuWz54arj8mHVf+8Y7cKkcD8Wr/fBpENgEXpjLc= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.13 h1:mbRIur/BiHK6SKPjoBIXSE/hJ6g6JGRLuxQy1jGjlN4= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.13/go.mod h1:ITg9em2KbJx1s0y4aqRX5OYWG6HBZ5TVR//OdpEZ2CQ= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.24 h1:mdPwDQPqxlw9Sc62Nt15yjEcARaDbPXkjRYtXsUripo= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.24/go.mod h1:ls5ytnwLTcQaUu32fMYXFI3MjpKuTwL840PAm9iqyEg= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.31 h1:w2SIhW92DZPFrSL4ksVCr8IYff5OZwIcxg8+95tzvAI= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.31/go.mod h1:wAhpCQbkov+IcvjozJbd2xRCoZybUEHNkcFunssNACg= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.32 h1:jWXtZdCnhXa9sGFixRaU2AxT4DIVse9HS4E2f+/KwV0= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.32/go.mod h1:9JS1UpfVvyD/ZPX8GsKb/Pq8scEM+7GP5fqh9SwH7po= -github.com/aws/aws-sdk-go-v2/service/s3 v1.106.0 h1:7QZWVJZWzHivHWIa+5TELLaBBkbuoj0GPwQtMlJ0sqk= -github.com/aws/aws-sdk-go-v2/service/s3 v1.106.0/go.mod h1:fcvq5L7dK+5cQFicEJwpI6e6Wn8NY2i6yT5wRLYVc7s= -github.com/aws/aws-sdk-go-v2/service/signin v1.5.0 h1:OHH5iTQvVGmfHjX/5Q+vFuA/Rf2x6/95aJ/75QCQSm4= -github.com/aws/aws-sdk-go-v2/service/signin v1.5.0/go.mod h1:mCF3AK9PpL49oOrhniUXWAfhVBVQ/XbytoE5eccZUIs= -github.com/aws/aws-sdk-go-v2/service/sso v1.33.0 h1:CaJyYhxBE0M/HJX/YvSaSmQlsI91VHB0lKU8LtLxL3A= -github.com/aws/aws-sdk-go-v2/service/sso v1.33.0/go.mod h1:+e6BMRMPjBQoCw/WovYR9GLy2IU0z4Q77smOB1DraSg= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.38.0 h1:tC323YV77QdafeBr6LUhLDTsboyuyHLNRwAyCP44kGU= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.38.0/go.mod h1:SfLK1sgviHmbI+MozR9iDwDjL4cdCVZtahsjoR+z7wg= -github.com/aws/aws-sdk-go-v2/service/sts v1.45.0 h1:Pd6PNlp4t8PTXxqzstICl52Wsy78vpjFZ7PRUj44mJc= -github.com/aws/aws-sdk-go-v2/service/sts v1.45.0/go.mod h1:rmQ0TnHzuLPmabgjPcsywhsSOmaBDgzR4zvDxSPsGdg= -github.com/aws/smithy-go v1.27.4 h1:JQcphmBN4f0q/sPqXqROIItRNV/hy10cgu7CsFy616M= -github.com/aws/smithy-go v1.27.4/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc= +github.com/ardanlabs/kronk v1.29.9 h1:ThmbRCKSXGLl68tOHCMp5gNBCmyEV1Syi66aP+HMoxo= +github.com/ardanlabs/kronk v1.29.9/go.mod h1:419Te3wIWthLXzUvkP0LIh6FVA9Hh1JsCKA2XY+M3jU= +github.com/aws/aws-sdk-go-v2 v1.43.2 h1:cl+IXwWb3qazClUcm08tGSsB6OiuV83JVJO9B0jQcPc= +github.com/aws/aws-sdk-go-v2 v1.43.2/go.mod h1:WEzLKBh/mEjXvx1FtQMWgSxMSTVqxQzjkRtk5fa3wkg= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.15 h1:rq/p1VNFfygoKEQ9hHMKsKBE98lspPvT8IxaFs5mFhw= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.15/go.mod h1:bELIhlPfW8OkpDhP1MvCjHDtvv8NhiBTz+K4o26zrXA= +github.com/aws/aws-sdk-go-v2/config v1.32.33 h1:M1m/Q6f0OKDEDGwhiNOqx1OjTdrewe3v+GDbHmKczWk= +github.com/aws/aws-sdk-go-v2/config v1.32.33/go.mod h1:fGj1iQj2QpIZzp7jE4aQQ+71TE8cd4z9K4+xCd6EqmE= +github.com/aws/aws-sdk-go-v2/credentials v1.19.32 h1:eNE0JnIblBo1NCvd3tqEYuZz9XDefn69R74CHd3nT7U= +github.com/aws/aws-sdk-go-v2/credentials v1.19.32/go.mod h1:yYJu+6tqKUYZuJSYcpSGjz/6sV/SUaAaKIufnWKx2OU= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.33 h1:MobhiR6KIerWxmO74Zit5I3379+mSc2DOdZ3DeRFB9w= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.33/go.mod h1:xu02847OdZfNr/jAfZpHtyRk0b3v4d0kaoxNHxZGG/w= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.33 h1:HAp1wLFZzch054uh3FK7rcVYg4v7J2FxVf3h3IGNZas= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.33/go.mod h1:mJk5fmqnF+WUlMdPG37pR2Fh3oh6r8F6ZGUgPKvzu0c= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.33 h1:0YA0aCKgsJyno6xkFfaIgjE3/wK08+Qxo9nQfe1UrWM= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.33/go.mod h1:UZqj4WIdTH+ga8Y/DgpAuy/8cGjM3h7gDCliJYGg2SE= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.34 h1:HQYnjFnXpX8EbPW5M1QT8mXzesRPwly0HEPTcFlS02Y= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.34/go.mod h1:tGzj56niKYZBbDIRhwPGDqrULzmWv5b6uBQGqyNaFZw= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.14 h1:SA43nfaY7+1jjMNIc2ywu99JLJLButtIdLP6j+bT870= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.14/go.mod h1:Du3llKcwbQvHsTXSLzTOGQz0DTDBMEzdg7DAGu7inrY= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.26 h1:Eflerh7atY6HN0yz60peNLOkJA2ZKUyYjZexMbqwMCE= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.26/go.mod h1:dCAXNDmik9NuTjfsvCvW22S6ZFpxmtoliFoQu5XFkh8= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.33 h1:mqI7OrxN/DUH85F5OqVn3cIfuZ3+HVcebUm2N8mLlgQ= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.33/go.mod h1:eZ5jdEpvaaOU8nWWE4cTAJETSEA5FZoWxvNRao4piHY= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.34 h1:Lercr2QB2rOrCwyOusmnQ7IiopfkGcZAgMJbjcSdK/s= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.34/go.mod h1:W0xXPPCb2HAqa3cp2f/nRvE+jGgBmchiuXrfBRlfb1I= +github.com/aws/aws-sdk-go-v2/service/s3 v1.106.2 h1:lFSYDEyC1JHucMH3fdczMTnDaghqNttyRXKM8JY9EJQ= +github.com/aws/aws-sdk-go-v2/service/s3 v1.106.2/go.mod h1:aw1E7RCjxs5Sd8N6WdICMcMroff12Tzxte+ELXXNqRU= +github.com/aws/aws-sdk-go-v2/service/signin v1.5.2 h1:EjI1CZzDcBxPkTa3j1BdtIrUDbqnOGssFMeyUS+6W0I= +github.com/aws/aws-sdk-go-v2/service/signin v1.5.2/go.mod h1:vN3eb5H8MEAZ4dx0F5Wc9LT8eb3eW7bZZ5BjGJdbw9k= +github.com/aws/aws-sdk-go-v2/service/sso v1.33.2 h1:zMP1FDFE08L7sM5f1QqkH/ZgKKg8Uc0Dz7KhSSYqWkw= +github.com/aws/aws-sdk-go-v2/service/sso v1.33.2/go.mod h1:0LoIZSUKjdo2BleHfT1hv/jlD33LQS00IrBlzoUsoUQ= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.38.2 h1:9eTqUYl+SyVmaRPMyBXSO9wwqC6TRwZB82pKENK2hdQ= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.38.2/go.mod h1:DThweuz22kiLc7lGHop5vQ9c3bx5W6Azs/YqSHa2fu8= +github.com/aws/aws-sdk-go-v2/service/sts v1.45.2 h1:EJd8vZO3E8SE6nmPqxuxlQ1NeSb8as50sf6eGdV4Saw= +github.com/aws/aws-sdk-go-v2/service/sts v1.45.2/go.mod h1:OgpPvKzsO2Ranjpli/20djMkg6UrV5mw4W3pZpq1Mqo= +github.com/aws/smithy-go v1.27.5 h1:d1ro7KpYOYwP6m73YFa+Kc/A130VsAdX68SpsJwARMM= +github.com/aws/smithy-go v1.27.5/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d h1:xDfNPAt8lFiC1UJrqV3uuy861HCTo708pDMbjHHdCas= @@ -145,16 +145,16 @@ github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aN github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/grpc-ecosystem/grpc-gateway/v2 v2.29.0 h1:5VipnvEpbqr2gA2VbM+nYVbkIF28c5ZQfqCBQ5g2xfk= github.com/grpc-ecosystem/grpc-gateway/v2 v2.29.0/go.mod h1:Hyl3n6Twe1hvtd9XUXDec4pTvgMSEixRuQKPTMH2bNs= -github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.73 h1:LXhjywNxHsex3qFY2p2iOaHK4nFvdqVp9T9QLdZfpjQ= -github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.73/go.mod h1:AsbUhwFfdK9ipM8G0i8WVHS0IesKck6M0M9NcuMQTJ8= +github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.74 h1:mymLUKThnV9wFvogOK8NnsMP9/vlhnjXY98gr2QIGW8= +github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.74/go.mod h1:Bh9qYL8ehmDxSg14Tk8oxFCP90XHfs6NxV1D84884xA= github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= github.com/hashicorp/go-getter v1.8.6 h1:9sQboWULaydVphxc4S64oAI4YqpuCk7nPmvbk131ebY= github.com/hashicorp/go-getter v1.8.6/go.mod h1:nVH12eOV2P58dIiL3rsU6Fh3wLeJEKBOJzhMmzlSWoo= github.com/hashicorp/go-version v1.9.0 h1:CeOIz6k+LoN3qX9Z0tyQrPtiB1DFYRPfCIBtaXPSCnA= github.com/hashicorp/go-version v1.9.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hybridgroup/yzma v1.20.0 h1:pv94eHUGshHnimaOtRTgaLz3GvpjX5wA9xJdA3yHqWA= -github.com/hybridgroup/yzma v1.20.0/go.mod h1:wAMtNTjSnE79jTWzaeFSsuraam0TXKCPajMHA5s+OX8= +github.com/hybridgroup/yzma v1.21.0 h1:xBgCH9ziielLeexci8eJ/PvnxCzgLktOaoHH5p/ef30= +github.com/hybridgroup/yzma v1.21.0/go.mod h1:wAMtNTjSnE79jTWzaeFSsuraam0TXKCPajMHA5s+OX8= github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= github.com/jupiterrider/ffi v0.7.0 h1:RKsl6Ascal+3kyAqR5Qcbp83LceQMLc1VZbPfHWoNzs= @@ -261,18 +261,18 @@ golang.org/x/time v0.15.0 h1:bbrp8t3bGUeFOx08pvsMYRTCVSMk89u4tKbNOZbp88U= golang.org/x/time v0.15.0/go.mod h1:Y4YMaQmXwGQZoFaVFk4YpCt4FLQMYKZe9oeV/f4MSno= gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4= gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E= -google.golang.org/api v0.290.0 h1:eMw0Xo+IfbbMlKmW7aHvpyQRv9RCXuWx/vs8AD+0x9A= -google.golang.org/api v0.290.0/go.mod h1:weJZ3lldHFYI0DBFNKpJelUDNnusTt5YaOEgxvt8ci8= +google.golang.org/api v0.291.0 h1:wfPbbY+mr9c7wZLqqzrHJLft/q8iFKREd6IgTBUene0= +google.golang.org/api v0.291.0/go.mod h1:at7kwWbuonglBFEBoeMDAV1bguHqL3qf0BHFsv3coa0= google.golang.org/genai v1.65.0 h1:6QK3Rjsx0iuJjbDCE1vf1VUr1IEjRDpvexGGnhxoAIk= google.golang.org/genai v1.65.0/go.mod h1:mDdPDFXo1Ats7f1WXVyZgWb/CkMzFWTWJruIMy7hGIU= -google.golang.org/genproto v0.0.0-20260724162435-b2f20204f0df h1:A7u56ilVtWR3CySHErsWAsimNwD4FoX9KWd8SUCn6vc= -google.golang.org/genproto v0.0.0-20260724162435-b2f20204f0df/go.mod h1:4RPHZcXMGptb7aRZb+M43xI7ixmjEtASEf2VtOOBZbU= -google.golang.org/genproto/googleapis/api v0.0.0-20260724162435-b2f20204f0df h1:NsJx+hCSwIBI6+C4BuJIkb8xOG1M+nfQDsqIrQHT92k= -google.golang.org/genproto/googleapis/api v0.0.0-20260724162435-b2f20204f0df/go.mod h1:1brfde68Npq6+WA75c1EHWPijZEG1kMus61ygPZfn4A= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260724162435-b2f20204f0df h1:O3ig1i5WDDzsVzRp+cCdgelT9vXnlnOFdlEeFtL4HCc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260724162435-b2f20204f0df/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= -google.golang.org/grpc v1.82.1 h1:NnAxzGRA0677vCa4BUkOAnO5+FfQqVl9iUXeD0IqcGE= -google.golang.org/grpc v1.82.1/go.mod h1:yzTZ1TB1Z3SG+LIYaI+WiE8D5+PZ3ArnrSp8zF3+/ZA= +google.golang.org/genproto v0.0.0-20260729162451-8efbd57d26e0 h1:xJf8e9ReUqiexuIT3OWJkvA4RdgR8K4Hfheq8gaKxIM= +google.golang.org/genproto v0.0.0-20260729162451-8efbd57d26e0/go.mod h1:0MNk3ibJAyOwDZVlp18knQe3jRyFxpcU06xjxhgjx0M= +google.golang.org/genproto/googleapis/api v0.0.0-20260729162451-8efbd57d26e0 h1:ybvH/ZpOcpCrjtkb7oW/fdlzbEmRVeumw19SRQmNFKU= +google.golang.org/genproto/googleapis/api v0.0.0-20260729162451-8efbd57d26e0/go.mod h1:HJ9MpJLeDSstBkx1LILTpd5f41ADSMZcTPypw02qEGw= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260729162451-8efbd57d26e0 h1:mJiOtnGp0k/BcSgdu03G2NwnscCfCH+h2QKUBZr18KI= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260729162451-8efbd57d26e0/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= +google.golang.org/grpc v1.83.0 h1:JeNZEKJFbQxArAMl+hiytHauacDNqJUllNfmIMmpqnQ= +google.golang.org/grpc v1.83.0/go.mod h1:kDyl6SKsiHKt0uylY5gtn5cEjkrIOhQOGDgIc4JGwzQ= google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= From e5c89d148e90963fbb0a62fe07370f8ec5d0dd10 Mon Sep 17 00:00:00 2001 From: Kieran Klukas Date: Fri, 31 Jul 2026 06:40:02 -0700 Subject: [PATCH 061/156] fix(providers/openaicompat): forward tool result media to LLM (#326) Co-authored-by: Ed Zynda --- providers/openai/language_model_hooks.go | 65 +++--- .../openaicompat/language_model_hooks.go | 26 +++ .../openaicompat/tool_result_media_test.go | 209 ++++++++++++++++++ 3 files changed, 271 insertions(+), 29 deletions(-) create mode 100644 providers/openaicompat/tool_result_media_test.go diff --git a/providers/openai/language_model_hooks.go b/providers/openai/language_model_hooks.go index b4cc5de1f..f1c851570 100644 --- a/providers/openai/language_model_hooks.go +++ b/providers/openai/language_model_hooks.go @@ -579,26 +579,10 @@ func DefaultToPrompt(prompt fantasy.Prompt, _, _ string) ([]openai.ChatCompletio continue } // OpenAI Chat Completions tool messages cannot carry image - // or audio content directly; the SDK's content union only - // accepts text. To keep the tool_call/tool_result pairing - // valid while still surfacing the media to vision-capable - // models, emit a text tool message with a placeholder (or - // any accompanying text) and follow it with a synthetic - // user message holding the actual media content part. - placeholder := output.Text - if placeholder == "" { - placeholder = fmt.Sprintf("The tool returned %s content; see the following user message.", output.MediaType) - } - messages = append(messages, openai.ToolMessage(placeholder, toolResultPart.ToolCallID)) - mediaPart, mediaWarning, emit := toolResultMediaUserPart(output) - if mediaWarning != nil { - warnings = append(warnings, *mediaWarning) - } - if emit { - messages = append(messages, openai.UserMessage( - []openai.ChatCompletionContentPartUnionParam{mediaPart}, - )) - } + // or audio content directly; see ToolResultMediaMessages. + mediaMessages, mediaWarnings := ToolResultMediaMessages(output, toolResultPart.ToolCallID) + messages = append(messages, mediaMessages...) + warnings = append(warnings, mediaWarnings...) default: warnings = append(warnings, fantasy.CallWarning{ Type: fantasy.CallWarningTypeOther, @@ -611,6 +595,33 @@ func DefaultToPrompt(prompt fantasy.Prompt, _, _ string) ([]openai.ChatCompletio return messages, warnings } +// ToolResultMediaMessages maps a tool-result media output to the chat +// completions messages that convey it. OpenAI tool messages can only carry +// text, so this emits a text tool message (using any accompanying text, or a +// placeholder describing the media) to keep the tool_call/tool_result pairing +// valid, followed by a synthetic user message holding the actual image or +// audio content part so vision- and audio-capable models can see it. +// +// Unsupported media types produce only the text tool message plus a warning. +// This is shared with OpenAI-compatible providers, which face the same +// constraint. +func ToolResultMediaMessages(output fantasy.ToolResultOutputContentMedia, toolCallID string) ([]openai.ChatCompletionMessageParamUnion, []fantasy.CallWarning) { + placeholder := output.Text + if placeholder == "" { + placeholder = fmt.Sprintf("The tool returned %s content; see the following user message.", output.MediaType) + } + messages := []openai.ChatCompletionMessageParamUnion{openai.ToolMessage(placeholder, toolCallID)} + + mediaPart, warning, emit := toolResultMediaUserPart(output) + if warning != nil { + return messages, []fantasy.CallWarning{*warning} + } + if emit { + messages = append(messages, openai.UserMessage([]openai.ChatCompletionContentPartUnionParam{mediaPart})) + } + return messages, nil +} + // toolResultMediaUserPart maps a tool-result media output to an OpenAI chat // completions user content part. It returns the content part, an optional // warning, and whether the caller should emit the returned part. @@ -622,19 +633,15 @@ func toolResultMediaUserPart(output fantasy.ToolResultOutputContentMedia) (opena ImageURL: openai.ChatCompletionContentPartImageImageURLParam{URL: data}, } return openai.ChatCompletionContentPartUnionParam{OfImageURL: &imageBlock}, nil, true - case output.MediaType == "audio/wav": - audioBlock := openai.ChatCompletionContentPartInputAudioParam{ - InputAudio: openai.ChatCompletionContentPartInputAudioInputAudioParam{ - Data: output.Data, - Format: "wav", - }, + case output.MediaType == "audio/wav", output.MediaType == "audio/mpeg", output.MediaType == "audio/mp3": + format := "wav" + if output.MediaType != "audio/wav" { + format = "mp3" } - return openai.ChatCompletionContentPartUnionParam{OfInputAudio: &audioBlock}, nil, true - case output.MediaType == "audio/mpeg" || output.MediaType == "audio/mp3": audioBlock := openai.ChatCompletionContentPartInputAudioParam{ InputAudio: openai.ChatCompletionContentPartInputAudioInputAudioParam{ Data: output.Data, - Format: "mp3", + Format: format, }, } return openai.ChatCompletionContentPartUnionParam{OfInputAudio: &audioBlock}, nil, true diff --git a/providers/openaicompat/language_model_hooks.go b/providers/openaicompat/language_model_hooks.go index 0b9b64210..b7d7ff5d1 100644 --- a/providers/openaicompat/language_model_hooks.go +++ b/providers/openaicompat/language_model_hooks.go @@ -487,6 +487,28 @@ func ToPromptFunc(prompt fantasy.Prompt, _, _ string) ([]openaisdk.ChatCompletio continue } messages = append(messages, openaisdk.ToolMessage(output.Error.Error(), toolResultPart.ToolCallID)) + case fantasy.ToolResultContentTypeMedia: + output, ok := fantasy.AsToolResultOutputType[fantasy.ToolResultOutputContentMedia](toolResultPart.Output) + if !ok { + warnings = append(warnings, fantasy.CallWarning{ + Type: fantasy.CallWarningTypeOther, + Message: "tool result output does not have the right type", + }) + continue + } + // OpenAI-compatible chat completions tool messages cannot + // carry image or audio content directly; the SDK's content + // union only accepts text. Reuse the openai provider's + // helper, which emits a text tool message plus a synthetic + // user message holding the media. + mediaMessages, mediaWarnings := openai.ToolResultMediaMessages(output, toolResultPart.ToolCallID) + messages = append(messages, mediaMessages...) + warnings = append(warnings, mediaWarnings...) + default: + warnings = append(warnings, fantasy.CallWarning{ + Type: fantasy.CallWarningTypeOther, + Message: fmt.Sprintf("tool result output type %q not supported", toolResultPart.Output.GetType()), + }) } } } @@ -494,6 +516,10 @@ func ToPromptFunc(prompt fantasy.Prompt, _, _ string) ([]openaisdk.ChatCompletio return messages, warnings } +// toolResultMediaUserPart maps a tool-result media output to an OpenAI chat +// completions user content part. It returns the content part, an optional +// warning, and whether the caller should emit the returned part. + func hasVisibleCompatUserContent(content []openaisdk.ChatCompletionContentPartUnionParam) bool { for _, part := range content { if part.OfText != nil || part.OfImageURL != nil || part.OfInputAudio != nil || part.OfFile != nil { diff --git a/providers/openaicompat/tool_result_media_test.go b/providers/openaicompat/tool_result_media_test.go new file mode 100644 index 000000000..642b605b7 --- /dev/null +++ b/providers/openaicompat/tool_result_media_test.go @@ -0,0 +1,209 @@ +package openaicompat + +import ( + "encoding/base64" + "testing" + + "charm.land/fantasy" + "github.com/stretchr/testify/require" +) + +// Tool messages in the OpenAI Chat Completions API cannot carry image or audio +// content directly — the SDK's content union only accepts text. When a tool +// returns media, ToPromptFunc must still emit a text tool message so the +// tool_call/tool_result pairing stays valid, and attach the media to a +// synthetic follow-up user message so vision- and audio-capable models can see +// it. +// +// These tests guard against regressions of charmbracelet/fantasy#208, where +// the openaicompat provider silently dropped tool results carrying +// ToolResultOutputContentMedia. + +func TestToPromptFunc_MediaToolResult_ImagePNG(t *testing.T) { + t.Parallel() + + imageData := base64.StdEncoding.EncodeToString([]byte{0, 1, 2, 3}) + prompt := fantasy.Prompt{ + { + Role: fantasy.MessageRoleAssistant, + Content: []fantasy.MessagePart{ + fantasy.ToolCallPart{ToolCallID: "img-1", ToolName: "view", Input: "{}"}, + }, + }, + { + Role: fantasy.MessageRoleTool, + Content: []fantasy.MessagePart{ + fantasy.ToolResultPart{ + ToolCallID: "img-1", + Output: fantasy.ToolResultOutputContentMedia{ + Data: imageData, + MediaType: "image/png", + }, + }, + }, + }, + } + + messages, warnings := ToPromptFunc(prompt, "", "") + + require.Empty(t, warnings) + // Assistant tool call + text tool message + synthetic user image message. + require.Len(t, messages, 3) + + toolMsg := messages[1].OfTool + require.NotNil(t, toolMsg) + require.Equal(t, "img-1", toolMsg.ToolCallID) + require.Contains(t, toolMsg.Content.OfString.Value, "image/png") + + userMsg := messages[2].OfUser + require.NotNil(t, userMsg) + require.Len(t, userMsg.Content.OfArrayOfContentParts, 1) + imagePart := userMsg.Content.OfArrayOfContentParts[0].OfImageURL + require.NotNil(t, imagePart) + require.Equal(t, "data:image/png;base64,"+imageData, imagePart.ImageURL.URL) +} + +func TestToPromptFunc_MediaToolResult_PrefersAccompanyingText(t *testing.T) { + t.Parallel() + + imageData := base64.StdEncoding.EncodeToString([]byte{9, 9, 9}) + prompt := fantasy.Prompt{ + { + Role: fantasy.MessageRoleAssistant, + Content: []fantasy.MessagePart{ + fantasy.ToolCallPart{ToolCallID: "img-2", ToolName: "view", Input: "{}"}, + }, + }, + { + Role: fantasy.MessageRoleTool, + Content: []fantasy.MessagePart{ + fantasy.ToolResultPart{ + ToolCallID: "img-2", + Output: fantasy.ToolResultOutputContentMedia{ + Data: imageData, + MediaType: "image/jpeg", + Text: "Screenshot of the blockquote element.", + }, + }, + }, + }, + } + + messages, warnings := ToPromptFunc(prompt, "", "") + + require.Empty(t, warnings) + require.Len(t, messages, 3) + require.Equal(t, "Screenshot of the blockquote element.", messages[1].OfTool.Content.OfString.Value) +} + +func TestToPromptFunc_MediaToolResult_AudioWAV(t *testing.T) { + t.Parallel() + + audio := base64.StdEncoding.EncodeToString([]byte("fake-wav-bytes")) + prompt := fantasy.Prompt{ + { + Role: fantasy.MessageRoleAssistant, + Content: []fantasy.MessagePart{ + fantasy.ToolCallPart{ToolCallID: "audio-1", ToolName: "record", Input: "{}"}, + }, + }, + { + Role: fantasy.MessageRoleTool, + Content: []fantasy.MessagePart{ + fantasy.ToolResultPart{ + ToolCallID: "audio-1", + Output: fantasy.ToolResultOutputContentMedia{ + Data: audio, + MediaType: "audio/wav", + }, + }, + }, + }, + } + + messages, warnings := ToPromptFunc(prompt, "", "") + + require.Empty(t, warnings) + require.Len(t, messages, 3) + require.NotNil(t, messages[1].OfTool) + userMsg := messages[2].OfUser + require.NotNil(t, userMsg) + require.Len(t, userMsg.Content.OfArrayOfContentParts, 1) + audioPart := userMsg.Content.OfArrayOfContentParts[0].OfInputAudio + require.NotNil(t, audioPart) + require.Equal(t, audio, audioPart.InputAudio.Data) + require.Equal(t, "wav", audioPart.InputAudio.Format) +} + +func TestToPromptFunc_MediaToolResult_AudioMP3(t *testing.T) { + t.Parallel() + + audio := base64.StdEncoding.EncodeToString([]byte("fake-mp3-bytes")) + prompt := fantasy.Prompt{ + { + Role: fantasy.MessageRoleAssistant, + Content: []fantasy.MessagePart{ + fantasy.ToolCallPart{ToolCallID: "audio-2", ToolName: "record", Input: "{}"}, + }, + }, + { + Role: fantasy.MessageRoleTool, + Content: []fantasy.MessagePart{ + fantasy.ToolResultPart{ + ToolCallID: "audio-2", + Output: fantasy.ToolResultOutputContentMedia{ + Data: audio, + MediaType: "audio/mpeg", + }, + }, + }, + }, + } + + messages, warnings := ToPromptFunc(prompt, "", "") + + require.Empty(t, warnings) + require.Len(t, messages, 3) + require.NotNil(t, messages[1].OfTool) + userMsg := messages[2].OfUser + require.NotNil(t, userMsg) + require.Len(t, userMsg.Content.OfArrayOfContentParts, 1) + audioPart := userMsg.Content.OfArrayOfContentParts[0].OfInputAudio + require.NotNil(t, audioPart) + require.Equal(t, audio, audioPart.InputAudio.Data) + require.Equal(t, "mp3", audioPart.InputAudio.Format) +} + +func TestToPromptFunc_MediaToolResult_UnsupportedMediaType(t *testing.T) { + t.Parallel() + + prompt := fantasy.Prompt{ + { + Role: fantasy.MessageRoleAssistant, + Content: []fantasy.MessagePart{ + fantasy.ToolCallPart{ToolCallID: "vid-1", ToolName: "record", Input: "{}"}, + }, + }, + { + Role: fantasy.MessageRoleTool, + Content: []fantasy.MessagePart{ + fantasy.ToolResultPart{ + ToolCallID: "vid-1", + Output: fantasy.ToolResultOutputContentMedia{ + Data: "AAAA", + MediaType: "video/mp4", + }, + }, + }, + }, + } + + messages, warnings := ToPromptFunc(prompt, "", "") + + // Assistant tool call + text tool message, but no synthetic user image. + require.Len(t, messages, 2) + require.NotNil(t, messages[1].OfTool) + require.Equal(t, "vid-1", messages[1].OfTool.ToolCallID) + require.Len(t, warnings, 1) + require.Contains(t, warnings[0].Message, "video/mp4") +} From 7ee11fd46902113706c2fa9f6e541df439602e76 Mon Sep 17 00:00:00 2001 From: Chris Brown Date: Fri, 31 Jul 2026 09:06:46 -0500 Subject: [PATCH 062/156] fix(openai): classify in-band SSE stream errors for retry (#319) Co-authored-by: Evelyn Osman (Ashex) Co-authored-by: Kieran Klukas --- errors.go | 34 ++++++++- providers/anthropic/anthropic_test.go | 13 +++- providers/anthropic/error.go | 65 +++++++++++++++- providers/anthropic/error_test.go | 83 ++++++++++++++++++++ providers/openai/error.go | 36 +++++++++ providers/openai/error_test.go | 106 ++++++++++++++++++++++++++ 6 files changed, 330 insertions(+), 7 deletions(-) diff --git a/errors.go b/errors.go index 25cd84f63..d7861fc13 100644 --- a/errors.go +++ b/errors.go @@ -51,6 +51,12 @@ type ProviderError struct { // interactive login). It covers auth failures that do not carry an HTTP // 401 status, so a caller-supplied OnAuthRefresh hook still engages. AuthError bool + + // TransientError marks a temporary server-side failure worth retrying + // despite carrying no retryable HTTP status code. Mid-stream SSE error + // events ride inside an already-successful 200 response, so the status + // code alone cannot signal that a retry may succeed. + TransientError bool } func (m *ProviderError) Error() string { @@ -67,11 +73,15 @@ func (m *ProviderError) Unwrap() error { } // IsRetryable reports whether the error should be retried. -// It returns true if the underlying cause is io.ErrUnexpectedEOF, if the -// "x-should-retry" response header evaluates to true, if the HTTP status -// code indicates a retryable condition (408, 409, 429, or any 5xx), or -// if the cause is a transient HTTP/2 transport error. +// It returns true if the error is flagged as transient, if the underlying +// cause is io.ErrUnexpectedEOF, if the "x-should-retry" response header +// evaluates to true, if the HTTP status code indicates a retryable +// condition (408, 409, 429, or any 5xx), or if the cause is a transient +// HTTP/2 transport error. func (m *ProviderError) IsRetryable() bool { + if m.TransientError { + return true + } // We're mostly mimicking OpenAI's Go SDK here: // https://github.com/openai/openai-go/blob/b9d280a37149430982e9dfeed16c41d27d45cfc5/internal/requestconfig/requestconfig.go#L244 if errors.Is(m.Cause, io.ErrUnexpectedEOF) { @@ -175,6 +185,22 @@ func NewTransportError(err error) *ProviderError { } } +// TransientStreamErrorTypes are provider error "type" (or "code") values +// that name a temporary server-side condition worth retrying. Mid-stream +// SSE error events ride inside an already-successful 200 response, so the +// HTTP status code cannot signal retryability; providers classify the +// payload against this set and set ProviderError.TransientError. +// +// This is the canonical list. Providers parse their SDK-specific error +// shapes but defer the transient/permanent policy decision here. +var TransientStreamErrorTypes = map[string]bool{ + "server_error": true, + "internal_error": true, + "overloaded_error": true, + "api_error": true, + "rate_limit_error": true, +} + // WrapTransportError wraps a transient transport failure in a retryable // ProviderError so callers get a clean message and .IsRetryable() reports // true. It recognizes an unexpected mid-stream EOF and HTTP/2 stream, diff --git a/providers/anthropic/anthropic_test.go b/providers/anthropic/anthropic_test.go index c4854be99..cfd2a38e5 100644 --- a/providers/anthropic/anthropic_test.go +++ b/providers/anthropic/anthropic_test.go @@ -921,12 +921,22 @@ func TestStream_RequiresMessageStopBeforeFinish(t *testing.T) { wantRetryable: true, }, { - name: "provider error event is preserved", + // api_error is a temporary provider-side fault, so it is worth + // retrying even though it arrived inside a 200 response. + name: "provider error event is preserved and retried", chunks: []string{ anthropicSSEEvent("error", `{"type":"error","error":{"type":"api_error","message":"stream down"}}`), }, + wantRetryable: true, wantErrContain: "stream down", }, + { + name: "permanent error event is not retried", + chunks: []string{ + anthropicSSEEvent("error", `{"type":"error","error":{"type":"invalid_request_error","message":"bad request"}}`), + }, + wantErrContain: "bad request", + }, } for _, tt := range tests { @@ -978,7 +988,6 @@ func TestStream_RequiresMessageStopBeforeFinish(t *testing.T) { if tt.wantRetryable { require.ErrorAs(t, errorParts[0].Error, &providerErr) require.True(t, providerErr.IsRetryable()) - require.ErrorIs(t, providerErr.Cause, io.ErrUnexpectedEOF) } else { require.NotErrorIs(t, errorParts[0].Error, io.ErrUnexpectedEOF) if errors.As(errorParts[0].Error, &providerErr) { diff --git a/providers/anthropic/error.go b/providers/anthropic/error.go index b1a7e6dd9..293c3c271 100644 --- a/providers/anthropic/error.go +++ b/providers/anthropic/error.go @@ -2,6 +2,7 @@ package anthropic import ( "cmp" + "encoding/json" "errors" "net/http" "regexp" @@ -48,10 +49,72 @@ func toProviderErr(err error) error { AuthError: true, } } - // Wrap transient transport failures so `.IsRetryable()` works. + // Wrap transient failures so `.IsRetryable()` works: mid-stream error + // events first, then transport-level failures. + if wrapped := wrapStreamError(err); wrapped != nil { + return wrapped + } return fantasy.WrapTransportError(err) } +// streamErrorPrefix is the message prefix the Anthropic SDK uses for a +// mid-stream `error` event. The SDK reports it via fmt.Errorf with no +// exported type, so we match the prefix and parse the payload ourselves. +const streamErrorPrefix = "received error while streaming:" + +// streamErrorEnvelope is the payload of an SSE `error` event. Anthropic +// nests the useful detail under "error"; the outer "type" is always the +// literal "error" and carries no classification value. +type streamErrorEnvelope struct { + Error *struct { + Type string `json:"type"` + Message string `json:"message"` + } `json:"error"` +} + +// wrapStreamError classifies a mid-stream SSE error event as a +// ProviderError, marking it transient when the payload names a temporary +// server-side condition. Returns nil if err is not a stream error event. +func wrapStreamError(err error) *fantasy.ProviderError { + _, payload, ok := strings.Cut(err.Error(), streamErrorPrefix) + if !ok { + return nil + } + payload = strings.TrimSpace(payload) + + var envelope streamErrorEnvelope + errType, message := "", "" + if json.Unmarshal([]byte(payload), &envelope) == nil && envelope.Error != nil { + errType = envelope.Error.Type + message = envelope.Error.Message + } + if errType == "" && message == "" { + // Nothing recognizable: let it fall through to transport handling. + return nil + } + + return &fantasy.ProviderError{ + Title: streamErrorTitle(errType), + Message: cmp.Or(message, payload), + Cause: err, + ResponseBody: []byte(payload), + TransientError: fantasy.TransientStreamErrorTypes[errType], + } +} + +func streamErrorTitle(errType string) string { + switch errType { + case "overloaded_error": + return "provider overloaded" + case "rate_limit_error": + return "rate limit exceeded" + case "": + return "provider stream error" + default: + return strings.ReplaceAll(errType, "_", " ") + } +} + func parseContextTooLargeError(message string, providerErr *fantasy.ProviderError) { matches := anthropicContextPattern.FindStringSubmatch(message) if matches == nil { diff --git a/providers/anthropic/error_test.go b/providers/anthropic/error_test.go index 7fdf25ac3..02a897bd5 100644 --- a/providers/anthropic/error_test.go +++ b/providers/anthropic/error_test.go @@ -91,3 +91,86 @@ func TestToProviderErr_FlagsExpiredBedrockCredentials(t *testing.T) { }) } } + +// A mid-stream SSE error event rides inside a 200 response, so only the +// payload marks the failure as temporary. +func TestToProviderErr_RetriesMidStreamOverload(t *testing.T) { + t.Parallel() + + err := errors.New(`received error while streaming: {"type":"error","error":{"details":null,"type":"overloaded_error","message":"Overloaded"}}`) + + var providerErr *fantasy.ProviderError + if !errors.As(toProviderErr(err), &providerErr) { + t.Fatalf("toProviderErr did not wrap %v as *fantasy.ProviderError", err) + } + if !providerErr.IsRetryable() { + t.Error("a mid-stream overload must be retryable so the step is re-run") + } + if !providerErr.TransientError { + t.Error("TransientError must be set for a transient stream error") + } + if providerErr.StatusCode != 0 { + t.Errorf("StatusCode = %d, want 0 (no HTTP status was returned)", providerErr.StatusCode) + } + if providerErr.Title != "provider overloaded" { + t.Errorf("Title = %q, want %q", providerErr.Title, "provider overloaded") + } + if providerErr.Message != "Overloaded" { + t.Errorf("Message = %q, want %q", providerErr.Message, "Overloaded") + } + if !errors.Is(providerErr.Cause, err) { + t.Error("Cause chain must include the original error") + } +} + +func TestToProviderErr_StreamErrorTransientTypes(t *testing.T) { + t.Parallel() + + for _, errType := range []string{"overloaded_error", "api_error", "server_error", "internal_error", "rate_limit_error"} { + t.Run(errType, func(t *testing.T) { + t.Parallel() + + err := errors.New(`received error while streaming: {"type":"error","error":{"type":"` + errType + `","message":"transient"}}`) + + var providerErr *fantasy.ProviderError + if !errors.As(toProviderErr(err), &providerErr) { + t.Fatalf("toProviderErr did not wrap %v as *fantasy.ProviderError", err) + } + if !providerErr.IsRetryable() { + t.Errorf("%s stream failure must be retryable", errType) + } + }) + } +} + +func TestToProviderErr_PermanentStreamErrorNotRetried(t *testing.T) { + t.Parallel() + + err := errors.New(`received error while streaming: {"type":"error","error":{"type":"invalid_request_error","message":"bad tool schema"}}`) + + var providerErr *fantasy.ProviderError + if !errors.As(toProviderErr(err), &providerErr) { + t.Fatalf("toProviderErr did not wrap %v as *fantasy.ProviderError", err) + } + if providerErr.IsRetryable() { + t.Error("a permanent stream error type must not be retryable") + } + if providerErr.Message != "bad tool schema" { + t.Errorf("Message = %q, want %q", providerErr.Message, "bad tool schema") + } +} + +func TestToProviderErr_StreamErrorWrappedByOuterError(t *testing.T) { + t.Parallel() + + inner := errors.New(`received error while streaming: {"type":"error","error":{"type":"overloaded_error","message":"Overloaded"}}`) + err := fmt.Errorf("anthropic: %w", inner) + + var providerErr *fantasy.ProviderError + if !errors.As(toProviderErr(err), &providerErr) { + t.Fatalf("toProviderErr did not wrap %v as *fantasy.ProviderError", err) + } + if !providerErr.IsRetryable() { + t.Error("a wrapped mid-stream overload must still be retryable") + } +} diff --git a/providers/openai/error.go b/providers/openai/error.go index 582d21a84..7b688c942 100644 --- a/providers/openai/error.go +++ b/providers/openai/error.go @@ -2,6 +2,7 @@ package openai import ( "cmp" + "encoding/json" "errors" "io" "net/http" @@ -11,6 +12,7 @@ import ( "charm.land/fantasy" "github.com/openai/openai-go/v3" + "github.com/openai/openai-go/v3/packages/ssestream" ) var ( @@ -38,10 +40,44 @@ func toProviderErr(err error) error { return providerErr } + + // Mid-stream SSE error events surface as *ssestream.StreamError, not + // *openai.Error, so they need their own classification path. + var streamErr *ssestream.StreamError + if errors.As(err, &streamErr) { + return toProviderErrFromStreamError(streamErr) + } + // Wrap transient transport failures so `.IsRetryable()` works. return fantasy.WrapTransportError(err) } +// streamErrorEnvelope mirrors the OpenAI-standard error envelope +// (`{"error": {"code", "message", "type"}}`) that arrives as an in-band +// SSE event on stream failure. +type streamErrorEnvelope struct { + Error struct { + Code string `json:"code"` + Message string `json:"message"` + Type string `json:"type"` + } `json:"error"` +} + +func toProviderErrFromStreamError(streamErr *ssestream.StreamError) *fantasy.ProviderError { + var envelope streamErrorEnvelope + _ = json.Unmarshal(streamErr.Event.Data, &envelope) // best-effort; falls back to the raw message on parse failure. + + errType := cmp.Or(envelope.Error.Type, envelope.Error.Code) + + return &fantasy.ProviderError{ + Title: "stream error", + Message: cmp.Or(envelope.Error.Message, streamErr.Message), + Cause: streamErr, + ResponseBody: streamErr.Event.Data, + TransientError: fantasy.TransientStreamErrorTypes[errType], + } +} + func parseContextTooLargeError(message string, providerErr *fantasy.ProviderError) { if matches := openaiContextPattern.FindStringSubmatch(message); matches != nil { providerErr.ContextTooLargeErr = true diff --git a/providers/openai/error_test.go b/providers/openai/error_test.go index 2914f8501..01a8e31f6 100644 --- a/providers/openai/error_test.go +++ b/providers/openai/error_test.go @@ -7,6 +7,7 @@ import ( "testing" "charm.land/fantasy" + "github.com/openai/openai-go/v3/packages/ssestream" ) func TestToProviderErr_WrapsUnexpectedEOF(t *testing.T) { @@ -61,3 +62,108 @@ func TestToProviderErr_PassesThroughPlainEOF(t *testing.T) { t.Errorf("toProviderErr wrapped io.EOF as ProviderError; should pass through") } } + +// A mid-stream in-band SSE error event must be classified as retryable when +// it reports a transient server_error, otherwise it skips retry.go entirely. +func TestToProviderErr_StreamErrorServerErrorIsRetryable(t *testing.T) { + t.Parallel() + + streamErr := &ssestream.StreamError{ + Message: `received error while streaming: {"message":"Streaming response failed","type":"server_error","param":null,"code":"server_error"}`, + Event: ssestream.Event{ + Data: []byte(`{"error":{"message":"Streaming response failed","type":"server_error","param":null,"code":"server_error"}}`), + }, + } + + got := toProviderErr(streamErr) + + var providerErr *fantasy.ProviderError + if !errors.As(got, &providerErr) { + t.Fatalf("toProviderErr did not wrap StreamError as *fantasy.ProviderError (got %T)", got) + } + if !providerErr.IsRetryable() { + t.Error("server_error stream failure must be retryable so retry.go engages") + } + if !providerErr.TransientError { + t.Error("TransientError must be set for a transient stream error") + } + if providerErr.StatusCode != 0 { + t.Errorf("StatusCode = %d, want 0 (no HTTP status was returned)", providerErr.StatusCode) + } + if providerErr.Message != "Streaming response failed" { + t.Errorf("Message = %q, want the parsed error body message", providerErr.Message) + } + if !errors.Is(providerErr.Cause, streamErr) { + t.Errorf("Cause chain must include the original *ssestream.StreamError") + } +} + +func TestToProviderErr_StreamErrorTransientTypes(t *testing.T) { + t.Parallel() + + for _, errType := range []string{"server_error", "internal_error", "overloaded_error", "api_error", "rate_limit_error"} { + t.Run(errType, func(t *testing.T) { + t.Parallel() + + streamErr := &ssestream.StreamError{ + Message: "received error while streaming: ...", + Event: ssestream.Event{ + Data: []byte(`{"error":{"message":"transient","type":"` + errType + `"}}`), + }, + } + + got := toProviderErr(streamErr) + + var providerErr *fantasy.ProviderError + if !errors.As(got, &providerErr) { + t.Fatalf("toProviderErr did not wrap StreamError (got %T)", got) + } + if !providerErr.IsRetryable() { + t.Errorf("%s stream failure must be retryable", errType) + } + }) + } +} + +func TestToProviderErr_StreamErrorUnknownTypeIsNotRetryable(t *testing.T) { + t.Parallel() + + streamErr := &ssestream.StreamError{ + Message: `received error while streaming: {"message":"bad request","type":"invalid_request_error","param":null,"code":"invalid_request_error"}`, + Event: ssestream.Event{ + Data: []byte(`{"error":{"message":"bad request","type":"invalid_request_error","param":null,"code":"invalid_request_error"}}`), + }, + } + + got := toProviderErr(streamErr) + + var providerErr *fantasy.ProviderError + if !errors.As(got, &providerErr) { + t.Fatalf("toProviderErr did not wrap StreamError as *fantasy.ProviderError (got %T)", got) + } + if providerErr.IsRetryable() { + t.Error("a non-transient stream error type must not be retryable") + } +} + +func TestToProviderErr_StreamErrorMalformedBodyFallsBackToRawMessage(t *testing.T) { + t.Parallel() + + streamErr := &ssestream.StreamError{ + Message: "received error while streaming: not json", + Event: ssestream.Event{Data: []byte("not json")}, + } + + got := toProviderErr(streamErr) + + var providerErr *fantasy.ProviderError + if !errors.As(got, &providerErr) { + t.Fatalf("toProviderErr did not wrap StreamError as *fantasy.ProviderError (got %T)", got) + } + if providerErr.Message != streamErr.Message { + t.Errorf("Message = %q, want fallback to raw StreamError.Message %q", providerErr.Message, streamErr.Message) + } + if providerErr.IsRetryable() { + t.Error("unparseable stream error body must not be assumed retryable") + } +} From c8247d53d4f7a9a85c54cae9e40e229b3206af00 Mon Sep 17 00:00:00 2001 From: Kieran Klukas Date: Fri, 31 Jul 2026 07:07:03 -0700 Subject: [PATCH 063/156] fix(agent): convert tool panics into failed tool results (#325) --- agent.go | 27 ++++++++++++- agent_test.go | 109 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 134 insertions(+), 2 deletions(-) diff --git a/agent.go b/agent.go index b86a2727b..9626092bf 100644 --- a/agent.go +++ b/agent.go @@ -8,6 +8,7 @@ import ( "errors" "fmt" "maps" + "runtime/debug" "slices" "strings" "sync" @@ -813,8 +814,11 @@ func (a *agent) executeSingleTool(ctx context.Context, toolMap map[string]AgentT return result, false } - // Execute the tool - toolResult, err := runTool(ctx, ToolCall{ + // Execute the tool, converting a panic into a failed tool result so a + // single misbehaving tool cannot take down the whole process. The panic + // value and stack are included so they survive in the transcript even + // when stderr is lost. + toolResult, err := runToolSafely(ctx, runTool, ToolCall{ ID: toolCall.ToolCallID, Name: toolCall.ToolName, Input: toolCall.Input, @@ -854,6 +858,25 @@ func (a *agent) executeSingleTool(ctx context.Context, toolMap map[string]AgentT return result, false } +// runToolSafely invokes a tool's run function and converts any panic into a +// failed tool result. Tool implementations run on goroutines spawned by the +// agent's step processor where an unrecovered panic would crash the entire +// host process, so this boundary is the last line of defense. The panic +// value and stack trace are captured in the returned error so they are +// preserved in the conversation transcript and any persisted logs. +func runToolSafely(ctx context.Context, runTool func(ctx context.Context, call ToolCall) (ToolResponse, error), call ToolCall) (toolResult ToolResponse, err error) { + defer func() { + if r := recover(); r != nil { + stack := debug.Stack() + toolResult = NewTextErrorResponse(fmt.Sprintf( + "tool %q panicked: %v\n\n%s", call.Name, r, stack, + )) + err = nil + } + }() + return runTool(ctx, call) +} + // Stream implements Agent. func (a *agent) Stream(ctx context.Context, opts AgentStreamCall) (*AgentResult, error) { // Convert AgentStreamCall to AgentCall for preparation diff --git a/agent_test.go b/agent_test.go index f42008a1a..bcc7e394f 100644 --- a/agent_test.go +++ b/agent_test.go @@ -2722,3 +2722,112 @@ func TestAgent_Generate_StopTurn_NotSet(t *testing.T) { require.Len(t, toolResults, 1) require.False(t, toolResults[0].StopTurn) } + +func TestAgent_Generate_ToolPanicBecomesFailedResult(t *testing.T) { + t.Parallel() + + type PanicInput struct { + Value string `json:"value" description:"Test value"` + } + + panickingTool := NewAgentTool( + "panicking_tool", + "A tool that always panics", + func(ctx context.Context, input PanicInput, _ ToolCall) (ToolResponse, error) { + panic("nil pointer in tool implementation") + }, + ) + + model := &mockLanguageModel{ + generateFunc: func(ctx context.Context, call Call) (*Response, error) { + return &Response{ + Content: []Content{ + ToolCallContent{ + ToolCallID: "call-panic", + ToolName: "panicking_tool", + Input: `{"value":"boom"}`, + }, + }, + Usage: Usage{InputTokens: 3, OutputTokens: 10, TotalTokens: 13}, + FinishReason: FinishReasonStop, + }, nil + }, + } + + agent := NewAgent(model, WithTools(panickingTool)) + result, err := agent.Generate(context.Background(), AgentCall{ + Prompt: "test-input", + }) + + // The process must survive the panic and surface it as a failed tool + // result instead. + require.NoError(t, err) + require.NotNil(t, result) + + var toolResults []ToolResultContent + for _, content := range result.Response.Content { + if toolResult, ok := AsContentType[ToolResultContent](content); ok { + toolResults = append(toolResults, toolResult) + } + } + require.Len(t, toolResults, 1) + require.Equal(t, "call-panic", toolResults[0].ToolCallID) + + errResult, ok := toolResults[0].Result.(ToolResultOutputContentError) + require.True(t, ok, "expected error result, got %T", toolResults[0].Result) + require.ErrorContains(t, errResult.Error, "panicking_tool") + require.ErrorContains(t, errResult.Error, "nil pointer in tool implementation") +} + +func TestAgent_Generate_ParallelToolPanicBecomesFailedResult(t *testing.T) { + t.Parallel() + + type PanicInput struct { + Value string `json:"value" description:"Test value"` + } + + panickingTool := NewParallelAgentTool( + "panicking_parallel_tool", + "A parallel tool that always panics", + func(ctx context.Context, input PanicInput, _ ToolCall) (ToolResponse, error) { + panic("parallel boom") + }, + ) + + model := &mockLanguageModel{ + generateFunc: func(ctx context.Context, call Call) (*Response, error) { + return &Response{ + Content: []Content{ + ToolCallContent{ + ToolCallID: "call-parallel-panic", + ToolName: "panicking_parallel_tool", + Input: `{"value":"boom"}`, + }, + }, + Usage: Usage{InputTokens: 3, OutputTokens: 10, TotalTokens: 13}, + FinishReason: FinishReasonStop, + }, nil + }, + } + + agent := NewAgent(model, WithTools(panickingTool)) + result, err := agent.Generate(context.Background(), AgentCall{ + Prompt: "test-input", + }) + + require.NoError(t, err) + require.NotNil(t, result) + + var toolResults []ToolResultContent + for _, content := range result.Response.Content { + if toolResult, ok := AsContentType[ToolResultContent](content); ok { + toolResults = append(toolResults, toolResult) + } + } + require.Len(t, toolResults, 1) + + errResult, ok := toolResults[0].Result.(ToolResultOutputContentError) + require.True(t, ok, "expected error result, got %T", toolResults[0].Result) + require.ErrorContains(t, errResult.Error, "panicking_parallel_tool") + require.ErrorContains(t, errResult.Error, "parallel boom") +} From 6e4c7f80ef561fdd1e1da448f6c663fb6a2a390b Mon Sep 17 00:00:00 2001 From: Kieran Klukas Date: Fri, 31 Jul 2026 10:19:57 -0400 Subject: [PATCH 064/156] v0.39.0 --- version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.txt b/version.txt index f2e78d495..4ef2eb086 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -0.38.2 +0.39.0 From 7f214efb48b84b97258dac2e4fc57f5eac96c546 Mon Sep 17 00:00:00 2001 From: Kieran Klukas Date: Fri, 31 Jul 2026 11:44:11 -0400 Subject: [PATCH 065/156] feat: add the bedrock specific refusals --- providers/anthropic/anthropic.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/providers/anthropic/anthropic.go b/providers/anthropic/anthropic.go index 007a4edbf..96c92f2c0 100644 --- a/providers/anthropic/anthropic.go +++ b/providers/anthropic/anthropic.go @@ -1272,7 +1272,10 @@ func mapFinishReason(finishReason string) fantasy.FinishReason { return fantasy.FinishReasonLength case "tool_use": return fantasy.FinishReasonToolCalls - case "refusal": + case "refusal", "content_filtered", "guardrail_intervened": + // "refusal" is the native Anthropic safety stop. Bedrock + // reports guardrail / content-filter blocks with its own + // stop reasons instead, so map those here too. return fantasy.FinishReasonContentFilter default: return fantasy.FinishReasonUnknown From 58d4a10d9e1a817efb24c4631ce5ac0d91be7bd9 Mon Sep 17 00:00:00 2001 From: Kieran Klukas Date: Fri, 31 Jul 2026 12:04:52 -0400 Subject: [PATCH 066/156] v0.40.0 --- version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.txt b/version.txt index 4ef2eb086..9b0025a78 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -0.39.0 +0.40.0 From f044a42e0dc0ed43e076d893498716734ca1a74e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Aug 2026 09:15:28 +0000 Subject: [PATCH 067/156] chore(deps): bump the all group with 3 updates (#328) Bumps the all group with 3 updates: [github.com/kaptinlin/jsonschema](https://github.com/kaptinlin/jsonschema), [github.com/openai/openai-go/v3](https://github.com/openai/openai-go) and [google.golang.org/genai](https://github.com/googleapis/go-genai). Updates `github.com/kaptinlin/jsonschema` from 0.9.3 to 0.9.6 - [Release notes](https://github.com/kaptinlin/jsonschema/releases) - [Commits](https://github.com/kaptinlin/jsonschema/compare/v0.9.3...v0.9.6) Updates `github.com/openai/openai-go/v3` from 3.46.0 to 3.48.0 - [Release notes](https://github.com/openai/openai-go/releases) - [Changelog](https://github.com/openai/openai-go/blob/main/CHANGELOG.md) - [Commits](https://github.com/openai/openai-go/compare/v3.46.0...v3.48.0) Updates `google.golang.org/genai` from 1.65.0 to 1.66.0 - [Release notes](https://github.com/googleapis/go-genai/releases) - [Changelog](https://github.com/googleapis/go-genai/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/go-genai/compare/v1.65.0...v1.66.0) --- updated-dependencies: - dependency-name: github.com/kaptinlin/jsonschema dependency-version: 0.9.6 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all - dependency-name: github.com/openai/openai-go/v3 dependency-version: 3.48.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: all - dependency-name: google.golang.org/genai dependency-version: 1.66.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: all ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 8 ++++---- go.sum | 16 ++++++++-------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/go.mod b/go.mod index 219eebcf4..8a0bc2d0e 100644 --- a/go.mod +++ b/go.mod @@ -16,12 +16,12 @@ require ( github.com/go-viper/mapstructure/v2 v2.5.0 github.com/google/uuid v1.6.0 github.com/joho/godotenv v1.5.1 - github.com/kaptinlin/jsonschema v0.9.3 - github.com/openai/openai-go/v3 v3.46.0 + github.com/kaptinlin/jsonschema v0.9.6 + github.com/openai/openai-go/v3 v3.48.0 github.com/stretchr/testify v1.11.1 golang.org/x/net v0.57.0 golang.org/x/oauth2 v0.36.0 - google.golang.org/genai v1.65.0 + google.golang.org/genai v1.66.0 ) require ( @@ -80,7 +80,7 @@ require ( github.com/hashicorp/go-version v1.9.0 // indirect github.com/hybridgroup/yzma v1.21.0 // indirect github.com/jupiterrider/ffi v0.7.0 // indirect - github.com/kaptinlin/jsonpointer v0.4.27 // indirect + github.com/kaptinlin/jsonpointer v0.4.28 // indirect github.com/klauspost/compress v1.19.1 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect diff --git a/go.sum b/go.sum index b22013caf..3d2308866 100644 --- a/go.sum +++ b/go.sum @@ -159,10 +159,10 @@ github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= github.com/jupiterrider/ffi v0.7.0 h1:RKsl6Ascal+3kyAqR5Qcbp83LceQMLc1VZbPfHWoNzs= github.com/jupiterrider/ffi v0.7.0/go.mod h1:9dauhpOfNqrqk28fxuu0kkdeFtT9Qr4vbfigiuIXN7c= -github.com/kaptinlin/jsonpointer v0.4.27 h1:5FOnhlkqQ4/lvHudaAWS8HJCXjN4yAHSIGl7aPKHI0Q= -github.com/kaptinlin/jsonpointer v0.4.27/go.mod h1:dfub/n58cWS32Dyf3AZsnKblSAgrz9PyOU76GDPpx8Q= -github.com/kaptinlin/jsonschema v0.9.3 h1:uDVd3w4aXwO0tbycblKYvFofhl3hVuE31vOl5JkDXI0= -github.com/kaptinlin/jsonschema v0.9.3/go.mod h1:LvtQ/mO0E1e/3c3DiOWTj05LTeot8cTv7DyQq7eJMQg= +github.com/kaptinlin/jsonpointer v0.4.28 h1:PyxOfdml9PGpxQz+JnNLGsyzQ+Rnm+OVNTGcgbVLqgg= +github.com/kaptinlin/jsonpointer v0.4.28/go.mod h1:JzeIDw1+60bryzOFea9P3zjKg8pfJHd+UIA/zfZ70x8= +github.com/kaptinlin/jsonschema v0.9.6 h1:RNqurZUqduQm+mINsCFbRzBQR0uKbAcRPBj3BqRA/I8= +github.com/kaptinlin/jsonschema v0.9.6/go.mod h1:TP7RFmFBNExjBE0b3fsM6RpA/9PeOzfg2g4weXqOrDg= github.com/klauspost/compress v1.19.1 h1:VsB4HPswih7mmZ8WleSFQ75c/Ui1M4trX5oAsJnhSlk= github.com/klauspost/compress v1.19.1/go.mod h1:cwPg85FWrGar70rWktvGQj8/hthj3wpl0PGDogxkrSQ= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= @@ -175,8 +175,8 @@ github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/openai/openai-go/v3 v3.46.0 h1:9HzL4DOybwOHAAcsGpMQyELuw0e9OqynJOPV8SH8g5M= -github.com/openai/openai-go/v3 v3.46.0/go.mod h1:b8MgNMpR3lPifYnaOH8XwcG8qRHwhzZxuDgM9lL7h5k= +github.com/openai/openai-go/v3 v3.48.0 h1:HRVBn6UEP4qzGK2c6UWAZ0mdFf6yODNWTJ4ywLIyDpQ= +github.com/openai/openai-go/v3 v3.48.0/go.mod h1:nCqcbgPr2jYDV8wiCWPA2tRL56mWXdb6QavBmBwzSis= github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ= github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU= github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= @@ -263,8 +263,8 @@ gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4= gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E= google.golang.org/api v0.291.0 h1:wfPbbY+mr9c7wZLqqzrHJLft/q8iFKREd6IgTBUene0= google.golang.org/api v0.291.0/go.mod h1:at7kwWbuonglBFEBoeMDAV1bguHqL3qf0BHFsv3coa0= -google.golang.org/genai v1.65.0 h1:6QK3Rjsx0iuJjbDCE1vf1VUr1IEjRDpvexGGnhxoAIk= -google.golang.org/genai v1.65.0/go.mod h1:mDdPDFXo1Ats7f1WXVyZgWb/CkMzFWTWJruIMy7hGIU= +google.golang.org/genai v1.66.0 h1:njWPPscy3l6rqBnYhFz3YCeLOVvZrzteTVTYOhxxcZc= +google.golang.org/genai v1.66.0/go.mod h1:mDdPDFXo1Ats7f1WXVyZgWb/CkMzFWTWJruIMy7hGIU= google.golang.org/genproto v0.0.0-20260729162451-8efbd57d26e0 h1:xJf8e9ReUqiexuIT3OWJkvA4RdgR8K4Hfheq8gaKxIM= google.golang.org/genproto v0.0.0-20260729162451-8efbd57d26e0/go.mod h1:0MNk3ibJAyOwDZVlp18knQe3jRyFxpcU06xjxhgjx0M= google.golang.org/genproto/googleapis/api v0.0.0-20260729162451-8efbd57d26e0 h1:ybvH/ZpOcpCrjtkb7oW/fdlzbEmRVeumw19SRQmNFKU= From 042aafc20804916eef9b81523c3a3b570b0e6fbd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 10 Aug 2026 09:16:53 +0000 Subject: [PATCH 068/156] chore(deps): bump the all group with 6 updates (#334) Bumps the all group with 6 updates: | Package | From | To | | --- | --- | --- | | [github.com/aws/aws-sdk-go-v2](https://github.com/aws/aws-sdk-go-v2) | `1.43.2` | `1.43.4` | | [github.com/aws/aws-sdk-go-v2/config](https://github.com/aws/aws-sdk-go-v2) | `1.32.33` | `1.32.35` | | [github.com/aws/smithy-go](https://github.com/aws/smithy-go) | `1.27.5` | `1.27.6` | | [github.com/kaptinlin/jsonschema](https://github.com/kaptinlin/jsonschema) | `0.9.6` | `0.9.8` | | [github.com/openai/openai-go/v3](https://github.com/openai/openai-go) | `3.48.0` | `3.50.0` | | [google.golang.org/genai](https://github.com/googleapis/go-genai) | `1.66.0` | `1.67.0` | Updates `github.com/aws/aws-sdk-go-v2` from 1.43.2 to 1.43.4 - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/v1.43.2...v1.43.4) Updates `github.com/aws/aws-sdk-go-v2/config` from 1.32.33 to 1.32.35 - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/config/v1.32.33...config/v1.32.35) Updates `github.com/aws/smithy-go` from 1.27.5 to 1.27.6 - [Release notes](https://github.com/aws/smithy-go/releases) - [Changelog](https://github.com/aws/smithy-go/blob/main/CHANGELOG.md) - [Commits](https://github.com/aws/smithy-go/compare/v1.27.5...v1.27.6) Updates `github.com/kaptinlin/jsonschema` from 0.9.6 to 0.9.8 - [Release notes](https://github.com/kaptinlin/jsonschema/releases) - [Commits](https://github.com/kaptinlin/jsonschema/compare/v0.9.6...v0.9.8) Updates `github.com/openai/openai-go/v3` from 3.48.0 to 3.50.0 - [Release notes](https://github.com/openai/openai-go/releases) - [Changelog](https://github.com/openai/openai-go/blob/main/CHANGELOG.md) - [Commits](https://github.com/openai/openai-go/compare/v3.48.0...v3.50.0) Updates `google.golang.org/genai` from 1.66.0 to 1.67.0 - [Release notes](https://github.com/googleapis/go-genai/releases) - [Changelog](https://github.com/googleapis/go-genai/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/go-genai/compare/v1.66.0...v1.67.0) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2 dependency-version: 1.43.4 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all - dependency-name: github.com/aws/aws-sdk-go-v2/config dependency-version: 1.32.35 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all - dependency-name: github.com/aws/smithy-go dependency-version: 1.27.6 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all - dependency-name: github.com/kaptinlin/jsonschema dependency-version: 0.9.8 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all - dependency-name: github.com/openai/openai-go/v3 dependency-version: 3.50.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: all - dependency-name: google.golang.org/genai dependency-version: 1.67.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: all ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 34 ++++++++++++++--------------- go.sum | 68 +++++++++++++++++++++++++++++----------------------------- 2 files changed, 51 insertions(+), 51 deletions(-) diff --git a/go.mod b/go.mod index 8a0bc2d0e..c669bf802 100644 --- a/go.mod +++ b/go.mod @@ -6,9 +6,9 @@ require ( charm.land/x/vcr v0.1.1 cloud.google.com/go/auth v0.22.0 github.com/ardanlabs/kronk v1.29.9 - github.com/aws/aws-sdk-go-v2 v1.43.2 - github.com/aws/aws-sdk-go-v2/config v1.32.33 - github.com/aws/smithy-go v1.27.5 + github.com/aws/aws-sdk-go-v2 v1.43.4 + github.com/aws/aws-sdk-go-v2/config v1.32.35 + github.com/aws/smithy-go v1.27.6 github.com/charmbracelet/anthropic-sdk-go v0.0.0-20260223140439-63879b0b8dab github.com/charmbracelet/x/exp/slice v0.0.0-20250904123553-b4e2667e5ad5 github.com/charmbracelet/x/exp/strings v0.1.0 @@ -16,12 +16,12 @@ require ( github.com/go-viper/mapstructure/v2 v2.5.0 github.com/google/uuid v1.6.0 github.com/joho/godotenv v1.5.1 - github.com/kaptinlin/jsonschema v0.9.6 - github.com/openai/openai-go/v3 v3.48.0 + github.com/kaptinlin/jsonschema v0.9.8 + github.com/openai/openai-go/v3 v3.50.0 github.com/stretchr/testify v1.11.1 golang.org/x/net v0.57.0 golang.org/x/oauth2 v0.36.0 - google.golang.org/genai v1.66.0 + google.golang.org/genai v1.67.0 ) require ( @@ -39,20 +39,20 @@ require ( github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.59.0 // indirect github.com/ardanlabs/jinja v1.5.0 // indirect github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.15 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.19.32 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.33 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.33 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.33 // indirect - github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.34 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.14 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.19.34 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.35 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.35 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.35 // indirect + github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.36 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.15 // indirect github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.26 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.33 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.35 // indirect github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.34 // indirect github.com/aws/aws-sdk-go-v2/service/s3 v1.106.2 // indirect - github.com/aws/aws-sdk-go-v2/service/signin v1.5.2 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.33.2 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.38.2 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.45.2 // indirect + github.com/aws/aws-sdk-go-v2/service/signin v1.5.4 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.33.4 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.38.4 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.45.4 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d // indirect github.com/cenkalti/backoff/v5 v5.0.3 // indirect diff --git a/go.sum b/go.sum index 3d2308866..5f36574de 100644 --- a/go.sum +++ b/go.sum @@ -42,42 +42,42 @@ github.com/ardanlabs/jinja v1.5.0 h1:OkNpmq9fXiCDRHMLCsd+VO/uk8L/tVwNJE+yA3JAhhM github.com/ardanlabs/jinja v1.5.0/go.mod h1:aXXzlJfjA+T3XNKA/YT5ZtDq2VJxt5a5siZ8cl9B35Q= github.com/ardanlabs/kronk v1.29.9 h1:ThmbRCKSXGLl68tOHCMp5gNBCmyEV1Syi66aP+HMoxo= github.com/ardanlabs/kronk v1.29.9/go.mod h1:419Te3wIWthLXzUvkP0LIh6FVA9Hh1JsCKA2XY+M3jU= -github.com/aws/aws-sdk-go-v2 v1.43.2 h1:cl+IXwWb3qazClUcm08tGSsB6OiuV83JVJO9B0jQcPc= -github.com/aws/aws-sdk-go-v2 v1.43.2/go.mod h1:WEzLKBh/mEjXvx1FtQMWgSxMSTVqxQzjkRtk5fa3wkg= +github.com/aws/aws-sdk-go-v2 v1.43.4 h1:b9FTvbRwy+JCsfp2Wp6wV/KbOx3Aj7nkoFb2cRX0IhE= +github.com/aws/aws-sdk-go-v2 v1.43.4/go.mod h1:70vwSy16txshwG+g55WkpgPKDIByzHI8ccBsOteo3bQ= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.15 h1:rq/p1VNFfygoKEQ9hHMKsKBE98lspPvT8IxaFs5mFhw= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.15/go.mod h1:bELIhlPfW8OkpDhP1MvCjHDtvv8NhiBTz+K4o26zrXA= -github.com/aws/aws-sdk-go-v2/config v1.32.33 h1:M1m/Q6f0OKDEDGwhiNOqx1OjTdrewe3v+GDbHmKczWk= -github.com/aws/aws-sdk-go-v2/config v1.32.33/go.mod h1:fGj1iQj2QpIZzp7jE4aQQ+71TE8cd4z9K4+xCd6EqmE= -github.com/aws/aws-sdk-go-v2/credentials v1.19.32 h1:eNE0JnIblBo1NCvd3tqEYuZz9XDefn69R74CHd3nT7U= -github.com/aws/aws-sdk-go-v2/credentials v1.19.32/go.mod h1:yYJu+6tqKUYZuJSYcpSGjz/6sV/SUaAaKIufnWKx2OU= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.33 h1:MobhiR6KIerWxmO74Zit5I3379+mSc2DOdZ3DeRFB9w= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.33/go.mod h1:xu02847OdZfNr/jAfZpHtyRk0b3v4d0kaoxNHxZGG/w= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.33 h1:HAp1wLFZzch054uh3FK7rcVYg4v7J2FxVf3h3IGNZas= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.33/go.mod h1:mJk5fmqnF+WUlMdPG37pR2Fh3oh6r8F6ZGUgPKvzu0c= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.33 h1:0YA0aCKgsJyno6xkFfaIgjE3/wK08+Qxo9nQfe1UrWM= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.33/go.mod h1:UZqj4WIdTH+ga8Y/DgpAuy/8cGjM3h7gDCliJYGg2SE= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.34 h1:HQYnjFnXpX8EbPW5M1QT8mXzesRPwly0HEPTcFlS02Y= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.34/go.mod h1:tGzj56niKYZBbDIRhwPGDqrULzmWv5b6uBQGqyNaFZw= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.14 h1:SA43nfaY7+1jjMNIc2ywu99JLJLButtIdLP6j+bT870= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.14/go.mod h1:Du3llKcwbQvHsTXSLzTOGQz0DTDBMEzdg7DAGu7inrY= +github.com/aws/aws-sdk-go-v2/config v1.32.35 h1:UEzXuET8E42lxBPijuACu/tEK7v5lFPlk0Q+GT5WD9E= +github.com/aws/aws-sdk-go-v2/config v1.32.35/go.mod h1:KaMtJpFa2JlL2BStjjHQVwQpzZEmw+ND/EgVrfFoo2g= +github.com/aws/aws-sdk-go-v2/credentials v1.19.34 h1:y6GkSmcv5myd1ngrYbGmiLlwQqB6TQhOuN/tbSSuWDY= +github.com/aws/aws-sdk-go-v2/credentials v1.19.34/go.mod h1:w3dTcnDVoQIewjo7JG45hduAToikiIFLC4FIO7fndvw= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.35 h1:+S7kbJoLDDQ5tE+lHrUBgMkzC8NLgsaioS2F3dVoFAE= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.35/go.mod h1:Ak7xXviIARfFdNUJ9Etb0bdVDt/KAvKjMGJVLWXDzik= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.35 h1:kzVuGlatQtYinwBJEEyLAbggepCoavosiaHHX9+fD+c= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.35/go.mod h1:0yLx0yEI+SfqeJMPvOtIEFoZbiQYXMGszBueiutQyaI= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.35 h1:WK6CjihTuLisCjSKKbildJ79sGZZgbBz3iNa7VsKIhU= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.35/go.mod h1:KYleN57luLoe97R7vTnx8PMcVrr9gAcRECtOjl91DNg= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.36 h1:jbGY4CXLzZElOXgGsexlC3Hi+3YM0rSmk4opFXKqg/k= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.36/go.mod h1:uBu/9aKsS/UQGc72RAt3y54kjgYQxmhut8ZD2dXCDNE= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.15 h1:JJLBQxwY+AFwuPAi5ivGc1ChnTdUt4cXMv7e76m2c/Y= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.15/go.mod h1:lQknBIe78MVL0cQOQDlag8KGflMbMEVFx9mB6O8ENvk= github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.26 h1:Eflerh7atY6HN0yz60peNLOkJA2ZKUyYjZexMbqwMCE= github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.26/go.mod h1:dCAXNDmik9NuTjfsvCvW22S6ZFpxmtoliFoQu5XFkh8= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.33 h1:mqI7OrxN/DUH85F5OqVn3cIfuZ3+HVcebUm2N8mLlgQ= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.33/go.mod h1:eZ5jdEpvaaOU8nWWE4cTAJETSEA5FZoWxvNRao4piHY= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.35 h1:BBEElKh4a+rKshvjrfpajTe9CbpZvrbb4Jkg2PB7RzA= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.35/go.mod h1:zaZk983w//8beSruBVec/mr4CmDwgZitW/qzGhAAX0g= github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.34 h1:Lercr2QB2rOrCwyOusmnQ7IiopfkGcZAgMJbjcSdK/s= github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.34/go.mod h1:W0xXPPCb2HAqa3cp2f/nRvE+jGgBmchiuXrfBRlfb1I= github.com/aws/aws-sdk-go-v2/service/s3 v1.106.2 h1:lFSYDEyC1JHucMH3fdczMTnDaghqNttyRXKM8JY9EJQ= github.com/aws/aws-sdk-go-v2/service/s3 v1.106.2/go.mod h1:aw1E7RCjxs5Sd8N6WdICMcMroff12Tzxte+ELXXNqRU= -github.com/aws/aws-sdk-go-v2/service/signin v1.5.2 h1:EjI1CZzDcBxPkTa3j1BdtIrUDbqnOGssFMeyUS+6W0I= -github.com/aws/aws-sdk-go-v2/service/signin v1.5.2/go.mod h1:vN3eb5H8MEAZ4dx0F5Wc9LT8eb3eW7bZZ5BjGJdbw9k= -github.com/aws/aws-sdk-go-v2/service/sso v1.33.2 h1:zMP1FDFE08L7sM5f1QqkH/ZgKKg8Uc0Dz7KhSSYqWkw= -github.com/aws/aws-sdk-go-v2/service/sso v1.33.2/go.mod h1:0LoIZSUKjdo2BleHfT1hv/jlD33LQS00IrBlzoUsoUQ= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.38.2 h1:9eTqUYl+SyVmaRPMyBXSO9wwqC6TRwZB82pKENK2hdQ= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.38.2/go.mod h1:DThweuz22kiLc7lGHop5vQ9c3bx5W6Azs/YqSHa2fu8= -github.com/aws/aws-sdk-go-v2/service/sts v1.45.2 h1:EJd8vZO3E8SE6nmPqxuxlQ1NeSb8as50sf6eGdV4Saw= -github.com/aws/aws-sdk-go-v2/service/sts v1.45.2/go.mod h1:OgpPvKzsO2Ranjpli/20djMkg6UrV5mw4W3pZpq1Mqo= -github.com/aws/smithy-go v1.27.5 h1:d1ro7KpYOYwP6m73YFa+Kc/A130VsAdX68SpsJwARMM= -github.com/aws/smithy-go v1.27.5/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc= +github.com/aws/aws-sdk-go-v2/service/signin v1.5.4 h1:cOJELVNrq5Q3Udry2GLuHUM7MhwpeaQRdYaoa6GI/yI= +github.com/aws/aws-sdk-go-v2/service/signin v1.5.4/go.mod h1:f4LxzKBtaTxD7xh3PiVg3CE1tchQemfmghaJr+NbK2c= +github.com/aws/aws-sdk-go-v2/service/sso v1.33.4 h1:AMW7a7S8iQaHjBYZdU3PCq4GKRPijTPRAc7e6XtEThY= +github.com/aws/aws-sdk-go-v2/service/sso v1.33.4/go.mod h1:QQNsFV1DVXoXcZt18FS8lI8rtUrlDyAuWZLQ5shunv4= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.38.4 h1:AsbZcJAQPRmHDJG8K1N0pof/1zPWjVT8TFlTWuGLSvo= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.38.4/go.mod h1:6imqztH0//t0mKbl6yWl7swSEl7F/w32oAmqB3vP1ag= +github.com/aws/aws-sdk-go-v2/service/sts v1.45.4 h1:w/AryDYMjSUANSQ2uoZxJovUsMTwWJNTv3IMex30Y+4= +github.com/aws/aws-sdk-go-v2/service/sts v1.45.4/go.mod h1:WeBiAa67azG7Su9Vf+ChGDBLiAozJCXzdjXiPBUwtbc= +github.com/aws/smithy-go v1.27.6 h1:0zjT8jgK3jbrTT7JJ3EE6JsMhX8JTrZ+f1sEndYDXrA= +github.com/aws/smithy-go v1.27.6/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d h1:xDfNPAt8lFiC1UJrqV3uuy861HCTo708pDMbjHHdCas= @@ -161,8 +161,8 @@ github.com/jupiterrider/ffi v0.7.0 h1:RKsl6Ascal+3kyAqR5Qcbp83LceQMLc1VZbPfHWoNz github.com/jupiterrider/ffi v0.7.0/go.mod h1:9dauhpOfNqrqk28fxuu0kkdeFtT9Qr4vbfigiuIXN7c= github.com/kaptinlin/jsonpointer v0.4.28 h1:PyxOfdml9PGpxQz+JnNLGsyzQ+Rnm+OVNTGcgbVLqgg= github.com/kaptinlin/jsonpointer v0.4.28/go.mod h1:JzeIDw1+60bryzOFea9P3zjKg8pfJHd+UIA/zfZ70x8= -github.com/kaptinlin/jsonschema v0.9.6 h1:RNqurZUqduQm+mINsCFbRzBQR0uKbAcRPBj3BqRA/I8= -github.com/kaptinlin/jsonschema v0.9.6/go.mod h1:TP7RFmFBNExjBE0b3fsM6RpA/9PeOzfg2g4weXqOrDg= +github.com/kaptinlin/jsonschema v0.9.8 h1:srpfx2MAm4ecYz0zJLbz6fiW+UXiuv+vGhUqZUIWmrg= +github.com/kaptinlin/jsonschema v0.9.8/go.mod h1:TP7RFmFBNExjBE0b3fsM6RpA/9PeOzfg2g4weXqOrDg= github.com/klauspost/compress v1.19.1 h1:VsB4HPswih7mmZ8WleSFQ75c/Ui1M4trX5oAsJnhSlk= github.com/klauspost/compress v1.19.1/go.mod h1:cwPg85FWrGar70rWktvGQj8/hthj3wpl0PGDogxkrSQ= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= @@ -175,8 +175,8 @@ github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/openai/openai-go/v3 v3.48.0 h1:HRVBn6UEP4qzGK2c6UWAZ0mdFf6yODNWTJ4ywLIyDpQ= -github.com/openai/openai-go/v3 v3.48.0/go.mod h1:nCqcbgPr2jYDV8wiCWPA2tRL56mWXdb6QavBmBwzSis= +github.com/openai/openai-go/v3 v3.50.0 h1:CXn+C8a10oQiI5CMyMbCiykhITVhVxhdHX8j3CfLa2U= +github.com/openai/openai-go/v3 v3.50.0/go.mod h1:Ogjo0gDct+Jm7yCqaCjLGQGygeV8xNfNHV1/yKvCji0= github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ= github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU= github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= @@ -263,8 +263,8 @@ gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4= gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E= google.golang.org/api v0.291.0 h1:wfPbbY+mr9c7wZLqqzrHJLft/q8iFKREd6IgTBUene0= google.golang.org/api v0.291.0/go.mod h1:at7kwWbuonglBFEBoeMDAV1bguHqL3qf0BHFsv3coa0= -google.golang.org/genai v1.66.0 h1:njWPPscy3l6rqBnYhFz3YCeLOVvZrzteTVTYOhxxcZc= -google.golang.org/genai v1.66.0/go.mod h1:mDdPDFXo1Ats7f1WXVyZgWb/CkMzFWTWJruIMy7hGIU= +google.golang.org/genai v1.67.0 h1:m3V2AK2zbyViUq9rhTkMgkxu32Fueypy5Pzd9yV8GwU= +google.golang.org/genai v1.67.0/go.mod h1:mDdPDFXo1Ats7f1WXVyZgWb/CkMzFWTWJruIMy7hGIU= google.golang.org/genproto v0.0.0-20260729162451-8efbd57d26e0 h1:xJf8e9ReUqiexuIT3OWJkvA4RdgR8K4Hfheq8gaKxIM= google.golang.org/genproto v0.0.0-20260729162451-8efbd57d26e0/go.mod h1:0MNk3ibJAyOwDZVlp18knQe3jRyFxpcU06xjxhgjx0M= google.golang.org/genproto/googleapis/api v0.0.0-20260729162451-8efbd57d26e0 h1:ybvH/ZpOcpCrjtkb7oW/fdlzbEmRVeumw19SRQmNFKU= From 428dc63c6fbb97908a672e489c4c0c0a10e19cfc Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Tue, 11 Aug 2026 15:40:44 -0300 Subject: [PATCH 069/156] chore: gofumpt --- examples/computer-use/main.go | 3 ++- examples/kronk/simple/main.go | 3 ++- examples/simple/main.go | 3 ++- examples/web-search/main.go | 3 ++- json_test.go | 3 ++- model.go | 3 ++- model_json.go | 2 +- 7 files changed, 13 insertions(+), 7 deletions(-) diff --git a/examples/computer-use/main.go b/examples/computer-use/main.go index d36a7bdcd..cf6dab46d 100644 --- a/examples/computer-use/main.go +++ b/examples/computer-use/main.go @@ -82,7 +82,8 @@ func main() { // the tool-call loop: it sends the prompt, executes any tool // calls the model returns, feeds the results back, and repeats // until the model stops requesting tools. - agent := fantasy.NewAgent(model, + agent := fantasy.NewAgent( + model, fantasy.WithProviderDefinedTools(computerTool), fantasy.WithStopConditions(fantasy.StepCountIs(10)), ) diff --git a/examples/kronk/simple/main.go b/examples/kronk/simple/main.go index 44919fd4e..5e550a65a 100644 --- a/examples/kronk/simple/main.go +++ b/examples/kronk/simple/main.go @@ -72,7 +72,8 @@ func run() error { cuteDogTool := fantasy.NewAgentTool("cute_dog_tool", "Provide up-to-date info on cute dogs.", fetchCuteDogInfo) // Equip your agent. - agent := fantasy.NewAgent(model, + agent := fantasy.NewAgent( + model, fantasy.WithSystemPrompt("You are a moderately helpful, dog-centric assistant."), fantasy.WithTools(cuteDogTool), fantasy.WithMaxOutputTokens(2048), diff --git a/examples/simple/main.go b/examples/simple/main.go index cc6b0f583..85084d360 100644 --- a/examples/simple/main.go +++ b/examples/simple/main.go @@ -47,7 +47,8 @@ func main() { cuteDogTool := fantasy.NewAgentTool("cute_dog_tool", "Provide up-to-date info on cute dogs.", fetchCuteDogInfo) // Equip your agent. - agent := fantasy.NewAgent(model, + agent := fantasy.NewAgent( + model, fantasy.WithSystemPrompt("You are a moderately helpful, dog-centric assistant."), fantasy.WithTools(cuteDogTool), ) diff --git a/examples/web-search/main.go b/examples/web-search/main.go index 203e46ad7..8f9487174 100644 --- a/examples/web-search/main.go +++ b/examples/web-search/main.go @@ -52,7 +52,8 @@ func main() { os.Exit(1) } - agent := fantasy.NewAgent(model, + agent := fantasy.NewAgent( + model, fantasy.WithProviderDefinedTools(webSearch), ) diff --git a/json_test.go b/json_test.go index 23958d97b..f461300b8 100644 --- a/json_test.go +++ b/json_test.go @@ -315,7 +315,8 @@ func TestHelperFunctions(t *testing.T) { }) t.Run("NewUserMessage - with files", func(t *testing.T) { - msg := NewUserMessage("Check this image", + msg := NewUserMessage( + "Check this image", FilePart{ Filename: "image1.jpg", Data: []byte{0xFF, 0xD8, 0xFF}, diff --git a/model.go b/model.go index 9e63c9323..f33a46f93 100644 --- a/model.go +++ b/model.go @@ -18,7 +18,8 @@ type Usage struct { } func (u Usage) String() string { - return fmt.Sprintf("Usage{Input: %d, Output: %d, Total: %d, Reasoning: %d, CacheCreation: %d, CacheRead: %d}", + return fmt.Sprintf( + "Usage{Input: %d, Output: %d, Total: %d, Reasoning: %d, CacheCreation: %d, CacheRead: %d}", u.InputTokens, u.OutputTokens, u.TotalTokens, diff --git a/model_json.go b/model_json.go index 2fd883a2f..994d9997b 100644 --- a/model_json.go +++ b/model_json.go @@ -109,7 +109,7 @@ func (s StreamPart) MarshalJSON() ([]byte, error) { alias Error string `json:"error,omitempty"` }{ - alias: (alias)(s), + alias: alias(s), } // Marshal error to string From e0d5accbdcc5a028d276537cb422092aaffdef27 Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Tue, 11 Aug 2026 16:51:19 -0300 Subject: [PATCH 070/156] feat: use anthropic sdk from upstream (#336) They fixed an issue we're facing that we requiring us to use an internal fork. * Ref https://github.com/anthropics/anthropic-sdk-go/pull/238 * Ref https://github.com/anthropics/anthropic-sdk-go/commit/6e77739a17bde2f69e16e23f97bc3d9086934ce7 --- go.mod | 7 ++++++- go.sum | 14 ++++++++++++-- providers/anthropic/anthropic.go | 18 +++++++++--------- providers/anthropic/anthropic_test.go | 4 ++-- providers/anthropic/call_useragent.go | 2 +- providers/anthropic/computer_use.go | 4 ++-- providers/anthropic/error.go | 3 ++- providers/bedrock/bedrock.go | 2 +- providertests/anthropic_test.go | 3 ++- 9 files changed, 37 insertions(+), 20 deletions(-) diff --git a/go.mod b/go.mod index c669bf802..4dea99e08 100644 --- a/go.mod +++ b/go.mod @@ -5,11 +5,11 @@ go 1.26.5 require ( charm.land/x/vcr v0.1.1 cloud.google.com/go/auth v0.22.0 + github.com/anthropics/anthropic-sdk-go v1.63.0 github.com/ardanlabs/kronk v1.29.9 github.com/aws/aws-sdk-go-v2 v1.43.4 github.com/aws/aws-sdk-go-v2/config v1.32.35 github.com/aws/smithy-go v1.27.6 - github.com/charmbracelet/anthropic-sdk-go v0.0.0-20260223140439-63879b0b8dab github.com/charmbracelet/x/exp/slice v0.0.0-20250904123553-b4e2667e5ad5 github.com/charmbracelet/x/exp/strings v0.1.0 github.com/charmbracelet/x/json v0.2.0 @@ -53,8 +53,10 @@ require ( github.com/aws/aws-sdk-go-v2/service/sso v1.33.4 // indirect github.com/aws/aws-sdk-go-v2/service/ssooidc v1.38.4 // indirect github.com/aws/aws-sdk-go-v2/service/sts v1.45.4 // indirect + github.com/bahlo/generic-list-go v0.2.0 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d // indirect + github.com/buger/jsonparser v1.1.2 // indirect github.com/cenkalti/backoff/v5 v5.0.3 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/cncf/xds/go v0.0.0-20260202195803-dba9d589def2 // indirect @@ -79,11 +81,13 @@ require ( github.com/hashicorp/go-getter v1.8.6 // indirect github.com/hashicorp/go-version v1.9.0 // indirect github.com/hybridgroup/yzma v1.21.0 // indirect + github.com/invopop/jsonschema v0.14.0 // indirect github.com/jupiterrider/ffi v0.7.0 // indirect github.com/kaptinlin/jsonpointer v0.4.28 // indirect github.com/klauspost/compress v1.19.1 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect + github.com/pb33f/ordered-map/v2 v2.3.1 // indirect github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/prometheus/client_golang v1.24.1 // indirect @@ -91,6 +95,7 @@ require ( github.com/prometheus/common v0.70.1 // indirect github.com/prometheus/procfs v0.21.1 // indirect github.com/spiffe/go-spiffe/v2 v2.8.1 // indirect + github.com/standard-webhooks/standard-webhooks/libraries v0.0.1 // indirect github.com/tidwall/gjson v1.19.0 // indirect github.com/tidwall/match v1.1.1 // indirect github.com/tidwall/pretty v1.2.1 // indirect diff --git a/go.sum b/go.sum index 5f36574de..ed9cf23b3 100644 --- a/go.sum +++ b/go.sum @@ -38,6 +38,8 @@ github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0 github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.59.0/go.mod h1:V9g30lTKzfUsEW+gpWssck6u9IhARajmipodImLLcwI= github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.59.0 h1:18FRm6ZcN/x9+ZmhMr96hLcTtlLn2/gHPuDLVeg7XcY= github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.59.0/go.mod h1:YqwkQPrWSC7+byyc1VlKbWLBF5JsW5IoL6xUkemYSXk= +github.com/anthropics/anthropic-sdk-go v1.63.0 h1:GNl6LVjjxg1bRY41nlrvL5FvlwQs7FbYgQ3DnoVITD4= +github.com/anthropics/anthropic-sdk-go v1.63.0/go.mod h1:3EfIfmFqxH6rbiLcIP4tPFyXL/IHakx2wDG4OU+TIEI= github.com/ardanlabs/jinja v1.5.0 h1:OkNpmq9fXiCDRHMLCsd+VO/uk8L/tVwNJE+yA3JAhhM= github.com/ardanlabs/jinja v1.5.0/go.mod h1:aXXzlJfjA+T3XNKA/YT5ZtDq2VJxt5a5siZ8cl9B35Q= github.com/ardanlabs/kronk v1.29.9 h1:ThmbRCKSXGLl68tOHCMp5gNBCmyEV1Syi66aP+HMoxo= @@ -78,16 +80,18 @@ github.com/aws/aws-sdk-go-v2/service/sts v1.45.4 h1:w/AryDYMjSUANSQ2uoZxJovUsMTw github.com/aws/aws-sdk-go-v2/service/sts v1.45.4/go.mod h1:WeBiAa67azG7Su9Vf+ChGDBLiAozJCXzdjXiPBUwtbc= github.com/aws/smithy-go v1.27.6 h1:0zjT8jgK3jbrTT7JJ3EE6JsMhX8JTrZ+f1sEndYDXrA= github.com/aws/smithy-go v1.27.6/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc= +github.com/bahlo/generic-list-go v0.2.0 h1:5sz/EEAK+ls5wF+NeqDpk5+iNdMDXrh3z3nPnH1Wvgk= +github.com/bahlo/generic-list-go v0.2.0/go.mod h1:2KvAjgMlE5NNynlg/5iLrrCCZ2+5xWbdbCW3pNTGyYg= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d h1:xDfNPAt8lFiC1UJrqV3uuy861HCTo708pDMbjHHdCas= github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d/go.mod h1:6QX/PXZ00z/TKoufEY6K/a0k6AhaJrQKdFe6OfVXsa4= +github.com/buger/jsonparser v1.1.2 h1:frqHqw7otoVbk5M8LlE/L7HTnIq2v9RX6EJ48i9AxJk= +github.com/buger/jsonparser v1.1.2/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/charmbracelet/anthropic-sdk-go v0.0.0-20260223140439-63879b0b8dab h1:J7XQLgl9sefgTnTGrmX3xqvp5o6MCiBzEjGv5igAlc4= -github.com/charmbracelet/anthropic-sdk-go v0.0.0-20260223140439-63879b0b8dab/go.mod h1:hqlYqR7uPKOKfnNeicUbZp0Ps0GeYFlKYtwh5HGDCx8= github.com/charmbracelet/x/exp/slice v0.0.0-20250904123553-b4e2667e5ad5 h1:DTSZxdV9qQagD4iGcAt9RgaRBZtJl01bfKgdLzUzUPI= github.com/charmbracelet/x/exp/slice v0.0.0-20250904123553-b4e2667e5ad5/go.mod h1:vI5nDVMWi6veaYH+0Fmvpbe/+cv/iJfMntdh+N0+Tms= github.com/charmbracelet/x/exp/strings v0.1.0 h1:i69S2XI7uG1u4NLGeJPSYU++Nmjvpo9nwd6aoEm7gkA= @@ -155,6 +159,8 @@ github.com/hashicorp/go-version v1.9.0 h1:CeOIz6k+LoN3qX9Z0tyQrPtiB1DFYRPfCIBtaX github.com/hashicorp/go-version v1.9.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hybridgroup/yzma v1.21.0 h1:xBgCH9ziielLeexci8eJ/PvnxCzgLktOaoHH5p/ef30= github.com/hybridgroup/yzma v1.21.0/go.mod h1:wAMtNTjSnE79jTWzaeFSsuraam0TXKCPajMHA5s+OX8= +github.com/invopop/jsonschema v0.14.0 h1:MHQqLhvpNUZfw+hM3AZDYK7jxO8FZoQeQM77g8iyZjg= +github.com/invopop/jsonschema v0.14.0/go.mod h1:ygm6C2EaVNMBDPpaPlnOA2pFAxBnxGjFlMZABxm9n2I= github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= github.com/jupiterrider/ffi v0.7.0 h1:RKsl6Ascal+3kyAqR5Qcbp83LceQMLc1VZbPfHWoNzs= @@ -177,6 +183,8 @@ github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/openai/openai-go/v3 v3.50.0 h1:CXn+C8a10oQiI5CMyMbCiykhITVhVxhdHX8j3CfLa2U= github.com/openai/openai-go/v3 v3.50.0/go.mod h1:Ogjo0gDct+Jm7yCqaCjLGQGygeV8xNfNHV1/yKvCji0= +github.com/pb33f/ordered-map/v2 v2.3.1 h1:5319HDO0aw4DA4gzi+zv4FXU9UlSs3xGZ40wcP1nBjY= +github.com/pb33f/ordered-map/v2 v2.3.1/go.mod h1:qxFQgd0PkVUtOMCkTapqotNgzRhMPL7VvaHKbd1HnmQ= github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ= github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU= github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= @@ -195,6 +203,8 @@ github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0t github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= github.com/spiffe/go-spiffe/v2 v2.8.1 h1:eXZMLsu+3MLEPJyGJkolqtVrteZfQdUpOWj6LTiDl/E= github.com/spiffe/go-spiffe/v2 v2.8.1/go.mod h1:47Q0Q9/AqGha8QLHp+kxpH4Wca7X7EnOtlIJy3mxZ3U= +github.com/standard-webhooks/standard-webhooks/libraries v0.0.1 h1:uOfcYT+3QungH6tIGSVCR/Y3KJmgJiHcojJbMTPDZAI= +github.com/standard-webhooks/standard-webhooks/libraries v0.0.1/go.mod h1:L1MQhA6x4dn9r007T033lsaZMv9EmBAdXyU/+EF40fo= github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= github.com/tidwall/gjson v1.14.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= diff --git a/providers/anthropic/anthropic.go b/providers/anthropic/anthropic.go index 96c92f2c0..104aabe0b 100644 --- a/providers/anthropic/anthropic.go +++ b/providers/anthropic/anthropic.go @@ -17,12 +17,12 @@ import ( "charm.land/fantasy" "charm.land/fantasy/object" "charm.land/fantasy/providers/internal/httpheaders" + "github.com/anthropics/anthropic-sdk-go" + "github.com/anthropics/anthropic-sdk-go/bedrock" + "github.com/anthropics/anthropic-sdk-go/option" + "github.com/anthropics/anthropic-sdk-go/packages/param" + "github.com/anthropics/anthropic-sdk-go/vertex" "github.com/aws/aws-sdk-go-v2/config" - "github.com/charmbracelet/anthropic-sdk-go" - "github.com/charmbracelet/anthropic-sdk-go/bedrock" - "github.com/charmbracelet/anthropic-sdk-go/option" - "github.com/charmbracelet/anthropic-sdk-go/packages/param" - "github.com/charmbracelet/anthropic-sdk-go/vertex" "golang.org/x/oauth2/google" ) @@ -365,7 +365,7 @@ func (a languageModel) prepareParams(call fantasy.Call) ( params.System = systemBlocks params.Messages = messages - params.Model = anthropic.Model(a.modelID) + params.Model = a.modelID params.MaxTokens = 4096 if call.MaxOutputTokens != nil { @@ -388,7 +388,7 @@ func (a languageModel) prepareParams(call fantasy.Call) ( params.OutputConfig = anthropic.OutputConfigParam{ Effort: anthropic.OutputConfigEffort(effort), } - adaptive := anthropic.NewThinkingConfigAdaptiveParam() + adaptive := anthropic.ThinkingConfigAdaptiveParam{} if display, ok := thinkingDisplay(providerOptions, a.modelID); ok { setThinkingDisplay(&adaptive, display) } @@ -398,7 +398,7 @@ func (a languageModel) prepareParams(call fantasy.Call) ( return nil, nil, nil, nil, &fantasy.Error{Title: "no budget", Message: "thinking requires budget"} } if requiresAdaptiveThinking(a.modelID) { - adaptive := anthropic.NewThinkingConfigAdaptiveParam() + adaptive := anthropic.ThinkingConfigAdaptiveParam{} if display, ok := thinkingDisplay(providerOptions, a.modelID); ok { setThinkingDisplay(&adaptive, display) } @@ -434,7 +434,7 @@ func (a languageModel) prepareParams(call fantasy.Call) ( }) } case defaultsToAdaptiveThinking(a.modelID): - adaptive := anthropic.NewThinkingConfigAdaptiveParam() + adaptive := anthropic.ThinkingConfigAdaptiveParam{} if display, ok := thinkingDisplay(providerOptions, a.modelID); ok { setThinkingDisplay(&adaptive, display) } diff --git a/providers/anthropic/anthropic_test.go b/providers/anthropic/anthropic_test.go index cfd2a38e5..9bd74972b 100644 --- a/providers/anthropic/anthropic_test.go +++ b/providers/anthropic/anthropic_test.go @@ -14,7 +14,7 @@ import ( "time" "charm.land/fantasy" - "github.com/charmbracelet/anthropic-sdk-go" + "github.com/anthropics/anthropic-sdk-go" "github.com/stretchr/testify/require" ) @@ -927,7 +927,7 @@ func TestStream_RequiresMessageStopBeforeFinish(t *testing.T) { chunks: []string{ anthropicSSEEvent("error", `{"type":"error","error":{"type":"api_error","message":"stream down"}}`), }, - wantRetryable: true, + wantRetryable: true, wantErrContain: "stream down", }, { diff --git a/providers/anthropic/call_useragent.go b/providers/anthropic/call_useragent.go index 47d451efa..bf80e6637 100644 --- a/providers/anthropic/call_useragent.go +++ b/providers/anthropic/call_useragent.go @@ -3,7 +3,7 @@ package anthropic import ( "charm.land/fantasy" "charm.land/fantasy/providers/internal/httpheaders" - "github.com/charmbracelet/anthropic-sdk-go/option" + "github.com/anthropics/anthropic-sdk-go/option" ) func callUARequestOptions(call fantasy.Call) []option.RequestOption { diff --git a/providers/anthropic/computer_use.go b/providers/anthropic/computer_use.go index f4526e9ae..c130bde6f 100644 --- a/providers/anthropic/computer_use.go +++ b/providers/anthropic/computer_use.go @@ -7,8 +7,8 @@ import ( "fmt" "charm.land/fantasy" - anthropicsdk "github.com/charmbracelet/anthropic-sdk-go" - "github.com/charmbracelet/anthropic-sdk-go/packages/param" + anthropicsdk "github.com/anthropics/anthropic-sdk-go" + "github.com/anthropics/anthropic-sdk-go/packages/param" ) // computerUseToolID is the canonical identifier for diff --git a/providers/anthropic/error.go b/providers/anthropic/error.go index 293c3c271..65894c750 100644 --- a/providers/anthropic/error.go +++ b/providers/anthropic/error.go @@ -10,7 +10,7 @@ import ( "strings" "charm.land/fantasy" - "github.com/charmbracelet/anthropic-sdk-go" + "github.com/anthropics/anthropic-sdk-go" ) var anthropicContextPattern = regexp.MustCompile(`prompt is too long:\s*(\d+)\s*tokens?\s*>\s*(\d+)\s*maximum`) @@ -33,6 +33,7 @@ func toProviderErr(err error) error { RequestBody: apiErr.DumpRequest(true), ResponseHeaders: toHeaderMap(apiErr.Response.Header), ResponseBody: apiErr.DumpResponse(true), + TransientError: fantasy.TransientStreamErrorTypes[string(apiErr.Type())], } parseContextTooLargeError(apiErr.Error(), providerErr) diff --git a/providers/bedrock/bedrock.go b/providers/bedrock/bedrock.go index d3e0854e7..b1b6c2114 100644 --- a/providers/bedrock/bedrock.go +++ b/providers/bedrock/bedrock.go @@ -4,7 +4,7 @@ package bedrock import ( "charm.land/fantasy" "charm.land/fantasy/providers/anthropic" - "github.com/charmbracelet/anthropic-sdk-go/option" + "github.com/anthropics/anthropic-sdk-go/option" ) type options struct { diff --git a/providertests/anthropic_test.go b/providertests/anthropic_test.go index f0ee72667..91a7a6b71 100644 --- a/providertests/anthropic_test.go +++ b/providertests/anthropic_test.go @@ -1,6 +1,7 @@ package providertests import ( + "cmp" "context" "encoding/json" "net/http" @@ -147,7 +148,7 @@ func testAnthropicThinking(t *testing.T, result *fantasy.AgentResult) { func anthropicBuilder(model string) builderFunc { return func(t *testing.T, r *vcr.Recorder) (fantasy.LanguageModel, error) { provider, err := anthropic.New( - anthropic.WithAPIKey(os.Getenv("FANTASY_ANTHROPIC_API_KEY")), + anthropic.WithAPIKey(cmp.Or(os.Getenv("FANTASY_ANTHROPIC_API_KEY"), "(missing)")), anthropic.WithHTTPClient(&http.Client{Transport: r}), ) if err != nil { From ed56c8da48e9656fd183b512ae23e9874e541d40 Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Tue, 11 Aug 2026 16:51:34 -0300 Subject: [PATCH 071/156] v0.41.0 --- version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.txt b/version.txt index 9b0025a78..72a8a6313 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -0.40.0 +0.41.0 From 200f4a01df583a08a23e7c1e5e4642553cba1728 Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Tue, 11 Aug 2026 16:51:58 -0300 Subject: [PATCH 072/156] chore(examples): go mod tidy --- examples/go.mod | 44 ++++++++++++++----------- examples/go.sum | 88 ++++++++++++++++++++++++++++--------------------- 2 files changed, 75 insertions(+), 57 deletions(-) diff --git a/examples/go.mod b/examples/go.mod index dc159aed4..ff97c3e57 100644 --- a/examples/go.mod +++ b/examples/go.mod @@ -23,31 +23,33 @@ require ( github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.35.0 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.59.0 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.59.0 // indirect + github.com/anthropics/anthropic-sdk-go v1.63.0 // indirect github.com/ardanlabs/jinja v1.5.0 // indirect github.com/ardanlabs/kronk v1.29.9 // indirect - github.com/aws/aws-sdk-go-v2 v1.43.2 // indirect + github.com/aws/aws-sdk-go-v2 v1.43.4 // indirect github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.15 // indirect - github.com/aws/aws-sdk-go-v2/config v1.32.33 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.19.32 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.33 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.33 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.33 // indirect - github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.34 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.14 // indirect + github.com/aws/aws-sdk-go-v2/config v1.32.35 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.19.34 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.35 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.35 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.35 // indirect + github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.36 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.15 // indirect github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.26 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.33 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.35 // indirect github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.34 // indirect github.com/aws/aws-sdk-go-v2/service/s3 v1.106.2 // indirect - github.com/aws/aws-sdk-go-v2/service/signin v1.5.2 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.33.2 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.38.2 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.45.2 // indirect - github.com/aws/smithy-go v1.27.5 // indirect + github.com/aws/aws-sdk-go-v2/service/signin v1.5.4 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.33.4 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.38.4 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.45.4 // indirect + github.com/aws/smithy-go v1.27.6 // indirect + github.com/bahlo/generic-list-go v0.2.0 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d // indirect + github.com/buger/jsonparser v1.1.2 // indirect github.com/cenkalti/backoff/v5 v5.0.3 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect - github.com/charmbracelet/anthropic-sdk-go v0.0.0-20260223140439-63879b0b8dab // indirect github.com/charmbracelet/colorprofile v0.3.2 // indirect github.com/charmbracelet/x/ansi v0.10.2 // indirect github.com/charmbracelet/x/cellbuf v0.0.14-0.20250811133356-e0c5dbe5ea4a // indirect @@ -78,16 +80,18 @@ require ( github.com/hashicorp/go-getter v1.8.6 // indirect github.com/hashicorp/go-version v1.9.0 // indirect github.com/hybridgroup/yzma v1.21.0 // indirect + github.com/invopop/jsonschema v0.14.0 // indirect github.com/jupiterrider/ffi v0.7.0 // indirect - github.com/kaptinlin/jsonpointer v0.4.27 // indirect - github.com/kaptinlin/jsonschema v0.9.3 // indirect + github.com/kaptinlin/jsonpointer v0.4.28 // indirect + github.com/kaptinlin/jsonschema v0.9.8 // indirect github.com/klauspost/compress v1.19.1 // indirect github.com/lucasb-eyer/go-colorful v1.3.0 // indirect github.com/mattn/go-runewidth v0.0.17 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/muesli/cancelreader v0.2.2 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect - github.com/openai/openai-go/v3 v3.46.0 // indirect + github.com/openai/openai-go/v3 v3.50.0 // indirect + github.com/pb33f/ordered-map/v2 v2.3.1 // indirect github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect github.com/prometheus/client_golang v1.24.1 // indirect github.com/prometheus/client_model v0.6.2 // indirect @@ -95,6 +99,7 @@ require ( github.com/prometheus/procfs v0.21.1 // indirect github.com/rivo/uniseg v0.4.7 // indirect github.com/spiffe/go-spiffe/v2 v2.8.1 // indirect + github.com/standard-webhooks/standard-webhooks/libraries v0.0.1 // indirect github.com/tidwall/gjson v1.19.0 // indirect github.com/tidwall/match v1.1.1 // indirect github.com/tidwall/pretty v1.2.1 // indirect @@ -114,6 +119,7 @@ require ( go.opentelemetry.io/otel/trace v1.44.0 // indirect go.opentelemetry.io/proto/otlp v1.11.0 // indirect go.yaml.in/yaml/v2 v2.4.4 // indirect + go.yaml.in/yaml/v4 v4.0.0-rc.3 // indirect golang.org/x/crypto v0.54.0 // indirect golang.org/x/exp v0.0.0-20260312153236-7ab1446f8b90 // indirect golang.org/x/image v0.44.0 // indirect @@ -124,7 +130,7 @@ require ( golang.org/x/text v0.40.0 // indirect golang.org/x/time v0.15.0 // indirect google.golang.org/api v0.291.0 // indirect - google.golang.org/genai v1.65.0 // indirect + google.golang.org/genai v1.67.0 // indirect google.golang.org/genproto v0.0.0-20260729162451-8efbd57d26e0 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20260729162451-8efbd57d26e0 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20260729162451-8efbd57d26e0 // indirect diff --git a/examples/go.sum b/examples/go.sum index 497d05d47..4c18176f4 100644 --- a/examples/go.sum +++ b/examples/go.sum @@ -28,58 +28,62 @@ github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0 github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.59.0/go.mod h1:V9g30lTKzfUsEW+gpWssck6u9IhARajmipodImLLcwI= github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.59.0 h1:18FRm6ZcN/x9+ZmhMr96hLcTtlLn2/gHPuDLVeg7XcY= github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.59.0/go.mod h1:YqwkQPrWSC7+byyc1VlKbWLBF5JsW5IoL6xUkemYSXk= +github.com/anthropics/anthropic-sdk-go v1.63.0 h1:GNl6LVjjxg1bRY41nlrvL5FvlwQs7FbYgQ3DnoVITD4= +github.com/anthropics/anthropic-sdk-go v1.63.0/go.mod h1:3EfIfmFqxH6rbiLcIP4tPFyXL/IHakx2wDG4OU+TIEI= github.com/ardanlabs/jinja v1.5.0 h1:OkNpmq9fXiCDRHMLCsd+VO/uk8L/tVwNJE+yA3JAhhM= github.com/ardanlabs/jinja v1.5.0/go.mod h1:aXXzlJfjA+T3XNKA/YT5ZtDq2VJxt5a5siZ8cl9B35Q= github.com/ardanlabs/kronk v1.29.9 h1:ThmbRCKSXGLl68tOHCMp5gNBCmyEV1Syi66aP+HMoxo= github.com/ardanlabs/kronk v1.29.9/go.mod h1:419Te3wIWthLXzUvkP0LIh6FVA9Hh1JsCKA2XY+M3jU= -github.com/aws/aws-sdk-go-v2 v1.43.2 h1:cl+IXwWb3qazClUcm08tGSsB6OiuV83JVJO9B0jQcPc= -github.com/aws/aws-sdk-go-v2 v1.43.2/go.mod h1:WEzLKBh/mEjXvx1FtQMWgSxMSTVqxQzjkRtk5fa3wkg= +github.com/aws/aws-sdk-go-v2 v1.43.4 h1:b9FTvbRwy+JCsfp2Wp6wV/KbOx3Aj7nkoFb2cRX0IhE= +github.com/aws/aws-sdk-go-v2 v1.43.4/go.mod h1:70vwSy16txshwG+g55WkpgPKDIByzHI8ccBsOteo3bQ= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.15 h1:rq/p1VNFfygoKEQ9hHMKsKBE98lspPvT8IxaFs5mFhw= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.15/go.mod h1:bELIhlPfW8OkpDhP1MvCjHDtvv8NhiBTz+K4o26zrXA= -github.com/aws/aws-sdk-go-v2/config v1.32.33 h1:M1m/Q6f0OKDEDGwhiNOqx1OjTdrewe3v+GDbHmKczWk= -github.com/aws/aws-sdk-go-v2/config v1.32.33/go.mod h1:fGj1iQj2QpIZzp7jE4aQQ+71TE8cd4z9K4+xCd6EqmE= -github.com/aws/aws-sdk-go-v2/credentials v1.19.32 h1:eNE0JnIblBo1NCvd3tqEYuZz9XDefn69R74CHd3nT7U= -github.com/aws/aws-sdk-go-v2/credentials v1.19.32/go.mod h1:yYJu+6tqKUYZuJSYcpSGjz/6sV/SUaAaKIufnWKx2OU= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.33 h1:MobhiR6KIerWxmO74Zit5I3379+mSc2DOdZ3DeRFB9w= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.33/go.mod h1:xu02847OdZfNr/jAfZpHtyRk0b3v4d0kaoxNHxZGG/w= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.33 h1:HAp1wLFZzch054uh3FK7rcVYg4v7J2FxVf3h3IGNZas= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.33/go.mod h1:mJk5fmqnF+WUlMdPG37pR2Fh3oh6r8F6ZGUgPKvzu0c= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.33 h1:0YA0aCKgsJyno6xkFfaIgjE3/wK08+Qxo9nQfe1UrWM= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.33/go.mod h1:UZqj4WIdTH+ga8Y/DgpAuy/8cGjM3h7gDCliJYGg2SE= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.34 h1:HQYnjFnXpX8EbPW5M1QT8mXzesRPwly0HEPTcFlS02Y= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.34/go.mod h1:tGzj56niKYZBbDIRhwPGDqrULzmWv5b6uBQGqyNaFZw= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.14 h1:SA43nfaY7+1jjMNIc2ywu99JLJLButtIdLP6j+bT870= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.14/go.mod h1:Du3llKcwbQvHsTXSLzTOGQz0DTDBMEzdg7DAGu7inrY= +github.com/aws/aws-sdk-go-v2/config v1.32.35 h1:UEzXuET8E42lxBPijuACu/tEK7v5lFPlk0Q+GT5WD9E= +github.com/aws/aws-sdk-go-v2/config v1.32.35/go.mod h1:KaMtJpFa2JlL2BStjjHQVwQpzZEmw+ND/EgVrfFoo2g= +github.com/aws/aws-sdk-go-v2/credentials v1.19.34 h1:y6GkSmcv5myd1ngrYbGmiLlwQqB6TQhOuN/tbSSuWDY= +github.com/aws/aws-sdk-go-v2/credentials v1.19.34/go.mod h1:w3dTcnDVoQIewjo7JG45hduAToikiIFLC4FIO7fndvw= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.35 h1:+S7kbJoLDDQ5tE+lHrUBgMkzC8NLgsaioS2F3dVoFAE= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.35/go.mod h1:Ak7xXviIARfFdNUJ9Etb0bdVDt/KAvKjMGJVLWXDzik= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.35 h1:kzVuGlatQtYinwBJEEyLAbggepCoavosiaHHX9+fD+c= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.35/go.mod h1:0yLx0yEI+SfqeJMPvOtIEFoZbiQYXMGszBueiutQyaI= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.35 h1:WK6CjihTuLisCjSKKbildJ79sGZZgbBz3iNa7VsKIhU= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.35/go.mod h1:KYleN57luLoe97R7vTnx8PMcVrr9gAcRECtOjl91DNg= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.36 h1:jbGY4CXLzZElOXgGsexlC3Hi+3YM0rSmk4opFXKqg/k= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.36/go.mod h1:uBu/9aKsS/UQGc72RAt3y54kjgYQxmhut8ZD2dXCDNE= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.15 h1:JJLBQxwY+AFwuPAi5ivGc1ChnTdUt4cXMv7e76m2c/Y= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.15/go.mod h1:lQknBIe78MVL0cQOQDlag8KGflMbMEVFx9mB6O8ENvk= github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.26 h1:Eflerh7atY6HN0yz60peNLOkJA2ZKUyYjZexMbqwMCE= github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.26/go.mod h1:dCAXNDmik9NuTjfsvCvW22S6ZFpxmtoliFoQu5XFkh8= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.33 h1:mqI7OrxN/DUH85F5OqVn3cIfuZ3+HVcebUm2N8mLlgQ= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.33/go.mod h1:eZ5jdEpvaaOU8nWWE4cTAJETSEA5FZoWxvNRao4piHY= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.35 h1:BBEElKh4a+rKshvjrfpajTe9CbpZvrbb4Jkg2PB7RzA= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.35/go.mod h1:zaZk983w//8beSruBVec/mr4CmDwgZitW/qzGhAAX0g= github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.34 h1:Lercr2QB2rOrCwyOusmnQ7IiopfkGcZAgMJbjcSdK/s= github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.34/go.mod h1:W0xXPPCb2HAqa3cp2f/nRvE+jGgBmchiuXrfBRlfb1I= github.com/aws/aws-sdk-go-v2/service/s3 v1.106.2 h1:lFSYDEyC1JHucMH3fdczMTnDaghqNttyRXKM8JY9EJQ= github.com/aws/aws-sdk-go-v2/service/s3 v1.106.2/go.mod h1:aw1E7RCjxs5Sd8N6WdICMcMroff12Tzxte+ELXXNqRU= -github.com/aws/aws-sdk-go-v2/service/signin v1.5.2 h1:EjI1CZzDcBxPkTa3j1BdtIrUDbqnOGssFMeyUS+6W0I= -github.com/aws/aws-sdk-go-v2/service/signin v1.5.2/go.mod h1:vN3eb5H8MEAZ4dx0F5Wc9LT8eb3eW7bZZ5BjGJdbw9k= -github.com/aws/aws-sdk-go-v2/service/sso v1.33.2 h1:zMP1FDFE08L7sM5f1QqkH/ZgKKg8Uc0Dz7KhSSYqWkw= -github.com/aws/aws-sdk-go-v2/service/sso v1.33.2/go.mod h1:0LoIZSUKjdo2BleHfT1hv/jlD33LQS00IrBlzoUsoUQ= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.38.2 h1:9eTqUYl+SyVmaRPMyBXSO9wwqC6TRwZB82pKENK2hdQ= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.38.2/go.mod h1:DThweuz22kiLc7lGHop5vQ9c3bx5W6Azs/YqSHa2fu8= -github.com/aws/aws-sdk-go-v2/service/sts v1.45.2 h1:EJd8vZO3E8SE6nmPqxuxlQ1NeSb8as50sf6eGdV4Saw= -github.com/aws/aws-sdk-go-v2/service/sts v1.45.2/go.mod h1:OgpPvKzsO2Ranjpli/20djMkg6UrV5mw4W3pZpq1Mqo= -github.com/aws/smithy-go v1.27.5 h1:d1ro7KpYOYwP6m73YFa+Kc/A130VsAdX68SpsJwARMM= -github.com/aws/smithy-go v1.27.5/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc= +github.com/aws/aws-sdk-go-v2/service/signin v1.5.4 h1:cOJELVNrq5Q3Udry2GLuHUM7MhwpeaQRdYaoa6GI/yI= +github.com/aws/aws-sdk-go-v2/service/signin v1.5.4/go.mod h1:f4LxzKBtaTxD7xh3PiVg3CE1tchQemfmghaJr+NbK2c= +github.com/aws/aws-sdk-go-v2/service/sso v1.33.4 h1:AMW7a7S8iQaHjBYZdU3PCq4GKRPijTPRAc7e6XtEThY= +github.com/aws/aws-sdk-go-v2/service/sso v1.33.4/go.mod h1:QQNsFV1DVXoXcZt18FS8lI8rtUrlDyAuWZLQ5shunv4= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.38.4 h1:AsbZcJAQPRmHDJG8K1N0pof/1zPWjVT8TFlTWuGLSvo= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.38.4/go.mod h1:6imqztH0//t0mKbl6yWl7swSEl7F/w32oAmqB3vP1ag= +github.com/aws/aws-sdk-go-v2/service/sts v1.45.4 h1:w/AryDYMjSUANSQ2uoZxJovUsMTwWJNTv3IMex30Y+4= +github.com/aws/aws-sdk-go-v2/service/sts v1.45.4/go.mod h1:WeBiAa67azG7Su9Vf+ChGDBLiAozJCXzdjXiPBUwtbc= +github.com/aws/smithy-go v1.27.6 h1:0zjT8jgK3jbrTT7JJ3EE6JsMhX8JTrZ+f1sEndYDXrA= +github.com/aws/smithy-go v1.27.6/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc= github.com/aymanbagabas/go-udiff v0.2.0 h1:TK0fH4MteXUDspT88n8CKzvK0X9O2xu9yQjWpi6yML8= github.com/aymanbagabas/go-udiff v0.2.0/go.mod h1:RE4Ex0qsGkTAJoQdQQCA0uG+nAzJO/pI/QwceO5fgrA= +github.com/bahlo/generic-list-go v0.2.0 h1:5sz/EEAK+ls5wF+NeqDpk5+iNdMDXrh3z3nPnH1Wvgk= +github.com/bahlo/generic-list-go v0.2.0/go.mod h1:2KvAjgMlE5NNynlg/5iLrrCCZ2+5xWbdbCW3pNTGyYg= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d h1:xDfNPAt8lFiC1UJrqV3uuy861HCTo708pDMbjHHdCas= github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d/go.mod h1:6QX/PXZ00z/TKoufEY6K/a0k6AhaJrQKdFe6OfVXsa4= +github.com/buger/jsonparser v1.1.2 h1:frqHqw7otoVbk5M8LlE/L7HTnIq2v9RX6EJ48i9AxJk= +github.com/buger/jsonparser v1.1.2/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/charmbracelet/anthropic-sdk-go v0.0.0-20260223140439-63879b0b8dab h1:J7XQLgl9sefgTnTGrmX3xqvp5o6MCiBzEjGv5igAlc4= -github.com/charmbracelet/anthropic-sdk-go v0.0.0-20260223140439-63879b0b8dab/go.mod h1:hqlYqR7uPKOKfnNeicUbZp0Ps0GeYFlKYtwh5HGDCx8= github.com/charmbracelet/colorprofile v0.3.2 h1:9J27WdztfJQVAQKX2WOlSSRB+5gaKqqITmrvb1uTIiI= github.com/charmbracelet/colorprofile v0.3.2/go.mod h1:mTD5XzNeWHj8oqHb+S1bssQb7vIHbepiebQ2kPKVKbI= github.com/charmbracelet/lipgloss/v2 v2.0.0-beta1 h1:SOylT6+BQzPHEjn15TIzawBPVD0QmhKXbcb3jY0ZIKU= @@ -161,12 +165,14 @@ github.com/hashicorp/go-version v1.9.0 h1:CeOIz6k+LoN3qX9Z0tyQrPtiB1DFYRPfCIBtaX github.com/hashicorp/go-version v1.9.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hybridgroup/yzma v1.21.0 h1:xBgCH9ziielLeexci8eJ/PvnxCzgLktOaoHH5p/ef30= github.com/hybridgroup/yzma v1.21.0/go.mod h1:wAMtNTjSnE79jTWzaeFSsuraam0TXKCPajMHA5s+OX8= +github.com/invopop/jsonschema v0.14.0 h1:MHQqLhvpNUZfw+hM3AZDYK7jxO8FZoQeQM77g8iyZjg= +github.com/invopop/jsonschema v0.14.0/go.mod h1:ygm6C2EaVNMBDPpaPlnOA2pFAxBnxGjFlMZABxm9n2I= github.com/jupiterrider/ffi v0.7.0 h1:RKsl6Ascal+3kyAqR5Qcbp83LceQMLc1VZbPfHWoNzs= github.com/jupiterrider/ffi v0.7.0/go.mod h1:9dauhpOfNqrqk28fxuu0kkdeFtT9Qr4vbfigiuIXN7c= -github.com/kaptinlin/jsonpointer v0.4.27 h1:5FOnhlkqQ4/lvHudaAWS8HJCXjN4yAHSIGl7aPKHI0Q= -github.com/kaptinlin/jsonpointer v0.4.27/go.mod h1:dfub/n58cWS32Dyf3AZsnKblSAgrz9PyOU76GDPpx8Q= -github.com/kaptinlin/jsonschema v0.9.3 h1:uDVd3w4aXwO0tbycblKYvFofhl3hVuE31vOl5JkDXI0= -github.com/kaptinlin/jsonschema v0.9.3/go.mod h1:LvtQ/mO0E1e/3c3DiOWTj05LTeot8cTv7DyQq7eJMQg= +github.com/kaptinlin/jsonpointer v0.4.28 h1:PyxOfdml9PGpxQz+JnNLGsyzQ+Rnm+OVNTGcgbVLqgg= +github.com/kaptinlin/jsonpointer v0.4.28/go.mod h1:JzeIDw1+60bryzOFea9P3zjKg8pfJHd+UIA/zfZ70x8= +github.com/kaptinlin/jsonschema v0.9.8 h1:srpfx2MAm4ecYz0zJLbz6fiW+UXiuv+vGhUqZUIWmrg= +github.com/kaptinlin/jsonschema v0.9.8/go.mod h1:TP7RFmFBNExjBE0b3fsM6RpA/9PeOzfg2g4weXqOrDg= github.com/klauspost/compress v1.19.1 h1:VsB4HPswih7mmZ8WleSFQ75c/Ui1M4trX5oAsJnhSlk= github.com/klauspost/compress v1.19.1/go.mod h1:cwPg85FWrGar70rWktvGQj8/hthj3wpl0PGDogxkrSQ= github.com/lucasb-eyer/go-colorful v1.3.0 h1:2/yBRLdWBZKrf7gB40FoiKfAWYQ0lqNcbuQwVHXptag= @@ -179,8 +185,10 @@ github.com/muesli/cancelreader v0.2.2 h1:3I4Kt4BQjOR54NavqnDogx/MIoWBFa0StPA8ELU github.com/muesli/cancelreader v0.2.2/go.mod h1:3XuTXfFS2VjM+HTLZY9Ak0l6eUKfijIfMUZ4EgX0QYo= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/openai/openai-go/v3 v3.46.0 h1:9HzL4DOybwOHAAcsGpMQyELuw0e9OqynJOPV8SH8g5M= -github.com/openai/openai-go/v3 v3.46.0/go.mod h1:b8MgNMpR3lPifYnaOH8XwcG8qRHwhzZxuDgM9lL7h5k= +github.com/openai/openai-go/v3 v3.50.0 h1:CXn+C8a10oQiI5CMyMbCiykhITVhVxhdHX8j3CfLa2U= +github.com/openai/openai-go/v3 v3.50.0/go.mod h1:Ogjo0gDct+Jm7yCqaCjLGQGygeV8xNfNHV1/yKvCji0= +github.com/pb33f/ordered-map/v2 v2.3.1 h1:5319HDO0aw4DA4gzi+zv4FXU9UlSs3xGZ40wcP1nBjY= +github.com/pb33f/ordered-map/v2 v2.3.1/go.mod h1:qxFQgd0PkVUtOMCkTapqotNgzRhMPL7VvaHKbd1HnmQ= github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= @@ -198,6 +206,8 @@ github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/spiffe/go-spiffe/v2 v2.8.1 h1:eXZMLsu+3MLEPJyGJkolqtVrteZfQdUpOWj6LTiDl/E= github.com/spiffe/go-spiffe/v2 v2.8.1/go.mod h1:47Q0Q9/AqGha8QLHp+kxpH4Wca7X7EnOtlIJy3mxZ3U= +github.com/standard-webhooks/standard-webhooks/libraries v0.0.1 h1:uOfcYT+3QungH6tIGSVCR/Y3KJmgJiHcojJbMTPDZAI= +github.com/standard-webhooks/standard-webhooks/libraries v0.0.1/go.mod h1:L1MQhA6x4dn9r007T033lsaZMv9EmBAdXyU/+EF40fo= github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= github.com/tidwall/gjson v1.14.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= @@ -246,6 +256,8 @@ go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.yaml.in/yaml/v2 v2.4.4 h1:tuyd0P+2Ont/d6e2rl3be67goVK4R6deVxCUX5vyPaQ= go.yaml.in/yaml/v2 v2.4.4/go.mod h1:gMZqIpDtDqOfM0uNfy0SkpRhvUryYH0Z6wdMYcacYXQ= +go.yaml.in/yaml/v4 v4.0.0-rc.3 h1:3h1fjsh1CTAPjW7q/EMe+C8shx5d8ctzZTrLcs/j8Go= +go.yaml.in/yaml/v4 v4.0.0-rc.3/go.mod h1:aZqd9kCMsGL7AuUv/m/PvWLdg5sjJsZ4oHDEnfPPfY0= golang.org/x/crypto v0.54.0 h1:YLIA59K4fiNzHzjnZt2tUJQjQtUWfWbeHBqKtk3eScw= golang.org/x/crypto v0.54.0/go.mod h1:KWL8ny2AZdGR2cWmzeHrp2azQPGogOv+HeQaVEXC2dk= golang.org/x/exp v0.0.0-20260312153236-7ab1446f8b90 h1:jiDhWWeC7jfWqR9c/uplMOqJ0sbNlNWv0UkzE0vX1MA= @@ -268,8 +280,8 @@ gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4= gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E= google.golang.org/api v0.291.0 h1:wfPbbY+mr9c7wZLqqzrHJLft/q8iFKREd6IgTBUene0= google.golang.org/api v0.291.0/go.mod h1:at7kwWbuonglBFEBoeMDAV1bguHqL3qf0BHFsv3coa0= -google.golang.org/genai v1.65.0 h1:6QK3Rjsx0iuJjbDCE1vf1VUr1IEjRDpvexGGnhxoAIk= -google.golang.org/genai v1.65.0/go.mod h1:mDdPDFXo1Ats7f1WXVyZgWb/CkMzFWTWJruIMy7hGIU= +google.golang.org/genai v1.67.0 h1:m3V2AK2zbyViUq9rhTkMgkxu32Fueypy5Pzd9yV8GwU= +google.golang.org/genai v1.67.0/go.mod h1:mDdPDFXo1Ats7f1WXVyZgWb/CkMzFWTWJruIMy7hGIU= google.golang.org/genproto v0.0.0-20260729162451-8efbd57d26e0 h1:xJf8e9ReUqiexuIT3OWJkvA4RdgR8K4Hfheq8gaKxIM= google.golang.org/genproto v0.0.0-20260729162451-8efbd57d26e0/go.mod h1:0MNk3ibJAyOwDZVlp18knQe3jRyFxpcU06xjxhgjx0M= google.golang.org/genproto/googleapis/api v0.0.0-20260729162451-8efbd57d26e0 h1:ybvH/ZpOcpCrjtkb7oW/fdlzbEmRVeumw19SRQmNFKU= From fb9501be97410f822f0543a5ff2e84cce22002c0 Mon Sep 17 00:00:00 2001 From: William Kennedy Date: Wed, 12 Aug 2026 17:43:17 +0100 Subject: [PATCH 073/156] chore(deps): update kronk to v1.30.8 (#332) Co-authored-by: Amp --- examples/go.mod | 52 +-- examples/go.sum | 108 +++--- examples/kronk/simple/main.go | 19 +- examples/kronk/stream/main.go | 21 +- examples/kronk/vision/main.go | 80 ++++ go.mod | 52 +-- go.sum | 108 +++--- providers/kronk/error.go | 87 +++++ providers/kronk/error_test.go | 86 +++++ providers/kronk/kronk.go | 33 +- providers/kronk/kronk_test.go | 57 +++ providers/kronk/language_model.go | 367 +++++++------------ providers/kronk/language_model_hooks.go | 65 +++- providers/kronk/language_model_hooks_test.go | 134 +++++++ providers/kronk/language_model_test.go | 329 +++++++++++++++++ providers/kronk/options.go | 259 ++++++++++++- providers/kronk/provider_options.go | 81 +++- 17 files changed, 1512 insertions(+), 426 deletions(-) create mode 100644 examples/kronk/vision/main.go create mode 100644 providers/kronk/error.go create mode 100644 providers/kronk/error_test.go create mode 100644 providers/kronk/kronk_test.go create mode 100644 providers/kronk/language_model_hooks_test.go create mode 100644 providers/kronk/language_model_test.go diff --git a/examples/go.mod b/examples/go.mod index ff97c3e57..bed2810e1 100644 --- a/examples/go.mod +++ b/examples/go.mod @@ -14,10 +14,10 @@ require ( require ( cel.dev/expr v0.25.2 // indirect cloud.google.com/go v0.123.0 // indirect - cloud.google.com/go/auth v0.22.0 // indirect + cloud.google.com/go/auth v0.23.0 // indirect cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect cloud.google.com/go/compute/metadata v0.9.0 // indirect - cloud.google.com/go/iam v1.12.0 // indirect + cloud.google.com/go/iam v1.13.0 // indirect cloud.google.com/go/monitoring v1.30.0 // indirect cloud.google.com/go/storage v1.64.0 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.35.0 // indirect @@ -25,9 +25,9 @@ require ( github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.59.0 // indirect github.com/anthropics/anthropic-sdk-go v1.63.0 // indirect github.com/ardanlabs/jinja v1.5.0 // indirect - github.com/ardanlabs/kronk v1.29.9 // indirect + github.com/ardanlabs/kronk v1.30.8 // indirect github.com/aws/aws-sdk-go-v2 v1.43.4 // indirect - github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.15 // indirect + github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.16 // indirect github.com/aws/aws-sdk-go-v2/config v1.32.35 // indirect github.com/aws/aws-sdk-go-v2/credentials v1.19.34 // indirect github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.35 // indirect @@ -35,15 +35,15 @@ require ( github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.35 // indirect github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.36 // indirect github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.15 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.26 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.28 // indirect github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.35 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.34 // indirect - github.com/aws/aws-sdk-go-v2/service/s3 v1.106.2 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.36 // indirect + github.com/aws/aws-sdk-go-v2/service/s3 v1.107.0 // indirect github.com/aws/aws-sdk-go-v2/service/signin v1.5.4 // indirect github.com/aws/aws-sdk-go-v2/service/sso v1.33.4 // indirect github.com/aws/aws-sdk-go-v2/service/ssooidc v1.38.4 // indirect github.com/aws/aws-sdk-go-v2/service/sts v1.45.4 // indirect - github.com/aws/smithy-go v1.27.6 // indirect + github.com/aws/smithy-go v1.27.7 // indirect github.com/bahlo/generic-list-go v0.2.0 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d // indirect @@ -71,20 +71,20 @@ require ( github.com/google/go-cmp v0.7.0 // indirect github.com/google/s2a-go v0.1.9 // indirect github.com/google/uuid v1.6.0 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.3.19 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.3.20 // indirect github.com/googleapis/gax-go/v2 v2.23.0 // indirect github.com/gorilla/websocket v1.5.3 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.29.0 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.30.0 // indirect github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.74 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-getter v1.8.6 // indirect github.com/hashicorp/go-version v1.9.0 // indirect - github.com/hybridgroup/yzma v1.21.0 // indirect + github.com/hybridgroup/yzma v1.22.0 // indirect github.com/invopop/jsonschema v0.14.0 // indirect github.com/jupiterrider/ffi v0.7.0 // indirect github.com/kaptinlin/jsonpointer v0.4.28 // indirect github.com/kaptinlin/jsonschema v0.9.8 // indirect - github.com/klauspost/compress v1.19.1 // indirect + github.com/klauspost/compress v1.19.2 // indirect github.com/lucasb-eyer/go-colorful v1.3.0 // indirect github.com/mattn/go-runewidth v0.0.17 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect @@ -107,16 +107,16 @@ require ( github.com/ulikunitz/xz v0.5.16 // indirect github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect go.opentelemetry.io/auto/sdk v1.2.1 // indirect - go.opentelemetry.io/contrib/detectors/gcp v1.44.0 // indirect - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.69.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.69.0 // indirect - go.opentelemetry.io/otel v1.44.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.44.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.44.0 // indirect - go.opentelemetry.io/otel/metric v1.44.0 // indirect - go.opentelemetry.io/otel/sdk v1.44.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.44.0 // indirect - go.opentelemetry.io/otel/trace v1.44.0 // indirect + go.opentelemetry.io/contrib/detectors/gcp v1.45.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.70.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.70.0 // indirect + go.opentelemetry.io/otel v1.45.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.45.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.45.0 // indirect + go.opentelemetry.io/otel/metric v1.45.0 // indirect + go.opentelemetry.io/otel/sdk v1.45.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.45.0 // indirect + go.opentelemetry.io/otel/trace v1.45.0 // indirect go.opentelemetry.io/proto/otlp v1.11.0 // indirect go.yaml.in/yaml/v2 v2.4.4 // indirect go.yaml.in/yaml/v4 v4.0.0-rc.3 // indirect @@ -129,11 +129,11 @@ require ( golang.org/x/sys v0.47.0 // indirect golang.org/x/text v0.40.0 // indirect golang.org/x/time v0.15.0 // indirect - google.golang.org/api v0.291.0 // indirect + google.golang.org/api v0.292.0 // indirect google.golang.org/genai v1.67.0 // indirect - google.golang.org/genproto v0.0.0-20260729162451-8efbd57d26e0 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20260729162451-8efbd57d26e0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20260729162451-8efbd57d26e0 // indirect + google.golang.org/genproto v0.0.0-20260807164820-c8921c73eeea // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20260807164820-c8921c73eeea // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20260807164820-c8921c73eeea // indirect google.golang.org/grpc v1.83.0 // indirect google.golang.org/protobuf v1.36.11 // indirect ) diff --git a/examples/go.sum b/examples/go.sum index 4c18176f4..ac6cba835 100644 --- a/examples/go.sum +++ b/examples/go.sum @@ -2,14 +2,14 @@ cel.dev/expr v0.25.2 h1:K6j46C81hXtZQfuX60cVWQFBJahKSE2gfRbNuvr5bFs= cel.dev/expr v0.25.2/go.mod h1:hrXvqGP6G6gyx8UAHSHJ5RGk//1Oj5nXQ2NI02Nrsg4= cloud.google.com/go v0.123.0 h1:2NAUJwPR47q+E35uaJeYoNhuNEM9kM8SjgRgdeOJUSE= cloud.google.com/go v0.123.0/go.mod h1:xBoMV08QcqUGuPW65Qfm1o9Y4zKZBpGS+7bImXLTAZU= -cloud.google.com/go/auth v0.22.0 h1:Xp9wAKkLoeaYb5pYZZoQGz4E9sdPxIbzS3gywZE3ciQ= -cloud.google.com/go/auth v0.22.0/go.mod h1:M9o2Oz+YI2jAfxewJgb1vyI3vceHF+eohmxyzmrl+9s= +cloud.google.com/go/auth v0.23.0 h1:6Gg1CMgpgubRG7DGz5Vf1pcoNo8RfiRiRAPS4crTp54= +cloud.google.com/go/auth v0.23.0/go.mod h1:4DhBRcqvtljQN3dJ57qtqbib5ZGCYE5f2crfiiC2EM0= cloud.google.com/go/auth/oauth2adapt v0.2.8 h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIiLpZnkHRbnc= cloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c= cloud.google.com/go/compute/metadata v0.9.0 h1:pDUj4QMoPejqq20dK0Pg2N4yG9zIkYGdBtwLoEkH9Zs= cloud.google.com/go/compute/metadata v0.9.0/go.mod h1:E0bWwX5wTnLPedCKqk3pJmVgCBSM6qQI1yTBdEb3C10= -cloud.google.com/go/iam v1.12.0 h1:Aki3bX9aHUDKPHfnRJfDcTdVedvy6quGBQcTqx3DRXk= -cloud.google.com/go/iam v1.12.0/go.mod h1:FEZ4lXpADAC2AIpQY7LANNjjwyQ2jK439CI2VaD+sLY= +cloud.google.com/go/iam v1.13.0 h1:ufT3FPT5rFFXu6UtLkNoxaOaV5EuA1dsSkmemCSTo6U= +cloud.google.com/go/iam v1.13.0/go.mod h1:gHXdDEiPDvqd1q1KwBDGQlgZY/BwY760zU2LhOZS5w0= cloud.google.com/go/logging v1.19.0 h1:NCqhdVUg3wQ8Cobdf16FDSuTGi3+6+hdSBHrY5TsR6Q= cloud.google.com/go/logging v1.19.0/go.mod h1:i40NZCHC9Gqvod4yE+yQfDWwlgwW/SrshkkGibCHxcA= cloud.google.com/go/longrunning v1.2.0 h1:WjYH3YHBGCxGJP9M4dWGHBfXr/cFIjMkNgWcJj7/iMM= @@ -32,12 +32,12 @@ github.com/anthropics/anthropic-sdk-go v1.63.0 h1:GNl6LVjjxg1bRY41nlrvL5FvlwQs7F github.com/anthropics/anthropic-sdk-go v1.63.0/go.mod h1:3EfIfmFqxH6rbiLcIP4tPFyXL/IHakx2wDG4OU+TIEI= github.com/ardanlabs/jinja v1.5.0 h1:OkNpmq9fXiCDRHMLCsd+VO/uk8L/tVwNJE+yA3JAhhM= github.com/ardanlabs/jinja v1.5.0/go.mod h1:aXXzlJfjA+T3XNKA/YT5ZtDq2VJxt5a5siZ8cl9B35Q= -github.com/ardanlabs/kronk v1.29.9 h1:ThmbRCKSXGLl68tOHCMp5gNBCmyEV1Syi66aP+HMoxo= -github.com/ardanlabs/kronk v1.29.9/go.mod h1:419Te3wIWthLXzUvkP0LIh6FVA9Hh1JsCKA2XY+M3jU= +github.com/ardanlabs/kronk v1.30.8 h1:MOGh/21FVan1p/m1TNYzdxyw5TEoL3mQoVj28V6t3kE= +github.com/ardanlabs/kronk v1.30.8/go.mod h1:gbG7Ya33lZRWo36mwICzY1vGfTd3HCxomQMAAUKpZzU= github.com/aws/aws-sdk-go-v2 v1.43.4 h1:b9FTvbRwy+JCsfp2Wp6wV/KbOx3Aj7nkoFb2cRX0IhE= github.com/aws/aws-sdk-go-v2 v1.43.4/go.mod h1:70vwSy16txshwG+g55WkpgPKDIByzHI8ccBsOteo3bQ= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.15 h1:rq/p1VNFfygoKEQ9hHMKsKBE98lspPvT8IxaFs5mFhw= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.15/go.mod h1:bELIhlPfW8OkpDhP1MvCjHDtvv8NhiBTz+K4o26zrXA= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.16 h1:aiuaKlDweRC5qExJondpWjOgyzMHpofpwspGXUtwn4c= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.16/go.mod h1:nG/LOlmox9BDe9HvQnXWzgcK8uKbgBMZ/Hp5pVt/21I= github.com/aws/aws-sdk-go-v2/config v1.32.35 h1:UEzXuET8E42lxBPijuACu/tEK7v5lFPlk0Q+GT5WD9E= github.com/aws/aws-sdk-go-v2/config v1.32.35/go.mod h1:KaMtJpFa2JlL2BStjjHQVwQpzZEmw+ND/EgVrfFoo2g= github.com/aws/aws-sdk-go-v2/credentials v1.19.34 h1:y6GkSmcv5myd1ngrYbGmiLlwQqB6TQhOuN/tbSSuWDY= @@ -52,14 +52,14 @@ github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.36 h1:jbGY4CXLzZElOXgGsexlC3Hi+3Y github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.36/go.mod h1:uBu/9aKsS/UQGc72RAt3y54kjgYQxmhut8ZD2dXCDNE= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.15 h1:JJLBQxwY+AFwuPAi5ivGc1ChnTdUt4cXMv7e76m2c/Y= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.15/go.mod h1:lQknBIe78MVL0cQOQDlag8KGflMbMEVFx9mB6O8ENvk= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.26 h1:Eflerh7atY6HN0yz60peNLOkJA2ZKUyYjZexMbqwMCE= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.26/go.mod h1:dCAXNDmik9NuTjfsvCvW22S6ZFpxmtoliFoQu5XFkh8= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.28 h1:Q1TF1J9jVD+vFo0LzNnmNdQ9EAt52TS+MQlq9Ir+Yxo= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.28/go.mod h1:4KqXXC/p1hrotmouDFbrRoWaLy962b9PMUReCG6+uWo= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.35 h1:BBEElKh4a+rKshvjrfpajTe9CbpZvrbb4Jkg2PB7RzA= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.35/go.mod h1:zaZk983w//8beSruBVec/mr4CmDwgZitW/qzGhAAX0g= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.34 h1:Lercr2QB2rOrCwyOusmnQ7IiopfkGcZAgMJbjcSdK/s= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.34/go.mod h1:W0xXPPCb2HAqa3cp2f/nRvE+jGgBmchiuXrfBRlfb1I= -github.com/aws/aws-sdk-go-v2/service/s3 v1.106.2 h1:lFSYDEyC1JHucMH3fdczMTnDaghqNttyRXKM8JY9EJQ= -github.com/aws/aws-sdk-go-v2/service/s3 v1.106.2/go.mod h1:aw1E7RCjxs5Sd8N6WdICMcMroff12Tzxte+ELXXNqRU= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.36 h1:EUIwBoN+q7UmhAejxgD27APiRjh1vwCFo53gSqdT0BM= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.36/go.mod h1:6u00gmlTGR6W0b2k9NBrld7MnOEmf1Spqx0VVt6AqyE= +github.com/aws/aws-sdk-go-v2/service/s3 v1.107.0 h1:OkYV+1171za+ab9otU1tGxMXhx6uZvwVEtVddjLuYTg= +github.com/aws/aws-sdk-go-v2/service/s3 v1.107.0/go.mod h1:5FTZoQxhmLEiCAtYVk6V+t0iS/B5yGZVLZ3Wq5FDJZI= github.com/aws/aws-sdk-go-v2/service/signin v1.5.4 h1:cOJELVNrq5Q3Udry2GLuHUM7MhwpeaQRdYaoa6GI/yI= github.com/aws/aws-sdk-go-v2/service/signin v1.5.4/go.mod h1:f4LxzKBtaTxD7xh3PiVg3CE1tchQemfmghaJr+NbK2c= github.com/aws/aws-sdk-go-v2/service/sso v1.33.4 h1:AMW7a7S8iQaHjBYZdU3PCq4GKRPijTPRAc7e6XtEThY= @@ -68,8 +68,8 @@ github.com/aws/aws-sdk-go-v2/service/ssooidc v1.38.4 h1:AsbZcJAQPRmHDJG8K1N0pof/ github.com/aws/aws-sdk-go-v2/service/ssooidc v1.38.4/go.mod h1:6imqztH0//t0mKbl6yWl7swSEl7F/w32oAmqB3vP1ag= github.com/aws/aws-sdk-go-v2/service/sts v1.45.4 h1:w/AryDYMjSUANSQ2uoZxJovUsMTwWJNTv3IMex30Y+4= github.com/aws/aws-sdk-go-v2/service/sts v1.45.4/go.mod h1:WeBiAa67azG7Su9Vf+ChGDBLiAozJCXzdjXiPBUwtbc= -github.com/aws/smithy-go v1.27.6 h1:0zjT8jgK3jbrTT7JJ3EE6JsMhX8JTrZ+f1sEndYDXrA= -github.com/aws/smithy-go v1.27.6/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc= +github.com/aws/smithy-go v1.27.7 h1:Zgj5z4LfcDYoQIVk+n/yGdTkP/2y6ZT5vYxe0fp7bqE= +github.com/aws/smithy-go v1.27.7/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc= github.com/aymanbagabas/go-udiff v0.2.0 h1:TK0fH4MteXUDspT88n8CKzvK0X9O2xu9yQjWpi6yML8= github.com/aymanbagabas/go-udiff v0.2.0/go.mod h1:RE4Ex0qsGkTAJoQdQQCA0uG+nAzJO/pI/QwceO5fgrA= github.com/bahlo/generic-list-go v0.2.0 h1:5sz/EEAK+ls5wF+NeqDpk5+iNdMDXrh3z3nPnH1Wvgk= @@ -147,14 +147,14 @@ github.com/google/s2a-go v0.1.9 h1:LGD7gtMgezd8a/Xak7mEWL0PjoTQFvpRudN895yqKW0= github.com/google/s2a-go v0.1.9/go.mod h1:YA0Ei2ZQL3acow2O62kdp9UlnvMmU7kA6Eutn0dXayM= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.3.19 h1:mMOE7DN2+p76/EdIrmAy9B9bH+yC4563vmnJ34QR8i4= -github.com/googleapis/enterprise-certificate-proxy v0.3.19/go.mod h1:rSEsBUemEBZEexP2y6jPp16LUmUbjmSbcPMQizR0o4k= +github.com/googleapis/enterprise-certificate-proxy v0.3.20 h1:t/xL64VUoN69MuMRQuJETqYGOw4Z9mSRJK9epIEtwFk= +github.com/googleapis/enterprise-certificate-proxy v0.3.20/go.mod h1:L3D/IQExI6LqEjBdXcZQ1WluSgigQmSwBboFstVPM4w= github.com/googleapis/gax-go/v2 v2.23.0 h1:Tchl7qkvE7Ip3y+ztvNufYFvkfqTe7NfLTYGIdJRLuE= github.com/googleapis/gax-go/v2 v2.23.0/go.mod h1:rBQKOVJCdb8IFEzg+FCwlt1LP/xMDGuqUXhUG+XMXEg= github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.29.0 h1:5VipnvEpbqr2gA2VbM+nYVbkIF28c5ZQfqCBQ5g2xfk= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.29.0/go.mod h1:Hyl3n6Twe1hvtd9XUXDec4pTvgMSEixRuQKPTMH2bNs= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.30.0 h1:/Tnpcb2E0Pz/tN9s3bfEY2Q8ePCEX9iuS+cneUwncnw= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.30.0/go.mod h1:zOBXOsUaBSjKgmH4OGzV1esUpR3oUSCPYVd2cUBjKYY= github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.74 h1:mymLUKThnV9wFvogOK8NnsMP9/vlhnjXY98gr2QIGW8= github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.74/go.mod h1:Bh9qYL8ehmDxSg14Tk8oxFCP90XHfs6NxV1D84884xA= github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= @@ -163,8 +163,8 @@ github.com/hashicorp/go-getter v1.8.6 h1:9sQboWULaydVphxc4S64oAI4YqpuCk7nPmvbk13 github.com/hashicorp/go-getter v1.8.6/go.mod h1:nVH12eOV2P58dIiL3rsU6Fh3wLeJEKBOJzhMmzlSWoo= github.com/hashicorp/go-version v1.9.0 h1:CeOIz6k+LoN3qX9Z0tyQrPtiB1DFYRPfCIBtaXPSCnA= github.com/hashicorp/go-version v1.9.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hybridgroup/yzma v1.21.0 h1:xBgCH9ziielLeexci8eJ/PvnxCzgLktOaoHH5p/ef30= -github.com/hybridgroup/yzma v1.21.0/go.mod h1:wAMtNTjSnE79jTWzaeFSsuraam0TXKCPajMHA5s+OX8= +github.com/hybridgroup/yzma v1.22.0 h1:QsWFWpdz42B/DCAhckGf/Q94FKjmf/lc2JmVNBCEJAY= +github.com/hybridgroup/yzma v1.22.0/go.mod h1:wAMtNTjSnE79jTWzaeFSsuraam0TXKCPajMHA5s+OX8= github.com/invopop/jsonschema v0.14.0 h1:MHQqLhvpNUZfw+hM3AZDYK7jxO8FZoQeQM77g8iyZjg= github.com/invopop/jsonschema v0.14.0/go.mod h1:ygm6C2EaVNMBDPpaPlnOA2pFAxBnxGjFlMZABxm9n2I= github.com/jupiterrider/ffi v0.7.0 h1:RKsl6Ascal+3kyAqR5Qcbp83LceQMLc1VZbPfHWoNzs= @@ -173,8 +173,8 @@ github.com/kaptinlin/jsonpointer v0.4.28 h1:PyxOfdml9PGpxQz+JnNLGsyzQ+Rnm+OVNTGc github.com/kaptinlin/jsonpointer v0.4.28/go.mod h1:JzeIDw1+60bryzOFea9P3zjKg8pfJHd+UIA/zfZ70x8= github.com/kaptinlin/jsonschema v0.9.8 h1:srpfx2MAm4ecYz0zJLbz6fiW+UXiuv+vGhUqZUIWmrg= github.com/kaptinlin/jsonschema v0.9.8/go.mod h1:TP7RFmFBNExjBE0b3fsM6RpA/9PeOzfg2g4weXqOrDg= -github.com/klauspost/compress v1.19.1 h1:VsB4HPswih7mmZ8WleSFQ75c/Ui1M4trX5oAsJnhSlk= -github.com/klauspost/compress v1.19.1/go.mod h1:cwPg85FWrGar70rWktvGQj8/hthj3wpl0PGDogxkrSQ= +github.com/klauspost/compress v1.19.2 h1:hMRETovs/pu/dVWN7zIT1PGG8t509MwT6bO7XSi26R8= +github.com/klauspost/compress v1.19.2/go.mod h1:cwPg85FWrGar70rWktvGQj8/hthj3wpl0PGDogxkrSQ= github.com/lucasb-eyer/go-colorful v1.3.0 h1:2/yBRLdWBZKrf7gB40FoiKfAWYQ0lqNcbuQwVHXptag= github.com/lucasb-eyer/go-colorful v1.3.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= github.com/mattn/go-runewidth v0.0.17 h1:78v8ZlW0bP43XfmAfPsdXcoNCelfMHsDmd/pkENfrjQ= @@ -226,30 +226,30 @@ github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavM github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM= go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= -go.opentelemetry.io/contrib/detectors/gcp v1.44.0 h1:NmLfL734pJhM0JKaYd2Y28+nY9dPRWYAAbxhRCrKXPw= -go.opentelemetry.io/contrib/detectors/gcp v1.44.0/go.mod h1:tNAsgd8avTGke1+MndXlU5Cru4PQ9Ai/cCNWQv/ZJ/s= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.69.0 h1:2yEATaop1/a1I4psnSLgWVPLWwCzkqWakgJy7xTDVy0= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.69.0/go.mod h1:D7J12YRapIekYyPWgGPlA/23pRmpSEZC5xJC/TTLI9U= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.69.0 h1:8tvICD4vSTOOsNrsI4Ljf6C+6UKvpTEH5XY3JMoyPoo= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.69.0/go.mod h1:z9+yiacE0IHRqM4qFfkbt/JYlmYXgss8GY/jXoNuPJI= -go.opentelemetry.io/otel v1.44.0 h1:JjwHmHpA4iZ3wBxluu2fbbE7j4kqlE8jXyAyPXH7HqU= -go.opentelemetry.io/otel v1.44.0/go.mod h1:BMgjTHL9WPRlRjL2oZCBTL4whCGtXch2H4BhOPIAyYc= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.44.0 h1:4YsVu3B8+3qtWYYrsUYgn0OG78pN0rnNPRGX4SbokQI= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.44.0/go.mod h1:+wnlSn0mD1ADVMe3v9Z/WIaiz6q6gL2J/ejaAmdmv80= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.44.0 h1:qazEJlUOQzhCpzQpFETGby7EdqjI1wsd0W+6Gg1SCTU= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.44.0/go.mod h1:fOD2Yefuxixkx3ahVNf0O/PERb6r4OlbxfATVnYvzCo= +go.opentelemetry.io/contrib/detectors/gcp v1.45.0 h1:9jR0ZPRok9ryaOQ2Wx8rg5F7Aon59mxrqbVI60/vlBk= +go.opentelemetry.io/contrib/detectors/gcp v1.45.0/go.mod h1:VSme3o2fvSg5bVg0dRzyHaj4Z5EVhG+g2Fde6LKzmQA= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.70.0 h1:oECp5f+hN7nkwjU/8BxQ/q23bGPb8FIrD839owX222E= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.70.0/go.mod h1:DqEFwLumhzMBDQv9PcWbyoDxHI/4lAk6CM4nJBH39sc= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.70.0 h1:LMuyCAyfalSjDyjdC65nK6N0zoTT63+E/u95X0JovZI= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.70.0/go.mod h1:085m8qbm4hgc8rZWGDEa4vmyyo2c3nPxUslYUKUIU04= +go.opentelemetry.io/otel v1.45.0 h1:pdrWmLHofpubmArBv1LgFSv1Z0Ie/ppdZzu+kUN5EeU= +go.opentelemetry.io/otel v1.45.0/go.mod h1:XZxIqPapzEYnhNSScF5DIqXhm/rYi0FzCe2XddAwZfQ= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.45.0 h1:QRefszxJmfPdjXUUm3j6iDzY03mTPXMjqErFqQ67vUg= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.45.0/go.mod h1:Tiz03lTBVBrm7eWZBOidzEaYaJa8tjwGUGv6d8mlTyk= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.45.0 h1:fG5MCxGz8+2VtrN/WgqSpJFctVz24gpxj8CxkKmc8Ww= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.45.0/go.mod h1:BmAYTn+3ysbRe+IU2msxmf5Rx3g6DHvex+tWI3LdhYI= go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.44.0 h1:hqxVTu/GtBF+vJ8d1fzW7fRxZFvgoDjWcxwwCaFDYpU= go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.44.0/go.mod h1:z5fVEF4X5v0ESvlJqBrrFlBVoj5EQuefZpzsu7R+x5Q= -go.opentelemetry.io/otel/metric v1.44.0 h1:1w0gILTcHdr3YI+ixLyjemwrVnsMURbTZFrSYCdDdmc= -go.opentelemetry.io/otel/metric v1.44.0/go.mod h1:8O7hanEPBNgEMmybD3s2VBKcgWOCsA6tzHBPODAiquo= -go.opentelemetry.io/otel/metric/x v0.66.0 h1:YkCrx1zLOChi9ZcZ6euupOcsgzbVlec7D/xoEU1+cTA= -go.opentelemetry.io/otel/metric/x v0.66.0/go.mod h1:d1+BDj9t96do0/1LoU1ayfCv79ZgNE41qbhBvnMOBZk= -go.opentelemetry.io/otel/sdk v1.44.0 h1:nHYwb9lK+fJPU/dnT6s7W7Z8itMWyqrnVfbheVYrZ58= -go.opentelemetry.io/otel/sdk v1.44.0/go.mod h1:Osuydd3Se74nqjAKxid74N5eC+jfEqfTegHRnq58oK0= -go.opentelemetry.io/otel/sdk/metric v1.44.0 h1:3LlKgI+VjbVsjNRFZJZAJ30WjXC5VkNRks6si09iEfI= -go.opentelemetry.io/otel/sdk/metric v1.44.0/go.mod h1:5B5pMARnXxKhltooO4xUuCBorl65a4EpnTalObqOigA= -go.opentelemetry.io/otel/trace v1.44.0 h1:jxF5CsGYCe74MCRx2X4g7WsY/VBKRqqpNvXlX/6gtIk= -go.opentelemetry.io/otel/trace v1.44.0/go.mod h1:oLl1jrMQAVo6v3GAggN+1VH9VIz9iUSvW53sW1Q8PIE= +go.opentelemetry.io/otel/metric v1.45.0 h1:7Eg1uH7CJ5cXv9is6tnBe1FI6rj1nwUdbFypRm3br/M= +go.opentelemetry.io/otel/metric v1.45.0/go.mod h1:HAPbm1nd3p1PmFH7v2dR+6BjXxw+Lq4a2+pndMAm08s= +go.opentelemetry.io/otel/metric/x v0.67.0 h1:PcicCNZFkZ4bXfSooXdo3WN7RBOVOtjVdo1wD358Uns= +go.opentelemetry.io/otel/metric/x v0.67.0/go.mod h1:FBjCWZe6wgcqxcMtjdGiClDKXb2YxxXii0CXftE4QtI= +go.opentelemetry.io/otel/sdk v1.45.0 h1:4VVSMgQ83dUgW2aoX5f6JgLvHwIvzcuLnF9lUdCSpCw= +go.opentelemetry.io/otel/sdk v1.45.0/go.mod h1:Sr40LgXV7DsKMMJMKOhUWOgMWTfAaqvm2kF0g7ilwuA= +go.opentelemetry.io/otel/sdk/metric v1.45.0 h1:oVFszMfyj1Am6s24Vtc7wBb8BKLcwepJjNEYILuiE3o= +go.opentelemetry.io/otel/sdk/metric v1.45.0/go.mod h1:vUWUxDZvu1WVRj8JA8S0AdhsPrZoDpA2DdZauIh4mDA= +go.opentelemetry.io/otel/trace v1.45.0 h1:l/mP6Uv7oNO7/TblbhpbgMidxhq1uO/rPsikOyVhxag= +go.opentelemetry.io/otel/trace v1.45.0/go.mod h1:qoJJA2xNMnxRrdISU/kLtfUH2wNeQbiv+jhs/CxI8bc= go.opentelemetry.io/proto/otlp v1.11.0 h1:5rrYs0Ykyj50sdU/JU0x8etU+LubXWb+gED6TbEdMIk= go.opentelemetry.io/proto/otlp v1.11.0/go.mod h1:SmVizdCOAm3XBtG1g1NnOdhW6jtddT72hLMhv8VwA8E= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= @@ -278,16 +278,16 @@ golang.org/x/time v0.15.0 h1:bbrp8t3bGUeFOx08pvsMYRTCVSMk89u4tKbNOZbp88U= golang.org/x/time v0.15.0/go.mod h1:Y4YMaQmXwGQZoFaVFk4YpCt4FLQMYKZe9oeV/f4MSno= gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4= gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E= -google.golang.org/api v0.291.0 h1:wfPbbY+mr9c7wZLqqzrHJLft/q8iFKREd6IgTBUene0= -google.golang.org/api v0.291.0/go.mod h1:at7kwWbuonglBFEBoeMDAV1bguHqL3qf0BHFsv3coa0= +google.golang.org/api v0.292.0 h1:Ewiwo/GTtiaPZSNAZQUcWLh8AYDEoPmIXyJfeoTSMHU= +google.golang.org/api v0.292.0/go.mod h1:07kjmMnFGm2RQuCza2EZM/5N68G/fVvFb1xKjWqoFA0= google.golang.org/genai v1.67.0 h1:m3V2AK2zbyViUq9rhTkMgkxu32Fueypy5Pzd9yV8GwU= google.golang.org/genai v1.67.0/go.mod h1:mDdPDFXo1Ats7f1WXVyZgWb/CkMzFWTWJruIMy7hGIU= -google.golang.org/genproto v0.0.0-20260729162451-8efbd57d26e0 h1:xJf8e9ReUqiexuIT3OWJkvA4RdgR8K4Hfheq8gaKxIM= -google.golang.org/genproto v0.0.0-20260729162451-8efbd57d26e0/go.mod h1:0MNk3ibJAyOwDZVlp18knQe3jRyFxpcU06xjxhgjx0M= -google.golang.org/genproto/googleapis/api v0.0.0-20260729162451-8efbd57d26e0 h1:ybvH/ZpOcpCrjtkb7oW/fdlzbEmRVeumw19SRQmNFKU= -google.golang.org/genproto/googleapis/api v0.0.0-20260729162451-8efbd57d26e0/go.mod h1:HJ9MpJLeDSstBkx1LILTpd5f41ADSMZcTPypw02qEGw= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260729162451-8efbd57d26e0 h1:mJiOtnGp0k/BcSgdu03G2NwnscCfCH+h2QKUBZr18KI= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260729162451-8efbd57d26e0/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= +google.golang.org/genproto v0.0.0-20260807164820-c8921c73eeea h1:EoNao6AiKb+bftjR8vFOxqtY1A4zLnvnfea+FBQicBo= +google.golang.org/genproto v0.0.0-20260807164820-c8921c73eeea/go.mod h1:MVqdGj2rFowpxM1nWJoGZmKI3TGThZsWENFz9uc4l1g= +google.golang.org/genproto/googleapis/api v0.0.0-20260807164820-c8921c73eeea h1:Jifw/kjs/r3B0uszvls/m3c3tmZs2YHGM9C+rvxP9gY= +google.golang.org/genproto/googleapis/api v0.0.0-20260807164820-c8921c73eeea/go.mod h1:K/+WGbmBY7aNW1HDw1fJnKYo10i0DkAX6pows00dLig= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260807164820-c8921c73eeea h1:kVhQEPTpKQahD5+JSBTfBB19wcgQTTjAIn45MBqnyHk= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260807164820-c8921c73eeea/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= google.golang.org/grpc v1.83.0 h1:JeNZEKJFbQxArAMl+hiytHauacDNqJUllNfmIMmpqnQ= google.golang.org/grpc v1.83.0/go.mod h1:kDyl6SKsiHKt0uylY5gtn5cEjkrIOhQOGDgIc4JGwzQ= google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= diff --git a/examples/kronk/simple/main.go b/examples/kronk/simple/main.go index 5e550a65a..ed758e65a 100644 --- a/examples/kronk/simple/main.go +++ b/examples/kronk/simple/main.go @@ -27,9 +27,10 @@ func run() error { defer cancel() // Create the provider with optional logging. - provider, err := kronk.New( + provider, err := kronk.NewProvider( kronk.WithName("kronk"), kronk.WithLogger(kronk.FmtLogger), + kronk.WithAutoTune(true), ) if err != nil { return fmt.Errorf("unable to create provider: %w", err) @@ -38,10 +39,8 @@ func run() error { // Clean up when done. defer func() { fmt.Println("\nUnloading Kronk") - if closer, ok := provider.(interface{ Close(context.Context) error }); ok { - if err := closer.Close(context.Background()); err != nil { - fmt.Printf("failed to close provider: %v\n", err) - } + if err := provider.Close(context.Background()); err != nil { + fmt.Printf("failed to close provider: %v\n", err) } }() @@ -71,6 +70,10 @@ func run() error { // Add the tool. cuteDogTool := fantasy.NewAgentTool("cute_dog_tool", "Provide up-to-date info on cute dogs.", fetchCuteDogInfo) + seed := int64(42) + minP := 0.05 + repeatPenalty := 1.1 + // Equip your agent. agent := fantasy.NewAgent( model, @@ -80,6 +83,11 @@ func run() error { fantasy.WithTemperature(0.7), fantasy.WithTopP(0.8), fantasy.WithTopK(20), + fantasy.WithProviderOptions(kronk.NewProviderOptions(&kronk.ProviderOptions{ + Seed: &seed, + MinP: &minP, + RepeatPenalty: &repeatPenalty, + })), ) // Put that agent to work! @@ -89,6 +97,7 @@ func run() error { return fmt.Errorf("agent generate failed: %w", err) } fmt.Println(result.Response.Content.Text()) + fmt.Printf("\nUsage: %s\n", result.TotalUsage) return nil } diff --git a/examples/kronk/stream/main.go b/examples/kronk/stream/main.go index e63465919..f21c96364 100644 --- a/examples/kronk/stream/main.go +++ b/examples/kronk/stream/main.go @@ -59,9 +59,10 @@ func run() error { defer cancel() // Create the provider with optional logging. - provider, err := kronk.New( + provider, err := kronk.NewProvider( kronk.WithName("kronk"), kronk.WithLogger(kronk.FmtLogger), + kronk.WithAutoTune(true), ) if err != nil { return fmt.Errorf("unable to create provider: %w", err) @@ -70,10 +71,8 @@ func run() error { // Clean up when done. defer func() { fmt.Println("\nUnloading Kronk") - if closer, ok := provider.(interface{ Close(context.Context) error }); ok { - if err := closer.Close(context.Background()); err != nil { - fmt.Printf("failed to close provider: %v\n", err) - } + if err := provider.Close(context.Background()); err != nil { + fmt.Printf("failed to close provider: %v\n", err) } }() @@ -124,6 +123,12 @@ func run() error { return nil }, + // When the final response starts. + OnTextStart: func(id string) error { + fmt.Print("[Response]\n") + return nil + }, + // When we receive a chunk of streaming data. OnTextDelta: func(id, text string) error { _, fmtErr := fmt.Print(text) @@ -157,11 +162,11 @@ func run() error { fmt.Println("Generating...") // Finally, let's stream everything! - _, err = agent.Stream(ctx, streamCall) + result, err := agent.Stream(ctx, streamCall) if err != nil { - fmt.Fprintf(os.Stderr, "Error generating response: %v\n", err) - os.Exit(1) + return fmt.Errorf("agent stream failed: %w", err) } + fmt.Printf("\nUsage: %s\n", result.TotalUsage) return nil } diff --git a/examples/kronk/vision/main.go b/examples/kronk/vision/main.go new file mode 100644 index 000000000..9ed0a441b --- /dev/null +++ b/examples/kronk/vision/main.go @@ -0,0 +1,80 @@ +package main + +import ( + "context" + "fmt" + "net/http" + "os" + "path/filepath" + "strings" + "time" + + "charm.land/fantasy" + "charm.land/fantasy/providers/kronk" +) + +const modelURL = "unsloth/Qwen3.5-0.8B-GGUF/Qwen3.5-0.8B-Q8_0.gguf" + +func main() { + if err := run(); err != nil { + fmt.Printf("\nERROR: %s\n", err) + os.Exit(1) + } +} + +func run() error { + if len(os.Args) != 2 { + return fmt.Errorf("usage: go run ./kronk/vision ") + } + + image, err := os.ReadFile(os.Args[1]) + if err != nil { + return fmt.Errorf("reading image: %w", err) + } + mediaType := http.DetectContentType(image) + if !strings.HasPrefix(mediaType, "image/") { + return fmt.Errorf("unsupported image type %q", mediaType) + } + + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Minute) + defer cancel() + + provider, err := kronk.NewProvider( + kronk.WithLogger(kronk.FmtLogger), + kronk.WithAutoTune(true), + ) + if err != nil { + return fmt.Errorf("creating provider: %w", err) + } + defer func() { + fmt.Println("\nUnloading Kronk") + if err := provider.Close(context.Background()); err != nil { + fmt.Printf("failed to close provider: %v\n", err) + } + }() + + languageModel, err := provider.LanguageModel(ctx, modelURL) + if err != nil { + return fmt.Errorf("loading language model: %w", err) + } + + agent := fantasy.NewAgent(languageModel) + result, err := agent.Generate(ctx, fantasy.AgentCall{ + Prompt: "Describe this image briefly.", + Files: []fantasy.FilePart{ + { + Filename: filepath.Base(os.Args[1]), + Data: image, + MediaType: mediaType, + }, + }, + }) + if err != nil { + return fmt.Errorf("generating description: %w", err) + } + + fmt.Println(result.Response.Content.Text()) + fmt.Printf("\nUsage: %s\n", result.TotalUsage) + + return nil +} diff --git a/go.mod b/go.mod index 4dea99e08..0d6938e84 100644 --- a/go.mod +++ b/go.mod @@ -4,12 +4,12 @@ go 1.26.5 require ( charm.land/x/vcr v0.1.1 - cloud.google.com/go/auth v0.22.0 + cloud.google.com/go/auth v0.23.0 github.com/anthropics/anthropic-sdk-go v1.63.0 - github.com/ardanlabs/kronk v1.29.9 + github.com/ardanlabs/kronk v1.30.8 github.com/aws/aws-sdk-go-v2 v1.43.4 github.com/aws/aws-sdk-go-v2/config v1.32.35 - github.com/aws/smithy-go v1.27.6 + github.com/aws/smithy-go v1.27.7 github.com/charmbracelet/x/exp/slice v0.0.0-20250904123553-b4e2667e5ad5 github.com/charmbracelet/x/exp/strings v0.1.0 github.com/charmbracelet/x/json v0.2.0 @@ -29,7 +29,7 @@ require ( cloud.google.com/go v0.123.0 // indirect cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect cloud.google.com/go/compute/metadata v0.9.0 // indirect - cloud.google.com/go/iam v1.12.0 // indirect + cloud.google.com/go/iam v1.13.0 // indirect cloud.google.com/go/monitoring v1.30.0 // indirect cloud.google.com/go/storage v1.64.0 // indirect github.com/Azure/azure-sdk-for-go/sdk/azcore v1.22.0 // indirect @@ -38,17 +38,17 @@ require ( github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.59.0 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.59.0 // indirect github.com/ardanlabs/jinja v1.5.0 // indirect - github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.15 // indirect + github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.16 // indirect github.com/aws/aws-sdk-go-v2/credentials v1.19.34 // indirect github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.35 // indirect github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.35 // indirect github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.35 // indirect github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.36 // indirect github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.15 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.26 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.28 // indirect github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.35 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.34 // indirect - github.com/aws/aws-sdk-go-v2/service/s3 v1.106.2 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.36 // indirect + github.com/aws/aws-sdk-go-v2/service/s3 v1.107.0 // indirect github.com/aws/aws-sdk-go-v2/service/signin v1.5.4 // indirect github.com/aws/aws-sdk-go-v2/service/sso v1.33.4 // indirect github.com/aws/aws-sdk-go-v2/service/ssooidc v1.38.4 // indirect @@ -72,19 +72,19 @@ require ( github.com/goccy/go-yaml v1.19.2 // indirect github.com/google/go-cmp v0.7.0 // indirect github.com/google/s2a-go v0.1.9 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.3.19 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.3.20 // indirect github.com/googleapis/gax-go/v2 v2.23.0 // indirect github.com/gorilla/websocket v1.5.3 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.29.0 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.30.0 // indirect github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.74 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-getter v1.8.6 // indirect github.com/hashicorp/go-version v1.9.0 // indirect - github.com/hybridgroup/yzma v1.21.0 // indirect + github.com/hybridgroup/yzma v1.22.0 // indirect github.com/invopop/jsonschema v0.14.0 // indirect github.com/jupiterrider/ffi v0.7.0 // indirect github.com/kaptinlin/jsonpointer v0.4.28 // indirect - github.com/klauspost/compress v1.19.1 // indirect + github.com/klauspost/compress v1.19.2 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/pb33f/ordered-map/v2 v2.3.1 // indirect @@ -102,16 +102,16 @@ require ( github.com/tidwall/sjson v1.2.5 // indirect github.com/ulikunitz/xz v0.5.16 // indirect go.opentelemetry.io/auto/sdk v1.2.1 // indirect - go.opentelemetry.io/contrib/detectors/gcp v1.44.0 // indirect - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.69.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.69.0 // indirect - go.opentelemetry.io/otel v1.44.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.44.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.44.0 // indirect - go.opentelemetry.io/otel/metric v1.44.0 // indirect - go.opentelemetry.io/otel/sdk v1.44.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.44.0 // indirect - go.opentelemetry.io/otel/trace v1.44.0 // indirect + go.opentelemetry.io/contrib/detectors/gcp v1.45.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.70.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.70.0 // indirect + go.opentelemetry.io/otel v1.45.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.45.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.45.0 // indirect + go.opentelemetry.io/otel/metric v1.45.0 // indirect + go.opentelemetry.io/otel/sdk v1.45.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.45.0 // indirect + go.opentelemetry.io/otel/trace v1.45.0 // indirect go.opentelemetry.io/proto/otlp v1.11.0 // indirect go.yaml.in/yaml/v2 v2.4.4 // indirect go.yaml.in/yaml/v4 v4.0.0-rc.3 // indirect @@ -121,10 +121,10 @@ require ( golang.org/x/sys v0.47.0 // indirect golang.org/x/text v0.40.0 // indirect golang.org/x/time v0.15.0 // indirect - google.golang.org/api v0.291.0 // indirect - google.golang.org/genproto v0.0.0-20260729162451-8efbd57d26e0 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20260729162451-8efbd57d26e0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20260729162451-8efbd57d26e0 // indirect + google.golang.org/api v0.292.0 // indirect + google.golang.org/genproto v0.0.0-20260807164820-c8921c73eeea // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20260807164820-c8921c73eeea // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20260807164820-c8921c73eeea // indirect google.golang.org/grpc v1.83.0 // indirect google.golang.org/protobuf v1.36.11 // indirect gopkg.in/dnaeon/go-vcr.v4 v4.0.6-0.20251110073552-01de4eb40290 // indirect diff --git a/go.sum b/go.sum index ed9cf23b3..9af39fac8 100644 --- a/go.sum +++ b/go.sum @@ -4,14 +4,14 @@ charm.land/x/vcr v0.1.1 h1:PXCFMUG0rPtyk35rhfzYCJEduOzWXCIbrXTFq4OF/9Q= charm.land/x/vcr v0.1.1/go.mod h1:eByq2gqzWvcct/8XE2XO5KznoWEBiXH56+y2gphbltM= cloud.google.com/go v0.123.0 h1:2NAUJwPR47q+E35uaJeYoNhuNEM9kM8SjgRgdeOJUSE= cloud.google.com/go v0.123.0/go.mod h1:xBoMV08QcqUGuPW65Qfm1o9Y4zKZBpGS+7bImXLTAZU= -cloud.google.com/go/auth v0.22.0 h1:Xp9wAKkLoeaYb5pYZZoQGz4E9sdPxIbzS3gywZE3ciQ= -cloud.google.com/go/auth v0.22.0/go.mod h1:M9o2Oz+YI2jAfxewJgb1vyI3vceHF+eohmxyzmrl+9s= +cloud.google.com/go/auth v0.23.0 h1:6Gg1CMgpgubRG7DGz5Vf1pcoNo8RfiRiRAPS4crTp54= +cloud.google.com/go/auth v0.23.0/go.mod h1:4DhBRcqvtljQN3dJ57qtqbib5ZGCYE5f2crfiiC2EM0= cloud.google.com/go/auth/oauth2adapt v0.2.8 h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIiLpZnkHRbnc= cloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c= cloud.google.com/go/compute/metadata v0.9.0 h1:pDUj4QMoPejqq20dK0Pg2N4yG9zIkYGdBtwLoEkH9Zs= cloud.google.com/go/compute/metadata v0.9.0/go.mod h1:E0bWwX5wTnLPedCKqk3pJmVgCBSM6qQI1yTBdEb3C10= -cloud.google.com/go/iam v1.12.0 h1:Aki3bX9aHUDKPHfnRJfDcTdVedvy6quGBQcTqx3DRXk= -cloud.google.com/go/iam v1.12.0/go.mod h1:FEZ4lXpADAC2AIpQY7LANNjjwyQ2jK439CI2VaD+sLY= +cloud.google.com/go/iam v1.13.0 h1:ufT3FPT5rFFXu6UtLkNoxaOaV5EuA1dsSkmemCSTo6U= +cloud.google.com/go/iam v1.13.0/go.mod h1:gHXdDEiPDvqd1q1KwBDGQlgZY/BwY760zU2LhOZS5w0= cloud.google.com/go/logging v1.19.0 h1:NCqhdVUg3wQ8Cobdf16FDSuTGi3+6+hdSBHrY5TsR6Q= cloud.google.com/go/logging v1.19.0/go.mod h1:i40NZCHC9Gqvod4yE+yQfDWwlgwW/SrshkkGibCHxcA= cloud.google.com/go/longrunning v1.2.0 h1:WjYH3YHBGCxGJP9M4dWGHBfXr/cFIjMkNgWcJj7/iMM= @@ -42,12 +42,12 @@ github.com/anthropics/anthropic-sdk-go v1.63.0 h1:GNl6LVjjxg1bRY41nlrvL5FvlwQs7F github.com/anthropics/anthropic-sdk-go v1.63.0/go.mod h1:3EfIfmFqxH6rbiLcIP4tPFyXL/IHakx2wDG4OU+TIEI= github.com/ardanlabs/jinja v1.5.0 h1:OkNpmq9fXiCDRHMLCsd+VO/uk8L/tVwNJE+yA3JAhhM= github.com/ardanlabs/jinja v1.5.0/go.mod h1:aXXzlJfjA+T3XNKA/YT5ZtDq2VJxt5a5siZ8cl9B35Q= -github.com/ardanlabs/kronk v1.29.9 h1:ThmbRCKSXGLl68tOHCMp5gNBCmyEV1Syi66aP+HMoxo= -github.com/ardanlabs/kronk v1.29.9/go.mod h1:419Te3wIWthLXzUvkP0LIh6FVA9Hh1JsCKA2XY+M3jU= +github.com/ardanlabs/kronk v1.30.8 h1:MOGh/21FVan1p/m1TNYzdxyw5TEoL3mQoVj28V6t3kE= +github.com/ardanlabs/kronk v1.30.8/go.mod h1:gbG7Ya33lZRWo36mwICzY1vGfTd3HCxomQMAAUKpZzU= github.com/aws/aws-sdk-go-v2 v1.43.4 h1:b9FTvbRwy+JCsfp2Wp6wV/KbOx3Aj7nkoFb2cRX0IhE= github.com/aws/aws-sdk-go-v2 v1.43.4/go.mod h1:70vwSy16txshwG+g55WkpgPKDIByzHI8ccBsOteo3bQ= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.15 h1:rq/p1VNFfygoKEQ9hHMKsKBE98lspPvT8IxaFs5mFhw= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.15/go.mod h1:bELIhlPfW8OkpDhP1MvCjHDtvv8NhiBTz+K4o26zrXA= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.16 h1:aiuaKlDweRC5qExJondpWjOgyzMHpofpwspGXUtwn4c= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.16/go.mod h1:nG/LOlmox9BDe9HvQnXWzgcK8uKbgBMZ/Hp5pVt/21I= github.com/aws/aws-sdk-go-v2/config v1.32.35 h1:UEzXuET8E42lxBPijuACu/tEK7v5lFPlk0Q+GT5WD9E= github.com/aws/aws-sdk-go-v2/config v1.32.35/go.mod h1:KaMtJpFa2JlL2BStjjHQVwQpzZEmw+ND/EgVrfFoo2g= github.com/aws/aws-sdk-go-v2/credentials v1.19.34 h1:y6GkSmcv5myd1ngrYbGmiLlwQqB6TQhOuN/tbSSuWDY= @@ -62,14 +62,14 @@ github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.36 h1:jbGY4CXLzZElOXgGsexlC3Hi+3Y github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.36/go.mod h1:uBu/9aKsS/UQGc72RAt3y54kjgYQxmhut8ZD2dXCDNE= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.15 h1:JJLBQxwY+AFwuPAi5ivGc1ChnTdUt4cXMv7e76m2c/Y= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.15/go.mod h1:lQknBIe78MVL0cQOQDlag8KGflMbMEVFx9mB6O8ENvk= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.26 h1:Eflerh7atY6HN0yz60peNLOkJA2ZKUyYjZexMbqwMCE= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.26/go.mod h1:dCAXNDmik9NuTjfsvCvW22S6ZFpxmtoliFoQu5XFkh8= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.28 h1:Q1TF1J9jVD+vFo0LzNnmNdQ9EAt52TS+MQlq9Ir+Yxo= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.28/go.mod h1:4KqXXC/p1hrotmouDFbrRoWaLy962b9PMUReCG6+uWo= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.35 h1:BBEElKh4a+rKshvjrfpajTe9CbpZvrbb4Jkg2PB7RzA= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.35/go.mod h1:zaZk983w//8beSruBVec/mr4CmDwgZitW/qzGhAAX0g= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.34 h1:Lercr2QB2rOrCwyOusmnQ7IiopfkGcZAgMJbjcSdK/s= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.34/go.mod h1:W0xXPPCb2HAqa3cp2f/nRvE+jGgBmchiuXrfBRlfb1I= -github.com/aws/aws-sdk-go-v2/service/s3 v1.106.2 h1:lFSYDEyC1JHucMH3fdczMTnDaghqNttyRXKM8JY9EJQ= -github.com/aws/aws-sdk-go-v2/service/s3 v1.106.2/go.mod h1:aw1E7RCjxs5Sd8N6WdICMcMroff12Tzxte+ELXXNqRU= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.36 h1:EUIwBoN+q7UmhAejxgD27APiRjh1vwCFo53gSqdT0BM= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.36/go.mod h1:6u00gmlTGR6W0b2k9NBrld7MnOEmf1Spqx0VVt6AqyE= +github.com/aws/aws-sdk-go-v2/service/s3 v1.107.0 h1:OkYV+1171za+ab9otU1tGxMXhx6uZvwVEtVddjLuYTg= +github.com/aws/aws-sdk-go-v2/service/s3 v1.107.0/go.mod h1:5FTZoQxhmLEiCAtYVk6V+t0iS/B5yGZVLZ3Wq5FDJZI= github.com/aws/aws-sdk-go-v2/service/signin v1.5.4 h1:cOJELVNrq5Q3Udry2GLuHUM7MhwpeaQRdYaoa6GI/yI= github.com/aws/aws-sdk-go-v2/service/signin v1.5.4/go.mod h1:f4LxzKBtaTxD7xh3PiVg3CE1tchQemfmghaJr+NbK2c= github.com/aws/aws-sdk-go-v2/service/sso v1.33.4 h1:AMW7a7S8iQaHjBYZdU3PCq4GKRPijTPRAc7e6XtEThY= @@ -78,8 +78,8 @@ github.com/aws/aws-sdk-go-v2/service/ssooidc v1.38.4 h1:AsbZcJAQPRmHDJG8K1N0pof/ github.com/aws/aws-sdk-go-v2/service/ssooidc v1.38.4/go.mod h1:6imqztH0//t0mKbl6yWl7swSEl7F/w32oAmqB3vP1ag= github.com/aws/aws-sdk-go-v2/service/sts v1.45.4 h1:w/AryDYMjSUANSQ2uoZxJovUsMTwWJNTv3IMex30Y+4= github.com/aws/aws-sdk-go-v2/service/sts v1.45.4/go.mod h1:WeBiAa67azG7Su9Vf+ChGDBLiAozJCXzdjXiPBUwtbc= -github.com/aws/smithy-go v1.27.6 h1:0zjT8jgK3jbrTT7JJ3EE6JsMhX8JTrZ+f1sEndYDXrA= -github.com/aws/smithy-go v1.27.6/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc= +github.com/aws/smithy-go v1.27.7 h1:Zgj5z4LfcDYoQIVk+n/yGdTkP/2y6ZT5vYxe0fp7bqE= +github.com/aws/smithy-go v1.27.7/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc= github.com/bahlo/generic-list-go v0.2.0 h1:5sz/EEAK+ls5wF+NeqDpk5+iNdMDXrh3z3nPnH1Wvgk= github.com/bahlo/generic-list-go v0.2.0/go.mod h1:2KvAjgMlE5NNynlg/5iLrrCCZ2+5xWbdbCW3pNTGyYg= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= @@ -141,14 +141,14 @@ github.com/google/s2a-go v0.1.9 h1:LGD7gtMgezd8a/Xak7mEWL0PjoTQFvpRudN895yqKW0= github.com/google/s2a-go v0.1.9/go.mod h1:YA0Ei2ZQL3acow2O62kdp9UlnvMmU7kA6Eutn0dXayM= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.3.19 h1:mMOE7DN2+p76/EdIrmAy9B9bH+yC4563vmnJ34QR8i4= -github.com/googleapis/enterprise-certificate-proxy v0.3.19/go.mod h1:rSEsBUemEBZEexP2y6jPp16LUmUbjmSbcPMQizR0o4k= +github.com/googleapis/enterprise-certificate-proxy v0.3.20 h1:t/xL64VUoN69MuMRQuJETqYGOw4Z9mSRJK9epIEtwFk= +github.com/googleapis/enterprise-certificate-proxy v0.3.20/go.mod h1:L3D/IQExI6LqEjBdXcZQ1WluSgigQmSwBboFstVPM4w= github.com/googleapis/gax-go/v2 v2.23.0 h1:Tchl7qkvE7Ip3y+ztvNufYFvkfqTe7NfLTYGIdJRLuE= github.com/googleapis/gax-go/v2 v2.23.0/go.mod h1:rBQKOVJCdb8IFEzg+FCwlt1LP/xMDGuqUXhUG+XMXEg= github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.29.0 h1:5VipnvEpbqr2gA2VbM+nYVbkIF28c5ZQfqCBQ5g2xfk= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.29.0/go.mod h1:Hyl3n6Twe1hvtd9XUXDec4pTvgMSEixRuQKPTMH2bNs= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.30.0 h1:/Tnpcb2E0Pz/tN9s3bfEY2Q8ePCEX9iuS+cneUwncnw= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.30.0/go.mod h1:zOBXOsUaBSjKgmH4OGzV1esUpR3oUSCPYVd2cUBjKYY= github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.74 h1:mymLUKThnV9wFvogOK8NnsMP9/vlhnjXY98gr2QIGW8= github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.74/go.mod h1:Bh9qYL8ehmDxSg14Tk8oxFCP90XHfs6NxV1D84884xA= github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= @@ -157,8 +157,8 @@ github.com/hashicorp/go-getter v1.8.6 h1:9sQboWULaydVphxc4S64oAI4YqpuCk7nPmvbk13 github.com/hashicorp/go-getter v1.8.6/go.mod h1:nVH12eOV2P58dIiL3rsU6Fh3wLeJEKBOJzhMmzlSWoo= github.com/hashicorp/go-version v1.9.0 h1:CeOIz6k+LoN3qX9Z0tyQrPtiB1DFYRPfCIBtaXPSCnA= github.com/hashicorp/go-version v1.9.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hybridgroup/yzma v1.21.0 h1:xBgCH9ziielLeexci8eJ/PvnxCzgLktOaoHH5p/ef30= -github.com/hybridgroup/yzma v1.21.0/go.mod h1:wAMtNTjSnE79jTWzaeFSsuraam0TXKCPajMHA5s+OX8= +github.com/hybridgroup/yzma v1.22.0 h1:QsWFWpdz42B/DCAhckGf/Q94FKjmf/lc2JmVNBCEJAY= +github.com/hybridgroup/yzma v1.22.0/go.mod h1:wAMtNTjSnE79jTWzaeFSsuraam0TXKCPajMHA5s+OX8= github.com/invopop/jsonschema v0.14.0 h1:MHQqLhvpNUZfw+hM3AZDYK7jxO8FZoQeQM77g8iyZjg= github.com/invopop/jsonschema v0.14.0/go.mod h1:ygm6C2EaVNMBDPpaPlnOA2pFAxBnxGjFlMZABxm9n2I= github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= @@ -169,8 +169,8 @@ github.com/kaptinlin/jsonpointer v0.4.28 h1:PyxOfdml9PGpxQz+JnNLGsyzQ+Rnm+OVNTGc github.com/kaptinlin/jsonpointer v0.4.28/go.mod h1:JzeIDw1+60bryzOFea9P3zjKg8pfJHd+UIA/zfZ70x8= github.com/kaptinlin/jsonschema v0.9.8 h1:srpfx2MAm4ecYz0zJLbz6fiW+UXiuv+vGhUqZUIWmrg= github.com/kaptinlin/jsonschema v0.9.8/go.mod h1:TP7RFmFBNExjBE0b3fsM6RpA/9PeOzfg2g4weXqOrDg= -github.com/klauspost/compress v1.19.1 h1:VsB4HPswih7mmZ8WleSFQ75c/Ui1M4trX5oAsJnhSlk= -github.com/klauspost/compress v1.19.1/go.mod h1:cwPg85FWrGar70rWktvGQj8/hthj3wpl0PGDogxkrSQ= +github.com/klauspost/compress v1.19.2 h1:hMRETovs/pu/dVWN7zIT1PGG8t509MwT6bO7XSi26R8= +github.com/klauspost/compress v1.19.2/go.mod h1:cwPg85FWrGar70rWktvGQj8/hthj3wpl0PGDogxkrSQ= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -221,30 +221,30 @@ github.com/ulikunitz/xz v0.5.16 h1:ld6NyySjx5lowVKwJvMRLnW5nxKX/xnpSiFYZ/Lxur0= github.com/ulikunitz/xz v0.5.16/go.mod h1:H9Rt/W6/Qj27PGauhQc6nfCDy7vHpzsOThBSaYDoEhw= go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= -go.opentelemetry.io/contrib/detectors/gcp v1.44.0 h1:NmLfL734pJhM0JKaYd2Y28+nY9dPRWYAAbxhRCrKXPw= -go.opentelemetry.io/contrib/detectors/gcp v1.44.0/go.mod h1:tNAsgd8avTGke1+MndXlU5Cru4PQ9Ai/cCNWQv/ZJ/s= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.69.0 h1:2yEATaop1/a1I4psnSLgWVPLWwCzkqWakgJy7xTDVy0= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.69.0/go.mod h1:D7J12YRapIekYyPWgGPlA/23pRmpSEZC5xJC/TTLI9U= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.69.0 h1:8tvICD4vSTOOsNrsI4Ljf6C+6UKvpTEH5XY3JMoyPoo= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.69.0/go.mod h1:z9+yiacE0IHRqM4qFfkbt/JYlmYXgss8GY/jXoNuPJI= -go.opentelemetry.io/otel v1.44.0 h1:JjwHmHpA4iZ3wBxluu2fbbE7j4kqlE8jXyAyPXH7HqU= -go.opentelemetry.io/otel v1.44.0/go.mod h1:BMgjTHL9WPRlRjL2oZCBTL4whCGtXch2H4BhOPIAyYc= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.44.0 h1:4YsVu3B8+3qtWYYrsUYgn0OG78pN0rnNPRGX4SbokQI= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.44.0/go.mod h1:+wnlSn0mD1ADVMe3v9Z/WIaiz6q6gL2J/ejaAmdmv80= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.44.0 h1:qazEJlUOQzhCpzQpFETGby7EdqjI1wsd0W+6Gg1SCTU= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.44.0/go.mod h1:fOD2Yefuxixkx3ahVNf0O/PERb6r4OlbxfATVnYvzCo= +go.opentelemetry.io/contrib/detectors/gcp v1.45.0 h1:9jR0ZPRok9ryaOQ2Wx8rg5F7Aon59mxrqbVI60/vlBk= +go.opentelemetry.io/contrib/detectors/gcp v1.45.0/go.mod h1:VSme3o2fvSg5bVg0dRzyHaj4Z5EVhG+g2Fde6LKzmQA= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.70.0 h1:oECp5f+hN7nkwjU/8BxQ/q23bGPb8FIrD839owX222E= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.70.0/go.mod h1:DqEFwLumhzMBDQv9PcWbyoDxHI/4lAk6CM4nJBH39sc= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.70.0 h1:LMuyCAyfalSjDyjdC65nK6N0zoTT63+E/u95X0JovZI= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.70.0/go.mod h1:085m8qbm4hgc8rZWGDEa4vmyyo2c3nPxUslYUKUIU04= +go.opentelemetry.io/otel v1.45.0 h1:pdrWmLHofpubmArBv1LgFSv1Z0Ie/ppdZzu+kUN5EeU= +go.opentelemetry.io/otel v1.45.0/go.mod h1:XZxIqPapzEYnhNSScF5DIqXhm/rYi0FzCe2XddAwZfQ= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.45.0 h1:QRefszxJmfPdjXUUm3j6iDzY03mTPXMjqErFqQ67vUg= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.45.0/go.mod h1:Tiz03lTBVBrm7eWZBOidzEaYaJa8tjwGUGv6d8mlTyk= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.45.0 h1:fG5MCxGz8+2VtrN/WgqSpJFctVz24gpxj8CxkKmc8Ww= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.45.0/go.mod h1:BmAYTn+3ysbRe+IU2msxmf5Rx3g6DHvex+tWI3LdhYI= go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.44.0 h1:hqxVTu/GtBF+vJ8d1fzW7fRxZFvgoDjWcxwwCaFDYpU= go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.44.0/go.mod h1:z5fVEF4X5v0ESvlJqBrrFlBVoj5EQuefZpzsu7R+x5Q= -go.opentelemetry.io/otel/metric v1.44.0 h1:1w0gILTcHdr3YI+ixLyjemwrVnsMURbTZFrSYCdDdmc= -go.opentelemetry.io/otel/metric v1.44.0/go.mod h1:8O7hanEPBNgEMmybD3s2VBKcgWOCsA6tzHBPODAiquo= -go.opentelemetry.io/otel/metric/x v0.66.0 h1:YkCrx1zLOChi9ZcZ6euupOcsgzbVlec7D/xoEU1+cTA= -go.opentelemetry.io/otel/metric/x v0.66.0/go.mod h1:d1+BDj9t96do0/1LoU1ayfCv79ZgNE41qbhBvnMOBZk= -go.opentelemetry.io/otel/sdk v1.44.0 h1:nHYwb9lK+fJPU/dnT6s7W7Z8itMWyqrnVfbheVYrZ58= -go.opentelemetry.io/otel/sdk v1.44.0/go.mod h1:Osuydd3Se74nqjAKxid74N5eC+jfEqfTegHRnq58oK0= -go.opentelemetry.io/otel/sdk/metric v1.44.0 h1:3LlKgI+VjbVsjNRFZJZAJ30WjXC5VkNRks6si09iEfI= -go.opentelemetry.io/otel/sdk/metric v1.44.0/go.mod h1:5B5pMARnXxKhltooO4xUuCBorl65a4EpnTalObqOigA= -go.opentelemetry.io/otel/trace v1.44.0 h1:jxF5CsGYCe74MCRx2X4g7WsY/VBKRqqpNvXlX/6gtIk= -go.opentelemetry.io/otel/trace v1.44.0/go.mod h1:oLl1jrMQAVo6v3GAggN+1VH9VIz9iUSvW53sW1Q8PIE= +go.opentelemetry.io/otel/metric v1.45.0 h1:7Eg1uH7CJ5cXv9is6tnBe1FI6rj1nwUdbFypRm3br/M= +go.opentelemetry.io/otel/metric v1.45.0/go.mod h1:HAPbm1nd3p1PmFH7v2dR+6BjXxw+Lq4a2+pndMAm08s= +go.opentelemetry.io/otel/metric/x v0.67.0 h1:PcicCNZFkZ4bXfSooXdo3WN7RBOVOtjVdo1wD358Uns= +go.opentelemetry.io/otel/metric/x v0.67.0/go.mod h1:FBjCWZe6wgcqxcMtjdGiClDKXb2YxxXii0CXftE4QtI= +go.opentelemetry.io/otel/sdk v1.45.0 h1:4VVSMgQ83dUgW2aoX5f6JgLvHwIvzcuLnF9lUdCSpCw= +go.opentelemetry.io/otel/sdk v1.45.0/go.mod h1:Sr40LgXV7DsKMMJMKOhUWOgMWTfAaqvm2kF0g7ilwuA= +go.opentelemetry.io/otel/sdk/metric v1.45.0 h1:oVFszMfyj1Am6s24Vtc7wBb8BKLcwepJjNEYILuiE3o= +go.opentelemetry.io/otel/sdk/metric v1.45.0/go.mod h1:vUWUxDZvu1WVRj8JA8S0AdhsPrZoDpA2DdZauIh4mDA= +go.opentelemetry.io/otel/trace v1.45.0 h1:l/mP6Uv7oNO7/TblbhpbgMidxhq1uO/rPsikOyVhxag= +go.opentelemetry.io/otel/trace v1.45.0/go.mod h1:qoJJA2xNMnxRrdISU/kLtfUH2wNeQbiv+jhs/CxI8bc= go.opentelemetry.io/proto/otlp v1.11.0 h1:5rrYs0Ykyj50sdU/JU0x8etU+LubXWb+gED6TbEdMIk= go.opentelemetry.io/proto/otlp v1.11.0/go.mod h1:SmVizdCOAm3XBtG1g1NnOdhW6jtddT72hLMhv8VwA8E= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= @@ -271,16 +271,16 @@ golang.org/x/time v0.15.0 h1:bbrp8t3bGUeFOx08pvsMYRTCVSMk89u4tKbNOZbp88U= golang.org/x/time v0.15.0/go.mod h1:Y4YMaQmXwGQZoFaVFk4YpCt4FLQMYKZe9oeV/f4MSno= gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4= gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E= -google.golang.org/api v0.291.0 h1:wfPbbY+mr9c7wZLqqzrHJLft/q8iFKREd6IgTBUene0= -google.golang.org/api v0.291.0/go.mod h1:at7kwWbuonglBFEBoeMDAV1bguHqL3qf0BHFsv3coa0= +google.golang.org/api v0.292.0 h1:Ewiwo/GTtiaPZSNAZQUcWLh8AYDEoPmIXyJfeoTSMHU= +google.golang.org/api v0.292.0/go.mod h1:07kjmMnFGm2RQuCza2EZM/5N68G/fVvFb1xKjWqoFA0= google.golang.org/genai v1.67.0 h1:m3V2AK2zbyViUq9rhTkMgkxu32Fueypy5Pzd9yV8GwU= google.golang.org/genai v1.67.0/go.mod h1:mDdPDFXo1Ats7f1WXVyZgWb/CkMzFWTWJruIMy7hGIU= -google.golang.org/genproto v0.0.0-20260729162451-8efbd57d26e0 h1:xJf8e9ReUqiexuIT3OWJkvA4RdgR8K4Hfheq8gaKxIM= -google.golang.org/genproto v0.0.0-20260729162451-8efbd57d26e0/go.mod h1:0MNk3ibJAyOwDZVlp18knQe3jRyFxpcU06xjxhgjx0M= -google.golang.org/genproto/googleapis/api v0.0.0-20260729162451-8efbd57d26e0 h1:ybvH/ZpOcpCrjtkb7oW/fdlzbEmRVeumw19SRQmNFKU= -google.golang.org/genproto/googleapis/api v0.0.0-20260729162451-8efbd57d26e0/go.mod h1:HJ9MpJLeDSstBkx1LILTpd5f41ADSMZcTPypw02qEGw= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260729162451-8efbd57d26e0 h1:mJiOtnGp0k/BcSgdu03G2NwnscCfCH+h2QKUBZr18KI= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260729162451-8efbd57d26e0/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= +google.golang.org/genproto v0.0.0-20260807164820-c8921c73eeea h1:EoNao6AiKb+bftjR8vFOxqtY1A4zLnvnfea+FBQicBo= +google.golang.org/genproto v0.0.0-20260807164820-c8921c73eeea/go.mod h1:MVqdGj2rFowpxM1nWJoGZmKI3TGThZsWENFz9uc4l1g= +google.golang.org/genproto/googleapis/api v0.0.0-20260807164820-c8921c73eeea h1:Jifw/kjs/r3B0uszvls/m3c3tmZs2YHGM9C+rvxP9gY= +google.golang.org/genproto/googleapis/api v0.0.0-20260807164820-c8921c73eeea/go.mod h1:K/+WGbmBY7aNW1HDw1fJnKYo10i0DkAX6pows00dLig= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260807164820-c8921c73eeea h1:kVhQEPTpKQahD5+JSBTfBB19wcgQTTjAIn45MBqnyHk= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260807164820-c8921c73eeea/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= google.golang.org/grpc v1.83.0 h1:JeNZEKJFbQxArAMl+hiytHauacDNqJUllNfmIMmpqnQ= google.golang.org/grpc v1.83.0/go.mod h1:kDyl6SKsiHKt0uylY5gtn5cEjkrIOhQOGDgIc4JGwzQ= google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= diff --git a/providers/kronk/error.go b/providers/kronk/error.go new file mode 100644 index 000000000..a60925202 --- /dev/null +++ b/providers/kronk/error.go @@ -0,0 +1,87 @@ +package kronk + +import ( + "context" + "errors" + "regexp" + "strconv" + "strings" + + "charm.land/fantasy" + krn "github.com/ardanlabs/kronk/sdk/kronk" + "github.com/ardanlabs/kronk/sdk/kronk/model" +) + +var kronkContextPattern = regexp.MustCompile(`input tokens \[(\d+)\] exceed context window \[(\d+)\]`) + +func toProviderErr(err error) error { + if err == nil || errors.Is(err, context.Canceled) || errors.Is(err, context.DeadlineExceeded) { + return err + } + + if errors.Is(err, krn.ErrAdmissionTimeout) { + return &fantasy.ProviderError{ + Title: "kronk model busy", + Message: err.Error(), + Cause: err, + TransientError: true, + } + } + + if isInvalidRequest(err) { + providerErr := &fantasy.ProviderError{ + Title: "invalid kronk request", + Message: err.Error(), + Cause: err, + } + parseContextTooLargeError(err.Error(), providerErr) + return providerErr + } + + if strings.Contains(err.Error(), "context window is full") { + return &fantasy.ProviderError{ + Title: "kronk context window exceeded", + Message: err.Error(), + Cause: err, + ContextTooLargeErr: true, + } + } + + if transportErr := fantasy.WrapTransportError(err); transportErr != err { + return transportErr + } + + return &fantasy.ProviderError{ + Title: "kronk request failed", + Message: err.Error(), + Cause: err, + } +} + +func toOperationErr(title string, err error) error { + mappedErr := toProviderErr(err) + var providerErr *fantasy.ProviderError + if errors.As(mappedErr, &providerErr) && providerErr.Title == "kronk request failed" { + providerErr.Title = title + } + return mappedErr +} + +func isInvalidRequest(err error) bool { + return errors.Is(err, model.ErrInvalidRequest) || + errors.Is(err, model.ErrMessagesMissing) || + errors.Is(err, model.ErrMessagesInvalid) || + errors.Is(err, model.ErrFileInputsUnsupported) +} + +func parseContextTooLargeError(message string, providerErr *fantasy.ProviderError) { + matches := kronkContextPattern.FindStringSubmatch(message) + if matches == nil { + return + } + + providerErr.Title = "kronk context window exceeded" + providerErr.ContextTooLargeErr = true + providerErr.ContextUsedTokens, _ = strconv.Atoi(matches[1]) + providerErr.ContextMaxTokens, _ = strconv.Atoi(matches[2]) +} diff --git a/providers/kronk/error_test.go b/providers/kronk/error_test.go new file mode 100644 index 000000000..baa9d4469 --- /dev/null +++ b/providers/kronk/error_test.go @@ -0,0 +1,86 @@ +package kronk + +import ( + "context" + "errors" + "fmt" + "io" + "testing" + + "charm.land/fantasy" + krn "github.com/ardanlabs/kronk/sdk/kronk" + "github.com/ardanlabs/kronk/sdk/kronk/model" +) + +func TestToProviderErr(t *testing.T) { + tests := []struct { + name string + err error + wantProviderErr bool + wantRetryable bool + wantContextLarge bool + wantUsedTokens int + wantMaxTokens int + }{ + {name: "nil"}, + {name: "canceled", err: context.Canceled}, + {name: "deadline", err: context.DeadlineExceeded}, + {name: "invalid", err: fmt.Errorf("chat: %w", model.ErrInvalidRequest), wantProviderErr: true}, + { + name: "context limit", + err: fmt.Errorf("chat: %w: input tokens [9000] exceed context window [8192]", model.ErrInvalidRequest), + wantProviderErr: true, + wantContextLarge: true, + wantUsedTokens: 9000, + wantMaxTokens: 8192, + }, + {name: "native context full", err: errors.New("unable to process request: the context window is full"), wantProviderErr: true, wantContextLarge: true}, + {name: "admission timeout", err: krn.ErrAdmissionTimeout, wantProviderErr: true, wantRetryable: true}, + {name: "transport", err: io.ErrUnexpectedEOF, wantProviderErr: true, wantRetryable: true}, + {name: "other", err: errors.New("model failed"), wantProviderErr: true}, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got := toProviderErr(tt.err) + var providerErr *fantasy.ProviderError + if gotProviderErr := errors.As(got, &providerErr); gotProviderErr != tt.wantProviderErr { + t.Fatalf("ProviderError: got %t, want %t", gotProviderErr, tt.wantProviderErr) + } + if !tt.wantProviderErr { + if !errors.Is(got, tt.err) { + t.Errorf("error: got %v, want %v", got, tt.err) + } + return + } + if got := providerErr.IsRetryable(); got != tt.wantRetryable { + t.Errorf("IsRetryable: got %t, want %t", got, tt.wantRetryable) + } + if got := providerErr.IsContextTooLarge(); got != tt.wantContextLarge { + t.Errorf("IsContextTooLarge: got %t, want %t", got, tt.wantContextLarge) + } + if got := providerErr.ContextUsedTokens; got != tt.wantUsedTokens { + t.Errorf("ContextUsedTokens: got %d, want %d", got, tt.wantUsedTokens) + } + if got := providerErr.ContextMaxTokens; got != tt.wantMaxTokens { + t.Errorf("ContextMaxTokens: got %d, want %d", got, tt.wantMaxTokens) + } + }) + } +} + +func TestToOperationErr(t *testing.T) { + baseErr := errors.New("load failed") + err := toOperationErr("kronk model loading failed", baseErr) + + var providerErr *fantasy.ProviderError + if !errors.As(err, &providerErr) { + t.Fatalf("error: got %T, want *fantasy.ProviderError", err) + } + if got, want := providerErr.Title, "kronk model loading failed"; got != want { + t.Errorf("Title: got %q, want %q", got, want) + } + if !errors.Is(err, baseErr) { + t.Errorf("Cause: got %v, want %v", err, baseErr) + } +} diff --git a/providers/kronk/kronk.go b/providers/kronk/kronk.go index 6c698f7f1..61c081e13 100644 --- a/providers/kronk/kronk.go +++ b/providers/kronk/kronk.go @@ -25,8 +25,21 @@ type provider struct { kronks map[string]*kronk.Kronk } +// Provider is a Fantasy provider that owns local Kronk model resources. +type Provider interface { + fantasy.Provider + Close(context.Context) error +} + +var _ Provider = (*provider)(nil) + // New creates a new Kronk provider with the given options. func New(opts ...Option) (fantasy.Provider, error) { + return NewProvider(opts...) +} + +// NewProvider creates a Kronk provider with direct access to Close. +func NewProvider(opts ...Option) (Provider, error) { providerOptions := options{ languageModelOptions: make([]LanguageModelOption, 0), } @@ -65,12 +78,12 @@ func (p *provider) LanguageModel(ctx context.Context, modelURL string) (fantasy. mp, err := p.installSystem(ctx, modelURL) if err != nil { - return nil, fmt.Errorf("failed to install system: %w", err) + return nil, toOperationErr("kronk installation failed", err) } krn, err := p.newKronk(mp) if err != nil { - return nil, fmt.Errorf("failed to create kronk instance: %w", err) + return nil, toOperationErr("kronk model loading failed", err) } p.kronks[modelURL] = krn @@ -135,8 +148,7 @@ func (p *provider) newKronk(mp models.Path) (*kronk.Kronk, error) { return nil, fmt.Errorf("unable to init kronk: %w", err) } - cfg := p.options.modelConfig - cfg.ModelFiles = mp.ModelFiles + cfg := p.modelConfig(mp) krn, err := kronk.New(model.WithConfig(cfg)) if err != nil { @@ -145,3 +157,16 @@ func (p *provider) newKronk(mp models.Path) (*kronk.Kronk, error) { return krn, nil } + +func (p *provider) modelConfig(mp models.Path) model.Config { + cfg := model.NewConfig(p.options.modelOptions...) + cfg.ModelFiles = mp.ModelFiles + if cfg.ProjFile == "" { + cfg.ProjFile = mp.ProjFile + } + if cfg.MTPDrafterFile == "" { + cfg.MTPDrafterFile = mp.MTPFile + } + + return cfg +} diff --git a/providers/kronk/kronk_test.go b/providers/kronk/kronk_test.go new file mode 100644 index 000000000..37e62364f --- /dev/null +++ b/providers/kronk/kronk_test.go @@ -0,0 +1,57 @@ +package kronk + +import ( + "reflect" + "testing" + + "charm.land/fantasy" + "github.com/ardanlabs/kronk/sdk/kronk/model" + "github.com/ardanlabs/kronk/sdk/tools/models" +) + +var _ func(...Option) (fantasy.Provider, error) = New + +func TestModelConfigArtifacts(t *testing.T) { + tests := []struct { + name string + modelOptions []model.Option + wantProj string + wantMTP string + }{ + { + name: "downloaded companions", + wantProj: "downloaded-proj.gguf", + wantMTP: "downloaded-mtp.gguf", + }, + { + name: "configured companions", + modelOptions: []model.Option{ + model.WithProjFile("custom-proj.gguf"), + model.WithMTPDrafterFile("custom-mtp.gguf"), + }, + wantProj: "custom-proj.gguf", + wantMTP: "custom-mtp.gguf", + }, + } + mp := models.Path{ + ModelFiles: []string{"model.gguf"}, + ProjFile: "downloaded-proj.gguf", + MTPFile: "downloaded-mtp.gguf", + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + p := provider{options: options{modelOptions: tt.modelOptions}} + cfg := p.modelConfig(mp) + if got, want := cfg.ModelFiles, mp.ModelFiles; !reflect.DeepEqual(got, want) { + t.Errorf("ModelFiles: got %v, want %v", got, want) + } + if got := cfg.ProjFile; got != tt.wantProj { + t.Errorf("ProjFile: got %q, want %q", got, tt.wantProj) + } + if got := cfg.MTPDrafterFile; got != tt.wantMTP { + t.Errorf("MTPDrafterFile: got %q, want %q", got, tt.wantMTP) + } + }) + } +} diff --git a/providers/kronk/language_model.go b/providers/kronk/language_model.go index dba0adce8..943189ef9 100644 --- a/providers/kronk/language_model.go +++ b/providers/kronk/language_model.go @@ -1,14 +1,13 @@ package kronk import ( + "cmp" "context" "encoding/json" "errors" - "io" "charm.land/fantasy" "charm.land/fantasy/object" - "github.com/ardanlabs/kronk/sdk/kronk" "github.com/ardanlabs/kronk/sdk/kronk/model" xjson "github.com/charmbracelet/x/json" "github.com/google/uuid" @@ -17,13 +16,19 @@ import ( type languageModel struct { provider string modelID string - kronk *kronk.Kronk + kronk chatModel objectMode fantasy.ObjectMode prepareCallFunc LanguageModelPrepareCallFunc mapFinishReasonFunc LanguageModelMapFinishReasonFunc toPromptFunc LanguageModelToPromptFunc } +type chatModel interface { + Chat(context.Context, model.D) (model.ChatResponse, error) + ChatStreaming(context.Context, model.D) (<-chan model.ChatResponse, error) + ModelInfo() model.ModelInfo +} + // LanguageModelOption is a function that configures a languageModel. type LanguageModelOption func(*languageModel) @@ -55,7 +60,7 @@ func WithLanguageModelObjectMode(om fantasy.ObjectMode) LanguageModelOption { } } -func newLanguageModel(modelID string, provider string, krn *kronk.Kronk, opts ...LanguageModelOption) *languageModel { +func newLanguageModel(modelID string, provider string, krn chatModel, opts ...LanguageModelOption) *languageModel { lm := languageModel{ modelID: modelID, provider: provider, @@ -93,13 +98,6 @@ func (l *languageModel) Provider() string { func (l *languageModel) prepareDocument(call fantasy.Call) (model.D, []fantasy.CallWarning, error) { messages, warnings := l.toPromptFunc(call.Prompt, l.provider, l.modelID) - if call.TopK != nil { - warnings = append(warnings, fantasy.CallWarning{ - Type: fantasy.CallWarningTypeUnsupportedSetting, - Setting: "top_k", - }) - } - d := model.D{ "messages": messages, } @@ -116,20 +114,16 @@ func (l *languageModel) prepareDocument(call fantasy.Call) (model.D, []fantasy.C d["top_p"] = *call.TopP } + if call.TopK != nil { + d["top_k"] = *call.TopK + } + if call.FrequencyPenalty != nil { - warnings = append(warnings, fantasy.CallWarning{ - Type: fantasy.CallWarningTypeUnsupportedSetting, - Setting: "frequency_penalty", - Details: "frequency_penalty is not supported by Kronk", - }) + d["frequency_penalty"] = *call.FrequencyPenalty } if call.PresencePenalty != nil { - warnings = append(warnings, fantasy.CallWarning{ - Type: fantasy.CallWarningTypeUnsupportedSetting, - Setting: "presence_penalty", - Details: "presence_penalty is not supported by Kronk", - }) + d["presence_penalty"] = *call.PresencePenalty } optionsWarnings, err := l.prepareCallFunc(l, d, call) @@ -147,6 +141,21 @@ func (l *languageModel) prepareDocument(call fantasy.Call) (model.D, []fantasy.C warnings = append(warnings, toolWarnings...) } + if call.ToolChoice != nil { + switch *call.ToolChoice { + case fantasy.ToolChoiceNone, fantasy.ToolChoiceAuto, fantasy.ToolChoiceRequired: + d["tool_choice"] = string(*call.ToolChoice) + + default: + d["tool_choice"] = model.D{ + "type": "function", + "function": model.D{ + "name": string(*call.ToolChoice), + }, + } + } + } + return d, warnings, nil } @@ -157,51 +166,29 @@ func (l *languageModel) Generate(ctx context.Context, call fantasy.Call) (*fanta return nil, err } - ch, err := l.kronk.ChatStreaming(ctx, d) + response, err := l.kronk.Chat(ctx, d) if err != nil { return nil, toProviderErr(err) } - var lastResponse model.ChatResponse - var fullContent string - - for resp := range ch { - lastResponse = resp - - if len(resp.Choices) > 0 && resp.Choices[0].Delta != nil { - switch resp.Choices[0].FinishReason() { - case model.FinishReasonError: - return nil, &fantasy.Error{Title: "model error", Message: resp.Choices[0].Delta.Content} - - case model.FinishReasonStop, model.FinishReasonTool: - // Final response already contains full accumulated content in Delta.Content, - // so we use it directly instead of continuing to accumulate. - fullContent = resp.Choices[0].Delta.Content - - default: - fullContent += resp.Choices[0].Delta.Content - } - } - } - - if len(lastResponse.Choices) == 0 { + if len(response.Choices) == 0 { return nil, &fantasy.Error{Title: "no response", Message: "no response generated"} } - choice := lastResponse.Choices[0] + choice := response.Choices[0] var content []fantasy.Content - if choice.Delta != nil { - content = make([]fantasy.Content, 0, 1+len(choice.Delta.ToolCalls)) + if choice.Message != nil { + content = make([]fantasy.Content, 0, 1+len(choice.Message.ToolCalls)) } - if fullContent != "" { + if choice.Message != nil && choice.Message.Content != "" { content = append(content, fantasy.TextContent{ - Text: fullContent, + Text: choice.Message.Content, }) } - if choice.Delta != nil { - for _, tc := range choice.Delta.ToolCalls { + if choice.Message != nil { + for _, tc := range choice.Message.ToolCalls { // Marshal the underlying map directly, not the ToolCallArguments type // which has a custom MarshalJSON that double-encodes to a JSON string. argsJSON, _ := json.Marshal(map[string]any(tc.Function.Arguments)) @@ -216,35 +203,29 @@ func (l *languageModel) Generate(ctx context.Context, call fantasy.Call) (*fanta } usage := fantasy.Usage{} - if lastResponse.Usage != nil { + if response.Usage != nil { usage = fantasy.Usage{ - InputTokens: int64(lastResponse.Usage.PromptTokens), - OutputTokens: int64(lastResponse.Usage.CompletionTokens), - TotalTokens: int64(lastResponse.Usage.PromptTokens + lastResponse.Usage.CompletionTokens), - ReasoningTokens: int64(lastResponse.Usage.ReasoningTokens), + InputTokens: int64(response.Usage.PromptTokens), + OutputTokens: int64(response.Usage.CompletionTokens), + TotalTokens: int64(response.Usage.PromptTokens + response.Usage.CompletionTokens), + ReasoningTokens: int64(response.Usage.CompletionTokensDetails.ReasoningTokens), + CacheReadTokens: int64(response.Usage.PromptTokensDetails.CachedTokens), } } mappedFinishReason := l.mapFinishReasonFunc(choice.FinishReason()) - if choice.Delta != nil && len(choice.Delta.ToolCalls) > 0 { + if choice.Message != nil && len(choice.Message.ToolCalls) > 0 { mappedFinishReason = fantasy.FinishReasonToolCalls } - providerMetadata := fantasy.ProviderMetadata{} - if lastResponse.Usage != nil { - providerMetadata = fantasy.ProviderMetadata{ - Name: &ProviderMetadata{ - TokensPerSecond: lastResponse.Usage.TokensPerSecond, - OutputTokens: int64(lastResponse.Usage.OutputTokens), - }, - } - } + metadata := newProviderMetadata(l.kronk.ModelInfo()) + metadata.update(response) resp := fantasy.Response{ Content: content, Usage: usage, FinishReason: mappedFinishReason, - ProviderMetadata: providerMetadata, + ProviderMetadata: fantasy.ProviderMetadata{Name: metadata}, Warnings: warnings, } @@ -257,6 +238,7 @@ func (l *languageModel) Stream(ctx context.Context, call fantasy.Call) (fantasy. if err != nil { return nil, err } + d["stream_options"] = model.D{"include_usage": true} ch, err := l.kronk.ChatStreaming(ctx, d) if err != nil { @@ -267,9 +249,8 @@ func (l *languageModel) Stream(ctx context.Context, call fantasy.Call) (fantasy. isActiveReasoning := false toolCalls := make(map[int]streamToolCall) - providerMetadata := fantasy.ProviderMetadata{ - Name: &ProviderMetadata{}, - } + metadata := newProviderMetadata(l.kronk.ModelInfo()) + providerMetadata := fantasy.ProviderMetadata{Name: metadata} var usage fantasy.Usage var finishReason string @@ -284,45 +265,49 @@ func (l *languageModel) Stream(ctx context.Context, call fantasy.Call) (fantasy. } } - toolIndex := 0 for resp := range ch { - if len(resp.Choices) == 0 { - continue - } - - choice := resp.Choices[0] - if choice.Delta == nil { - continue - } + metadata.update(resp) if resp.Usage != nil { usage = fantasy.Usage{ InputTokens: int64(resp.Usage.PromptTokens), OutputTokens: int64(resp.Usage.CompletionTokens), TotalTokens: int64(resp.Usage.PromptTokens + resp.Usage.CompletionTokens), - ReasoningTokens: int64(resp.Usage.ReasoningTokens), + ReasoningTokens: int64(resp.Usage.CompletionTokensDetails.ReasoningTokens), + CacheReadTokens: int64(resp.Usage.PromptTokensDetails.CachedTokens), } + } - if pm, ok := providerMetadata[Name]; ok { - if metadata, ok := pm.(*ProviderMetadata); ok { - metadata.TokensPerSecond = resp.Usage.TokensPerSecond - metadata.OutputTokens = int64(resp.Usage.OutputTokens) - } - } + if len(resp.Choices) == 0 { + continue } + choice := resp.Choices[0] if choice.FinishReason() != "" { finishReason = choice.FinishReason() } - switch choice.FinishReason() { - case model.FinishReasonError: + if choice.FinishReason() == model.FinishReasonError { + err := ctx.Err() + if err == nil { + message := "" + if choice.Delta != nil { + message = choice.Delta.Content + } + err = toProviderErr(errors.New(cmp.Or(message, "model stopped with an error"))) + } yield(fantasy.StreamPart{ Type: fantasy.StreamPartTypeError, - Error: &fantasy.Error{Title: "model error", Message: choice.Delta.Content}, + Error: err, }) return + } + if choice.Delta == nil { + continue + } + + switch choice.FinishReason() { case model.FinishReasonTool: if isActiveReasoning { isActiveReasoning = false @@ -344,56 +329,6 @@ func (l *languageModel) Stream(ctx context.Context, call fantasy.Call) (fantasy. } } - for _, tc := range choice.Delta.ToolCalls { - argsJSON, _ := json.Marshal(map[string]any(tc.Function.Arguments)) - argsStr := string(argsJSON) - - toolID := tc.ID - if toolID == "" { - toolID = uuid.NewString() - } - - if !yield(fantasy.StreamPart{ - Type: fantasy.StreamPartTypeToolInputStart, - ID: toolID, - ToolCallName: tc.Function.Name, - }) { - return - } - - if !yield(fantasy.StreamPart{ - Type: fantasy.StreamPartTypeToolInputDelta, - ID: toolID, - Delta: argsStr, - }) { - return - } - - if !yield(fantasy.StreamPart{ - Type: fantasy.StreamPartTypeToolInputEnd, - ID: toolID, - }) { - return - } - - if !yield(fantasy.StreamPart{ - Type: fantasy.StreamPartTypeToolCall, - ID: toolID, - ToolCallName: tc.Function.Name, - ToolCallInput: argsStr, - }) { - return - } - - toolCalls[toolIndex] = streamToolCall{ - id: toolID, - name: tc.Function.Name, - arguments: argsStr, - hasFinished: true, - } - toolIndex++ - } - default: if choice.Delta.Reasoning != "" { if !isActiveReasoning { @@ -415,7 +350,7 @@ func (l *languageModel) Stream(ctx context.Context, call fantasy.Call) (fantasy. } } - hasToolCalls := len(choice.Delta.ToolCalls) > 0 + hasToolCalls := len(choice.Delta.ToolCallDeltas) > 0 hasContent := choice.Delta.Content != "" if isActiveReasoning && (hasContent || hasToolCalls) { @@ -458,103 +393,65 @@ func (l *languageModel) Stream(ctx context.Context, call fantasy.Call) (fantasy. } } - for _, tc := range choice.Delta.ToolCalls { - argsJSON, _ := json.Marshal(map[string]any(tc.Function.Arguments)) - argsStr := string(argsJSON) - - switch existingTC, ok := toolCalls[toolIndex]; ok { - case true: - if existingTC.hasFinished { - continue + for _, tc := range choice.Delta.ToolCallDeltas { + toolCall, ok := toolCalls[tc.Index] + if !ok { + toolID := tc.ID + if toolID == "" { + toolID = uuid.NewString() } - existingTC.arguments += argsStr - + toolCall = streamToolCall{ + id: toolID, + name: tc.Function.Name, + } if !yield(fantasy.StreamPart{ - Type: fantasy.StreamPartTypeToolInputDelta, - ID: existingTC.id, - Delta: argsStr, + Type: fantasy.StreamPartTypeToolInputStart, + ID: toolCall.id, + ToolCallName: toolCall.name, }) { return } + } - toolCalls[toolIndex] = existingTC - - if xjson.IsValid(existingTC.arguments) { - if !yield(fantasy.StreamPart{ - Type: fantasy.StreamPartTypeToolInputEnd, - ID: existingTC.id, - }) { - return - } - - if !yield(fantasy.StreamPart{ - Type: fantasy.StreamPartTypeToolCall, - ID: existingTC.id, - ToolCallName: existingTC.name, - ToolCallInput: existingTC.arguments, - }) { - return - } - - existingTC.hasFinished = true - toolCalls[toolIndex] = existingTC - } - - case false: - toolID := tc.ID - if toolID == "" { - toolID = uuid.NewString() - } + if toolCall.hasFinished { + continue + } + if tc.Function.Name != "" { + toolCall.name = tc.Function.Name + } + if tc.Function.Arguments != "" { + toolCall.arguments += tc.Function.Arguments if !yield(fantasy.StreamPart{ - Type: fantasy.StreamPartTypeToolInputStart, - ID: toolID, - ToolCallName: tc.Function.Name, + Type: fantasy.StreamPartTypeToolInputDelta, + ID: toolCall.id, + Delta: tc.Function.Arguments, }) { return } + } - toolCalls[toolIndex] = streamToolCall{ - id: toolID, - name: tc.Function.Name, - arguments: argsStr, + if xjson.IsValid(toolCall.arguments) { + if !yield(fantasy.StreamPart{ + Type: fantasy.StreamPartTypeToolInputEnd, + ID: toolCall.id, + }) { + return } - if argsStr != "" && argsStr != "null" { - if !yield(fantasy.StreamPart{ - Type: fantasy.StreamPartTypeToolInputDelta, - ID: toolID, - Delta: argsStr, - }) { - return - } - - if xjson.IsValid(argsStr) { - if !yield(fantasy.StreamPart{ - Type: fantasy.StreamPartTypeToolInputEnd, - ID: toolID, - }) { - return - } - - if !yield(fantasy.StreamPart{ - Type: fantasy.StreamPartTypeToolCall, - ID: toolID, - ToolCallName: tc.Function.Name, - ToolCallInput: argsStr, - }) { - return - } - - stc := toolCalls[toolIndex] - stc.hasFinished = true - toolCalls[toolIndex] = stc - } + if !yield(fantasy.StreamPart{ + Type: fantasy.StreamPartTypeToolCall, + ID: toolCall.id, + ToolCallName: toolCall.name, + ToolCallInput: toolCall.arguments, + }) { + return } - - toolIndex++ + toolCall.hasFinished = true } + + toolCalls[tc.Index] = toolCall } } } @@ -577,6 +474,18 @@ func (l *languageModel) Stream(ctx context.Context, call fantasy.Call) (fantasy. } } + if finishReason == "" { + err := ctx.Err() + if err == nil { + err = fantasy.NewIncompleteStreamError() + } + yield(fantasy.StreamPart{ + Type: fantasy.StreamPartTypeError, + Error: err, + }) + return + } + mappedFinishReason := l.mapFinishReasonFunc(finishReason) if len(toolCalls) > 0 { mappedFinishReason = fantasy.FinishReasonToolCalls @@ -651,19 +560,3 @@ func toKronkTools(tools []fantasy.Tool) ([]model.D, []fantasy.CallWarning) { return kronkTools, warnings } - -func toProviderErr(err error) error { - if err == nil { - return nil - } - - if errors.Is(err, io.EOF) { - return nil - } - - return &fantasy.ProviderError{ - Title: "kronk error", - Message: err.Error(), - Cause: err, - } -} diff --git a/providers/kronk/language_model_hooks.go b/providers/kronk/language_model_hooks.go index a824f791d..65339a70f 100644 --- a/providers/kronk/language_model_hooks.go +++ b/providers/kronk/language_model_hooks.go @@ -33,6 +33,38 @@ func DefaultPrepareCallFunc(_ fantasy.LanguageModel, d model.D, call fantasy.Cal } } + if providerOptions.AdaptivePDecay != nil { + d["adaptive_p_decay"] = *providerOptions.AdaptivePDecay + } + + if providerOptions.AdaptivePTarget != nil { + d["adaptive_p_target"] = *providerOptions.AdaptivePTarget + } + + if providerOptions.DryAllowedLen != nil { + d["dry_allowed_length"] = *providerOptions.DryAllowedLen + } + + if providerOptions.DryBase != nil { + d["dry_base"] = *providerOptions.DryBase + } + + if providerOptions.DryMultiplier != nil { + d["dry_multiplier"] = *providerOptions.DryMultiplier + } + + if providerOptions.DryPenaltyLast != nil { + d["dry_penalty_last_n"] = *providerOptions.DryPenaltyLast + } + + if providerOptions.Grammar != nil { + d["grammar"] = *providerOptions.Grammar + } + + if providerOptions.Logprobs != nil { + d["logprobs"] = *providerOptions.Logprobs + } + if providerOptions.TopK != nil { d["top_k"] = *providerOptions.TopK } @@ -50,13 +82,41 @@ func DefaultPrepareCallFunc(_ fantasy.LanguageModel, d model.D, call fantasy.Cal } if providerOptions.NumPredict != nil { - d["num_predict"] = *providerOptions.NumPredict + d["max_tokens"] = *providerOptions.NumPredict + } + + if providerOptions.ReasoningEffort != nil { + d["reasoning_effort"] = *providerOptions.ReasoningEffort + } + + if providerOptions.RepeatLastN != nil { + d["repeat_last_n"] = *providerOptions.RepeatLastN } if providerOptions.Stop != nil { d["stop"] = providerOptions.Stop } + if providerOptions.Thinking != nil { + d["enable_thinking"] = *providerOptions.Thinking + } + + if providerOptions.TopLogprobs != nil { + d["top_logprobs"] = *providerOptions.TopLogprobs + } + + if providerOptions.XtcMinKeep != nil { + d["xtc_min_keep"] = *providerOptions.XtcMinKeep + } + + if providerOptions.XtcProbability != nil { + d["xtc_probability"] = *providerOptions.XtcProbability + } + + if providerOptions.XtcThreshold != nil { + d["xtc_threshold"] = *providerOptions.XtcThreshold + } + return warnings, nil } @@ -66,6 +126,9 @@ func DefaultMapFinishReasonFunc(finishReason string) fantasy.FinishReason { case string(model.FinishReasonStop): return fantasy.FinishReasonStop + case string(model.FinishReasonLength): + return fantasy.FinishReasonLength + case string(model.FinishReasonTool): return fantasy.FinishReasonToolCalls diff --git a/providers/kronk/language_model_hooks_test.go b/providers/kronk/language_model_hooks_test.go new file mode 100644 index 000000000..89d057157 --- /dev/null +++ b/providers/kronk/language_model_hooks_test.go @@ -0,0 +1,134 @@ +package kronk + +import ( + "reflect" + "testing" + + "charm.land/fantasy" + "github.com/ardanlabs/kronk/sdk/kronk/model" +) + +func TestPrepareDocumentSampling(t *testing.T) { + lm := languageModel{ + provider: Name, + prepareCallFunc: DefaultPrepareCallFunc, + toPromptFunc: DefaultToPrompt, + } + call := fantasy.Call{ + TopK: new(int64(20)), + FrequencyPenalty: new(0.2), + PresencePenalty: new(0.1), + } + + d, warnings, err := lm.prepareDocument(call) + if err != nil { + t.Fatalf("prepareDocument: %v", err) + } + if len(warnings) != 0 { + t.Fatalf("warnings: got %v, want none", warnings) + } + + tests := []struct { + name string + key string + want any + }{ + {name: "top-k", key: "top_k", want: int64(20)}, + {name: "frequency penalty", key: "frequency_penalty", want: 0.2}, + {name: "presence penalty", key: "presence_penalty", want: 0.1}, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if got := d[tt.key]; got != tt.want { + t.Errorf("%s: got %v, want %v", tt.key, got, tt.want) + } + }) + } +} + +func TestDefaultPrepareCallFuncSampling(t *testing.T) { + providerOptions := ProviderOptions{ + AdaptivePDecay: new(0.9), + AdaptivePTarget: new(0.1), + DryAllowedLen: new(int64(3)), + DryBase: new(1.75), + DryMultiplier: new(1.1), + DryPenaltyLast: new(int64(64)), + Grammar: new("root ::= \"yes\" | \"no\""), + Logprobs: new(true), + MinP: new(0.05), + NumPredict: new(int64(512)), + ReasoningEffort: new("high"), + RepeatLastN: new(int64(32)), + RepeatPenalty: new(1.15), + Seed: new(int64(42)), + Stop: []string{"STOP"}, + Thinking: new(false), + TopK: new(int64(20)), + TopLogprobs: new(int64(5)), + XtcMinKeep: new(int64(2)), + XtcProbability: new(0.5), + XtcThreshold: new(0.1), + } + call := fantasy.Call{ + ProviderOptions: NewProviderOptions(&providerOptions), + } + d := model.D{} + + warnings, err := DefaultPrepareCallFunc(nil, d, call) + if err != nil { + t.Fatalf("DefaultPrepareCallFunc: %v", err) + } + if len(warnings) != 0 { + t.Fatalf("warnings: got %v, want none", warnings) + } + + want := model.D{ + "adaptive_p_decay": 0.9, + "adaptive_p_target": 0.1, + "dry_allowed_length": int64(3), + "dry_base": 1.75, + "dry_multiplier": 1.1, + "dry_penalty_last_n": int64(64), + "enable_thinking": false, + "grammar": "root ::= \"yes\" | \"no\"", + "logprobs": true, + "max_tokens": int64(512), + "min_p": 0.05, + "reasoning_effort": "high", + "repeat_last_n": int64(32), + "repeat_penalty": 1.15, + "seed": int64(42), + "stop": []string{"STOP"}, + "top_k": int64(20), + "top_logprobs": int64(5), + "xtc_min_keep": int64(2), + "xtc_probability": 0.5, + "xtc_threshold": 0.1, + } + if !reflect.DeepEqual(d, want) { + t.Errorf("document: got %#v, want %#v", d, want) + } +} + +func TestDefaultMapFinishReasonFunc(t *testing.T) { + tests := []struct { + name string + finishReason string + want fantasy.FinishReason + }{ + {name: "stop", finishReason: model.FinishReasonStop, want: fantasy.FinishReasonStop}, + {name: "length", finishReason: model.FinishReasonLength, want: fantasy.FinishReasonLength}, + {name: "tool", finishReason: model.FinishReasonTool, want: fantasy.FinishReasonToolCalls}, + {name: "error", finishReason: model.FinishReasonError, want: fantasy.FinishReasonError}, + {name: "unknown", finishReason: "", want: fantasy.FinishReasonUnknown}, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if got := DefaultMapFinishReasonFunc(tt.finishReason); got != tt.want { + t.Errorf("DefaultMapFinishReasonFunc: got %q, want %q", got, tt.want) + } + }) + } +} diff --git a/providers/kronk/language_model_test.go b/providers/kronk/language_model_test.go new file mode 100644 index 000000000..c86568579 --- /dev/null +++ b/providers/kronk/language_model_test.go @@ -0,0 +1,329 @@ +package kronk + +import ( + "context" + "errors" + "io" + "reflect" + "testing" + + "charm.land/fantasy" + "github.com/ardanlabs/kronk/sdk/kronk/model" +) + +type fakeChatModel struct { + chatResponse model.ChatResponse + chatErr error + streamResponse []model.ChatResponse + streamErr error + document model.D + modelInfo model.ModelInfo +} + +func (f *fakeChatModel) Chat(_ context.Context, d model.D) (model.ChatResponse, error) { + f.document = d + return f.chatResponse, f.chatErr +} + +func (f *fakeChatModel) ChatStreaming(_ context.Context, d model.D) (<-chan model.ChatResponse, error) { + f.document = d + if f.streamErr != nil { + return nil, f.streamErr + } + + ch := make(chan model.ChatResponse, len(f.streamResponse)) + for _, response := range f.streamResponse { + ch <- response + } + close(ch) + + return ch, nil +} + +func (f *fakeChatModel) ModelInfo() model.ModelInfo { + return f.modelInfo +} + +func TestPrepareDocumentToolChoice(t *testing.T) { + lm := languageModel{ + provider: Name, + prepareCallFunc: DefaultPrepareCallFunc, + toPromptFunc: DefaultToPrompt, + } + tool := fantasy.FunctionTool{Name: "weather", InputSchema: map[string]any{"type": "object"}} + + tests := []struct { + name string + toolChoice fantasy.ToolChoice + want any + }{ + {name: "none", toolChoice: fantasy.ToolChoiceNone, want: "none"}, + {name: "auto", toolChoice: fantasy.ToolChoiceAuto, want: "auto"}, + {name: "required", toolChoice: fantasy.ToolChoiceRequired, want: "required"}, + { + name: "specific", + toolChoice: fantasy.SpecificToolChoice("weather"), + want: model.D{ + "type": "function", + "function": model.D{ + "name": "weather", + }, + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + d, _, err := lm.prepareDocument(fantasy.Call{ + Tools: []fantasy.Tool{tool}, + ToolChoice: &tt.toolChoice, + }) + if err != nil { + t.Fatalf("prepareDocument: %v", err) + } + if got := d["tool_choice"]; !reflect.DeepEqual(got, tt.want) { + t.Errorf("tool_choice: got %#v, want %#v", got, tt.want) + } + }) + } +} + +func TestGenerateResponse(t *testing.T) { + finishReason := model.FinishReasonTool + client := fakeChatModel{ + modelInfo: model.ModelInfo{ + ID: "loaded-model", + Desc: "test model", + Type: model.ModelTypeDense, + HasProjection: true, + Size: 1024, + VRAMTotal: 768, + SlotMemory: 256, + }, + chatResponse: model.ChatResponse{ + Model: "response-model", + SystemFingerprint: "fp_kronk", + Choices: []model.Choice{ + { + FinishReasonPtr: &finishReason, + Message: &model.ResponseMessage{ + Content: "calling weather", + ToolCalls: []model.ResponseToolCall{ + { + ID: "call-1", + Function: model.ResponseToolCallFunction{ + Name: "weather", + Arguments: model.ToolCallArguments{"city": "Paris"}, + }, + }, + }, + }, + }, + }, + Usage: &model.Usage{ + PromptTokens: 12, + PromptTokensDetails: model.PromptTokensDetails{CachedTokens: 3}, + CompletionTokens: 4, + TotalTokens: 16, + TokensPerSecond: 24.5, + TimeToFirstTokenMS: 32.5, + DraftTokens: 8, + DraftAcceptedTokens: 6, + DraftAcceptanceRate: 0.75, + DraftCoverage: 0.5, + DraftDisableReason: "imc-hit", + }, + }, + } + lm := newLanguageModel("model", Name, &client) + + response, err := lm.Generate(t.Context(), fantasy.Call{}) + if err != nil { + t.Fatalf("Generate: %v", err) + } + if got, want := response.Content.Text(), "calling weather"; got != want { + t.Errorf("Content.Text: got %q, want %q", got, want) + } + toolCalls := response.Content.ToolCalls() + if len(toolCalls) != 1 { + t.Fatalf("Content.ToolCalls: got %d, want 1", len(toolCalls)) + } + if got, want := toolCalls[0].Input, `{"city":"Paris"}`; got != want { + t.Errorf("ToolCall.Input: got %q, want %q", got, want) + } + if got, want := response.Usage.TotalTokens, int64(16); got != want { + t.Errorf("Usage.TotalTokens: got %d, want %d", got, want) + } + if got, want := response.Usage.CacheReadTokens, int64(3); got != want { + t.Errorf("Usage.CacheReadTokens: got %d, want %d", got, want) + } + if got, want := response.FinishReason, fantasy.FinishReasonToolCalls; got != want { + t.Errorf("FinishReason: got %q, want %q", got, want) + } + metadata, ok := response.ProviderMetadata[Name].(*ProviderMetadata) + if !ok { + t.Fatalf("ProviderMetadata: got %T, want *ProviderMetadata", response.ProviderMetadata[Name]) + } + if got, want := metadata.Model, "response-model"; got != want { + t.Errorf("ProviderMetadata.Model: got %q, want %q", got, want) + } + if got, want := metadata.SystemFingerprint, "fp_kronk"; got != want { + t.Errorf("ProviderMetadata.SystemFingerprint: got %q, want %q", got, want) + } + if !metadata.HasProjection { + t.Error("ProviderMetadata.HasProjection: got false, want true") + } + if got, want := metadata.TimeToFirstTokenMS, 32.5; got != want { + t.Errorf("ProviderMetadata.TimeToFirstTokenMS: got %v, want %v", got, want) + } + if got, want := metadata.DraftAcceptedTokens, int64(6); got != want { + t.Errorf("ProviderMetadata.DraftAcceptedTokens: got %d, want %d", got, want) + } +} + +func TestStreamResponse(t *testing.T) { + toolFinish := model.FinishReasonTool + client := fakeChatModel{ + modelInfo: model.ModelInfo{ID: "loaded-model", Type: model.ModelTypeDense}, + streamResponse: []model.ChatResponse{ + {Model: "response-model", SystemFingerprint: "fp_kronk", Choices: []model.Choice{{Delta: &model.ResponseMessage{Reasoning: "thinking"}}}}, + {Choices: []model.Choice{{Delta: &model.ResponseMessage{ToolCallDeltas: []model.ResponseToolCallDelta{ + {ID: "call-1", Index: 0, Function: model.ResponseToolCallDeltaFunction{Name: "weather"}}, + }}}}}, + {Choices: []model.Choice{{Delta: &model.ResponseMessage{ToolCallDeltas: []model.ResponseToolCallDelta{ + {Index: 0, Function: model.ResponseToolCallDeltaFunction{Arguments: `{"city":"Paris"}`}}, + }}}}}, + {Choices: []model.Choice{{Delta: &model.ResponseMessage{}, FinishReasonPtr: &toolFinish}}}, + {Choices: []model.Choice{}, Usage: &model.Usage{ + PromptTokens: 12, + CompletionTokens: 4, + TotalTokens: 16, + TokensPerSecond: 20, + TimeToFirstTokenMS: 30, + DraftTokens: 6, + DraftAcceptedTokens: 5, + }}, + }, + } + lm := newLanguageModel("model", Name, &client) + + stream, err := lm.Stream(t.Context(), fantasy.Call{}) + if err != nil { + t.Fatalf("Stream: %v", err) + } + + var parts []fantasy.StreamPart + for part := range stream { + parts = append(parts, part) + } + + wantTypes := []fantasy.StreamPartType{ + fantasy.StreamPartTypeReasoningStart, + fantasy.StreamPartTypeReasoningDelta, + fantasy.StreamPartTypeReasoningEnd, + fantasy.StreamPartTypeToolInputStart, + fantasy.StreamPartTypeToolInputDelta, + fantasy.StreamPartTypeToolInputEnd, + fantasy.StreamPartTypeToolCall, + fantasy.StreamPartTypeFinish, + } + gotTypes := make([]fantasy.StreamPartType, len(parts)) + for i := range parts { + gotTypes[i] = parts[i].Type + } + if !reflect.DeepEqual(gotTypes, wantTypes) { + t.Fatalf("part types: got %v, want %v", gotTypes, wantTypes) + } + if got, want := parts[6].ToolCallInput, `{"city":"Paris"}`; got != want { + t.Errorf("ToolCallInput: got %q, want %q", got, want) + } + if got, want := parts[7].Usage.TotalTokens, int64(16); got != want { + t.Errorf("Usage.TotalTokens: got %d, want %d", got, want) + } + if got, want := parts[7].FinishReason, fantasy.FinishReasonToolCalls; got != want { + t.Errorf("FinishReason: got %q, want %q", got, want) + } + metadata, ok := parts[7].ProviderMetadata[Name].(*ProviderMetadata) + if !ok { + t.Fatalf("ProviderMetadata: got %T, want *ProviderMetadata", parts[7].ProviderMetadata[Name]) + } + if got, want := metadata.Model, "response-model"; got != want { + t.Errorf("ProviderMetadata.Model: got %q, want %q", got, want) + } + if got, want := metadata.SystemFingerprint, "fp_kronk"; got != want { + t.Errorf("ProviderMetadata.SystemFingerprint: got %q, want %q", got, want) + } + if got, want := metadata.TimeToFirstTokenMS, float64(30); got != want { + t.Errorf("ProviderMetadata.TimeToFirstTokenMS: got %v, want %v", got, want) + } + if got, want := metadata.DraftAcceptedTokens, int64(5); got != want { + t.Errorf("ProviderMetadata.DraftAcceptedTokens: got %d, want %d", got, want) + } + if got := client.document["stream_options"]; !reflect.DeepEqual(got, model.D{"include_usage": true}) { + t.Errorf("stream_options: got %#v, want include_usage", got) + } +} + +func TestStreamIncomplete(t *testing.T) { + tests := []struct { + name string + ctx context.Context + wantErr error + }{ + {name: "incomplete", ctx: t.Context(), wantErr: io.ErrUnexpectedEOF}, + {name: "canceled", ctx: canceledContext(), wantErr: context.Canceled}, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + lm := newLanguageModel("model", Name, &fakeChatModel{}) + stream, err := lm.Stream(tt.ctx, fantasy.Call{}) + if err != nil { + t.Fatalf("Stream: %v", err) + } + + var parts []fantasy.StreamPart + for part := range stream { + parts = append(parts, part) + } + if len(parts) != 1 || parts[0].Type != fantasy.StreamPartTypeError { + t.Fatalf("parts: got %#v, want one error", parts) + } + if !errors.Is(parts[0].Error, tt.wantErr) { + t.Errorf("Error: got %v, want %v", parts[0].Error, tt.wantErr) + } + }) + } +} + +func TestStreamTerminalWithoutDelta(t *testing.T) { + finishReason := model.FinishReasonLength + client := fakeChatModel{ + streamResponse: []model.ChatResponse{ + {Choices: []model.Choice{{FinishReasonPtr: &finishReason}}}, + }, + } + lm := newLanguageModel("model", Name, &client) + + stream, err := lm.Stream(t.Context(), fantasy.Call{}) + if err != nil { + t.Fatalf("Stream: %v", err) + } + + var parts []fantasy.StreamPart + for part := range stream { + parts = append(parts, part) + } + if len(parts) != 1 || parts[0].Type != fantasy.StreamPartTypeFinish { + t.Fatalf("parts: got %#v, want one finish", parts) + } + if got, want := parts[0].FinishReason, fantasy.FinishReasonLength; got != want { + t.Errorf("FinishReason: got %q, want %q", got, want) + } +} + +func canceledContext() context.Context { + ctx, cancel := context.WithCancel(context.Background()) + cancel() + return ctx +} diff --git a/providers/kronk/options.go b/providers/kronk/options.go index 747920465..039e74c10 100644 --- a/providers/kronk/options.go +++ b/providers/kronk/options.go @@ -3,6 +3,7 @@ package kronk import ( "context" "fmt" + "time" "charm.land/fantasy" "github.com/ardanlabs/kronk/sdk/kronk/model" @@ -16,7 +17,7 @@ type Logger func(ctx context.Context, msg string, args ...any) type options struct { name string - modelConfig model.Config + modelOptions []model.Option logger Logger objectMode fantasy.ObjectMode languageModelOptions []LanguageModelOption @@ -29,10 +30,262 @@ func WithName(name string) Option { } } -// WithModelConfig sets additional model configuration options. +// WithModelConfig replaces the model configuration at this point in the option sequence. +// The provider replaces ModelFiles with the files resolved by LanguageModel. func WithModelConfig(cfg model.Config) Option { + return withModelOption(model.WithConfig(cfg)) +} + +// WithConfig replaces the model configuration at this point in the option sequence. +// The provider replaces ModelFiles with the files resolved by LanguageModel. +func WithConfig(cfg model.Config) Option { + return withModelOption(model.WithConfig(cfg)) +} + +// WithAdapters configures model adapters. +func WithAdapters(v []model.AdapterConfig) Option { + return withModelOption(model.WithAdapters(v)) +} + +// WithAdmissionTimeout configures the model admission timeout. +func WithAdmissionTimeout(v time.Duration) Option { + return withModelOption(model.WithAdmissionTimeout(v)) +} + +// WithAutoTune enables hardware-aware model configuration. +func WithAutoTune(v bool) Option { + return withModelOption(model.WithAutoTune(v)) +} + +// WithCacheMinTokens configures the minimum number of tokens required for caching. +func WithCacheMinTokens(v int) Option { + return withModelOption(model.WithCacheMinTokens(v)) +} + +// WithCacheTypeK configures the key cache data type. +func WithCacheTypeK(v model.GGMLType) Option { + return withModelOption(model.WithCacheTypeK(v)) +} + +// WithCacheTypeV configures the value cache data type. +func WithCacheTypeV(v model.GGMLType) Option { + return withModelOption(model.WithCacheTypeV(v)) +} + +// WithContextWindow configures the model context window. +func WithContextWindow(v int) Option { + return withModelOption(model.WithContextWindow(v)) +} + +// WithDefaultParams configures the default model parameters. +func WithDefaultParams(v model.Params) Option { + return withModelOption(model.WithDefaultParams(v)) +} + +// WithChatTemplateKwargs configures the model chat template arguments. +func WithChatTemplateKwargs(v model.D) Option { + return withModelOption(model.WithChatTemplateKwargs(v)) +} + +// WithDevices configures the devices used for model execution. +func WithDevices(v []string) Option { + return withModelOption(model.WithDevices(v)) +} + +// WithDraftModel configures speculative decoding with a draft model. +func WithDraftModel(v *model.DraftModelConfig) Option { + return withModelOption(model.WithDraftModel(v)) +} + +// WithFlashAttention configures Flash Attention. +func WithFlashAttention(v model.FlashAttentionType) Option { + return withModelOption(model.WithFlashAttention(v)) +} + +// WithIMCSessionCapacity configures the incremental message cache session capacity. +func WithIMCSessionCapacity(v int) Option { + return withModelOption(model.WithIMCSessionCapacity(v)) +} + +// WithIncrementalCache configures incremental message caching. +func WithIncrementalCache(v bool) Option { + return withModelOption(model.WithIncrementalCache(v)) +} + +// WithInsecureLogging configures logging of potentially sensitive model data. +func WithInsecureLogging(v bool) Option { + return withModelOption(model.WithInsecureLogging(v)) +} + +// WithJinjaFile configures the model's Jinja template file. +func WithJinjaFile(v string) Option { + return withModelOption(model.WithJinjaFile(v)) +} + +// WithLoadMode configures how model weights are loaded. +func WithLoadMode(v model.LoadMode) Option { + return withModelOption(model.WithLoadMode(v)) +} + +// WithLog configures the logger used by model operations. +func WithLog(v model.Logger) Option { + return withModelOption(model.WithLog(v)) +} + +// WithMainGPU configures the primary GPU. +func WithMainGPU(v int) Option { + return withModelOption(model.WithMainGPU(v)) +} + +// WithMoE configures mixture-of-experts execution. +func WithMoE(v *model.MoEConfig) Option { + return withModelOption(model.WithMoE(v)) +} + +// WithModelFiles configures the model files at this point in the option sequence. +// The provider replaces them with the files resolved by LanguageModel. +func WithModelFiles(v []string) Option { + return withModelOption(model.WithModelFiles(v)) +} + +// WithNBatch configures the logical batch size. +func WithNBatch(v int) Option { + return withModelOption(model.WithNBatch(v)) +} + +// WithNGpuLayers configures the number of model layers offloaded to the GPU. +func WithNGpuLayers(v int) Option { + return withModelOption(model.WithNGpuLayers(v)) +} + +// WithNSeqMax configures the maximum number of concurrent sequences. +func WithNSeqMax(v int) Option { + return withModelOption(model.WithNSeqMax(v)) +} + +// WithNThreads configures the number of generation threads. +func WithNThreads(v int) Option { + return withModelOption(model.WithNThreads(v)) +} + +// WithNThreadsBatch configures the number of batch-processing threads. +func WithNThreadsBatch(v int) Option { + return withModelOption(model.WithNThreadsBatch(v)) +} + +// WithNUBatch configures the physical batch size. +func WithNUBatch(v int) Option { + return withModelOption(model.WithNUBatch(v)) +} + +// WithNUMA configures the NUMA strategy. +func WithNUMA(v string) Option { + return withModelOption(model.WithNUMA(v)) +} + +// WithOffloadKQV configures KV cache offloading. +func WithOffloadKQV(v bool) Option { + return withModelOption(model.WithOffloadKQV(v)) +} + +// WithOpOffload configures host tensor operation offloading. +func WithOpOffload(v bool) Option { + return withModelOption(model.WithOpOffload(v)) +} + +// WithOpOffloadMinBatch configures the minimum batch size for operation offloading. +func WithOpOffloadMinBatch(v int) Option { + return withModelOption(model.WithOpOffloadMinBatch(v)) +} + +// WithProjFile configures the multimodal projection file. +func WithProjFile(v string) Option { + return withModelOption(model.WithProjFile(v)) +} + +// WithMTPDrafterFile configures the MTP drafter file. +func WithMTPDrafterFile(v string) Option { + return withModelOption(model.WithMTPDrafterFile(v)) +} + +// WithProjOnCPU configures projection execution on the CPU. +func WithProjOnCPU(v bool) Option { + return withModelOption(model.WithProjOnCPU(v)) +} + +// WithRopeFreqBase configures the RoPE base frequency. +func WithRopeFreqBase(v float32) Option { + return withModelOption(model.WithRopeFreqBase(v)) +} + +// WithRopeFreqScale configures the RoPE frequency scale. +func WithRopeFreqScale(v float32) Option { + return withModelOption(model.WithRopeFreqScale(v)) +} + +// WithRopeScaling configures the RoPE scaling strategy. +func WithRopeScaling(v model.RopeScalingType) Option { + return withModelOption(model.WithRopeScaling(v)) +} + +// WithSplitMode configures how the model is split across devices. +func WithSplitMode(v model.SplitMode) Option { + return withModelOption(model.WithSplitMode(v)) +} + +// WithSWAFull configures full-size sliding-window-attention caching. +func WithSWAFull(v bool) Option { + return withModelOption(model.WithSWAFull(v)) +} + +// WithTensorBuftOverrides configures tensor buffer type overrides. +func WithTensorBuftOverrides(v []string) Option { + return withModelOption(model.WithTensorBuftOverrides(v)) +} + +// WithTensorSplit configures model distribution across devices. +func WithTensorSplit(v []float32) Option { + return withModelOption(model.WithTensorSplit(v)) +} + +// WithYarnAttnFactor configures the YaRN attention factor. +func WithYarnAttnFactor(v float32) Option { + return withModelOption(model.WithYarnAttnFactor(v)) +} + +// WithYarnBetaFast configures the YaRN low correction dimension. +func WithYarnBetaFast(v float32) Option { + return withModelOption(model.WithYarnBetaFast(v)) +} + +// WithYarnBetaSlow configures the YaRN high correction dimension. +func WithYarnBetaSlow(v float32) Option { + return withModelOption(model.WithYarnBetaSlow(v)) +} + +// WithYarnExtFactor configures the YaRN extrapolation mix factor. +func WithYarnExtFactor(v float32) Option { + return withModelOption(model.WithYarnExtFactor(v)) +} + +// WithYarnOrigCtx configures the original YaRN training context size. +func WithYarnOrigCtx(v int) Option { + return withModelOption(model.WithYarnOrigCtx(v)) +} + +// WithQueueDepth configures the model admission queue depth. +func WithQueueDepth(v int) Option { + return withModelOption(model.WithQueueDepth(v)) +} + +// WithSessionStoreFactory configures the model session store factory. +func WithSessionStoreFactory(v model.SessionStoreFactory) Option { + return withModelOption(model.WithSessionStoreFactory(v)) +} + +func withModelOption(opt model.Option) Option { return func(o *options) { - o.modelConfig = cfg + o.modelOptions = append(o.modelOptions, opt) } } diff --git a/providers/kronk/provider_options.go b/providers/kronk/provider_options.go index 217242ea4..74626a8b1 100644 --- a/providers/kronk/provider_options.go +++ b/providers/kronk/provider_options.go @@ -4,6 +4,7 @@ import ( "encoding/json" "charm.land/fantasy" + "github.com/ardanlabs/kronk/sdk/kronk/model" ) // Global type identifiers for Kronk-specific provider data. @@ -33,8 +34,57 @@ func init() { // ProviderMetadata represents additional metadata from Kronk provider. type ProviderMetadata struct { - TokensPerSecond float64 `json:"tokens_per_second"` - OutputTokens int64 `json:"output_tokens"` + Model string `json:"model"` + ModelDescription string `json:"model_description,omitempty"` + ModelType string `json:"model_type,omitempty"` + SystemFingerprint string `json:"system_fingerprint,omitempty"` + HasProjection bool `json:"has_projection"` + ModelSizeBytes uint64 `json:"model_size_bytes,omitempty"` + VRAMBytes int64 `json:"vram_bytes,omitempty"` + SlotMemoryBytes int64 `json:"slot_memory_bytes,omitempty"` + CachedInputTokens int64 `json:"cached_input_tokens,omitempty"` + OutputTokens int64 `json:"output_tokens"` + TokensPerSecond float64 `json:"tokens_per_second"` + TimeToFirstTokenMS float64 `json:"time_to_first_token_ms"` + DraftTokens int64 `json:"draft_tokens,omitempty"` + DraftAcceptedTokens int64 `json:"draft_accepted_tokens,omitempty"` + DraftAcceptanceRate float64 `json:"draft_acceptance_rate,omitempty"` + DraftCoverage float64 `json:"draft_coverage,omitempty"` + DraftDisableReason string `json:"draft_disable_reason,omitempty"` +} + +func newProviderMetadata(info model.ModelInfo) *ProviderMetadata { + return &ProviderMetadata{ + Model: info.ID, + ModelDescription: info.Desc, + ModelType: info.Type.String(), + HasProjection: info.HasProjection, + ModelSizeBytes: info.Size, + VRAMBytes: info.VRAMTotal, + SlotMemoryBytes: info.SlotMemory, + } +} + +func (m *ProviderMetadata) update(response model.ChatResponse) { + if response.Model != "" { + m.Model = response.Model + } + if response.SystemFingerprint != "" { + m.SystemFingerprint = response.SystemFingerprint + } + if response.Usage == nil { + return + } + + m.CachedInputTokens = int64(response.Usage.PromptTokensDetails.CachedTokens) + m.OutputTokens = int64(response.Usage.CompletionTokens) + m.TokensPerSecond = response.Usage.TokensPerSecond + m.TimeToFirstTokenMS = response.Usage.TimeToFirstTokenMS + m.DraftTokens = int64(response.Usage.DraftTokens) + m.DraftAcceptedTokens = int64(response.Usage.DraftAcceptedTokens) + m.DraftAcceptanceRate = response.Usage.DraftAcceptanceRate + m.DraftCoverage = response.Usage.DraftCoverage + m.DraftDisableReason = response.Usage.DraftDisableReason } // Options implements the ProviderOptionsData interface. @@ -59,12 +109,27 @@ func (m *ProviderMetadata) UnmarshalJSON(data []byte) error { // ProviderOptions represents additional options for Kronk provider. type ProviderOptions struct { - TopK *int64 `json:"top_k"` - RepeatPenalty *float64 `json:"repeat_penalty"` - Seed *int64 `json:"seed"` - MinP *float64 `json:"min_p"` - NumPredict *int64 `json:"num_predict"` - Stop []string `json:"stop"` + AdaptivePDecay *float64 `json:"adaptive_p_decay"` + AdaptivePTarget *float64 `json:"adaptive_p_target"` + DryAllowedLen *int64 `json:"dry_allowed_length"` + DryBase *float64 `json:"dry_base"` + DryMultiplier *float64 `json:"dry_multiplier"` + DryPenaltyLast *int64 `json:"dry_penalty_last_n"` + Grammar *string `json:"grammar"` + Logprobs *bool `json:"logprobs"` + MinP *float64 `json:"min_p"` + NumPredict *int64 `json:"num_predict"` + ReasoningEffort *string `json:"reasoning_effort"` + RepeatLastN *int64 `json:"repeat_last_n"` + RepeatPenalty *float64 `json:"repeat_penalty"` + Seed *int64 `json:"seed"` + Stop []string `json:"stop"` + Thinking *bool `json:"enable_thinking"` + TopK *int64 `json:"top_k"` + TopLogprobs *int64 `json:"top_logprobs"` + XtcMinKeep *int64 `json:"xtc_min_keep"` + XtcProbability *float64 `json:"xtc_probability"` + XtcThreshold *float64 `json:"xtc_threshold"` } // Options implements the ProviderOptionsData interface. From 49fe8d5e14f4c9c0df2ff4525e9718573c79c6af Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Wed, 12 Aug 2026 13:44:50 -0300 Subject: [PATCH 074/156] v0.41.1 --- version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.txt b/version.txt index 72a8a6313..9ed317fb4 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -0.41.0 +0.41.1 From fbbc132cff8be850a16527155927292c3a215d33 Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Mon, 17 Aug 2026 10:29:48 -0300 Subject: [PATCH 075/156] ci: run dependabot monthly --- .github/dependabot.yml | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 793b4546a..f9529eba2 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -4,10 +4,7 @@ updates: - package-ecosystem: "gomod" directory: "/" schedule: - interval: "weekly" - day: "monday" - time: "05:00" - timezone: "America/New_York" + interval: "monthly" labels: - "area: dependencies" commit-message: @@ -27,10 +24,7 @@ updates: - package-ecosystem: "gomod" directory: "/examples" schedule: - interval: "weekly" - day: "monday" - time: "05:00" - timezone: "America/New_York" + interval: "monthly" labels: - "area: dependencies" commit-message: @@ -44,10 +38,7 @@ updates: - package-ecosystem: "github-actions" directory: "/" schedule: - interval: "weekly" - day: "monday" - time: "05:00" - timezone: "America/New_York" + interval: "monthly" labels: - "area: dependencies" commit-message: From 4ce5a93bbb64848f2aba467223ae79773f3bf5fd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Aug 2026 13:32:31 -0300 Subject: [PATCH 076/156] chore(deps): bump the all group across 1 directory with 7 updates (#339) Bumps the all group with 7 updates in the / directory: | Package | From | To | | --- | --- | --- | | [cloud.google.com/go/auth](https://github.com/googleapis/google-cloud-go) | `0.23.0` | `0.23.1` | | [github.com/anthropics/anthropic-sdk-go](https://github.com/anthropics/anthropic-sdk-go) | `1.63.0` | `1.63.1` | | [github.com/aws/aws-sdk-go-v2](https://github.com/aws/aws-sdk-go-v2) | `1.43.4` | `1.43.5` | | [github.com/aws/aws-sdk-go-v2/config](https://github.com/aws/aws-sdk-go-v2) | `1.32.35` | `1.32.36` | | [github.com/stretchr/testify](https://github.com/stretchr/testify) | `1.11.1` | `1.12.0` | | [golang.org/x/net](https://github.com/golang/net) | `0.57.0` | `0.58.0` | | [google.golang.org/genai](https://github.com/googleapis/go-genai) | `1.67.0` | `1.68.0` | Updates `cloud.google.com/go/auth` from 0.23.0 to 0.23.1 - [Release notes](https://github.com/googleapis/google-cloud-go/releases) - [Changelog](https://github.com/googleapis/google-cloud-go/blob/main/CHANGES.md) - [Commits](https://github.com/googleapis/google-cloud-go/compare/v0.23.0...auth/v0.23.1) Updates `github.com/anthropics/anthropic-sdk-go` from 1.63.0 to 1.63.1 - [Changelog](https://github.com/anthropics/anthropic-sdk-go/blob/main/CHANGELOG.md) - [Commits](https://github.com/anthropics/anthropic-sdk-go/compare/v1.63.0...v1.63.1) Updates `github.com/aws/aws-sdk-go-v2` from 1.43.4 to 1.43.5 - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/v1.43.4...v1.43.5) Updates `github.com/aws/aws-sdk-go-v2/config` from 1.32.35 to 1.32.36 - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/config/v1.32.35...config/v1.32.36) Updates `github.com/stretchr/testify` from 1.11.1 to 1.12.0 - [Commits](https://github.com/stretchr/testify/compare/v1.11.1...v1.12.0) Updates `golang.org/x/net` from 0.57.0 to 0.58.0 - [Commits](https://github.com/golang/net/compare/v0.57.0...v0.58.0) Updates `google.golang.org/genai` from 1.67.0 to 1.68.0 - [Changelog](https://github.com/googleapis/go-genai/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/go-genai/compare/v1.67.0...v1.68.0) --- updated-dependencies: - dependency-name: cloud.google.com/go/auth dependency-version: 0.23.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all - dependency-name: github.com/anthropics/anthropic-sdk-go dependency-version: 1.63.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all - dependency-name: github.com/aws/aws-sdk-go-v2 dependency-version: 1.43.5 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all - dependency-name: github.com/aws/aws-sdk-go-v2/config dependency-version: 1.32.36 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all - dependency-name: github.com/stretchr/testify dependency-version: 1.12.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: all - dependency-name: golang.org/x/net dependency-version: 0.58.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: all - dependency-name: google.golang.org/genai dependency-version: 1.68.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: all ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 42 ++++++++++++++--------------- go.sum | 84 ++++++++++++++++++++++++++++------------------------------ 2 files changed, 60 insertions(+), 66 deletions(-) diff --git a/go.mod b/go.mod index 0d6938e84..63ed0caca 100644 --- a/go.mod +++ b/go.mod @@ -4,11 +4,11 @@ go 1.26.5 require ( charm.land/x/vcr v0.1.1 - cloud.google.com/go/auth v0.23.0 - github.com/anthropics/anthropic-sdk-go v1.63.0 + cloud.google.com/go/auth v0.23.1 + github.com/anthropics/anthropic-sdk-go v1.63.1 github.com/ardanlabs/kronk v1.30.8 - github.com/aws/aws-sdk-go-v2 v1.43.4 - github.com/aws/aws-sdk-go-v2/config v1.32.35 + github.com/aws/aws-sdk-go-v2 v1.43.5 + github.com/aws/aws-sdk-go-v2/config v1.32.36 github.com/aws/smithy-go v1.27.7 github.com/charmbracelet/x/exp/slice v0.0.0-20250904123553-b4e2667e5ad5 github.com/charmbracelet/x/exp/strings v0.1.0 @@ -18,10 +18,10 @@ require ( github.com/joho/godotenv v1.5.1 github.com/kaptinlin/jsonschema v0.9.8 github.com/openai/openai-go/v3 v3.50.0 - github.com/stretchr/testify v1.11.1 - golang.org/x/net v0.57.0 + github.com/stretchr/testify v1.12.0 + golang.org/x/net v0.58.0 golang.org/x/oauth2 v0.36.0 - google.golang.org/genai v1.67.0 + google.golang.org/genai v1.68.0 ) require ( @@ -39,20 +39,20 @@ require ( github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.59.0 // indirect github.com/ardanlabs/jinja v1.5.0 // indirect github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.16 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.19.34 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.35 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.35 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.35 // indirect - github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.36 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.15 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.19.35 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.36 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.36 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.36 // indirect + github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.37 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.16 // indirect github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.28 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.35 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.36 // indirect github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.36 // indirect github.com/aws/aws-sdk-go-v2/service/s3 v1.107.0 // indirect - github.com/aws/aws-sdk-go-v2/service/signin v1.5.4 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.33.4 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.38.4 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.45.4 // indirect + github.com/aws/aws-sdk-go-v2/service/signin v1.5.5 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.33.5 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.38.5 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.45.5 // indirect github.com/bahlo/generic-list-go v0.2.0 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d // indirect @@ -60,7 +60,6 @@ require ( github.com/cenkalti/backoff/v5 v5.0.3 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/cncf/xds/go v0.0.0-20260202195803-dba9d589def2 // indirect - github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/ebitengine/purego v0.10.2 // indirect github.com/envoyproxy/go-control-plane/envoy v1.37.0 // indirect github.com/envoyproxy/protoc-gen-validate v1.3.3 // indirect @@ -89,7 +88,6 @@ require ( github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/pb33f/ordered-map/v2 v2.3.1 // indirect github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect - github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/prometheus/client_golang v1.24.1 // indirect github.com/prometheus/client_model v0.6.2 // indirect github.com/prometheus/common v0.70.1 // indirect @@ -115,11 +113,11 @@ require ( go.opentelemetry.io/proto/otlp v1.11.0 // indirect go.yaml.in/yaml/v2 v2.4.4 // indirect go.yaml.in/yaml/v4 v4.0.0-rc.3 // indirect - golang.org/x/crypto v0.54.0 // indirect + golang.org/x/crypto v0.55.0 // indirect golang.org/x/image v0.44.0 // indirect golang.org/x/sync v0.22.0 // indirect golang.org/x/sys v0.47.0 // indirect - golang.org/x/text v0.40.0 // indirect + golang.org/x/text v0.41.0 // indirect golang.org/x/time v0.15.0 // indirect google.golang.org/api v0.292.0 // indirect google.golang.org/genproto v0.0.0-20260807164820-c8921c73eeea // indirect diff --git a/go.sum b/go.sum index 9af39fac8..218072d9d 100644 --- a/go.sum +++ b/go.sum @@ -4,8 +4,8 @@ charm.land/x/vcr v0.1.1 h1:PXCFMUG0rPtyk35rhfzYCJEduOzWXCIbrXTFq4OF/9Q= charm.land/x/vcr v0.1.1/go.mod h1:eByq2gqzWvcct/8XE2XO5KznoWEBiXH56+y2gphbltM= cloud.google.com/go v0.123.0 h1:2NAUJwPR47q+E35uaJeYoNhuNEM9kM8SjgRgdeOJUSE= cloud.google.com/go v0.123.0/go.mod h1:xBoMV08QcqUGuPW65Qfm1o9Y4zKZBpGS+7bImXLTAZU= -cloud.google.com/go/auth v0.23.0 h1:6Gg1CMgpgubRG7DGz5Vf1pcoNo8RfiRiRAPS4crTp54= -cloud.google.com/go/auth v0.23.0/go.mod h1:4DhBRcqvtljQN3dJ57qtqbib5ZGCYE5f2crfiiC2EM0= +cloud.google.com/go/auth v0.23.1 h1:1tPpBPG02lQHmoiAvs9egyCASqXP0xgobptjZzov/Jg= +cloud.google.com/go/auth v0.23.1/go.mod h1:4DhBRcqvtljQN3dJ57qtqbib5ZGCYE5f2crfiiC2EM0= cloud.google.com/go/auth/oauth2adapt v0.2.8 h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIiLpZnkHRbnc= cloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c= cloud.google.com/go/compute/metadata v0.9.0 h1:pDUj4QMoPejqq20dK0Pg2N4yG9zIkYGdBtwLoEkH9Zs= @@ -38,46 +38,46 @@ github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0 github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.59.0/go.mod h1:V9g30lTKzfUsEW+gpWssck6u9IhARajmipodImLLcwI= github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.59.0 h1:18FRm6ZcN/x9+ZmhMr96hLcTtlLn2/gHPuDLVeg7XcY= github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.59.0/go.mod h1:YqwkQPrWSC7+byyc1VlKbWLBF5JsW5IoL6xUkemYSXk= -github.com/anthropics/anthropic-sdk-go v1.63.0 h1:GNl6LVjjxg1bRY41nlrvL5FvlwQs7FbYgQ3DnoVITD4= -github.com/anthropics/anthropic-sdk-go v1.63.0/go.mod h1:3EfIfmFqxH6rbiLcIP4tPFyXL/IHakx2wDG4OU+TIEI= +github.com/anthropics/anthropic-sdk-go v1.63.1 h1:M9dIoZzUWB453ulVpBkQp3FX0769udzrTscDrsJk1w4= +github.com/anthropics/anthropic-sdk-go v1.63.1/go.mod h1:3EfIfmFqxH6rbiLcIP4tPFyXL/IHakx2wDG4OU+TIEI= github.com/ardanlabs/jinja v1.5.0 h1:OkNpmq9fXiCDRHMLCsd+VO/uk8L/tVwNJE+yA3JAhhM= github.com/ardanlabs/jinja v1.5.0/go.mod h1:aXXzlJfjA+T3XNKA/YT5ZtDq2VJxt5a5siZ8cl9B35Q= github.com/ardanlabs/kronk v1.30.8 h1:MOGh/21FVan1p/m1TNYzdxyw5TEoL3mQoVj28V6t3kE= github.com/ardanlabs/kronk v1.30.8/go.mod h1:gbG7Ya33lZRWo36mwICzY1vGfTd3HCxomQMAAUKpZzU= -github.com/aws/aws-sdk-go-v2 v1.43.4 h1:b9FTvbRwy+JCsfp2Wp6wV/KbOx3Aj7nkoFb2cRX0IhE= -github.com/aws/aws-sdk-go-v2 v1.43.4/go.mod h1:70vwSy16txshwG+g55WkpgPKDIByzHI8ccBsOteo3bQ= +github.com/aws/aws-sdk-go-v2 v1.43.5 h1:yKT5GYnFWhuDo+DqKvE5ZPwVn3RjC4MAeBtZGlh6AVM= +github.com/aws/aws-sdk-go-v2 v1.43.5/go.mod h1:wZjAJppCntyOGgVSmgVTfDyRJK5PHOasO6Wsy8U7Axk= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.16 h1:aiuaKlDweRC5qExJondpWjOgyzMHpofpwspGXUtwn4c= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.16/go.mod h1:nG/LOlmox9BDe9HvQnXWzgcK8uKbgBMZ/Hp5pVt/21I= -github.com/aws/aws-sdk-go-v2/config v1.32.35 h1:UEzXuET8E42lxBPijuACu/tEK7v5lFPlk0Q+GT5WD9E= -github.com/aws/aws-sdk-go-v2/config v1.32.35/go.mod h1:KaMtJpFa2JlL2BStjjHQVwQpzZEmw+ND/EgVrfFoo2g= -github.com/aws/aws-sdk-go-v2/credentials v1.19.34 h1:y6GkSmcv5myd1ngrYbGmiLlwQqB6TQhOuN/tbSSuWDY= -github.com/aws/aws-sdk-go-v2/credentials v1.19.34/go.mod h1:w3dTcnDVoQIewjo7JG45hduAToikiIFLC4FIO7fndvw= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.35 h1:+S7kbJoLDDQ5tE+lHrUBgMkzC8NLgsaioS2F3dVoFAE= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.35/go.mod h1:Ak7xXviIARfFdNUJ9Etb0bdVDt/KAvKjMGJVLWXDzik= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.35 h1:kzVuGlatQtYinwBJEEyLAbggepCoavosiaHHX9+fD+c= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.35/go.mod h1:0yLx0yEI+SfqeJMPvOtIEFoZbiQYXMGszBueiutQyaI= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.35 h1:WK6CjihTuLisCjSKKbildJ79sGZZgbBz3iNa7VsKIhU= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.35/go.mod h1:KYleN57luLoe97R7vTnx8PMcVrr9gAcRECtOjl91DNg= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.36 h1:jbGY4CXLzZElOXgGsexlC3Hi+3YM0rSmk4opFXKqg/k= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.36/go.mod h1:uBu/9aKsS/UQGc72RAt3y54kjgYQxmhut8ZD2dXCDNE= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.15 h1:JJLBQxwY+AFwuPAi5ivGc1ChnTdUt4cXMv7e76m2c/Y= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.15/go.mod h1:lQknBIe78MVL0cQOQDlag8KGflMbMEVFx9mB6O8ENvk= +github.com/aws/aws-sdk-go-v2/config v1.32.36 h1:mX6ietU7UlB4w/2IUaexJdsyUDvhTd+jYPjVePiyi6s= +github.com/aws/aws-sdk-go-v2/config v1.32.36/go.mod h1:rMpV4xk7ZK59edraSaHP0jsWrztWTT5tbCwWY495hug= +github.com/aws/aws-sdk-go-v2/credentials v1.19.35 h1:Cxua2RVdRwL0sfjHM/SnQoOnQ7xKng9m5EQBO8BnZlg= +github.com/aws/aws-sdk-go-v2/credentials v1.19.35/go.mod h1:9XQ+RSIGPkycr+oCJYnB1uTv5kMVVR+rd2vYK0Hxj2w= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.36 h1:gucL1KH/PAYbpTpBg09CiVpBdTu4qkCl8C7xOTBixUg= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.36/go.mod h1:usTB+PHhNMhrx2dxUeHcM7OrT5pySvmjYI++IsefPN0= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.36 h1:5CrzwxDqf4w3x1Vs3/NiZ0nsC34Hbm3pIDMWbsLebOE= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.36/go.mod h1:A3gHdKZIvG/QXERzZwcxNS3RNDFcRCuhhTFBYp+V/nw= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.36 h1:A4N2f4YPcST0v+dWtX+xrpPPCL9VTBhoIFFUWYqbacE= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.36/go.mod h1:B/Qr859uxWUEfZeGotK5KAEoof4Q9YWgNtPSwV6jcyk= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.37 h1:oyd3ke4V9AhKcRR7rRgxk1VyI+DjK2CBQtbxh3OkdaA= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.37/go.mod h1:aA9D7SqfG9IC1b7FLD7Iyc8Q4JN0a8gHhNjN4zPlIaI= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.16 h1:iE4NGbvqUZnHDqddQAauZzCILYtFjOHwRM5MOOKLB5A= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.16/go.mod h1:VsjEgrP+ibcou8TlWA4tYaB+0OojuhirsmCe+U60hTA= github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.28 h1:Q1TF1J9jVD+vFo0LzNnmNdQ9EAt52TS+MQlq9Ir+Yxo= github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.28/go.mod h1:4KqXXC/p1hrotmouDFbrRoWaLy962b9PMUReCG6+uWo= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.35 h1:BBEElKh4a+rKshvjrfpajTe9CbpZvrbb4Jkg2PB7RzA= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.35/go.mod h1:zaZk983w//8beSruBVec/mr4CmDwgZitW/qzGhAAX0g= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.36 h1:fx2ujmozWn+C/GtfXfz5k6Ckzza40ElOpIW7d92fLWQ= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.36/go.mod h1:QT2ufGVJ+xTRxtXPHTQ1kHkAdWIKPCmD+BqYAXWv8/4= github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.36 h1:EUIwBoN+q7UmhAejxgD27APiRjh1vwCFo53gSqdT0BM= github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.36/go.mod h1:6u00gmlTGR6W0b2k9NBrld7MnOEmf1Spqx0VVt6AqyE= github.com/aws/aws-sdk-go-v2/service/s3 v1.107.0 h1:OkYV+1171za+ab9otU1tGxMXhx6uZvwVEtVddjLuYTg= github.com/aws/aws-sdk-go-v2/service/s3 v1.107.0/go.mod h1:5FTZoQxhmLEiCAtYVk6V+t0iS/B5yGZVLZ3Wq5FDJZI= -github.com/aws/aws-sdk-go-v2/service/signin v1.5.4 h1:cOJELVNrq5Q3Udry2GLuHUM7MhwpeaQRdYaoa6GI/yI= -github.com/aws/aws-sdk-go-v2/service/signin v1.5.4/go.mod h1:f4LxzKBtaTxD7xh3PiVg3CE1tchQemfmghaJr+NbK2c= -github.com/aws/aws-sdk-go-v2/service/sso v1.33.4 h1:AMW7a7S8iQaHjBYZdU3PCq4GKRPijTPRAc7e6XtEThY= -github.com/aws/aws-sdk-go-v2/service/sso v1.33.4/go.mod h1:QQNsFV1DVXoXcZt18FS8lI8rtUrlDyAuWZLQ5shunv4= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.38.4 h1:AsbZcJAQPRmHDJG8K1N0pof/1zPWjVT8TFlTWuGLSvo= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.38.4/go.mod h1:6imqztH0//t0mKbl6yWl7swSEl7F/w32oAmqB3vP1ag= -github.com/aws/aws-sdk-go-v2/service/sts v1.45.4 h1:w/AryDYMjSUANSQ2uoZxJovUsMTwWJNTv3IMex30Y+4= -github.com/aws/aws-sdk-go-v2/service/sts v1.45.4/go.mod h1:WeBiAa67azG7Su9Vf+ChGDBLiAozJCXzdjXiPBUwtbc= +github.com/aws/aws-sdk-go-v2/service/signin v1.5.5 h1:0VTFBfOgPJrUSpGMgzoi8qLcXF5dbmiBuxpo14eBWUw= +github.com/aws/aws-sdk-go-v2/service/signin v1.5.5/go.mod h1:sNZYlBxoohYMBYl47BO/bFtAM6I8HSsPa1qwwPPRGoQ= +github.com/aws/aws-sdk-go-v2/service/sso v1.33.5 h1:jDQARFp1mJ2PEnllQf01nfFXGfWMJ59e0/HCHUTTZCk= +github.com/aws/aws-sdk-go-v2/service/sso v1.33.5/go.mod h1:OcT2AhgTuxGAwZk5hgxaNLGpS33W8s8dUQadGVDVY9I= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.38.5 h1:8xo1q9ttkYqMJ6vOXX67FPSpVEI7BWKVTKh77g82w+8= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.38.5/go.mod h1:hbBeEUrZg6VddXYZpbKPyF0tl4XEnM+Dbx92RW3vmZI= +github.com/aws/aws-sdk-go-v2/service/sts v1.45.5 h1:eQ5BtXDrPg2wK0AjtVPzeBhUpYPeqHE/ptiH7xJRGek= +github.com/aws/aws-sdk-go-v2/service/sts v1.45.5/go.mod h1:f9ImhnOISY7BuTZLM8qHepCYnglHBVLk5wVzatmP++w= github.com/aws/smithy-go v1.27.7 h1:Zgj5z4LfcDYoQIVk+n/yGdTkP/2y6ZT5vYxe0fp7bqE= github.com/aws/smithy-go v1.27.7/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc= github.com/bahlo/generic-list-go v0.2.0 h1:5sz/EEAK+ls5wF+NeqDpk5+iNdMDXrh3z3nPnH1Wvgk= @@ -100,8 +100,6 @@ github.com/charmbracelet/x/json v0.2.0 h1:DqB+ZGx2h+Z+1s98HOuOyli+i97wsFQIxP2ZQA github.com/charmbracelet/x/json v0.2.0/go.mod h1:opFIflx2YgXgi49xVUu8gEQ21teFAxyMwvOiZhIvWNM= github.com/cncf/xds/go v0.0.0-20260202195803-dba9d589def2 h1:aBangftG7EVZoUb69Os8IaYg++6uMOdKK83QtkkvJik= github.com/cncf/xds/go v0.0.0-20260202195803-dba9d589def2/go.mod h1:qwXFYgsP6T7XnJtbKlf1HP8AjxZZyzxMmc+Lq5GjlU4= -github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= -github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dnaeon/go-vcr v1.2.0 h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI= github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= github.com/ebitengine/purego v0.10.2 h1:W809HbnvzAxgdm+aOvlSekrM16wGCdT/e76+9tS7gzE= @@ -189,8 +187,6 @@ github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmd github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU= github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= -github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= -github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_golang v1.24.1 h1:JnJkREXzWxUdCuPFpIWZiPispT9xVV59uiuyR2bPlnU= github.com/prometheus/client_golang v1.24.1/go.mod h1:F+oSRECHg4sse5ucfYpYDeIv/hu68Zo0uoHKetWnzcE= github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= @@ -205,8 +201,8 @@ github.com/spiffe/go-spiffe/v2 v2.8.1 h1:eXZMLsu+3MLEPJyGJkolqtVrteZfQdUpOWj6LTi github.com/spiffe/go-spiffe/v2 v2.8.1/go.mod h1:47Q0Q9/AqGha8QLHp+kxpH4Wca7X7EnOtlIJy3mxZ3U= github.com/standard-webhooks/standard-webhooks/libraries v0.0.1 h1:uOfcYT+3QungH6tIGSVCR/Y3KJmgJiHcojJbMTPDZAI= github.com/standard-webhooks/standard-webhooks/libraries v0.0.1/go.mod h1:L1MQhA6x4dn9r007T033lsaZMv9EmBAdXyU/+EF40fo= -github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= -github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/stretchr/testify v1.12.0 h1:K6Mr6jO9JICuend/5xzTM03ydSV3vdNRYAdPSukj8uI= +github.com/stretchr/testify v1.12.0/go.mod h1:bOYBZb5qJ00vPzWfIqBUZPaxK8jWiXc6d3ErP4Ca9Gw= github.com/tidwall/gjson v1.14.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/gjson v1.19.0 h1:xwxm7n691Uf3u5OFjzngavjGTh55KX5q/9w9xHW88JU= github.com/tidwall/gjson v1.19.0/go.mod h1:V37/opeE/JbLUOfH0QTXiNez2l0RUjYUhpT4szFQAfc= @@ -253,28 +249,28 @@ go.yaml.in/yaml/v2 v2.4.4 h1:tuyd0P+2Ont/d6e2rl3be67goVK4R6deVxCUX5vyPaQ= go.yaml.in/yaml/v2 v2.4.4/go.mod h1:gMZqIpDtDqOfM0uNfy0SkpRhvUryYH0Z6wdMYcacYXQ= go.yaml.in/yaml/v4 v4.0.0-rc.3 h1:3h1fjsh1CTAPjW7q/EMe+C8shx5d8ctzZTrLcs/j8Go= go.yaml.in/yaml/v4 v4.0.0-rc.3/go.mod h1:aZqd9kCMsGL7AuUv/m/PvWLdg5sjJsZ4oHDEnfPPfY0= -golang.org/x/crypto v0.54.0 h1:YLIA59K4fiNzHzjnZt2tUJQjQtUWfWbeHBqKtk3eScw= -golang.org/x/crypto v0.54.0/go.mod h1:KWL8ny2AZdGR2cWmzeHrp2azQPGogOv+HeQaVEXC2dk= +golang.org/x/crypto v0.55.0 h1:+KWHjbgOaAQ66dh/YlkZKHlz9ZUlq61AFirAR9ntP8M= +golang.org/x/crypto v0.55.0/go.mod h1:uq0V9dE/fzQuJtbnL+2EhWOE63vo164FY8xqEnV9xis= golang.org/x/image v0.44.0 h1:+tDekMZED9+LrtB3G5xzRggpVh9CARjZqROla3R3R+I= golang.org/x/image v0.44.0/go.mod h1:V8K3KE9KKKE+pLpQDOeN18w9oacNSvy1tDOirTu4xtY= -golang.org/x/net v0.57.0 h1:K5+3DljvIuDG9/Jv9rvyMywYNFCQ9RSUY6OOTTkT+tE= -golang.org/x/net v0.57.0/go.mod h1:KpXc8iv+r3XplLAG/f7Jsf9RPszJzdR0f58q9vGOuEU= +golang.org/x/net v0.58.0 h1:ynWG7rqYi4ccpTEuPZ2QGWHktVEM9DMCj9yzDE0Q7To= +golang.org/x/net v0.58.0/go.mod h1:YwCddHnFlT7eLQqVprV19OnhLGtc5xOKgE0RyqgfWAU= golang.org/x/oauth2 v0.36.0 h1:peZ/1z27fi9hUOFCAZaHyrpWG5lwe0RJEEEeH0ThlIs= golang.org/x/oauth2 v0.36.0/go.mod h1:YDBUJMTkDnJS+A4BP4eZBjCqtokkg1hODuPjwiGPO7Q= golang.org/x/sync v0.22.0 h1:SZjpbeLmrCk4xhRSZFNZW5gFUeCeFgjekvI/+gfScek= golang.org/x/sync v0.22.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= golang.org/x/sys v0.47.0 h1:o7XGOvZQCADBQQ4Y7VNq2dRWQR7JmOUW8Kxx4ZsNgWs= golang.org/x/sys v0.47.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= -golang.org/x/text v0.40.0 h1:Ub2Z6/xjgF1WrYQz2nuITOEegKFtiIy+rieRJ5lHZKs= -golang.org/x/text v0.40.0/go.mod h1:hpnzDAfGV753zIKo+wk3u1bVKCGPbrnF7+7LBF/UHVY= +golang.org/x/text v0.41.0 h1:vz/seA0lnX87Othu2f/0L24RcgrXD9/YFTSuGjj3rH8= +golang.org/x/text v0.41.0/go.mod h1:jvf1O8ajNzZqhSrQBPbutR/EB83Cc0CFrezNQIwbb5M= golang.org/x/time v0.15.0 h1:bbrp8t3bGUeFOx08pvsMYRTCVSMk89u4tKbNOZbp88U= golang.org/x/time v0.15.0/go.mod h1:Y4YMaQmXwGQZoFaVFk4YpCt4FLQMYKZe9oeV/f4MSno= gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4= gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E= google.golang.org/api v0.292.0 h1:Ewiwo/GTtiaPZSNAZQUcWLh8AYDEoPmIXyJfeoTSMHU= google.golang.org/api v0.292.0/go.mod h1:07kjmMnFGm2RQuCza2EZM/5N68G/fVvFb1xKjWqoFA0= -google.golang.org/genai v1.67.0 h1:m3V2AK2zbyViUq9rhTkMgkxu32Fueypy5Pzd9yV8GwU= -google.golang.org/genai v1.67.0/go.mod h1:mDdPDFXo1Ats7f1WXVyZgWb/CkMzFWTWJruIMy7hGIU= +google.golang.org/genai v1.68.0 h1:gmALuBU6mRy46wupEt20wBR1dYAMY13t/jkTxpdzhzE= +google.golang.org/genai v1.68.0/go.mod h1:mDdPDFXo1Ats7f1WXVyZgWb/CkMzFWTWJruIMy7hGIU= google.golang.org/genproto v0.0.0-20260807164820-c8921c73eeea h1:EoNao6AiKb+bftjR8vFOxqtY1A4zLnvnfea+FBQicBo= google.golang.org/genproto v0.0.0-20260807164820-c8921c73eeea/go.mod h1:MVqdGj2rFowpxM1nWJoGZmKI3TGThZsWENFz9uc4l1g= google.golang.org/genproto/googleapis/api v0.0.0-20260807164820-c8921c73eeea h1:Jifw/kjs/r3B0uszvls/m3c3tmZs2YHGM9C+rvxP9gY= From c3bfd446351e1a22a07e7a70b84a7f4208f74c40 Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Mon, 17 Aug 2026 13:44:39 -0300 Subject: [PATCH 077/156] ci: fix govulncheck --- go.mod | 4 ++-- go.sum | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/go.mod b/go.mod index 63ed0caca..9ae824099 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module charm.land/fantasy -go 1.26.5 +go 1.26.6 require ( charm.land/x/vcr v0.1.1 @@ -114,7 +114,7 @@ require ( go.yaml.in/yaml/v2 v2.4.4 // indirect go.yaml.in/yaml/v4 v4.0.0-rc.3 // indirect golang.org/x/crypto v0.55.0 // indirect - golang.org/x/image v0.44.0 // indirect + golang.org/x/image v0.45.0 // indirect golang.org/x/sync v0.22.0 // indirect golang.org/x/sys v0.47.0 // indirect golang.org/x/text v0.41.0 // indirect diff --git a/go.sum b/go.sum index 218072d9d..5c966d959 100644 --- a/go.sum +++ b/go.sum @@ -251,8 +251,8 @@ go.yaml.in/yaml/v4 v4.0.0-rc.3 h1:3h1fjsh1CTAPjW7q/EMe+C8shx5d8ctzZTrLcs/j8Go= go.yaml.in/yaml/v4 v4.0.0-rc.3/go.mod h1:aZqd9kCMsGL7AuUv/m/PvWLdg5sjJsZ4oHDEnfPPfY0= golang.org/x/crypto v0.55.0 h1:+KWHjbgOaAQ66dh/YlkZKHlz9ZUlq61AFirAR9ntP8M= golang.org/x/crypto v0.55.0/go.mod h1:uq0V9dE/fzQuJtbnL+2EhWOE63vo164FY8xqEnV9xis= -golang.org/x/image v0.44.0 h1:+tDekMZED9+LrtB3G5xzRggpVh9CARjZqROla3R3R+I= -golang.org/x/image v0.44.0/go.mod h1:V8K3KE9KKKE+pLpQDOeN18w9oacNSvy1tDOirTu4xtY= +golang.org/x/image v0.45.0 h1:FMb1nTbH5H9vF55SriQHgFw5GnNL9Jg6L25BwXKzhB0= +golang.org/x/image v0.45.0/go.mod h1:n62x/7RqlwXDvGsSU4u6IUTUf6KghUZ9Bt7cG/T9Fx4= golang.org/x/net v0.58.0 h1:ynWG7rqYi4ccpTEuPZ2QGWHktVEM9DMCj9yzDE0Q7To= golang.org/x/net v0.58.0/go.mod h1:YwCddHnFlT7eLQqVprV19OnhLGtc5xOKgE0RyqgfWAU= golang.org/x/oauth2 v0.36.0 h1:peZ/1z27fi9hUOFCAZaHyrpWG5lwe0RJEEEeH0ThlIs= From 692e27b729d1e49b8222d7e730476f5c7623531c Mon Sep 17 00:00:00 2001 From: William Kennedy Date: Mon, 17 Aug 2026 13:07:55 -0400 Subject: [PATCH 078/156] chore(deps): update kronk to v1.31.3 (#341) --- examples/go.mod | 70 +++++++++--------- examples/go.sum | 148 ++++++++++++++++++------------------- go.mod | 28 +++---- go.sum | 60 +++++++-------- providers/kronk/options.go | 15 ++-- 5 files changed, 156 insertions(+), 165 deletions(-) diff --git a/examples/go.mod b/examples/go.mod index bed2810e1..48605c4c0 100644 --- a/examples/go.mod +++ b/examples/go.mod @@ -1,6 +1,6 @@ module charm.land/fantasy/examples -go 1.26.5 +go 1.26.6 replace charm.land/fantasy => ../ @@ -14,7 +14,7 @@ require ( require ( cel.dev/expr v0.25.2 // indirect cloud.google.com/go v0.123.0 // indirect - cloud.google.com/go/auth v0.23.0 // indirect + cloud.google.com/go/auth v0.23.1 // indirect cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect cloud.google.com/go/compute/metadata v0.9.0 // indirect cloud.google.com/go/iam v1.13.0 // indirect @@ -23,26 +23,26 @@ require ( github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.35.0 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.59.0 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.59.0 // indirect - github.com/anthropics/anthropic-sdk-go v1.63.0 // indirect - github.com/ardanlabs/jinja v1.5.0 // indirect - github.com/ardanlabs/kronk v1.30.8 // indirect - github.com/aws/aws-sdk-go-v2 v1.43.4 // indirect - github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.16 // indirect - github.com/aws/aws-sdk-go-v2/config v1.32.35 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.19.34 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.35 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.35 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.35 // indirect - github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.36 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.15 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.28 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.35 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.36 // indirect - github.com/aws/aws-sdk-go-v2/service/s3 v1.107.0 // indirect - github.com/aws/aws-sdk-go-v2/service/signin v1.5.4 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.33.4 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.38.4 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.45.4 // indirect + github.com/anthropics/anthropic-sdk-go v1.63.1 // indirect + github.com/ardanlabs/jinja v1.6.0 // indirect + github.com/ardanlabs/kronk v1.31.3 // indirect + github.com/aws/aws-sdk-go-v2 v1.43.5 // indirect + github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.17 // indirect + github.com/aws/aws-sdk-go-v2/config v1.32.36 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.19.35 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.36 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.36 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.36 // indirect + github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.37 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.16 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.29 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.36 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.37 // indirect + github.com/aws/aws-sdk-go-v2/service/s3 v1.107.1 // indirect + github.com/aws/aws-sdk-go-v2/service/signin v1.5.5 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.33.5 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.38.5 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.45.5 // indirect github.com/aws/smithy-go v1.27.7 // indirect github.com/bahlo/generic-list-go v0.2.0 // indirect github.com/beorn7/perks v1.0.1 // indirect @@ -71,15 +71,15 @@ require ( github.com/google/go-cmp v0.7.0 // indirect github.com/google/s2a-go v0.1.9 // indirect github.com/google/uuid v1.6.0 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.3.20 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.3.21 // indirect github.com/googleapis/gax-go/v2 v2.23.0 // indirect github.com/gorilla/websocket v1.5.3 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.30.0 // indirect github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.74 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect - github.com/hashicorp/go-getter v1.8.6 // indirect + github.com/hashicorp/go-getter v1.8.8 // indirect github.com/hashicorp/go-version v1.9.0 // indirect - github.com/hybridgroup/yzma v1.22.0 // indirect + github.com/hybridgroup/yzma v1.23.0 // indirect github.com/invopop/jsonschema v0.14.0 // indirect github.com/jupiterrider/ffi v0.7.0 // indirect github.com/kaptinlin/jsonpointer v0.4.28 // indirect @@ -120,20 +120,20 @@ require ( go.opentelemetry.io/proto/otlp v1.11.0 // indirect go.yaml.in/yaml/v2 v2.4.4 // indirect go.yaml.in/yaml/v4 v4.0.0-rc.3 // indirect - golang.org/x/crypto v0.54.0 // indirect + golang.org/x/crypto v0.55.0 // indirect golang.org/x/exp v0.0.0-20260312153236-7ab1446f8b90 // indirect - golang.org/x/image v0.44.0 // indirect - golang.org/x/net v0.57.0 // indirect + golang.org/x/image v0.45.0 // indirect + golang.org/x/net v0.58.0 // indirect golang.org/x/oauth2 v0.36.0 // indirect golang.org/x/sync v0.22.0 // indirect golang.org/x/sys v0.47.0 // indirect - golang.org/x/text v0.40.0 // indirect + golang.org/x/text v0.41.0 // indirect golang.org/x/time v0.15.0 // indirect - google.golang.org/api v0.292.0 // indirect - google.golang.org/genai v1.67.0 // indirect - google.golang.org/genproto v0.0.0-20260807164820-c8921c73eeea // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20260807164820-c8921c73eeea // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20260807164820-c8921c73eeea // indirect + google.golang.org/api v0.293.0 // indirect + google.golang.org/genai v1.68.0 // indirect + google.golang.org/genproto v0.0.0-20260810153831-ec0a7760b754 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20260810153831-ec0a7760b754 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20260810153831-ec0a7760b754 // indirect google.golang.org/grpc v1.83.0 // indirect - google.golang.org/protobuf v1.36.11 // indirect + google.golang.org/protobuf v1.36.12 // indirect ) diff --git a/examples/go.sum b/examples/go.sum index ac6cba835..0648da037 100644 --- a/examples/go.sum +++ b/examples/go.sum @@ -2,16 +2,16 @@ cel.dev/expr v0.25.2 h1:K6j46C81hXtZQfuX60cVWQFBJahKSE2gfRbNuvr5bFs= cel.dev/expr v0.25.2/go.mod h1:hrXvqGP6G6gyx8UAHSHJ5RGk//1Oj5nXQ2NI02Nrsg4= cloud.google.com/go v0.123.0 h1:2NAUJwPR47q+E35uaJeYoNhuNEM9kM8SjgRgdeOJUSE= cloud.google.com/go v0.123.0/go.mod h1:xBoMV08QcqUGuPW65Qfm1o9Y4zKZBpGS+7bImXLTAZU= -cloud.google.com/go/auth v0.23.0 h1:6Gg1CMgpgubRG7DGz5Vf1pcoNo8RfiRiRAPS4crTp54= -cloud.google.com/go/auth v0.23.0/go.mod h1:4DhBRcqvtljQN3dJ57qtqbib5ZGCYE5f2crfiiC2EM0= +cloud.google.com/go/auth v0.23.1 h1:1tPpBPG02lQHmoiAvs9egyCASqXP0xgobptjZzov/Jg= +cloud.google.com/go/auth v0.23.1/go.mod h1:4DhBRcqvtljQN3dJ57qtqbib5ZGCYE5f2crfiiC2EM0= cloud.google.com/go/auth/oauth2adapt v0.2.8 h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIiLpZnkHRbnc= cloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c= cloud.google.com/go/compute/metadata v0.9.0 h1:pDUj4QMoPejqq20dK0Pg2N4yG9zIkYGdBtwLoEkH9Zs= cloud.google.com/go/compute/metadata v0.9.0/go.mod h1:E0bWwX5wTnLPedCKqk3pJmVgCBSM6qQI1yTBdEb3C10= cloud.google.com/go/iam v1.13.0 h1:ufT3FPT5rFFXu6UtLkNoxaOaV5EuA1dsSkmemCSTo6U= cloud.google.com/go/iam v1.13.0/go.mod h1:gHXdDEiPDvqd1q1KwBDGQlgZY/BwY760zU2LhOZS5w0= -cloud.google.com/go/logging v1.19.0 h1:NCqhdVUg3wQ8Cobdf16FDSuTGi3+6+hdSBHrY5TsR6Q= -cloud.google.com/go/logging v1.19.0/go.mod h1:i40NZCHC9Gqvod4yE+yQfDWwlgwW/SrshkkGibCHxcA= +cloud.google.com/go/logging v1.19.1 h1:7SsLhyTDBDrJw+Ll6Ns3I2mByqHXvJUc3rGjSlwiWgU= +cloud.google.com/go/logging v1.19.1/go.mod h1:2IkQ/d8jVJqV2qW8ZUGUiMjdZG1gkLD2JReGbZ8isqg= cloud.google.com/go/longrunning v1.2.0 h1:WjYH3YHBGCxGJP9M4dWGHBfXr/cFIjMkNgWcJj7/iMM= cloud.google.com/go/longrunning v1.2.0/go.mod h1:5KMQALFGOCtFoi2xSOA1u3H7WKlhmckgiyFw7+LGQp0= cloud.google.com/go/monitoring v1.30.0 h1:r/d+JUbyKmJ8b07iznuKfzVzrIXTWxHQ3lBRm3x2LlY= @@ -28,46 +28,46 @@ github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0 github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.59.0/go.mod h1:V9g30lTKzfUsEW+gpWssck6u9IhARajmipodImLLcwI= github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.59.0 h1:18FRm6ZcN/x9+ZmhMr96hLcTtlLn2/gHPuDLVeg7XcY= github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.59.0/go.mod h1:YqwkQPrWSC7+byyc1VlKbWLBF5JsW5IoL6xUkemYSXk= -github.com/anthropics/anthropic-sdk-go v1.63.0 h1:GNl6LVjjxg1bRY41nlrvL5FvlwQs7FbYgQ3DnoVITD4= -github.com/anthropics/anthropic-sdk-go v1.63.0/go.mod h1:3EfIfmFqxH6rbiLcIP4tPFyXL/IHakx2wDG4OU+TIEI= -github.com/ardanlabs/jinja v1.5.0 h1:OkNpmq9fXiCDRHMLCsd+VO/uk8L/tVwNJE+yA3JAhhM= -github.com/ardanlabs/jinja v1.5.0/go.mod h1:aXXzlJfjA+T3XNKA/YT5ZtDq2VJxt5a5siZ8cl9B35Q= -github.com/ardanlabs/kronk v1.30.8 h1:MOGh/21FVan1p/m1TNYzdxyw5TEoL3mQoVj28V6t3kE= -github.com/ardanlabs/kronk v1.30.8/go.mod h1:gbG7Ya33lZRWo36mwICzY1vGfTd3HCxomQMAAUKpZzU= -github.com/aws/aws-sdk-go-v2 v1.43.4 h1:b9FTvbRwy+JCsfp2Wp6wV/KbOx3Aj7nkoFb2cRX0IhE= -github.com/aws/aws-sdk-go-v2 v1.43.4/go.mod h1:70vwSy16txshwG+g55WkpgPKDIByzHI8ccBsOteo3bQ= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.16 h1:aiuaKlDweRC5qExJondpWjOgyzMHpofpwspGXUtwn4c= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.16/go.mod h1:nG/LOlmox9BDe9HvQnXWzgcK8uKbgBMZ/Hp5pVt/21I= -github.com/aws/aws-sdk-go-v2/config v1.32.35 h1:UEzXuET8E42lxBPijuACu/tEK7v5lFPlk0Q+GT5WD9E= -github.com/aws/aws-sdk-go-v2/config v1.32.35/go.mod h1:KaMtJpFa2JlL2BStjjHQVwQpzZEmw+ND/EgVrfFoo2g= -github.com/aws/aws-sdk-go-v2/credentials v1.19.34 h1:y6GkSmcv5myd1ngrYbGmiLlwQqB6TQhOuN/tbSSuWDY= -github.com/aws/aws-sdk-go-v2/credentials v1.19.34/go.mod h1:w3dTcnDVoQIewjo7JG45hduAToikiIFLC4FIO7fndvw= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.35 h1:+S7kbJoLDDQ5tE+lHrUBgMkzC8NLgsaioS2F3dVoFAE= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.35/go.mod h1:Ak7xXviIARfFdNUJ9Etb0bdVDt/KAvKjMGJVLWXDzik= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.35 h1:kzVuGlatQtYinwBJEEyLAbggepCoavosiaHHX9+fD+c= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.35/go.mod h1:0yLx0yEI+SfqeJMPvOtIEFoZbiQYXMGszBueiutQyaI= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.35 h1:WK6CjihTuLisCjSKKbildJ79sGZZgbBz3iNa7VsKIhU= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.35/go.mod h1:KYleN57luLoe97R7vTnx8PMcVrr9gAcRECtOjl91DNg= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.36 h1:jbGY4CXLzZElOXgGsexlC3Hi+3YM0rSmk4opFXKqg/k= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.36/go.mod h1:uBu/9aKsS/UQGc72RAt3y54kjgYQxmhut8ZD2dXCDNE= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.15 h1:JJLBQxwY+AFwuPAi5ivGc1ChnTdUt4cXMv7e76m2c/Y= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.15/go.mod h1:lQknBIe78MVL0cQOQDlag8KGflMbMEVFx9mB6O8ENvk= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.28 h1:Q1TF1J9jVD+vFo0LzNnmNdQ9EAt52TS+MQlq9Ir+Yxo= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.28/go.mod h1:4KqXXC/p1hrotmouDFbrRoWaLy962b9PMUReCG6+uWo= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.35 h1:BBEElKh4a+rKshvjrfpajTe9CbpZvrbb4Jkg2PB7RzA= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.35/go.mod h1:zaZk983w//8beSruBVec/mr4CmDwgZitW/qzGhAAX0g= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.36 h1:EUIwBoN+q7UmhAejxgD27APiRjh1vwCFo53gSqdT0BM= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.36/go.mod h1:6u00gmlTGR6W0b2k9NBrld7MnOEmf1Spqx0VVt6AqyE= -github.com/aws/aws-sdk-go-v2/service/s3 v1.107.0 h1:OkYV+1171za+ab9otU1tGxMXhx6uZvwVEtVddjLuYTg= -github.com/aws/aws-sdk-go-v2/service/s3 v1.107.0/go.mod h1:5FTZoQxhmLEiCAtYVk6V+t0iS/B5yGZVLZ3Wq5FDJZI= -github.com/aws/aws-sdk-go-v2/service/signin v1.5.4 h1:cOJELVNrq5Q3Udry2GLuHUM7MhwpeaQRdYaoa6GI/yI= -github.com/aws/aws-sdk-go-v2/service/signin v1.5.4/go.mod h1:f4LxzKBtaTxD7xh3PiVg3CE1tchQemfmghaJr+NbK2c= -github.com/aws/aws-sdk-go-v2/service/sso v1.33.4 h1:AMW7a7S8iQaHjBYZdU3PCq4GKRPijTPRAc7e6XtEThY= -github.com/aws/aws-sdk-go-v2/service/sso v1.33.4/go.mod h1:QQNsFV1DVXoXcZt18FS8lI8rtUrlDyAuWZLQ5shunv4= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.38.4 h1:AsbZcJAQPRmHDJG8K1N0pof/1zPWjVT8TFlTWuGLSvo= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.38.4/go.mod h1:6imqztH0//t0mKbl6yWl7swSEl7F/w32oAmqB3vP1ag= -github.com/aws/aws-sdk-go-v2/service/sts v1.45.4 h1:w/AryDYMjSUANSQ2uoZxJovUsMTwWJNTv3IMex30Y+4= -github.com/aws/aws-sdk-go-v2/service/sts v1.45.4/go.mod h1:WeBiAa67azG7Su9Vf+ChGDBLiAozJCXzdjXiPBUwtbc= +github.com/anthropics/anthropic-sdk-go v1.63.1 h1:M9dIoZzUWB453ulVpBkQp3FX0769udzrTscDrsJk1w4= +github.com/anthropics/anthropic-sdk-go v1.63.1/go.mod h1:3EfIfmFqxH6rbiLcIP4tPFyXL/IHakx2wDG4OU+TIEI= +github.com/ardanlabs/jinja v1.6.0 h1:CbqS/dxYM9qrmlBed1GsN64/tRY6SoWQWc5Sc+aw3iI= +github.com/ardanlabs/jinja v1.6.0/go.mod h1:aXXzlJfjA+T3XNKA/YT5ZtDq2VJxt5a5siZ8cl9B35Q= +github.com/ardanlabs/kronk v1.31.3 h1:PtTdA6fPyUTrCUAUZJI3loF8V1NXFfRjEvN0b+KmK+A= +github.com/ardanlabs/kronk v1.31.3/go.mod h1:3tHwmuxmdD/ZEdGTO7vcK4KSf3pBMGajRwyuQYR+LqU= +github.com/aws/aws-sdk-go-v2 v1.43.5 h1:yKT5GYnFWhuDo+DqKvE5ZPwVn3RjC4MAeBtZGlh6AVM= +github.com/aws/aws-sdk-go-v2 v1.43.5/go.mod h1:wZjAJppCntyOGgVSmgVTfDyRJK5PHOasO6Wsy8U7Axk= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.17 h1:mn+Vxb9zgz/FE/yDTcFim3DZ1qpcrxR+qBQkBrl6bzA= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.17/go.mod h1:eDfmEFxu+BSVsUGLbzJhWjpOurv1mqczClS97yI8wdk= +github.com/aws/aws-sdk-go-v2/config v1.32.36 h1:mX6ietU7UlB4w/2IUaexJdsyUDvhTd+jYPjVePiyi6s= +github.com/aws/aws-sdk-go-v2/config v1.32.36/go.mod h1:rMpV4xk7ZK59edraSaHP0jsWrztWTT5tbCwWY495hug= +github.com/aws/aws-sdk-go-v2/credentials v1.19.35 h1:Cxua2RVdRwL0sfjHM/SnQoOnQ7xKng9m5EQBO8BnZlg= +github.com/aws/aws-sdk-go-v2/credentials v1.19.35/go.mod h1:9XQ+RSIGPkycr+oCJYnB1uTv5kMVVR+rd2vYK0Hxj2w= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.36 h1:gucL1KH/PAYbpTpBg09CiVpBdTu4qkCl8C7xOTBixUg= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.36/go.mod h1:usTB+PHhNMhrx2dxUeHcM7OrT5pySvmjYI++IsefPN0= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.36 h1:5CrzwxDqf4w3x1Vs3/NiZ0nsC34Hbm3pIDMWbsLebOE= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.36/go.mod h1:A3gHdKZIvG/QXERzZwcxNS3RNDFcRCuhhTFBYp+V/nw= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.36 h1:A4N2f4YPcST0v+dWtX+xrpPPCL9VTBhoIFFUWYqbacE= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.36/go.mod h1:B/Qr859uxWUEfZeGotK5KAEoof4Q9YWgNtPSwV6jcyk= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.37 h1:oyd3ke4V9AhKcRR7rRgxk1VyI+DjK2CBQtbxh3OkdaA= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.37/go.mod h1:aA9D7SqfG9IC1b7FLD7Iyc8Q4JN0a8gHhNjN4zPlIaI= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.16 h1:iE4NGbvqUZnHDqddQAauZzCILYtFjOHwRM5MOOKLB5A= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.16/go.mod h1:VsjEgrP+ibcou8TlWA4tYaB+0OojuhirsmCe+U60hTA= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.29 h1:E65Hj648dOV6FuUfI0mYXXhQRHbsi7n+B9h6fZPJO/E= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.29/go.mod h1:xLrF9yNTCs92VZSpdEd68EJbgcdw3SMR74RO6QDzWHE= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.36 h1:fx2ujmozWn+C/GtfXfz5k6Ckzza40ElOpIW7d92fLWQ= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.36/go.mod h1:QT2ufGVJ+xTRxtXPHTQ1kHkAdWIKPCmD+BqYAXWv8/4= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.37 h1:KGHa9iZCrgtkOsFfXb0S4ywsjostA/hau7WE9aSb43E= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.37/go.mod h1:FV79f0DSnZIEGsQjWenENGtUycrasyAaJZO+zRanLHA= +github.com/aws/aws-sdk-go-v2/service/s3 v1.107.1 h1:VUTtUJMuRNMkb/7NIKmd8NQaeQLPGCMoTJxkYKre4qM= +github.com/aws/aws-sdk-go-v2/service/s3 v1.107.1/go.mod h1:WvUaO0lP5GNMs1R6cs6qvB3mqo16GLta8yfOuf55Rpc= +github.com/aws/aws-sdk-go-v2/service/signin v1.5.5 h1:0VTFBfOgPJrUSpGMgzoi8qLcXF5dbmiBuxpo14eBWUw= +github.com/aws/aws-sdk-go-v2/service/signin v1.5.5/go.mod h1:sNZYlBxoohYMBYl47BO/bFtAM6I8HSsPa1qwwPPRGoQ= +github.com/aws/aws-sdk-go-v2/service/sso v1.33.5 h1:jDQARFp1mJ2PEnllQf01nfFXGfWMJ59e0/HCHUTTZCk= +github.com/aws/aws-sdk-go-v2/service/sso v1.33.5/go.mod h1:OcT2AhgTuxGAwZk5hgxaNLGpS33W8s8dUQadGVDVY9I= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.38.5 h1:8xo1q9ttkYqMJ6vOXX67FPSpVEI7BWKVTKh77g82w+8= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.38.5/go.mod h1:hbBeEUrZg6VddXYZpbKPyF0tl4XEnM+Dbx92RW3vmZI= +github.com/aws/aws-sdk-go-v2/service/sts v1.45.5 h1:eQ5BtXDrPg2wK0AjtVPzeBhUpYPeqHE/ptiH7xJRGek= +github.com/aws/aws-sdk-go-v2/service/sts v1.45.5/go.mod h1:f9ImhnOISY7BuTZLM8qHepCYnglHBVLk5wVzatmP++w= github.com/aws/smithy-go v1.27.7 h1:Zgj5z4LfcDYoQIVk+n/yGdTkP/2y6ZT5vYxe0fp7bqE= github.com/aws/smithy-go v1.27.7/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc= github.com/aymanbagabas/go-udiff v0.2.0 h1:TK0fH4MteXUDspT88n8CKzvK0X9O2xu9yQjWpi6yML8= @@ -106,8 +106,6 @@ github.com/charmbracelet/x/term v0.2.2 h1:xVRT/S2ZcKdhhOuSP4t5cLi5o+JxklsoEObBSg github.com/charmbracelet/x/term v0.2.2/go.mod h1:kF8CY5RddLWrsgVwpw4kAa6TESp6EB5y3uxGLeCqzAI= github.com/cncf/xds/go v0.0.0-20260202195803-dba9d589def2 h1:aBangftG7EVZoUb69Os8IaYg++6uMOdKK83QtkkvJik= github.com/cncf/xds/go v0.0.0-20260202195803-dba9d589def2/go.mod h1:qwXFYgsP6T7XnJtbKlf1HP8AjxZZyzxMmc+Lq5GjlU4= -github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= -github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dnaeon/go-vcr v1.2.0 h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI= github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= github.com/ebitengine/purego v0.10.2 h1:W809HbnvzAxgdm+aOvlSekrM16wGCdT/e76+9tS7gzE= @@ -147,8 +145,8 @@ github.com/google/s2a-go v0.1.9 h1:LGD7gtMgezd8a/Xak7mEWL0PjoTQFvpRudN895yqKW0= github.com/google/s2a-go v0.1.9/go.mod h1:YA0Ei2ZQL3acow2O62kdp9UlnvMmU7kA6Eutn0dXayM= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.3.20 h1:t/xL64VUoN69MuMRQuJETqYGOw4Z9mSRJK9epIEtwFk= -github.com/googleapis/enterprise-certificate-proxy v0.3.20/go.mod h1:L3D/IQExI6LqEjBdXcZQ1WluSgigQmSwBboFstVPM4w= +github.com/googleapis/enterprise-certificate-proxy v0.3.21 h1:OFdQ3tnCX/zaQ0Cedur3D3z7kI6HiLX9g3TiAN4/DFU= +github.com/googleapis/enterprise-certificate-proxy v0.3.21/go.mod h1:L3D/IQExI6LqEjBdXcZQ1WluSgigQmSwBboFstVPM4w= github.com/googleapis/gax-go/v2 v2.23.0 h1:Tchl7qkvE7Ip3y+ztvNufYFvkfqTe7NfLTYGIdJRLuE= github.com/googleapis/gax-go/v2 v2.23.0/go.mod h1:rBQKOVJCdb8IFEzg+FCwlt1LP/xMDGuqUXhUG+XMXEg= github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= @@ -159,12 +157,12 @@ github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.74 h1:mymLUKThnV9wFvogOK8Nns github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.74/go.mod h1:Bh9qYL8ehmDxSg14Tk8oxFCP90XHfs6NxV1D84884xA= github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= -github.com/hashicorp/go-getter v1.8.6 h1:9sQboWULaydVphxc4S64oAI4YqpuCk7nPmvbk131ebY= -github.com/hashicorp/go-getter v1.8.6/go.mod h1:nVH12eOV2P58dIiL3rsU6Fh3wLeJEKBOJzhMmzlSWoo= +github.com/hashicorp/go-getter v1.8.8 h1:sRakhf+EH6s0LZLO2IgBwZ6hAFp+fZOZMNREwVELV80= +github.com/hashicorp/go-getter v1.8.8/go.mod h1:fqFlibKpwfns/s4oljLB3upJspyfFLQhS7031PlfUDc= github.com/hashicorp/go-version v1.9.0 h1:CeOIz6k+LoN3qX9Z0tyQrPtiB1DFYRPfCIBtaXPSCnA= github.com/hashicorp/go-version v1.9.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hybridgroup/yzma v1.22.0 h1:QsWFWpdz42B/DCAhckGf/Q94FKjmf/lc2JmVNBCEJAY= -github.com/hybridgroup/yzma v1.22.0/go.mod h1:wAMtNTjSnE79jTWzaeFSsuraam0TXKCPajMHA5s+OX8= +github.com/hybridgroup/yzma v1.23.0 h1:AqwwhnPOS0I4TzRTCuWxXqGK/kY2P+QZ3+qiJOM3Jl0= +github.com/hybridgroup/yzma v1.23.0/go.mod h1:wAMtNTjSnE79jTWzaeFSsuraam0TXKCPajMHA5s+OX8= github.com/invopop/jsonschema v0.14.0 h1:MHQqLhvpNUZfw+hM3AZDYK7jxO8FZoQeQM77g8iyZjg= github.com/invopop/jsonschema v0.14.0/go.mod h1:ygm6C2EaVNMBDPpaPlnOA2pFAxBnxGjFlMZABxm9n2I= github.com/jupiterrider/ffi v0.7.0 h1:RKsl6Ascal+3kyAqR5Qcbp83LceQMLc1VZbPfHWoNzs= @@ -191,8 +189,6 @@ github.com/pb33f/ordered-map/v2 v2.3.1 h1:5319HDO0aw4DA4gzi+zv4FXU9UlSs3xGZ40wcP github.com/pb33f/ordered-map/v2 v2.3.1/go.mod h1:qxFQgd0PkVUtOMCkTapqotNgzRhMPL7VvaHKbd1HnmQ= github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= -github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= -github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_golang v1.24.1 h1:JnJkREXzWxUdCuPFpIWZiPispT9xVV59uiuyR2bPlnU= github.com/prometheus/client_golang v1.24.1/go.mod h1:F+oSRECHg4sse5ucfYpYDeIv/hu68Zo0uoHKetWnzcE= github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= @@ -208,8 +204,8 @@ github.com/spiffe/go-spiffe/v2 v2.8.1 h1:eXZMLsu+3MLEPJyGJkolqtVrteZfQdUpOWj6LTi github.com/spiffe/go-spiffe/v2 v2.8.1/go.mod h1:47Q0Q9/AqGha8QLHp+kxpH4Wca7X7EnOtlIJy3mxZ3U= github.com/standard-webhooks/standard-webhooks/libraries v0.0.1 h1:uOfcYT+3QungH6tIGSVCR/Y3KJmgJiHcojJbMTPDZAI= github.com/standard-webhooks/standard-webhooks/libraries v0.0.1/go.mod h1:L1MQhA6x4dn9r007T033lsaZMv9EmBAdXyU/+EF40fo= -github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= -github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/stretchr/testify v1.12.0 h1:K6Mr6jO9JICuend/5xzTM03ydSV3vdNRYAdPSukj8uI= +github.com/stretchr/testify v1.12.0/go.mod h1:bOYBZb5qJ00vPzWfIqBUZPaxK8jWiXc6d3ErP4Ca9Gw= github.com/tidwall/gjson v1.14.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/gjson v1.19.0 h1:xwxm7n691Uf3u5OFjzngavjGTh55KX5q/9w9xHW88JU= github.com/tidwall/gjson v1.19.0/go.mod h1:V37/opeE/JbLUOfH0QTXiNez2l0RUjYUhpT4szFQAfc= @@ -258,40 +254,40 @@ go.yaml.in/yaml/v2 v2.4.4 h1:tuyd0P+2Ont/d6e2rl3be67goVK4R6deVxCUX5vyPaQ= go.yaml.in/yaml/v2 v2.4.4/go.mod h1:gMZqIpDtDqOfM0uNfy0SkpRhvUryYH0Z6wdMYcacYXQ= go.yaml.in/yaml/v4 v4.0.0-rc.3 h1:3h1fjsh1CTAPjW7q/EMe+C8shx5d8ctzZTrLcs/j8Go= go.yaml.in/yaml/v4 v4.0.0-rc.3/go.mod h1:aZqd9kCMsGL7AuUv/m/PvWLdg5sjJsZ4oHDEnfPPfY0= -golang.org/x/crypto v0.54.0 h1:YLIA59K4fiNzHzjnZt2tUJQjQtUWfWbeHBqKtk3eScw= -golang.org/x/crypto v0.54.0/go.mod h1:KWL8ny2AZdGR2cWmzeHrp2azQPGogOv+HeQaVEXC2dk= +golang.org/x/crypto v0.55.0 h1:+KWHjbgOaAQ66dh/YlkZKHlz9ZUlq61AFirAR9ntP8M= +golang.org/x/crypto v0.55.0/go.mod h1:uq0V9dE/fzQuJtbnL+2EhWOE63vo164FY8xqEnV9xis= golang.org/x/exp v0.0.0-20260312153236-7ab1446f8b90 h1:jiDhWWeC7jfWqR9c/uplMOqJ0sbNlNWv0UkzE0vX1MA= golang.org/x/exp v0.0.0-20260312153236-7ab1446f8b90/go.mod h1:xE1HEv6b+1SCZ5/uscMRjUBKtIxworgEcEi+/n9NQDQ= -golang.org/x/image v0.44.0 h1:+tDekMZED9+LrtB3G5xzRggpVh9CARjZqROla3R3R+I= -golang.org/x/image v0.44.0/go.mod h1:V8K3KE9KKKE+pLpQDOeN18w9oacNSvy1tDOirTu4xtY= -golang.org/x/net v0.57.0 h1:K5+3DljvIuDG9/Jv9rvyMywYNFCQ9RSUY6OOTTkT+tE= -golang.org/x/net v0.57.0/go.mod h1:KpXc8iv+r3XplLAG/f7Jsf9RPszJzdR0f58q9vGOuEU= +golang.org/x/image v0.45.0 h1:FMb1nTbH5H9vF55SriQHgFw5GnNL9Jg6L25BwXKzhB0= +golang.org/x/image v0.45.0/go.mod h1:n62x/7RqlwXDvGsSU4u6IUTUf6KghUZ9Bt7cG/T9Fx4= +golang.org/x/net v0.58.0 h1:ynWG7rqYi4ccpTEuPZ2QGWHktVEM9DMCj9yzDE0Q7To= +golang.org/x/net v0.58.0/go.mod h1:YwCddHnFlT7eLQqVprV19OnhLGtc5xOKgE0RyqgfWAU= golang.org/x/oauth2 v0.36.0 h1:peZ/1z27fi9hUOFCAZaHyrpWG5lwe0RJEEEeH0ThlIs= golang.org/x/oauth2 v0.36.0/go.mod h1:YDBUJMTkDnJS+A4BP4eZBjCqtokkg1hODuPjwiGPO7Q= golang.org/x/sync v0.22.0 h1:SZjpbeLmrCk4xhRSZFNZW5gFUeCeFgjekvI/+gfScek= golang.org/x/sync v0.22.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= golang.org/x/sys v0.47.0 h1:o7XGOvZQCADBQQ4Y7VNq2dRWQR7JmOUW8Kxx4ZsNgWs= golang.org/x/sys v0.47.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= -golang.org/x/text v0.40.0 h1:Ub2Z6/xjgF1WrYQz2nuITOEegKFtiIy+rieRJ5lHZKs= -golang.org/x/text v0.40.0/go.mod h1:hpnzDAfGV753zIKo+wk3u1bVKCGPbrnF7+7LBF/UHVY= +golang.org/x/text v0.41.0 h1:vz/seA0lnX87Othu2f/0L24RcgrXD9/YFTSuGjj3rH8= +golang.org/x/text v0.41.0/go.mod h1:jvf1O8ajNzZqhSrQBPbutR/EB83Cc0CFrezNQIwbb5M= golang.org/x/time v0.15.0 h1:bbrp8t3bGUeFOx08pvsMYRTCVSMk89u4tKbNOZbp88U= golang.org/x/time v0.15.0/go.mod h1:Y4YMaQmXwGQZoFaVFk4YpCt4FLQMYKZe9oeV/f4MSno= gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4= gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E= -google.golang.org/api v0.292.0 h1:Ewiwo/GTtiaPZSNAZQUcWLh8AYDEoPmIXyJfeoTSMHU= -google.golang.org/api v0.292.0/go.mod h1:07kjmMnFGm2RQuCza2EZM/5N68G/fVvFb1xKjWqoFA0= -google.golang.org/genai v1.67.0 h1:m3V2AK2zbyViUq9rhTkMgkxu32Fueypy5Pzd9yV8GwU= -google.golang.org/genai v1.67.0/go.mod h1:mDdPDFXo1Ats7f1WXVyZgWb/CkMzFWTWJruIMy7hGIU= -google.golang.org/genproto v0.0.0-20260807164820-c8921c73eeea h1:EoNao6AiKb+bftjR8vFOxqtY1A4zLnvnfea+FBQicBo= -google.golang.org/genproto v0.0.0-20260807164820-c8921c73eeea/go.mod h1:MVqdGj2rFowpxM1nWJoGZmKI3TGThZsWENFz9uc4l1g= -google.golang.org/genproto/googleapis/api v0.0.0-20260807164820-c8921c73eeea h1:Jifw/kjs/r3B0uszvls/m3c3tmZs2YHGM9C+rvxP9gY= -google.golang.org/genproto/googleapis/api v0.0.0-20260807164820-c8921c73eeea/go.mod h1:K/+WGbmBY7aNW1HDw1fJnKYo10i0DkAX6pows00dLig= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260807164820-c8921c73eeea h1:kVhQEPTpKQahD5+JSBTfBB19wcgQTTjAIn45MBqnyHk= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260807164820-c8921c73eeea/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= +google.golang.org/api v0.293.0 h1:p9XIWOf63U4OgYx120ZwVU8+vl4XTPmWfgVPnmOAS9w= +google.golang.org/api v0.293.0/go.mod h1:6n5tjEB1gzwniZTepZ0g5u+wM7Bof5GeULCx/zh8ZE0= +google.golang.org/genai v1.68.0 h1:gmALuBU6mRy46wupEt20wBR1dYAMY13t/jkTxpdzhzE= +google.golang.org/genai v1.68.0/go.mod h1:mDdPDFXo1Ats7f1WXVyZgWb/CkMzFWTWJruIMy7hGIU= +google.golang.org/genproto v0.0.0-20260810153831-ec0a7760b754 h1:Kj7g/XOpdB2mzcVV92AFeNKvYR5WRNpxfX5Mj3wQ2SM= +google.golang.org/genproto v0.0.0-20260810153831-ec0a7760b754/go.mod h1:UpDDw2l68z31m5UZN/Qi0Kow16ohhlJVlmqC3qRM5Q8= +google.golang.org/genproto/googleapis/api v0.0.0-20260810153831-ec0a7760b754 h1:dWeMvEJ3JhYgqSCAHUZZJgMUyfniiiCvDc72x5EqJP0= +google.golang.org/genproto/googleapis/api v0.0.0-20260810153831-ec0a7760b754/go.mod h1:q/3oV3jAi5vwelxsVAprMBC8BcM2zmNe+IjRGd+9/ks= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260810153831-ec0a7760b754 h1:k5CJw9e5ONCcA/u0webKt092npXuY+KeGh3Q8NAVf0g= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260810153831-ec0a7760b754/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= google.golang.org/grpc v1.83.0 h1:JeNZEKJFbQxArAMl+hiytHauacDNqJUllNfmIMmpqnQ= google.golang.org/grpc v1.83.0/go.mod h1:kDyl6SKsiHKt0uylY5gtn5cEjkrIOhQOGDgIc4JGwzQ= -google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= -google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= +google.golang.org/protobuf v1.36.12 h1:pJOKDDOyeXErUroCihFAd5LQuwXBSpVnKGrj5o/fwxc= +google.golang.org/protobuf v1.36.12/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= diff --git a/go.mod b/go.mod index 9ae824099..3c56c3aa8 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,7 @@ require ( charm.land/x/vcr v0.1.1 cloud.google.com/go/auth v0.23.1 github.com/anthropics/anthropic-sdk-go v1.63.1 - github.com/ardanlabs/kronk v1.30.8 + github.com/ardanlabs/kronk v1.31.3 github.com/aws/aws-sdk-go-v2 v1.43.5 github.com/aws/aws-sdk-go-v2/config v1.32.36 github.com/aws/smithy-go v1.27.7 @@ -37,18 +37,18 @@ require ( github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.35.0 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.59.0 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.59.0 // indirect - github.com/ardanlabs/jinja v1.5.0 // indirect - github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.16 // indirect + github.com/ardanlabs/jinja v1.6.0 // indirect + github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.17 // indirect github.com/aws/aws-sdk-go-v2/credentials v1.19.35 // indirect github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.36 // indirect github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.36 // indirect github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.36 // indirect github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.37 // indirect github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.16 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.28 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.29 // indirect github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.36 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.36 // indirect - github.com/aws/aws-sdk-go-v2/service/s3 v1.107.0 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.37 // indirect + github.com/aws/aws-sdk-go-v2/service/s3 v1.107.1 // indirect github.com/aws/aws-sdk-go-v2/service/signin v1.5.5 // indirect github.com/aws/aws-sdk-go-v2/service/sso v1.33.5 // indirect github.com/aws/aws-sdk-go-v2/service/ssooidc v1.38.5 // indirect @@ -71,15 +71,15 @@ require ( github.com/goccy/go-yaml v1.19.2 // indirect github.com/google/go-cmp v0.7.0 // indirect github.com/google/s2a-go v0.1.9 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.3.20 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.3.21 // indirect github.com/googleapis/gax-go/v2 v2.23.0 // indirect github.com/gorilla/websocket v1.5.3 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.30.0 // indirect github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.74 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect - github.com/hashicorp/go-getter v1.8.6 // indirect + github.com/hashicorp/go-getter v1.8.8 // indirect github.com/hashicorp/go-version v1.9.0 // indirect - github.com/hybridgroup/yzma v1.22.0 // indirect + github.com/hybridgroup/yzma v1.23.0 // indirect github.com/invopop/jsonschema v0.14.0 // indirect github.com/jupiterrider/ffi v0.7.0 // indirect github.com/kaptinlin/jsonpointer v0.4.28 // indirect @@ -119,12 +119,12 @@ require ( golang.org/x/sys v0.47.0 // indirect golang.org/x/text v0.41.0 // indirect golang.org/x/time v0.15.0 // indirect - google.golang.org/api v0.292.0 // indirect - google.golang.org/genproto v0.0.0-20260807164820-c8921c73eeea // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20260807164820-c8921c73eeea // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20260807164820-c8921c73eeea // indirect + google.golang.org/api v0.293.0 // indirect + google.golang.org/genproto v0.0.0-20260810153831-ec0a7760b754 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20260810153831-ec0a7760b754 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20260810153831-ec0a7760b754 // indirect google.golang.org/grpc v1.83.0 // indirect - google.golang.org/protobuf v1.36.11 // indirect + google.golang.org/protobuf v1.36.12 // indirect gopkg.in/dnaeon/go-vcr.v4 v4.0.6-0.20251110073552-01de4eb40290 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index 5c966d959..39996c989 100644 --- a/go.sum +++ b/go.sum @@ -12,8 +12,8 @@ cloud.google.com/go/compute/metadata v0.9.0 h1:pDUj4QMoPejqq20dK0Pg2N4yG9zIkYGdB cloud.google.com/go/compute/metadata v0.9.0/go.mod h1:E0bWwX5wTnLPedCKqk3pJmVgCBSM6qQI1yTBdEb3C10= cloud.google.com/go/iam v1.13.0 h1:ufT3FPT5rFFXu6UtLkNoxaOaV5EuA1dsSkmemCSTo6U= cloud.google.com/go/iam v1.13.0/go.mod h1:gHXdDEiPDvqd1q1KwBDGQlgZY/BwY760zU2LhOZS5w0= -cloud.google.com/go/logging v1.19.0 h1:NCqhdVUg3wQ8Cobdf16FDSuTGi3+6+hdSBHrY5TsR6Q= -cloud.google.com/go/logging v1.19.0/go.mod h1:i40NZCHC9Gqvod4yE+yQfDWwlgwW/SrshkkGibCHxcA= +cloud.google.com/go/logging v1.19.1 h1:7SsLhyTDBDrJw+Ll6Ns3I2mByqHXvJUc3rGjSlwiWgU= +cloud.google.com/go/logging v1.19.1/go.mod h1:2IkQ/d8jVJqV2qW8ZUGUiMjdZG1gkLD2JReGbZ8isqg= cloud.google.com/go/longrunning v1.2.0 h1:WjYH3YHBGCxGJP9M4dWGHBfXr/cFIjMkNgWcJj7/iMM= cloud.google.com/go/longrunning v1.2.0/go.mod h1:5KMQALFGOCtFoi2xSOA1u3H7WKlhmckgiyFw7+LGQp0= cloud.google.com/go/monitoring v1.30.0 h1:r/d+JUbyKmJ8b07iznuKfzVzrIXTWxHQ3lBRm3x2LlY= @@ -40,14 +40,14 @@ github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapp github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.59.0/go.mod h1:YqwkQPrWSC7+byyc1VlKbWLBF5JsW5IoL6xUkemYSXk= github.com/anthropics/anthropic-sdk-go v1.63.1 h1:M9dIoZzUWB453ulVpBkQp3FX0769udzrTscDrsJk1w4= github.com/anthropics/anthropic-sdk-go v1.63.1/go.mod h1:3EfIfmFqxH6rbiLcIP4tPFyXL/IHakx2wDG4OU+TIEI= -github.com/ardanlabs/jinja v1.5.0 h1:OkNpmq9fXiCDRHMLCsd+VO/uk8L/tVwNJE+yA3JAhhM= -github.com/ardanlabs/jinja v1.5.0/go.mod h1:aXXzlJfjA+T3XNKA/YT5ZtDq2VJxt5a5siZ8cl9B35Q= -github.com/ardanlabs/kronk v1.30.8 h1:MOGh/21FVan1p/m1TNYzdxyw5TEoL3mQoVj28V6t3kE= -github.com/ardanlabs/kronk v1.30.8/go.mod h1:gbG7Ya33lZRWo36mwICzY1vGfTd3HCxomQMAAUKpZzU= +github.com/ardanlabs/jinja v1.6.0 h1:CbqS/dxYM9qrmlBed1GsN64/tRY6SoWQWc5Sc+aw3iI= +github.com/ardanlabs/jinja v1.6.0/go.mod h1:aXXzlJfjA+T3XNKA/YT5ZtDq2VJxt5a5siZ8cl9B35Q= +github.com/ardanlabs/kronk v1.31.3 h1:PtTdA6fPyUTrCUAUZJI3loF8V1NXFfRjEvN0b+KmK+A= +github.com/ardanlabs/kronk v1.31.3/go.mod h1:3tHwmuxmdD/ZEdGTO7vcK4KSf3pBMGajRwyuQYR+LqU= github.com/aws/aws-sdk-go-v2 v1.43.5 h1:yKT5GYnFWhuDo+DqKvE5ZPwVn3RjC4MAeBtZGlh6AVM= github.com/aws/aws-sdk-go-v2 v1.43.5/go.mod h1:wZjAJppCntyOGgVSmgVTfDyRJK5PHOasO6Wsy8U7Axk= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.16 h1:aiuaKlDweRC5qExJondpWjOgyzMHpofpwspGXUtwn4c= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.16/go.mod h1:nG/LOlmox9BDe9HvQnXWzgcK8uKbgBMZ/Hp5pVt/21I= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.17 h1:mn+Vxb9zgz/FE/yDTcFim3DZ1qpcrxR+qBQkBrl6bzA= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.17/go.mod h1:eDfmEFxu+BSVsUGLbzJhWjpOurv1mqczClS97yI8wdk= github.com/aws/aws-sdk-go-v2/config v1.32.36 h1:mX6ietU7UlB4w/2IUaexJdsyUDvhTd+jYPjVePiyi6s= github.com/aws/aws-sdk-go-v2/config v1.32.36/go.mod h1:rMpV4xk7ZK59edraSaHP0jsWrztWTT5tbCwWY495hug= github.com/aws/aws-sdk-go-v2/credentials v1.19.35 h1:Cxua2RVdRwL0sfjHM/SnQoOnQ7xKng9m5EQBO8BnZlg= @@ -62,14 +62,14 @@ github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.37 h1:oyd3ke4V9AhKcRR7rRgxk1VyI+D github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.37/go.mod h1:aA9D7SqfG9IC1b7FLD7Iyc8Q4JN0a8gHhNjN4zPlIaI= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.16 h1:iE4NGbvqUZnHDqddQAauZzCILYtFjOHwRM5MOOKLB5A= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.16/go.mod h1:VsjEgrP+ibcou8TlWA4tYaB+0OojuhirsmCe+U60hTA= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.28 h1:Q1TF1J9jVD+vFo0LzNnmNdQ9EAt52TS+MQlq9Ir+Yxo= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.28/go.mod h1:4KqXXC/p1hrotmouDFbrRoWaLy962b9PMUReCG6+uWo= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.29 h1:E65Hj648dOV6FuUfI0mYXXhQRHbsi7n+B9h6fZPJO/E= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.29/go.mod h1:xLrF9yNTCs92VZSpdEd68EJbgcdw3SMR74RO6QDzWHE= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.36 h1:fx2ujmozWn+C/GtfXfz5k6Ckzza40ElOpIW7d92fLWQ= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.36/go.mod h1:QT2ufGVJ+xTRxtXPHTQ1kHkAdWIKPCmD+BqYAXWv8/4= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.36 h1:EUIwBoN+q7UmhAejxgD27APiRjh1vwCFo53gSqdT0BM= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.36/go.mod h1:6u00gmlTGR6W0b2k9NBrld7MnOEmf1Spqx0VVt6AqyE= -github.com/aws/aws-sdk-go-v2/service/s3 v1.107.0 h1:OkYV+1171za+ab9otU1tGxMXhx6uZvwVEtVddjLuYTg= -github.com/aws/aws-sdk-go-v2/service/s3 v1.107.0/go.mod h1:5FTZoQxhmLEiCAtYVk6V+t0iS/B5yGZVLZ3Wq5FDJZI= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.37 h1:KGHa9iZCrgtkOsFfXb0S4ywsjostA/hau7WE9aSb43E= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.37/go.mod h1:FV79f0DSnZIEGsQjWenENGtUycrasyAaJZO+zRanLHA= +github.com/aws/aws-sdk-go-v2/service/s3 v1.107.1 h1:VUTtUJMuRNMkb/7NIKmd8NQaeQLPGCMoTJxkYKre4qM= +github.com/aws/aws-sdk-go-v2/service/s3 v1.107.1/go.mod h1:WvUaO0lP5GNMs1R6cs6qvB3mqo16GLta8yfOuf55Rpc= github.com/aws/aws-sdk-go-v2/service/signin v1.5.5 h1:0VTFBfOgPJrUSpGMgzoi8qLcXF5dbmiBuxpo14eBWUw= github.com/aws/aws-sdk-go-v2/service/signin v1.5.5/go.mod h1:sNZYlBxoohYMBYl47BO/bFtAM6I8HSsPa1qwwPPRGoQ= github.com/aws/aws-sdk-go-v2/service/sso v1.33.5 h1:jDQARFp1mJ2PEnllQf01nfFXGfWMJ59e0/HCHUTTZCk= @@ -139,8 +139,8 @@ github.com/google/s2a-go v0.1.9 h1:LGD7gtMgezd8a/Xak7mEWL0PjoTQFvpRudN895yqKW0= github.com/google/s2a-go v0.1.9/go.mod h1:YA0Ei2ZQL3acow2O62kdp9UlnvMmU7kA6Eutn0dXayM= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.3.20 h1:t/xL64VUoN69MuMRQuJETqYGOw4Z9mSRJK9epIEtwFk= -github.com/googleapis/enterprise-certificate-proxy v0.3.20/go.mod h1:L3D/IQExI6LqEjBdXcZQ1WluSgigQmSwBboFstVPM4w= +github.com/googleapis/enterprise-certificate-proxy v0.3.21 h1:OFdQ3tnCX/zaQ0Cedur3D3z7kI6HiLX9g3TiAN4/DFU= +github.com/googleapis/enterprise-certificate-proxy v0.3.21/go.mod h1:L3D/IQExI6LqEjBdXcZQ1WluSgigQmSwBboFstVPM4w= github.com/googleapis/gax-go/v2 v2.23.0 h1:Tchl7qkvE7Ip3y+ztvNufYFvkfqTe7NfLTYGIdJRLuE= github.com/googleapis/gax-go/v2 v2.23.0/go.mod h1:rBQKOVJCdb8IFEzg+FCwlt1LP/xMDGuqUXhUG+XMXEg= github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= @@ -151,12 +151,12 @@ github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.74 h1:mymLUKThnV9wFvogOK8Nns github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.74/go.mod h1:Bh9qYL8ehmDxSg14Tk8oxFCP90XHfs6NxV1D84884xA= github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= -github.com/hashicorp/go-getter v1.8.6 h1:9sQboWULaydVphxc4S64oAI4YqpuCk7nPmvbk131ebY= -github.com/hashicorp/go-getter v1.8.6/go.mod h1:nVH12eOV2P58dIiL3rsU6Fh3wLeJEKBOJzhMmzlSWoo= +github.com/hashicorp/go-getter v1.8.8 h1:sRakhf+EH6s0LZLO2IgBwZ6hAFp+fZOZMNREwVELV80= +github.com/hashicorp/go-getter v1.8.8/go.mod h1:fqFlibKpwfns/s4oljLB3upJspyfFLQhS7031PlfUDc= github.com/hashicorp/go-version v1.9.0 h1:CeOIz6k+LoN3qX9Z0tyQrPtiB1DFYRPfCIBtaXPSCnA= github.com/hashicorp/go-version v1.9.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hybridgroup/yzma v1.22.0 h1:QsWFWpdz42B/DCAhckGf/Q94FKjmf/lc2JmVNBCEJAY= -github.com/hybridgroup/yzma v1.22.0/go.mod h1:wAMtNTjSnE79jTWzaeFSsuraam0TXKCPajMHA5s+OX8= +github.com/hybridgroup/yzma v1.23.0 h1:AqwwhnPOS0I4TzRTCuWxXqGK/kY2P+QZ3+qiJOM3Jl0= +github.com/hybridgroup/yzma v1.23.0/go.mod h1:wAMtNTjSnE79jTWzaeFSsuraam0TXKCPajMHA5s+OX8= github.com/invopop/jsonschema v0.14.0 h1:MHQqLhvpNUZfw+hM3AZDYK7jxO8FZoQeQM77g8iyZjg= github.com/invopop/jsonschema v0.14.0/go.mod h1:ygm6C2EaVNMBDPpaPlnOA2pFAxBnxGjFlMZABxm9n2I= github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= @@ -267,20 +267,20 @@ golang.org/x/time v0.15.0 h1:bbrp8t3bGUeFOx08pvsMYRTCVSMk89u4tKbNOZbp88U= golang.org/x/time v0.15.0/go.mod h1:Y4YMaQmXwGQZoFaVFk4YpCt4FLQMYKZe9oeV/f4MSno= gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4= gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E= -google.golang.org/api v0.292.0 h1:Ewiwo/GTtiaPZSNAZQUcWLh8AYDEoPmIXyJfeoTSMHU= -google.golang.org/api v0.292.0/go.mod h1:07kjmMnFGm2RQuCza2EZM/5N68G/fVvFb1xKjWqoFA0= +google.golang.org/api v0.293.0 h1:p9XIWOf63U4OgYx120ZwVU8+vl4XTPmWfgVPnmOAS9w= +google.golang.org/api v0.293.0/go.mod h1:6n5tjEB1gzwniZTepZ0g5u+wM7Bof5GeULCx/zh8ZE0= google.golang.org/genai v1.68.0 h1:gmALuBU6mRy46wupEt20wBR1dYAMY13t/jkTxpdzhzE= google.golang.org/genai v1.68.0/go.mod h1:mDdPDFXo1Ats7f1WXVyZgWb/CkMzFWTWJruIMy7hGIU= -google.golang.org/genproto v0.0.0-20260807164820-c8921c73eeea h1:EoNao6AiKb+bftjR8vFOxqtY1A4zLnvnfea+FBQicBo= -google.golang.org/genproto v0.0.0-20260807164820-c8921c73eeea/go.mod h1:MVqdGj2rFowpxM1nWJoGZmKI3TGThZsWENFz9uc4l1g= -google.golang.org/genproto/googleapis/api v0.0.0-20260807164820-c8921c73eeea h1:Jifw/kjs/r3B0uszvls/m3c3tmZs2YHGM9C+rvxP9gY= -google.golang.org/genproto/googleapis/api v0.0.0-20260807164820-c8921c73eeea/go.mod h1:K/+WGbmBY7aNW1HDw1fJnKYo10i0DkAX6pows00dLig= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260807164820-c8921c73eeea h1:kVhQEPTpKQahD5+JSBTfBB19wcgQTTjAIn45MBqnyHk= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260807164820-c8921c73eeea/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= +google.golang.org/genproto v0.0.0-20260810153831-ec0a7760b754 h1:Kj7g/XOpdB2mzcVV92AFeNKvYR5WRNpxfX5Mj3wQ2SM= +google.golang.org/genproto v0.0.0-20260810153831-ec0a7760b754/go.mod h1:UpDDw2l68z31m5UZN/Qi0Kow16ohhlJVlmqC3qRM5Q8= +google.golang.org/genproto/googleapis/api v0.0.0-20260810153831-ec0a7760b754 h1:dWeMvEJ3JhYgqSCAHUZZJgMUyfniiiCvDc72x5EqJP0= +google.golang.org/genproto/googleapis/api v0.0.0-20260810153831-ec0a7760b754/go.mod h1:q/3oV3jAi5vwelxsVAprMBC8BcM2zmNe+IjRGd+9/ks= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260810153831-ec0a7760b754 h1:k5CJw9e5ONCcA/u0webKt092npXuY+KeGh3Q8NAVf0g= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260810153831-ec0a7760b754/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= google.golang.org/grpc v1.83.0 h1:JeNZEKJFbQxArAMl+hiytHauacDNqJUllNfmIMmpqnQ= google.golang.org/grpc v1.83.0/go.mod h1:kDyl6SKsiHKt0uylY5gtn5cEjkrIOhQOGDgIc4JGwzQ= -google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= -google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= +google.golang.org/protobuf v1.36.12 h1:pJOKDDOyeXErUroCihFAd5LQuwXBSpVnKGrj5o/fwxc= +google.golang.org/protobuf v1.36.12/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/providers/kronk/options.go b/providers/kronk/options.go index 039e74c10..f8826ca04 100644 --- a/providers/kronk/options.go +++ b/providers/kronk/options.go @@ -148,11 +148,6 @@ func WithModelFiles(v []string) Option { return withModelOption(model.WithModelFiles(v)) } -// WithNBatch configures the logical batch size. -func WithNBatch(v int) Option { - return withModelOption(model.WithNBatch(v)) -} - // WithNGpuLayers configures the number of model layers offloaded to the GPU. func WithNGpuLayers(v int) Option { return withModelOption(model.WithNGpuLayers(v)) @@ -173,11 +168,6 @@ func WithNThreadsBatch(v int) Option { return withModelOption(model.WithNThreadsBatch(v)) } -// WithNUBatch configures the physical batch size. -func WithNUBatch(v int) Option { - return withModelOption(model.WithNUBatch(v)) -} - // WithNUMA configures the NUMA strategy. func WithNUMA(v string) Option { return withModelOption(model.WithNUMA(v)) @@ -198,6 +188,11 @@ func WithOpOffloadMinBatch(v int) Option { return withModelOption(model.WithOpOffloadMinBatch(v)) } +// WithPrefillBatchSize configures the maximum number of prompt tokens processed per decode iteration. +func WithPrefillBatchSize(v int) Option { + return withModelOption(model.WithPrefillBatchSize(v)) +} + // WithProjFile configures the multimodal projection file. func WithProjFile(v string) Option { return withModelOption(model.WithProjFile(v)) From 17db04feacd0a78e1a51eaa9850113509ca5d8c9 Mon Sep 17 00:00:00 2001 From: Drew Smirnoff Date: Wed, 19 Aug 2026 18:10:01 +0400 Subject: [PATCH 079/156] fix: stop adding empty reasoning fields (#333) Signed-off-by: drew --- .../openaicompat/language_model_hooks.go | 20 +++--- providers/openaicompat/openaicompat_test.go | 63 ++++++++++++++++--- providers/openaicompat/provider_options.go | 14 +++++ 3 files changed, 79 insertions(+), 18 deletions(-) diff --git a/providers/openaicompat/language_model_hooks.go b/providers/openaicompat/language_model_hooks.go index b7d7ff5d1..9248b998d 100644 --- a/providers/openaicompat/language_model_hooks.go +++ b/providers/openaicompat/language_model_hooks.go @@ -80,9 +80,9 @@ func ExtraContentFunc(choice openaisdk.ChatCompletionChoice) []fantasy.Content { if err != nil { return content } - if rc := reasoningData.GetReasoningContent(); rc != "" { + if hasReasoningField(choice.Message.RawJSON()) { content = append(content, fantasy.ReasoningContent{ - Text: rc, + Text: reasoningData.GetReasoningContent(), }) } return content @@ -136,7 +136,7 @@ func StreamExtraFunc(chunk openaisdk.ChatCompletionChunk, yield func(fantasy.Str Delta: reasoningContent, }) } - if rc := reasoningData.GetReasoningContent(); rc != "" { + if rc := reasoningData.GetReasoningContent(); rc != "" || hasReasoningField(choice.Delta.RawJSON()) { if !reasoningStarted { ctx[reasoningStartedCtx] = true } @@ -159,7 +159,6 @@ func StreamExtraFunc(chunk openaisdk.ChatCompletionChunk, yield func(fantasy.Str func ToPromptFunc(prompt fantasy.Prompt, _, _ string) ([]openaisdk.ChatCompletionMessageParamUnion, []fantasy.CallWarning) { var messages []openaisdk.ChatCompletionMessageParamUnion var warnings []fantasy.CallWarning - hasReasoning := false for _, msg := range prompt { switch msg.Role { @@ -373,6 +372,7 @@ func ToPromptFunc(prompt fantasy.Prompt, _, _ string) ([]openaisdk.ChatCompletio Role: "assistant", } var reasoningText string + reasoningPresent := false for _, c := range msg.Content { switch c.GetType() { case fantasy.ContentTypeText: @@ -406,7 +406,7 @@ func ToPromptFunc(prompt fantasy.Prompt, _, _ string) ([]openaisdk.ChatCompletio continue } reasoningText = reasoningPart.Text - hasReasoning = true + reasoningPresent = true case fantasy.ContentTypeToolCall: toolCallPart, ok := fantasy.AsContentType[fantasy.ToolCallPart](c) if !ok { @@ -429,10 +429,12 @@ func ToPromptFunc(prompt fantasy.Prompt, _, _ string) ([]openaisdk.ChatCompletio }) } } - // Add reasoning_content field if present, or if thinking is enabled - // and the message has tool calls (some providers like Kimi require - // reasoning_content on all assistant messages when thinking is enabled). - if reasoningText != "" || (hasReasoning && len(assistantMsg.ToolCalls) > 0) { + // Add reasoning_content field if the message carries a reasoning + // part, even when its text is empty: presence must mirror what the + // model emitted so resubmitted history stays byte-stable for prefix + // caching. Providers like Kimi require the field on assistant + // tool-call messages when thinking is enabled. + if reasoningPresent { assistantMsg.SetExtraFields(map[string]any{ "reasoning_content": reasoningText, }) diff --git a/providers/openaicompat/openaicompat_test.go b/providers/openaicompat/openaicompat_test.go index 3482a3d58..a6c01fabf 100644 --- a/providers/openaicompat/openaicompat_test.go +++ b/providers/openaicompat/openaicompat_test.go @@ -347,12 +347,14 @@ func TestToPromptFunc_DropsEmptyMessages(t *testing.T) { require.Empty(t, warnings) }) - t.Run("should add empty reasoning_content to tool call messages when thinking is enabled", func(t *testing.T) { + t.Run("should add reasoning_content to tool call messages only when the message itself reasoned", func(t *testing.T) { t.Parallel() - // When thinking is enabled (reasoning parts exist in history), - // tool call messages without their own reasoning must still include - // reasoning_content. Providers like Kimi require it. + // reasoning_content presence is decided per message from its own + // reasoning part, never from conversation history. This keeps + // resubmitted history byte-stable for prefix caches (see #330), + // while still emitting the (possibly empty) field that providers + // like Kimi require on assistant tool-call messages. prompt := fantasy.Prompt{ { Role: fantasy.MessageRoleUser, @@ -392,13 +394,56 @@ func TestToPromptFunc_DropsEmptyMessages(t *testing.T) { require.Empty(t, warnings) require.Len(t, messages, 4) - // Tool call message must have reasoning_content (empty) since - // thinking is enabled in this conversation + // The reasoning turn keeps its reasoning_content. + reasoningMsg := messages[1].OfAssistant + require.NotNil(t, reasoningMsg) + rc, ok := reasoningMsg.ExtraFields()["reasoning_content"] + require.True(t, ok) + require.Equal(t, "Simple math.", rc) + + // The tool-call message has no reasoning part of its own, so no + // reasoning_content is manufactured for it. msg := messages[3].OfAssistant require.NotNil(t, msg) - extraFields := msg.ExtraFields() - reasoningContent, hasReasoning := extraFields["reasoning_content"] - require.True(t, hasReasoning, "reasoning_content must be present on tool call messages when thinking is enabled") + _, hasReasoning := msg.ExtraFields()["reasoning_content"] + require.False(t, hasReasoning, "reasoning_content must not be synthesized from history (see #330)") + }) + + t.Run("should emit empty reasoning_content when the tool call message has an empty reasoning part", func(t *testing.T) { + t.Parallel() + + // A present-but-empty reasoning part on the message itself still + // emits reasoning_content: "" (present), satisfying providers like + // Kimi while staying byte-stable. + prompt := fantasy.Prompt{ + { + Role: fantasy.MessageRoleUser, + Content: []fantasy.MessagePart{ + fantasy.TextPart{Text: "Run it"}, + }, + }, + { + Role: fantasy.MessageRoleAssistant, + Content: []fantasy.MessagePart{ + fantasy.ReasoningPart{Text: ""}, + fantasy.ToolCallPart{ + ToolCallID: "call_1", + ToolName: "execute", + Input: `{"command":"echo 4"}`, + }, + }, + }, + } + + messages, warnings := ToPromptFunc(prompt, "", "") + + require.Empty(t, warnings) + require.Len(t, messages, 2) + + msg := messages[1].OfAssistant + require.NotNil(t, msg) + reasoningContent, hasReasoning := msg.ExtraFields()["reasoning_content"] + require.True(t, hasReasoning, "present-but-empty reasoning part must emit reasoning_content") require.Equal(t, "", reasoningContent) }) diff --git a/providers/openaicompat/provider_options.go b/providers/openaicompat/provider_options.go index 8c16db999..78da7d84d 100644 --- a/providers/openaicompat/provider_options.go +++ b/providers/openaicompat/provider_options.go @@ -54,6 +54,20 @@ func (r ReasoningData) GetReasoningContent() string { return r.Reasoning } +// hasReasoningField reports whether raw JSON contains a reasoning field +// ("reasoning_content" or "reasoning"), even when its value is empty. +func hasReasoningField(rawJSON string) bool { + var fields map[string]json.RawMessage + if err := json.Unmarshal([]byte(rawJSON), &fields); err != nil { + return false + } + if _, ok := fields["reasoning_content"]; ok { + return true + } + _, ok := fields["reasoning"] + return ok +} + // Options implements the ProviderOptions interface. func (*ProviderOptions) Options() {} From 501d7c891467e6c0dd4745e987703604863cdb3c Mon Sep 17 00:00:00 2001 From: Drew Smirnoff Date: Wed, 19 Aug 2026 18:10:15 +0400 Subject: [PATCH 080/156] fix: correct the auth priority (#343) Signed-off-by: drew --- providers/anthropic/anthropic.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/providers/anthropic/anthropic.go b/providers/anthropic/anthropic.go index 104aabe0b..30a1a4af5 100644 --- a/providers/anthropic/anthropic.go +++ b/providers/anthropic/anthropic.go @@ -293,6 +293,14 @@ func (a *provider) LanguageModel(ctx context.Context, modelID string) (fantasy.L ) } else { if cfg, err := config.LoadDefaultConfig(ctx); err == nil { + // The upstream Anthropic SDK prioritizes a BearerAuthTokenProvider + // over SigV4 credentials. When using AWS SSO, the default config + // populates both, causing the SSO bearer token to be sent to + // Bedrock, which rejects it ("Invalid API Key format"). Clear + // the provider so the SDK falls back to SigV4 signing. + // AWS_BEARER_TOKEN_BEDROCK is still honored by bedrock.WithConfig + // when the provider is nil. + cfg.BearerAuthTokenProvider = nil cfg.Region = cmp.Or(a.options.bedrockRegion, cfg.Region) clientOptions = append( clientOptions, From f6d4d1e3022229bd6e77717416336bf50e1693ad Mon Sep 17 00:00:00 2001 From: drew Date: Wed, 19 Aug 2026 20:44:23 +0400 Subject: [PATCH 081/156] v0.41.2 --- version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.txt b/version.txt index 9ed317fb4..6599454d4 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -0.41.1 +0.41.2 From 4e11e3036908e3e777e6903ffc78737080b48e36 Mon Sep 17 00:00:00 2001 From: William Kennedy Date: Mon, 24 Aug 2026 09:45:27 -0400 Subject: [PATCH 082/156] chore(deps): update kronk to v1.31.5 (#346) Amp-Thread-ID: https://ampcode.com/threads/T-01a029af-37cc-706e-af0f-ca87ad6ec5bf Co-authored-by: Amp --- examples/go.mod | 48 ++++++++++++------------- examples/go.sum | 96 ++++++++++++++++++++++++------------------------- go.mod | 48 ++++++++++++------------- go.sum | 96 ++++++++++++++++++++++++------------------------- 4 files changed, 144 insertions(+), 144 deletions(-) diff --git a/examples/go.mod b/examples/go.mod index 48605c4c0..b2765b8f4 100644 --- a/examples/go.mod +++ b/examples/go.mod @@ -12,7 +12,7 @@ require ( ) require ( - cel.dev/expr v0.25.2 // indirect + cel.dev/expr v0.25.3 // indirect cloud.google.com/go v0.123.0 // indirect cloud.google.com/go/auth v0.23.1 // indirect cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect @@ -25,25 +25,25 @@ require ( github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.59.0 // indirect github.com/anthropics/anthropic-sdk-go v1.63.1 // indirect github.com/ardanlabs/jinja v1.6.0 // indirect - github.com/ardanlabs/kronk v1.31.3 // indirect - github.com/aws/aws-sdk-go-v2 v1.43.5 // indirect - github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.17 // indirect - github.com/aws/aws-sdk-go-v2/config v1.32.36 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.19.35 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.36 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.36 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.36 // indirect - github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.37 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.16 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.29 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.36 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.37 // indirect - github.com/aws/aws-sdk-go-v2/service/s3 v1.107.1 // indirect - github.com/aws/aws-sdk-go-v2/service/signin v1.5.5 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.33.5 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.38.5 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.45.5 // indirect - github.com/aws/smithy-go v1.27.7 // indirect + github.com/ardanlabs/kronk v1.31.5 // indirect + github.com/aws/aws-sdk-go-v2 v1.43.6 // indirect + github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.18 // indirect + github.com/aws/aws-sdk-go-v2/config v1.32.37 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.19.36 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.37 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.37 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.37 // indirect + github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.38 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.17 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.30 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.37 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.38 // indirect + github.com/aws/aws-sdk-go-v2/service/s3 v1.107.2 // indirect + github.com/aws/aws-sdk-go-v2/service/signin v1.5.6 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.33.6 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.38.6 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.45.6 // indirect + github.com/aws/smithy-go v1.27.8 // indirect github.com/bahlo/generic-list-go v0.2.0 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d // indirect @@ -58,7 +58,7 @@ require ( github.com/charmbracelet/x/json v0.2.0 // indirect github.com/cncf/xds/go v0.0.0-20260202195803-dba9d589def2 // indirect github.com/ebitengine/purego v0.10.2 // indirect - github.com/envoyproxy/go-control-plane/envoy v1.37.0 // indirect + github.com/envoyproxy/go-control-plane/envoy v1.39.0 // indirect github.com/envoyproxy/protoc-gen-validate v1.3.3 // indirect github.com/felixge/httpsnoop v1.1.0 // indirect github.com/go-jose/go-jose/v4 v4.1.4 // indirect @@ -131,9 +131,9 @@ require ( golang.org/x/time v0.15.0 // indirect google.golang.org/api v0.293.0 // indirect google.golang.org/genai v1.68.0 // indirect - google.golang.org/genproto v0.0.0-20260810153831-ec0a7760b754 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20260810153831-ec0a7760b754 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20260810153831-ec0a7760b754 // indirect + google.golang.org/genproto v0.0.0-20260818201246-1b0934165a6f // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20260818201246-1b0934165a6f // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20260818201246-1b0934165a6f // indirect google.golang.org/grpc v1.83.0 // indirect google.golang.org/protobuf v1.36.12 // indirect ) diff --git a/examples/go.sum b/examples/go.sum index 0648da037..00f0e5a57 100644 --- a/examples/go.sum +++ b/examples/go.sum @@ -1,5 +1,5 @@ -cel.dev/expr v0.25.2 h1:K6j46C81hXtZQfuX60cVWQFBJahKSE2gfRbNuvr5bFs= -cel.dev/expr v0.25.2/go.mod h1:hrXvqGP6G6gyx8UAHSHJ5RGk//1Oj5nXQ2NI02Nrsg4= +cel.dev/expr v0.25.3 h1:A2jO8jwOugrrovveCWfj0KEZOfqiLgAcwjpHPhzIGw0= +cel.dev/expr v0.25.3/go.mod h1:hrXvqGP6G6gyx8UAHSHJ5RGk//1Oj5nXQ2NI02Nrsg4= cloud.google.com/go v0.123.0 h1:2NAUJwPR47q+E35uaJeYoNhuNEM9kM8SjgRgdeOJUSE= cloud.google.com/go v0.123.0/go.mod h1:xBoMV08QcqUGuPW65Qfm1o9Y4zKZBpGS+7bImXLTAZU= cloud.google.com/go/auth v0.23.1 h1:1tPpBPG02lQHmoiAvs9egyCASqXP0xgobptjZzov/Jg= @@ -32,44 +32,44 @@ github.com/anthropics/anthropic-sdk-go v1.63.1 h1:M9dIoZzUWB453ulVpBkQp3FX0769ud github.com/anthropics/anthropic-sdk-go v1.63.1/go.mod h1:3EfIfmFqxH6rbiLcIP4tPFyXL/IHakx2wDG4OU+TIEI= github.com/ardanlabs/jinja v1.6.0 h1:CbqS/dxYM9qrmlBed1GsN64/tRY6SoWQWc5Sc+aw3iI= github.com/ardanlabs/jinja v1.6.0/go.mod h1:aXXzlJfjA+T3XNKA/YT5ZtDq2VJxt5a5siZ8cl9B35Q= -github.com/ardanlabs/kronk v1.31.3 h1:PtTdA6fPyUTrCUAUZJI3loF8V1NXFfRjEvN0b+KmK+A= -github.com/ardanlabs/kronk v1.31.3/go.mod h1:3tHwmuxmdD/ZEdGTO7vcK4KSf3pBMGajRwyuQYR+LqU= -github.com/aws/aws-sdk-go-v2 v1.43.5 h1:yKT5GYnFWhuDo+DqKvE5ZPwVn3RjC4MAeBtZGlh6AVM= -github.com/aws/aws-sdk-go-v2 v1.43.5/go.mod h1:wZjAJppCntyOGgVSmgVTfDyRJK5PHOasO6Wsy8U7Axk= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.17 h1:mn+Vxb9zgz/FE/yDTcFim3DZ1qpcrxR+qBQkBrl6bzA= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.17/go.mod h1:eDfmEFxu+BSVsUGLbzJhWjpOurv1mqczClS97yI8wdk= -github.com/aws/aws-sdk-go-v2/config v1.32.36 h1:mX6ietU7UlB4w/2IUaexJdsyUDvhTd+jYPjVePiyi6s= -github.com/aws/aws-sdk-go-v2/config v1.32.36/go.mod h1:rMpV4xk7ZK59edraSaHP0jsWrztWTT5tbCwWY495hug= -github.com/aws/aws-sdk-go-v2/credentials v1.19.35 h1:Cxua2RVdRwL0sfjHM/SnQoOnQ7xKng9m5EQBO8BnZlg= -github.com/aws/aws-sdk-go-v2/credentials v1.19.35/go.mod h1:9XQ+RSIGPkycr+oCJYnB1uTv5kMVVR+rd2vYK0Hxj2w= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.36 h1:gucL1KH/PAYbpTpBg09CiVpBdTu4qkCl8C7xOTBixUg= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.36/go.mod h1:usTB+PHhNMhrx2dxUeHcM7OrT5pySvmjYI++IsefPN0= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.36 h1:5CrzwxDqf4w3x1Vs3/NiZ0nsC34Hbm3pIDMWbsLebOE= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.36/go.mod h1:A3gHdKZIvG/QXERzZwcxNS3RNDFcRCuhhTFBYp+V/nw= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.36 h1:A4N2f4YPcST0v+dWtX+xrpPPCL9VTBhoIFFUWYqbacE= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.36/go.mod h1:B/Qr859uxWUEfZeGotK5KAEoof4Q9YWgNtPSwV6jcyk= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.37 h1:oyd3ke4V9AhKcRR7rRgxk1VyI+DjK2CBQtbxh3OkdaA= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.37/go.mod h1:aA9D7SqfG9IC1b7FLD7Iyc8Q4JN0a8gHhNjN4zPlIaI= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.16 h1:iE4NGbvqUZnHDqddQAauZzCILYtFjOHwRM5MOOKLB5A= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.16/go.mod h1:VsjEgrP+ibcou8TlWA4tYaB+0OojuhirsmCe+U60hTA= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.29 h1:E65Hj648dOV6FuUfI0mYXXhQRHbsi7n+B9h6fZPJO/E= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.29/go.mod h1:xLrF9yNTCs92VZSpdEd68EJbgcdw3SMR74RO6QDzWHE= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.36 h1:fx2ujmozWn+C/GtfXfz5k6Ckzza40ElOpIW7d92fLWQ= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.36/go.mod h1:QT2ufGVJ+xTRxtXPHTQ1kHkAdWIKPCmD+BqYAXWv8/4= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.37 h1:KGHa9iZCrgtkOsFfXb0S4ywsjostA/hau7WE9aSb43E= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.37/go.mod h1:FV79f0DSnZIEGsQjWenENGtUycrasyAaJZO+zRanLHA= -github.com/aws/aws-sdk-go-v2/service/s3 v1.107.1 h1:VUTtUJMuRNMkb/7NIKmd8NQaeQLPGCMoTJxkYKre4qM= -github.com/aws/aws-sdk-go-v2/service/s3 v1.107.1/go.mod h1:WvUaO0lP5GNMs1R6cs6qvB3mqo16GLta8yfOuf55Rpc= -github.com/aws/aws-sdk-go-v2/service/signin v1.5.5 h1:0VTFBfOgPJrUSpGMgzoi8qLcXF5dbmiBuxpo14eBWUw= -github.com/aws/aws-sdk-go-v2/service/signin v1.5.5/go.mod h1:sNZYlBxoohYMBYl47BO/bFtAM6I8HSsPa1qwwPPRGoQ= -github.com/aws/aws-sdk-go-v2/service/sso v1.33.5 h1:jDQARFp1mJ2PEnllQf01nfFXGfWMJ59e0/HCHUTTZCk= -github.com/aws/aws-sdk-go-v2/service/sso v1.33.5/go.mod h1:OcT2AhgTuxGAwZk5hgxaNLGpS33W8s8dUQadGVDVY9I= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.38.5 h1:8xo1q9ttkYqMJ6vOXX67FPSpVEI7BWKVTKh77g82w+8= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.38.5/go.mod h1:hbBeEUrZg6VddXYZpbKPyF0tl4XEnM+Dbx92RW3vmZI= -github.com/aws/aws-sdk-go-v2/service/sts v1.45.5 h1:eQ5BtXDrPg2wK0AjtVPzeBhUpYPeqHE/ptiH7xJRGek= -github.com/aws/aws-sdk-go-v2/service/sts v1.45.5/go.mod h1:f9ImhnOISY7BuTZLM8qHepCYnglHBVLk5wVzatmP++w= -github.com/aws/smithy-go v1.27.7 h1:Zgj5z4LfcDYoQIVk+n/yGdTkP/2y6ZT5vYxe0fp7bqE= -github.com/aws/smithy-go v1.27.7/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc= +github.com/ardanlabs/kronk v1.31.5 h1:pU335FU7KOT2Mv4j4e2S+QaAVYumTRYYKgISkzrQT7Q= +github.com/ardanlabs/kronk v1.31.5/go.mod h1:ub5hRgH9xtMTTQOtBTPwzP67fx0dDwZGLwrWDpp+fuQ= +github.com/aws/aws-sdk-go-v2 v1.43.6 h1:RrmFcqCBxkJuf7g1axVo5krB4jM/AO8r5e5oujrgdoQ= +github.com/aws/aws-sdk-go-v2 v1.43.6/go.mod h1:tXpPM+v0D1lndmga+HqqLDIzUFJlEeR21aspVklHF00= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.18 h1:LAfOuhAH331fmOjTQpAaOlH+Ftn7RzSDJ2VFwjdMMy4= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.18/go.mod h1:4e5xhuXHx1e4U9EthvbPP1r/DIMp5c2823OL8karzcM= +github.com/aws/aws-sdk-go-v2/config v1.32.37 h1:Ljl7LOJB6ym0liuEl0+TZ3d7f5I8MEZN1Cj9PINlj/g= +github.com/aws/aws-sdk-go-v2/config v1.32.37/go.mod h1:WJ7pe7ZPpmG8Q5kKS53zeypIV4FBGACxmte8Uc6SgUc= +github.com/aws/aws-sdk-go-v2/credentials v1.19.36 h1:84s5xMme6ENYEdKG8rsbSFFg/8+lbHBeM9QYSO0gnDk= +github.com/aws/aws-sdk-go-v2/credentials v1.19.36/go.mod h1:c46BLdagDLIswjgt+GeQOslXgeS0E6wCacs5yZbxPGk= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.37 h1:b5tb+CZItBkydC7r3hTNdSO3pszG1R2EtnA+7TePQPk= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.37/go.mod h1:ZQ+6SU9X0oz6+7MUCSswv9Mjci4eaqZr21HI2RVy/yA= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.37 h1:lznzIOvvbqjfe8UAaciCRJgBgJsxuTROKlhZuXQWfv8= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.37/go.mod h1:otfkzyfQeMMLZAqX59GSXTL3o22BR/l6HFaRzzbWSqA= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.37 h1:zCEORWo0eU0gDjG+IyApE/2B+ZGG1m+GU7B263XV8ds= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.37/go.mod h1:i6c0PEl3TNOWxRbQ++KQcVenPWS/GoQeiklKhNuqzJ8= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.38 h1:A3UAuCmx7LyUcrixBTzKJYYIUZ2yTvn6ZhT8PB+7APk= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.38/go.mod h1:1PDUYG9Z+JrbbsobsAZHjWOm9QBT/djiK3QbykTL5Z4= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.17 h1:OvYZOB3qA6zvfdRFiRFRzVSiElMYrz3GdntkXZxlp1o= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.17/go.mod h1:JgR/2Ew50ACfIWau1oeMRX59tMtC0kM+PYQGEaT04cY= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.30 h1:5437eMoOwqqQpZn2XJy74mlDCuPYL81texMT3mXqgtU= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.30/go.mod h1:xfu2m3dOpvW8lj98wQYa8V9ku/Rta59hsbireGzhh3A= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.37 h1:a3D4AjrOrTrP8+d9ILBthqrElf0z1JNol09Xvnwcys8= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.37/go.mod h1:ky0gTu+ukvUTuUKFIpp6Wid4oninrkCyvbFkVs0kpHM= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.38 h1:gX8B8y3Ho30B1LPxefDKMi/HZqWEb47U9ogs3DtSG0M= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.38/go.mod h1:l5WblZlcmGPe4/O7JY2HO25Z+xqTBvyfTyFbRMf8gYw= +github.com/aws/aws-sdk-go-v2/service/s3 v1.107.2 h1:GNU0/xtPEXMKilJZ/a8BedeuQnvu+Usi6qVm9EFfncc= +github.com/aws/aws-sdk-go-v2/service/s3 v1.107.2/go.mod h1:4jYWUecEsQtE73jPl7p3jrbYXH5ffcR4gegyCygagfg= +github.com/aws/aws-sdk-go-v2/service/signin v1.5.6 h1:i68sFvXidKlkiSvI7d7Ilc1/UvW4CtBOaivH7jhG4fs= +github.com/aws/aws-sdk-go-v2/service/signin v1.5.6/go.mod h1:/h7Obr9WTtzbjTHGASRQwLN7Bupw+TC3x8x7fyx39hE= +github.com/aws/aws-sdk-go-v2/service/sso v1.33.6 h1:tpfGChmjUmv3W9WlRvy+stwKDTbFFdq8Zk9DbFPrfMU= +github.com/aws/aws-sdk-go-v2/service/sso v1.33.6/go.mod h1:CSjiDzmG/lsKkTOYjbkM+duLmRlW+LOxD64Na44ijnI= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.38.6 h1:49BBtY68A+KJCQ3a2F3eUe6ROsKucxUdfHKoqorc0wI= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.38.6/go.mod h1:ptG2hbs7QltE1GcQY0MpS4bfrc51KCnBXUr7OT1EEfE= +github.com/aws/aws-sdk-go-v2/service/sts v1.45.6 h1:JvExZWabChDM0qJAirQYGfOYo0ndT3edXj+fqSPNjkE= +github.com/aws/aws-sdk-go-v2/service/sts v1.45.6/go.mod h1:XZcaQkV2cItp6yEkrwljyaPOf22RuX7T43jxap/FOmM= +github.com/aws/smithy-go v1.27.8 h1:FR0dxZfIlV7Z8eh2iHfIofdunw382XsDV3Mxt9nUvRY= +github.com/aws/smithy-go v1.27.8/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc= github.com/aymanbagabas/go-udiff v0.2.0 h1:TK0fH4MteXUDspT88n8CKzvK0X9O2xu9yQjWpi6yML8= github.com/aymanbagabas/go-udiff v0.2.0/go.mod h1:RE4Ex0qsGkTAJoQdQQCA0uG+nAzJO/pI/QwceO5fgrA= github.com/bahlo/generic-list-go v0.2.0 h1:5sz/EEAK+ls5wF+NeqDpk5+iNdMDXrh3z3nPnH1Wvgk= @@ -112,8 +112,8 @@ github.com/ebitengine/purego v0.10.2 h1:W809HbnvzAxgdm+aOvlSekrM16wGCdT/e76+9tS7 github.com/ebitengine/purego v0.10.2/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= github.com/envoyproxy/go-control-plane v0.14.0 h1:hbG2kr4RuFj222B6+7T83thSPqLjwBIfQawTkC++2HA= github.com/envoyproxy/go-control-plane v0.14.0/go.mod h1:NcS5X47pLl/hfqxU70yPwL9ZMkUlwlKxtAohpi2wBEU= -github.com/envoyproxy/go-control-plane/envoy v1.37.0 h1:u3riX6BoYRfF4Dr7dwSOroNfdSbEPe9Yyl09/B6wBrQ= -github.com/envoyproxy/go-control-plane/envoy v1.37.0/go.mod h1:DReE9MMrmecPy+YvQOAOHNYMALuowAnbjjEMkkWOi6A= +github.com/envoyproxy/go-control-plane/envoy v1.39.0 h1:1uwRDYPYG8BIBU9Mj1sUAebNmlM6beu/ZKKweSLDxk8= +github.com/envoyproxy/go-control-plane/envoy v1.39.0/go.mod h1:5e4ylfTZO723MEEFsCpSW4ZEBWR8mwkEyXfwJBTCZ9c= github.com/envoyproxy/go-control-plane/ratelimit v0.1.0 h1:/G9QYbddjL25KvtKTv3an9lx6VBE2cnb8wp1vEGNYGI= github.com/envoyproxy/go-control-plane/ratelimit v0.1.0/go.mod h1:Wk+tMFAFbCXaJPzVVHnPgRKdUdwW/KdbRt94AzgRee4= github.com/envoyproxy/protoc-gen-validate v1.3.3 h1:MVQghNeW+LZcmXe7SY1V36Z+WFMDjpqGAGacLe2T0ds= @@ -278,12 +278,12 @@ google.golang.org/api v0.293.0 h1:p9XIWOf63U4OgYx120ZwVU8+vl4XTPmWfgVPnmOAS9w= google.golang.org/api v0.293.0/go.mod h1:6n5tjEB1gzwniZTepZ0g5u+wM7Bof5GeULCx/zh8ZE0= google.golang.org/genai v1.68.0 h1:gmALuBU6mRy46wupEt20wBR1dYAMY13t/jkTxpdzhzE= google.golang.org/genai v1.68.0/go.mod h1:mDdPDFXo1Ats7f1WXVyZgWb/CkMzFWTWJruIMy7hGIU= -google.golang.org/genproto v0.0.0-20260810153831-ec0a7760b754 h1:Kj7g/XOpdB2mzcVV92AFeNKvYR5WRNpxfX5Mj3wQ2SM= -google.golang.org/genproto v0.0.0-20260810153831-ec0a7760b754/go.mod h1:UpDDw2l68z31m5UZN/Qi0Kow16ohhlJVlmqC3qRM5Q8= -google.golang.org/genproto/googleapis/api v0.0.0-20260810153831-ec0a7760b754 h1:dWeMvEJ3JhYgqSCAHUZZJgMUyfniiiCvDc72x5EqJP0= -google.golang.org/genproto/googleapis/api v0.0.0-20260810153831-ec0a7760b754/go.mod h1:q/3oV3jAi5vwelxsVAprMBC8BcM2zmNe+IjRGd+9/ks= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260810153831-ec0a7760b754 h1:k5CJw9e5ONCcA/u0webKt092npXuY+KeGh3Q8NAVf0g= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260810153831-ec0a7760b754/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= +google.golang.org/genproto v0.0.0-20260818201246-1b0934165a6f h1:mIpuZeRssq9TYLzKcruaLOCbOgJt8WDF1FSyEPZBw24= +google.golang.org/genproto v0.0.0-20260818201246-1b0934165a6f/go.mod h1:UpDDw2l68z31m5UZN/Qi0Kow16ohhlJVlmqC3qRM5Q8= +google.golang.org/genproto/googleapis/api v0.0.0-20260818201246-1b0934165a6f h1:zRL8hmUGXSGBJ2D+r85c0S3xhrg6BtfQ3V6KKbR/I9M= +google.golang.org/genproto/googleapis/api v0.0.0-20260818201246-1b0934165a6f/go.mod h1:q/3oV3jAi5vwelxsVAprMBC8BcM2zmNe+IjRGd+9/ks= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260818201246-1b0934165a6f h1:kMQMi+2r0XRQ/Ad2/tgd+5S7JYSBGYO4pwkLTE8F2y0= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260818201246-1b0934165a6f/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= google.golang.org/grpc v1.83.0 h1:JeNZEKJFbQxArAMl+hiytHauacDNqJUllNfmIMmpqnQ= google.golang.org/grpc v1.83.0/go.mod h1:kDyl6SKsiHKt0uylY5gtn5cEjkrIOhQOGDgIc4JGwzQ= google.golang.org/protobuf v1.36.12 h1:pJOKDDOyeXErUroCihFAd5LQuwXBSpVnKGrj5o/fwxc= diff --git a/go.mod b/go.mod index 3c56c3aa8..13cd7f3a4 100644 --- a/go.mod +++ b/go.mod @@ -6,10 +6,10 @@ require ( charm.land/x/vcr v0.1.1 cloud.google.com/go/auth v0.23.1 github.com/anthropics/anthropic-sdk-go v1.63.1 - github.com/ardanlabs/kronk v1.31.3 - github.com/aws/aws-sdk-go-v2 v1.43.5 - github.com/aws/aws-sdk-go-v2/config v1.32.36 - github.com/aws/smithy-go v1.27.7 + github.com/ardanlabs/kronk v1.31.5 + github.com/aws/aws-sdk-go-v2 v1.43.6 + github.com/aws/aws-sdk-go-v2/config v1.32.37 + github.com/aws/smithy-go v1.27.8 github.com/charmbracelet/x/exp/slice v0.0.0-20250904123553-b4e2667e5ad5 github.com/charmbracelet/x/exp/strings v0.1.0 github.com/charmbracelet/x/json v0.2.0 @@ -25,7 +25,7 @@ require ( ) require ( - cel.dev/expr v0.25.2 // indirect + cel.dev/expr v0.25.3 // indirect cloud.google.com/go v0.123.0 // indirect cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect cloud.google.com/go/compute/metadata v0.9.0 // indirect @@ -38,21 +38,21 @@ require ( github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.59.0 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.59.0 // indirect github.com/ardanlabs/jinja v1.6.0 // indirect - github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.17 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.19.35 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.36 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.36 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.36 // indirect - github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.37 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.16 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.29 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.36 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.37 // indirect - github.com/aws/aws-sdk-go-v2/service/s3 v1.107.1 // indirect - github.com/aws/aws-sdk-go-v2/service/signin v1.5.5 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.33.5 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.38.5 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.45.5 // indirect + github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.18 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.19.36 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.37 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.37 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.37 // indirect + github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.38 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.17 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.30 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.37 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.38 // indirect + github.com/aws/aws-sdk-go-v2/service/s3 v1.107.2 // indirect + github.com/aws/aws-sdk-go-v2/service/signin v1.5.6 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.33.6 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.38.6 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.45.6 // indirect github.com/bahlo/generic-list-go v0.2.0 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d // indirect @@ -61,7 +61,7 @@ require ( github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/cncf/xds/go v0.0.0-20260202195803-dba9d589def2 // indirect github.com/ebitengine/purego v0.10.2 // indirect - github.com/envoyproxy/go-control-plane/envoy v1.37.0 // indirect + github.com/envoyproxy/go-control-plane/envoy v1.39.0 // indirect github.com/envoyproxy/protoc-gen-validate v1.3.3 // indirect github.com/felixge/httpsnoop v1.1.0 // indirect github.com/go-jose/go-jose/v4 v4.1.4 // indirect @@ -120,9 +120,9 @@ require ( golang.org/x/text v0.41.0 // indirect golang.org/x/time v0.15.0 // indirect google.golang.org/api v0.293.0 // indirect - google.golang.org/genproto v0.0.0-20260810153831-ec0a7760b754 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20260810153831-ec0a7760b754 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20260810153831-ec0a7760b754 // indirect + google.golang.org/genproto v0.0.0-20260818201246-1b0934165a6f // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20260818201246-1b0934165a6f // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20260818201246-1b0934165a6f // indirect google.golang.org/grpc v1.83.0 // indirect google.golang.org/protobuf v1.36.12 // indirect gopkg.in/dnaeon/go-vcr.v4 v4.0.6-0.20251110073552-01de4eb40290 // indirect diff --git a/go.sum b/go.sum index 39996c989..4dafa7a59 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,5 @@ -cel.dev/expr v0.25.2 h1:K6j46C81hXtZQfuX60cVWQFBJahKSE2gfRbNuvr5bFs= -cel.dev/expr v0.25.2/go.mod h1:hrXvqGP6G6gyx8UAHSHJ5RGk//1Oj5nXQ2NI02Nrsg4= +cel.dev/expr v0.25.3 h1:A2jO8jwOugrrovveCWfj0KEZOfqiLgAcwjpHPhzIGw0= +cel.dev/expr v0.25.3/go.mod h1:hrXvqGP6G6gyx8UAHSHJ5RGk//1Oj5nXQ2NI02Nrsg4= charm.land/x/vcr v0.1.1 h1:PXCFMUG0rPtyk35rhfzYCJEduOzWXCIbrXTFq4OF/9Q= charm.land/x/vcr v0.1.1/go.mod h1:eByq2gqzWvcct/8XE2XO5KznoWEBiXH56+y2gphbltM= cloud.google.com/go v0.123.0 h1:2NAUJwPR47q+E35uaJeYoNhuNEM9kM8SjgRgdeOJUSE= @@ -42,44 +42,44 @@ github.com/anthropics/anthropic-sdk-go v1.63.1 h1:M9dIoZzUWB453ulVpBkQp3FX0769ud github.com/anthropics/anthropic-sdk-go v1.63.1/go.mod h1:3EfIfmFqxH6rbiLcIP4tPFyXL/IHakx2wDG4OU+TIEI= github.com/ardanlabs/jinja v1.6.0 h1:CbqS/dxYM9qrmlBed1GsN64/tRY6SoWQWc5Sc+aw3iI= github.com/ardanlabs/jinja v1.6.0/go.mod h1:aXXzlJfjA+T3XNKA/YT5ZtDq2VJxt5a5siZ8cl9B35Q= -github.com/ardanlabs/kronk v1.31.3 h1:PtTdA6fPyUTrCUAUZJI3loF8V1NXFfRjEvN0b+KmK+A= -github.com/ardanlabs/kronk v1.31.3/go.mod h1:3tHwmuxmdD/ZEdGTO7vcK4KSf3pBMGajRwyuQYR+LqU= -github.com/aws/aws-sdk-go-v2 v1.43.5 h1:yKT5GYnFWhuDo+DqKvE5ZPwVn3RjC4MAeBtZGlh6AVM= -github.com/aws/aws-sdk-go-v2 v1.43.5/go.mod h1:wZjAJppCntyOGgVSmgVTfDyRJK5PHOasO6Wsy8U7Axk= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.17 h1:mn+Vxb9zgz/FE/yDTcFim3DZ1qpcrxR+qBQkBrl6bzA= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.17/go.mod h1:eDfmEFxu+BSVsUGLbzJhWjpOurv1mqczClS97yI8wdk= -github.com/aws/aws-sdk-go-v2/config v1.32.36 h1:mX6ietU7UlB4w/2IUaexJdsyUDvhTd+jYPjVePiyi6s= -github.com/aws/aws-sdk-go-v2/config v1.32.36/go.mod h1:rMpV4xk7ZK59edraSaHP0jsWrztWTT5tbCwWY495hug= -github.com/aws/aws-sdk-go-v2/credentials v1.19.35 h1:Cxua2RVdRwL0sfjHM/SnQoOnQ7xKng9m5EQBO8BnZlg= -github.com/aws/aws-sdk-go-v2/credentials v1.19.35/go.mod h1:9XQ+RSIGPkycr+oCJYnB1uTv5kMVVR+rd2vYK0Hxj2w= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.36 h1:gucL1KH/PAYbpTpBg09CiVpBdTu4qkCl8C7xOTBixUg= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.36/go.mod h1:usTB+PHhNMhrx2dxUeHcM7OrT5pySvmjYI++IsefPN0= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.36 h1:5CrzwxDqf4w3x1Vs3/NiZ0nsC34Hbm3pIDMWbsLebOE= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.36/go.mod h1:A3gHdKZIvG/QXERzZwcxNS3RNDFcRCuhhTFBYp+V/nw= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.36 h1:A4N2f4YPcST0v+dWtX+xrpPPCL9VTBhoIFFUWYqbacE= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.36/go.mod h1:B/Qr859uxWUEfZeGotK5KAEoof4Q9YWgNtPSwV6jcyk= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.37 h1:oyd3ke4V9AhKcRR7rRgxk1VyI+DjK2CBQtbxh3OkdaA= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.37/go.mod h1:aA9D7SqfG9IC1b7FLD7Iyc8Q4JN0a8gHhNjN4zPlIaI= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.16 h1:iE4NGbvqUZnHDqddQAauZzCILYtFjOHwRM5MOOKLB5A= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.16/go.mod h1:VsjEgrP+ibcou8TlWA4tYaB+0OojuhirsmCe+U60hTA= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.29 h1:E65Hj648dOV6FuUfI0mYXXhQRHbsi7n+B9h6fZPJO/E= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.29/go.mod h1:xLrF9yNTCs92VZSpdEd68EJbgcdw3SMR74RO6QDzWHE= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.36 h1:fx2ujmozWn+C/GtfXfz5k6Ckzza40ElOpIW7d92fLWQ= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.36/go.mod h1:QT2ufGVJ+xTRxtXPHTQ1kHkAdWIKPCmD+BqYAXWv8/4= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.37 h1:KGHa9iZCrgtkOsFfXb0S4ywsjostA/hau7WE9aSb43E= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.37/go.mod h1:FV79f0DSnZIEGsQjWenENGtUycrasyAaJZO+zRanLHA= -github.com/aws/aws-sdk-go-v2/service/s3 v1.107.1 h1:VUTtUJMuRNMkb/7NIKmd8NQaeQLPGCMoTJxkYKre4qM= -github.com/aws/aws-sdk-go-v2/service/s3 v1.107.1/go.mod h1:WvUaO0lP5GNMs1R6cs6qvB3mqo16GLta8yfOuf55Rpc= -github.com/aws/aws-sdk-go-v2/service/signin v1.5.5 h1:0VTFBfOgPJrUSpGMgzoi8qLcXF5dbmiBuxpo14eBWUw= -github.com/aws/aws-sdk-go-v2/service/signin v1.5.5/go.mod h1:sNZYlBxoohYMBYl47BO/bFtAM6I8HSsPa1qwwPPRGoQ= -github.com/aws/aws-sdk-go-v2/service/sso v1.33.5 h1:jDQARFp1mJ2PEnllQf01nfFXGfWMJ59e0/HCHUTTZCk= -github.com/aws/aws-sdk-go-v2/service/sso v1.33.5/go.mod h1:OcT2AhgTuxGAwZk5hgxaNLGpS33W8s8dUQadGVDVY9I= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.38.5 h1:8xo1q9ttkYqMJ6vOXX67FPSpVEI7BWKVTKh77g82w+8= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.38.5/go.mod h1:hbBeEUrZg6VddXYZpbKPyF0tl4XEnM+Dbx92RW3vmZI= -github.com/aws/aws-sdk-go-v2/service/sts v1.45.5 h1:eQ5BtXDrPg2wK0AjtVPzeBhUpYPeqHE/ptiH7xJRGek= -github.com/aws/aws-sdk-go-v2/service/sts v1.45.5/go.mod h1:f9ImhnOISY7BuTZLM8qHepCYnglHBVLk5wVzatmP++w= -github.com/aws/smithy-go v1.27.7 h1:Zgj5z4LfcDYoQIVk+n/yGdTkP/2y6ZT5vYxe0fp7bqE= -github.com/aws/smithy-go v1.27.7/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc= +github.com/ardanlabs/kronk v1.31.5 h1:pU335FU7KOT2Mv4j4e2S+QaAVYumTRYYKgISkzrQT7Q= +github.com/ardanlabs/kronk v1.31.5/go.mod h1:ub5hRgH9xtMTTQOtBTPwzP67fx0dDwZGLwrWDpp+fuQ= +github.com/aws/aws-sdk-go-v2 v1.43.6 h1:RrmFcqCBxkJuf7g1axVo5krB4jM/AO8r5e5oujrgdoQ= +github.com/aws/aws-sdk-go-v2 v1.43.6/go.mod h1:tXpPM+v0D1lndmga+HqqLDIzUFJlEeR21aspVklHF00= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.18 h1:LAfOuhAH331fmOjTQpAaOlH+Ftn7RzSDJ2VFwjdMMy4= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.18/go.mod h1:4e5xhuXHx1e4U9EthvbPP1r/DIMp5c2823OL8karzcM= +github.com/aws/aws-sdk-go-v2/config v1.32.37 h1:Ljl7LOJB6ym0liuEl0+TZ3d7f5I8MEZN1Cj9PINlj/g= +github.com/aws/aws-sdk-go-v2/config v1.32.37/go.mod h1:WJ7pe7ZPpmG8Q5kKS53zeypIV4FBGACxmte8Uc6SgUc= +github.com/aws/aws-sdk-go-v2/credentials v1.19.36 h1:84s5xMme6ENYEdKG8rsbSFFg/8+lbHBeM9QYSO0gnDk= +github.com/aws/aws-sdk-go-v2/credentials v1.19.36/go.mod h1:c46BLdagDLIswjgt+GeQOslXgeS0E6wCacs5yZbxPGk= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.37 h1:b5tb+CZItBkydC7r3hTNdSO3pszG1R2EtnA+7TePQPk= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.37/go.mod h1:ZQ+6SU9X0oz6+7MUCSswv9Mjci4eaqZr21HI2RVy/yA= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.37 h1:lznzIOvvbqjfe8UAaciCRJgBgJsxuTROKlhZuXQWfv8= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.37/go.mod h1:otfkzyfQeMMLZAqX59GSXTL3o22BR/l6HFaRzzbWSqA= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.37 h1:zCEORWo0eU0gDjG+IyApE/2B+ZGG1m+GU7B263XV8ds= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.37/go.mod h1:i6c0PEl3TNOWxRbQ++KQcVenPWS/GoQeiklKhNuqzJ8= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.38 h1:A3UAuCmx7LyUcrixBTzKJYYIUZ2yTvn6ZhT8PB+7APk= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.38/go.mod h1:1PDUYG9Z+JrbbsobsAZHjWOm9QBT/djiK3QbykTL5Z4= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.17 h1:OvYZOB3qA6zvfdRFiRFRzVSiElMYrz3GdntkXZxlp1o= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.17/go.mod h1:JgR/2Ew50ACfIWau1oeMRX59tMtC0kM+PYQGEaT04cY= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.30 h1:5437eMoOwqqQpZn2XJy74mlDCuPYL81texMT3mXqgtU= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.30/go.mod h1:xfu2m3dOpvW8lj98wQYa8V9ku/Rta59hsbireGzhh3A= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.37 h1:a3D4AjrOrTrP8+d9ILBthqrElf0z1JNol09Xvnwcys8= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.37/go.mod h1:ky0gTu+ukvUTuUKFIpp6Wid4oninrkCyvbFkVs0kpHM= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.38 h1:gX8B8y3Ho30B1LPxefDKMi/HZqWEb47U9ogs3DtSG0M= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.38/go.mod h1:l5WblZlcmGPe4/O7JY2HO25Z+xqTBvyfTyFbRMf8gYw= +github.com/aws/aws-sdk-go-v2/service/s3 v1.107.2 h1:GNU0/xtPEXMKilJZ/a8BedeuQnvu+Usi6qVm9EFfncc= +github.com/aws/aws-sdk-go-v2/service/s3 v1.107.2/go.mod h1:4jYWUecEsQtE73jPl7p3jrbYXH5ffcR4gegyCygagfg= +github.com/aws/aws-sdk-go-v2/service/signin v1.5.6 h1:i68sFvXidKlkiSvI7d7Ilc1/UvW4CtBOaivH7jhG4fs= +github.com/aws/aws-sdk-go-v2/service/signin v1.5.6/go.mod h1:/h7Obr9WTtzbjTHGASRQwLN7Bupw+TC3x8x7fyx39hE= +github.com/aws/aws-sdk-go-v2/service/sso v1.33.6 h1:tpfGChmjUmv3W9WlRvy+stwKDTbFFdq8Zk9DbFPrfMU= +github.com/aws/aws-sdk-go-v2/service/sso v1.33.6/go.mod h1:CSjiDzmG/lsKkTOYjbkM+duLmRlW+LOxD64Na44ijnI= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.38.6 h1:49BBtY68A+KJCQ3a2F3eUe6ROsKucxUdfHKoqorc0wI= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.38.6/go.mod h1:ptG2hbs7QltE1GcQY0MpS4bfrc51KCnBXUr7OT1EEfE= +github.com/aws/aws-sdk-go-v2/service/sts v1.45.6 h1:JvExZWabChDM0qJAirQYGfOYo0ndT3edXj+fqSPNjkE= +github.com/aws/aws-sdk-go-v2/service/sts v1.45.6/go.mod h1:XZcaQkV2cItp6yEkrwljyaPOf22RuX7T43jxap/FOmM= +github.com/aws/smithy-go v1.27.8 h1:FR0dxZfIlV7Z8eh2iHfIofdunw382XsDV3Mxt9nUvRY= +github.com/aws/smithy-go v1.27.8/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc= github.com/bahlo/generic-list-go v0.2.0 h1:5sz/EEAK+ls5wF+NeqDpk5+iNdMDXrh3z3nPnH1Wvgk= github.com/bahlo/generic-list-go v0.2.0/go.mod h1:2KvAjgMlE5NNynlg/5iLrrCCZ2+5xWbdbCW3pNTGyYg= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= @@ -106,8 +106,8 @@ github.com/ebitengine/purego v0.10.2 h1:W809HbnvzAxgdm+aOvlSekrM16wGCdT/e76+9tS7 github.com/ebitengine/purego v0.10.2/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= github.com/envoyproxy/go-control-plane v0.14.0 h1:hbG2kr4RuFj222B6+7T83thSPqLjwBIfQawTkC++2HA= github.com/envoyproxy/go-control-plane v0.14.0/go.mod h1:NcS5X47pLl/hfqxU70yPwL9ZMkUlwlKxtAohpi2wBEU= -github.com/envoyproxy/go-control-plane/envoy v1.37.0 h1:u3riX6BoYRfF4Dr7dwSOroNfdSbEPe9Yyl09/B6wBrQ= -github.com/envoyproxy/go-control-plane/envoy v1.37.0/go.mod h1:DReE9MMrmecPy+YvQOAOHNYMALuowAnbjjEMkkWOi6A= +github.com/envoyproxy/go-control-plane/envoy v1.39.0 h1:1uwRDYPYG8BIBU9Mj1sUAebNmlM6beu/ZKKweSLDxk8= +github.com/envoyproxy/go-control-plane/envoy v1.39.0/go.mod h1:5e4ylfTZO723MEEFsCpSW4ZEBWR8mwkEyXfwJBTCZ9c= github.com/envoyproxy/go-control-plane/ratelimit v0.1.0 h1:/G9QYbddjL25KvtKTv3an9lx6VBE2cnb8wp1vEGNYGI= github.com/envoyproxy/go-control-plane/ratelimit v0.1.0/go.mod h1:Wk+tMFAFbCXaJPzVVHnPgRKdUdwW/KdbRt94AzgRee4= github.com/envoyproxy/protoc-gen-validate v1.3.3 h1:MVQghNeW+LZcmXe7SY1V36Z+WFMDjpqGAGacLe2T0ds= @@ -271,12 +271,12 @@ google.golang.org/api v0.293.0 h1:p9XIWOf63U4OgYx120ZwVU8+vl4XTPmWfgVPnmOAS9w= google.golang.org/api v0.293.0/go.mod h1:6n5tjEB1gzwniZTepZ0g5u+wM7Bof5GeULCx/zh8ZE0= google.golang.org/genai v1.68.0 h1:gmALuBU6mRy46wupEt20wBR1dYAMY13t/jkTxpdzhzE= google.golang.org/genai v1.68.0/go.mod h1:mDdPDFXo1Ats7f1WXVyZgWb/CkMzFWTWJruIMy7hGIU= -google.golang.org/genproto v0.0.0-20260810153831-ec0a7760b754 h1:Kj7g/XOpdB2mzcVV92AFeNKvYR5WRNpxfX5Mj3wQ2SM= -google.golang.org/genproto v0.0.0-20260810153831-ec0a7760b754/go.mod h1:UpDDw2l68z31m5UZN/Qi0Kow16ohhlJVlmqC3qRM5Q8= -google.golang.org/genproto/googleapis/api v0.0.0-20260810153831-ec0a7760b754 h1:dWeMvEJ3JhYgqSCAHUZZJgMUyfniiiCvDc72x5EqJP0= -google.golang.org/genproto/googleapis/api v0.0.0-20260810153831-ec0a7760b754/go.mod h1:q/3oV3jAi5vwelxsVAprMBC8BcM2zmNe+IjRGd+9/ks= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260810153831-ec0a7760b754 h1:k5CJw9e5ONCcA/u0webKt092npXuY+KeGh3Q8NAVf0g= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260810153831-ec0a7760b754/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= +google.golang.org/genproto v0.0.0-20260818201246-1b0934165a6f h1:mIpuZeRssq9TYLzKcruaLOCbOgJt8WDF1FSyEPZBw24= +google.golang.org/genproto v0.0.0-20260818201246-1b0934165a6f/go.mod h1:UpDDw2l68z31m5UZN/Qi0Kow16ohhlJVlmqC3qRM5Q8= +google.golang.org/genproto/googleapis/api v0.0.0-20260818201246-1b0934165a6f h1:zRL8hmUGXSGBJ2D+r85c0S3xhrg6BtfQ3V6KKbR/I9M= +google.golang.org/genproto/googleapis/api v0.0.0-20260818201246-1b0934165a6f/go.mod h1:q/3oV3jAi5vwelxsVAprMBC8BcM2zmNe+IjRGd+9/ks= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260818201246-1b0934165a6f h1:kMQMi+2r0XRQ/Ad2/tgd+5S7JYSBGYO4pwkLTE8F2y0= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260818201246-1b0934165a6f/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= google.golang.org/grpc v1.83.0 h1:JeNZEKJFbQxArAMl+hiytHauacDNqJUllNfmIMmpqnQ= google.golang.org/grpc v1.83.0/go.mod h1:kDyl6SKsiHKt0uylY5gtn5cEjkrIOhQOGDgIc4JGwzQ= google.golang.org/protobuf v1.36.12 h1:pJOKDDOyeXErUroCihFAd5LQuwXBSpVnKGrj5o/fwxc= From 33015b8a8dcc17adabaf886e7af8b36d27c3417e Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Mon, 24 Aug 2026 17:25:58 -0300 Subject: [PATCH 083/156] fix: preserve finish_reason=length when tool calls are truncated (#347) When a model hits the token limit mid-tool-call, upstream providers return finish_reason=length with partial arguments. The OpenAI and Responses providers were unconditionally overriding this to finish_reason=tool_calls whenever any tool calls existed in the response, silently discarding the truncation signal. This caused agent loops to treat truncated tool calls as valid and continue looping indefinitely, since the agent only breaks on non-tool-calls finish reasons. Models like DeepSeek V4 Flash that consume reasoning tokens from the same budget as completion tokens are especially prone to hitting this path. The fix operates at three levels: 1. Provider: preserves finish_reason=length instead of overriding to tool-calls. Truncated tool-call content is suppressed in both Chat Completions and Responses API non-streaming paths so agents never see incomplete arguments. Streaming Chat Completions evaluates the finish reason before emitting ToolCall parts. A warning is emitted in all paths so callers know truncation occurred. 2. Agent streaming: skips dispatching buffered tool calls when the terminal finish reason is length, preventing execution of calls with incomplete arguments even when ToolCall parts were already emitted (Responses streaming emits them inline before the terminal event). 3. Agent warning aggregation: appends rather than replaces warning parts so multiple warnings survive through to the step result. The override to tool_calls still applies for all other finish reasons (stop, empty, etc.), preserving existing behavior for normal turns. Assisted-by: Crush:qwen3.8-max --- agent.go | 12 +- agent_stream_test.go | 75 ++++++ providers/openai/language_model.go | 76 ++++-- providers/openai/openai_test.go | 250 +++++++++++++++++++ providers/openai/responses_language_model.go | 29 ++- 5 files changed, 414 insertions(+), 28 deletions(-) diff --git a/agent.go b/agent.go index 9626092bf..316ac86d1 100644 --- a/agent.go +++ b/agent.go @@ -1433,7 +1433,7 @@ func (a *agent) processStepStream(ctx context.Context, stream StreamResponse, op switch part.Type { case StreamPartTypeWarnings: - stepWarnings = part.Warnings + stepWarnings = append(stepWarnings, part.Warnings...) if opts.OnWarnings != nil { err := opts.OnWarnings(part.Warnings) if err != nil { @@ -1701,9 +1701,13 @@ func (a *agent) processStepStream(ctx context.Context, stream StreamResponse, op }) // Dispatch all buffered tool calls now that every OnToolCall callback has - // been called, then close and wait. - for _, req := range pendingDispatches { - toolChan <- req + // been called, then close and wait. Skip dispatch when the response was + // truncated (finish_reason=length) to avoid executing tool calls with + // incomplete arguments. + if stepFinishReason != FinishReasonLength { + for _, req := range pendingDispatches { + toolChan <- req + } } // Close the tool execution channel and wait for all executions to complete. diff --git a/agent_stream_test.go b/agent_stream_test.go index 13e0ac3d2..e0b128ffd 100644 --- a/agent_stream_test.go +++ b/agent_stream_test.go @@ -761,3 +761,78 @@ func TestStreamingAgent_StopTurn(t *testing.T) { require.Len(t, responseResults, 1) require.True(t, responseResults[0].StopTurn) } + +func TestStreamingAgent_SkipsToolDispatchWhenTruncated(t *testing.T) { + t.Parallel() + + var toolExecuted bool + mockModel := &mockLanguageModel{ + streamFunc: func(ctx context.Context, call Call) (StreamResponse, error) { + return func(yield func(StreamPart) bool) { + // Emit a tool call with truncated arguments + if !yield(StreamPart{Type: StreamPartTypeToolInputStart, ID: "call-trunc", ToolCallName: "echo"}) { + return + } + if !yield(StreamPart{Type: StreamPartTypeToolInputDelta, ID: "call-trunc", Delta: `{"message":"tr`}) { + return + } + if !yield(StreamPart{Type: StreamPartTypeToolInputEnd, ID: "call-trunc"}) { + return + } + if !yield(StreamPart{ + Type: StreamPartTypeToolCall, + ID: "call-trunc", + ToolCallName: "echo", + ToolCallInput: `{"message":"tr`, + }) { + return + } + // Finish with length instead of tool_calls + yield(StreamPart{ + Type: StreamPartTypeFinish, + Usage: Usage{InputTokens: 10, OutputTokens: 20, TotalTokens: 30}, + FinishReason: FinishReasonLength, + }) + }, nil + }, + } + + echoTool := &trackingEchoTool{onExecute: func() { toolExecuted = true }} + agent := NewAgent( + mockModel, + WithTools(echoTool), + ) + + result, err := agent.Stream(context.Background(), AgentStreamCall{ + Prompt: "test", + }) + require.NoError(t, err) + require.Equal(t, FinishReasonLength, result.Response.FinishReason) + require.False(t, toolExecuted, "tool must not be dispatched when finish_reason is length") + require.Len(t, result.Steps, 1) +} + +// trackingEchoTool wraps EchoTool to track whether Run was called. +type trackingEchoTool struct { + onExecute func() + providerOptions ProviderOptions +} + +func (t *trackingEchoTool) Info() ToolInfo { + return (&EchoTool{}).Info() +} + +func (t *trackingEchoTool) Run(ctx context.Context, params ToolCall) (ToolResponse, error) { + if t.onExecute != nil { + t.onExecute() + } + return (&EchoTool{}).Run(ctx, params) +} + +func (t *trackingEchoTool) ProviderOptions() ProviderOptions { + return t.providerOptions +} + +func (t *trackingEchoTool) SetProviderOptions(opts ProviderOptions) { + t.providerOptions = opts +} diff --git a/providers/openai/language_model.go b/providers/openai/language_model.go index f9b03ff0c..9228fa353 100644 --- a/providers/openai/language_model.go +++ b/providers/openai/language_model.go @@ -270,15 +270,34 @@ func (o languageModel) Generate(ctx context.Context, call fantasy.Call) (*fantas extraContent := o.extraContentFunc(choice) content = append(content, extraContent...) } - for _, tc := range choice.Message.ToolCalls { - toolCallID := tc.ID - content = append(content, fantasy.ToolCallContent{ - ProviderExecuted: false, - ToolCallID: toolCallID, - ToolName: tc.Function.Name, - Input: tc.Function.Arguments, + + usage, providerMetadata := o.usageFunc(*response) + + mappedFinishReason := o.mapFinishReasonFunc(choice.FinishReason) + truncatedWithToolCalls := len(choice.Message.ToolCalls) > 0 && mappedFinishReason == fantasy.FinishReasonLength + if len(choice.Message.ToolCalls) > 0 && !truncatedWithToolCalls { + mappedFinishReason = fantasy.FinishReasonToolCalls + } + if truncatedWithToolCalls { + warnings = append(warnings, fantasy.CallWarning{ + Type: fantasy.CallWarningTypeOther, + Message: "tool calls were returned but the model hit the token limit; arguments may be truncated", }) } + + // Suppress truncated tool-call content so agents don't dispatch + // calls with incomplete arguments. + if !truncatedWithToolCalls { + for _, tc := range choice.Message.ToolCalls { + toolCallID := tc.ID + content = append(content, fantasy.ToolCallContent{ + ProviderExecuted: false, + ToolCallID: toolCallID, + ToolName: tc.Function.Name, + Input: tc.Function.Arguments, + }) + } + } for _, annotation := range choice.Message.Annotations { if annotation.Type == "url_citation" { content = append(content, fantasy.SourceContent{ @@ -290,12 +309,6 @@ func (o languageModel) Generate(ctx context.Context, call fantasy.Call) (*fantas } } - usage, providerMetadata := o.usageFunc(*response) - - mappedFinishReason := o.mapFinishReasonFunc(choice.FinishReason) - if len(choice.Message.ToolCalls) > 0 { - mappedFinishReason = fantasy.FinishReasonToolCalls - } return &fantasy.Response{ Content: content, Usage: usage, @@ -504,7 +517,22 @@ func (o languageModel) Stream(ctx context.Context, call fantasy.Call) (fantasy.S } } + // Evaluate the finish reason before emitting tool calls so we can + // suppress them when the response was truncated (finish_reason=length). + // Emitting partial tool calls causes agents to dispatch them with + // invalid arguments before seeing the terminal reason. + mappedFinishReason := o.mapFinishReasonFunc(finishReason) + if len(acc.Choices) > 0 { + choice := acc.Choices[0] + if len(choice.Message.ToolCalls) > 0 && mappedFinishReason != fantasy.FinishReasonLength { + mappedFinishReason = fantasy.FinishReasonToolCalls + } + } + truncatedWithToolCalls := mappedFinishReason == fantasy.FinishReasonLength && len(toolCalls) > 0 + // Finalize tool calls in index order after the stream completes. + // When truncated, skip ToolCall parts to prevent agents from + // dispatching calls with incomplete arguments. indices := make([]int64, 0, len(toolCalls)) for idx := range toolCalls { indices = append(indices, idx) @@ -521,8 +549,10 @@ func (o languageModel) Stream(ctx context.Context, call fantasy.Call) (fantasy.S return } } - if !yield(fantasy.StreamPart{Type: fantasy.StreamPartTypeToolCall, ID: tc.id, ToolCallName: tc.name, ToolCallInput: tc.arguments}) { - return + if !truncatedWithToolCalls { + if !yield(fantasy.StreamPart{Type: fantasy.StreamPartTypeToolCall, ID: tc.id, ToolCallName: tc.name, ToolCallInput: tc.arguments}) { + return + } } tc.hasFinished = true toolCalls[idx] = tc @@ -546,13 +576,6 @@ func (o languageModel) Stream(ctx context.Context, call fantasy.Call) (fantasy.S } } } - mappedFinishReason := o.mapFinishReasonFunc(finishReason) - if len(acc.Choices) > 0 { - choice := acc.Choices[0] - if len(choice.Message.ToolCalls) > 0 { - mappedFinishReason = fantasy.FinishReasonToolCalls - } - } // Truncated stream: upstream closed without finish_reason and we // can't infer a tool-call turn. Surface as a retryable error so // the retry middleware re-runs the step. @@ -567,6 +590,15 @@ func (o languageModel) Stream(ctx context.Context, call fantasy.Call) (fantasy.S }) return } + if truncatedWithToolCalls { + yield(fantasy.StreamPart{ + Type: fantasy.StreamPartTypeWarnings, + Warnings: []fantasy.CallWarning{{ + Type: fantasy.CallWarningTypeOther, + Message: "tool calls were returned but the model hit the token limit; arguments may be truncated", + }}, + }) + } yield(fantasy.StreamPart{ Type: fantasy.StreamPartTypeFinish, Usage: usage, diff --git a/providers/openai/openai_test.go b/providers/openai/openai_test.go index 1ee97495a..4a29f83c7 100644 --- a/providers/openai/openai_test.go +++ b/providers/openai/openai_test.go @@ -1290,6 +1290,102 @@ func TestDoGenerate(t *testing.T) { require.Equal(t, `{"value":"Spark"}`, toolCall.Input) }) + t.Run("should preserve finish_reason length when tool calls are present", func(t *testing.T) { + t.Parallel() + + server := newMockServer() + defer server.close() + + server.prepareJSONResponse(map[string]any{ + "finish_reason": "length", + "tool_calls": []map[string]any{ + { + "id": "call_truncated", + "type": "function", + "function": map[string]any{ + "name": "test-tool", + "arguments": `{"value":"trunc`, + }, + }, + }, + }) + + provider, err := New( + WithAPIKey("test-api-key"), + WithBaseURL(server.server.URL), + ) + require.NoError(t, err) + model, _ := provider.LanguageModel(t.Context(), "gpt-3.5-turbo") + + result, err := model.Generate(context.Background(), fantasy.Call{ + Prompt: testPrompt, + Tools: []fantasy.Tool{ + fantasy.FunctionTool{ + Name: "test-tool", + InputSchema: map[string]any{ + "type": "object", + "properties": map[string]any{"value": map[string]any{"type": "string"}}, + }, + }, + }, + }) + + require.NoError(t, err) + require.Equal(t, fantasy.FinishReasonLength, result.FinishReason) + require.NotEmpty(t, result.Warnings) + require.Contains(t, result.Warnings[0].Message, "token limit") + // Truncated tool calls must not appear in content so agents + // don't dispatch them with incomplete arguments. + for _, c := range result.Content { + require.NotEqual(t, fantasy.ContentTypeToolCall, c.GetType(), "truncated tool call should be suppressed") + } + }) + + t.Run("should override to tool_calls when finish_reason is stop", func(t *testing.T) { + t.Parallel() + + server := newMockServer() + defer server.close() + + server.prepareJSONResponse(map[string]any{ + "finish_reason": "stop", + "tool_calls": []map[string]any{ + { + "id": "call_ok", + "type": "function", + "function": map[string]any{ + "name": "test-tool", + "arguments": `{"value":"ok"}`, + }, + }, + }, + }) + + provider, err := New( + WithAPIKey("test-api-key"), + WithBaseURL(server.server.URL), + ) + require.NoError(t, err) + model, _ := provider.LanguageModel(t.Context(), "gpt-3.5-turbo") + + result, err := model.Generate(context.Background(), fantasy.Call{ + Prompt: testPrompt, + Tools: []fantasy.Tool{ + fantasy.FunctionTool{ + Name: "test-tool", + InputSchema: map[string]any{ + "type": "object", + "properties": map[string]any{"value": map[string]any{"type": "string"}}, + }, + }, + }, + }) + + require.NoError(t, err) + require.Equal(t, fantasy.FinishReasonToolCalls, result.FinishReason) + require.Empty(t, result.Warnings) + }) + t.Run("should handle ToolChoiceRequired", func(t *testing.T) { t.Parallel() @@ -3487,6 +3583,61 @@ func TestDoStream(t *testing.T) { require.NotNil(t, finish) require.Equal(t, fantasy.FinishReasonToolCalls, finish.FinishReason) }) + + t.Run("should preserve finish_reason length with tool calls during streaming", func(t *testing.T) { + t.Parallel() + + server := newStreamingMockServer() + defer server.close() + + server.chunks = []string{ + `data: {"id":"chatcmpl-truncated","object":"chat.completion.chunk","created":1,"model":"gpt-3.5-turbo","choices":[{"index":0,"delta":{"role":"assistant","tool_calls":[{"index":0,"id":"call_trunc","type":"function","function":{"name":"test-tool","arguments":""}}]},"finish_reason":null}]}` + "\n\n", + `data: {"id":"chatcmpl-truncated","object":"chat.completion.chunk","created":1,"model":"gpt-3.5-turbo","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"{\"val"}}]},"finish_reason":null}]}` + "\n\n", + `data: {"id":"chatcmpl-truncated","object":"chat.completion.chunk","created":1,"model":"gpt-3.5-turbo","choices":[{"index":0,"delta":{},"finish_reason":"length"}]}` + "\n\n", + "data: [DONE]\n\n", + } + + provider, err := New( + WithAPIKey("test-api-key"), + WithBaseURL(server.server.URL), + ) + require.NoError(t, err) + model, _ := provider.LanguageModel(t.Context(), "gpt-3.5-turbo") + + stream, err := model.Stream(context.Background(), fantasy.Call{ + Prompt: testPrompt, + Tools: []fantasy.Tool{fantasy.FunctionTool{ + Name: "test-tool", + InputSchema: map[string]any{ + "type": "object", + "properties": map[string]any{"val": map[string]any{"type": "string"}}, + }, + }}, + }) + require.NoError(t, err) + + parts, err := collectStreamParts(stream) + require.NoError(t, err) + + var finish *fantasy.StreamPart + var hasWarning bool + var toolCallCount int + for i, part := range parts { + if part.Type == fantasy.StreamPartTypeFinish { + finish = &parts[i] + } + if part.Type == fantasy.StreamPartTypeWarnings { + hasWarning = true + } + if part.Type == fantasy.StreamPartTypeToolCall { + toolCallCount++ + } + } + require.NotNil(t, finish) + require.Equal(t, fantasy.FinishReasonLength, finish.FinishReason) + require.True(t, hasWarning, "expected truncation warning") + require.Zero(t, toolCallCount, "truncated tool calls must not be emitted") + }) } func TestDefaultToPrompt_DropsEmptyMessages(t *testing.T) { @@ -5011,3 +5162,102 @@ func TestResponsesStream_TruncatedWithoutResponseCompleted(t *testing.T) { require.True(t, providerErr.IsRetryable()) require.ErrorIs(t, providerErr.Cause, io.ErrUnexpectedEOF) } + +func TestResponsesGenerate_TruncatedToolCalls(t *testing.T) { + t.Parallel() + + server := newMockServer() + defer server.close() + server.response = map[string]any{ + "id": "resp_trunc", + "object": "response", + "model": "gpt-4.1", + "output": []any{ + map[string]any{ + "type": "function_call", + "id": "fc_trunc", + "call_id": "call_trunc", + "name": "test-tool", + "arguments": `{"value":"trunc`, + "status": "completed", + }, + }, + "status": "incomplete", + "incomplete_details": map[string]any{"reason": "max_output_tokens"}, + "usage": map[string]any{ + "input_tokens": 10, + "output_tokens": 20, + "total_tokens": 30, + }, + } + + model := newResponsesProvider(t, server.server.URL) + + resp, err := model.Generate(context.Background(), fantasy.Call{ + Prompt: testPrompt, + Tools: []fantasy.Tool{fantasy.FunctionTool{ + Name: "test-tool", + InputSchema: map[string]any{ + "type": "object", + "properties": map[string]any{"value": map[string]any{"type": "string"}}, + }, + }}, + }) + require.NoError(t, err) + require.Equal(t, fantasy.FinishReasonLength, resp.FinishReason) + require.NotEmpty(t, resp.Warnings) + require.Contains(t, resp.Warnings[0].Message, "token limit") + for _, c := range resp.Content { + require.NotEqual(t, fantasy.ContentTypeToolCall, c.GetType(), "truncated tool call should be suppressed") + } +} + +func TestResponsesStream_TruncatedToolCalls(t *testing.T) { + t.Parallel() + + chunks := []string{ + responsesSSEEvent("response.created", `{"type":"response.created","response":{"id":"resp_trunc","status":"in_progress","output":[]}}`), + responsesSSEEvent("response.output_item.added", `{"type":"response.output_item.added","output_index":0,"item":{"type":"function_call","id":"fc_trunc","call_id":"call_trunc","name":"test-tool","status":"in_progress","arguments":""}}`), + responsesSSEEvent("response.function_call_arguments.delta", `{"type":"response.function_call_arguments.delta","output_index":0,"delta":"{\"value\":\"tr"}`), + responsesSSEEvent("response.output_item.done", `{"type":"response.output_item.done","output_index":0,"item":{"type":"function_call","id":"fc_trunc","call_id":"call_trunc","name":"test-tool","status":"completed","arguments":"{\"value\":\"tr"}}`), + responsesSSEEvent("response.incomplete", `{"type":"response.incomplete","response":{"id":"resp_trunc","status":"incomplete","output":[],"incomplete_details":{"reason":"max_output_tokens"},"usage":{"input_tokens":10,"output_tokens":20,"total_tokens":30}}}`), + } + + sms := newStreamingMockServer() + defer sms.close() + sms.chunks = chunks + + model := newResponsesProvider(t, sms.server.URL) + + stream, err := model.Stream(context.Background(), fantasy.Call{ + Prompt: testPrompt, + Tools: []fantasy.Tool{fantasy.FunctionTool{ + Name: "test-tool", + InputSchema: map[string]any{ + "type": "object", + "properties": map[string]any{"val": map[string]any{"type": "string"}}, + }, + }}, + }) + require.NoError(t, err) + + var parts []fantasy.StreamPart + stream(func(part fantasy.StreamPart) bool { + parts = append(parts, part) + return true + }) + + var finish *fantasy.StreamPart + var hasWarning bool + for i, part := range parts { + if part.Type == fantasy.StreamPartTypeFinish { + finish = &parts[i] + } + if part.Type == fantasy.StreamPartTypeWarnings { + hasWarning = true + } + } + require.NotNil(t, finish) + require.Equal(t, fantasy.FinishReasonLength, finish.FinishReason) + require.True(t, hasWarning, "expected truncation warning") +} diff --git a/providers/openai/responses_language_model.go b/providers/openai/responses_language_model.go index 77ac84539..72ea3a18e 100644 --- a/providers/openai/responses_language_model.go +++ b/providers/openai/responses_language_model.go @@ -794,6 +794,7 @@ func (o responsesLanguageModel) Generate(ctx context.Context, call fantasy.Call) var content []fantasy.Content hasFunctionCall := false + var pendingFunctionCalls []fantasy.ToolCallContent for _, outputItem := range response.Output { switch outputItem.Type { @@ -836,7 +837,7 @@ func (o responsesLanguageModel) Generate(ctx context.Context, call fantasy.Call) case "function_call": hasFunctionCall = true - content = append(content, fantasy.ToolCallContent{ + pendingFunctionCalls = append(pendingFunctionCalls, fantasy.ToolCallContent{ ProviderExecuted: false, ToolCallID: outputItem.CallID, ToolName: outputItem.Name, @@ -898,6 +899,17 @@ func (o responsesLanguageModel) Generate(ctx context.Context, call fantasy.Call) usage := responsesUsage(*response) finishReason := mapResponsesFinishReason(response.IncompleteDetails.Reason, hasFunctionCall) + truncatedWithToolCalls := hasFunctionCall && finishReason == fantasy.FinishReasonLength + if truncatedWithToolCalls { + warnings = append(warnings, fantasy.CallWarning{ + Type: fantasy.CallWarningTypeOther, + Message: "tool calls were returned but the model hit the token limit; arguments may be truncated", + }) + } else { + for _, tc := range pendingFunctionCalls { + content = append(content, tc) + } + } return &fantasy.Response{ Content: content, @@ -909,12 +921,15 @@ func (o responsesLanguageModel) Generate(ctx context.Context, call fantasy.Call) } func mapResponsesFinishReason(reason string, hasFunctionCall bool) fantasy.FinishReason { - if hasFunctionCall { + if hasFunctionCall && reason != "max_tokens" && reason != "max_output_tokens" { return fantasy.FinishReasonToolCalls } switch reason { case "": + if hasFunctionCall { + return fantasy.FinishReasonToolCalls + } return fantasy.FinishReasonStop case "max_tokens", "max_output_tokens": return fantasy.FinishReasonLength @@ -1257,6 +1272,16 @@ func (o responsesLanguageModel) Stream(ctx context.Context, call fantasy.Call) ( return } + if hasFunctionCall && finishReason == fantasy.FinishReasonLength { + yield(fantasy.StreamPart{ + Type: fantasy.StreamPartTypeWarnings, + Warnings: []fantasy.CallWarning{{ + Type: fantasy.CallWarningTypeOther, + Message: "tool calls were returned but the model hit the token limit; arguments may be truncated", + }}, + }) + } + yield(fantasy.StreamPart{ Type: fantasy.StreamPartTypeFinish, Usage: usage, From f06034c7824ffddc4394d4cefa5ed5132a186b1b Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Mon, 24 Aug 2026 17:26:28 -0300 Subject: [PATCH 084/156] v0.41.3 --- version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.txt b/version.txt index 6599454d4..ef4ae97fb 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -0.41.2 +0.41.3 From 722b32af8ab920c75c5f91bccc4a9a12055c9ace Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Fri, 28 Aug 2026 11:08:51 -0300 Subject: [PATCH 085/156] fix: stop dropping reasoning on deepseek-shaped streams A "reasoning_content": null chunk (which DeepSeek, vLLM and SGLang send on every content/tool-call/finish delta) counted as a reasoning field since #333, so the reasoning block never closed on those streams and the accumulated chain-of-thought never made it into the agent's step content. The next request then went out without reasoning_content on tool-call turns, which DeepSeek's API rejects with a 400 and other hosts answer by re-issuing the same tool call (charm#2696, CHARM-2020). - hasReasoningField: a null value is "no reasoning in this delta", not reasoning; only JSON strings (including "") count. - StreamExtraFunc: close the reasoning block on every boundary (content, tool calls, finish_reason), skip empty deltas instead of emitting phantom ReasoningDelta("") events, and never reopen a block on a null field once closed. A batched chunk carrying both the reasoning tail and the first tool-call delta now delivers both. - replay_test.go: httptest replay harness + fixtures A.1-A.5 from CHARM-2020, including a full agent round-trip asserting the second request carries reasoning_content byte-for-byte. Assisted-by: Crush:kimi-k3 --- .../openaicompat/language_model_hooks.go | 73 ++- providers/openaicompat/provider_options.go | 16 +- providers/openaicompat/replay_test.go | 472 ++++++++++++++++++ 3 files changed, 532 insertions(+), 29 deletions(-) create mode 100644 providers/openaicompat/replay_test.go diff --git a/providers/openaicompat/language_model_hooks.go b/providers/openaicompat/language_model_hooks.go index 9248b998d..b98d19ff8 100644 --- a/providers/openaicompat/language_model_hooks.go +++ b/providers/openaicompat/language_model_hooks.go @@ -13,7 +13,10 @@ import ( "github.com/openai/openai-go/v3/shared" ) -const reasoningStartedCtx = "reasoning_started" +const ( + reasoningStartedCtx = "reasoning_started" + reasoningEndedCtx = "reasoning_ended" +) // buildTextBlock creates a text content block, applying any provider-specific extra // fields (e.g. Qwen's cache_control) onto it. Part-level fields override message-level @@ -88,12 +91,12 @@ func ExtraContentFunc(choice openaisdk.ChatCompletionChoice) []fantasy.Content { return content } -func extractReasoningContext(ctx map[string]any) bool { - reasoningStarted, ok := ctx[reasoningStartedCtx] +func ctxBool(ctx map[string]any, key string) bool { + v, ok := ctx[key] if !ok { return false } - b, ok := reasoningStarted.(bool) + b, ok := v.(bool) if !ok { return false } @@ -106,7 +109,8 @@ func StreamExtraFunc(chunk openaisdk.ChatCompletionChunk, yield func(fantasy.Str return ctx, true } - reasoningStarted := extractReasoningContext(ctx) + reasoningStarted := ctxBool(ctx, reasoningStartedCtx) + reasoningEnded := ctxBool(ctx, reasoningEndedCtx) for inx, choice := range chunk.Choices { reasoningData := ReasoningData{} @@ -119,35 +123,56 @@ func StreamExtraFunc(chunk openaisdk.ChatCompletionChunk, yield func(fantasy.Str return ctx, false } - emitEvent := func(reasoningContent string) bool { + rc := reasoningData.GetReasoningContent() + hasField := hasReasoningField(choice.Delta.RawJSON()) + boundary := choice.Delta.Content != "" || len(choice.Delta.ToolCalls) > 0 || choice.FinishReason != "" + + // A reasoning delta carries non-empty reasoning text, or a + // present-but-empty field on a chunk that carries nothing else before + // any block was closed (Kimi's "thinking on, nothing to think" + // shape). A boundary chunk whose reasoning field is empty/null is + // never reasoning. + if rc != "" || (hasField && !boundary && !reasoningEnded) { if !reasoningStarted { - shouldContinue := yield(fantasy.StreamPart{ + reasoningStarted = true + ctx[reasoningStartedCtx] = true + if !yield(fantasy.StreamPart{ Type: fantasy.StreamPartTypeReasoningStart, ID: fmt.Sprintf("%d", inx), - }) - if !shouldContinue { - return false + }) { + return ctx, false } } - - return yield(fantasy.StreamPart{ - Type: fantasy.StreamPartTypeReasoningDelta, - ID: fmt.Sprintf("%d", inx), - Delta: reasoningContent, - }) - } - if rc := reasoningData.GetReasoningContent(); rc != "" || hasReasoningField(choice.Delta.RawJSON()) { - if !reasoningStarted { - ctx[reasoningStartedCtx] = true + // Skip empty deltas: a present-but-empty field opens the block so + // it replays as reasoning_content: "", but there is nothing to + // stream. + if rc != "" { + if !yield(fantasy.StreamPart{ + Type: fantasy.StreamPartTypeReasoningDelta, + ID: fmt.Sprintf("%d", inx), + Delta: rc, + }) { + return ctx, false + } } - return ctx, emitEvent(rc) + // Fall through: a batching host may put the reasoning tail and the + // first content/tool-call token in the same delta. } - if reasoningStarted && (choice.Delta.Content != "" || len(choice.Delta.ToolCalls) > 0) { + if reasoningStarted && boundary { + reasoningStarted = false ctx[reasoningStartedCtx] = false - return ctx, yield(fantasy.StreamPart{ + ctx[reasoningEndedCtx] = true + reasoningEnded = true + // The openai main loop emits a chunk's text/tool-call parts before + // this hook runs, so on a batched boundary chunk the part order is + // ToolInputStart, ReasoningDelta(tail), ReasoningEnd. Parts are + // keyed by id, so consumers can still attribute them correctly. + if !yield(fantasy.StreamPart{ Type: fantasy.StreamPartTypeReasoningEnd, ID: fmt.Sprintf("%d", inx), - }) + }) { + return ctx, false + } } } return ctx, true diff --git a/providers/openaicompat/provider_options.go b/providers/openaicompat/provider_options.go index 78da7d84d..a0d8160a7 100644 --- a/providers/openaicompat/provider_options.go +++ b/providers/openaicompat/provider_options.go @@ -2,6 +2,7 @@ package openaicompat import ( + "bytes" "encoding/json" "charm.land/fantasy" @@ -55,17 +56,22 @@ func (r ReasoningData) GetReasoningContent() string { } // hasReasoningField reports whether raw JSON contains a reasoning field -// ("reasoning_content" or "reasoning"), even when its value is empty. +// ("reasoning_content" or "reasoning") whose value is a JSON string, +// including the empty string. A null value means "no reasoning in this +// delta": DeepSeek, vLLM and SGLang put "reasoning_content": null on every +// content/tool-call/finish chunk, and counting that as reasoning keeps the +// block open forever. func hasReasoningField(rawJSON string) bool { var fields map[string]json.RawMessage if err := json.Unmarshal([]byte(rawJSON), &fields); err != nil { return false } - if _, ok := fields["reasoning_content"]; ok { - return true + for _, key := range []string{"reasoning_content", "reasoning"} { + if v, ok := fields[key]; ok && !bytes.Equal(bytes.TrimSpace(v), []byte("null")) { + return true + } } - _, ok := fields["reasoning"] - return ok + return false } // Options implements the ProviderOptions interface. diff --git a/providers/openaicompat/replay_test.go b/providers/openaicompat/replay_test.go new file mode 100644 index 000000000..a56521f21 --- /dev/null +++ b/providers/openaicompat/replay_test.go @@ -0,0 +1,472 @@ +package openaicompat + +import ( + "context" + "encoding/json" + "fmt" + "io" + "net/http" + "net/http/httptest" + "strings" + "testing" + + "charm.land/fantasy" + "github.com/stretchr/testify/require" +) + +// serveSSE returns an httptest server that answers streaming POSTs with the +// given SSE payloads in order (one per request), flushing after each event. +// It records every request body it receives. The special marker line +// "" hijacks and closes the connection without a [DONE]. +// Non-streaming requests get a canned JSON chat.completion reply. +func serveSSE(t *testing.T, payloads ...string) (*httptest.Server, *[][]byte) { + t.Helper() + var bodies [][]byte + var calls int + srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + body, err := io.ReadAll(r.Body) + require.NoError(t, err) + bodies = append(bodies, body) + + var reqShape struct { + Stream bool `json:"stream"` + } + _ = json.Unmarshal(body, &reqShape) + if !reqShape.Stream { + w.Header().Set("Content-Type", "application/json") + _, _ = fmt.Fprint(w, `{"id":"y","created":1,"model":"deepseek-v4-flash","object":"chat.completion","choices":[{"index":0,"message":{"role":"assistant","content":"The date is 2026-08-28."},"finish_reason":"stop"}],"usage":{"prompt_tokens":200,"completion_tokens":10,"total_tokens":210}}`) + return + } + + payload := payloads[min(calls, len(payloads)-1)] + calls++ + + w.Header().Set("Content-Type", "text/event-stream") + rc := http.NewResponseController(w) + for event := range strings.Lines(payload) { + if strings.TrimSpace(event) == "" { + _ = rc.Flush() + hj, ok := w.(http.Hijacker) + if !ok { + return + } + conn, _, err := hj.Hijack() + if err != nil { + return + } + _ = conn.Close() + return + } + if strings.TrimSpace(event) == "" { + continue + } + fmt.Fprintf(w, "data: %s\n\n", strings.TrimSpace(event)) + _ = rc.Flush() + } + _, _ = fmt.Fprint(w, "data: [DONE]\n\n") + _ = rc.Flush() + })) + t.Cleanup(srv.Close) + return srv, &bodies +} + +func streamParts(t *testing.T, lm fantasy.LanguageModel, prompt fantasy.Prompt) []fantasy.StreamPart { + t.Helper() + stream, err := lm.Stream(context.Background(), fantasy.Call{Prompt: prompt}) + require.NoError(t, err) + var parts []fantasy.StreamPart + for part := range stream { + parts = append(parts, part) + } + return parts +} + +func partTypes(parts []fantasy.StreamPart) []fantasy.StreamPartType { + types := make([]fantasy.StreamPartType, 0, len(parts)) + for _, p := range parts { + types = append(types, p.Type) + } + return types +} + +// countParts counts parts of a type; for reasoning deltas it also +// concatenates the deltas. +func reasoningText(parts []fantasy.StreamPart) string { + var sb strings.Builder + for _, p := range parts { + if p.Type == fantasy.StreamPartTypeReasoningDelta { + sb.WriteString(p.Delta) + } + } + return sb.String() +} + +func countType(parts []fantasy.StreamPart, typ fantasy.StreamPartType) int { + n := 0 + for _, p := range parts { + if p.Type == typ { + n++ + } + } + return n +} + +// A.1 from CHARM-2020: DeepSeek-shaped thinking + tool call. Every delta +// carries both keys; non-reasoning chunks have "reasoning_content": null. +const deepseekThinkingToolCallSSE = `{"id":"x","created":1,"model":"deepseek-v4-flash","choices":[{"index":0,"delta":{"role":"assistant","content":"","reasoning_content":null},"finish_reason":null}]} +{"id":"x","created":1,"model":"deepseek-v4-flash","choices":[{"index":0,"delta":{"content":null,"reasoning_content":"The user wants the date."},"finish_reason":null}]} +{"id":"x","created":1,"model":"deepseek-v4-flash","choices":[{"index":0,"delta":{"content":null,"reasoning_content":" I'll call get_date."},"finish_reason":null}]} +{"id":"x","created":1,"model":"deepseek-v4-flash","choices":[{"index":0,"delta":{"content":"Let me check.","reasoning_content":null},"finish_reason":null}]} +{"id":"x","created":1,"model":"deepseek-v4-flash","choices":[{"index":0,"delta":{"content":null,"reasoning_content":null,"tool_calls":[{"index":0,"id":"call_00_abc","type":"function","function":{"name":"get_date","arguments":""}}]},"finish_reason":null}]} +{"id":"x","created":1,"model":"deepseek-v4-flash","choices":[{"index":0,"delta":{"content":null,"reasoning_content":null,"tool_calls":[{"index":0,"function":{"arguments":"{}"}}]},"finish_reason":null}]} +{"id":"x","created":1,"model":"deepseek-v4-flash","choices":[{"index":0,"delta":{"content":"","reasoning_content":null},"finish_reason":"tool_calls"}]} +{"id":"x","created":1,"model":"deepseek-v4-flash","choices":[],"usage":{"prompt_tokens":120,"completion_tokens":40,"total_tokens":160}}` + +const cannedStopReplySSE = `{"id":"y","created":1,"model":"deepseek-v4-flash","choices":[{"index":0,"delta":{"role":"assistant","content":"The date is 2026-08-28."},"finish_reason":null}]} +{"id":"y","created":1,"model":"deepseek-v4-flash","choices":[{"index":0,"delta":{},"finish_reason":"stop"}]} +{"id":"y","created":1,"model":"deepseek-v4-flash","choices":[],"usage":{"prompt_tokens":200,"completion_tokens":10,"total_tokens":210}}` + +// TestReplay_DeepSeekThinkingToolCall drives fixture A.1 through a real +// openaicompat model and asserts the reasoning block survives end-to-end: +// exactly one ReasoningStart, the concatenated deltas, exactly one +// ReasoningEnd before Finish, and no empty ReasoningDeltas. +func TestReplay_DeepSeekThinkingToolCall(t *testing.T) { + srv, _ := serveSSE(t, deepseekThinkingToolCallSSE) + provider, err := New(WithBaseURL(srv.URL), WithAPIKey("x")) + require.NoError(t, err) + lm, err := provider.LanguageModel(context.Background(), "deepseek-v4-flash") + require.NoError(t, err) + + parts := streamParts(t, lm, fantasy.Prompt{ + {Role: fantasy.MessageRoleUser, Content: []fantasy.MessagePart{fantasy.TextPart{Text: "date?"}}}, + }) + + require.Equal(t, 1, countType(parts, fantasy.StreamPartTypeReasoningStart), "types: %v", partTypes(parts)) + require.Equal(t, 1, countType(parts, fantasy.StreamPartTypeReasoningEnd), "types: %v", partTypes(parts)) + require.Equal(t, "The user wants the date. I'll call get_date.", reasoningText(parts)) + for _, p := range parts { + if p.Type == fantasy.StreamPartTypeReasoningDelta { + require.NotEmpty(t, p.Delta, "empty ReasoningDelta emitted") + } + } + // ReasoningEnd must come before Finish. + endIdx, finishIdx := -1, -1 + for i, p := range parts { + if p.Type == fantasy.StreamPartTypeReasoningEnd { + endIdx = i + } + if p.Type == fantasy.StreamPartTypeFinish { + finishIdx = i + } + } + require.Greater(t, endIdx, -1) + require.Greater(t, finishIdx, endIdx, "ReasoningEnd must precede Finish: %v", partTypes(parts)) + require.Equal(t, 1, countType(parts, fantasy.StreamPartTypeToolCall), "types: %v", partTypes(parts)) +} + +// TestReplay_DeepSeekReasoningRoundTripsToNextRequest is the regression test +// for crush#2696 / CHARM-2020: the reasoning the model produced must be sent +// back, byte-equal, on the assistant message carrying tool_calls in the next +// request. We drive two steps manually (no agent) to keep the harness small. +func TestReplay_DeepSeekReasoningRoundTripsToNextRequest(t *testing.T) { + srv, bodies := serveSSE(t, deepseekThinkingToolCallSSE, cannedStopReplySSE) + provider, err := New(WithBaseURL(srv.URL), WithAPIKey("x")) + require.NoError(t, err) + lm, err := provider.LanguageModel(context.Background(), "deepseek-v4-flash") + require.NoError(t, err) + + // Step 1: collect reasoning + tool call from the stream. + parts := streamParts(t, lm, fantasy.Prompt{ + {Role: fantasy.MessageRoleUser, Content: []fantasy.MessagePart{fantasy.TextPart{Text: "date?"}}}, + }) + reasoning := reasoningText(parts) + require.NotEmpty(t, reasoning) + var toolCall *fantasy.StreamPart + for i, p := range parts { + if p.Type == fantasy.StreamPartTypeToolCall { + toolCall = &parts[i] + } + } + require.NotNil(t, toolCall, "types: %v", partTypes(parts)) + + // Step 2: replay the assistant message the way a faithful client would + // and assert on the request body the provider sends upstream. Non-stream + // so the server answers with JSON. + resp, err := lm.Generate(context.Background(), fantasy.Call{Prompt: fantasy.Prompt{ + {Role: fantasy.MessageRoleUser, Content: []fantasy.MessagePart{fantasy.TextPart{Text: "date?"}}}, + {Role: fantasy.MessageRoleAssistant, Content: []fantasy.MessagePart{ + fantasy.ReasoningPart{Text: reasoning}, + fantasy.TextPart{Text: "Let me check."}, + fantasy.ToolCallPart{ToolCallID: toolCall.ID, ToolName: toolCall.ToolCallName, Input: toolCall.ToolCallInput}, + }}, + {Role: fantasy.MessageRoleTool, Content: []fantasy.MessagePart{ + fantasy.ToolResultPart{ToolCallID: toolCall.ID, Output: fantasy.ToolResultOutputContentText{Text: "2026-08-28"}}, + }}, + }}) + require.NoError(t, err) + require.NotNil(t, resp) + + require.Len(t, *bodies, 2) + var second struct { + Messages []struct { + Role string `json:"role"` + ReasoningContent *string `json:"reasoning_content"` + ToolCalls []struct { + ID string `json:"id"` + Function struct { + Name string `json:"name"` + Arguments string `json:"arguments"` + } `json:"function"` + } `json:"tool_calls"` + } `json:"messages"` + } + require.NoError(t, json.Unmarshal((*bodies)[1], &second)) + var assistant *struct { + Role string `json:"role"` + ReasoningContent *string `json:"reasoning_content"` + ToolCalls []struct { + ID string `json:"id"` + Function struct { + Name string `json:"name"` + Arguments string `json:"arguments"` + } `json:"function"` + } `json:"tool_calls"` + } + for i := range second.Messages { + if second.Messages[i].Role == "assistant" { + assistant = &second.Messages[i] + } + } + require.NotNil(t, assistant) + require.NotNil(t, assistant.ReasoningContent, "reasoning_content missing on replayed assistant message: %s", (*bodies)[1]) + require.Equal(t, reasoning, *assistant.ReasoningContent, "reasoning_content must round-trip byte-for-byte") + require.Len(t, assistant.ToolCalls, 1) + require.Equal(t, "call_00_abc", assistant.ToolCalls[0].ID) + require.Equal(t, "get_date", assistant.ToolCalls[0].Function.Name) + require.Equal(t, "{}", assistant.ToolCalls[0].Function.Arguments) +} + +// A.2: reasoning-only response truncated by length. ReasoningEnd must still +// be emitted (on the finish chunk) and the reasoning kept. +const deepseekReasoningOnlyLengthSSE = `{"id":"x","created":1,"model":"deepseek-v4-flash","choices":[{"index":0,"delta":{"role":"assistant","content":"","reasoning_content":null},"finish_reason":null}]} +{"id":"x","created":1,"model":"deepseek-v4-flash","choices":[{"index":0,"delta":{"content":null,"reasoning_content":"Thinking about it"},"finish_reason":null}]} +{"id":"x","created":1,"model":"deepseek-v4-flash","choices":[{"index":0,"delta":{"content":null,"reasoning_content":" at length…"},"finish_reason":null}]} +{"id":"x","created":1,"model":"deepseek-v4-flash","choices":[{"index":0,"delta":{"content":"","reasoning_content":null},"finish_reason":"length"}]}` + +func TestReplay_DeepSeekReasoningOnlyTruncated(t *testing.T) { + srv, _ := serveSSE(t, deepseekReasoningOnlyLengthSSE) + provider, err := New(WithBaseURL(srv.URL), WithAPIKey("x")) + require.NoError(t, err) + lm, err := provider.LanguageModel(context.Background(), "deepseek-v4-flash") + require.NoError(t, err) + + parts := streamParts(t, lm, fantasy.Prompt{ + {Role: fantasy.MessageRoleUser, Content: []fantasy.MessagePart{fantasy.TextPart{Text: "hi"}}}, + }) + require.Equal(t, "Thinking about it at length…", reasoningText(parts)) + require.Equal(t, 1, countType(parts, fantasy.StreamPartTypeReasoningEnd), "types: %v", partTypes(parts)) + var finish *fantasy.StreamPart + for i, p := range parts { + if p.Type == fantasy.StreamPartTypeFinish { + finish = &parts[i] + } + } + require.NotNil(t, finish) + require.Equal(t, fantasy.FinishReasonLength, finish.FinishReason) +} + +// A.3: a batching host puts the reasoning tail and the whole tool call in +// one delta. The reasoning must be kept and the tool call intact. +const deepseekBatchedBoundarySSE = `{"id":"x","created":1,"model":"deepseek-v4-flash","choices":[{"index":0,"delta":{"content":null,"reasoning_content":"Need the date."},"finish_reason":null}]} +{"id":"x","created":1,"model":"deepseek-v4-flash","choices":[{"index":0,"delta":{"content":null,"reasoning_content":" Calling.","tool_calls":[{"index":0,"id":"call_00_x","type":"function","function":{"name":"get_date","arguments":"{}"}}]},"finish_reason":null}]} +{"id":"x","created":1,"model":"deepseek-v4-flash","choices":[{"index":0,"delta":{"content":"","reasoning_content":null},"finish_reason":"tool_calls"}]}` + +func TestReplay_DeepSeekBatchedBoundaryChunk(t *testing.T) { + srv, _ := serveSSE(t, deepseekBatchedBoundarySSE) + provider, err := New(WithBaseURL(srv.URL), WithAPIKey("x")) + require.NoError(t, err) + lm, err := provider.LanguageModel(context.Background(), "deepseek-v4-flash") + require.NoError(t, err) + + parts := streamParts(t, lm, fantasy.Prompt{ + {Role: fantasy.MessageRoleUser, Content: []fantasy.MessagePart{fantasy.TextPart{Text: "date?"}}}, + }) + require.Equal(t, "Need the date. Calling.", reasoningText(parts)) + require.Equal(t, 1, countType(parts, fantasy.StreamPartTypeToolCall), "types: %v", partTypes(parts)) +} + +// A.5: Kimi/Avian shape. Reasoning chunks carry reasoning_content, content +// chunks omit the key, the finish chunk has "reasoning_content": null — +// which must not reopen a reasoning block. +const kimiShapeSSE = `{"id":"x","created":1,"model":"kimi","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"first"},"finish_reason":null}]} +{"id":"x","created":1,"model":"kimi","choices":[{"index":0,"delta":{"reasoning_content":" second"},"finish_reason":null}]} +{"id":"x","created":1,"model":"kimi","choices":[{"index":0,"delta":{"content":"answer"},"finish_reason":null}]} +{"id":"x","created":1,"model":"kimi","choices":[{"index":0,"delta":{"reasoning_content":null},"finish_reason":"stop"}]}` + +func TestReplay_KimiNullFinishDoesNotReopen(t *testing.T) { + srv, _ := serveSSE(t, kimiShapeSSE) + provider, err := New(WithBaseURL(srv.URL), WithAPIKey("x")) + require.NoError(t, err) + lm, err := provider.LanguageModel(context.Background(), "kimi") + require.NoError(t, err) + + parts := streamParts(t, lm, fantasy.Prompt{ + {Role: fantasy.MessageRoleUser, Content: []fantasy.MessagePart{fantasy.TextPart{Text: "hi"}}}, + }) + require.Equal(t, "first second", reasoningText(parts)) + require.Equal(t, 1, countType(parts, fantasy.StreamPartTypeReasoningStart), "types: %v", partTypes(parts)) + require.Equal(t, 1, countType(parts, fantasy.StreamPartTypeReasoningEnd), "types: %v", partTypes(parts)) + for _, p := range parts { + if p.Type == fantasy.StreamPartTypeReasoningDelta { + require.NotEmpty(t, p.Delta, "empty ReasoningDelta emitted (phantom block reopened)") + } + } +} + +// Kimi present-but-empty: a chunk with "reasoning_content": "" before any +// content starts an (empty) reasoning block that closes on the first +// tool-call chunk and replays as "reasoning_content": "". +const kimiEmptyReasoningSSE = `{"id":"x","created":1,"model":"kimi","choices":[{"index":0,"delta":{"role":"assistant","content":"","reasoning_content":""},"finish_reason":null}]} +{"id":"x","created":1,"model":"kimi","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"id":"call_1","type":"function","function":{"name":"f","arguments":"{}"}}]},"finish_reason":null}]} +{"id":"x","created":1,"model":"kimi","choices":[{"index":0,"delta":{},"finish_reason":"tool_calls"}]}` + +func TestReplay_KimiPresentButEmpty(t *testing.T) { + srv, _ := serveSSE(t, kimiEmptyReasoningSSE) + provider, err := New(WithBaseURL(srv.URL), WithAPIKey("x")) + require.NoError(t, err) + lm, err := provider.LanguageModel(context.Background(), "kimi") + require.NoError(t, err) + + parts := streamParts(t, lm, fantasy.Prompt{ + {Role: fantasy.MessageRoleUser, Content: []fantasy.MessagePart{fantasy.TextPart{Text: "hi"}}}, + }) + require.Equal(t, 1, countType(parts, fantasy.StreamPartTypeReasoningStart), "types: %v", partTypes(parts)) + require.Equal(t, 1, countType(parts, fantasy.StreamPartTypeReasoningEnd), "types: %v", partTypes(parts)) + for _, p := range parts { + if p.Type == fantasy.StreamPartTypeReasoningDelta { + require.NotEmpty(t, p.Delta, "empty ReasoningDelta emitted") + } + } +} + +// A.4: a stream cut mid-arguments with no finish_reason and no [DONE] must +// not surface a complete ToolCall: truncated arguments must never be +// dispatched. +const deepseekCutMidArgumentsSSE = `{"id":"x","created":1,"model":"deepseek-v4-flash","choices":[{"index":0,"delta":{"content":null,"reasoning_content":"Write the file."},"finish_reason":null}]} +{"id":"x","created":1,"model":"deepseek-v4-flash","choices":[{"index":0,"delta":{"content":null,"reasoning_content":null,"tool_calls":[{"index":0,"id":"call_00_y","type":"function","function":{"name":"write","arguments":""}}]},"finish_reason":null}]} +{"id":"x","created":1,"model":"deepseek-v4-flash","choices":[{"index":0,"delta":{"content":null,"reasoning_content":null,"tool_calls":[{"index":0,"function":{"arguments":"{\"path\":\"main.go\",\"content\":\"package ma"}}]},"finish_reason":null}]} +` + +func TestReplay_CutStreamMidArguments_NotDispatched(t *testing.T) { + srv, _ := serveSSE(t, deepseekCutMidArgumentsSSE) + provider, err := New(WithBaseURL(srv.URL), WithAPIKey("x")) + require.NoError(t, err) + lm, err := provider.LanguageModel(context.Background(), "deepseek-v4-flash") + require.NoError(t, err) + + parts := streamParts(t, lm, fantasy.Prompt{ + {Role: fantasy.MessageRoleUser, Content: []fantasy.MessagePart{fantasy.TextPart{Text: "write main.go"}}}, + }) + require.Equal(t, 0, countType(parts, fantasy.StreamPartTypeToolCall), + "truncated tool call must not be dispatched; types: %v", partTypes(parts)) + var sawIncomplete bool + for _, p := range parts { + if p.Type == fantasy.StreamPartTypeError { + sawIncomplete = true + } + } + require.True(t, sawIncomplete, "expected an error part (IncompleteStreamError), types: %v", partTypes(parts)) +} + +// TestReplay_AgentReasoningRoundTrip is the regression test for crush#2696 +// and the client-side half of CHARM-2020: drive fixture A.1 through a real +// agent (the loop Crush runs), let it dispatch the tool, and assert on the +// SECOND request body — the assistant message carrying tool_calls must +// carry reasoning_content byte-equal to the concatenated reasoning deltas. +func TestReplay_AgentReasoningRoundTrip(t *testing.T) { + srv, bodies := serveSSE(t, deepseekThinkingToolCallSSE, cannedStopReplySSE) + provider, err := New(WithBaseURL(srv.URL), WithAPIKey("x")) + require.NoError(t, err) + lm, err := provider.LanguageModel(context.Background(), "deepseek-v4-flash") + require.NoError(t, err) + + var invocations []string + getDate := fantasy.NewAgentTool( + "get_date", + "Get the current date.", + func(_ context.Context, _ struct{}, _ fantasy.ToolCall) (fantasy.ToolResponse, error) { + invocations = append(invocations, "get_date") + return fantasy.NewTextResponse("2026-08-28"), nil + }, + ) + + agent := fantasy.NewAgent(lm, fantasy.WithTools(getDate)) + result, err := agent.Stream(context.Background(), fantasy.AgentStreamCall{Prompt: "what's the date?"}) + require.NoError(t, err) + require.NotNil(t, result) + require.Equal(t, []string{"get_date"}, invocations) + + require.Len(t, *bodies, 2) + var second struct { + Messages []struct { + Role string `json:"role"` + ReasoningContent *string `json:"reasoning_content"` + ToolCalls []struct { + ID string `json:"id"` + Function struct { + Name string `json:"name"` + Arguments string `json:"arguments"` + } `json:"function"` + } `json:"tool_calls"` + } `json:"messages"` + } + require.NoError(t, json.Unmarshal((*bodies)[1], &second)) + var assistant *struct { + Role string `json:"role"` + ReasoningContent *string `json:"reasoning_content"` + ToolCalls []struct { + ID string `json:"id"` + Function struct { + Name string `json:"name"` + Arguments string `json:"arguments"` + } `json:"function"` + } `json:"tool_calls"` + } + for i := range second.Messages { + if second.Messages[i].Role == "assistant" { + assistant = &second.Messages[i] + } + } + require.NotNil(t, assistant, "no assistant message in second request: %s", (*bodies)[1]) + require.NotNil(t, assistant.ReasoningContent, + "reasoning_content missing on the agent's replayed assistant message — DeepSeek 400s this and other hosts loop: %s", (*bodies)[1]) + require.Equal(t, "The user wants the date. I'll call get_date.", *assistant.ReasoningContent) + require.Len(t, assistant.ToolCalls, 1) + require.Equal(t, "call_00_abc", assistant.ToolCalls[0].ID) + require.Equal(t, "{}", assistant.ToolCalls[0].Function.Arguments) +} + +// A.2 at agent level: a reasoning-only response truncated by length. The +// agent must surface the reasoning content in the step even though the +// provider can only close the block on the finish chunk. +func TestReplay_AgentReasoningOnlyTruncated(t *testing.T) { + srv, _ := serveSSE(t, deepseekReasoningOnlyLengthSSE) + provider, err := New(WithBaseURL(srv.URL), WithAPIKey("x")) + require.NoError(t, err) + lm, err := provider.LanguageModel(context.Background(), "deepseek-v4-flash") + require.NoError(t, err) + + agent := fantasy.NewAgent(lm) + result, err := agent.Stream(context.Background(), fantasy.AgentStreamCall{Prompt: "think"}) + require.NoError(t, err) + require.NotNil(t, result) + require.NotEmpty(t, result.Steps) + var reasoning string + for _, c := range result.Steps[0].Content { + if rc, ok := fantasy.AsContentType[fantasy.ReasoningContent](c); ok { + reasoning += rc.Text + } + } + require.Equal(t, "Thinking about it at length…", reasoning) + require.Equal(t, fantasy.FinishReasonLength, result.Steps[0].FinishReason) +} From 2d131293feef3bb583caec6eed44d05a70620dc2 Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Fri, 28 Aug 2026 13:53:04 -0300 Subject: [PATCH 086/156] fix: close two truncation holes in streamed tool calls Review follow-ups to the DeepSeek looping fix (CHARM-2020): - The stream extra hook was invoked once per choice but iterates all choices itself, so multi-choice chunks emitted duplicate reasoning events. It now runs once per chunk, and the openaicompat reasoning state is tracked per choice index. - A stream ending without finish_reason was treated as a complete tool-call turn whenever any tool call had been seen, even when its arguments were cut mid-JSON; the agent then dispatched the truncated call. Now: arguments that don't parse suppress the ToolCall parts and surface a retryable IncompleteStreamError, exactly like the finish_reason=length path (#347). Complete arguments keep the inferred tool-call turn, with a CallWarning that the finish reason was missing. - finish_reason=insufficient_system_resource maps to FinishReasonError and suppresses open tool calls the same way; it is a provider-side failure, not a completed turn. Assisted-by: Crush:kimi-k3 --- providers/openai/language_model.go | 52 ++++++-- providers/openai/language_model_hooks.go | 5 + .../openaicompat/language_model_hooks.go | 19 +-- providers/openaicompat/replay_test.go | 117 ++++++++++++++++++ 4 files changed, 175 insertions(+), 18 deletions(-) diff --git a/providers/openai/language_model.go b/providers/openai/language_model.go index 9228fa353..d3ce45207 100644 --- a/providers/openai/language_model.go +++ b/providers/openai/language_model.go @@ -477,16 +477,18 @@ func (o languageModel) Stream(ctx context.Context, call fantasy.Call) (fantasy.S } } } + } - if o.streamExtraFunc != nil { - updatedContext, shouldContinue := o.streamExtraFunc(chunk, yield, extraContext) - if !shouldContinue { - return - } - extraContext = updatedContext + // The extra hook receives the whole chunk and iterates choices + // itself; calling it per choice would duplicate its events once + // per additional choice. + if o.streamExtraFunc != nil { + updatedContext, shouldContinue := o.streamExtraFunc(chunk, yield, extraContext) + if !shouldContinue { + return } + extraContext = updatedContext } - for _, choice := range chunk.Choices { if annotations := parseAnnotationsFromDelta(choice.Delta); len(annotations) > 0 { for _, annotation := range annotations { @@ -522,13 +524,34 @@ func (o languageModel) Stream(ctx context.Context, call fantasy.Call) (fantasy.S // Emitting partial tool calls causes agents to dispatch them with // invalid arguments before seeing the terminal reason. mappedFinishReason := o.mapFinishReasonFunc(finishReason) + + // "Tool calls were seen" is not proof of a complete turn: when the + // upstream never sent a finish_reason, only infer a tool-call turn + // if every accumulated call's arguments parse as complete JSON. + // Otherwise the stream was cut mid-arguments and dispatching the + // call would execute truncated input (CHARM-2020). + var missingFinishWithBadArgs bool + var missingFinish bool + if finishReason == "" && len(toolCalls) > 0 { + missingFinish = true + for _, tc := range toolCalls { + if tc.arguments != "" && !json.Valid([]byte(tc.arguments)) { + missingFinishWithBadArgs = true + break + } + } + } + if len(acc.Choices) > 0 { choice := acc.Choices[0] - if len(choice.Message.ToolCalls) > 0 && mappedFinishReason != fantasy.FinishReasonLength { + if len(choice.Message.ToolCalls) > 0 && + mappedFinishReason != fantasy.FinishReasonLength && + mappedFinishReason != fantasy.FinishReasonError && + !missingFinishWithBadArgs { mappedFinishReason = fantasy.FinishReasonToolCalls } } - truncatedWithToolCalls := mappedFinishReason == fantasy.FinishReasonLength && len(toolCalls) > 0 + truncatedWithToolCalls := (mappedFinishReason == fantasy.FinishReasonLength || mappedFinishReason == fantasy.FinishReasonError || missingFinishWithBadArgs) && len(toolCalls) > 0 // Finalize tool calls in index order after the stream completes. // When truncated, skip ToolCall parts to prevent agents from @@ -590,7 +613,16 @@ func (o languageModel) Stream(ctx context.Context, call fantasy.Call) (fantasy.S }) return } - if truncatedWithToolCalls { + if missingFinish && !missingFinishWithBadArgs { + yield(fantasy.StreamPart{ + Type: fantasy.StreamPartTypeWarnings, + Warnings: []fantasy.CallWarning{{ + Type: fantasy.CallWarningTypeOther, + Message: "stream ended without finish_reason; assuming tool-call turn", + }}, + }) + } + if truncatedWithToolCalls && !missingFinishWithBadArgs { yield(fantasy.StreamPart{ Type: fantasy.StreamPartTypeWarnings, Warnings: []fantasy.CallWarning{{ diff --git a/providers/openai/language_model_hooks.go b/providers/openai/language_model_hooks.go index f1c851570..8b8556763 100644 --- a/providers/openai/language_model_hooks.go +++ b/providers/openai/language_model_hooks.go @@ -190,6 +190,11 @@ func DefaultMapFinishReasonFunc(finishReason string) fantasy.FinishReason { return fantasy.FinishReasonContentFilter case "function_call", "tool_calls": return fantasy.FinishReasonToolCalls + case "insufficient_system_resource": + // DeepSeek-family upstreams report this when the request could not + // be served; the partial output (including open tool calls) must be + // treated like a truncation, never a completed turn. + return fantasy.FinishReasonError default: return fantasy.FinishReasonUnknown } diff --git a/providers/openaicompat/language_model_hooks.go b/providers/openaicompat/language_model_hooks.go index b98d19ff8..052ce4bf4 100644 --- a/providers/openaicompat/language_model_hooks.go +++ b/providers/openaicompat/language_model_hooks.go @@ -109,10 +109,15 @@ func StreamExtraFunc(chunk openaisdk.ChatCompletionChunk, yield func(fantasy.Str return ctx, true } - reasoningStarted := ctxBool(ctx, reasoningStartedCtx) - reasoningEnded := ctxBool(ctx, reasoningEndedCtx) - for inx, choice := range chunk.Choices { + // Reasoning state is tracked per choice index: the openai language + // model invokes this hook once per chunk, and a chunk may carry + // several choices. + startedKey := fmt.Sprintf("%s:%d", reasoningStartedCtx, inx) + endedKey := fmt.Sprintf("%s:%d", reasoningEndedCtx, inx) + reasoningStarted := ctxBool(ctx, startedKey) + reasoningEnded := ctxBool(ctx, endedKey) + reasoningData := ReasoningData{} err := json.Unmarshal([]byte(choice.Delta.RawJSON()), &reasoningData) if err != nil { @@ -135,7 +140,7 @@ func StreamExtraFunc(chunk openaisdk.ChatCompletionChunk, yield func(fantasy.Str if rc != "" || (hasField && !boundary && !reasoningEnded) { if !reasoningStarted { reasoningStarted = true - ctx[reasoningStartedCtx] = true + ctx[startedKey] = true if !yield(fantasy.StreamPart{ Type: fantasy.StreamPartTypeReasoningStart, ID: fmt.Sprintf("%d", inx), @@ -159,10 +164,8 @@ func StreamExtraFunc(chunk openaisdk.ChatCompletionChunk, yield func(fantasy.Str // first content/tool-call token in the same delta. } if reasoningStarted && boundary { - reasoningStarted = false - ctx[reasoningStartedCtx] = false - ctx[reasoningEndedCtx] = true - reasoningEnded = true + ctx[startedKey] = false + ctx[endedKey] = true // The openai main loop emits a chunk's text/tool-call parts before // this hook runs, so on a batched boundary chunk the part order is // ToolInputStart, ReasoningDelta(tail), ReasoningEnd. Parts are diff --git a/providers/openaicompat/replay_test.go b/providers/openaicompat/replay_test.go index a56521f21..ce623c719 100644 --- a/providers/openaicompat/replay_test.go +++ b/providers/openaicompat/replay_test.go @@ -470,3 +470,120 @@ func TestReplay_AgentReasoningOnlyTruncated(t *testing.T) { require.Equal(t, "Thinking about it at length…", reasoning) require.Equal(t, fantasy.FinishReasonLength, result.Steps[0].FinishReason) } + +// A chunk carrying two choices must not duplicate reasoning events: +// StreamExtraFunc is invoked per choice by the openai language model but +// iterates all choices itself, so without care each choice's reasoning is +// emitted once per choice. +const multiChoiceSSE = `{"id":"x","created":1,"model":"m","choices":[{"index":0,"delta":{"reasoning_content":"a"},"finish_reason":null},{"index":1,"delta":{"reasoning_content":"b"},"finish_reason":null}]} +{"id":"x","created":1,"model":"m","choices":[{"index":0,"delta":{"content":"A"},"finish_reason":null},{"index":1,"delta":{"content":"B"},"finish_reason":null}]} +{"id":"x","created":1,"model":"m","choices":[{"index":0,"delta":{},"finish_reason":"stop"},{"index":1,"delta":{},"finish_reason":"stop"}]}` + +func TestReplay_MultiChoiceReasoningNotDuplicated(t *testing.T) { + srv, _ := serveSSE(t, multiChoiceSSE) + provider, err := New(WithBaseURL(srv.URL), WithAPIKey("x")) + require.NoError(t, err) + lm, err := provider.LanguageModel(context.Background(), "m") + require.NoError(t, err) + + parts := streamParts(t, lm, fantasy.Prompt{ + {Role: fantasy.MessageRoleUser, Content: []fantasy.MessagePart{fantasy.TextPart{Text: "hi"}}}, + }) + deltasByID := map[string]string{} + startsByID := map[string]int{} + for _, p := range parts { + switch p.Type { + case fantasy.StreamPartTypeReasoningStart: + startsByID[p.ID]++ + case fantasy.StreamPartTypeReasoningDelta: + deltasByID[p.ID] += p.Delta + } + } + require.Equal(t, map[string]int{"0": 1, "1": 1}, startsByID, "types: %v", partTypes(parts)) + require.Equal(t, map[string]string{"0": "a", "1": "b"}, deltasByID, "types: %v", partTypes(parts)) +} + +// A stream that ends cleanly ([DONE]) but never sent a finish_reason must +// not dispatch tool calls whose arguments are incomplete: "tool calls were +// seen" is not proof of a complete turn. Valid arguments keep today's +// inferred tool-call turn, with a warning. +const doneNoFinishTruncatedSSE = `{"id":"x","created":1,"model":"m","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"id":"c1","type":"function","function":{"name":"f","arguments":"{\"pa"}}]},"finish_reason":null}]}` + +const doneNoFinishValidSSE = `{"id":"x","created":1,"model":"m","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"id":"c1","type":"function","function":{"name":"f","arguments":"{}"}}]},"finish_reason":null}]}` + +func TestReplay_DoneWithoutFinishReason_TruncatedArgsSuppressed(t *testing.T) { + srv, _ := serveSSE(t, doneNoFinishTruncatedSSE) + provider, err := New(WithBaseURL(srv.URL), WithAPIKey("x")) + require.NoError(t, err) + lm, err := provider.LanguageModel(context.Background(), "m") + require.NoError(t, err) + + parts := streamParts(t, lm, fantasy.Prompt{ + {Role: fantasy.MessageRoleUser, Content: []fantasy.MessagePart{fantasy.TextPart{Text: "x"}}}, + }) + require.Equal(t, 0, countType(parts, fantasy.StreamPartTypeToolCall), + "truncated tool call must not be dispatched; types: %v", partTypes(parts)) + var sawError bool + for _, p := range parts { + if p.Type == fantasy.StreamPartTypeError { + sawError = true + } + } + require.True(t, sawError, "expected an IncompleteStreamError part, types: %v", partTypes(parts)) + require.Equal(t, 0, countType(parts, fantasy.StreamPartTypeFinish), "types: %v", partTypes(parts)) +} + +func TestReplay_DoneWithoutFinishReason_ValidArgsKeptWithWarning(t *testing.T) { + srv, _ := serveSSE(t, doneNoFinishValidSSE) + provider, err := New(WithBaseURL(srv.URL), WithAPIKey("x")) + require.NoError(t, err) + lm, err := provider.LanguageModel(context.Background(), "m") + require.NoError(t, err) + + parts := streamParts(t, lm, fantasy.Prompt{ + {Role: fantasy.MessageRoleUser, Content: []fantasy.MessagePart{fantasy.TextPart{Text: "x"}}}, + }) + require.Equal(t, 1, countType(parts, fantasy.StreamPartTypeToolCall), "types: %v", partTypes(parts)) + var sawWarning bool + for _, p := range parts { + if p.Type == fantasy.StreamPartTypeWarnings { + sawWarning = true + } + } + require.True(t, sawWarning, "expected a CallWarning about the missing finish_reason, types: %v", partTypes(parts)) + var finish *fantasy.StreamPart + for i := range parts { + if parts[i].Type == fantasy.StreamPartTypeFinish { + finish = &parts[i] + } + } + require.NotNil(t, finish) + require.Equal(t, fantasy.FinishReasonToolCalls, finish.FinishReason) +} + +// insufficient_system_resource is a provider-side failure, not a completed +// turn: it must map to an error finish and suppress any open tool calls. +const insufficientResourceSSE = `{"id":"x","created":1,"model":"m","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"id":"c1","type":"function","function":{"name":"f","arguments":"{}"}}]},"finish_reason":null}]} +{"id":"x","created":1,"model":"m","choices":[{"index":0,"delta":{},"finish_reason":"insufficient_system_resource"}]}` + +func TestReplay_InsufficientSystemResource_SuppressesToolCalls(t *testing.T) { + srv, _ := serveSSE(t, insufficientResourceSSE) + provider, err := New(WithBaseURL(srv.URL), WithAPIKey("x")) + require.NoError(t, err) + lm, err := provider.LanguageModel(context.Background(), "m") + require.NoError(t, err) + + parts := streamParts(t, lm, fantasy.Prompt{ + {Role: fantasy.MessageRoleUser, Content: []fantasy.MessagePart{fantasy.TextPart{Text: "x"}}}, + }) + require.Equal(t, 0, countType(parts, fantasy.StreamPartTypeToolCall), + "tool calls from a failed upstream must not be dispatched; types: %v", partTypes(parts)) + var finish *fantasy.StreamPart + for i := range parts { + if parts[i].Type == fantasy.StreamPartTypeFinish { + finish = &parts[i] + } + } + require.NotNil(t, finish, "types: %v", partTypes(parts)) + require.NotEqual(t, fantasy.FinishReasonToolCalls, finish.FinishReason) +} From 83ef2df664291ff700d0eb3e9d2ce62a884ffb76 Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Fri, 28 Aug 2026 14:02:45 -0300 Subject: [PATCH 087/156] fix: key reasoning state on choice index, suppress filtered tool calls Two review follow-ups on the streamed tool-call path: - StreamExtraFunc keyed per-choice reasoning state and emitted part IDs on each choice's slice position within the chunk. Providers may emit choices in any order, so a chunk listing index 1 before index 0 attributed each one's reasoning to the other. Key on choice.Index. - A content_filter finish with accumulated tool calls was rewritten to a tool-call turn and dispatched, another path where a call cut short gets executed. The tool-call-turn inference now applies only to explicit tool_calls/function_call finishes or the missing-finish reason path with complete arguments; length, content_filter and provider-error finishes all suppress the calls, on Generate as well as Stream. Assisted-by: Crush:kimi-k3 --- providers/openai/language_model.go | 49 +++++++++------ .../openaicompat/language_model_hooks.go | 10 +-- providers/openaicompat/replay_test.go | 62 +++++++++++++++++++ 3 files changed, 97 insertions(+), 24 deletions(-) diff --git a/providers/openai/language_model.go b/providers/openai/language_model.go index d3ce45207..7c5d463f0 100644 --- a/providers/openai/language_model.go +++ b/providers/openai/language_model.go @@ -274,20 +274,27 @@ func (o languageModel) Generate(ctx context.Context, call fantasy.Call) (*fantas usage, providerMetadata := o.usageFunc(*response) mappedFinishReason := o.mapFinishReasonFunc(choice.FinishReason) - truncatedWithToolCalls := len(choice.Message.ToolCalls) > 0 && mappedFinishReason == fantasy.FinishReasonLength - if len(choice.Message.ToolCalls) > 0 && !truncatedWithToolCalls { + // Terminal reasons that can cut output mid-call — length, + // content_filter, provider errors — must not be rewritten into a + // tool-call turn: dispatching their partial calls executes truncated + // input (CHARM-2020). + suppressedToolCalls := len(choice.Message.ToolCalls) > 0 && + (mappedFinishReason == fantasy.FinishReasonLength || + mappedFinishReason == fantasy.FinishReasonContentFilter || + mappedFinishReason == fantasy.FinishReasonError) + if len(choice.Message.ToolCalls) > 0 && !suppressedToolCalls { mappedFinishReason = fantasy.FinishReasonToolCalls } - if truncatedWithToolCalls { + if suppressedToolCalls { warnings = append(warnings, fantasy.CallWarning{ Type: fantasy.CallWarningTypeOther, - Message: "tool calls were returned but the model hit the token limit; arguments may be truncated", + Message: "tool calls were returned but the turn ended abnormally (token limit, content filter, or provider error); arguments may be truncated", }) } // Suppress truncated tool-call content so agents don't dispatch // calls with incomplete arguments. - if !truncatedWithToolCalls { + if !suppressedToolCalls { for _, tc := range choice.Message.ToolCalls { toolCallID := tc.ID content = append(content, fantasy.ToolCallContent{ @@ -525,11 +532,14 @@ func (o languageModel) Stream(ctx context.Context, call fantasy.Call) (fantasy.S // invalid arguments before seeing the terminal reason. mappedFinishReason := o.mapFinishReasonFunc(finishReason) - // "Tool calls were seen" is not proof of a complete turn: when the - // upstream never sent a finish_reason, only infer a tool-call turn - // if every accumulated call's arguments parse as complete JSON. - // Otherwise the stream was cut mid-arguments and dispatching the - // call would execute truncated input (CHARM-2020). + // "Tool calls were seen" is not proof of a complete turn. Infer a + // tool-call turn only when the upstream said tool_calls/function_call + // explicitly (kept verbatim by the mapper) or sent no finish reason + // at all and every accumulated call's arguments parse as complete + // JSON. Terminal reasons that can cut output mid-call — length, + // content_filter, provider errors — must never be rewritten into a + // tool-call turn: dispatching their partial calls executes truncated + // input (CHARM-2020). var missingFinishWithBadArgs bool var missingFinish bool if finishReason == "" && len(toolCalls) > 0 { @@ -542,16 +552,15 @@ func (o languageModel) Stream(ctx context.Context, call fantasy.Call) (fantasy.S } } - if len(acc.Choices) > 0 { - choice := acc.Choices[0] - if len(choice.Message.ToolCalls) > 0 && - mappedFinishReason != fantasy.FinishReasonLength && - mappedFinishReason != fantasy.FinishReasonError && - !missingFinishWithBadArgs { + if finishReason == "" && len(acc.Choices) > 0 && !missingFinishWithBadArgs { + if len(acc.Choices[0].Message.ToolCalls) > 0 { mappedFinishReason = fantasy.FinishReasonToolCalls } } - truncatedWithToolCalls := (mappedFinishReason == fantasy.FinishReasonLength || mappedFinishReason == fantasy.FinishReasonError || missingFinishWithBadArgs) && len(toolCalls) > 0 + suppressedWithToolCalls := (mappedFinishReason == fantasy.FinishReasonLength || + mappedFinishReason == fantasy.FinishReasonError || + mappedFinishReason == fantasy.FinishReasonContentFilter || + missingFinishWithBadArgs) && len(toolCalls) > 0 // Finalize tool calls in index order after the stream completes. // When truncated, skip ToolCall parts to prevent agents from @@ -572,7 +581,7 @@ func (o languageModel) Stream(ctx context.Context, call fantasy.Call) (fantasy.S return } } - if !truncatedWithToolCalls { + if !suppressedWithToolCalls { if !yield(fantasy.StreamPart{Type: fantasy.StreamPartTypeToolCall, ID: tc.id, ToolCallName: tc.name, ToolCallInput: tc.arguments}) { return } @@ -622,12 +631,12 @@ func (o languageModel) Stream(ctx context.Context, call fantasy.Call) (fantasy.S }}, }) } - if truncatedWithToolCalls && !missingFinishWithBadArgs { + if suppressedWithToolCalls && !missingFinishWithBadArgs { yield(fantasy.StreamPart{ Type: fantasy.StreamPartTypeWarnings, Warnings: []fantasy.CallWarning{{ Type: fantasy.CallWarningTypeOther, - Message: "tool calls were returned but the model hit the token limit; arguments may be truncated", + Message: "tool calls were returned but the turn ended abnormally (token limit, content filter, or provider error); arguments may be truncated", }}, }) } diff --git a/providers/openaicompat/language_model_hooks.go b/providers/openaicompat/language_model_hooks.go index 052ce4bf4..11071e5eb 100644 --- a/providers/openaicompat/language_model_hooks.go +++ b/providers/openaicompat/language_model_hooks.go @@ -109,10 +109,12 @@ func StreamExtraFunc(chunk openaisdk.ChatCompletionChunk, yield func(fantasy.Str return ctx, true } - for inx, choice := range chunk.Choices { - // Reasoning state is tracked per choice index: the openai language - // model invokes this hook once per chunk, and a chunk may carry - // several choices. + for _, choice := range chunk.Choices { + // Reasoning state is tracked per choice: the openai language model + // invokes this hook once per chunk, a chunk may carry several + // choices, and providers may emit them in any slice order — key on + // the choice's own Index, not its position in the chunk. + inx := choice.Index startedKey := fmt.Sprintf("%s:%d", reasoningStartedCtx, inx) endedKey := fmt.Sprintf("%s:%d", reasoningEndedCtx, inx) reasoningStarted := ctxBool(ctx, startedKey) diff --git a/providers/openaicompat/replay_test.go b/providers/openaicompat/replay_test.go index ce623c719..44ecbb90d 100644 --- a/providers/openaicompat/replay_test.go +++ b/providers/openaicompat/replay_test.go @@ -587,3 +587,65 @@ func TestReplay_InsufficientSystemResource_SuppressesToolCalls(t *testing.T) { require.NotNil(t, finish, "types: %v", partTypes(parts)) require.NotEqual(t, fantasy.FinishReasonToolCalls, finish.FinishReason) } + +// Choices may not arrive in slice order; reasoning state and part IDs must +// follow choice.Index, not the slice position within a chunk. +const reorderedChoicesSSE = `{"id":"x","created":1,"model":"m","choices":[{"index":1,"delta":{"reasoning_content":"B1"},"finish_reason":null},{"index":0,"delta":{"reasoning_content":"A1"},"finish_reason":null}]} +{"id":"x","created":1,"model":"m","choices":[{"index":0,"delta":{"reasoning_content":"A2"},"finish_reason":null},{"index":1,"delta":{"reasoning_content":"B2"},"finish_reason":null}]} +{"id":"x","created":1,"model":"m","choices":[{"index":0,"delta":{"content":"a"},"finish_reason":null},{"index":1,"delta":{"content":"b"},"finish_reason":null}]} +{"id":"x","created":1,"model":"m","choices":[{"index":0,"delta":{},"finish_reason":"stop"},{"index":1,"delta":{},"finish_reason":"stop"}]}` + +func TestReplay_ReorderedChoices(t *testing.T) { + srv, _ := serveSSE(t, reorderedChoicesSSE) + provider, err := New(WithBaseURL(srv.URL), WithAPIKey("x")) + require.NoError(t, err) + lm, err := provider.LanguageModel(context.Background(), "m") + require.NoError(t, err) + + parts := streamParts(t, lm, fantasy.Prompt{ + {Role: fantasy.MessageRoleUser, Content: []fantasy.MessagePart{fantasy.TextPart{Text: "hi"}}}, + }) + deltasByID := map[string]string{} + endsByID := map[string]int{} + startsByID := map[string]int{} + for _, p := range parts { + switch p.Type { + case fantasy.StreamPartTypeReasoningStart: + startsByID[p.ID]++ + case fantasy.StreamPartTypeReasoningDelta: + deltasByID[p.ID] += p.Delta + case fantasy.StreamPartTypeReasoningEnd: + endsByID[p.ID]++ + } + } + require.Equal(t, map[string]int{"0": 1, "1": 1}, startsByID, "types: %v", partTypes(parts)) + require.Equal(t, map[string]string{"0": "A1A2", "1": "B1B2"}, deltasByID, "types: %v", partTypes(parts)) + require.Equal(t, map[string]int{"0": 1, "1": 1}, endsByID, "types: %v", partTypes(parts)) +} + +// A content_filter finish can cut a tool call mid-arguments; like length, +// it must not be rewritten to tool_calls and its calls must not dispatch. +const contentFilterToolCallSSE = `{"id":"x","created":1,"model":"m","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"id":"c1","type":"function","function":{"name":"f","arguments":"{}"}}]},"finish_reason":null}]} +{"id":"x","created":1,"model":"m","choices":[{"index":0,"delta":{},"finish_reason":"content_filter"}]}` + +func TestReplay_ContentFilter_SuppressesToolCalls(t *testing.T) { + srv, _ := serveSSE(t, contentFilterToolCallSSE) + provider, err := New(WithBaseURL(srv.URL), WithAPIKey("x")) + require.NoError(t, err) + lm, err := provider.LanguageModel(context.Background(), "m") + require.NoError(t, err) + + parts := streamParts(t, lm, fantasy.Prompt{ + {Role: fantasy.MessageRoleUser, Content: []fantasy.MessagePart{fantasy.TextPart{Text: "x"}}}, + }) + require.Equal(t, 0, countType(parts, fantasy.StreamPartTypeToolCall), + "tool calls from a filtered response must not be dispatched; types: %v", partTypes(parts)) + var finish *fantasy.StreamPart + for i := range parts { + if parts[i].Type == fantasy.StreamPartTypeFinish { + finish = &parts[i] + } + } + require.NotNil(t, finish, "types: %v", partTypes(parts)) + require.Equal(t, fantasy.FinishReasonContentFilter, finish.FinishReason) +} From af8c1d7f060bda66cb63a37712c2b5b7a732cef6 Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Fri, 28 Aug 2026 14:24:03 -0300 Subject: [PATCH 088/156] fix: dispatch agent tools only on an explicit tool-calls turn MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The agent's dispatch gate was an exclusion — skip only on finish_reason=length — so a provider emitting ToolCall parts before an error, content-filter, or unknown finish still executed them, with arguments that may have been cut short. Invert it: dispatch only when the step finished as a tool-calls turn (CHARM-2020). The ExecutableProviderTool stream test mocked a stop-finished tool call, a shape no real provider produces; it now finishes tool_calls and terminates the loop with a stop step. Assisted-by: Crush:kimi-k3 --- agent.go | 11 ++++++---- agent_stream_test.go | 50 ++++++++++++++++++++++++++++++++++++++++++++ agent_test.go | 20 ++++++++++++++++-- 3 files changed, 75 insertions(+), 6 deletions(-) diff --git a/agent.go b/agent.go index 316ac86d1..1f528e830 100644 --- a/agent.go +++ b/agent.go @@ -1701,10 +1701,13 @@ func (a *agent) processStepStream(ctx context.Context, stream StreamResponse, op }) // Dispatch all buffered tool calls now that every OnToolCall callback has - // been called, then close and wait. Skip dispatch when the response was - // truncated (finish_reason=length) to avoid executing tool calls with - // incomplete arguments. - if stepFinishReason != FinishReasonLength { + // been called, then close and wait. Dispatch only on an explicit + // tool-calls turn: any other finish reason (length, content filter, + // provider error, unknown) can accompany arguments that were cut short, + // and executing those is how truncated input reaches tools + // (CHARM-2020). The tool-call content stays in stepContent either way, + // so the step result records what the model tried to call. + if stepFinishReason == FinishReasonToolCalls { for _, req := range pendingDispatches { toolChan <- req } diff --git a/agent_stream_test.go b/agent_stream_test.go index e0b128ffd..7e928bb4e 100644 --- a/agent_stream_test.go +++ b/agent_stream_test.go @@ -836,3 +836,53 @@ func (t *trackingEchoTool) ProviderOptions() ProviderOptions { func (t *trackingEchoTool) SetProviderOptions(opts ProviderOptions) { t.providerOptions = opts } + +// TestStreamingAgent_SkipsToolDispatchOnAbnormalFinish generalizes the +// truncation guard: any finish reason that is not an explicit tool-calls +// turn must not dispatch, even if ToolCall parts were emitted (a buggy or +// unusual provider path, or a finish reason the provider layer maps from +// an upstream failure such as content_filter or +// insufficient_system_resource). See CHARM-2020. +func TestStreamingAgent_SkipsToolDispatchOnAbnormalFinish(t *testing.T) { + t.Parallel() + + for _, reason := range []FinishReason{FinishReasonError, FinishReasonContentFilter, FinishReasonUnknown} { + t.Run(string(reason), func(t *testing.T) { + t.Parallel() + + var toolExecuted bool + mockModel := &mockLanguageModel{ + streamFunc: func(ctx context.Context, call Call) (StreamResponse, error) { + return func(yield func(StreamPart) bool) { + if !yield(StreamPart{Type: StreamPartTypeToolInputStart, ID: "call-x", ToolCallName: "echo"}) { + return + } + if !yield(StreamPart{Type: StreamPartTypeToolInputDelta, ID: "call-x", Delta: `{"message":"hi"}`}) { + return + } + if !yield(StreamPart{Type: StreamPartTypeToolInputEnd, ID: "call-x"}) { + return + } + if !yield(StreamPart{Type: StreamPartTypeToolCall, ID: "call-x", ToolCallName: "echo", ToolCallInput: `{"message":"hi"}`}) { + return + } + yield(StreamPart{ + Type: StreamPartTypeFinish, + Usage: Usage{InputTokens: 10, OutputTokens: 20, TotalTokens: 30}, + FinishReason: reason, + }) + }, nil + }, + } + + echoTool := &trackingEchoTool{onExecute: func() { toolExecuted = true }} + agent := NewAgent(mockModel, WithTools(echoTool)) + + result, err := agent.Stream(context.Background(), AgentStreamCall{Prompt: "test"}) + require.NoError(t, err) + require.False(t, toolExecuted, "tool must not be dispatched when finish_reason is %s", reason) + require.Equal(t, reason, result.Response.FinishReason) + require.Len(t, result.Steps, 1) + }) + } +} diff --git a/agent_test.go b/agent_test.go index bcc7e394f..db76d6d9a 100644 --- a/agent_test.go +++ b/agent_test.go @@ -2326,6 +2326,22 @@ func TestAgent_Stream_ExecutableProviderTool(t *testing.T) { model := &mockLanguageModel{ streamFunc: func(ctx context.Context, call Call) (StreamResponse, error) { + // First call issues the tool call; after the tool result comes + // back the model stops, so the agent loop terminates. + for _, msg := range call.Prompt { + if msg.Role == MessageRoleTool { + return func(yield func(StreamPart) bool) { + yield(StreamPart{Type: StreamPartTypeTextStart, ID: "t"}) + yield(StreamPart{Type: StreamPartTypeTextDelta, ID: "t", Delta: "done"}) + yield(StreamPart{Type: StreamPartTypeTextEnd, ID: "t"}) + yield(StreamPart{ + Type: StreamPartTypeFinish, + FinishReason: FinishReasonStop, + Usage: Usage{TotalTokens: 5}, + }) + }, nil + } + } return func(yield func(StreamPart) bool) { if !yield(StreamPart{ Type: StreamPartTypeToolCall, @@ -2337,7 +2353,7 @@ func TestAgent_Stream_ExecutableProviderTool(t *testing.T) { } yield(StreamPart{ Type: StreamPartTypeFinish, - FinishReason: FinishReasonStop, + FinishReason: FinishReasonToolCalls, Usage: Usage{TotalTokens: 10}, }) }, nil @@ -2352,7 +2368,7 @@ func TestAgent_Stream_ExecutableProviderTool(t *testing.T) { require.NoError(t, err) require.NotNil(t, result) require.True(t, runCalled, "expected Run func to be called") - require.Len(t, result.Steps, 1) + require.Len(t, result.Steps, 2) // Verify tool result is in the step content. var toolResults []ToolResultContent From 4a979a5c5d949df159c2738a008f2d4c5156a279 Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Fri, 28 Aug 2026 14:33:47 -0300 Subject: [PATCH 089/156] fix: pass conversation context to streaming tool-call repair The streaming path called validateAndRepairToolCall with nil messages, so RepairToolCall callbacks could not see the conversation that produced the malformed arguments, unlike the non-streaming path which receives the full step input. Thread stepInputMessages through processStepStream to match. Assisted-by: Crush:kimi-k3 --- agent.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/agent.go b/agent.go index 1f528e830..e0df25eb7 100644 --- a/agent.go +++ b/agent.go @@ -1027,7 +1027,7 @@ func (a *agent) Stream(ctx context.Context, opts AgentStreamCall) (*AgentResult, } // Process the stream - result, err := a.processStepStream(ctx, stream, opts, steps, stepTools, stepExecProviderTools) + result, err := a.processStepStream(ctx, stream, opts, steps, stepTools, stepExecProviderTools, stepInputMessages) if err != nil { return stepExecutionResult{}, err } @@ -1387,7 +1387,7 @@ func WithOnRetry(callback OnRetryCallback) AgentOption { } // processStepStream processes a single step's stream and returns the step result. -func (a *agent) processStepStream(ctx context.Context, stream StreamResponse, opts AgentStreamCall, _ []StepResult, stepTools []AgentTool, execProviderTools []ExecutableProviderTool) (stepExecutionResult, error) { +func (a *agent) processStepStream(ctx context.Context, stream StreamResponse, opts AgentStreamCall, _ []StepResult, stepTools []AgentTool, execProviderTools []ExecutableProviderTool, stepInputMessages []Message) (stepExecutionResult, error) { var stepContent []Content var stepToolCalls []ToolCallContent var stepUsage Usage @@ -1578,7 +1578,7 @@ func (a *agent) processStepStream(ctx context.Context, stream StreamResponse, op delete(activeToolCalls, part.ID) } else { // Validate and potentially repair the tool call - validatedToolCall := a.validateAndRepairToolCall(ctx, toolCall, stepTools, execProviderTools, a.settings.systemPrompt, nil, opts.RepairToolCall) + validatedToolCall := a.validateAndRepairToolCall(ctx, toolCall, stepTools, execProviderTools, a.settings.systemPrompt, stepInputMessages, opts.RepairToolCall) stepToolCalls = append(stepToolCalls, validatedToolCall) stepContent = append(stepContent, validatedToolCall) From eb1ba5e2c3638aecaace7db1b00ea93df3fe4e93 Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Fri, 28 Aug 2026 15:04:28 -0300 Subject: [PATCH 090/156] fix: concatenate multi-segment turns, order parallel results by call Two review follow-ups (F2 and F6 from CHARM-2020): - ToPromptFunc last-write-wins on repeated parts: an assistant turn with interleaved reasoning segments (reason, speak, reason again) lost every text and reasoning segment but the last on replay. Both now concatenate in order ("a\nb", "x\ny"); segments carrying extra content fields still force the array form with one block per part. - Parallel tool results were appended in completion order. They now follow the order the model called the tools, which providers pairing results with calls positionally depend on. The avian-kimi VCR cassettes were re-recorded: the responses now carry the reasoning the fixed stream layer preserves, so the second recorded request no longer matched byte-for-byte. Assisted-by: Crush:kimi-k3 --- agent.go | 12 +- agent_stream_test.go | 60 ++++ .../openaicompat/language_model_hooks.go | 42 ++- providers/openaicompat/openaicompat_test.go | 53 ++- .../avian-kimi/multi_tool_streaming.yaml | 243 +++++++------- .../avian-kimi/simple_streaming.yaml | 293 +++++++++-------- .../avian-kimi/tool_streaming.yaml | 308 ++++++------------ .../avian-kimi/thinking-streaming.yaml | 209 +++++++----- 8 files changed, 661 insertions(+), 559 deletions(-) diff --git a/agent.go b/agent.go index e0df25eb7..fcfaada35 100644 --- a/agent.go +++ b/agent.go @@ -1722,8 +1722,18 @@ func (a *agent) processStepStream(ctx context.Context, stream StreamResponse, op return stepExecutionResult{}, toolExecutionErr } - // Add tool results to content if any + // Add tool results to content in the order the model called the tools, + // not the order they completed in (F6, CHARM-2020). Results carry their + // call id; providers that pair results with calls positionally, and any + // consumer diffing step content, depend on call order. if len(toolResults) > 0 { + positionByCallID := make(map[string]int, len(pendingDispatches)) + for i, req := range pendingDispatches { + positionByCallID[req.toolCall.ToolCallID] = i + } + slices.SortStableFunc(toolResults, func(a, b ToolResultContent) int { + return cmp.Compare(positionByCallID[a.ToolCallID], positionByCallID[b.ToolCallID]) + }) for _, result := range toolResults { stepContent = append(stepContent, result) } diff --git a/agent_stream_test.go b/agent_stream_test.go index 7e928bb4e..da790df4b 100644 --- a/agent_stream_test.go +++ b/agent_stream_test.go @@ -7,6 +7,7 @@ import ( "strings" "sync" "testing" + "time" "github.com/stretchr/testify/require" ) @@ -886,3 +887,62 @@ func TestStreamingAgent_SkipsToolDispatchOnAbnormalFinish(t *testing.T) { }) } } + +// TestStreamingAgent_ParallelToolResultsInCallOrder guards CHARM-2020 F6: +// two parallel tools where the second finishes first must still append +// results in the order the model called them. Providers that pair results +// with calls positionally (and any diff of step content) depend on it. +func TestStreamingAgent_ParallelToolResultsInCallOrder(t *testing.T) { + t.Parallel() + + type input struct { + N int `json:"n"` + } + slow := NewParallelAgentTool("slow", "finishes last", + func(ctx context.Context, in input, call ToolCall) (ToolResponse, error) { + time.Sleep(50 * time.Millisecond) + return NewTextResponse("slow-result"), nil + }) + fast := NewParallelAgentTool("fast", "finishes first", + func(ctx context.Context, in input, call ToolCall) (ToolResponse, error) { + return NewTextResponse("fast-result"), nil + }) + + mockModel := &mockLanguageModel{ + streamFunc: func(ctx context.Context, call Call) (StreamResponse, error) { + for _, msg := range call.Prompt { + if msg.Role == MessageRoleTool { + return func(yield func(StreamPart) bool) { + yield(StreamPart{Type: StreamPartTypeTextStart, ID: "t"}) + yield(StreamPart{Type: StreamPartTypeTextDelta, ID: "t", Delta: "done"}) + yield(StreamPart{Type: StreamPartTypeTextEnd, ID: "t"}) + yield(StreamPart{Type: StreamPartTypeFinish, FinishReason: FinishReasonStop, Usage: Usage{TotalTokens: 5}}) + }, nil + } + } + return func(yield func(StreamPart) bool) { + if !yield(StreamPart{Type: StreamPartTypeToolCall, ID: "call-slow", ToolCallName: "slow", ToolCallInput: `{"n":1}`}) { + return + } + if !yield(StreamPart{Type: StreamPartTypeToolCall, ID: "call-fast", ToolCallName: "fast", ToolCallInput: `{"n":2}`}) { + return + } + yield(StreamPart{Type: StreamPartTypeFinish, FinishReason: FinishReasonToolCalls, Usage: Usage{TotalTokens: 10}}) + }, nil + }, + } + + agent := NewAgent(mockModel, WithTools(slow, fast)) + result, err := agent.Stream(context.Background(), AgentStreamCall{Prompt: "run both"}) + require.NoError(t, err) + require.Len(t, result.Steps, 2) + + var order []string + for _, c := range result.Steps[0].Content { + if tr, ok := AsContentType[ToolResultContent](c); ok { + order = append(order, tr.ToolCallID) + } + } + require.Equal(t, []string{"call-slow", "call-fast"}, order, + "results must follow call order, not completion order") +} diff --git a/providers/openaicompat/language_model_hooks.go b/providers/openaicompat/language_model_hooks.go index 11071e5eb..14c5a5354 100644 --- a/providers/openaicompat/language_model_hooks.go +++ b/providers/openaicompat/language_model_hooks.go @@ -401,8 +401,15 @@ func ToPromptFunc(prompt fantasy.Prompt, _, _ string) ([]openaisdk.ChatCompletio assistantMsg := openaisdk.ChatCompletionAssistantMessageParam{ Role: "assistant", } - var reasoningText string + // A turn may carry several reasoning or text segments (a model that + // reasons, speaks, then reasons again). Concatenate in order rather + // than last-write-wins so no segment is silently dropped (F2, + // CHARM-2020). Segments carrying extra content fields force the + // array form, one block per part, to keep the fields attached. + var reasoningTexts []string reasoningPresent := false + var textParts []string + var textBlocks []openaisdk.ChatCompletionAssistantMessageParamContentArrayOfContentPartUnion for _, c := range msg.Content { switch c.GetType() { case fantasy.ContentTypeText: @@ -416,15 +423,11 @@ func ToPromptFunc(prompt fantasy.Prompt, _, _ string) ([]openaisdk.ChatCompletio } textBlock, hasExtra := buildTextBlock(textPart.Text, textPart.ProviderOptions, msg.ProviderOptions) if hasExtra { - assistantMsg.Content = openaisdk.ChatCompletionAssistantMessageParamContentUnion{ - OfArrayOfContentParts: []openaisdk.ChatCompletionAssistantMessageParamContentArrayOfContentPartUnion{ - {OfText: textBlock}, - }, - } + textBlocks = append(textBlocks, openaisdk.ChatCompletionAssistantMessageParamContentArrayOfContentPartUnion{ + OfText: textBlock, + }) } else { - assistantMsg.Content = openaisdk.ChatCompletionAssistantMessageParamContentUnion{ - OfString: param.NewOpt(textPart.Text), - } + textParts = append(textParts, textPart.Text) } case fantasy.ContentTypeReasoning: reasoningPart, ok := fantasy.AsContentType[fantasy.ReasoningPart](c) @@ -435,7 +438,7 @@ func ToPromptFunc(prompt fantasy.Prompt, _, _ string) ([]openaisdk.ChatCompletio }) continue } - reasoningText = reasoningPart.Text + reasoningTexts = append(reasoningTexts, reasoningPart.Text) reasoningPresent = true case fantasy.ContentTypeToolCall: toolCallPart, ok := fantasy.AsContentType[fantasy.ToolCallPart](c) @@ -459,6 +462,23 @@ func ToPromptFunc(prompt fantasy.Prompt, _, _ string) ([]openaisdk.ChatCompletio }) } } + // Text: array form when any segment carried extra fields (one block + // per segment, extras attached); otherwise the joined string. + if len(textBlocks) > 0 { + for _, tp := range textParts { + block, _ := buildTextBlock(tp, nil, nil) + textBlocks = append(textBlocks, openaisdk.ChatCompletionAssistantMessageParamContentArrayOfContentPartUnion{ + OfText: block, + }) + } + assistantMsg.Content = openaisdk.ChatCompletionAssistantMessageParamContentUnion{ + OfArrayOfContentParts: textBlocks, + } + } else if len(textParts) > 0 { + assistantMsg.Content = openaisdk.ChatCompletionAssistantMessageParamContentUnion{ + OfString: param.NewOpt(strings.Join(textParts, "\n")), + } + } // Add reasoning_content field if the message carries a reasoning // part, even when its text is empty: presence must mirror what the // model emitted so resubmitted history stays byte-stable for prefix @@ -466,7 +486,7 @@ func ToPromptFunc(prompt fantasy.Prompt, _, _ string) ([]openaisdk.ChatCompletio // tool-call messages when thinking is enabled. if reasoningPresent { assistantMsg.SetExtraFields(map[string]any{ - "reasoning_content": reasoningText, + "reasoning_content": strings.Join(reasoningTexts, "\n"), }) } if !hasVisibleCompatAssistantContent(&assistantMsg) { diff --git a/providers/openaicompat/openaicompat_test.go b/providers/openaicompat/openaicompat_test.go index a6c01fabf..995565ff7 100644 --- a/providers/openaicompat/openaicompat_test.go +++ b/providers/openaicompat/openaicompat_test.go @@ -158,7 +158,7 @@ func TestToPromptFunc_ReasoningContent(t *testing.T) { require.Equal(t, "Hello", userMsg.Content.OfString.Value) }) - t.Run("should use last assistant TextPart only", func(t *testing.T) { + t.Run("should concatenate assistant TextParts in order", func(t *testing.T) { t.Parallel() prompt := fantasy.Prompt{ @@ -171,8 +171,8 @@ func TestToPromptFunc_ReasoningContent(t *testing.T) { { Role: fantasy.MessageRoleAssistant, Content: []fantasy.MessagePart{ - fantasy.TextPart{Text: "First part. "}, - fantasy.TextPart{Text: "Second part. "}, + fantasy.TextPart{Text: "First part."}, + fantasy.TextPart{Text: "Second part."}, fantasy.TextPart{Text: "Third part."}, }, }, @@ -183,10 +183,11 @@ func TestToPromptFunc_ReasoningContent(t *testing.T) { require.Empty(t, warnings) require.Len(t, messages, 2) - // Assistant message should use only the last TextPart (matching openai behavior) + // Multi-segment assistant turns concatenate (F2, CHARM-2020): + // last-write-wins silently dropped every segment but the last. assistantMsg := messages[1].OfAssistant require.NotNil(t, assistantMsg) - require.Equal(t, "Third part.", assistantMsg.Content.OfString.Value) + require.Equal(t, "First part.\nSecond part.\nThird part.", assistantMsg.Content.OfString.Value) }) t.Run("should include user messages with only unsupported attachments", func(t *testing.T) { @@ -895,3 +896,45 @@ func TestToPromptFunc_ContentExtraFields(t *testing.T) { require.Equal(t, "ephemeral", cacheControl["type"]) }) } + +// TestToPromptFunc_MultiSegmentConcatenation covers the CHARM-2020 F2 case: +// an assistant turn with interleaved reasoning segments (a model that +// reasons, speaks, then reasons again) must not lose segments — text and +// reasoning each concatenate in order instead of last-write-wins. +func TestToPromptFunc_MultiSegmentConcatenation(t *testing.T) { + t.Parallel() + + prompt := fantasy.Prompt{ + { + Role: fantasy.MessageRoleUser, + Content: []fantasy.MessagePart{ + fantasy.TextPart{Text: "hi"}, + }, + }, + { + Role: fantasy.MessageRoleAssistant, + Content: []fantasy.MessagePart{ + fantasy.ReasoningPart{Text: "a"}, + fantasy.TextPart{Text: "x"}, + fantasy.ToolCallPart{ToolCallID: "c1", ToolName: "f", Input: "{}"}, + fantasy.ReasoningPart{Text: "b"}, + fantasy.TextPart{Text: "y"}, + }, + }, + } + + messages, warnings := ToPromptFunc(prompt, "", "") + require.Empty(t, warnings) + require.Len(t, messages, 2) + + msg := messages[1].OfAssistant + require.NotNil(t, msg) + require.Equal(t, "x\ny", msg.Content.OfString.Value, "text parts must concatenate, not overwrite") + require.Len(t, msg.ToolCalls, 1) + require.Equal(t, "c1", msg.ToolCalls[0].OfFunction.ID) + + extraFields := msg.ExtraFields() + reasoningContent, hasReasoning := extraFields["reasoning_content"] + require.True(t, hasReasoning) + require.Equal(t, "a\nb", reasoningContent, "reasoning parts must concatenate, not overwrite") +} diff --git a/providertests/testdata/TestOpenAICompatibleCommon/avian-kimi/multi_tool_streaming.yaml b/providertests/testdata/TestOpenAICompatibleCommon/avian-kimi/multi_tool_streaming.yaml index 209451f94..3c627f93e 100644 --- a/providertests/testdata/TestOpenAICompatibleCommon/avian-kimi/multi_tool_streaming.yaml +++ b/providertests/testdata/TestOpenAICompatibleCommon/avian-kimi/multi_tool_streaming.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.15.0 (https://charm.land/fantasy) + - Charm-Fantasy/0.41.3 (https://charm.land/fantasy) url: https://api.avian.io/v1/chat/completions method: POST response: @@ -24,129 +24,152 @@ interactions: proto_minor: 0 content_length: -1 body: |+ - data: {"id": "chatcmpl-ec08ee4b2cd84124b8f4f469", "object": "chat.completion.chunk", "created": 1773932885, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"role": "assistant"}, "finish_reason": null}]} + data: {"id": "chatcmpl-88a2d88ed6b940f3a0d705b4", "object": "chat.completion.chunk", "created": 1787940175, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"role": "assistant"}, "finish_reason": null}]} - data: {"id": "gen-1773932884-wGz1eX8aEKiwuYKtVVBo", "object": "chat.completion.chunk", "created": 1773932884, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "The", "format": "unknown", "index": 0}], "reasoning_content": "The"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932884-wGz1eX8aEKiwuYKtVVBo", "object": "chat.completion.chunk", "created": 1773932884, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " user wants", "format": "unknown", "index": 0}], "reasoning_content": " user wants"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940175-vloQES0Y8dbGoX4T9wNv", "object": "chat.completion.chunk", "created": 1787940175, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "The", "format": "unknown", "index": 0}], "reasoning_content": "The"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932884-wGz1eX8aEKiwuYKtVVBo", "object": "chat.completion.chunk", "created": 1773932884, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " me to", "format": "unknown", "index": 0}], "reasoning_content": " me to"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940175-vloQES0Y8dbGoX4T9wNv", "object": "chat.completion.chunk", "created": 1787940175, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " user wants", "format": "unknown", "index": 0}], "reasoning_content": " user wants"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932884-wGz1eX8aEKiwuYKtVVBo", "object": "chat.completion.chunk", "created": 1773932884, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " add and", "format": "unknown", "index": 0}], "reasoning_content": " add and"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940175-vloQES0Y8dbGoX4T9wNv", "object": "chat.completion.chunk", "created": 1787940175, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " me to", "format": "unknown", "index": 0}], "reasoning_content": " me to"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932884-wGz1eX8aEKiwuYKtVVBo", "object": "chat.completion.chunk", "created": 1773932884, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " multiply the", "format": "unknown", "index": 0}], "reasoning_content": " multiply the"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940175-vloQES0Y8dbGoX4T9wNv", "object": "chat.completion.chunk", "created": 1787940175, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " add and", "format": "unknown", "index": 0}], "reasoning_content": " add and"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932884-wGz1eX8aEKiwuYKtVVBo", "object": "chat.completion.chunk", "created": 1773932884, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " numbers ", "format": "unknown", "index": 0}], "reasoning_content": " numbers "}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940175-vloQES0Y8dbGoX4T9wNv", "object": "chat.completion.chunk", "created": 1787940175, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " multiply the", "format": "unknown", "index": 0}], "reasoning_content": " multiply the"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932884-wGz1eX8aEKiwuYKtVVBo", "object": "chat.completion.chunk", "created": 1773932884, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "2 and", "format": "unknown", "index": 0}], "reasoning_content": "2 and"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940175-vloQES0Y8dbGoX4T9wNv", "object": "chat.completion.chunk", "created": 1787940175, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " numbers ", "format": "unknown", "index": 0}], "reasoning_content": " numbers "}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932884-wGz1eX8aEKiwuYKtVVBo", "object": "chat.completion.chunk", "created": 1773932884, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " 3", "format": "unknown", "index": 0}], "reasoning_content": " 3"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940175-vloQES0Y8dbGoX4T9wNv", "object": "chat.completion.chunk", "created": 1787940175, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "2 and", "format": "unknown", "index": 0}], "reasoning_content": "2 and"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932884-wGz1eX8aEKiwuYKtVVBo", "object": "chat.completion.chunk", "created": 1773932884, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": ". The", "format": "unknown", "index": 0}], "reasoning_content": ". The"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940175-vloQES0Y8dbGoX4T9wNv", "object": "chat.completion.chunk", "created": 1787940175, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " 3", "format": "unknown", "index": 0}], "reasoning_content": " 3"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932884-wGz1eX8aEKiwuYKtVVBo", "object": "chat.completion.chunk", "created": 1773932884, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " instruction", "format": "unknown", "index": 0}], "reasoning_content": " instruction"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940175-vloQES0Y8dbGoX4T9wNv", "object": "chat.completion.chunk", "created": 1787940175, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": ". According", "format": "unknown", "index": 0}], "reasoning_content": ". According"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932884-wGz1eX8aEKiwuYKtVVBo", "object": "chat.completion.chunk", "created": 1773932884, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " says \"", "format": "unknown", "index": 0}], "reasoning_content": " says \""}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940175-vloQES0Y8dbGoX4T9wNv", "object": "chat.completion.chunk", "created": 1787940175, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " to my", "format": "unknown", "index": 0}], "reasoning_content": " to my"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932884-wGz1eX8aEKiwuYKtVVBo", "object": "chat.completion.chunk", "created": 1773932884, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "Always use", "format": "unknown", "index": 0}], "reasoning_content": "Always use"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940175-vloQES0Y8dbGoX4T9wNv", "object": "chat.completion.chunk", "created": 1787940175, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " instructions,", "format": "unknown", "index": 0}], "reasoning_content": " instructions,"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932884-wGz1eX8aEKiwuYKtVVBo", "object": "chat.completion.chunk", "created": 1773932884, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " both add", "format": "unknown", "index": 0}], "reasoning_content": " both add"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940175-vloQES0Y8dbGoX4T9wNv", "object": "chat.completion.chunk", "created": 1787940175, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " I should", "format": "unknown", "index": 0}], "reasoning_content": " I should"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932884-wGz1eX8aEKiwuYKtVVBo", "object": "chat.completion.chunk", "created": 1773932884, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " and multiply", "format": "unknown", "index": 0}], "reasoning_content": " and multiply"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940175-vloQES0Y8dbGoX4T9wNv", "object": "chat.completion.chunk", "created": 1787940175, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " always use", "format": "unknown", "index": 0}], "reasoning_content": " always use"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932884-wGz1eX8aEKiwuYKtVVBo", "object": "chat.completion.chunk", "created": 1773932884, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " at the", "format": "unknown", "index": 0}], "reasoning_content": " at the"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940175-vloQES0Y8dbGoX4T9wNv", "object": "chat.completion.chunk", "created": 1787940175, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " both add", "format": "unknown", "index": 0}], "reasoning_content": " both add"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932884-wGz1eX8aEKiwuYKtVVBo", "object": "chat.completion.chunk", "created": 1773932884, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " same time", "format": "unknown", "index": 0}], "reasoning_content": " same time"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940175-vloQES0Y8dbGoX4T9wNv", "object": "chat.completion.chunk", "created": 1787940175, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " and multiply", "format": "unknown", "index": 0}], "reasoning_content": " and multiply"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932884-wGz1eX8aEKiwuYKtVVBo", "object": "chat.completion.chunk", "created": 1773932884, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": ".\"\n\n", "format": "unknown", "index": 0}], "reasoning_content": ".\"\n\n"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940175-vloQES0Y8dbGoX4T9wNv", "object": "chat.completion.chunk", "created": 1787940175, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " at the", "format": "unknown", "index": 0}], "reasoning_content": " at the"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932884-wGz1eX8aEKiwuYKtVVBo", "object": "chat.completion.chunk", "created": 1773932884, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "So", "format": "unknown", "index": 0}], "reasoning_content": "So"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940175-vloQES0Y8dbGoX4T9wNv", "object": "chat.completion.chunk", "created": 1787940175, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " same time", "format": "unknown", "index": 0}], "reasoning_content": " same time"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932884-wGz1eX8aEKiwuYKtVVBo", "object": "chat.completion.chunk", "created": 1773932884, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " I need", "format": "unknown", "index": 0}], "reasoning_content": " I need"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940175-vloQES0Y8dbGoX4T9wNv", "object": "chat.completion.chunk", "created": 1787940175, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " (", "format": "unknown", "index": 0}], "reasoning_content": " ("}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932884-wGz1eX8aEKiwuYKtVVBo", "object": "chat.completion.chunk", "created": 1773932884, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " to call", "format": "unknown", "index": 0}], "reasoning_content": " to call"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940175-vloQES0Y8dbGoX4T9wNv", "object": "chat.completion.chunk", "created": 1787940175, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "which", "format": "unknown", "index": 0}], "reasoning_content": "which"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932884-wGz1eX8aEKiwuYKtVVBo", "object": "chat.completion.chunk", "created": 1773932884, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " both functions", "format": "unknown", "index": 0}], "reasoning_content": " both functions"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940175-vloQES0Y8dbGoX4T9wNv", "object": "chat.completion.chunk", "created": 1787940175, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " means calling", "format": "unknown", "index": 0}], "reasoning_content": " means calling"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932884-wGz1eX8aEKiwuYKtVVBo", "object": "chat.completion.chunk", "created": 1773932884, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": ":\n-", "format": "unknown", "index": 0}], "reasoning_content": ":\n-"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940175-vloQES0Y8dbGoX4T9wNv", "object": "chat.completion.chunk", "created": 1787940175, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " them in", "format": "unknown", "index": 0}], "reasoning_content": " them in"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932884-wGz1eX8aEKiwuYKtVVBo", "object": "chat.completion.chunk", "created": 1773932884, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " add(", "format": "unknown", "index": 0}], "reasoning_content": " add("}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940175-vloQES0Y8dbGoX4T9wNv", "object": "chat.completion.chunk", "created": 1787940175, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " the", "format": "unknown", "index": 0}], "reasoning_content": " the"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932884-wGz1eX8aEKiwuYKtVVBo", "object": "chat.completion.chunk", "created": 1773932884, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "2,", "format": "unknown", "index": 0}], "reasoning_content": "2,"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940175-vloQES0Y8dbGoX4T9wNv", "object": "chat.completion.chunk", "created": 1787940175, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " same function", "format": "unknown", "index": 0}], "reasoning_content": " same function"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932884-wGz1eX8aEKiwuYKtVVBo", "object": "chat.completion.chunk", "created": 1773932884, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " 3", "format": "unknown", "index": 0}], "reasoning_content": " 3"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940175-vloQES0Y8dbGoX4T9wNv", "object": "chat.completion.chunk", "created": 1787940175, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "_calls", "format": "unknown", "index": 0}], "reasoning_content": "_calls"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932884-wGz1eX8aEKiwuYKtVVBo", "object": "chat.completion.chunk", "created": 1773932884, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": ")\n-", "format": "unknown", "index": 0}], "reasoning_content": ")\n-"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940175-vloQES0Y8dbGoX4T9wNv", "object": "chat.completion.chunk", "created": 1787940175, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " block).\n\n", "format": "unknown", "index": 0}], "reasoning_content": " block).\n\n"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932884-wGz1eX8aEKiwuYKtVVBo", "object": "chat.completion.chunk", "created": 1773932884, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " multiply(", "format": "unknown", "index": 0}], "reasoning_content": " multiply("}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940175-vloQES0Y8dbGoX4T9wNv", "object": "chat.completion.chunk", "created": 1787940175, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "So", "format": "unknown", "index": 0}], "reasoning_content": "So"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932884-wGz1eX8aEKiwuYKtVVBo", "object": "chat.completion.chunk", "created": 1773932884, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "2,", "format": "unknown", "index": 0}], "reasoning_content": "2,"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940175-vloQES0Y8dbGoX4T9wNv", "object": "chat.completion.chunk", "created": 1787940175, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " I need", "format": "unknown", "index": 0}], "reasoning_content": " I need"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932884-wGz1eX8aEKiwuYKtVVBo", "object": "chat.completion.chunk", "created": 1773932884, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " 3", "format": "unknown", "index": 0}], "reasoning_content": " 3"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940175-vloQES0Y8dbGoX4T9wNv", "object": "chat.completion.chunk", "created": 1787940175, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " to:\n", "format": "unknown", "index": 0}], "reasoning_content": " to:\n"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932884-wGz1eX8aEKiwuYKtVVBo", "object": "chat.completion.chunk", "created": 1773932884, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": ")\n\nSince", "format": "unknown", "index": 0}], "reasoning_content": ")\n\nSince"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940175-vloQES0Y8dbGoX4T9wNv", "object": "chat.completion.chunk", "created": 1787940175, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "1.", "format": "unknown", "index": 0}], "reasoning_content": "1."}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932884-wGz1eX8aEKiwuYKtVVBo", "object": "chat.completion.chunk", "created": 1773932884, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " these are", "format": "unknown", "index": 0}], "reasoning_content": " these are"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940175-vloQES0Y8dbGoX4T9wNv", "object": "chat.completion.chunk", "created": 1787940175, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " Call add", "format": "unknown", "index": 0}], "reasoning_content": " Call add"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932884-wGz1eX8aEKiwuYKtVVBo", "object": "chat.completion.chunk", "created": 1773932884, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " independent operations", "format": "unknown", "index": 0}], "reasoning_content": " independent operations"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940175-vloQES0Y8dbGoX4T9wNv", "object": "chat.completion.chunk", "created": 1787940175, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " with a", "format": "unknown", "index": 0}], "reasoning_content": " with a"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932884-wGz1eX8aEKiwuYKtVVBo", "object": "chat.completion.chunk", "created": 1773932884, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " (", "format": "unknown", "index": 0}], "reasoning_content": " ("}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940175-vloQES0Y8dbGoX4T9wNv", "object": "chat.completion.chunk", "created": 1787940175, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "=2", "format": "unknown", "index": 0}], "reasoning_content": "=2"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932884-wGz1eX8aEKiwuYKtVVBo", "object": "chat.completion.chunk", "created": 1773932884, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "they", "format": "unknown", "index": 0}], "reasoning_content": "they"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940175-vloQES0Y8dbGoX4T9wNv", "object": "chat.completion.chunk", "created": 1787940175, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": ", b", "format": "unknown", "index": 0}], "reasoning_content": ", b"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932884-wGz1eX8aEKiwuYKtVVBo", "object": "chat.completion.chunk", "created": 1773932884, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " don't depend", "format": "unknown", "index": 0}], "reasoning_content": " don't depend"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940175-vloQES0Y8dbGoX4T9wNv", "object": "chat.completion.chunk", "created": 1787940175, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "=3", "format": "unknown", "index": 0}], "reasoning_content": "=3"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932884-wGz1eX8aEKiwuYKtVVBo", "object": "chat.completion.chunk", "created": 1773932884, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " on each", "format": "unknown", "index": 0}], "reasoning_content": " on each"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940175-vloQES0Y8dbGoX4T9wNv", "object": "chat.completion.chunk", "created": 1787940175, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "\n2", "format": "unknown", "index": 0}], "reasoning_content": "\n2"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932884-wGz1eX8aEKiwuYKtVVBo", "object": "chat.completion.chunk", "created": 1773932884, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " other),", "format": "unknown", "index": 0}], "reasoning_content": " other),"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940175-vloQES0Y8dbGoX4T9wNv", "object": "chat.completion.chunk", "created": 1787940175, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": ". Call", "format": "unknown", "index": 0}], "reasoning_content": ". Call"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932884-wGz1eX8aEKiwuYKtVVBo", "object": "chat.completion.chunk", "created": 1773932884, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " I can", "format": "unknown", "index": 0}], "reasoning_content": " I can"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940175-vloQES0Y8dbGoX4T9wNv", "object": "chat.completion.chunk", "created": 1787940175, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " multiply with", "format": "unknown", "index": 0}], "reasoning_content": " multiply with"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932884-wGz1eX8aEKiwuYKtVVBo", "object": "chat.completion.chunk", "created": 1773932884, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " make both", "format": "unknown", "index": 0}], "reasoning_content": " make both"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932884-wGz1eX8aEKiwuYKtVVBo", "object": "chat.completion.chunk", "created": 1773932884, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " calls in", "format": "unknown", "index": 0}], "reasoning_content": " calls in"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940175-vloQES0Y8dbGoX4T9wNv", "object": "chat.completion.chunk", "created": 1787940175, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " a=", "format": "unknown", "index": 0}], "reasoning_content": " a="}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932884-wGz1eX8aEKiwuYKtVVBo", "object": "chat.completion.chunk", "created": 1773932884, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " the same", "format": "unknown", "index": 0}], "reasoning_content": " the same"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940175-vloQES0Y8dbGoX4T9wNv", "object": "chat.completion.chunk", "created": 1787940175, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "2,", "format": "unknown", "index": 0}], "reasoning_content": "2,"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932884-wGz1eX8aEKiwuYKtVVBo", "object": "chat.completion.chunk", "created": 1773932884, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " function_calls", "format": "unknown", "index": 0}], "reasoning_content": " function_calls"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940175-vloQES0Y8dbGoX4T9wNv", "object": "chat.completion.chunk", "created": 1787940175, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " b=", "format": "unknown", "index": 0}], "reasoning_content": " b="}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932884-wGz1eX8aEKiwuYKtVVBo", "object": "chat.completion.chunk", "created": 1773932884, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " block.", "format": "unknown", "index": 0}], "reasoning_content": " block."}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940175-vloQES0Y8dbGoX4T9wNv", "object": "chat.completion.chunk", "created": 1787940175, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "3\n\n", "format": "unknown", "index": 0}], "reasoning_content": "3\n\n"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932884-wGz1eX8aEKiwuYKtVVBo", "object": "chat.completion.chunk", "created": 1773932884, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " ", "format": "unknown", "index": 0}], "reasoning_content": " "}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940175-vloQES0Y8dbGoX4T9wNv", "object": "chat.completion.chunk", "created": 1787940175, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "I'll", "format": "unknown", "index": 0}], "reasoning_content": "I'll"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932884-wGz1eX8aEKiwuYKtVVBo", "object": "chat.completion.chunk", "created": 1773932884, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " I'll", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940175-vloQES0Y8dbGoX4T9wNv", "object": "chat.completion.chunk", "created": 1787940175, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " make", "format": "unknown", "index": 0}], "reasoning_content": " make"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932884-wGz1eX8aEKiwuYKtVVBo", "object": "chat.completion.chunk", "created": 1773932884, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " add and", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940175-vloQES0Y8dbGoX4T9wNv", "object": "chat.completion.chunk", "created": 1787940175, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " both calls", "format": "unknown", "index": 0}], "reasoning_content": " both calls"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932884-wGz1eX8aEKiwuYKtVVBo", "object": "chat.completion.chunk", "created": 1773932884, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " multiply ", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940175-vloQES0Y8dbGoX4T9wNv", "object": "chat.completion.chunk", "created": 1787940175, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " in the", "format": "unknown", "index": 0}], "reasoning_content": " in the"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932884-wGz1eX8aEKiwuYKtVVBo", "object": "chat.completion.chunk", "created": 1773932884, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "2 and", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940175-vloQES0Y8dbGoX4T9wNv", "object": "chat.completion.chunk", "created": 1787940175, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " same function", "format": "unknown", "index": 0}], "reasoning_content": " same function"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932884-wGz1eX8aEKiwuYKtVVBo", "object": "chat.completion.chunk", "created": 1773932884, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " 3", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940175-vloQES0Y8dbGoX4T9wNv", "object": "chat.completion.chunk", "created": 1787940175, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "_calls block", "format": "unknown", "index": 0}], "reasoning_content": "_calls block"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932884-wGz1eX8aEKiwuYKtVVBo", "object": "chat.completion.chunk", "created": 1773932884, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " for you", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940175-vloQES0Y8dbGoX4T9wNv", "object": "chat.completion.chunk", "created": 1787940175, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " since", "format": "unknown", "index": 0}], "reasoning_content": " since"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932884-wGz1eX8aEKiwuYKtVVBo", "object": "chat.completion.chunk", "created": 1773932884, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " at", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940175-vloQES0Y8dbGoX4T9wNv", "object": "chat.completion.chunk", "created": 1787940175, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " they are", "format": "unknown", "index": 0}], "reasoning_content": " they are"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932884-wGz1eX8aEKiwuYKtVVBo", "object": "chat.completion.chunk", "created": 1773932884, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " the same", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940175-vloQES0Y8dbGoX4T9wNv", "object": "chat.completion.chunk", "created": 1787940175, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " independent of", "format": "unknown", "index": 0}], "reasoning_content": " independent of"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932884-wGz1eX8aEKiwuYKtVVBo", "object": "chat.completion.chunk", "created": 1773932884, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " time.", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940175-vloQES0Y8dbGoX4T9wNv", "object": "chat.completion.chunk", "created": 1787940175, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " each other", "format": "unknown", "index": 0}], "reasoning_content": " each other"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932884-wGz1eX8aEKiwuYKtVVBo", "object": "chat.completion.chunk", "created": 1773932884, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " ", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940175-vloQES0Y8dbGoX4T9wNv", "object": "chat.completion.chunk", "created": 1787940175, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": ". ", "format": "unknown", "index": 0}], "reasoning_content": ". "}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932884-wGz1eX8aEKiwuYKtVVBo", "object": "chat.completion.chunk", "created": 1773932884, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": null, "role": "assistant", "tool_calls": [{"index": 0, "id": "functions.add:0", "type": "function", "function": {"name": "add", "arguments": ""}}]}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940175-vloQES0Y8dbGoX4T9wNv", "object": "chat.completion.chunk", "created": 1787940175, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " I'll add", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932884-wGz1eX8aEKiwuYKtVVBo", "object": "chat.completion.chunk", "created": 1773932884, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": null, "role": "assistant", "tool_calls": [{"index": 0, "function": {"arguments": "{\"a\": 2, \"b\": 3}"}}]}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940175-vloQES0Y8dbGoX4T9wNv", "object": "chat.completion.chunk", "created": 1787940175, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " and multiply", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932884-wGz1eX8aEKiwuYKtVVBo", "object": "chat.completion.chunk", "created": 1773932884, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " ", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940175-vloQES0Y8dbGoX4T9wNv", "object": "chat.completion.chunk", "created": 1787940175, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " the", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932884-wGz1eX8aEKiwuYKtVVBo", "object": "chat.completion.chunk", "created": 1773932884, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": null, "role": "assistant", "tool_calls": [{"index": 1, "id": "functions.multiply:1", "type": "function", "function": {"name": "multiply", "arguments": ""}}]}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940175-vloQES0Y8dbGoX4T9wNv", "object": "chat.completion.chunk", "created": 1787940175, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " numbers ", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932884-wGz1eX8aEKiwuYKtVVBo", "object": "chat.completion.chunk", "created": 1773932884, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": null, "role": "assistant", "tool_calls": [{"index": 1, "function": {"arguments": "{\"a\": 2, \"b\": 3}"}}]}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940175-vloQES0Y8dbGoX4T9wNv", "object": "chat.completion.chunk", "created": 1787940175, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "2 and", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932884-wGz1eX8aEKiwuYKtVVBo", "object": "chat.completion.chunk", "created": 1773932884, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_content": null}, "finish_reason": "tool_calls", "native_finish_reason": "tool_calls"}]} + data: {"id": "gen-1787940175-vloQES0Y8dbGoX4T9wNv", "object": "chat.completion.chunk", "created": 1787940175, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " 3", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932884-wGz1eX8aEKiwuYKtVVBo", "object": "chat.completion.chunk", "created": 1773932884, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant"}, "finish_reason": "tool_calls", "native_finish_reason": "tool_calls"}], "usage": {"prompt_tokens": 154, "completion_tokens": 131, "total_tokens": 285, "cost": 0.0003287, "prompt_tokens_details": {"cached_tokens": 128, "cache_write_tokens": 0, "audio_tokens": 0, "video_tokens": 0}, "completion_tokens_details": {"reasoning_tokens": 87, "image_tokens": 0, "audio_tokens": 0}}} + data: {"id": "gen-1787940175-vloQES0Y8dbGoX4T9wNv", "object": "chat.completion.chunk", "created": 1787940175, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " for you", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + + data: {"id": "gen-1787940175-vloQES0Y8dbGoX4T9wNv", "object": "chat.completion.chunk", "created": 1787940175, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " using both", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + + data: {"id": "gen-1787940175-vloQES0Y8dbGoX4T9wNv", "object": "chat.completion.chunk", "created": 1787940175, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " operations", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + + data: {"id": "gen-1787940175-vloQES0Y8dbGoX4T9wNv", "object": "chat.completion.chunk", "created": 1787940175, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": ". ", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + + data: {"id": "gen-1787940175-vloQES0Y8dbGoX4T9wNv", "object": "chat.completion.chunk", "created": 1787940175, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " ", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + + + + + data: {"id": "gen-1787940175-vloQES0Y8dbGoX4T9wNv", "object": "chat.completion.chunk", "created": 1787940175, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": null, "role": "assistant", "tool_calls": [{"index": 0, "id": "functions.add:0", "type": "function", "function": {"name": "add", "arguments": ""}}]}, "finish_reason": null, "native_finish_reason": null}]} + + data: {"id": "gen-1787940175-vloQES0Y8dbGoX4T9wNv", "object": "chat.completion.chunk", "created": 1787940175, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": null, "role": "assistant", "tool_calls": [{"index": 0, "function": {"arguments": "{\"a\": 2, \"b\": 3}"}}]}, "finish_reason": null, "native_finish_reason": null}]} + + data: {"id": "gen-1787940175-vloQES0Y8dbGoX4T9wNv", "object": "chat.completion.chunk", "created": 1787940175, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " ", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + + data: {"id": "gen-1787940175-vloQES0Y8dbGoX4T9wNv", "object": "chat.completion.chunk", "created": 1787940175, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": null, "role": "assistant", "tool_calls": [{"index": 1, "id": "functions.multiply:1", "type": "function", "function": {"name": "multiply", "arguments": ""}}]}, "finish_reason": null, "native_finish_reason": null}]} + + data: {"id": "gen-1787940175-vloQES0Y8dbGoX4T9wNv", "object": "chat.completion.chunk", "created": 1787940175, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": null, "role": "assistant", "tool_calls": [{"index": 1, "function": {"arguments": "{\"a\": 2, \"b\": 3}"}}]}, "finish_reason": null, "native_finish_reason": null}]} + + data: {"id": "gen-1787940175-vloQES0Y8dbGoX4T9wNv", "object": "chat.completion.chunk", "created": 1787940175, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_content": null}, "finish_reason": "tool_calls", "native_finish_reason": "tool_calls"}]} + + data: {"id": "gen-1787940175-vloQES0Y8dbGoX4T9wNv", "object": "chat.completion.chunk", "created": 1787940175, "model": "moonshotai/kimi-k2.5", "service_tier": null, "choices": [{"index": 0, "delta": {"content": "", "role": "assistant"}, "finish_reason": "tool_calls", "native_finish_reason": "tool_calls"}], "usage": {"prompt_tokens": 154, "completion_tokens": 152, "total_tokens": 306, "cost": 0.0004037, "prompt_tokens_details": {"cached_tokens": 0, "cache_write_tokens": 0, "audio_tokens": 0, "video_tokens": 0}, "completion_tokens_details": {"reasoning_tokens": 96, "image_tokens": 0, "audio_tokens": 0}}} data: [DONE] @@ -155,22 +178,22 @@ interactions: - text/event-stream; charset=utf-8 status: 200 OK code: 200 - duration: 362.715792ms + duration: 434.84025ms - id: 1 request: proto: HTTP/1.1 proto_major: 1 proto_minor: 1 - content_length: 1620 + content_length: 1745 host: "" - body: '{"messages":[{"content":"You are a helpful assistant. Always use both add and multiply at the same time.","role":"system"},{"content":"Add and multiply the number 2 and 3","role":"user"},{"content":" ","tool_calls":[{"id":"functions.add:0","function":{"arguments":"{\"a\": 2, \"b\": 3}","name":"add"},"type":"function"},{"id":"functions.multiply:1","function":{"arguments":"{\"a\": 2, \"b\": 3}","name":"multiply"},"type":"function"}],"role":"assistant","reasoning_content":"The user wants me to add and multiply the numbers 2 and 3. The instruction says \"Always use both add and multiply at the same time.\"\n\nSo I need to call both functions:\n- add(2, 3)\n- multiply(2, 3)\n\nSince these are independent operations (they don''t depend on each other), I can make both calls in the same function_calls block. "},{"content":"5","tool_call_id":"functions.add:0","role":"tool"},{"content":"6","tool_call_id":"functions.multiply:1","role":"tool"}],"model":"moonshotai/kimi-k2.5","max_tokens":4000,"stream_options":{"include_usage":true},"tool_choice":"auto","tools":[{"function":{"name":"add","strict":false,"description":"Add two numbers","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"}},"type":"function"},{"function":{"name":"multiply","strict":false,"description":"Multiply two numbers","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"}},"type":"function"}],"stream":true}' + body: '{"messages":[{"content":"You are a helpful assistant. Always use both add and multiply at the same time.","role":"system"},{"content":"Add and multiply the number 2 and 3","role":"user"},{"content":" I''ll add and multiply the numbers 2 and 3 for you using both operations. \n ","tool_calls":[{"id":"functions.add:0","function":{"arguments":"{\"a\": 2, \"b\": 3}","name":"add"},"type":"function"},{"id":"functions.multiply:1","function":{"arguments":"{\"a\": 2, \"b\": 3}","name":"multiply"},"type":"function"}],"role":"assistant","reasoning_content":"The user wants me to add and multiply the numbers 2 and 3. According to my instructions, I should always use both add and multiply at the same time (which means calling them in the same function_calls block).\n\nSo I need to:\n1. Call add with a=2, b=3\n2. Call multiply with a=2, b=3\n\nI''ll make both calls in the same function_calls block since they are independent of each other. "},{"content":"5","tool_call_id":"functions.add:0","role":"tool"},{"content":"6","tool_call_id":"functions.multiply:1","role":"tool"}],"model":"moonshotai/kimi-k2.5","max_tokens":4000,"stream_options":{"include_usage":true},"tool_choice":"auto","tools":[{"function":{"name":"add","strict":false,"description":"Add two numbers","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"}},"type":"function"},{"function":{"name":"multiply","strict":false,"description":"Multiply two numbers","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"}},"type":"function"}],"stream":true}' headers: Accept: - application/json Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.15.0 (https://charm.land/fantasy) + - Charm-Fantasy/0.41.3 (https://charm.land/fantasy) url: https://api.avian.io/v1/chat/completions method: POST response: @@ -179,90 +202,86 @@ interactions: proto_minor: 0 content_length: -1 body: |+ - data: {"id": "chatcmpl-3e07ab841333408298e7e6fe", "object": "chat.completion.chunk", "created": 1773932887, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"role": "assistant"}, "finish_reason": null}]} - - - data: {"id": "gen-1773932887-UC9ZiV5rru8IUs3iJx0w", "object": "chat.completion.chunk", "created": 1773932887, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "Great", "format": "unknown", "index": 0}], "reasoning_content": "Great"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "chatcmpl-769fd23b01884e5288db3da0", "object": "chat.completion.chunk", "created": 1787940182, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"role": "assistant"}, "finish_reason": null}]} - data: {"id": "gen-1773932887-UC9ZiV5rru8IUs3iJx0w", "object": "chat.completion.chunk", "created": 1773932887, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "! I", "format": "unknown", "index": 0}], "reasoning_content": "! I"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932887-UC9ZiV5rru8IUs3iJx0w", "object": "chat.completion.chunk", "created": 1773932887, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " got the", "format": "unknown", "index": 0}], "reasoning_content": " got the"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940182-CwFVF1DOSxpaCzVOagww", "object": "chat.completion.chunk", "created": 1787940182, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "The", "format": "unknown", "index": 0}], "reasoning_content": "The"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932887-UC9ZiV5rru8IUs3iJx0w", "object": "chat.completion.chunk", "created": 1773932887, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " results:\n", "format": "unknown", "index": 0}], "reasoning_content": " results:\n"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940182-CwFVF1DOSxpaCzVOagww", "object": "chat.completion.chunk", "created": 1787940182, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " results are", "format": "unknown", "index": 0}], "reasoning_content": " results are"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932887-UC9ZiV5rru8IUs3iJx0w", "object": "chat.completion.chunk", "created": 1773932887, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "- add", "format": "unknown", "index": 0}], "reasoning_content": "- add"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940182-CwFVF1DOSxpaCzVOagww", "object": "chat.completion.chunk", "created": 1787940182, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": ":\n-", "format": "unknown", "index": 0}], "reasoning_content": ":\n-"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932887-UC9ZiV5rru8IUs3iJx0w", "object": "chat.completion.chunk", "created": 1773932887, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "(2", "format": "unknown", "index": 0}], "reasoning_content": "(2"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940182-CwFVF1DOSxpaCzVOagww", "object": "chat.completion.chunk", "created": 1787940182, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " add(", "format": "unknown", "index": 0}], "reasoning_content": " add("}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932887-UC9ZiV5rru8IUs3iJx0w", "object": "chat.completion.chunk", "created": 1773932887, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": ", ", "format": "unknown", "index": 0}], "reasoning_content": ", "}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940182-CwFVF1DOSxpaCzVOagww", "object": "chat.completion.chunk", "created": 1787940182, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "2,", "format": "unknown", "index": 0}], "reasoning_content": "2,"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932887-UC9ZiV5rru8IUs3iJx0w", "object": "chat.completion.chunk", "created": 1773932887, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "3)", "format": "unknown", "index": 0}], "reasoning_content": "3)"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940182-CwFVF1DOSxpaCzVOagww", "object": "chat.completion.chunk", "created": 1787940182, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " 3", "format": "unknown", "index": 0}], "reasoning_content": " 3"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932887-UC9ZiV5rru8IUs3iJx0w", "object": "chat.completion.chunk", "created": 1773932887, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " = ", "format": "unknown", "index": 0}], "reasoning_content": " = "}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940182-CwFVF1DOSxpaCzVOagww", "object": "chat.completion.chunk", "created": 1787940182, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": ") =", "format": "unknown", "index": 0}], "reasoning_content": ") ="}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932887-UC9ZiV5rru8IUs3iJx0w", "object": "chat.completion.chunk", "created": 1773932887, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "5\n", "format": "unknown", "index": 0}], "reasoning_content": "5\n"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940182-CwFVF1DOSxpaCzVOagww", "object": "chat.completion.chunk", "created": 1787940182, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " 5", "format": "unknown", "index": 0}], "reasoning_content": " 5"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932887-UC9ZiV5rru8IUs3iJx0w", "object": "chat.completion.chunk", "created": 1773932887, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "- multiply", "format": "unknown", "index": 0}], "reasoning_content": "- multiply"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940182-CwFVF1DOSxpaCzVOagww", "object": "chat.completion.chunk", "created": 1787940182, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "\n-", "format": "unknown", "index": 0}], "reasoning_content": "\n-"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932887-UC9ZiV5rru8IUs3iJx0w", "object": "chat.completion.chunk", "created": 1773932887, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "(2", "format": "unknown", "index": 0}], "reasoning_content": "(2"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940182-CwFVF1DOSxpaCzVOagww", "object": "chat.completion.chunk", "created": 1787940182, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " multiply(", "format": "unknown", "index": 0}], "reasoning_content": " multiply("}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932887-UC9ZiV5rru8IUs3iJx0w", "object": "chat.completion.chunk", "created": 1773932887, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": ", ", "format": "unknown", "index": 0}], "reasoning_content": ", "}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940182-CwFVF1DOSxpaCzVOagww", "object": "chat.completion.chunk", "created": 1787940182, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "2,", "format": "unknown", "index": 0}], "reasoning_content": "2,"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932887-UC9ZiV5rru8IUs3iJx0w", "object": "chat.completion.chunk", "created": 1773932887, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "3)", "format": "unknown", "index": 0}], "reasoning_content": "3)"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940182-CwFVF1DOSxpaCzVOagww", "object": "chat.completion.chunk", "created": 1787940182, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " 3", "format": "unknown", "index": 0}], "reasoning_content": " 3"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932887-UC9ZiV5rru8IUs3iJx0w", "object": "chat.completion.chunk", "created": 1773932887, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " = ", "format": "unknown", "index": 0}], "reasoning_content": " = "}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940182-CwFVF1DOSxpaCzVOagww", "object": "chat.completion.chunk", "created": 1787940182, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": ") =", "format": "unknown", "index": 0}], "reasoning_content": ") ="}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932887-UC9ZiV5rru8IUs3iJx0w", "object": "chat.completion.chunk", "created": 1773932887, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "6\n\n", "format": "unknown", "index": 0}], "reasoning_content": "6\n\n"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940182-CwFVF1DOSxpaCzVOagww", "object": "chat.completion.chunk", "created": 1787940182, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " 6", "format": "unknown", "index": 0}], "reasoning_content": " 6"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932887-UC9ZiV5rru8IUs3iJx0w", "object": "chat.completion.chunk", "created": 1773932887, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "Now I'll", "format": "unknown", "index": 0}], "reasoning_content": "Now I'll"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940182-CwFVF1DOSxpaCzVOagww", "object": "chat.completion.chunk", "created": 1787940182, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "\n\nI", "format": "unknown", "index": 0}], "reasoning_content": "\n\nI"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932887-UC9ZiV5rru8IUs3iJx0w", "object": "chat.completion.chunk", "created": 1773932887, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " present", "format": "unknown", "index": 0}], "reasoning_content": " present"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940182-CwFVF1DOSxpaCzVOagww", "object": "chat.completion.chunk", "created": 1787940182, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " should present", "format": "unknown", "index": 0}], "reasoning_content": " should present"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932887-UC9ZiV5rru8IUs3iJx0w", "object": "chat.completion.chunk", "created": 1773932887, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " these", "format": "unknown", "index": 0}], "reasoning_content": " these"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940182-CwFVF1DOSxpaCzVOagww", "object": "chat.completion.chunk", "created": 1787940182, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " these results", "format": "unknown", "index": 0}], "reasoning_content": " these results"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932887-UC9ZiV5rru8IUs3iJx0w", "object": "chat.completion.chunk", "created": 1773932887, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " results to", "format": "unknown", "index": 0}], "reasoning_content": " results to"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940182-CwFVF1DOSxpaCzVOagww", "object": "chat.completion.chunk", "created": 1787940182, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " to", "format": "unknown", "index": 0}], "reasoning_content": " to"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932887-UC9ZiV5rru8IUs3iJx0w", "object": "chat.completion.chunk", "created": 1773932887, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " the user", "format": "unknown", "index": 0}], "reasoning_content": " the user"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940182-CwFVF1DOSxpaCzVOagww", "object": "chat.completion.chunk", "created": 1787940182, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " the user", "format": "unknown", "index": 0}], "reasoning_content": " the user"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932887-UC9ZiV5rru8IUs3iJx0w", "object": "chat.completion.chunk", "created": 1773932887, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": ". ", "format": "unknown", "index": 0}], "reasoning_content": ". "}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940182-CwFVF1DOSxpaCzVOagww", "object": "chat.completion.chunk", "created": 1787940182, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " clearly.", "format": "unknown", "index": 0}], "reasoning_content": " clearly."}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932887-UC9ZiV5rru8IUs3iJx0w", "object": "chat.completion.chunk", "created": 1773932887, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " When", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940182-CwFVF1DOSxpaCzVOagww", "object": "chat.completion.chunk", "created": 1787940182, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " ", "format": "unknown", "index": 0}], "reasoning_content": " "}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932887-UC9ZiV5rru8IUs3iJx0w", "object": "chat.completion.chunk", "created": 1773932887, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " you add", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940182-CwFVF1DOSxpaCzVOagww", "object": "chat.completion.chunk", "created": 1787940182, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " Here", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932887-UC9ZiV5rru8IUs3iJx0w", "object": "chat.completion.chunk", "created": 1773932887, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " 2", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940182-CwFVF1DOSxpaCzVOagww", "object": "chat.completion.chunk", "created": 1787940182, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " are the", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932887-UC9ZiV5rru8IUs3iJx0w", "object": "chat.completion.chunk", "created": 1773932887, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " and ", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940182-CwFVF1DOSxpaCzVOagww", "object": "chat.completion.chunk", "created": 1787940182, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " results:\n\n", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932887-UC9ZiV5rru8IUs3iJx0w", "object": "chat.completion.chunk", "created": 1773932887, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "3,", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940182-CwFVF1DOSxpaCzVOagww", "object": "chat.completion.chunk", "created": 1787940182, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "**", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932887-UC9ZiV5rru8IUs3iJx0w", "object": "chat.completion.chunk", "created": 1773932887, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " the", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940182-CwFVF1DOSxpaCzVOagww", "object": "chat.completion.chunk", "created": 1787940182, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "Addition:**", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932887-UC9ZiV5rru8IUs3iJx0w", "object": "chat.completion.chunk", "created": 1773932887, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " result is", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940182-CwFVF1DOSxpaCzVOagww", "object": "chat.completion.chunk", "created": 1787940182, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " 2", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932887-UC9ZiV5rru8IUs3iJx0w", "object": "chat.completion.chunk", "created": 1773932887, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " **5", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940182-CwFVF1DOSxpaCzVOagww", "object": "chat.completion.chunk", "created": 1787940182, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " + ", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932887-UC9ZiV5rru8IUs3iJx0w", "object": "chat.completion.chunk", "created": 1773932887, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "**.\n", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940182-CwFVF1DOSxpaCzVOagww", "object": "chat.completion.chunk", "created": 1787940182, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "3 =", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932887-UC9ZiV5rru8IUs3iJx0w", "object": "chat.completion.chunk", "created": 1773932887, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "When you", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940182-CwFVF1DOSxpaCzVOagww", "object": "chat.completion.chunk", "created": 1787940182, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " **5", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932887-UC9ZiV5rru8IUs3iJx0w", "object": "chat.completion.chunk", "created": 1773932887, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " multiply ", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940182-CwFVF1DOSxpaCzVOagww", "object": "chat.completion.chunk", "created": 1787940182, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "**\n\n**", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932887-UC9ZiV5rru8IUs3iJx0w", "object": "chat.completion.chunk", "created": 1773932887, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "2 and", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940182-CwFVF1DOSxpaCzVOagww", "object": "chat.completion.chunk", "created": 1787940182, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "Multiplication", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932887-UC9ZiV5rru8IUs3iJx0w", "object": "chat.completion.chunk", "created": 1773932887, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " 3", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940182-CwFVF1DOSxpaCzVOagww", "object": "chat.completion.chunk", "created": 1787940182, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": ":** ", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932887-UC9ZiV5rru8IUs3iJx0w", "object": "chat.completion.chunk", "created": 1773932887, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": ", the", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940182-CwFVF1DOSxpaCzVOagww", "object": "chat.completion.chunk", "created": 1787940182, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "2 ×", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932887-UC9ZiV5rru8IUs3iJx0w", "object": "chat.completion.chunk", "created": 1773932887, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " result is", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940182-CwFVF1DOSxpaCzVOagww", "object": "chat.completion.chunk", "created": 1787940182, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " 3", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932887-UC9ZiV5rru8IUs3iJx0w", "object": "chat.completion.chunk", "created": 1773932887, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " **6", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940182-CwFVF1DOSxpaCzVOagww", "object": "chat.completion.chunk", "created": 1787940182, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " = **", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932887-UC9ZiV5rru8IUs3iJx0w", "object": "chat.completion.chunk", "created": 1773932887, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "**.", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940182-CwFVF1DOSxpaCzVOagww", "object": "chat.completion.chunk", "created": 1787940182, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "6**", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932887-UC9ZiV5rru8IUs3iJx0w", "object": "chat.completion.chunk", "created": 1773932887, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_content": null}, "finish_reason": "stop", "native_finish_reason": "stop"}]} + data: {"id": "gen-1787940182-CwFVF1DOSxpaCzVOagww", "object": "chat.completion.chunk", "created": 1787940182, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_content": null}, "finish_reason": "stop", "native_finish_reason": "stop"}]} - data: {"id": "gen-1773932887-UC9ZiV5rru8IUs3iJx0w", "object": "chat.completion.chunk", "created": 1773932887, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant"}, "finish_reason": "stop", "native_finish_reason": "stop"}], "usage": {"prompt_tokens": 308, "completion_tokens": 71, "total_tokens": 379, "cost": 0.0002444, "prompt_tokens_details": {"cached_tokens": 224, "cache_write_tokens": 0, "audio_tokens": 0, "video_tokens": 0}, "completion_tokens_details": {"reasoning_tokens": 30, "image_tokens": 0, "audio_tokens": 0}}} + data: {"id": "gen-1787940182-CwFVF1DOSxpaCzVOagww", "object": "chat.completion.chunk", "created": 1787940182, "model": "moonshotai/kimi-k2.5", "service_tier": null, "choices": [{"index": 0, "delta": {"content": "", "role": "assistant"}, "finish_reason": "stop", "native_finish_reason": "stop"}], "usage": {"prompt_tokens": 340, "completion_tokens": 69, "total_tokens": 409, "cost": 0.0002544, "prompt_tokens_details": {"cached_tokens": 224, "cache_write_tokens": 0, "audio_tokens": 0, "video_tokens": 0}, "completion_tokens_details": {"reasoning_tokens": 28, "image_tokens": 0, "audio_tokens": 0}}} data: [DONE] @@ -271,4 +290,4 @@ interactions: - text/event-stream; charset=utf-8 status: 200 OK code: 200 - duration: 346.239959ms + duration: 408.546208ms diff --git a/providertests/testdata/TestOpenAICompatibleCommon/avian-kimi/simple_streaming.yaml b/providertests/testdata/TestOpenAICompatibleCommon/avian-kimi/simple_streaming.yaml index 97ae95b4c..7ecdcc796 100644 --- a/providertests/testdata/TestOpenAICompatibleCommon/avian-kimi/simple_streaming.yaml +++ b/providertests/testdata/TestOpenAICompatibleCommon/avian-kimi/simple_streaming.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.15.0 (https://charm.land/fantasy) + - Charm-Fantasy/0.41.3 (https://charm.land/fantasy) url: https://api.avian.io/v1/chat/completions method: POST response: @@ -24,284 +24,295 @@ interactions: proto_minor: 0 content_length: -1 body: |+ - data: {"id": "chatcmpl-03d7a8c9ff7843d98715145a", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"role": "assistant"}, "finish_reason": null}]} + data: {"id": "chatcmpl-d75fe4426c9246c6bc458b2b", "object": "chat.completion.chunk", "created": 1787940148, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"role": "assistant"}, "finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "The", "format": "unknown", "index": 0}], "reasoning_content": "The"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "The", "format": "unknown", "index": 0}], "reasoning_content": "The"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " user wants", "format": "unknown", "index": 0}], "reasoning_content": " user wants"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " user wants", "format": "unknown", "index": 0}], "reasoning_content": " user wants"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " me to", "format": "unknown", "index": 0}], "reasoning_content": " me to"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " me to", "format": "unknown", "index": 0}], "reasoning_content": " me to"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " say \"", "format": "unknown", "index": 0}], "reasoning_content": " say \""}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " say \"", "format": "unknown", "index": 0}], "reasoning_content": " say \""}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "hi\"", "format": "unknown", "index": 0}], "reasoning_content": "hi\""}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "hi\"", "format": "unknown", "index": 0}], "reasoning_content": "hi\""}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " in Portuguese", "format": "unknown", "index": 0}], "reasoning_content": " in Portuguese"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " in Portuguese", "format": "unknown", "index": 0}], "reasoning_content": " in Portuguese"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": ". \n\n", "format": "unknown", "index": 0}], "reasoning_content": ". \n\n"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": ". \n\n", "format": "unknown", "index": 0}], "reasoning_content": ". \n\n"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "In", "format": "unknown", "index": 0}], "reasoning_content": "In"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "The", "format": "unknown", "index": 0}], "reasoning_content": "The"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " Portuguese,", "format": "unknown", "index": 0}], "reasoning_content": " Portuguese,"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " most common", "format": "unknown", "index": 0}], "reasoning_content": " most common"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " the common", "format": "unknown", "index": 0}], "reasoning_content": " the common"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " ways to", "format": "unknown", "index": 0}], "reasoning_content": " ways to"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " ways to", "format": "unknown", "index": 0}], "reasoning_content": " ways to"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " say \"", "format": "unknown", "index": 0}], "reasoning_content": " say \""}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " say \"", "format": "unknown", "index": 0}], "reasoning_content": " say \""}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "hi\"", "format": "unknown", "index": 0}], "reasoning_content": "hi\""}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "hi\"", "format": "unknown", "index": 0}], "reasoning_content": "hi\""}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " are:\n", "format": "unknown", "index": 0}], "reasoning_content": " are:\n"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " in Portuguese", "format": "unknown", "index": 0}], "reasoning_content": " in Portuguese"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "- \"", "format": "unknown", "index": 0}], "reasoning_content": "- \""}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " are:\n", "format": "unknown", "index": 0}], "reasoning_content": " are:\n"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "Oi", "format": "unknown", "index": 0}], "reasoning_content": "Oi"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "- \"", "format": "unknown", "index": 0}], "reasoning_content": "- \""}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "\" -", "format": "unknown", "index": 0}], "reasoning_content": "\" -"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "Olá", "format": "unknown", "index": 0}], "reasoning_content": "Olá"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " informal", "format": "unknown", "index": 0}], "reasoning_content": " informal"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "\" -", "format": "unknown", "index": 0}], "reasoning_content": "\" -"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": ", most", "format": "unknown", "index": 0}], "reasoning_content": ", most"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " formal and", "format": "unknown", "index": 0}], "reasoning_content": " formal and"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " common\n", "format": "unknown", "index": 0}], "reasoning_content": " common\n"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " versatile", "format": "unknown", "index": 0}], "reasoning_content": " versatile"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "- \"", "format": "unknown", "index": 0}], "reasoning_content": "- \""}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": ", works", "format": "unknown", "index": 0}], "reasoning_content": ", works"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "Olá", "format": "unknown", "index": 0}], "reasoning_content": "Olá"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " in", "format": "unknown", "index": 0}], "reasoning_content": " in"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "\" -", "format": "unknown", "index": 0}], "reasoning_content": "\" -"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " most situations", "format": "unknown", "index": 0}], "reasoning_content": " most situations"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " slightly", "format": "unknown", "index": 0}], "reasoning_content": " slightly"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "\n-", "format": "unknown", "index": 0}], "reasoning_content": "\n-"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " more formal", "format": "unknown", "index": 0}], "reasoning_content": " more formal"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " \"Oi", "format": "unknown", "index": 0}], "reasoning_content": " \"Oi"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": ", means", "format": "unknown", "index": 0}], "reasoning_content": ", means"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "\" -", "format": "unknown", "index": 0}], "reasoning_content": "\" -"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " \"hello", "format": "unknown", "index": 0}], "reasoning_content": " \"hello"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " informal,", "format": "unknown", "index": 0}], "reasoning_content": " informal,"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "\"\n-", "format": "unknown", "index": 0}], "reasoning_content": "\"\n-"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " very", "format": "unknown", "index": 0}], "reasoning_content": " very"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " \"E", "format": "unknown", "index": 0}], "reasoning_content": " \"E"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " common in", "format": "unknown", "index": 0}], "reasoning_content": " common in"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " a", "format": "unknown", "index": 0}], "reasoning_content": " a"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " Brazil\n", "format": "unknown", "index": 0}], "reasoning_content": " Brazil\n"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "í?\"", "format": "unknown", "index": 0}], "reasoning_content": "í?\""}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "- \"", "format": "unknown", "index": 0}], "reasoning_content": "- \""}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " -", "format": "unknown", "index": 0}], "reasoning_content": " -"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "Alô", "format": "unknown", "index": 0}], "reasoning_content": "Alô"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " very informal", "format": "unknown", "index": 0}], "reasoning_content": " very informal"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "\" -", "format": "unknown", "index": 0}], "reasoning_content": "\" -"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": ", like", "format": "unknown", "index": 0}], "reasoning_content": ", like"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " used when", "format": "unknown", "index": 0}], "reasoning_content": " used when"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " \"what", "format": "unknown", "index": 0}], "reasoning_content": " \"what"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " answering the", "format": "unknown", "index": 0}], "reasoning_content": " answering the"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "'s up", "format": "unknown", "index": 0}], "reasoning_content": "'s up"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " phone\n", "format": "unknown", "index": 0}], "reasoning_content": " phone\n"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "?\"\n", "format": "unknown", "index": 0}], "reasoning_content": "?\"\n"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "- \"", "format": "unknown", "index": 0}], "reasoning_content": "- \""}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "- \"", "format": "unknown", "index": 0}], "reasoning_content": "- \""}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "E a", "format": "unknown", "index": 0}], "reasoning_content": "E a"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "T", "format": "unknown", "index": 0}], "reasoning_content": "T"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "í?\"", "format": "unknown", "index": 0}], "reasoning_content": "í?\""}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "udo", "format": "unknown", "index": 0}], "reasoning_content": "udo"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " - very", "format": "unknown", "index": 0}], "reasoning_content": " - very"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " bem", "format": "unknown", "index": 0}], "reasoning_content": " bem"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " informal", "format": "unknown", "index": 0}], "reasoning_content": " informal"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "?\" -", "format": "unknown", "index": 0}], "reasoning_content": "?\" -"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": ", like", "format": "unknown", "index": 0}], "reasoning_content": ", like"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " \"how", "format": "unknown", "index": 0}], "reasoning_content": " \"how"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " \"what", "format": "unknown", "index": 0}], "reasoning_content": " \"what"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " are you", "format": "unknown", "index": 0}], "reasoning_content": " are you"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "'s up", "format": "unknown", "index": 0}], "reasoning_content": "'s up"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "?", "format": "unknown", "index": 0}], "reasoning_content": "?"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "\"\n\nSince", "format": "unknown", "index": 0}], "reasoning_content": "\"\n\nSince"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "\"\n\nThe", "format": "unknown", "index": 0}], "reasoning_content": "\"\n\nThe"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " the user", "format": "unknown", "index": 0}], "reasoning_content": " the user"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " most straightforward", "format": "unknown", "index": 0}], "reasoning_content": " most straightforward"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " just asked", "format": "unknown", "index": 0}], "reasoning_content": " just asked"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " and standard", "format": "unknown", "index": 0}], "reasoning_content": " and standard"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " for \"", "format": "unknown", "index": 0}], "reasoning_content": " for \""}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " translation of", "format": "unknown", "index": 0}], "reasoning_content": " translation of"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "hi\",", "format": "unknown", "index": 0}], "reasoning_content": "hi\","}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " \"hi", "format": "unknown", "index": 0}], "reasoning_content": " \"hi"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " I", "format": "unknown", "index": 0}], "reasoning_content": " I"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "\" is", "format": "unknown", "index": 0}], "reasoning_content": "\" is"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " should provide", "format": "unknown", "index": 0}], "reasoning_content": " should provide"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " \"Oi", "format": "unknown", "index": 0}], "reasoning_content": " \"Oi"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " the most", "format": "unknown", "index": 0}], "reasoning_content": " the most"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "\" or", "format": "unknown", "index": 0}], "reasoning_content": "\" or"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " common and", "format": "unknown", "index": 0}], "reasoning_content": " common and"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " \"Ol", "format": "unknown", "index": 0}], "reasoning_content": " \"Ol"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " standard options", "format": "unknown", "index": 0}], "reasoning_content": " standard options"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "á\".", "format": "unknown", "index": 0}], "reasoning_content": "á\"."}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " I should", "format": "unknown", "index": 0}], "reasoning_content": " I should"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " provide the", "format": "unknown", "index": 0}], "reasoning_content": " provide the"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": ". \"", "format": "unknown", "index": 0}], "reasoning_content": ". \""}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " most common", "format": "unknown", "index": 0}], "reasoning_content": " most common"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "Olá", "format": "unknown", "index": 0}], "reasoning_content": "Olá"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " one,", "format": "unknown", "index": 0}], "reasoning_content": " one,"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "\" and", "format": "unknown", "index": 0}], "reasoning_content": "\" and"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " which", "format": "unknown", "index": 0}], "reasoning_content": " which"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " \"Oi", "format": "unknown", "index": 0}], "reasoning_content": " \"Oi"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " is \"", "format": "unknown", "index": 0}], "reasoning_content": " is \""}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "\" are", "format": "unknown", "index": 0}], "reasoning_content": "\" are"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "Oi\",", "format": "unknown", "index": 0}], "reasoning_content": "Oi\","}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " the most", "format": "unknown", "index": 0}], "reasoning_content": " the most"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " but maybe", "format": "unknown", "index": 0}], "reasoning_content": " but maybe"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " appropriate.", "format": "unknown", "index": 0}], "reasoning_content": " appropriate."}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " also mention", "format": "unknown", "index": 0}], "reasoning_content": " also mention"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " I", "format": "unknown", "index": 0}], "reasoning_content": " I"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " \"Ol", "format": "unknown", "index": 0}], "reasoning_content": " \"Ol"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " should probably", "format": "unknown", "index": 0}], "reasoning_content": " should probably"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "á\"", "format": "unknown", "index": 0}], "reasoning_content": "á\""}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " mention both", "format": "unknown", "index": 0}], "reasoning_content": " mention both"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " as it's", "format": "unknown", "index": 0}], "reasoning_content": " as it's"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " since", "format": "unknown", "index": 0}], "reasoning_content": " since"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " also very", "format": "unknown", "index": 0}], "reasoning_content": " also very"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " \"Oi", "format": "unknown", "index": 0}], "reasoning_content": " \"Oi"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " common.\n\n", "format": "unknown", "index": 0}], "reasoning_content": " common.\n\n"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "\" is", "format": "unknown", "index": 0}], "reasoning_content": "\" is"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "I'll", "format": "unknown", "index": 0}], "reasoning_content": "I'll"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " very common", "format": "unknown", "index": 0}], "reasoning_content": " very common"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " provide \"", "format": "unknown", "index": 0}], "reasoning_content": " provide \""}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " in Brazil", "format": "unknown", "index": 0}], "reasoning_content": " in Brazil"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "Oi!\"", "format": "unknown", "index": 0}], "reasoning_content": "Oi!\""}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " while", "format": "unknown", "index": 0}], "reasoning_content": " while"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " as the", "format": "unknown", "index": 0}], "reasoning_content": " as the"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " \"Ol", "format": "unknown", "index": 0}], "reasoning_content": " \"Ol"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " primary answer", "format": "unknown", "index": 0}], "reasoning_content": " primary answer"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "á\"", "format": "unknown", "index": 0}], "reasoning_content": "á\""}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": ", and", "format": "unknown", "index": 0}], "reasoning_content": ", and"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " is more", "format": "unknown", "index": 0}], "reasoning_content": " is more"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " perhaps", "format": "unknown", "index": 0}], "reasoning_content": " perhaps"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " universal and", "format": "unknown", "index": 0}], "reasoning_content": " universal and"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " mention \"", "format": "unknown", "index": 0}], "reasoning_content": " mention \""}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " formal", "format": "unknown", "index": 0}], "reasoning_content": " formal"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "Olá", "format": "unknown", "index": 0}], "reasoning_content": "Olá"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": ".\n\nI'll", "format": "unknown", "index": 0}], "reasoning_content": ".\n\nI'll"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "\" as", "format": "unknown", "index": 0}], "reasoning_content": "\" as"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " provide \"", "format": "unknown", "index": 0}], "reasoning_content": " provide \""}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " an alternative", "format": "unknown", "index": 0}], "reasoning_content": " an alternative"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "Olá", "format": "unknown", "index": 0}], "reasoning_content": "Olá"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " since", "format": "unknown", "index": 0}], "reasoning_content": " since"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "\" as", "format": "unknown", "index": 0}], "reasoning_content": "\" as"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " it's also", "format": "unknown", "index": 0}], "reasoning_content": " it's also"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " the main", "format": "unknown", "index": 0}], "reasoning_content": " the main"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " very standard", "format": "unknown", "index": 0}], "reasoning_content": " very standard"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " answer since", "format": "unknown", "index": 0}], "reasoning_content": " answer since"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": ".\n\nActually", "format": "unknown", "index": 0}], "reasoning_content": ".\n\nActually"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " it's the", "format": "unknown", "index": 0}], "reasoning_content": " it's the"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": ", looking", "format": "unknown", "index": 0}], "reasoning_content": ", looking"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " most", "format": "unknown", "index": 0}], "reasoning_content": " most"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " at the", "format": "unknown", "index": 0}], "reasoning_content": " at the"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " standard,", "format": "unknown", "index": 0}], "reasoning_content": " standard,"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " simplicity", "format": "unknown", "index": 0}], "reasoning_content": " simplicity"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " and mention", "format": "unknown", "index": 0}], "reasoning_content": " and mention"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " of the", "format": "unknown", "index": 0}], "reasoning_content": " of the"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " \"Oi", "format": "unknown", "index": 0}], "reasoning_content": " \"Oi"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " request,", "format": "unknown", "index": 0}], "reasoning_content": " request,"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "\" as", "format": "unknown", "index": 0}], "reasoning_content": "\" as"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " I should", "format": "unknown", "index": 0}], "reasoning_content": " I should"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " a", "format": "unknown", "index": 0}], "reasoning_content": " a"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " probably", "format": "unknown", "index": 0}], "reasoning_content": " probably"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " common informal", "format": "unknown", "index": 0}], "reasoning_content": " common informal"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " just give", "format": "unknown", "index": 0}], "reasoning_content": " just give"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " alternative,", "format": "unknown", "index": 0}], "reasoning_content": " alternative,"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " a", "format": "unknown", "index": 0}], "reasoning_content": " a"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " especially in", "format": "unknown", "index": 0}], "reasoning_content": " especially in"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " direct", "format": "unknown", "index": 0}], "reasoning_content": " direct"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " Brazil", "format": "unknown", "index": 0}], "reasoning_content": " Brazil"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " answer with", "format": "unknown", "index": 0}], "reasoning_content": " answer with"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": ".\n\n", "format": "unknown", "index": 0}], "reasoning_content": ".\n\n"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " perhaps", "format": "unknown", "index": 0}], "reasoning_content": " perhaps"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "I", "format": "unknown", "index": 0}], "reasoning_content": "I"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " a brief", "format": "unknown", "index": 0}], "reasoning_content": " a brief"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " should also", "format": "unknown", "index": 0}], "reasoning_content": " should also"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " note", "format": "unknown", "index": 0}], "reasoning_content": " note"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " note", "format": "unknown", "index": 0}], "reasoning_content": " note"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " about form", "format": "unknown", "index": 0}], "reasoning_content": " about form"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " that Portuguese", "format": "unknown", "index": 0}], "reasoning_content": " that Portuguese"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "ality.\n\n", "format": "unknown", "index": 0}], "reasoning_content": "ality.\n\n"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " is", "format": "unknown", "index": 0}], "reasoning_content": " is"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "Best", "format": "unknown", "index": 0}], "reasoning_content": "Best"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " spoken in", "format": "unknown", "index": 0}], "reasoning_content": " spoken in"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " answer:", "format": "unknown", "index": 0}], "reasoning_content": " answer:"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " different countries", "format": "unknown", "index": 0}], "reasoning_content": " different countries"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " \"Oi", "format": "unknown", "index": 0}], "reasoning_content": " \"Oi"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " (Port", "format": "unknown", "index": 0}], "reasoning_content": " (Port"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "!\"", "format": "unknown", "index": 0}], "reasoning_content": "!\""}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "ugal,", "format": "unknown", "index": 0}], "reasoning_content": "ugal,"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " or \"", "format": "unknown", "index": 0}], "reasoning_content": " or \""}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " Brazil,", "format": "unknown", "index": 0}], "reasoning_content": " Brazil,"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "Olá", "format": "unknown", "index": 0}], "reasoning_content": "Olá"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " Angola", "format": "unknown", "index": 0}], "reasoning_content": " Angola"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "!\"\n\n", "format": "unknown", "index": 0}], "reasoning_content": "!\"\n\n"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": ", etc", "format": "unknown", "index": 0}], "reasoning_content": ", etc"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "I'll go", "format": "unknown", "index": 0}], "reasoning_content": "I'll go"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": ".) and", "format": "unknown", "index": 0}], "reasoning_content": ".) and"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " with \"", "format": "unknown", "index": 0}], "reasoning_content": " with \""}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " there might", "format": "unknown", "index": 0}], "reasoning_content": " there might"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "Oi!\"", "format": "unknown", "index": 0}], "reasoning_content": "Oi!\""}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " be slight", "format": "unknown", "index": 0}], "reasoning_content": " be slight"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " as the", "format": "unknown", "index": 0}], "reasoning_content": " as the"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " variations,", "format": "unknown", "index": 0}], "reasoning_content": " variations,"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " main answer", "format": "unknown", "index": 0}], "reasoning_content": " main answer"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " but \"", "format": "unknown", "index": 0}], "reasoning_content": " but \""}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " since it's", "format": "unknown", "index": 0}], "reasoning_content": " since it's"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "Olá", "format": "unknown", "index": 0}], "reasoning_content": "Olá"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " the most", "format": "unknown", "index": 0}], "reasoning_content": " the most"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "\" works", "format": "unknown", "index": 0}], "reasoning_content": "\" works"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " direct equivalent", "format": "unknown", "index": 0}], "reasoning_content": " direct equivalent"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " everywhere.\n\n", "format": "unknown", "index": 0}], "reasoning_content": " everywhere.\n\n"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " to", "format": "unknown", "index": 0}], "reasoning_content": " to"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "Let me", "format": "unknown", "index": 0}], "reasoning_content": "Let me"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " the", "format": "unknown", "index": 0}], "reasoning_content": " the"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " casual English", "format": "unknown", "index": 0}], "reasoning_content": " casual English"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " provide", "format": "unknown", "index": 0}], "reasoning_content": " provide"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " \"hi", "format": "unknown", "index": 0}], "reasoning_content": " \"hi"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " a helpful", "format": "unknown", "index": 0}], "reasoning_content": " a helpful"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "\",", "format": "unknown", "index": 0}], "reasoning_content": "\","}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": ", complete", "format": "unknown", "index": 0}], "reasoning_content": ", complete"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " and mention", "format": "unknown", "index": 0}], "reasoning_content": " and mention"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " answer", "format": "unknown", "index": 0}], "reasoning_content": " answer"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " \"Ol", "format": "unknown", "index": 0}], "reasoning_content": " \"Ol"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": ". ", "format": "unknown", "index": 0}], "reasoning_content": ". "}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "á\"", "format": "unknown", "index": 0}], "reasoning_content": "á\""}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " Olá", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " as a", "format": "unknown", "index": 0}], "reasoning_content": " as a"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "! \n\n", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "(", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " slightly more", "format": "unknown", "index": 0}], "reasoning_content": " slightly more"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "You", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " formal alternative", "format": "unknown", "index": 0}], "reasoning_content": " formal alternative"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " can also", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": ". ", "format": "unknown", "index": 0}], "reasoning_content": ". "}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " say **", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " Oi", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "\"Oi", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "! \n\n", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "\"**", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "(Or", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " — it's", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " \"", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " more", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "Olá", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " informal and", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "!\" which", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " very common", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " is slightly", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " in Brazil", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " more formal", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": ", while", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": ")", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " \"", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_content": null}, "finish_reason": "stop", "native_finish_reason": "stop"}]} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "Olá", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932873-cZ28aIfjOk9BQ9QjyZz3", "object": "chat.completion.chunk", "created": 1773932873, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant"}, "finish_reason": "stop", "native_finish_reason": "stop"}], "usage": {"prompt_tokens": 21, "completion_tokens": 242, "total_tokens": 263, "cost": 0.00054005, "prompt_tokens_details": {"cached_tokens": 8, "cache_write_tokens": 0, "audio_tokens": 0, "video_tokens": 0}, "completion_tokens_details": {"reasoning_tokens": 238, "image_tokens": 0, "audio_tokens": 0}}} + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "\" works", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " well", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " in both", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " Brazil", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " and Portugal", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": ".)", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_content": null}, "finish_reason": "stop", "native_finish_reason": "stop"}]} + + data: {"id": "gen-1787940147-bcM7mZyGId4nh5WskKi5", "object": "chat.completion.chunk", "created": 1787940147, "model": "moonshotai/kimi-k2.5", "service_tier": null, "choices": [{"index": 0, "delta": {"content": "", "role": "assistant"}, "finish_reason": "stop", "native_finish_reason": "stop"}], "usage": {"prompt_tokens": 21, "completion_tokens": 252, "total_tokens": 273, "cost": 0.00056385, "prompt_tokens_details": {"cached_tokens": 0, "cache_write_tokens": 0, "audio_tokens": 0, "video_tokens": 0}, "completion_tokens_details": {"reasoning_tokens": 225, "image_tokens": 0, "audio_tokens": 0}}} data: [DONE] @@ -310,4 +321,4 @@ interactions: - text/event-stream; charset=utf-8 status: 200 OK code: 200 - duration: 1.06203225s + duration: 882.788875ms diff --git a/providertests/testdata/TestOpenAICompatibleCommon/avian-kimi/tool_streaming.yaml b/providertests/testdata/TestOpenAICompatibleCommon/avian-kimi/tool_streaming.yaml index a37ecf5df..03d066d9e 100644 --- a/providertests/testdata/TestOpenAICompatibleCommon/avian-kimi/tool_streaming.yaml +++ b/providertests/testdata/TestOpenAICompatibleCommon/avian-kimi/tool_streaming.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.15.0 (https://charm.land/fantasy) + - Charm-Fantasy/0.41.3 (https://charm.land/fantasy) url: https://api.avian.io/v1/chat/completions method: POST response: @@ -24,105 +24,105 @@ interactions: proto_minor: 0 content_length: -1 body: |+ - data: {"id": "chatcmpl-9091e2c02aec4d94a5ad7fe3", "object": "chat.completion.chunk", "created": 1773932879, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"role": "assistant"}, "finish_reason": null}]} + data: {"id": "chatcmpl-7de6723624974838822ecae0", "object": "chat.completion.chunk", "created": 1787940162, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"role": "assistant"}, "finish_reason": null}]} - data: {"id": "gen-1773932879-9itFTxmMNzDrUKQO1wmR", "object": "chat.completion.chunk", "created": 1773932879, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "The", "format": "unknown", "index": 0}], "reasoning_content": "The"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932879-9itFTxmMNzDrUKQO1wmR", "object": "chat.completion.chunk", "created": 1773932879, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " user is", "format": "unknown", "index": 0}], "reasoning_content": " user is"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940162-yQfU618ORS7gtYQhvAQW", "object": "chat.completion.chunk", "created": 1787940162, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "The", "format": "unknown", "index": 0}], "reasoning_content": "The"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932879-9itFTxmMNzDrUKQO1wmR", "object": "chat.completion.chunk", "created": 1773932879, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " asking for", "format": "unknown", "index": 0}], "reasoning_content": " asking for"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940162-yQfU618ORS7gtYQhvAQW", "object": "chat.completion.chunk", "created": 1787940162, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " user is", "format": "unknown", "index": 0}], "reasoning_content": " user is"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932879-9itFTxmMNzDrUKQO1wmR", "object": "chat.completion.chunk", "created": 1773932879, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " the weather", "format": "unknown", "index": 0}], "reasoning_content": " the weather"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940162-yQfU618ORS7gtYQhvAQW", "object": "chat.completion.chunk", "created": 1787940162, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " asking about", "format": "unknown", "index": 0}], "reasoning_content": " asking about"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932879-9itFTxmMNzDrUKQO1wmR", "object": "chat.completion.chunk", "created": 1773932879, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " in", "format": "unknown", "index": 0}], "reasoning_content": " in"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940162-yQfU618ORS7gtYQhvAQW", "object": "chat.completion.chunk", "created": 1787940162, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " the weather", "format": "unknown", "index": 0}], "reasoning_content": " the weather"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932879-9itFTxmMNzDrUKQO1wmR", "object": "chat.completion.chunk", "created": 1773932879, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " Florence,", "format": "unknown", "index": 0}], "reasoning_content": " Florence,"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940162-yQfU618ORS7gtYQhvAQW", "object": "chat.completion.chunk", "created": 1787940162, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " in Florence", "format": "unknown", "index": 0}], "reasoning_content": " in Florence"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932879-9itFTxmMNzDrUKQO1wmR", "object": "chat.completion.chunk", "created": 1773932879, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " Italy.", "format": "unknown", "index": 0}], "reasoning_content": " Italy."}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940162-yQfU618ORS7gtYQhvAQW", "object": "chat.completion.chunk", "created": 1787940162, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": ", Italy", "format": "unknown", "index": 0}], "reasoning_content": ", Italy"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932879-9itFTxmMNzDrUKQO1wmR", "object": "chat.completion.chunk", "created": 1773932879, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " I have", "format": "unknown", "index": 0}], "reasoning_content": " I have"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940162-yQfU618ORS7gtYQhvAQW", "object": "chat.completion.chunk", "created": 1787940162, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": ". I", "format": "unknown", "index": 0}], "reasoning_content": ". I"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932879-9itFTxmMNzDrUKQO1wmR", "object": "chat.completion.chunk", "created": 1773932879, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " a weather", "format": "unknown", "index": 0}], "reasoning_content": " a weather"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940162-yQfU618ORS7gtYQhvAQW", "object": "chat.completion.chunk", "created": 1787940162, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " have", "format": "unknown", "index": 0}], "reasoning_content": " have"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932879-9itFTxmMNzDrUKQO1wmR", "object": "chat.completion.chunk", "created": 1773932879, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " function available", "format": "unknown", "index": 0}], "reasoning_content": " function available"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940162-yQfU618ORS7gtYQhvAQW", "object": "chat.completion.chunk", "created": 1787940162, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " a weather", "format": "unknown", "index": 0}], "reasoning_content": " a weather"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932879-9itFTxmMNzDrUKQO1wmR", "object": "chat.completion.chunk", "created": 1773932879, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " that can", "format": "unknown", "index": 0}], "reasoning_content": " that can"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940162-yQfU618ORS7gtYQhvAQW", "object": "chat.completion.chunk", "created": 1787940162, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " function available", "format": "unknown", "index": 0}], "reasoning_content": " function available"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932879-9itFTxmMNzDrUKQO1wmR", "object": "chat.completion.chunk", "created": 1773932879, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " get", "format": "unknown", "index": 0}], "reasoning_content": " get"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940162-yQfU618ORS7gtYQhvAQW", "object": "chat.completion.chunk", "created": 1787940162, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " that can", "format": "unknown", "index": 0}], "reasoning_content": " that can"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932879-9itFTxmMNzDrUKQO1wmR", "object": "chat.completion.chunk", "created": 1773932879, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " weather information", "format": "unknown", "index": 0}], "reasoning_content": " weather information"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940162-yQfU618ORS7gtYQhvAQW", "object": "chat.completion.chunk", "created": 1787940162, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " get", "format": "unknown", "index": 0}], "reasoning_content": " get"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932879-9itFTxmMNzDrUKQO1wmR", "object": "chat.completion.chunk", "created": 1773932879, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " for a", "format": "unknown", "index": 0}], "reasoning_content": " for a"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940162-yQfU618ORS7gtYQhvAQW", "object": "chat.completion.chunk", "created": 1787940162, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " weather information", "format": "unknown", "index": 0}], "reasoning_content": " weather information"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932879-9itFTxmMNzDrUKQO1wmR", "object": "chat.completion.chunk", "created": 1773932879, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " location.", "format": "unknown", "index": 0}], "reasoning_content": " location."}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940162-yQfU618ORS7gtYQhvAQW", "object": "chat.completion.chunk", "created": 1787940162, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " for a", "format": "unknown", "index": 0}], "reasoning_content": " for a"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932879-9itFTxmMNzDrUKQO1wmR", "object": "chat.completion.chunk", "created": 1773932879, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " I need", "format": "unknown", "index": 0}], "reasoning_content": " I need"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940162-yQfU618ORS7gtYQhvAQW", "object": "chat.completion.chunk", "created": 1787940162, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " location.", "format": "unknown", "index": 0}], "reasoning_content": " location."}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932879-9itFTxmMNzDrUKQO1wmR", "object": "chat.completion.chunk", "created": 1773932879, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " to call", "format": "unknown", "index": 0}], "reasoning_content": " to call"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940162-yQfU618ORS7gtYQhvAQW", "object": "chat.completion.chunk", "created": 1787940162, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " I need", "format": "unknown", "index": 0}], "reasoning_content": " I need"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932879-9itFTxmMNzDrUKQO1wmR", "object": "chat.completion.chunk", "created": 1773932879, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " this", "format": "unknown", "index": 0}], "reasoning_content": " this"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940162-yQfU618ORS7gtYQhvAQW", "object": "chat.completion.chunk", "created": 1787940162, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " to call", "format": "unknown", "index": 0}], "reasoning_content": " to call"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932879-9itFTxmMNzDrUKQO1wmR", "object": "chat.completion.chunk", "created": 1773932879, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " function with", "format": "unknown", "index": 0}], "reasoning_content": " function with"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940162-yQfU618ORS7gtYQhvAQW", "object": "chat.completion.chunk", "created": 1787940162, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " the weather", "format": "unknown", "index": 0}], "reasoning_content": " the weather"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932879-9itFTxmMNzDrUKQO1wmR", "object": "chat.completion.chunk", "created": 1773932879, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " \"", "format": "unknown", "index": 0}], "reasoning_content": " \""}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940162-yQfU618ORS7gtYQhvAQW", "object": "chat.completion.chunk", "created": 1787940162, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " function with", "format": "unknown", "index": 0}], "reasoning_content": " function with"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932879-9itFTxmMNzDrUKQO1wmR", "object": "chat.completion.chunk", "created": 1773932879, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "Flore", "format": "unknown", "index": 0}], "reasoning_content": "Flore"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940162-yQfU618ORS7gtYQhvAQW", "object": "chat.completion.chunk", "created": 1787940162, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " the location", "format": "unknown", "index": 0}], "reasoning_content": " the location"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932879-9itFTxmMNzDrUKQO1wmR", "object": "chat.completion.chunk", "created": 1773932879, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "nce,", "format": "unknown", "index": 0}], "reasoning_content": "nce,"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940162-yQfU618ORS7gtYQhvAQW", "object": "chat.completion.chunk", "created": 1787940162, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " \"Fl", "format": "unknown", "index": 0}], "reasoning_content": " \"Fl"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932879-9itFTxmMNzDrUKQO1wmR", "object": "chat.completion.chunk", "created": 1773932879, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "Italy", "format": "unknown", "index": 0}], "reasoning_content": "Italy"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940162-yQfU618ORS7gtYQhvAQW", "object": "chat.completion.chunk", "created": 1787940162, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "orence", "format": "unknown", "index": 0}], "reasoning_content": "orence"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932879-9itFTxmMNzDrUKQO1wmR", "object": "chat.completion.chunk", "created": 1773932879, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "\" (", "format": "unknown", "index": 0}], "reasoning_content": "\" ("}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940162-yQfU618ORS7gtYQhvAQW", "object": "chat.completion.chunk", "created": 1787940162, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": ",Italy", "format": "unknown", "index": 0}], "reasoning_content": ",Italy"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932879-9itFTxmMNzDrUKQO1wmR", "object": "chat.completion.chunk", "created": 1773932879, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "or just", "format": "unknown", "index": 0}], "reasoning_content": "or just"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940162-yQfU618ORS7gtYQhvAQW", "object": "chat.completion.chunk", "created": 1787940162, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "\" or", "format": "unknown", "index": 0}], "reasoning_content": "\" or"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932879-9itFTxmMNzDrUKQO1wmR", "object": "chat.completion.chunk", "created": 1773932879, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " \"Fl", "format": "unknown", "index": 0}], "reasoning_content": " \"Fl"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940162-yQfU618ORS7gtYQhvAQW", "object": "chat.completion.chunk", "created": 1787940162, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " just \"", "format": "unknown", "index": 0}], "reasoning_content": " just \""}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932879-9itFTxmMNzDrUKQO1wmR", "object": "chat.completion.chunk", "created": 1773932879, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "orence", "format": "unknown", "index": 0}], "reasoning_content": "orence"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940162-yQfU618ORS7gtYQhvAQW", "object": "chat.completion.chunk", "created": 1787940162, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "Flore", "format": "unknown", "index": 0}], "reasoning_content": "Flore"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932879-9itFTxmMNzDrUKQO1wmR", "object": "chat.completion.chunk", "created": 1773932879, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "\"", "format": "unknown", "index": 0}], "reasoning_content": "\""}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940162-yQfU618ORS7gtYQhvAQW", "object": "chat.completion.chunk", "created": 1787940162, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "nce\".\n\n", "format": "unknown", "index": 0}], "reasoning_content": "nce\".\n\n"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932879-9itFTxmMNzDrUKQO1wmR", "object": "chat.completion.chunk", "created": 1773932879, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " since", "format": "unknown", "index": 0}], "reasoning_content": " since"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940162-yQfU618ORS7gtYQhvAQW", "object": "chat.completion.chunk", "created": 1787940162, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "Let me", "format": "unknown", "index": 0}], "reasoning_content": "Let me"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932879-9itFTxmMNzDrUKQO1wmR", "object": "chat.completion.chunk", "created": 1773932879, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " Italy", "format": "unknown", "index": 0}], "reasoning_content": " Italy"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940162-yQfU618ORS7gtYQhvAQW", "object": "chat.completion.chunk", "created": 1787940162, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " call the", "format": "unknown", "index": 0}], "reasoning_content": " call the"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932879-9itFTxmMNzDrUKQO1wmR", "object": "chat.completion.chunk", "created": 1773932879, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " is implied", "format": "unknown", "index": 0}], "reasoning_content": " is implied"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940162-yQfU618ORS7gtYQhvAQW", "object": "chat.completion.chunk", "created": 1787940162, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " function", "format": "unknown", "index": 0}], "reasoning_content": " function"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932879-9itFTxmMNzDrUKQO1wmR", "object": "chat.completion.chunk", "created": 1773932879, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": ") as", "format": "unknown", "index": 0}], "reasoning_content": ") as"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940162-yQfU618ORS7gtYQhvAQW", "object": "chat.completion.chunk", "created": 1787940162, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " to", "format": "unknown", "index": 0}], "reasoning_content": " to"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932879-9itFTxmMNzDrUKQO1wmR", "object": "chat.completion.chunk", "created": 1773932879, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " the location", "format": "unknown", "index": 0}], "reasoning_content": " the location"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940162-yQfU618ORS7gtYQhvAQW", "object": "chat.completion.chunk", "created": 1787940162, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " get the", "format": "unknown", "index": 0}], "reasoning_content": " get the"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932879-9itFTxmMNzDrUKQO1wmR", "object": "chat.completion.chunk", "created": 1773932879, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " parameter.\n\n", "format": "unknown", "index": 0}], "reasoning_content": " parameter.\n\n"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932879-9itFTxmMNzDrUKQO1wmR", "object": "chat.completion.chunk", "created": 1773932879, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "Let me", "format": "unknown", "index": 0}], "reasoning_content": "Let me"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940162-yQfU618ORS7gtYQhvAQW", "object": "chat.completion.chunk", "created": 1787940162, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " weather information", "format": "unknown", "index": 0}], "reasoning_content": " weather information"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932879-9itFTxmMNzDrUKQO1wmR", "object": "chat.completion.chunk", "created": 1773932879, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " call the", "format": "unknown", "index": 0}], "reasoning_content": " call the"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932879-9itFTxmMNzDrUKQO1wmR", "object": "chat.completion.chunk", "created": 1773932879, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " weather function", "format": "unknown", "index": 0}], "reasoning_content": " weather function"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932879-9itFTxmMNzDrUKQO1wmR", "object": "chat.completion.chunk", "created": 1773932879, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " with the", "format": "unknown", "index": 0}], "reasoning_content": " with the"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940162-yQfU618ORS7gtYQhvAQW", "object": "chat.completion.chunk", "created": 1787940162, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": ". ", "format": "unknown", "index": 0}], "reasoning_content": ". "}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932879-9itFTxmMNzDrUKQO1wmR", "object": "chat.completion.chunk", "created": 1773932879, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " location \"", "format": "unknown", "index": 0}], "reasoning_content": " location \""}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940162-yQfU618ORS7gtYQhvAQW", "object": "chat.completion.chunk", "created": 1787940162, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " I'll check", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932879-9itFTxmMNzDrUKQO1wmR", "object": "chat.completion.chunk", "created": 1773932879, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "Flore", "format": "unknown", "index": 0}], "reasoning_content": "Flore"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940162-yQfU618ORS7gtYQhvAQW", "object": "chat.completion.chunk", "created": 1787940162, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " the weather", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932879-9itFTxmMNzDrUKQO1wmR", "object": "chat.completion.chunk", "created": 1773932879, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "nce,", "format": "unknown", "index": 0}], "reasoning_content": "nce,"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940162-yQfU618ORS7gtYQhvAQW", "object": "chat.completion.chunk", "created": 1787940162, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " in", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932879-9itFTxmMNzDrUKQO1wmR", "object": "chat.completion.chunk", "created": 1773932879, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "Italy\".", "format": "unknown", "index": 0}], "reasoning_content": "Italy\"."}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940162-yQfU618ORS7gtYQhvAQW", "object": "chat.completion.chunk", "created": 1787940162, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " Florence,", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932879-9itFTxmMNzDrUKQO1wmR", "object": "chat.completion.chunk", "created": 1773932879, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " ", "format": "unknown", "index": 0}], "reasoning_content": " "}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940162-yQfU618ORS7gtYQhvAQW", "object": "chat.completion.chunk", "created": 1787940162, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " Italy for", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932879-9itFTxmMNzDrUKQO1wmR", "object": "chat.completion.chunk", "created": 1773932879, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " ", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940162-yQfU618ORS7gtYQhvAQW", "object": "chat.completion.chunk", "created": 1787940162, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " you.", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932879-9itFTxmMNzDrUKQO1wmR", "object": "chat.completion.chunk", "created": 1773932879, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " ", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940162-yQfU618ORS7gtYQhvAQW", "object": "chat.completion.chunk", "created": 1787940162, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " ", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932879-9itFTxmMNzDrUKQO1wmR", "object": "chat.completion.chunk", "created": 1773932879, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": null, "role": "assistant", "tool_calls": [{"index": 0, "id": "functions.weather:0", "type": "function", "function": {"name": "weather", "arguments": ""}}]}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932879-9itFTxmMNzDrUKQO1wmR", "object": "chat.completion.chunk", "created": 1773932879, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": null, "role": "assistant", "tool_calls": [{"index": 0, "function": {"arguments": "{\"location\": \"Florence,Italy\"}"}}]}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932879-9itFTxmMNzDrUKQO1wmR", "object": "chat.completion.chunk", "created": 1773932879, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_content": null}, "finish_reason": "tool_calls", "native_finish_reason": "tool_calls"}]} + data: {"id": "gen-1787940162-yQfU618ORS7gtYQhvAQW", "object": "chat.completion.chunk", "created": 1787940162, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": null, "role": "assistant", "tool_calls": [{"index": 0, "id": "functions.weather:0", "type": "function", "function": {"name": "weather", "arguments": ""}}]}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932879-9itFTxmMNzDrUKQO1wmR", "object": "chat.completion.chunk", "created": 1773932879, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant"}, "finish_reason": "tool_calls", "native_finish_reason": "tool_calls"}], "usage": {"prompt_tokens": 76, "completion_tokens": 96, "total_tokens": 172, "cost": 0.000231, "prompt_tokens_details": {"cached_tokens": 64, "cache_write_tokens": 0, "audio_tokens": 0, "video_tokens": 0}, "completion_tokens_details": {"reasoning_tokens": 85, "image_tokens": 0, "audio_tokens": 0}}} + data: {"id": "gen-1787940162-yQfU618ORS7gtYQhvAQW", "object": "chat.completion.chunk", "created": 1787940162, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": null, "role": "assistant", "tool_calls": [{"index": 0, "function": {"arguments": "{\"location\": \"Florence,Italy\"}"}}]}, "finish_reason": null, "native_finish_reason": null}]} + + data: {"id": "gen-1787940162-yQfU618ORS7gtYQhvAQW", "object": "chat.completion.chunk", "created": 1787940162, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " ", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + + data: {"id": "gen-1787940162-yQfU618ORS7gtYQhvAQW", "object": "chat.completion.chunk", "created": 1787940162, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_content": null}, "finish_reason": "tool_calls", "native_finish_reason": "tool_calls"}]} + + data: {"id": "gen-1787940162-yQfU618ORS7gtYQhvAQW", "object": "chat.completion.chunk", "created": 1787940162, "model": "moonshotai/kimi-k2.5", "service_tier": null, "choices": [{"index": 0, "delta": {"content": "", "role": "assistant"}, "finish_reason": "tool_calls", "native_finish_reason": "tool_calls"}], "usage": {"prompt_tokens": 76, "completion_tokens": 94, "total_tokens": 170, "cost": 0.000241, "prompt_tokens_details": {"cached_tokens": 0, "cache_write_tokens": 0, "audio_tokens": 0, "video_tokens": 0}, "completion_tokens_details": {"reasoning_tokens": 74, "image_tokens": 0, "audio_tokens": 0}}} data: [DONE] @@ -131,22 +131,22 @@ interactions: - text/event-stream; charset=utf-8 status: 200 OK code: 200 - duration: 478.108041ms + duration: 397.612083ms - id: 1 request: proto: HTTP/1.1 proto_major: 1 proto_minor: 1 - content_length: 1126 + content_length: 1137 host: "" - body: '{"messages":[{"content":"You are a helpful assistant","role":"system"},{"content":"What''s the weather in Florence,Italy?","role":"user"},{"content":" ","tool_calls":[{"id":"functions.weather:0","function":{"arguments":"{\"location\": \"Florence,Italy\"}","name":"weather"},"type":"function"}],"role":"assistant","reasoning_content":"The user is asking for the weather in Florence, Italy. I have a weather function available that can get weather information for a location. I need to call this function with \"Florence,Italy\" (or just \"Florence\" since Italy is implied) as the location parameter.\n\nLet me call the weather function with the location \"Florence,Italy\". "},{"content":"40 C","tool_call_id":"functions.weather:0","role":"tool"}],"model":"moonshotai/kimi-k2.5","max_tokens":4000,"stream_options":{"include_usage":true},"tool_choice":"auto","tools":[{"function":{"name":"weather","strict":false,"description":"Get weather information for a location","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"}},"type":"function"}],"stream":true}' + body: '{"messages":[{"content":"You are a helpful assistant","role":"system"},{"content":"What''s the weather in Florence,Italy?","role":"user"},{"content":" I''ll check the weather in Florence, Italy for you. \n ","tool_calls":[{"id":"functions.weather:0","function":{"arguments":"{\"location\": \"Florence,Italy\"}","name":"weather"},"type":"function"}],"role":"assistant","reasoning_content":"The user is asking about the weather in Florence, Italy. I have a weather function available that can get weather information for a location. I need to call the weather function with the location \"Florence,Italy\" or just \"Florence\".\n\nLet me call the function to get the weather information. "},{"content":"40 C","tool_call_id":"functions.weather:0","role":"tool"}],"model":"moonshotai/kimi-k2.5","max_tokens":4000,"stream_options":{"include_usage":true},"tool_choice":"auto","tools":[{"function":{"name":"weather","strict":false,"description":"Get weather information for a location","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"}},"type":"function"}],"stream":true}' headers: Accept: - application/json Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.15.0 (https://charm.land/fantasy) + - Charm-Fantasy/0.41.3 (https://charm.land/fantasy) url: https://api.avian.io/v1/chat/completions method: POST response: @@ -155,204 +155,112 @@ interactions: proto_minor: 0 content_length: -1 body: |+ - data: {"id": "chatcmpl-f958b814284a4e529ecd5d41", "object": "chat.completion.chunk", "created": 1773932881, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"role": "assistant"}, "finish_reason": null}]} - - - data: {"id": "gen-1773932881-AW4KeKUZwBMqmOdcdJ6Q", "object": "chat.completion.chunk", "created": 1773932881, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "The", "format": "unknown", "index": 0}], "reasoning_content": "The"}, "finish_reason": null, "native_finish_reason": null}]} - - data: {"id": "gen-1773932881-AW4KeKUZwBMqmOdcdJ6Q", "object": "chat.completion.chunk", "created": 1773932881, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " function returned", "format": "unknown", "index": 0}], "reasoning_content": " function returned"}, "finish_reason": null, "native_finish_reason": null}]} - - data: {"id": "gen-1773932881-AW4KeKUZwBMqmOdcdJ6Q", "object": "chat.completion.chunk", "created": 1773932881, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " \"", "format": "unknown", "index": 0}], "reasoning_content": " \""}, "finish_reason": null, "native_finish_reason": null}]} - - data: {"id": "gen-1773932881-AW4KeKUZwBMqmOdcdJ6Q", "object": "chat.completion.chunk", "created": 1773932881, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "40 C", "format": "unknown", "index": 0}], "reasoning_content": "40 C"}, "finish_reason": null, "native_finish_reason": null}]} - - data: {"id": "gen-1773932881-AW4KeKUZwBMqmOdcdJ6Q", "object": "chat.completion.chunk", "created": 1773932881, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "\"", "format": "unknown", "index": 0}], "reasoning_content": "\""}, "finish_reason": null, "native_finish_reason": null}]} - - data: {"id": "gen-1773932881-AW4KeKUZwBMqmOdcdJ6Q", "object": "chat.completion.chunk", "created": 1773932881, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " which means", "format": "unknown", "index": 0}], "reasoning_content": " which means"}, "finish_reason": null, "native_finish_reason": null}]} - - data: {"id": "gen-1773932881-AW4KeKUZwBMqmOdcdJ6Q", "object": "chat.completion.chunk", "created": 1773932881, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " 40 degrees", "format": "unknown", "index": 0}], "reasoning_content": " 40 degrees"}, "finish_reason": null, "native_finish_reason": null}]} - - data: {"id": "gen-1773932881-AW4KeKUZwBMqmOdcdJ6Q", "object": "chat.completion.chunk", "created": 1773932881, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " Celsius.", "format": "unknown", "index": 0}], "reasoning_content": " Celsius."}, "finish_reason": null, "native_finish_reason": null}]} - - data: {"id": "gen-1773932881-AW4KeKUZwBMqmOdcdJ6Q", "object": "chat.completion.chunk", "created": 1773932881, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " This", "format": "unknown", "index": 0}], "reasoning_content": " This"}, "finish_reason": null, "native_finish_reason": null}]} - - data: {"id": "gen-1773932881-AW4KeKUZwBMqmOdcdJ6Q", "object": "chat.completion.chunk", "created": 1773932881, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " is extremely", "format": "unknown", "index": 0}], "reasoning_content": " is extremely"}, "finish_reason": null, "native_finish_reason": null}]} - - data: {"id": "gen-1773932881-AW4KeKUZwBMqmOdcdJ6Q", "object": "chat.completion.chunk", "created": 1773932881, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " hot -", "format": "unknown", "index": 0}], "reasoning_content": " hot -"}, "finish_reason": null, "native_finish_reason": null}]} - - data: {"id": "gen-1773932881-AW4KeKUZwBMqmOdcdJ6Q", "object": "chat.completion.chunk", "created": 1773932881, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " almost", "format": "unknown", "index": 0}], "reasoning_content": " almost"}, "finish_reason": null, "native_finish_reason": null}]} - - data: {"id": "gen-1773932881-AW4KeKUZwBMqmOdcdJ6Q", "object": "chat.completion.chunk", "created": 1773932881, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " dangerously", "format": "unknown", "index": 0}], "reasoning_content": " dangerously"}, "finish_reason": null, "native_finish_reason": null}]} - - data: {"id": "gen-1773932881-AW4KeKUZwBMqmOdcdJ6Q", "object": "chat.completion.chunk", "created": 1773932881, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " hot", "format": "unknown", "index": 0}], "reasoning_content": " hot"}, "finish_reason": null, "native_finish_reason": null}]} - - data: {"id": "gen-1773932881-AW4KeKUZwBMqmOdcdJ6Q", "object": "chat.completion.chunk", "created": 1773932881, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " for", "format": "unknown", "index": 0}], "reasoning_content": " for"}, "finish_reason": null, "native_finish_reason": null}]} - - data: {"id": "gen-1773932881-AW4KeKUZwBMqmOdcdJ6Q", "object": "chat.completion.chunk", "created": 1773932881, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " a", "format": "unknown", "index": 0}], "reasoning_content": " a"}, "finish_reason": null, "native_finish_reason": null}]} - - data: {"id": "gen-1773932881-AW4KeKUZwBMqmOdcdJ6Q", "object": "chat.completion.chunk", "created": 1773932881, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " city like", "format": "unknown", "index": 0}], "reasoning_content": " city like"}, "finish_reason": null, "native_finish_reason": null}]} - - data: {"id": "gen-1773932881-AW4KeKUZwBMqmOdcdJ6Q", "object": "chat.completion.chunk", "created": 1773932881, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " Florence.", "format": "unknown", "index": 0}], "reasoning_content": " Florence."}, "finish_reason": null, "native_finish_reason": null}]} - - data: {"id": "gen-1773932881-AW4KeKUZwBMqmOdcdJ6Q", "object": "chat.completion.chunk", "created": 1773932881, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " But", "format": "unknown", "index": 0}], "reasoning_content": " But"}, "finish_reason": null, "native_finish_reason": null}]} - - data: {"id": "gen-1773932881-AW4KeKUZwBMqmOdcdJ6Q", "object": "chat.completion.chunk", "created": 1773932881, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " this", "format": "unknown", "index": 0}], "reasoning_content": " this"}, "finish_reason": null, "native_finish_reason": null}]} - - data: {"id": "gen-1773932881-AW4KeKUZwBMqmOdcdJ6Q", "object": "chat.completion.chunk", "created": 1773932881, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " is what", "format": "unknown", "index": 0}], "reasoning_content": " is what"}, "finish_reason": null, "native_finish_reason": null}]} - - data: {"id": "gen-1773932881-AW4KeKUZwBMqmOdcdJ6Q", "object": "chat.completion.chunk", "created": 1773932881, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " the function", "format": "unknown", "index": 0}], "reasoning_content": " the function"}, "finish_reason": null, "native_finish_reason": null}]} - - data: {"id": "gen-1773932881-AW4KeKUZwBMqmOdcdJ6Q", "object": "chat.completion.chunk", "created": 1773932881, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " returned,", "format": "unknown", "index": 0}], "reasoning_content": " returned,"}, "finish_reason": null, "native_finish_reason": null}]} - - data: {"id": "gen-1773932881-AW4KeKUZwBMqmOdcdJ6Q", "object": "chat.completion.chunk", "created": 1773932881, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " so I", "format": "unknown", "index": 0}], "reasoning_content": " so I"}, "finish_reason": null, "native_finish_reason": null}]} - - data: {"id": "gen-1773932881-AW4KeKUZwBMqmOdcdJ6Q", "object": "chat.completion.chunk", "created": 1773932881, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " should present", "format": "unknown", "index": 0}], "reasoning_content": " should present"}, "finish_reason": null, "native_finish_reason": null}]} - - data: {"id": "gen-1773932881-AW4KeKUZwBMqmOdcdJ6Q", "object": "chat.completion.chunk", "created": 1773932881, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " this", "format": "unknown", "index": 0}], "reasoning_content": " this"}, "finish_reason": null, "native_finish_reason": null}]} - - data: {"id": "gen-1773932881-AW4KeKUZwBMqmOdcdJ6Q", "object": "chat.completion.chunk", "created": 1773932881, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " information to", "format": "unknown", "index": 0}], "reasoning_content": " information to"}, "finish_reason": null, "native_finish_reason": null}]} - - data: {"id": "gen-1773932881-AW4KeKUZwBMqmOdcdJ6Q", "object": "chat.completion.chunk", "created": 1773932881, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " the user", "format": "unknown", "index": 0}], "reasoning_content": " the user"}, "finish_reason": null, "native_finish_reason": null}]} - - data: {"id": "gen-1773932881-AW4KeKUZwBMqmOdcdJ6Q", "object": "chat.completion.chunk", "created": 1773932881, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": ". I", "format": "unknown", "index": 0}], "reasoning_content": ". I"}, "finish_reason": null, "native_finish_reason": null}]} - - data: {"id": "gen-1773932881-AW4KeKUZwBMqmOdcdJ6Q", "object": "chat.completion.chunk", "created": 1773932881, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " should convert", "format": "unknown", "index": 0}], "reasoning_content": " should convert"}, "finish_reason": null, "native_finish_reason": null}]} - - data: {"id": "gen-1773932881-AW4KeKUZwBMqmOdcdJ6Q", "object": "chat.completion.chunk", "created": 1773932881, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " it to", "format": "unknown", "index": 0}], "reasoning_content": " it to"}, "finish_reason": null, "native_finish_reason": null}]} - - data: {"id": "gen-1773932881-AW4KeKUZwBMqmOdcdJ6Q", "object": "chat.completion.chunk", "created": 1773932881, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " Fahrenheit as", "format": "unknown", "index": 0}], "reasoning_content": " Fahrenheit as"}, "finish_reason": null, "native_finish_reason": null}]} - - data: {"id": "gen-1773932881-AW4KeKUZwBMqmOdcdJ6Q", "object": "chat.completion.chunk", "created": 1773932881, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " well to", "format": "unknown", "index": 0}], "reasoning_content": " well to"}, "finish_reason": null, "native_finish_reason": null}]} - - data: {"id": "gen-1773932881-AW4KeKUZwBMqmOdcdJ6Q", "object": "chat.completion.chunk", "created": 1773932881, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " make", "format": "unknown", "index": 0}], "reasoning_content": " make"}, "finish_reason": null, "native_finish_reason": null}]} - - data: {"id": "gen-1773932881-AW4KeKUZwBMqmOdcdJ6Q", "object": "chat.completion.chunk", "created": 1773932881, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " it more", "format": "unknown", "index": 0}], "reasoning_content": " it more"}, "finish_reason": null, "native_finish_reason": null}]} - - data: {"id": "gen-1773932881-AW4KeKUZwBMqmOdcdJ6Q", "object": "chat.completion.chunk", "created": 1773932881, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " accessible", "format": "unknown", "index": 0}], "reasoning_content": " accessible"}, "finish_reason": null, "native_finish_reason": null}]} - - data: {"id": "gen-1773932881-AW4KeKUZwBMqmOdcdJ6Q", "object": "chat.completion.chunk", "created": 1773932881, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": ", and", "format": "unknown", "index": 0}], "reasoning_content": ", and"}, "finish_reason": null, "native_finish_reason": null}]} - - data: {"id": "gen-1773932881-AW4KeKUZwBMqmOdcdJ6Q", "object": "chat.completion.chunk", "created": 1773932881, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " perhaps", "format": "unknown", "index": 0}], "reasoning_content": " perhaps"}, "finish_reason": null, "native_finish_reason": null}]} - - data: {"id": "gen-1773932881-AW4KeKUZwBMqmOdcdJ6Q", "object": "chat.completion.chunk", "created": 1773932881, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " note that", "format": "unknown", "index": 0}], "reasoning_content": " note that"}, "finish_reason": null, "native_finish_reason": null}]} - - data: {"id": "gen-1773932881-AW4KeKUZwBMqmOdcdJ6Q", "object": "chat.completion.chunk", "created": 1773932881, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " it's", "format": "unknown", "index": 0}], "reasoning_content": " it's"}, "finish_reason": null, "native_finish_reason": null}]} - - data: {"id": "gen-1773932881-AW4KeKUZwBMqmOdcdJ6Q", "object": "chat.completion.chunk", "created": 1773932881, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " very", "format": "unknown", "index": 0}], "reasoning_content": " very"}, "finish_reason": null, "native_finish_reason": null}]} - - data: {"id": "gen-1773932881-AW4KeKUZwBMqmOdcdJ6Q", "object": "chat.completion.chunk", "created": 1773932881, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " hot.\n\n", "format": "unknown", "index": 0}], "reasoning_content": " hot.\n\n"}, "finish_reason": null, "native_finish_reason": null}]} - - data: {"id": "gen-1773932881-AW4KeKUZwBMqmOdcdJ6Q", "object": "chat.completion.chunk", "created": 1773932881, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "40°C", "format": "unknown", "index": 0}], "reasoning_content": "40°C"}, "finish_reason": null, "native_finish_reason": null}]} - - data: {"id": "gen-1773932881-AW4KeKUZwBMqmOdcdJ6Q", "object": "chat.completion.chunk", "created": 1773932881, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " = ", "format": "unknown", "index": 0}], "reasoning_content": " = "}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "chatcmpl-faab0996e9644e74974fc841", "object": "chat.completion.chunk", "created": 1787940169, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"role": "assistant"}, "finish_reason": null}]} - data: {"id": "gen-1773932881-AW4KeKUZwBMqmOdcdJ6Q", "object": "chat.completion.chunk", "created": 1773932881, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "104°F", "format": "unknown", "index": 0}], "reasoning_content": "104°F"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932881-AW4KeKUZwBMqmOdcdJ6Q", "object": "chat.completion.chunk", "created": 1773932881, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " (", "format": "unknown", "index": 0}], "reasoning_content": " ("}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940168-sdQPAGE5xligrqHsosoJ", "object": "chat.completion.chunk", "created": 1787940168, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "The", "format": "unknown", "index": 0}], "reasoning_content": "The"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932881-AW4KeKUZwBMqmOdcdJ6Q", "object": "chat.completion.chunk", "created": 1773932881, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "40", "format": "unknown", "index": 0}], "reasoning_content": "40"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940168-sdQPAGE5xligrqHsosoJ", "object": "chat.completion.chunk", "created": 1787940168, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " weather", "format": "unknown", "index": 0}], "reasoning_content": " weather"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932881-AW4KeKUZwBMqmOdcdJ6Q", "object": "chat.completion.chunk", "created": 1773932881, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " *", "format": "unknown", "index": 0}], "reasoning_content": " *"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940168-sdQPAGE5xligrqHsosoJ", "object": "chat.completion.chunk", "created": 1787940168, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " function returned", "format": "unknown", "index": 0}], "reasoning_content": " function returned"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932881-AW4KeKUZwBMqmOdcdJ6Q", "object": "chat.completion.chunk", "created": 1773932881, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " 9", "format": "unknown", "index": 0}], "reasoning_content": " 9"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940168-sdQPAGE5xligrqHsosoJ", "object": "chat.completion.chunk", "created": 1787940168, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " \"", "format": "unknown", "index": 0}], "reasoning_content": " \""}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932881-AW4KeKUZwBMqmOdcdJ6Q", "object": "chat.completion.chunk", "created": 1773932881, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "/5", "format": "unknown", "index": 0}], "reasoning_content": "/5"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940168-sdQPAGE5xligrqHsosoJ", "object": "chat.completion.chunk", "created": 1787940168, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "40 C", "format": "unknown", "index": 0}], "reasoning_content": "40 C"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932881-AW4KeKUZwBMqmOdcdJ6Q", "object": "chat.completion.chunk", "created": 1773932881, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " + ", "format": "unknown", "index": 0}], "reasoning_content": " + "}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940168-sdQPAGE5xligrqHsosoJ", "object": "chat.completion.chunk", "created": 1787940168, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "\".", "format": "unknown", "index": 0}], "reasoning_content": "\"."}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932881-AW4KeKUZwBMqmOdcdJ6Q", "object": "chat.completion.chunk", "created": 1773932881, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "32 =", "format": "unknown", "index": 0}], "reasoning_content": "32 ="}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940168-sdQPAGE5xligrqHsosoJ", "object": "chat.completion.chunk", "created": 1787940168, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " This is", "format": "unknown", "index": 0}], "reasoning_content": " This is"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932881-AW4KeKUZwBMqmOdcdJ6Q", "object": "chat.completion.chunk", "created": 1773932881, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " 72", "format": "unknown", "index": 0}], "reasoning_content": " 72"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940168-sdQPAGE5xligrqHsosoJ", "object": "chat.completion.chunk", "created": 1787940168, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " the", "format": "unknown", "index": 0}], "reasoning_content": " the"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932881-AW4KeKUZwBMqmOdcdJ6Q", "object": "chat.completion.chunk", "created": 1773932881, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " + ", "format": "unknown", "index": 0}], "reasoning_content": " + "}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940168-sdQPAGE5xligrqHsosoJ", "object": "chat.completion.chunk", "created": 1787940168, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " temperature in", "format": "unknown", "index": 0}], "reasoning_content": " temperature in"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932881-AW4KeKUZwBMqmOdcdJ6Q", "object": "chat.completion.chunk", "created": 1773932881, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "32 =", "format": "unknown", "index": 0}], "reasoning_content": "32 ="}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940168-sdQPAGE5xligrqHsosoJ", "object": "chat.completion.chunk", "created": 1787940168, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " Celsius", "format": "unknown", "index": 0}], "reasoning_content": " Celsius"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932881-AW4KeKUZwBMqmOdcdJ6Q", "object": "chat.completion.chunk", "created": 1773932881, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " 104", "format": "unknown", "index": 0}], "reasoning_content": " 104"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940168-sdQPAGE5xligrqHsosoJ", "object": "chat.completion.chunk", "created": 1787940168, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " in", "format": "unknown", "index": 0}], "reasoning_content": " in"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932881-AW4KeKUZwBMqmOdcdJ6Q", "object": "chat.completion.chunk", "created": 1773932881, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": ")\n\nI'll", "format": "unknown", "index": 0}], "reasoning_content": ")\n\nI'll"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940168-sdQPAGE5xligrqHsosoJ", "object": "chat.completion.chunk", "created": 1787940168, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " Florence,", "format": "unknown", "index": 0}], "reasoning_content": " Florence,"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932881-AW4KeKUZwBMqmOdcdJ6Q", "object": "chat.completion.chunk", "created": 1773932881, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " present", "format": "unknown", "index": 0}], "reasoning_content": " present"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940168-sdQPAGE5xligrqHsosoJ", "object": "chat.completion.chunk", "created": 1787940168, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " Italy.", "format": "unknown", "index": 0}], "reasoning_content": " Italy."}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932881-AW4KeKUZwBMqmOdcdJ6Q", "object": "chat.completion.chunk", "created": 1773932881, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " this information", "format": "unknown", "index": 0}], "reasoning_content": " this information"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940168-sdQPAGE5xligrqHsosoJ", "object": "chat.completion.chunk", "created": 1787940168, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " 40°C", "format": "unknown", "index": 0}], "reasoning_content": " 40°C"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932881-AW4KeKUZwBMqmOdcdJ6Q", "object": "chat.completion.chunk", "created": 1773932881, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " clearly.", "format": "unknown", "index": 0}], "reasoning_content": " clearly."}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940168-sdQPAGE5xligrqHsosoJ", "object": "chat.completion.chunk", "created": 1787940168, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " is very", "format": "unknown", "index": 0}], "reasoning_content": " is very"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932881-AW4KeKUZwBMqmOdcdJ6Q", "object": "chat.completion.chunk", "created": 1773932881, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " ", "format": "unknown", "index": 0}], "reasoning_content": " "}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940168-sdQPAGE5xligrqHsosoJ", "object": "chat.completion.chunk", "created": 1787940168, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " hot -", "format": "unknown", "index": 0}], "reasoning_content": " hot -"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932881-AW4KeKUZwBMqmOdcdJ6Q", "object": "chat.completion.chunk", "created": 1773932881, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " The", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940168-sdQPAGE5xligrqHsosoJ", "object": "chat.completion.chunk", "created": 1787940168, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " that's about", "format": "unknown", "index": 0}], "reasoning_content": " that's about"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932881-AW4KeKUZwBMqmOdcdJ6Q", "object": "chat.completion.chunk", "created": 1773932881, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " weather in", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940168-sdQPAGE5xligrqHsosoJ", "object": "chat.completion.chunk", "created": 1787940168, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " 104", "format": "unknown", "index": 0}], "reasoning_content": " 104"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932881-AW4KeKUZwBMqmOdcdJ6Q", "object": "chat.completion.chunk", "created": 1773932881, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " Florence,", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932881-AW4KeKUZwBMqmOdcdJ6Q", "object": "chat.completion.chunk", "created": 1773932881, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " Italy is", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940168-sdQPAGE5xligrqHsosoJ", "object": "chat.completion.chunk", "created": 1787940168, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "°F.", "format": "unknown", "index": 0}], "reasoning_content": "°F."}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932881-AW4KeKUZwBMqmOdcdJ6Q", "object": "chat.completion.chunk", "created": 1773932881, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " **", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940168-sdQPAGE5xligrqHsosoJ", "object": "chat.completion.chunk", "created": 1787940168, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " I should", "format": "unknown", "index": 0}], "reasoning_content": " I should"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932881-AW4KeKUZwBMqmOdcdJ6Q", "object": "chat.completion.chunk", "created": 1773932881, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "40°C", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940168-sdQPAGE5xligrqHsosoJ", "object": "chat.completion.chunk", "created": 1787940168, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " present", "format": "unknown", "index": 0}], "reasoning_content": " present"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932881-AW4KeKUZwBMqmOdcdJ6Q", "object": "chat.completion.chunk", "created": 1773932881, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " (104", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940168-sdQPAGE5xligrqHsosoJ", "object": "chat.completion.chunk", "created": 1787940168, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " this information", "format": "unknown", "index": 0}], "reasoning_content": " this information"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932881-AW4KeKUZwBMqmOdcdJ6Q", "object": "chat.completion.chunk", "created": 1773932881, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "°F)**", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940168-sdQPAGE5xligrqHsosoJ", "object": "chat.completion.chunk", "created": 1787940168, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " to", "format": "unknown", "index": 0}], "reasoning_content": " to"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932881-AW4KeKUZwBMqmOdcdJ6Q", "object": "chat.completion.chunk", "created": 1773932881, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": ".\n\n", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940168-sdQPAGE5xligrqHsosoJ", "object": "chat.completion.chunk", "created": 1787940168, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " the user", "format": "unknown", "index": 0}], "reasoning_content": " the user"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932881-AW4KeKUZwBMqmOdcdJ6Q", "object": "chat.completion.chunk", "created": 1773932881, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "That's extremely", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940168-sdQPAGE5xligrqHsosoJ", "object": "chat.completion.chunk", "created": 1787940168, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " in", "format": "unknown", "index": 0}], "reasoning_content": " in"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932881-AW4KeKUZwBMqmOdcdJ6Q", "object": "chat.completion.chunk", "created": 1773932881, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " hot!", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940168-sdQPAGE5xligrqHsosoJ", "object": "chat.completion.chunk", "created": 1787940168, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " a helpful", "format": "unknown", "index": 0}], "reasoning_content": " a helpful"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932881-AW4KeKUZwBMqmOdcdJ6Q", "object": "chat.completion.chunk", "created": 1773932881, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " ☀️", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932881-AW4KeKUZwBMqmOdcdJ6Q", "object": "chat.completion.chunk", "created": 1773932881, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " If you're", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940168-sdQPAGE5xligrqHsosoJ", "object": "chat.completion.chunk", "created": 1787940168, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " way.", "format": "unknown", "index": 0}], "reasoning_content": " way."}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932881-AW4KeKUZwBMqmOdcdJ6Q", "object": "chat.completion.chunk", "created": 1773932881, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " visiting Florence", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940168-sdQPAGE5xligrqHsosoJ", "object": "chat.completion.chunk", "created": 1787940168, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " ", "format": "unknown", "index": 0}], "reasoning_content": " "}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932881-AW4KeKUZwBMqmOdcdJ6Q", "object": "chat.completion.chunk", "created": 1773932881, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": ", make", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940168-sdQPAGE5xligrqHsosoJ", "object": "chat.completion.chunk", "created": 1787940168, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " The", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932881-AW4KeKUZwBMqmOdcdJ6Q", "object": "chat.completion.chunk", "created": 1773932881, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " sure to", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940168-sdQPAGE5xligrqHsosoJ", "object": "chat.completion.chunk", "created": 1787940168, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " current", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932881-AW4KeKUZwBMqmOdcdJ6Q", "object": "chat.completion.chunk", "created": 1773932881, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " stay hydrated", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940168-sdQPAGE5xligrqHsosoJ", "object": "chat.completion.chunk", "created": 1787940168, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " weather in", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932881-AW4KeKUZwBMqmOdcdJ6Q", "object": "chat.completion.chunk", "created": 1773932881, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": ", seek", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940168-sdQPAGE5xligrqHsosoJ", "object": "chat.completion.chunk", "created": 1787940168, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " Florence,", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932881-AW4KeKUZwBMqmOdcdJ6Q", "object": "chat.completion.chunk", "created": 1773932881, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " shade during", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940168-sdQPAGE5xligrqHsosoJ", "object": "chat.completion.chunk", "created": 1787940168, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " Italy is", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932881-AW4KeKUZwBMqmOdcdJ6Q", "object": "chat.completion.chunk", "created": 1773932881, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " the midday", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940168-sdQPAGE5xligrqHsosoJ", "object": "chat.completion.chunk", "created": 1787940168, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " **40", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932881-AW4KeKUZwBMqmOdcdJ6Q", "object": "chat.completion.chunk", "created": 1773932881, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " hours,", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940168-sdQPAGE5xligrqHsosoJ", "object": "chat.completion.chunk", "created": 1787940168, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "°C**", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932881-AW4KeKUZwBMqmOdcdJ6Q", "object": "chat.completion.chunk", "created": 1773932881, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " and wear", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940168-sdQPAGE5xligrqHsosoJ", "object": "chat.completion.chunk", "created": 1787940168, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " (104", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932881-AW4KeKUZwBMqmOdcdJ6Q", "object": "chat.completion.chunk", "created": 1773932881, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " sun", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940168-sdQPAGE5xligrqHsosoJ", "object": "chat.completion.chunk", "created": 1787940168, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "°F).", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932881-AW4KeKUZwBMqmOdcdJ6Q", "object": "chat.completion.chunk", "created": 1773932881, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " protection.", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940168-sdQPAGE5xligrqHsosoJ", "object": "chat.completion.chunk", "created": 1787940168, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " That's quite", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932881-AW4KeKUZwBMqmOdcdJ6Q", "object": "chat.completion.chunk", "created": 1773932881, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " Temperature", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940168-sdQPAGE5xligrqHsosoJ", "object": "chat.completion.chunk", "created": 1787940168, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " hot!", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932881-AW4KeKUZwBMqmOdcdJ6Q", "object": "chat.completion.chunk", "created": 1773932881, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "s this", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940168-sdQPAGE5xligrqHsosoJ", "object": "chat.completion.chunk", "created": 1787940168, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " ☀️", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932881-AW4KeKUZwBMqmOdcdJ6Q", "object": "chat.completion.chunk", "created": 1773932881, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " high are", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940168-sdQPAGE5xligrqHsosoJ", "object": "chat.completion.chunk", "created": 1787940168, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "\n\nMake", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932881-AW4KeKUZwBMqmOdcdJ6Q", "object": "chat.completion.chunk", "created": 1773932881, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " typical", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940168-sdQPAGE5xligrqHsosoJ", "object": "chat.completion.chunk", "created": 1787940168, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " sure to", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932881-AW4KeKUZwBMqmOdcdJ6Q", "object": "chat.completion.chunk", "created": 1773932881, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " of", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940168-sdQPAGE5xligrqHsosoJ", "object": "chat.completion.chunk", "created": 1787940168, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " stay hydrated", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932881-AW4KeKUZwBMqmOdcdJ6Q", "object": "chat.completion.chunk", "created": 1773932881, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " peak", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940168-sdQPAGE5xligrqHsosoJ", "object": "chat.completion.chunk", "created": 1787940168, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " and protect", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932881-AW4KeKUZwBMqmOdcdJ6Q", "object": "chat.completion.chunk", "created": 1773932881, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " summer", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940168-sdQPAGE5xligrqHsosoJ", "object": "chat.completion.chunk", "created": 1787940168, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " yourself from", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932881-AW4KeKUZwBMqmOdcdJ6Q", "object": "chat.completion.chunk", "created": 1773932881, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " heat waves", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940168-sdQPAGE5xligrqHsosoJ", "object": "chat.completion.chunk", "created": 1787940168, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " the sun", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932881-AW4KeKUZwBMqmOdcdJ6Q", "object": "chat.completion.chunk", "created": 1773932881, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " in the", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940168-sdQPAGE5xligrqHsosoJ", "object": "chat.completion.chunk", "created": 1787940168, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " if you're", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932881-AW4KeKUZwBMqmOdcdJ6Q", "object": "chat.completion.chunk", "created": 1773932881, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " region", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940168-sdQPAGE5xligrqHsosoJ", "object": "chat.completion.chunk", "created": 1787940168, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " visiting today", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932881-AW4KeKUZwBMqmOdcdJ6Q", "object": "chat.completion.chunk", "created": 1773932881, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": ".", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940168-sdQPAGE5xligrqHsosoJ", "object": "chat.completion.chunk", "created": 1787940168, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": ".", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932881-AW4KeKUZwBMqmOdcdJ6Q", "object": "chat.completion.chunk", "created": 1773932881, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_content": null}, "finish_reason": "stop", "native_finish_reason": "stop"}]} + data: {"id": "gen-1787940168-sdQPAGE5xligrqHsosoJ", "object": "chat.completion.chunk", "created": 1787940168, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_content": null}, "finish_reason": "stop", "native_finish_reason": "stop"}]} - data: {"id": "gen-1773932881-AW4KeKUZwBMqmOdcdJ6Q", "object": "chat.completion.chunk", "created": 1773932881, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant"}, "finish_reason": "stop", "native_finish_reason": "stop"}], "usage": {"prompt_tokens": 194, "completion_tokens": 161, "total_tokens": 355, "cost": 0.0004127, "prompt_tokens_details": {"cached_tokens": 128, "cache_write_tokens": 0, "audio_tokens": 0, "video_tokens": 0}, "completion_tokens_details": {"reasoning_tokens": 109, "image_tokens": 0, "audio_tokens": 0}}} + data: {"id": "gen-1787940168-sdQPAGE5xligrqHsosoJ", "object": "chat.completion.chunk", "created": 1787940168, "model": "moonshotai/kimi-k2.5", "service_tier": null, "choices": [{"index": 0, "delta": {"content": "", "role": "assistant"}, "finish_reason": "stop", "native_finish_reason": "stop"}], "usage": {"prompt_tokens": 193, "completion_tokens": 86, "total_tokens": 279, "cost": 0.00024725, "prompt_tokens_details": {"cached_tokens": 128, "cache_write_tokens": 0, "audio_tokens": 0, "video_tokens": 0}, "completion_tokens_details": {"reasoning_tokens": 50, "image_tokens": 0, "audio_tokens": 0}}} data: [DONE] @@ -361,4 +269,4 @@ interactions: - text/event-stream; charset=utf-8 status: 200 OK code: 200 - duration: 336.129584ms + duration: 361.191791ms diff --git a/providertests/testdata/TestOpenAICompatibleThinking/avian-kimi/thinking-streaming.yaml b/providertests/testdata/TestOpenAICompatibleThinking/avian-kimi/thinking-streaming.yaml index a4aaa5a3a..c3fda5978 100644 --- a/providertests/testdata/TestOpenAICompatibleThinking/avian-kimi/thinking-streaming.yaml +++ b/providertests/testdata/TestOpenAICompatibleThinking/avian-kimi/thinking-streaming.yaml @@ -15,7 +15,7 @@ interactions: Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.15.0 (https://charm.land/fantasy) + - Charm-Fantasy/0.41.3 (https://charm.land/fantasy) url: https://api.avian.io/v1/chat/completions method: POST response: @@ -24,56 +24,109 @@ interactions: proto_minor: 0 content_length: -1 body: |+ - data: {"id": "chatcmpl-6e0335f41a00481da298cc3f", "object": "chat.completion.chunk", "created": 1773932889, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"role": "assistant"}, "finish_reason": null}]} + data: {"id": "chatcmpl-37626b4b1a144f659fcb086e", "object": "chat.completion.chunk", "created": 1787940185, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"role": "assistant"}, "finish_reason": null}]} - data: {"id": "gen-1773932889-tco5qSg4D8Z94K6GPhdr", "object": "chat.completion.chunk", "created": 1773932889, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "I", "format": "unknown", "index": 0}], "reasoning_content": "I"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940185-fmDZ01VEzSOlXmmR1Zxr", "object": "chat.completion.chunk", "created": 1787940185, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "The", "format": "unknown", "index": 0}], "reasoning_content": "The"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932889-tco5qSg4D8Z94K6GPhdr", "object": "chat.completion.chunk", "created": 1773932889, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " need to", "format": "unknown", "index": 0}], "reasoning_content": " need to"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940185-fmDZ01VEzSOlXmmR1Zxr", "object": "chat.completion.chunk", "created": 1787940185, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " user is", "format": "unknown", "index": 0}], "reasoning_content": " user is"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932889-tco5qSg4D8Z94K6GPhdr", "object": "chat.completion.chunk", "created": 1773932889, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " get the", "format": "unknown", "index": 0}], "reasoning_content": " get the"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940185-fmDZ01VEzSOlXmmR1Zxr", "object": "chat.completion.chunk", "created": 1787940185, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " asking for", "format": "unknown", "index": 0}], "reasoning_content": " asking for"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932889-tco5qSg4D8Z94K6GPhdr", "object": "chat.completion.chunk", "created": 1773932889, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " weather information", "format": "unknown", "index": 0}], "reasoning_content": " weather information"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940185-fmDZ01VEzSOlXmmR1Zxr", "object": "chat.completion.chunk", "created": 1787940185, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " the weather", "format": "unknown", "index": 0}], "reasoning_content": " the weather"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932889-tco5qSg4D8Z94K6GPhdr", "object": "chat.completion.chunk", "created": 1773932889, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " for Florence", "format": "unknown", "index": 0}], "reasoning_content": " for Florence"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940185-fmDZ01VEzSOlXmmR1Zxr", "object": "chat.completion.chunk", "created": 1787940185, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " in Florence", "format": "unknown", "index": 0}], "reasoning_content": " in Florence"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932889-tco5qSg4D8Z94K6GPhdr", "object": "chat.completion.chunk", "created": 1773932889, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": ", Italy", "format": "unknown", "index": 0}], "reasoning_content": ", Italy"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940185-fmDZ01VEzSOlXmmR1Zxr", "object": "chat.completion.chunk", "created": 1787940185, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": ", Italy", "format": "unknown", "index": 0}], "reasoning_content": ", Italy"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932889-tco5qSg4D8Z94K6GPhdr", "object": "chat.completion.chunk", "created": 1773932889, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": ". I'll", "format": "unknown", "index": 0}], "reasoning_content": ". I'll"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940185-fmDZ01VEzSOlXmmR1Zxr", "object": "chat.completion.chunk", "created": 1787940185, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": ". I", "format": "unknown", "index": 0}], "reasoning_content": ". I"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932889-tco5qSg4D8Z94K6GPhdr", "object": "chat.completion.chunk", "created": 1773932889, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " call", "format": "unknown", "index": 0}], "reasoning_content": " call"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940185-fmDZ01VEzSOlXmmR1Zxr", "object": "chat.completion.chunk", "created": 1787940185, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " have", "format": "unknown", "index": 0}], "reasoning_content": " have"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932889-tco5qSg4D8Z94K6GPhdr", "object": "chat.completion.chunk", "created": 1773932889, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " the weather", "format": "unknown", "index": 0}], "reasoning_content": " the weather"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940185-fmDZ01VEzSOlXmmR1Zxr", "object": "chat.completion.chunk", "created": 1787940185, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " access", "format": "unknown", "index": 0}], "reasoning_content": " access"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932889-tco5qSg4D8Z94K6GPhdr", "object": "chat.completion.chunk", "created": 1773932889, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " function with", "format": "unknown", "index": 0}], "reasoning_content": " function with"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940185-fmDZ01VEzSOlXmmR1Zxr", "object": "chat.completion.chunk", "created": 1787940185, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " to a", "format": "unknown", "index": 0}], "reasoning_content": " to a"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932889-tco5qSg4D8Z94K6GPhdr", "object": "chat.completion.chunk", "created": 1773932889, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " \"", "format": "unknown", "index": 0}], "reasoning_content": " \""}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940185-fmDZ01VEzSOlXmmR1Zxr", "object": "chat.completion.chunk", "created": 1787940185, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " weather function", "format": "unknown", "index": 0}], "reasoning_content": " weather function"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932889-tco5qSg4D8Z94K6GPhdr", "object": "chat.completion.chunk", "created": 1773932889, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "Fl", "format": "unknown", "index": 0}], "reasoning_content": "Fl"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940185-fmDZ01VEzSOlXmmR1Zxr", "object": "chat.completion.chunk", "created": 1787940185, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " that can", "format": "unknown", "index": 0}], "reasoning_content": " that can"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932889-tco5qSg4D8Z94K6GPhdr", "object": "chat.completion.chunk", "created": 1773932889, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "orence", "format": "unknown", "index": 0}], "reasoning_content": "orence"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940185-fmDZ01VEzSOlXmmR1Zxr", "object": "chat.completion.chunk", "created": 1787940185, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " get", "format": "unknown", "index": 0}], "reasoning_content": " get"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932889-tco5qSg4D8Z94K6GPhdr", "object": "chat.completion.chunk", "created": 1773932889, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "\"", "format": "unknown", "index": 0}], "reasoning_content": "\""}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940185-fmDZ01VEzSOlXmmR1Zxr", "object": "chat.completion.chunk", "created": 1787940185, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " weather information", "format": "unknown", "index": 0}], "reasoning_content": " weather information"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932889-tco5qSg4D8Z94K6GPhdr", "object": "chat.completion.chunk", "created": 1773932889, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " as the", "format": "unknown", "index": 0}], "reasoning_content": " as the"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940185-fmDZ01VEzSOlXmmR1Zxr", "object": "chat.completion.chunk", "created": 1787940185, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " for a", "format": "unknown", "index": 0}], "reasoning_content": " for a"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932889-tco5qSg4D8Z94K6GPhdr", "object": "chat.completion.chunk", "created": 1773932889, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " location parameter", "format": "unknown", "index": 0}], "reasoning_content": " location parameter"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940185-fmDZ01VEzSOlXmmR1Zxr", "object": "chat.completion.chunk", "created": 1787940185, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " location.", "format": "unknown", "index": 0}], "reasoning_content": " location."}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932889-tco5qSg4D8Z94K6GPhdr", "object": "chat.completion.chunk", "created": 1773932889, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": ". ", "format": "unknown", "index": 0}], "reasoning_content": ". "}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940185-fmDZ01VEzSOlXmmR1Zxr", "object": "chat.completion.chunk", "created": 1787940185, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " I need", "format": "unknown", "index": 0}], "reasoning_content": " I need"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932889-tco5qSg4D8Z94K6GPhdr", "object": "chat.completion.chunk", "created": 1773932889, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " ", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940185-fmDZ01VEzSOlXmmR1Zxr", "object": "chat.completion.chunk", "created": 1787940185, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " to call", "format": "unknown", "index": 0}], "reasoning_content": " to call"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932889-tco5qSg4D8Z94K6GPhdr", "object": "chat.completion.chunk", "created": 1773932889, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " ", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940185-fmDZ01VEzSOlXmmR1Zxr", "object": "chat.completion.chunk", "created": 1787940185, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " this", "format": "unknown", "index": 0}], "reasoning_content": " this"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932889-tco5qSg4D8Z94K6GPhdr", "object": "chat.completion.chunk", "created": 1773932889, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": null, "role": "assistant", "tool_calls": [{"index": 0, "id": "functions.weather:0", "type": "function", "function": {"name": "weather", "arguments": ""}}]}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940185-fmDZ01VEzSOlXmmR1Zxr", "object": "chat.completion.chunk", "created": 1787940185, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " function with", "format": "unknown", "index": 0}], "reasoning_content": " function with"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932889-tco5qSg4D8Z94K6GPhdr", "object": "chat.completion.chunk", "created": 1773932889, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": null, "role": "assistant", "tool_calls": [{"index": 0, "function": {"arguments": "{\"location\": \"Florence\"}"}}]}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940185-fmDZ01VEzSOlXmmR1Zxr", "object": "chat.completion.chunk", "created": 1787940185, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " the location", "format": "unknown", "index": 0}], "reasoning_content": " the location"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932889-tco5qSg4D8Z94K6GPhdr", "object": "chat.completion.chunk", "created": 1773932889, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " ", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940185-fmDZ01VEzSOlXmmR1Zxr", "object": "chat.completion.chunk", "created": 1787940185, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " parameter", "format": "unknown", "index": 0}], "reasoning_content": " parameter"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932889-tco5qSg4D8Z94K6GPhdr", "object": "chat.completion.chunk", "created": 1773932889, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_content": null}, "finish_reason": "tool_calls", "native_finish_reason": "tool_calls"}]} + data: {"id": "gen-1787940185-fmDZ01VEzSOlXmmR1Zxr", "object": "chat.completion.chunk", "created": 1787940185, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " set", "format": "unknown", "index": 0}], "reasoning_content": " set"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932889-tco5qSg4D8Z94K6GPhdr", "object": "chat.completion.chunk", "created": 1773932889, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant"}, "finish_reason": "tool_calls", "native_finish_reason": "tool_calls"}], "usage": {"prompt_tokens": 76, "completion_tokens": 47, "total_tokens": 123, "cost": 0.0001232, "prompt_tokens_details": {"cached_tokens": 64, "cache_write_tokens": 0, "audio_tokens": 0, "video_tokens": 0}, "completion_tokens_details": {"reasoning_tokens": 34, "image_tokens": 0, "audio_tokens": 0}}} + data: {"id": "gen-1787940185-fmDZ01VEzSOlXmmR1Zxr", "object": "chat.completion.chunk", "created": 1787940185, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " to \"", "format": "unknown", "index": 0}], "reasoning_content": " to \""}, "finish_reason": null, "native_finish_reason": null}]} + + data: {"id": "gen-1787940185-fmDZ01VEzSOlXmmR1Zxr", "object": "chat.completion.chunk", "created": 1787940185, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "Flore", "format": "unknown", "index": 0}], "reasoning_content": "Flore"}, "finish_reason": null, "native_finish_reason": null}]} + + data: {"id": "gen-1787940185-fmDZ01VEzSOlXmmR1Zxr", "object": "chat.completion.chunk", "created": 1787940185, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "nce\"", "format": "unknown", "index": 0}], "reasoning_content": "nce\""}, "finish_reason": null, "native_finish_reason": null}]} + + data: {"id": "gen-1787940185-fmDZ01VEzSOlXmmR1Zxr", "object": "chat.completion.chunk", "created": 1787940185, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " (", "format": "unknown", "index": 0}], "reasoning_content": " ("}, "finish_reason": null, "native_finish_reason": null}]} + + data: {"id": "gen-1787940185-fmDZ01VEzSOlXmmR1Zxr", "object": "chat.completion.chunk", "created": 1787940185, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "or \"", "format": "unknown", "index": 0}], "reasoning_content": "or \""}, "finish_reason": null, "native_finish_reason": null}]} + + data: {"id": "gen-1787940185-fmDZ01VEzSOlXmmR1Zxr", "object": "chat.completion.chunk", "created": 1787940185, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "Flore", "format": "unknown", "index": 0}], "reasoning_content": "Flore"}, "finish_reason": null, "native_finish_reason": null}]} + + data: {"id": "gen-1787940185-fmDZ01VEzSOlXmmR1Zxr", "object": "chat.completion.chunk", "created": 1787940185, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "nce,", "format": "unknown", "index": 0}], "reasoning_content": "nce,"}, "finish_reason": null, "native_finish_reason": null}]} + + data: {"id": "gen-1787940185-fmDZ01VEzSOlXmmR1Zxr", "object": "chat.completion.chunk", "created": 1787940185, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " Italy\")", "format": "unknown", "index": 0}], "reasoning_content": " Italy\")"}, "finish_reason": null, "native_finish_reason": null}]} + + data: {"id": "gen-1787940185-fmDZ01VEzSOlXmmR1Zxr", "object": "chat.completion.chunk", "created": 1787940185, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": ".\n\nLet", "format": "unknown", "index": 0}], "reasoning_content": ".\n\nLet"}, "finish_reason": null, "native_finish_reason": null}]} + + data: {"id": "gen-1787940185-fmDZ01VEzSOlXmmR1Zxr", "object": "chat.completion.chunk", "created": 1787940185, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " me call", "format": "unknown", "index": 0}], "reasoning_content": " me call"}, "finish_reason": null, "native_finish_reason": null}]} + + data: {"id": "gen-1787940185-fmDZ01VEzSOlXmmR1Zxr", "object": "chat.completion.chunk", "created": 1787940185, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " the weather", "format": "unknown", "index": 0}], "reasoning_content": " the weather"}, "finish_reason": null, "native_finish_reason": null}]} + + data: {"id": "gen-1787940185-fmDZ01VEzSOlXmmR1Zxr", "object": "chat.completion.chunk", "created": 1787940185, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " function with", "format": "unknown", "index": 0}], "reasoning_content": " function with"}, "finish_reason": null, "native_finish_reason": null}]} + + data: {"id": "gen-1787940185-fmDZ01VEzSOlXmmR1Zxr", "object": "chat.completion.chunk", "created": 1787940185, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " the location", "format": "unknown", "index": 0}], "reasoning_content": " the location"}, "finish_reason": null, "native_finish_reason": null}]} + + data: {"id": "gen-1787940185-fmDZ01VEzSOlXmmR1Zxr", "object": "chat.completion.chunk", "created": 1787940185, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": ".", "format": "unknown", "index": 0}], "reasoning_content": "."}, "finish_reason": null, "native_finish_reason": null}]} + + data: {"id": "gen-1787940185-fmDZ01VEzSOlXmmR1Zxr", "object": "chat.completion.chunk", "created": 1787940185, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " ", "format": "unknown", "index": 0}], "reasoning_content": " "}, "finish_reason": null, "native_finish_reason": null}]} + + data: {"id": "gen-1787940185-fmDZ01VEzSOlXmmR1Zxr", "object": "chat.completion.chunk", "created": 1787940185, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " I'll", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + + data: {"id": "gen-1787940185-fmDZ01VEzSOlXmmR1Zxr", "object": "chat.completion.chunk", "created": 1787940185, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " check", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + + data: {"id": "gen-1787940185-fmDZ01VEzSOlXmmR1Zxr", "object": "chat.completion.chunk", "created": 1787940185, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " the weather", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + + data: {"id": "gen-1787940185-fmDZ01VEzSOlXmmR1Zxr", "object": "chat.completion.chunk", "created": 1787940185, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " in", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + + data: {"id": "gen-1787940185-fmDZ01VEzSOlXmmR1Zxr", "object": "chat.completion.chunk", "created": 1787940185, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " Florence for", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + + data: {"id": "gen-1787940185-fmDZ01VEzSOlXmmR1Zxr", "object": "chat.completion.chunk", "created": 1787940185, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " you.", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + + data: {"id": "gen-1787940185-fmDZ01VEzSOlXmmR1Zxr", "object": "chat.completion.chunk", "created": 1787940185, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " ", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + + + data: {"id": "gen-1787940185-fmDZ01VEzSOlXmmR1Zxr", "object": "chat.completion.chunk", "created": 1787940185, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": null, "role": "assistant", "tool_calls": [{"index": 0, "id": "functions.weather:0", "type": "function", "function": {"name": "weather", "arguments": ""}}]}, "finish_reason": null, "native_finish_reason": null}]} + + data: {"id": "gen-1787940185-fmDZ01VEzSOlXmmR1Zxr", "object": "chat.completion.chunk", "created": 1787940185, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": null, "role": "assistant", "tool_calls": [{"index": 0, "function": {"arguments": "{\"location\": \"Florence, Italy\"}"}}]}, "finish_reason": null, "native_finish_reason": null}]} + + data: {"id": "gen-1787940185-fmDZ01VEzSOlXmmR1Zxr", "object": "chat.completion.chunk", "created": 1787940185, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " ", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + + data: {"id": "gen-1787940185-fmDZ01VEzSOlXmmR1Zxr", "object": "chat.completion.chunk", "created": 1787940185, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_content": null}, "finish_reason": "tool_calls", "native_finish_reason": "tool_calls"}]} + + data: {"id": "gen-1787940185-fmDZ01VEzSOlXmmR1Zxr", "object": "chat.completion.chunk", "created": 1787940185, "model": "moonshotai/kimi-k2.5", "service_tier": null, "choices": [{"index": 0, "delta": {"content": "", "role": "assistant"}, "finish_reason": "tool_calls", "native_finish_reason": "tool_calls"}], "usage": {"prompt_tokens": 76, "completion_tokens": 95, "total_tokens": 171, "cost": 0.0002288, "prompt_tokens_details": {"cached_tokens": 64, "cache_write_tokens": 0, "audio_tokens": 0, "video_tokens": 0}, "completion_tokens_details": {"reasoning_tokens": 74, "image_tokens": 0, "audio_tokens": 0}}} data: [DONE] @@ -82,22 +135,22 @@ interactions: - text/event-stream; charset=utf-8 status: 200 OK code: 200 - duration: 425.380292ms + duration: 521.325459ms - id: 1 request: proto: HTTP/1.1 proto_major: 1 proto_minor: 1 - content_length: 897 + content_length: 1115 host: "" - body: '{"messages":[{"content":"You are a helpful assistant","role":"system"},{"content":"What''s the weather in Florence, Italy?","role":"user"},{"content":" ","tool_calls":[{"id":"functions.weather:0","function":{"arguments":"{\"location\": \"Florence\"}","name":"weather"},"type":"function"}],"role":"assistant","reasoning_content":"I need to get the weather information for Florence, Italy. I''ll call the weather function with \"Florence\" as the location parameter. "},{"content":"40 C","tool_call_id":"functions.weather:0","role":"tool"}],"model":"moonshotai/kimi-k2.5","stream_options":{"include_usage":true},"tool_choice":"auto","tools":[{"function":{"name":"weather","strict":false,"description":"Get weather information for a location","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"}},"type":"function"}],"stream":true}' + body: '{"messages":[{"content":"You are a helpful assistant","role":"system"},{"content":"What''s the weather in Florence, Italy?","role":"user"},{"content":" I''ll check the weather in Florence for you. \n ","tool_calls":[{"id":"functions.weather:0","function":{"arguments":"{\"location\": \"Florence, Italy\"}","name":"weather"},"type":"function"}],"role":"assistant","reasoning_content":"The user is asking for the weather in Florence, Italy. I have access to a weather function that can get weather information for a location. I need to call this function with the location parameter set to \"Florence\" (or \"Florence, Italy\").\n\nLet me call the weather function with the location. "},{"content":"40 C","tool_call_id":"functions.weather:0","role":"tool"}],"model":"moonshotai/kimi-k2.5","stream_options":{"include_usage":true},"tool_choice":"auto","tools":[{"function":{"name":"weather","strict":false,"description":"Get weather information for a location","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"}},"type":"function"}],"stream":true}' headers: Accept: - application/json Content-Type: - application/json User-Agent: - - Charm-Fantasy/0.15.0 (https://charm.land/fantasy) + - Charm-Fantasy/0.41.3 (https://charm.land/fantasy) url: https://api.avian.io/v1/chat/completions method: POST response: @@ -106,101 +159,79 @@ interactions: proto_minor: 0 content_length: -1 body: |+ - data: {"id": "chatcmpl-6134a71fef4d44bfa96e800f", "object": "chat.completion.chunk", "created": 1773932891, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"role": "assistant"}, "finish_reason": null}]} - - data: {"id": "gen-1773932891-itZRH9Z0JMWEfAojMrcI", "object": "chat.completion.chunk", "created": 1773932891, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "The", "format": "unknown", "index": 0}], "reasoning_content": "The"}, "finish_reason": null, "native_finish_reason": null}]} - - data: {"id": "gen-1773932891-itZRH9Z0JMWEfAojMrcI", "object": "chat.completion.chunk", "created": 1773932891, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " weather", "format": "unknown", "index": 0}], "reasoning_content": " weather"}, "finish_reason": null, "native_finish_reason": null}]} - - data: {"id": "gen-1773932891-itZRH9Z0JMWEfAojMrcI", "object": "chat.completion.chunk", "created": 1773932891, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " function returned", "format": "unknown", "index": 0}], "reasoning_content": " function returned"}, "finish_reason": null, "native_finish_reason": null}]} - - data: {"id": "gen-1773932891-itZRH9Z0JMWEfAojMrcI", "object": "chat.completion.chunk", "created": 1773932891, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " \"", "format": "unknown", "index": 0}], "reasoning_content": " \""}, "finish_reason": null, "native_finish_reason": null}]} - - data: {"id": "gen-1773932891-itZRH9Z0JMWEfAojMrcI", "object": "chat.completion.chunk", "created": 1773932891, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "40 C", "format": "unknown", "index": 0}], "reasoning_content": "40 C"}, "finish_reason": null, "native_finish_reason": null}]} - - data: {"id": "gen-1773932891-itZRH9Z0JMWEfAojMrcI", "object": "chat.completion.chunk", "created": 1773932891, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "\" which", "format": "unknown", "index": 0}], "reasoning_content": "\" which"}, "finish_reason": null, "native_finish_reason": null}]} - - data: {"id": "gen-1773932891-itZRH9Z0JMWEfAojMrcI", "object": "chat.completion.chunk", "created": 1773932891, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " means", "format": "unknown", "index": 0}], "reasoning_content": " means"}, "finish_reason": null, "native_finish_reason": null}]} - - data: {"id": "gen-1773932891-itZRH9Z0JMWEfAojMrcI", "object": "chat.completion.chunk", "created": 1773932891, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " it's", "format": "unknown", "index": 0}], "reasoning_content": " it's"}, "finish_reason": null, "native_finish_reason": null}]} - - data: {"id": "gen-1773932891-itZRH9Z0JMWEfAojMrcI", "object": "chat.completion.chunk", "created": 1773932891, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " 40", "format": "unknown", "index": 0}], "reasoning_content": " 40"}, "finish_reason": null, "native_finish_reason": null}]} - - data: {"id": "gen-1773932891-itZRH9Z0JMWEfAojMrcI", "object": "chat.completion.chunk", "created": 1773932891, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " degrees Celsius", "format": "unknown", "index": 0}], "reasoning_content": " degrees Celsius"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "chatcmpl-e05ae3975053440d93bd0e60", "object": "chat.completion.chunk", "created": 1787940189, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"role": "assistant"}, "finish_reason": null}]} - data: {"id": "gen-1773932891-itZRH9Z0JMWEfAojMrcI", "object": "chat.completion.chunk", "created": 1773932891, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " in Florence", "format": "unknown", "index": 0}], "reasoning_content": " in Florence"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932891-itZRH9Z0JMWEfAojMrcI", "object": "chat.completion.chunk", "created": 1773932891, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": ". This", "format": "unknown", "index": 0}], "reasoning_content": ". This"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940189-rJx2kxF5pRCtvrqovqn3", "object": "chat.completion.chunk", "created": 1787940189, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "The", "format": "unknown", "index": 0}], "reasoning_content": "The"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932891-itZRH9Z0JMWEfAojMrcI", "object": "chat.completion.chunk", "created": 1773932891, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " is quite", "format": "unknown", "index": 0}], "reasoning_content": " is quite"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940189-rJx2kxF5pRCtvrqovqn3", "object": "chat.completion.chunk", "created": 1787940189, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " weather", "format": "unknown", "index": 0}], "reasoning_content": " weather"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932891-itZRH9Z0JMWEfAojMrcI", "object": "chat.completion.chunk", "created": 1773932891, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " hot!", "format": "unknown", "index": 0}], "reasoning_content": " hot!"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940189-rJx2kxF5pRCtvrqovqn3", "object": "chat.completion.chunk", "created": 1787940189, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " in", "format": "unknown", "index": 0}], "reasoning_content": " in"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932891-itZRH9Z0JMWEfAojMrcI", "object": "chat.completion.chunk", "created": 1773932891, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " I should", "format": "unknown", "index": 0}], "reasoning_content": " I should"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932891-itZRH9Z0JMWEfAojMrcI", "object": "chat.completion.chunk", "created": 1773932891, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " report", "format": "unknown", "index": 0}], "reasoning_content": " report"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940189-rJx2kxF5pRCtvrqovqn3", "object": "chat.completion.chunk", "created": 1787940189, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " Florence,", "format": "unknown", "index": 0}], "reasoning_content": " Florence,"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932891-itZRH9Z0JMWEfAojMrcI", "object": "chat.completion.chunk", "created": 1773932891, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " this to", "format": "unknown", "index": 0}], "reasoning_content": " this to"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940189-rJx2kxF5pRCtvrqovqn3", "object": "chat.completion.chunk", "created": 1787940189, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " Italy is", "format": "unknown", "index": 0}], "reasoning_content": " Italy is"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932891-itZRH9Z0JMWEfAojMrcI", "object": "chat.completion.chunk", "created": 1773932891, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " the user", "format": "unknown", "index": 0}], "reasoning_content": " the user"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940189-rJx2kxF5pRCtvrqovqn3", "object": "chat.completion.chunk", "created": 1787940189, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " 40", "format": "unknown", "index": 0}], "reasoning_content": " 40"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932891-itZRH9Z0JMWEfAojMrcI", "object": "chat.completion.chunk", "created": 1773932891, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " and", "format": "unknown", "index": 0}], "reasoning_content": " and"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940189-rJx2kxF5pRCtvrqovqn3", "object": "chat.completion.chunk", "created": 1787940189, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": "°C.", "format": "unknown", "index": 0}], "reasoning_content": "°C."}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932891-itZRH9Z0JMWEfAojMrcI", "object": "chat.completion.chunk", "created": 1773932891, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " perhaps convert", "format": "unknown", "index": 0}], "reasoning_content": " perhaps convert"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940189-rJx2kxF5pRCtvrqovqn3", "object": "chat.completion.chunk", "created": 1787940189, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " That's quite", "format": "unknown", "index": 0}], "reasoning_content": " That's quite"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932891-itZRH9Z0JMWEfAojMrcI", "object": "chat.completion.chunk", "created": 1773932891, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " it to", "format": "unknown", "index": 0}], "reasoning_content": " it to"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940189-rJx2kxF5pRCtvrqovqn3", "object": "chat.completion.chunk", "created": 1787940189, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " hot!", "format": "unknown", "index": 0}], "reasoning_content": " hot!"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932891-itZRH9Z0JMWEfAojMrcI", "object": "chat.completion.chunk", "created": 1773932891, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " Fahrenheit as", "format": "unknown", "index": 0}], "reasoning_content": " Fahrenheit as"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940189-rJx2kxF5pRCtvrqovqn3", "object": "chat.completion.chunk", "created": 1787940189, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " I should", "format": "unknown", "index": 0}], "reasoning_content": " I should"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932891-itZRH9Z0JMWEfAojMrcI", "object": "chat.completion.chunk", "created": 1773932891, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " well for", "format": "unknown", "index": 0}], "reasoning_content": " well for"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940189-rJx2kxF5pRCtvrqovqn3", "object": "chat.completion.chunk", "created": 1787940189, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " present", "format": "unknown", "index": 0}], "reasoning_content": " present"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932891-itZRH9Z0JMWEfAojMrcI", "object": "chat.completion.chunk", "created": 1773932891, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " better", "format": "unknown", "index": 0}], "reasoning_content": " better"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940189-rJx2kxF5pRCtvrqovqn3", "object": "chat.completion.chunk", "created": 1787940189, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " this information", "format": "unknown", "index": 0}], "reasoning_content": " this information"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932891-itZRH9Z0JMWEfAojMrcI", "object": "chat.completion.chunk", "created": 1773932891, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " context", "format": "unknown", "index": 0}], "reasoning_content": " context"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940189-rJx2kxF5pRCtvrqovqn3", "object": "chat.completion.chunk", "created": 1787940189, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " clearly to", "format": "unknown", "index": 0}], "reasoning_content": " clearly to"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932891-itZRH9Z0JMWEfAojMrcI", "object": "chat.completion.chunk", "created": 1773932891, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": ". ", "format": "unknown", "index": 0}], "reasoning_content": ". "}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940189-rJx2kxF5pRCtvrqovqn3", "object": "chat.completion.chunk", "created": 1787940189, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": " the user", "format": "unknown", "index": 0}], "reasoning_content": " the user"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932891-itZRH9Z0JMWEfAojMrcI", "object": "chat.completion.chunk", "created": 1773932891, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " The", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940189-rJx2kxF5pRCtvrqovqn3", "object": "chat.completion.chunk", "created": 1787940189, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_details": [{"type": "reasoning.text", "text": ". ", "format": "unknown", "index": 0}], "reasoning_content": ". "}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932891-itZRH9Z0JMWEfAojMrcI", "object": "chat.completion.chunk", "created": 1773932891, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " weather in", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940189-rJx2kxF5pRCtvrqovqn3", "object": "chat.completion.chunk", "created": 1787940189, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " The current", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932891-itZRH9Z0JMWEfAojMrcI", "object": "chat.completion.chunk", "created": 1773932891, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " Florence,", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940189-rJx2kxF5pRCtvrqovqn3", "object": "chat.completion.chunk", "created": 1787940189, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " temperature", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932891-itZRH9Z0JMWEfAojMrcI", "object": "chat.completion.chunk", "created": 1773932891, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " Italy is", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940189-rJx2kxF5pRCtvrqovqn3", "object": "chat.completion.chunk", "created": 1787940189, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " in Florence", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932891-itZRH9Z0JMWEfAojMrcI", "object": "chat.completion.chunk", "created": 1773932891, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " currently **", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940189-rJx2kxF5pRCtvrqovqn3", "object": "chat.completion.chunk", "created": 1787940189, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": ", Italy", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932891-itZRH9Z0JMWEfAojMrcI", "object": "chat.completion.chunk", "created": 1773932891, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "40°C", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940189-rJx2kxF5pRCtvrqovqn3", "object": "chat.completion.chunk", "created": 1787940189, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " is **", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932891-itZRH9Z0JMWEfAojMrcI", "object": "chat.completion.chunk", "created": 1773932891, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " (", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940189-rJx2kxF5pRCtvrqovqn3", "object": "chat.completion.chunk", "created": 1787940189, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "40°C", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932891-itZRH9Z0JMWEfAojMrcI", "object": "chat.completion.chunk", "created": 1773932891, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "104°F", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940189-rJx2kxF5pRCtvrqovqn3", "object": "chat.completion.chunk", "created": 1787940189, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "** (", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932891-itZRH9Z0JMWEfAojMrcI", "object": "chat.completion.chunk", "created": 1773932891, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": ")** -", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940189-rJx2kxF5pRCtvrqovqn3", "object": "chat.completion.chunk", "created": 1787940189, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "104°F", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932891-itZRH9Z0JMWEfAojMrcI", "object": "chat.completion.chunk", "created": 1773932891, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " that's", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940189-rJx2kxF5pRCtvrqovqn3", "object": "chat.completion.chunk", "created": 1787940189, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "). That's", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932891-itZRH9Z0JMWEfAojMrcI", "object": "chat.completion.chunk", "created": 1773932891, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " quite hot", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940189-rJx2kxF5pRCtvrqovqn3", "object": "chat.completion.chunk", "created": 1787940189, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " quite hot", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932891-itZRH9Z0JMWEfAojMrcI", "object": "chat.completion.chunk", "created": 1773932891, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "! Make", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940189-rJx2kxF5pRCtvrqovqn3", "object": "chat.completion.chunk", "created": 1787940189, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "! Make", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932891-itZRH9Z0JMWEfAojMrcI", "object": "chat.completion.chunk", "created": 1773932891, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " sure to", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940189-rJx2kxF5pRCtvrqovqn3", "object": "chat.completion.chunk", "created": 1787940189, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " sure to", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932891-itZRH9Z0JMWEfAojMrcI", "object": "chat.completion.chunk", "created": 1773932891, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " stay hydrated", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940189-rJx2kxF5pRCtvrqovqn3", "object": "chat.completion.chunk", "created": 1787940189, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " stay hydrated", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932891-itZRH9Z0JMWEfAojMrcI", "object": "chat.completion.chunk", "created": 1773932891, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " and take", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940189-rJx2kxF5pRCtvrqovqn3", "object": "chat.completion.chunk", "created": 1787940189, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " and seek", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932891-itZRH9Z0JMWEfAojMrcI", "object": "chat.completion.chunk", "created": 1773932891, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " precautions if", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940189-rJx2kxF5pRCtvrqovqn3", "object": "chat.completion.chunk", "created": 1787940189, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " shade if", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932891-itZRH9Z0JMWEfAojMrcI", "object": "chat.completion.chunk", "created": 1773932891, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " you're planning", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940189-rJx2kxF5pRCtvrqovqn3", "object": "chat.completion.chunk", "created": 1787940189, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " you're visiting", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932891-itZRH9Z0JMWEfAojMrcI", "object": "chat.completion.chunk", "created": 1773932891, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " to be", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940189-rJx2kxF5pRCtvrqovqn3", "object": "chat.completion.chunk", "created": 1787940189, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " the city", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932891-itZRH9Z0JMWEfAojMrcI", "object": "chat.completion.chunk", "created": 1773932891, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " outdoors.", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} + data: {"id": "gen-1787940189-rJx2kxF5pRCtvrqovqn3", "object": "chat.completion.chunk", "created": 1787940189, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": " today.", "role": "assistant"}, "finish_reason": null, "native_finish_reason": null}]} - data: {"id": "gen-1773932891-itZRH9Z0JMWEfAojMrcI", "object": "chat.completion.chunk", "created": 1773932891, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_content": null}, "finish_reason": "stop", "native_finish_reason": "stop"}]} + data: {"id": "gen-1787940189-rJx2kxF5pRCtvrqovqn3", "object": "chat.completion.chunk", "created": 1787940189, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant", "reasoning_content": null}, "finish_reason": "stop", "native_finish_reason": "stop"}]} - data: {"id": "gen-1773932891-itZRH9Z0JMWEfAojMrcI", "object": "chat.completion.chunk", "created": 1773932891, "model": "moonshotai/kimi-k2.5", "choices": [{"index": 0, "delta": {"content": "", "role": "assistant"}, "finish_reason": "stop", "native_finish_reason": "stop"}], "usage": {"prompt_tokens": 145, "completion_tokens": 78, "total_tokens": 223, "cost": 0.00022245, "prompt_tokens_details": {"cached_tokens": 64, "cache_write_tokens": 0, "audio_tokens": 0, "video_tokens": 0}, "completion_tokens_details": {"reasoning_tokens": 51, "image_tokens": 0, "audio_tokens": 0}}} + data: {"id": "gen-1787940189-rJx2kxF5pRCtvrqovqn3", "object": "chat.completion.chunk", "created": 1787940189, "model": "moonshotai/kimi-k2.5", "service_tier": null, "choices": [{"index": 0, "delta": {"content": "", "role": "assistant"}, "finish_reason": "stop", "native_finish_reason": "stop"}], "usage": {"prompt_tokens": 194, "completion_tokens": 61, "total_tokens": 255, "cost": 0.0001927, "prompt_tokens_details": {"cached_tokens": 128, "cache_write_tokens": 0, "audio_tokens": 0, "video_tokens": 0}, "completion_tokens_details": {"reasoning_tokens": 29, "image_tokens": 0, "audio_tokens": 0}}} data: [DONE] @@ -209,4 +240,4 @@ interactions: - text/event-stream; charset=utf-8 status: 200 OK code: 200 - duration: 417.109875ms + duration: 349.110209ms From 9b236ced90357749a212615a59222fb55029735c Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Fri, 28 Aug 2026 15:16:36 -0300 Subject: [PATCH 091/156] fix: close four remaining stream/replay edge cases MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Review follow-ups (CHARM-2020): - A no-finish-reason stream whose only tool call is a bare declaration (no arguments at all) was treated as complete and dispatched with an invented "{}" — a call cut before its first argument is not complete. It now surfaces IncompleteStreamError like other cut streams. - A higher tool-call index prematurely closed lower calls and dropped their later deltas, truncating arguments on interleaved parallel-call streams. Calls now stay open until the finalizer; the openai framing test asserts per-call integrity (own deltas, exactly one end) instead of requiring ends before the next start. - Mixed plain/extra-field text segments reordered (A, cached B, C came out B, A, C). Segments are collected as one ordered block list; the string form is used only when no segment carries extra fields. - Reasoning-only assistant turns were dropped as "empty", breaking the replay contract on truncated thinking turns. reasoning_content counts as visible content. Assisted-by: Crush:kimi-k3 --- providers/openai/language_model.go | 35 ++-------- providers/openai/openai_test.go | 29 ++++---- .../openaicompat/language_model_hooks.go | 45 ++++++------ providers/openaicompat/openaicompat_test.go | 70 +++++++++++++++++-- providers/openaicompat/replay_test.go | 57 +++++++++++++++ 5 files changed, 163 insertions(+), 73 deletions(-) diff --git a/providers/openai/language_model.go b/providers/openai/language_model.go index 7c5d463f0..dc1191d99 100644 --- a/providers/openai/language_model.go +++ b/providers/openai/language_model.go @@ -400,9 +400,6 @@ func (o languageModel) Stream(ctx context.Context, call fantasy.Call) (fantasy.S for _, toolCallDelta := range choice.Delta.ToolCalls { if existingToolCall, ok := toolCalls[toolCallDelta.Index]; ok { - if existingToolCall.hasFinished { - continue - } if toolCallDelta.Function.Arguments != "" { existingToolCall.arguments += toolCallDelta.Function.Arguments if !yield(fantasy.StreamPart{ @@ -431,33 +428,6 @@ func (o languageModel) Stream(ctx context.Context, call fantasy.Call) (fantasy.S return } - // A new tool call index means any previously opened - // calls are complete. Emit ToolInputEnd for each to - // preserve per-call framing during streaming so that - // consumers can reconstruct parallel tool calls from - // the stream order without buffering. Close them in - // index order for deterministic output. - priorIndices := make([]int64, 0, len(toolCalls)) - for idx := range toolCalls { - priorIndices = append(priorIndices, idx) - } - slices.Sort(priorIndices) - for _, idx := range priorIndices { - tc := toolCalls[idx] - if idx >= toolCallDelta.Index || tc.hasFinished { - continue - } - if tc.arguments == "" { - tc.arguments = "{}" - toolCalls[idx] = tc - } - if !yield(fantasy.StreamPart{Type: fantasy.StreamPartTypeToolInputEnd, ID: tc.id}) { - return - } - tc.hasFinished = true - toolCalls[idx] = tc - } - if !yield(fantasy.StreamPart{ Type: fantasy.StreamPartTypeToolInputStart, ID: toolCallDelta.ID, @@ -545,7 +515,10 @@ func (o languageModel) Stream(ctx context.Context, call fantasy.Call) (fantasy.S if finishReason == "" && len(toolCalls) > 0 { missingFinish = true for _, tc := range toolCalls { - if tc.arguments != "" && !json.Valid([]byte(tc.arguments)) { + // A call with no arguments was cut before any argument + // arrived; filling in "{}" would invent arguments the model + // never sent. + if tc.arguments == "" || !json.Valid([]byte(tc.arguments)) { missingFinishWithBadArgs = true break } diff --git a/providers/openai/openai_test.go b/providers/openai/openai_test.go index 4a29f83c7..e10400716 100644 --- a/providers/openai/openai_test.go +++ b/providers/openai/openai_test.go @@ -2730,14 +2730,14 @@ func TestDoStream(t *testing.T) { parts, err := collectStreamParts(stream) require.NoError(t, err) - // The framing contract: a tool call must be fully delimited - // (Start -> Deltas -> End) before the next one opens. No two calls - // may be open at once, and no delta may arrive for an already-ended - // call. This is what lets an order/index-keyed consumer reconstruct - // parallel calls without buffering the whole stream. - var openID string // currently open tool call, "" if none + // The integrity contract: every opened call is attributed deltas for + // its own id only, every call is ended exactly once, and every + // ToolCall carries the fully accumulated input. Interleaved + // providers may keep sending deltas for an earlier call after the + // next one has started, so an end is not required to precede the + // next start — but no delta may arrive after its call's end. + started := map[string]bool{} ended := map[string]bool{} - seenStart := map[string]bool{} argsByID := map[string]*strings.Builder{} nameByID := map[string]string{} var order []string @@ -2745,24 +2745,19 @@ func TestDoStream(t *testing.T) { for _, part := range parts { switch part.Type { case fantasy.StreamPartTypeToolInputStart: - require.Empty(t, openID, - "tool call %s opened while %s still open (interleaved framing)", part.ID, openID) - require.False(t, seenStart[part.ID], "duplicate start for %s", part.ID) - openID = part.ID - seenStart[part.ID] = true + require.False(t, started[part.ID], "duplicate start for %s", part.ID) + started[part.ID] = true nameByID[part.ID] = part.ToolCallName argsByID[part.ID] = &strings.Builder{} order = append(order, part.ID) case fantasy.StreamPartTypeToolInputDelta: - require.Equal(t, openID, part.ID, - "delta for %s but open call is %q", part.ID, openID) + require.True(t, started[part.ID], "delta for never-started call %s", part.ID) require.False(t, ended[part.ID], "delta after end for %s", part.ID) argsByID[part.ID].WriteString(part.Delta) case fantasy.StreamPartTypeToolInputEnd: - require.Equal(t, openID, part.ID, - "end for %s but open call is %q", part.ID, openID) + require.True(t, started[part.ID], "end for never-started call %s", part.ID) + require.False(t, ended[part.ID], "duplicate end for %s", part.ID) ended[part.ID] = true - openID = "" case fantasy.StreamPartTypeToolCall: require.True(t, ended[part.ID], "tool call %s finalized before end", part.ID) nameByID[part.ID] = part.ToolCallName diff --git a/providers/openaicompat/language_model_hooks.go b/providers/openaicompat/language_model_hooks.go index 14c5a5354..353f28818 100644 --- a/providers/openaicompat/language_model_hooks.go +++ b/providers/openaicompat/language_model_hooks.go @@ -404,12 +404,13 @@ func ToPromptFunc(prompt fantasy.Prompt, _, _ string) ([]openaisdk.ChatCompletio // A turn may carry several reasoning or text segments (a model that // reasons, speaks, then reasons again). Concatenate in order rather // than last-write-wins so no segment is silently dropped (F2, - // CHARM-2020). Segments carrying extra content fields force the - // array form, one block per part, to keep the fields attached. + // CHARM-2020). Text segments are collected as ordered blocks; the + // string form is used only for a single segment with no extra + // fields, so mixed plain/extra turns keep their original order. var reasoningTexts []string reasoningPresent := false - var textParts []string var textBlocks []openaisdk.ChatCompletionAssistantMessageParamContentArrayOfContentPartUnion + textHasExtra := false for _, c := range msg.Content { switch c.GetType() { case fantasy.ContentTypeText: @@ -422,13 +423,10 @@ func ToPromptFunc(prompt fantasy.Prompt, _, _ string) ([]openaisdk.ChatCompletio continue } textBlock, hasExtra := buildTextBlock(textPart.Text, textPart.ProviderOptions, msg.ProviderOptions) - if hasExtra { - textBlocks = append(textBlocks, openaisdk.ChatCompletionAssistantMessageParamContentArrayOfContentPartUnion{ - OfText: textBlock, - }) - } else { - textParts = append(textParts, textPart.Text) - } + textHasExtra = textHasExtra || hasExtra + textBlocks = append(textBlocks, openaisdk.ChatCompletionAssistantMessageParamContentArrayOfContentPartUnion{ + OfText: textBlock, + }) case fantasy.ContentTypeReasoning: reasoningPart, ok := fantasy.AsContentType[fantasy.ReasoningPart](c) if !ok { @@ -462,21 +460,20 @@ func ToPromptFunc(prompt fantasy.Prompt, _, _ string) ([]openaisdk.ChatCompletio }) } } - // Text: array form when any segment carried extra fields (one block - // per segment, extras attached); otherwise the joined string. - if len(textBlocks) > 0 { - for _, tp := range textParts { - block, _ := buildTextBlock(tp, nil, nil) - textBlocks = append(textBlocks, openaisdk.ChatCompletionAssistantMessageParamContentArrayOfContentPartUnion{ - OfText: block, - }) + // Text: when no segment carries extra fields, join into the string + // form; otherwise emit the ordered blocks one per segment so mixed + // plain/extra turns keep their original order. + if len(textBlocks) > 0 && !textHasExtra { + texts := make([]string, len(textBlocks)) + for i, b := range textBlocks { + texts[i] = b.OfText.Text } assistantMsg.Content = openaisdk.ChatCompletionAssistantMessageParamContentUnion{ - OfArrayOfContentParts: textBlocks, + OfString: param.NewOpt(strings.Join(texts, "\n")), } - } else if len(textParts) > 0 { + } else if len(textBlocks) > 0 { assistantMsg.Content = openaisdk.ChatCompletionAssistantMessageParamContentUnion{ - OfString: param.NewOpt(strings.Join(textParts, "\n")), + OfArrayOfContentParts: textBlocks, } } // Add reasoning_content field if the message carries a reasoning @@ -590,5 +587,11 @@ func hasVisibleCompatAssistantContent(msg *openaisdk.ChatCompletionAssistantMess if len(msg.ToolCalls) > 0 { return true } + // A reasoning-only turn is visible: reasoning_content must round-trip + // for DeepSeek-family replay, and dropping the turn breaks the + // conversation's message ordering. + if _, ok := msg.ExtraFields()["reasoning_content"]; ok { + return true + } return false } diff --git a/providers/openaicompat/openaicompat_test.go b/providers/openaicompat/openaicompat_test.go index 995565ff7..e91b7b26b 100644 --- a/providers/openaicompat/openaicompat_test.go +++ b/providers/openaicompat/openaicompat_test.go @@ -82,14 +82,18 @@ func TestToPromptFunc_ReasoningContent(t *testing.T) { messages, warnings := ToPromptFunc(prompt, "", "") - require.Len(t, warnings, 1) - require.Contains(t, warnings[0].Message, "dropping empty assistant message") - require.Len(t, messages, 1) // Only user message, assistant message dropped + // Reasoning-only turns are visible content: reasoning_content must + // round-trip for DeepSeek-family replay (CHARM-2020). + require.Empty(t, warnings) + require.Len(t, messages, 2) - // User message - unchanged msg := messages[0].OfUser require.NotNil(t, msg) require.Equal(t, "Hello", msg.Content.OfString.Value) + + assistantMsg := messages[1].OfAssistant + require.NotNil(t, assistantMsg) + require.Equal(t, "Internal reasoning only...", assistantMsg.ExtraFields()["reasoning_content"]) }) t.Run("should not add reasoning_content to messages without reasoning", func(t *testing.T) { @@ -938,3 +942,61 @@ func TestToPromptFunc_MultiSegmentConcatenation(t *testing.T) { require.True(t, hasReasoning) require.Equal(t, "a\nb", reasoningContent, "reasoning parts must concatenate, not overwrite") } + +// Mixed plain and extra-field text segments must keep their original +// order: A (plain), B (cached), C (plain) must serialize as A, B, C. +func TestToPromptFunc_MixedTextSegmentOrder(t *testing.T) { + t.Parallel() + + prompt := fantasy.Prompt{ + { + Role: fantasy.MessageRoleAssistant, + Content: []fantasy.MessagePart{ + fantasy.TextPart{Text: "A"}, + fantasy.TextPart{ + Text: "B", + ProviderOptions: fantasy.ProviderOptions{ + Name: &ContentExtraFields{Fields: map[string]any{ + "cache_control": map[string]string{"type": "ephemeral"}, + }}, + }, + }, + fantasy.TextPart{Text: "C"}, + }, + }, + } + + messages, warnings := ToPromptFunc(prompt, "", "") + require.Empty(t, warnings) + require.Len(t, messages, 1) + + msg := messages[0].OfAssistant + require.NotNil(t, msg) + blocks := msg.Content.OfArrayOfContentParts + require.Len(t, blocks, 3, "expected array form with one block per segment, got %+v", msg.Content) + require.Equal(t, "A", blocks[0].OfText.Text) + require.Equal(t, "B", blocks[1].OfText.Text) + require.Equal(t, "C", blocks[2].OfText.Text) + require.Equal(t, map[string]any{"cache_control": map[string]string{"type": "ephemeral"}}, blocks[1].OfText.ExtraFields()) +} + +// A reasoning-only assistant turn must survive: reasoning_content is +// visible content. Dropping it breaks DeepSeek's replay contract on +// truncated thinking turns. +func TestToPromptFunc_ReasoningOnlyTurnKept(t *testing.T) { + t.Parallel() + + prompt := fantasy.Prompt{ + {Role: fantasy.MessageRoleUser, Content: []fantasy.MessagePart{fantasy.TextPart{Text: "hi"}}}, + {Role: fantasy.MessageRoleAssistant, Content: []fantasy.MessagePart{ + fantasy.ReasoningPart{Text: "thinking…"}, + }}, + } + + messages, warnings := ToPromptFunc(prompt, "", "") + require.Empty(t, warnings) + require.Len(t, messages, 2, "reasoning-only assistant turn must not be dropped") + msg := messages[1].OfAssistant + require.NotNil(t, msg) + require.Equal(t, "thinking…", msg.ExtraFields()["reasoning_content"]) +} diff --git a/providers/openaicompat/replay_test.go b/providers/openaicompat/replay_test.go index 44ecbb90d..a9c8bcc1d 100644 --- a/providers/openaicompat/replay_test.go +++ b/providers/openaicompat/replay_test.go @@ -649,3 +649,60 @@ func TestReplay_ContentFilter_SuppressesToolCalls(t *testing.T) { require.NotNil(t, finish, "types: %v", partTypes(parts)) require.Equal(t, fantasy.FinishReasonContentFilter, finish.FinishReason) } + +// A stream with no finish_reason whose only tool call is a bare +// declaration (no arguments at all) was cut before any argument arrived. +// Inferring a complete "{}" call invents arguments the model never sent. +const doneNoFinishNoArgsSSE = `{"id":"x","created":1,"model":"m","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"id":"c1","type":"function","function":{"name":"f","arguments":""}}]},"finish_reason":null}]}` + +func TestReplay_DoneWithoutFinishReason_NoArgsSuppressed(t *testing.T) { + srv, _ := serveSSE(t, doneNoFinishNoArgsSSE) + provider, err := New(WithBaseURL(srv.URL), WithAPIKey("x")) + require.NoError(t, err) + lm, err := provider.LanguageModel(context.Background(), "m") + require.NoError(t, err) + + parts := streamParts(t, lm, fantasy.Prompt{ + {Role: fantasy.MessageRoleUser, Content: []fantasy.MessagePart{fantasy.TextPart{Text: "x"}}}, + }) + require.Equal(t, 0, countType(parts, fantasy.StreamPartTypeToolCall), + "a bare tool declaration is not a complete call; types: %v", partTypes(parts)) + var sawError bool + for _, p := range parts { + if p.Type == fantasy.StreamPartTypeError { + sawError = true + } + } + require.True(t, sawError, "expected IncompleteStreamError, types: %v", partTypes(parts)) +} + +// Interleaved parallel tool calls: deltas for index 0 continue after index +// 1 has started. Arguments for both must accumulate fully — closing index 0 +// when 1 first appears would drop its trailing deltas. +const interleavedParallelSSE = `{"id":"x","created":1,"model":"m","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"id":"c0","type":"function","function":{"name":"grep","arguments":"{\"pat"}}]},"finish_reason":null}]} +{"id":"x","created":1,"model":"m","choices":[{"index":0,"delta":{"tool_calls":[{"index":1,"id":"c1","type":"function","function":{"name":"glob","arguments":"{\"pa"}}]},"finish_reason":null}]} +{"id":"x","created":1,"model":"m","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"tern\":\"foo\"}"}}]},"finish_reason":null}]} +{"id":"x","created":1,"model":"m","choices":[{"index":0,"delta":{"tool_calls":[{"index":1,"function":{"arguments":"th\":\"x\"}"}}]},"finish_reason":null}]} +{"id":"x","created":1,"model":"m","choices":[{"index":0,"delta":{},"finish_reason":"tool_calls"}]}` + +func TestReplay_InterleavedParallelToolCalls(t *testing.T) { + srv, _ := serveSSE(t, interleavedParallelSSE) + provider, err := New(WithBaseURL(srv.URL), WithAPIKey("x")) + require.NoError(t, err) + lm, err := provider.LanguageModel(context.Background(), "m") + require.NoError(t, err) + + parts := streamParts(t, lm, fantasy.Prompt{ + {Role: fantasy.MessageRoleUser, Content: []fantasy.MessagePart{fantasy.TextPart{Text: "x"}}}, + }) + calls := map[string]string{} + for _, p := range parts { + if p.Type == fantasy.StreamPartTypeToolCall { + calls[p.ToolCallName] = p.ToolCallInput + } + } + require.Equal(t, map[string]string{ + "grep": `{"pattern":"foo"}`, + "glob": `{"path":"x"}`, + }, calls) +} From 30464590bc5bd76cfbc7cbd902896f6b2e4e8332 Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Fri, 28 Aug 2026 15:29:10 -0300 Subject: [PATCH 092/156] fix: gate non-streaming tool dispatch on abnormal finish reasons MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Generate validated and executed tool calls before ever looking at the finish reason, so a response ending length, content-filter, error, or unknown could execute arguments that were cut short — the stream-path equivalent of the suppression added for CHARM-2020. Dispatch is now skipped on those finishes while the validated tool-call content is still recorded in the step. FinishReasonStop with tool calls keeps dispatching: real providers report tool turns as tool_calls (anthropic tool_use, google, openai), but stop carries no truncation signal and some mocks/providers use it, so it remains tolerated. Documented with a test. Assisted-by: Crush:kimi-k3 --- agent.go | 17 ++++++++++- agent_test.go | 84 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 100 insertions(+), 1 deletion(-) diff --git a/agent.go b/agent.go index fcfaada35..4411a8d6e 100644 --- a/agent.go +++ b/agent.go @@ -564,7 +564,22 @@ func (a *agent) Generate(ctx context.Context, opts AgentCall) (*AgentResult, err } } - toolResults, err := a.executeTools(ctx, stepTools, stepExecProviderTools, stepToolCalls, nil) + // Suppress dispatch on abnormal finishes — length, content filter, + // provider error, unknown — which can accompany arguments that were + // cut short; executing those is how truncated input reaches tools + // (CHARM-2020). This mirrors the provider layer's streaming + // suppression. FinishReasonStop with tool calls still dispatches: + // tolerated for providers that report stop on a tool turn. The + // validated tool-call content is recorded in the step below either + // way, so the step result reflects what the model tried to call. + var toolResults []ToolResultContent + suppressed := result.FinishReason == FinishReasonLength || + result.FinishReason == FinishReasonError || + result.FinishReason == FinishReasonContentFilter || + result.FinishReason == FinishReasonUnknown + if !suppressed { + toolResults, err = a.executeTools(ctx, stepTools, stepExecProviderTools, stepToolCalls, nil) + } // If any tool result requested a stop, deliver all results but don't // request another completion from the model. diff --git a/agent_test.go b/agent_test.go index db76d6d9a..67b5da0ea 100644 --- a/agent_test.go +++ b/agent_test.go @@ -2847,3 +2847,87 @@ func TestAgent_Generate_ParallelToolPanicBecomesFailedResult(t *testing.T) { require.ErrorContains(t, errResult.Error, "panicking_parallel_tool") require.ErrorContains(t, errResult.Error, "parallel boom") } + +// TestAgent_SkipsToolDispatchOnAbnormalFinish_NonStreaming mirrors the +// stream-path guard on Generate: a response carrying tool calls but ending +// length, content-filter, or error must not execute them — the arguments +// may have been cut short (CHARM-2020). +func TestAgent_SkipsToolDispatchOnAbnormalFinish_NonStreaming(t *testing.T) { + t.Parallel() + + for _, reason := range []FinishReason{FinishReasonLength, FinishReasonError, FinishReasonContentFilter, FinishReasonUnknown} { + t.Run(string(reason), func(t *testing.T) { + t.Parallel() + + var toolExecuted bool + model := &mockLanguageModel{ + generateFunc: func(ctx context.Context, call Call) (*Response, error) { + return &Response{ + Content: []Content{ + ToolCallContent{ToolCallID: "call-x", ToolName: "echo", Input: `{"message":"hi"}`}, + }, + FinishReason: reason, + Usage: Usage{TotalTokens: 10}, + }, nil + }, + } + + echoTool := &trackingEchoTool{onExecute: func() { toolExecuted = true }} + agent := NewAgent(model, WithTools(echoTool)) + + result, err := agent.Generate(context.Background(), AgentCall{Prompt: "test"}) + require.NoError(t, err) + require.False(t, toolExecuted, "tool must not be dispatched when finish_reason is %s", reason) + require.Equal(t, reason, result.Response.FinishReason) + require.Len(t, result.Steps, 1) + }) + } +} + +// TestAgent_StopWithToolCallsStillDispatches documents the tolerated shape: +// some providers report stop on a tool turn. Unlike abnormal finishes +// (length/error/content-filter/unknown), stop carries no truncation risk, +// so dispatch proceeds. +func TestAgent_StopWithToolCallsStillDispatches(t *testing.T) { + t.Parallel() + + var toolExecuted bool + model := &mockLanguageModel{ + generateFunc: func(ctx context.Context, call Call) (*Response, error) { + for _, m := range call.Prompt { + if m.Role == MessageRoleTool { + return &Response{ + Content: []Content{TextContent{Text: "done"}}, + FinishReason: FinishReasonStop, + Usage: Usage{TotalTokens: 5}, + }, nil + } + } + return &Response{ + Content: []Content{ + ToolCallContent{ToolCallID: "call-x", ToolName: "echo", Input: `{"message":"hi"}`}, + }, + FinishReason: FinishReasonStop, + Usage: Usage{TotalTokens: 10}, + }, nil + }, + } + + echoTool := &trackingEchoTool{onExecute: func() { toolExecuted = true }} + agent := NewAgent(model, WithTools(echoTool)) + + result, err := agent.Generate(context.Background(), AgentCall{Prompt: "test"}) + require.NoError(t, err) + require.True(t, toolExecuted, "stop with tool calls must still dispatch") + // The loop stops after one step because the finish reason is stop, not + // tool_calls — but the tool result is recorded in the step content. + require.Len(t, result.Steps, 1) + var results []ToolResultContent + for _, c := range result.Steps[0].Content { + if tr, ok := AsContentType[ToolResultContent](c); ok { + results = append(results, tr) + } + } + require.Len(t, results, 1) + require.Equal(t, "call-x", results[0].ToolCallID) +} From 4ae0746d613b9debdd346f4a93c56460777944ec Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Fri, 28 Aug 2026 15:56:01 -0300 Subject: [PATCH 093/156] fix: never repair or finalize fabricated input on truncated turns MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Two review follow-ups (CHARM-2020): - The non-streaming agent ran validation/repair — which can be an extra model call — on tool calls from responses that ended abnormally (length, content filter, error, unknown) before suppressing execution. Both are now skipped together; the raw call is recorded in the step. - A stream missing its finish reason with unusable partial tool calls finalized them first: backfilling empty arguments with "{}" and emitting ToolInputEnd before the IncompleteStreamError. The error now returns before the finalizer, so consumers never see fabricated completed input. Assisted-by: Crush:kimi-k3 --- agent.go | 30 +++++++++++-------- agent_test.go | 42 +++++++++++++++++++++++++++ providers/openai/language_model.go | 15 ++++++++++ providers/openaicompat/replay_test.go | 26 +++++++++++++++++ 4 files changed, 101 insertions(+), 12 deletions(-) diff --git a/agent.go b/agent.go index 4411a8d6e..0c859a175 100644 --- a/agent.go +++ b/agent.go @@ -545,6 +545,18 @@ func (a *agent) Generate(ctx context.Context, opts AgentCall) (*AgentResult, err return nil, err } + // Abnormal finishes — length, content filter, provider error, + // unknown — can accompany arguments that were cut short. Skip + // validation and repair entirely (repair may be an extra model + // call), leave the raw tool-call content in the step, and do not + // execute (CHARM-2020). FinishReasonStop with tool calls still + // validates and dispatches: tolerated for providers that report + // stop on a tool turn. + suppressed := result.FinishReason == FinishReasonLength || + result.FinishReason == FinishReasonError || + result.FinishReason == FinishReasonContentFilter || + result.FinishReason == FinishReasonUnknown + var stepToolCalls []ToolCallContent for _, content := range result.Content { if content.GetType() == ContentTypeToolCall { @@ -558,25 +570,19 @@ func (a *agent) Generate(ctx context.Context, opts AgentCall) (*AgentResult, err if toolCall.ProviderExecuted { continue } + if suppressed { + // Keep the raw call for the step record; never repair + // or execute it. + stepToolCalls = append(stepToolCalls, toolCall) + continue + } // Validate and potentially repair the tool call validatedToolCall := a.validateAndRepairToolCall(ctx, toolCall, stepTools, stepExecProviderTools, stepSystemPrompt, stepInputMessages, a.settings.repairToolCall) stepToolCalls = append(stepToolCalls, validatedToolCall) } } - // Suppress dispatch on abnormal finishes — length, content filter, - // provider error, unknown — which can accompany arguments that were - // cut short; executing those is how truncated input reaches tools - // (CHARM-2020). This mirrors the provider layer's streaming - // suppression. FinishReasonStop with tool calls still dispatches: - // tolerated for providers that report stop on a tool turn. The - // validated tool-call content is recorded in the step below either - // way, so the step result reflects what the model tried to call. var toolResults []ToolResultContent - suppressed := result.FinishReason == FinishReasonLength || - result.FinishReason == FinishReasonError || - result.FinishReason == FinishReasonContentFilter || - result.FinishReason == FinishReasonUnknown if !suppressed { toolResults, err = a.executeTools(ctx, stepTools, stepExecProviderTools, stepToolCalls, nil) } diff --git a/agent_test.go b/agent_test.go index 67b5da0ea..476aaf0ca 100644 --- a/agent_test.go +++ b/agent_test.go @@ -2931,3 +2931,45 @@ func TestAgent_StopWithToolCallsStillDispatches(t *testing.T) { require.Len(t, results, 1) require.Equal(t, "call-x", results[0].ToolCallID) } + +// TestAgent_NoRepairOnAbnormalFinish_NonStreaming guards CHARM-2020: when a +// response ends abnormally, the agent must not invoke the repair callback — +// which can be an extra model call — on arguments that may be truncated. +func TestAgent_NoRepairOnAbnormalFinish_NonStreaming(t *testing.T) { + t.Parallel() + + for _, reason := range []FinishReason{FinishReasonLength, FinishReasonError, FinishReasonContentFilter, FinishReasonUnknown} { + t.Run(string(reason), func(t *testing.T) { + t.Parallel() + + var repaired bool + model := &mockLanguageModel{ + generateFunc: func(ctx context.Context, call Call) (*Response, error) { + return &Response{ + Content: []Content{ + ToolCallContent{ToolCallID: "call-x", ToolName: "echo", Input: `{"message":"tr`}, + }, + FinishReason: reason, + Usage: Usage{TotalTokens: 10}, + }, nil + }, + } + + agent := NewAgent( + model, + WithTools(&trackingEchoTool{}), + WithRepairToolCall(func(ctx context.Context, options ToolCallRepairOptions) (*ToolCallContent, error) { + repaired = true + repairedCall := options.OriginalToolCall + repairedCall.Input = `{"message":"fixed"}` + return &repairedCall, nil + }), + ) + + result, err := agent.Generate(context.Background(), AgentCall{Prompt: "test"}) + require.NoError(t, err) + require.False(t, repaired, "repair must not run when finish_reason is %s", reason) + require.Len(t, result.Steps, 1) + }) + } +} diff --git a/providers/openai/language_model.go b/providers/openai/language_model.go index dc1191d99..501b78cad 100644 --- a/providers/openai/language_model.go +++ b/providers/openai/language_model.go @@ -535,6 +535,21 @@ func (o languageModel) Stream(ctx context.Context, call fantasy.Call) (fantasy.S mappedFinishReason == fantasy.FinishReasonContentFilter || missingFinishWithBadArgs) && len(toolCalls) > 0 + // A cut stream with unusable partial calls errors out before the + // finalizer runs: emitting ToolInputEnd after backfilling "{}" would + // present fabricated completed input to consumers (CHARM-2020). + if missingFinishWithBadArgs { + err := ctx.Err() + if err == nil { + err = fantasy.NewIncompleteStreamError() + } + yield(fantasy.StreamPart{ + Type: fantasy.StreamPartTypeError, + Error: err, + }) + return + } + // Finalize tool calls in index order after the stream completes. // When truncated, skip ToolCall parts to prevent agents from // dispatching calls with incomplete arguments. diff --git a/providers/openaicompat/replay_test.go b/providers/openaicompat/replay_test.go index a9c8bcc1d..647d87e27 100644 --- a/providers/openaicompat/replay_test.go +++ b/providers/openaicompat/replay_test.go @@ -706,3 +706,29 @@ func TestReplay_InterleavedParallelToolCalls(t *testing.T) { "glob": `{"path":"x"}`, }, calls) } + +// On a cut stream, consumers must not see a ToolInputEnd that presents +// fabricated "{}" input for a call that never sent arguments. +func TestReplay_DoneWithoutFinishReason_NoFabricatedEnd(t *testing.T) { + srv, _ := serveSSE(t, doneNoFinishNoArgsSSE) + provider, err := New(WithBaseURL(srv.URL), WithAPIKey("x")) + require.NoError(t, err) + lm, err := provider.LanguageModel(context.Background(), "m") + require.NoError(t, err) + + parts := streamParts(t, lm, fantasy.Prompt{ + {Role: fantasy.MessageRoleUser, Content: []fantasy.MessagePart{fantasy.TextPart{Text: "x"}}}, + }) + for _, p := range parts { + require.NotEqual(t, fantasy.StreamPartTypeToolInputEnd, p.Type, + "no ToolInputEnd may be emitted on a cut stream; types: %v", partTypes(parts)) + require.NotEqual(t, fantasy.StreamPartTypeToolCall, p.Type, "types: %v", partTypes(parts)) + } + var sawError bool + for _, p := range parts { + if p.Type == fantasy.StreamPartTypeError { + sawError = true + } + } + require.True(t, sawError, "types: %v", partTypes(parts)) +} From 0510aafd0899b4c91a1bc7d813fd648f939a8b44 Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Fri, 28 Aug 2026 16:07:27 -0300 Subject: [PATCH 094/156] fix: repair streamed tool calls only after the finish reason is known MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The stream path validated/repaired a ToolCall part and fired OnToolCall the moment the part arrived, before the Finish part could reveal a length/error/content-filter/unknown ending. A provider that emits a ToolCall before an abnormal finish had its possibly-truncated arguments repaired — potentially an extra paid model call — and exposed to consumers; only dispatch was gated (CHARM-2020). ToolCall parts are now buffered raw during the stream. Validation, repair, and OnToolCall all run after the stream ends alongside the dispatch decision: normal turns are repaired and dispatched as before, abnormal turns record the raw call in the step and skip the rest. Assisted-by: Crush:kimi-k3 --- agent.go | 72 ++++++++++++++++++++++++++++++-------------- agent_stream_test.go | 61 +++++++++++++++++++++++++++++++++++++ 2 files changed, 110 insertions(+), 23 deletions(-) diff --git a/agent.go b/agent.go index 0c859a175..ba4af0867 100644 --- a/agent.go +++ b/agent.go @@ -1430,6 +1430,10 @@ func (a *agent) processStepStream(ctx context.Context, stream StreamResponse, op parallel bool } var pendingDispatches []toolExecutionRequest + // Raw tool calls as emitted by the provider, before validation/repair. + // They are processed only after the stream ends and the finish reason + // is known (see below). + var rawToolCalls []ToolCallContent // Create a map for quick tool lookup toolMap := make(map[string]AgentTool) @@ -1598,29 +1602,13 @@ func (a *agent) processStepStream(ctx context.Context, stream StreamResponse, op } delete(activeToolCalls, part.ID) } else { - // Validate and potentially repair the tool call - validatedToolCall := a.validateAndRepairToolCall(ctx, toolCall, stepTools, execProviderTools, a.settings.systemPrompt, stepInputMessages, opts.RepairToolCall) - stepToolCalls = append(stepToolCalls, validatedToolCall) - stepContent = append(stepContent, validatedToolCall) - - if opts.OnToolCall != nil { - err := opts.OnToolCall(validatedToolCall) - if err != nil { - return stepExecutionResult{}, err - } - } - - // Determine if tool can run in parallel - isParallel := false - if tool, exists := toolMap[validatedToolCall.ToolName]; exists { - isParallel = tool.Info().Parallel - } - - // Buffer dispatch until stream is fully consumed so that all - // OnToolCall callbacks complete before any tool result is written. - pendingDispatches = append(pendingDispatches, toolExecutionRequest{toolCall: validatedToolCall, parallel: isParallel}) - - // Clean up active tool call + // Buffer the raw call. Validation, repair, and the + // OnToolCall callback all wait until the stream has ended + // and the finish reason is known: a provider that emits a + // ToolCall before a length/error finish must not have its + // possibly-truncated arguments repaired (repair may be an + // extra model call) or exposed to consumers (CHARM-2020). + rawToolCalls = append(rawToolCalls, toolCall) delete(activeToolCalls, part.ID) } @@ -1721,6 +1709,44 @@ func (a *agent) processStepStream(ctx context.Context, stream StreamResponse, op } }) + // Process buffered tool calls now that the finish reason is known. + // Abnormal finishes — length, content filter, provider error, unknown — + // can accompany arguments that were cut short: record the raw call in + // the step content, but never repair (repair may be an extra model + // call), never fire OnToolCall, and never dispatch (CHARM-2020). + abnormalFinish := stepFinishReason == FinishReasonLength || + stepFinishReason == FinishReasonError || + stepFinishReason == FinishReasonContentFilter || + stepFinishReason == FinishReasonUnknown + for _, toolCall := range rawToolCalls { + if abnormalFinish { + stepToolCalls = append(stepToolCalls, toolCall) + stepContent = append(stepContent, toolCall) + continue + } + // Validate and potentially repair the tool call + validatedToolCall := a.validateAndRepairToolCall(ctx, toolCall, stepTools, execProviderTools, a.settings.systemPrompt, stepInputMessages, opts.RepairToolCall) + stepToolCalls = append(stepToolCalls, validatedToolCall) + stepContent = append(stepContent, validatedToolCall) + + if opts.OnToolCall != nil { + err := opts.OnToolCall(validatedToolCall) + if err != nil { + return stepExecutionResult{}, err + } + } + + // Determine if tool can run in parallel + isParallel := false + if tool, exists := toolMap[validatedToolCall.ToolName]; exists { + isParallel = tool.Info().Parallel + } + + // Buffer dispatch until stream is fully consumed so that all + // OnToolCall callbacks complete before any tool result is written. + pendingDispatches = append(pendingDispatches, toolExecutionRequest{toolCall: validatedToolCall, parallel: isParallel}) + } + // Dispatch all buffered tool calls now that every OnToolCall callback has // been called, then close and wait. Dispatch only on an explicit // tool-calls turn: any other finish reason (length, content filter, diff --git a/agent_stream_test.go b/agent_stream_test.go index da790df4b..7d0a4bb0d 100644 --- a/agent_stream_test.go +++ b/agent_stream_test.go @@ -946,3 +946,64 @@ func TestStreamingAgent_ParallelToolResultsInCallOrder(t *testing.T) { require.Equal(t, []string{"call-slow", "call-fast"}, order, "results must follow call order, not completion order") } + +// TestStreamingAgent_NoRepairOrOnToolCallBeforeAbnormalFinish pins the +// CHARM-2020 "never repair" requirement for the stream path: a provider +// that emits a ToolCall part and only then finishes with length/error must +// not have the call repaired (an extra model call) or exposed to +// OnToolCall consumers. +func TestStreamingAgent_NoRepairOrOnToolCallBeforeAbnormalFinish(t *testing.T) { + t.Parallel() + + for _, reason := range []FinishReason{FinishReasonLength, FinishReasonError, FinishReasonContentFilter, FinishReasonUnknown} { + t.Run(string(reason), func(t *testing.T) { + t.Parallel() + + var repaired, onToolCallFired, executed bool + model := &mockLanguageModel{ + streamFunc: func(ctx context.Context, call Call) (StreamResponse, error) { + return func(yield func(StreamPart) bool) { + // ToolCall emitted BEFORE the finish part. + if !yield(StreamPart{Type: StreamPartTypeToolCall, ID: "call-x", ToolCallName: "echo", ToolCallInput: `{"message":"tr`}) { + return + } + yield(StreamPart{Type: StreamPartTypeFinish, FinishReason: reason, Usage: Usage{TotalTokens: 10}}) + }, nil + }, + } + + agent := NewAgent( + model, + WithTools(&trackingEchoTool{onExecute: func() { executed = true }}), + WithRepairToolCall(func(ctx context.Context, options ToolCallRepairOptions) (*ToolCallContent, error) { + repaired = true + c := options.OriginalToolCall + c.Input = `{"message":"fixed"}` + return &c, nil + }), + ) + + result, err := agent.Stream(context.Background(), AgentStreamCall{ + Prompt: "test", + OnToolCall: func(ToolCallContent) error { + onToolCallFired = true + return nil + }, + }) + require.NoError(t, err) + require.False(t, repaired, "repair must not run when finish is %s", reason) + require.False(t, onToolCallFired, "OnToolCall must not fire when finish is %s", reason) + require.False(t, executed, "tool must not execute when finish is %s", reason) + require.Len(t, result.Steps, 1) + // The raw call is still recorded for the step. + var calls []ToolCallContent + for _, c := range result.Steps[0].Content { + if tc, ok := AsContentType[ToolCallContent](c); ok { + calls = append(calls, tc) + } + } + require.Len(t, calls, 1) + require.Equal(t, `{"message":"tr`, calls[0].Input, "raw (unrepaired) input must be recorded") + }) + } +} From 41a45482cc3a26b13906ff65b261d2cc49b0a378 Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Fri, 28 Aug 2026 16:26:51 -0300 Subject: [PATCH 095/156] fix: gate provider-executed OnToolCall on finish; keep stream order MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Two follow-ups to the late-binding change: - Provider-executed tool calls (e.g. Anthropic web search) fired OnToolCall the moment the part arrived, before the finish reason was known — the same exposure the agent-executed branch was buffered against. They are now buffered with everything else and notified only for completed turns; the provider still ran them, so on abnormal finishes they are recorded in the step without the callback. - Buffering delayed appending to step content, which reversed the order of back-to-back tool calls relative to later stream parts and broke provider round-tripping (Anthropic web search, parallel tool turns). Buffered calls now record their emission position and are spliced back in stream order. Assisted-by: Crush:kimi-k3 --- agent.go | 79 ++++++++++++++++++++++++++++---------------- agent_stream_test.go | 49 +++++++++++++++++++++++++++ 2 files changed, 100 insertions(+), 28 deletions(-) diff --git a/agent.go b/agent.go index ba4af0867..5843471b5 100644 --- a/agent.go +++ b/agent.go @@ -1430,10 +1430,16 @@ func (a *agent) processStepStream(ctx context.Context, stream StreamResponse, op parallel bool } var pendingDispatches []toolExecutionRequest - // Raw tool calls as emitted by the provider, before validation/repair. - // They are processed only after the stream ends and the finish reason - // is known (see below). - var rawToolCalls []ToolCallContent + // Raw tool calls as emitted by the provider, before validation/repair, + // each with the position in stepContent at which it was emitted. They + // are processed only after the stream ends and the finish reason is + // known (see below); the position preserves stream order in the + // recorded step content. + type rawToolCall struct { + contentIndex int + toolCall ToolCallContent + } + var rawToolCalls []rawToolCall // Create a map for quick tool lookup toolMap := make(map[string]AgentTool) @@ -1590,27 +1596,16 @@ func (a *agent) processStepStream(ctx context.Context, stream StreamResponse, op ProviderMetadata: part.ProviderMetadata, } - // Provider-executed tool calls are handled by the provider - // and should not be validated or executed by the agent. - if toolCall.ProviderExecuted { - stepContent = append(stepContent, toolCall) - if opts.OnToolCall != nil { - err := opts.OnToolCall(toolCall) - if err != nil { - return stepExecutionResult{}, err - } - } - delete(activeToolCalls, part.ID) - } else { - // Buffer the raw call. Validation, repair, and the - // OnToolCall callback all wait until the stream has ended - // and the finish reason is known: a provider that emits a - // ToolCall before a length/error finish must not have its - // possibly-truncated arguments repaired (repair may be an - // extra model call) or exposed to consumers (CHARM-2020). - rawToolCalls = append(rawToolCalls, toolCall) - delete(activeToolCalls, part.ID) - } + // Buffer the call. Validation, repair, and the OnToolCall + // callback all wait until the stream has ended and the finish + // reason is known: a provider that emits a ToolCall before a + // length/error finish must not have its possibly-truncated + // arguments repaired (repair may be an extra model call) or + // exposed to consumers — provider-executed calls included; the + // provider may run them, but consumers hear about them only for + // completed turns (CHARM-2020). + rawToolCalls = append(rawToolCalls, rawToolCall{contentIndex: len(stepContent), toolCall: toolCall}) + delete(activeToolCalls, part.ID) case StreamPartTypeToolResult: // Provider-executed tool results (e.g. web search) @@ -1718,16 +1713,44 @@ func (a *agent) processStepStream(ctx context.Context, stream StreamResponse, op stepFinishReason == FinishReasonError || stepFinishReason == FinishReasonContentFilter || stepFinishReason == FinishReasonUnknown - for _, toolCall := range rawToolCalls { + // Splice each processed call into the position it was emitted at in the + // stream, so step content preserves the provider's ordering. Calls + // emitted back-to-back share the same recorded index; track insertions + // so they land in emission order, not reversed. + insertContent := func(at int, c Content) { + stepContent = append(stepContent, nil) + copy(stepContent[at+1:], stepContent[at:]) + stepContent[at] = c + } + inserted := 0 + for _, raw := range rawToolCalls { + at := raw.contentIndex + inserted + toolCall := raw.toolCall if abnormalFinish { stepToolCalls = append(stepToolCalls, toolCall) - stepContent = append(stepContent, toolCall) + insertContent(at, toolCall) + inserted++ + continue + } + // Provider-executed tool calls (e.g. web search) were already run by + // the provider: record them and notify, but never validate, repair, + // or dispatch them. + if toolCall.ProviderExecuted { + insertContent(at, toolCall) + inserted++ + if opts.OnToolCall != nil { + err := opts.OnToolCall(toolCall) + if err != nil { + return stepExecutionResult{}, err + } + } continue } // Validate and potentially repair the tool call validatedToolCall := a.validateAndRepairToolCall(ctx, toolCall, stepTools, execProviderTools, a.settings.systemPrompt, stepInputMessages, opts.RepairToolCall) stepToolCalls = append(stepToolCalls, validatedToolCall) - stepContent = append(stepContent, validatedToolCall) + insertContent(at, validatedToolCall) + inserted++ if opts.OnToolCall != nil { err := opts.OnToolCall(validatedToolCall) diff --git a/agent_stream_test.go b/agent_stream_test.go index 7d0a4bb0d..cada78c14 100644 --- a/agent_stream_test.go +++ b/agent_stream_test.go @@ -1007,3 +1007,52 @@ func TestStreamingAgent_NoRepairOrOnToolCallBeforeAbnormalFinish(t *testing.T) { }) } } + +// TestStreamingAgent_ProviderExecutedToolCallGatedOnFinish extends the +// late-binding guarantee to provider-executed calls: OnToolCall must not +// fire for them before the finish reason is known either. +func TestStreamingAgent_ProviderExecutedToolCallGatedOnFinish(t *testing.T) { + t.Parallel() + + for _, tc := range []struct { + reason FinishReason + wantNotified bool + }{ + {FinishReasonToolCalls, true}, + {FinishReasonLength, false}, + {FinishReasonError, false}, + } { + t.Run(string(tc.reason), func(t *testing.T) { + t.Parallel() + + var onToolCallFired bool + model := &mockLanguageModel{ + streamFunc: func(ctx context.Context, call Call) (StreamResponse, error) { + return func(yield func(StreamPart) bool) { + // Provider-executed tool call (e.g. web search) + if !yield(StreamPart{Type: StreamPartTypeToolCall, ID: "ws-1", ToolCallName: "web_search", ToolCallInput: `{"q":"x"}`, ProviderExecuted: true}) { + return + } + if !yield(StreamPart{Type: StreamPartTypeToolResult, ID: "ws-1", ToolCallName: "web_search", ProviderExecuted: true}) { + return + } + yield(StreamPart{Type: StreamPartTypeFinish, FinishReason: tc.reason, Usage: Usage{TotalTokens: 10}}) + }, nil + }, + } + + agent := NewAgent(model) + result, err := agent.Stream(context.Background(), AgentStreamCall{ + Prompt: "test", + OnToolCall: func(ToolCallContent) error { + onToolCallFired = true + return nil + }, + }) + require.NoError(t, err) + require.Equal(t, tc.wantNotified, onToolCallFired, + "OnToolCall fired=%v for provider-executed call with finish %s", onToolCallFired, tc.reason) + require.Len(t, result.Steps, 1) + }) + } +} From 6ff65abd3bf101d02043924241e22ce3e6a42634 Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Fri, 28 Aug 2026 17:11:38 -0300 Subject: [PATCH 096/156] v0.42.0 --- version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.txt b/version.txt index ef4ae97fb..787ffc30a 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -0.41.3 +0.42.0 From 78e7b3639038b173abdbe1c5a4560862a6f2791f Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Fri, 28 Aug 2026 17:11:56 -0300 Subject: [PATCH 097/156] chore(taskfile): add missing empty line --- Taskfile.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/Taskfile.yaml b/Taskfile.yaml index 7bc3537fb..462854d84 100644 --- a/Taskfile.yaml +++ b/Taskfile.yaml @@ -25,6 +25,7 @@ tasks: desc: Run tests for all packages cmds: - go test ./... -count=1 -timeout=30m {{.CLI_ARGS}} + release: desc: Create and push a new tag following semver vars: From 4b5a0713cdc83f751f17997967e069ffb44303f9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 1 Sep 2026 04:49:45 +0000 Subject: [PATCH 098/156] chore(deps): bump the all group with 9 updates Bumps the all group with 9 updates: | Package | From | To | | --- | --- | --- | | [cloud.google.com/go/auth](https://github.com/googleapis/google-cloud-go) | `0.23.1` | `0.23.2` | | [github.com/anthropics/anthropic-sdk-go](https://github.com/anthropics/anthropic-sdk-go) | `1.63.1` | `1.68.0` | | [github.com/aws/aws-sdk-go-v2](https://github.com/aws/aws-sdk-go-v2) | `1.43.6` | `1.45.1` | | [github.com/aws/aws-sdk-go-v2/config](https://github.com/aws/aws-sdk-go-v2) | `1.32.37` | `1.33.1` | | [github.com/aws/smithy-go](https://github.com/aws/smithy-go) | `1.27.8` | `1.28.1` | | [github.com/kaptinlin/jsonschema](https://github.com/kaptinlin/jsonschema) | `0.9.8` | `0.9.9` | | [github.com/openai/openai-go/v3](https://github.com/openai/openai-go) | `3.50.0` | `3.54.0` | | [github.com/stretchr/testify](https://github.com/stretchr/testify) | `1.12.0` | `1.12.1` | | [google.golang.org/genai](https://github.com/googleapis/go-genai) | `1.68.0` | `1.70.0` | Updates `cloud.google.com/go/auth` from 0.23.1 to 0.23.2 - [Release notes](https://github.com/googleapis/google-cloud-go/releases) - [Changelog](https://github.com/googleapis/google-cloud-go/blob/main/CHANGES.md) - [Commits](https://github.com/googleapis/google-cloud-go/compare/auth/v0.23.1...auth/v0.23.2) Updates `github.com/anthropics/anthropic-sdk-go` from 1.63.1 to 1.68.0 - [Release notes](https://github.com/anthropics/anthropic-sdk-go/releases) - [Changelog](https://github.com/anthropics/anthropic-sdk-go/blob/main/CHANGELOG.md) - [Commits](https://github.com/anthropics/anthropic-sdk-go/compare/v1.63.1...v1.68.0) Updates `github.com/aws/aws-sdk-go-v2` from 1.43.6 to 1.45.1 - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/v1.43.6...v1.45.1) Updates `github.com/aws/aws-sdk-go-v2/config` from 1.32.37 to 1.33.1 - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/config/v1.32.37...config/v1.33.1) Updates `github.com/aws/smithy-go` from 1.27.8 to 1.28.1 - [Release notes](https://github.com/aws/smithy-go/releases) - [Changelog](https://github.com/aws/smithy-go/blob/main/CHANGELOG.md) - [Commits](https://github.com/aws/smithy-go/compare/v1.27.8...v1.28.1) Updates `github.com/kaptinlin/jsonschema` from 0.9.8 to 0.9.9 - [Release notes](https://github.com/kaptinlin/jsonschema/releases) - [Commits](https://github.com/kaptinlin/jsonschema/compare/v0.9.8...v0.9.9) Updates `github.com/openai/openai-go/v3` from 3.50.0 to 3.54.0 - [Release notes](https://github.com/openai/openai-go/releases) - [Changelog](https://github.com/openai/openai-go/blob/main/CHANGELOG.md) - [Commits](https://github.com/openai/openai-go/compare/v3.50.0...v3.54.0) Updates `github.com/stretchr/testify` from 1.12.0 to 1.12.1 - [Release notes](https://github.com/stretchr/testify/releases) - [Commits](https://github.com/stretchr/testify/compare/v1.12.0...v1.12.1) Updates `google.golang.org/genai` from 1.68.0 to 1.70.0 - [Release notes](https://github.com/googleapis/go-genai/releases) - [Changelog](https://github.com/googleapis/go-genai/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/go-genai/compare/v1.68.0...v1.70.0) --- updated-dependencies: - dependency-name: cloud.google.com/go/auth dependency-version: 0.23.2 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all - dependency-name: github.com/anthropics/anthropic-sdk-go dependency-version: 1.68.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: all - dependency-name: github.com/aws/aws-sdk-go-v2 dependency-version: 1.45.1 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: all - dependency-name: github.com/aws/aws-sdk-go-v2/config dependency-version: 1.33.1 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: all - dependency-name: github.com/aws/smithy-go dependency-version: 1.28.1 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: all - dependency-name: github.com/kaptinlin/jsonschema dependency-version: 0.9.9 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all - dependency-name: github.com/openai/openai-go/v3 dependency-version: 3.54.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: all - dependency-name: github.com/stretchr/testify dependency-version: 1.12.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all - dependency-name: google.golang.org/genai dependency-version: 1.70.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: all ... Signed-off-by: dependabot[bot] --- go.mod | 47 ++++++++++++++-------------- go.sum | 99 ++++++++++++++++++++++++++-------------------------------- 2 files changed, 67 insertions(+), 79 deletions(-) diff --git a/go.mod b/go.mod index 13cd7f3a4..03b6e3282 100644 --- a/go.mod +++ b/go.mod @@ -1,27 +1,27 @@ module charm.land/fantasy -go 1.26.6 +go 1.27 require ( charm.land/x/vcr v0.1.1 - cloud.google.com/go/auth v0.23.1 - github.com/anthropics/anthropic-sdk-go v1.63.1 + cloud.google.com/go/auth v0.23.2 + github.com/anthropics/anthropic-sdk-go v1.68.0 github.com/ardanlabs/kronk v1.31.5 - github.com/aws/aws-sdk-go-v2 v1.43.6 - github.com/aws/aws-sdk-go-v2/config v1.32.37 - github.com/aws/smithy-go v1.27.8 + github.com/aws/aws-sdk-go-v2 v1.45.1 + github.com/aws/aws-sdk-go-v2/config v1.33.1 + github.com/aws/smithy-go v1.28.1 github.com/charmbracelet/x/exp/slice v0.0.0-20250904123553-b4e2667e5ad5 github.com/charmbracelet/x/exp/strings v0.1.0 github.com/charmbracelet/x/json v0.2.0 github.com/go-viper/mapstructure/v2 v2.5.0 github.com/google/uuid v1.6.0 github.com/joho/godotenv v1.5.1 - github.com/kaptinlin/jsonschema v0.9.8 - github.com/openai/openai-go/v3 v3.50.0 - github.com/stretchr/testify v1.12.0 + github.com/kaptinlin/jsonschema v0.9.9 + github.com/openai/openai-go/v3 v3.54.0 + github.com/stretchr/testify v1.12.1 golang.org/x/net v0.58.0 golang.org/x/oauth2 v0.36.0 - google.golang.org/genai v1.68.0 + google.golang.org/genai v1.70.0 ) require ( @@ -32,27 +32,27 @@ require ( cloud.google.com/go/iam v1.13.0 // indirect cloud.google.com/go/monitoring v1.30.0 // indirect cloud.google.com/go/storage v1.64.0 // indirect - github.com/Azure/azure-sdk-for-go/sdk/azcore v1.22.0 // indirect + github.com/Azure/azure-sdk-for-go/sdk/azcore v1.23.0 // indirect github.com/Azure/azure-sdk-for-go/sdk/internal v1.12.0 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.35.0 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.59.0 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.59.0 // indirect github.com/ardanlabs/jinja v1.6.0 // indirect github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.18 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.19.36 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.37 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.37 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.37 // indirect - github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.38 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.17 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.20.1 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.19.1 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.5.1 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.8.1 // indirect + github.com/aws/aws-sdk-go-v2/internal/v4a v1.5.1 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.19 // indirect github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.30 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.37 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.14.1 // indirect github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.38 // indirect github.com/aws/aws-sdk-go-v2/service/s3 v1.107.2 // indirect - github.com/aws/aws-sdk-go-v2/service/signin v1.5.6 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.33.6 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.38.6 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.45.6 // indirect + github.com/aws/aws-sdk-go-v2/service/signin v1.7.1 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.35.1 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.40.1 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.47.1 // indirect github.com/bahlo/generic-list-go v0.2.0 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d // indirect @@ -65,7 +65,6 @@ require ( github.com/envoyproxy/protoc-gen-validate v1.3.3 // indirect github.com/felixge/httpsnoop v1.1.0 // indirect github.com/go-jose/go-jose/v4 v4.1.4 // indirect - github.com/go-json-experiment/json v0.0.0-20260623181947-01eb4420fa68 // indirect github.com/go-logr/logr v1.4.4 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/goccy/go-yaml v1.19.2 // indirect @@ -112,6 +111,7 @@ require ( go.opentelemetry.io/otel/trace v1.45.0 // indirect go.opentelemetry.io/proto/otlp v1.11.0 // indirect go.yaml.in/yaml/v2 v2.4.4 // indirect + go.yaml.in/yaml/v3 v3.0.5 // indirect go.yaml.in/yaml/v4 v4.0.0-rc.3 // indirect golang.org/x/crypto v0.55.0 // indirect golang.org/x/image v0.45.0 // indirect @@ -126,5 +126,4 @@ require ( google.golang.org/grpc v1.83.0 // indirect google.golang.org/protobuf v1.36.12 // indirect gopkg.in/dnaeon/go-vcr.v4 v4.0.6-0.20251110073552-01de4eb40290 // indirect - gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index 4dafa7a59..fed2d055d 100644 --- a/go.sum +++ b/go.sum @@ -4,8 +4,8 @@ charm.land/x/vcr v0.1.1 h1:PXCFMUG0rPtyk35rhfzYCJEduOzWXCIbrXTFq4OF/9Q= charm.land/x/vcr v0.1.1/go.mod h1:eByq2gqzWvcct/8XE2XO5KznoWEBiXH56+y2gphbltM= cloud.google.com/go v0.123.0 h1:2NAUJwPR47q+E35uaJeYoNhuNEM9kM8SjgRgdeOJUSE= cloud.google.com/go v0.123.0/go.mod h1:xBoMV08QcqUGuPW65Qfm1o9Y4zKZBpGS+7bImXLTAZU= -cloud.google.com/go/auth v0.23.1 h1:1tPpBPG02lQHmoiAvs9egyCASqXP0xgobptjZzov/Jg= -cloud.google.com/go/auth v0.23.1/go.mod h1:4DhBRcqvtljQN3dJ57qtqbib5ZGCYE5f2crfiiC2EM0= +cloud.google.com/go/auth v0.23.2 h1:pxSCpfiji41hpzpPdMCftEUCezpgpqmmDdYiAjCKXxo= +cloud.google.com/go/auth v0.23.2/go.mod h1:4DhBRcqvtljQN3dJ57qtqbib5ZGCYE5f2crfiiC2EM0= cloud.google.com/go/auth/oauth2adapt v0.2.8 h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIiLpZnkHRbnc= cloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c= cloud.google.com/go/compute/metadata v0.9.0 h1:pDUj4QMoPejqq20dK0Pg2N4yG9zIkYGdBtwLoEkH9Zs= @@ -22,8 +22,8 @@ cloud.google.com/go/storage v1.64.0 h1:KLpxI/oX9LxeRsNqn877d2WyeT3ryiEwnGt8pwcSP cloud.google.com/go/storage v1.64.0/go.mod h1:lWyAtwvDZHdL3k68WVKbESP6bmWaV23ZJJ/JEVw/ZaQ= cloud.google.com/go/trace v1.16.0 h1:GmQovzFc5F0CNfl0VLgL64aoTtu7xsM0YajW2GlG9+E= cloud.google.com/go/trace v1.16.0/go.mod h1:r+bdAn16dKLSV1G2D5v3e58IlQlizfxWrUfjx7kM7X0= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.22.0 h1:aokoqcHvaGjiM3VpjKDfMMnF/8epJ+Q1HLJ7CudztqE= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.22.0/go.mod h1:/WYEx9pcM9Y+Dd/APJaNlSvVSvzl54rrMdZT5+Oi2LM= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.23.0 h1:4gRPBpN1f6xt88yi4WR26m7XaD9OlWtVT6bWPdGUIok= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.23.0/go.mod h1:G7QVLxw1j1JVyrO1MA95S8m8HStaaleDZYTcfGgjB2o= github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.14.0 h1:CU4+EJeJi3TKYWEcYuSdWsjzw0nVsK/H0MSQOiPcymU= github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.14.0/go.mod h1:q0+UTSRvShwUCrR/s5HtyInYphN7Wvxb7snFM3u+SLA= github.com/Azure/azure-sdk-for-go/sdk/internal v1.12.0 h1:fhqpLE3UEXi9lPaBRpQ6XuRW0nU7hgg4zlmZZa+a9q4= @@ -38,48 +38,48 @@ github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0 github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.59.0/go.mod h1:V9g30lTKzfUsEW+gpWssck6u9IhARajmipodImLLcwI= github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.59.0 h1:18FRm6ZcN/x9+ZmhMr96hLcTtlLn2/gHPuDLVeg7XcY= github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.59.0/go.mod h1:YqwkQPrWSC7+byyc1VlKbWLBF5JsW5IoL6xUkemYSXk= -github.com/anthropics/anthropic-sdk-go v1.63.1 h1:M9dIoZzUWB453ulVpBkQp3FX0769udzrTscDrsJk1w4= -github.com/anthropics/anthropic-sdk-go v1.63.1/go.mod h1:3EfIfmFqxH6rbiLcIP4tPFyXL/IHakx2wDG4OU+TIEI= +github.com/anthropics/anthropic-sdk-go v1.68.0 h1:FikM/c545Fw+6lp0iQ48hnfn1wK4SxBjkYoGrGMwMhY= +github.com/anthropics/anthropic-sdk-go v1.68.0/go.mod h1:3EfIfmFqxH6rbiLcIP4tPFyXL/IHakx2wDG4OU+TIEI= github.com/ardanlabs/jinja v1.6.0 h1:CbqS/dxYM9qrmlBed1GsN64/tRY6SoWQWc5Sc+aw3iI= github.com/ardanlabs/jinja v1.6.0/go.mod h1:aXXzlJfjA+T3XNKA/YT5ZtDq2VJxt5a5siZ8cl9B35Q= github.com/ardanlabs/kronk v1.31.5 h1:pU335FU7KOT2Mv4j4e2S+QaAVYumTRYYKgISkzrQT7Q= github.com/ardanlabs/kronk v1.31.5/go.mod h1:ub5hRgH9xtMTTQOtBTPwzP67fx0dDwZGLwrWDpp+fuQ= -github.com/aws/aws-sdk-go-v2 v1.43.6 h1:RrmFcqCBxkJuf7g1axVo5krB4jM/AO8r5e5oujrgdoQ= -github.com/aws/aws-sdk-go-v2 v1.43.6/go.mod h1:tXpPM+v0D1lndmga+HqqLDIzUFJlEeR21aspVklHF00= +github.com/aws/aws-sdk-go-v2 v1.45.1 h1:iIoG3NaLhV6UZpPXyPXlDj2I9oS8tV/nMcMnITCC6Ks= +github.com/aws/aws-sdk-go-v2 v1.45.1/go.mod h1:bttEH6JqnUL8LepvDVfdrds/fZ5bCIxzpe3abyUrhDU= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.18 h1:LAfOuhAH331fmOjTQpAaOlH+Ftn7RzSDJ2VFwjdMMy4= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.18/go.mod h1:4e5xhuXHx1e4U9EthvbPP1r/DIMp5c2823OL8karzcM= -github.com/aws/aws-sdk-go-v2/config v1.32.37 h1:Ljl7LOJB6ym0liuEl0+TZ3d7f5I8MEZN1Cj9PINlj/g= -github.com/aws/aws-sdk-go-v2/config v1.32.37/go.mod h1:WJ7pe7ZPpmG8Q5kKS53zeypIV4FBGACxmte8Uc6SgUc= -github.com/aws/aws-sdk-go-v2/credentials v1.19.36 h1:84s5xMme6ENYEdKG8rsbSFFg/8+lbHBeM9QYSO0gnDk= -github.com/aws/aws-sdk-go-v2/credentials v1.19.36/go.mod h1:c46BLdagDLIswjgt+GeQOslXgeS0E6wCacs5yZbxPGk= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.37 h1:b5tb+CZItBkydC7r3hTNdSO3pszG1R2EtnA+7TePQPk= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.37/go.mod h1:ZQ+6SU9X0oz6+7MUCSswv9Mjci4eaqZr21HI2RVy/yA= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.37 h1:lznzIOvvbqjfe8UAaciCRJgBgJsxuTROKlhZuXQWfv8= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.37/go.mod h1:otfkzyfQeMMLZAqX59GSXTL3o22BR/l6HFaRzzbWSqA= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.37 h1:zCEORWo0eU0gDjG+IyApE/2B+ZGG1m+GU7B263XV8ds= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.37/go.mod h1:i6c0PEl3TNOWxRbQ++KQcVenPWS/GoQeiklKhNuqzJ8= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.38 h1:A3UAuCmx7LyUcrixBTzKJYYIUZ2yTvn6ZhT8PB+7APk= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.38/go.mod h1:1PDUYG9Z+JrbbsobsAZHjWOm9QBT/djiK3QbykTL5Z4= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.17 h1:OvYZOB3qA6zvfdRFiRFRzVSiElMYrz3GdntkXZxlp1o= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.17/go.mod h1:JgR/2Ew50ACfIWau1oeMRX59tMtC0kM+PYQGEaT04cY= +github.com/aws/aws-sdk-go-v2/config v1.33.1 h1:bq9jze1hQ5YTCLoVxNnbp0T7rglrlOE7N9YsHqjGkEw= +github.com/aws/aws-sdk-go-v2/config v1.33.1/go.mod h1:2A3HQwG4zaL5Tm80rc6RZj8LmWWv4WYT5v8raSz/L7A= +github.com/aws/aws-sdk-go-v2/credentials v1.20.1 h1:Z8GRNEx0u9sDkZOq4PUnN8mjGwbUQGRzMSXpvt3d8xQ= +github.com/aws/aws-sdk-go-v2/credentials v1.20.1/go.mod h1:uBIK00kFo95dnemqfFMTWx0X8YRqsh6ecIoCjjOkZqM= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.19.1 h1:YIEBqcqRnpi4Pfv0YHImtgi6czGCwKHANC7SwmUAVD0= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.19.1/go.mod h1:imEf0oufgAo8KAkCHhrOdqGEC0YWx1PPBQH82shSxGw= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.5.1 h1:pc138gM1CW+XPc60rEwUlwwuwWFQK16CI1T7v1F9Oec= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.5.1/go.mod h1:1+koxpPIbfBdfzP6vojm5/zTpTQ/micYwlxIiNB3TxI= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.8.1 h1:K0JsbZQj+1h208Ro1zHeA4l7bMp0NvRffHQ91q8Ol1s= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.8.1/go.mod h1:W3/vL6EtCIatICGy9ab29QhMuae+cOKPWcMxv02CO+Q= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.5.1 h1:yhw5KD1phVyP9vijxOUzDfEtJx+bt+L63k+VfuiYFAA= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.5.1/go.mod h1:ZW2e0d7DYlRxlS9hEiMXE47gTdX5KRN4byUiNbUpG+Q= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.19 h1:bAdDl/HkGCcGPoe25ToSHEw23VIxt6CT5fLcg111BKg= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.19/go.mod h1:KaUzbLxv4CeSxh6ZCl9B4m7CuFenS8kUEaDs+f/DQr4= github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.30 h1:5437eMoOwqqQpZn2XJy74mlDCuPYL81texMT3mXqgtU= github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.30/go.mod h1:xfu2m3dOpvW8lj98wQYa8V9ku/Rta59hsbireGzhh3A= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.37 h1:a3D4AjrOrTrP8+d9ILBthqrElf0z1JNol09Xvnwcys8= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.37/go.mod h1:ky0gTu+ukvUTuUKFIpp6Wid4oninrkCyvbFkVs0kpHM= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.14.1 h1:RmmWQPREQdk9U+PfqeHW3MqZaBaNK7TpV9W3RY+b+7g= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.14.1/go.mod h1:0A3W4F+68ZnNk5XcNL/e9HFMwnP8RlEicFfy6eOEDyw= github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.38 h1:gX8B8y3Ho30B1LPxefDKMi/HZqWEb47U9ogs3DtSG0M= github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.38/go.mod h1:l5WblZlcmGPe4/O7JY2HO25Z+xqTBvyfTyFbRMf8gYw= github.com/aws/aws-sdk-go-v2/service/s3 v1.107.2 h1:GNU0/xtPEXMKilJZ/a8BedeuQnvu+Usi6qVm9EFfncc= github.com/aws/aws-sdk-go-v2/service/s3 v1.107.2/go.mod h1:4jYWUecEsQtE73jPl7p3jrbYXH5ffcR4gegyCygagfg= -github.com/aws/aws-sdk-go-v2/service/signin v1.5.6 h1:i68sFvXidKlkiSvI7d7Ilc1/UvW4CtBOaivH7jhG4fs= -github.com/aws/aws-sdk-go-v2/service/signin v1.5.6/go.mod h1:/h7Obr9WTtzbjTHGASRQwLN7Bupw+TC3x8x7fyx39hE= -github.com/aws/aws-sdk-go-v2/service/sso v1.33.6 h1:tpfGChmjUmv3W9WlRvy+stwKDTbFFdq8Zk9DbFPrfMU= -github.com/aws/aws-sdk-go-v2/service/sso v1.33.6/go.mod h1:CSjiDzmG/lsKkTOYjbkM+duLmRlW+LOxD64Na44ijnI= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.38.6 h1:49BBtY68A+KJCQ3a2F3eUe6ROsKucxUdfHKoqorc0wI= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.38.6/go.mod h1:ptG2hbs7QltE1GcQY0MpS4bfrc51KCnBXUr7OT1EEfE= -github.com/aws/aws-sdk-go-v2/service/sts v1.45.6 h1:JvExZWabChDM0qJAirQYGfOYo0ndT3edXj+fqSPNjkE= -github.com/aws/aws-sdk-go-v2/service/sts v1.45.6/go.mod h1:XZcaQkV2cItp6yEkrwljyaPOf22RuX7T43jxap/FOmM= -github.com/aws/smithy-go v1.27.8 h1:FR0dxZfIlV7Z8eh2iHfIofdunw382XsDV3Mxt9nUvRY= -github.com/aws/smithy-go v1.27.8/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc= +github.com/aws/aws-sdk-go-v2/service/signin v1.7.1 h1:mdMtSVKdQ3+mzBh+l0ogrFYZVQUCg6pJZOirA2ARsYE= +github.com/aws/aws-sdk-go-v2/service/signin v1.7.1/go.mod h1:9IqUlsJDbUPcg6cgx3WEzXdjrbWzLDQrak0aaSqlTcI= +github.com/aws/aws-sdk-go-v2/service/sso v1.35.1 h1:B6WFn91tobD6gG4724ONHaqrpKsoETGnv98LHe/yIGM= +github.com/aws/aws-sdk-go-v2/service/sso v1.35.1/go.mod h1:tWuiVBUtPBr8/rgRiYS8Uf85sHcAN+G7XS3D3CEoUh8= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.40.1 h1:6yeYCWFvgbI2TI3K6jr9LtBNhXgJ7g4xqD+DEiaDDmM= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.40.1/go.mod h1:naFe83jSMuYkH+QjQPX8n1MLhBkeCFM5Lsnh5m5wz3c= +github.com/aws/aws-sdk-go-v2/service/sts v1.47.1 h1:Sv2xPnRHlThSUtVujYuUBPI/Il8si6UPHXL8DMiB/F0= +github.com/aws/aws-sdk-go-v2/service/sts v1.47.1/go.mod h1:mKo/CzaCz8qytGW70NG4vIIGAx1HXTlb5lHNkC5k3lk= +github.com/aws/smithy-go v1.28.1 h1:R/nXH00c8qcfCzQVELtRw+eLQWtzv+VAIEFJ1/xxXlQ= +github.com/aws/smithy-go v1.28.1/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc= github.com/bahlo/generic-list-go v0.2.0 h1:5sz/EEAK+ls5wF+NeqDpk5+iNdMDXrh3z3nPnH1Wvgk= github.com/bahlo/generic-list-go v0.2.0/go.mod h1:2KvAjgMlE5NNynlg/5iLrrCCZ2+5xWbdbCW3pNTGyYg= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= @@ -116,8 +116,6 @@ github.com/felixge/httpsnoop v1.1.0 h1:3YtUj32ZZkqZtt3sZZsClsymw/QDuVfpNhoA31zeO github.com/felixge/httpsnoop v1.1.0/go.mod h1:Zqxgdd+1Rkcz8euOqdr7lqgCRJztwr5hp9vDSi5UZCE= github.com/go-jose/go-jose/v4 v4.1.4 h1:moDMcTHmvE6Groj34emNPLs/qtYXRVcd6S7NHbHz3kA= github.com/go-jose/go-jose/v4 v4.1.4/go.mod h1:x4oUasVrzR7071A4TnHLGSPpNOm2a21K9Kf04k1rs08= -github.com/go-json-experiment/json v0.0.0-20260623181947-01eb4420fa68 h1:KZaTBSyshWX3MP5jukJcNSuXDQTO+rNpt0J564dX/eg= -github.com/go-json-experiment/json v0.0.0-20260623181947-01eb4420fa68/go.mod h1:tphK2c80bpPhMOI4v6bIc2xWywPfbqi1Z06+RcrMkDg= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.4.4 h1:tG4xh9yMsRCAiodLVTxyrkzSZ9+o0L1Kg/+cPVcbP/8= github.com/go-logr/logr v1.4.4/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= @@ -165,22 +163,18 @@ github.com/jupiterrider/ffi v0.7.0 h1:RKsl6Ascal+3kyAqR5Qcbp83LceQMLc1VZbPfHWoNz github.com/jupiterrider/ffi v0.7.0/go.mod h1:9dauhpOfNqrqk28fxuu0kkdeFtT9Qr4vbfigiuIXN7c= github.com/kaptinlin/jsonpointer v0.4.28 h1:PyxOfdml9PGpxQz+JnNLGsyzQ+Rnm+OVNTGcgbVLqgg= github.com/kaptinlin/jsonpointer v0.4.28/go.mod h1:JzeIDw1+60bryzOFea9P3zjKg8pfJHd+UIA/zfZ70x8= -github.com/kaptinlin/jsonschema v0.9.8 h1:srpfx2MAm4ecYz0zJLbz6fiW+UXiuv+vGhUqZUIWmrg= -github.com/kaptinlin/jsonschema v0.9.8/go.mod h1:TP7RFmFBNExjBE0b3fsM6RpA/9PeOzfg2g4weXqOrDg= +github.com/kaptinlin/jsonschema v0.9.9 h1:1N00sHfrZcBwcHgI646PuIf1VaODHPsqRnNi0OY2ERw= +github.com/kaptinlin/jsonschema v0.9.9/go.mod h1:egi7QzDHFN/avPEqQgyGgXCcmC0cl/KxS2ePcHHRcOs= github.com/klauspost/compress v1.19.2 h1:hMRETovs/pu/dVWN7zIT1PGG8t509MwT6bO7XSi26R8= github.com/klauspost/compress v1.19.2/go.mod h1:cwPg85FWrGar70rWktvGQj8/hthj3wpl0PGDogxkrSQ= -github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= -github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= -github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= -github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/openai/openai-go/v3 v3.50.0 h1:CXn+C8a10oQiI5CMyMbCiykhITVhVxhdHX8j3CfLa2U= -github.com/openai/openai-go/v3 v3.50.0/go.mod h1:Ogjo0gDct+Jm7yCqaCjLGQGygeV8xNfNHV1/yKvCji0= +github.com/openai/openai-go/v3 v3.54.0 h1:qeNvIpFB/wzX7pI8USN1eruvzCS+XqOZ8mx73lGF6Lg= +github.com/openai/openai-go/v3 v3.54.0/go.mod h1:ufI1+K+t0ijRB3gk8eztiw1crcDpsBuxRQL4sbLIrts= github.com/pb33f/ordered-map/v2 v2.3.1 h1:5319HDO0aw4DA4gzi+zv4FXU9UlSs3xGZ40wcP1nBjY= github.com/pb33f/ordered-map/v2 v2.3.1/go.mod h1:qxFQgd0PkVUtOMCkTapqotNgzRhMPL7VvaHKbd1HnmQ= github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ= @@ -195,14 +189,12 @@ github.com/prometheus/common v0.70.1 h1:1HvjP4D5oL3t8RsPlwxA9onvvStjtIHYE5XuuwOi github.com/prometheus/common v0.70.1/go.mod h1:VdFUQDMZK3VLkurFUVhia6uys/0suUp86TJz5qbJRhc= github.com/prometheus/procfs v0.21.1 h1:GljZCt+zSTS+NZq88cyQ1LjZ+RCHp3uVuabBWA5+OJI= github.com/prometheus/procfs v0.21.1/go.mod h1:aB55Cww9pdSJVHk0hUf0inxWyyjPogFIjmHKYgMKmtY= -github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= -github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= github.com/spiffe/go-spiffe/v2 v2.8.1 h1:eXZMLsu+3MLEPJyGJkolqtVrteZfQdUpOWj6LTiDl/E= github.com/spiffe/go-spiffe/v2 v2.8.1/go.mod h1:47Q0Q9/AqGha8QLHp+kxpH4Wca7X7EnOtlIJy3mxZ3U= github.com/standard-webhooks/standard-webhooks/libraries v0.0.1 h1:uOfcYT+3QungH6tIGSVCR/Y3KJmgJiHcojJbMTPDZAI= github.com/standard-webhooks/standard-webhooks/libraries v0.0.1/go.mod h1:L1MQhA6x4dn9r007T033lsaZMv9EmBAdXyU/+EF40fo= -github.com/stretchr/testify v1.12.0 h1:K6Mr6jO9JICuend/5xzTM03ydSV3vdNRYAdPSukj8uI= -github.com/stretchr/testify v1.12.0/go.mod h1:bOYBZb5qJ00vPzWfIqBUZPaxK8jWiXc6d3ErP4Ca9Gw= +github.com/stretchr/testify v1.12.1 h1:EuwCh5fleGS7H32xRwO3wRGT7DxrDhLAT6FF8MpWDWE= +github.com/stretchr/testify v1.12.1/go.mod h1:MDEgiDPPsNp5cuIrHPPCyornHKgEVbtFUmoNlxoYthg= github.com/tidwall/gjson v1.14.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/gjson v1.19.0 h1:xwxm7n691Uf3u5OFjzngavjGTh55KX5q/9w9xHW88JU= github.com/tidwall/gjson v1.19.0/go.mod h1:V37/opeE/JbLUOfH0QTXiNez2l0RUjYUhpT4szFQAfc= @@ -247,6 +239,8 @@ go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.yaml.in/yaml/v2 v2.4.4 h1:tuyd0P+2Ont/d6e2rl3be67goVK4R6deVxCUX5vyPaQ= go.yaml.in/yaml/v2 v2.4.4/go.mod h1:gMZqIpDtDqOfM0uNfy0SkpRhvUryYH0Z6wdMYcacYXQ= +go.yaml.in/yaml/v3 v3.0.5 h1:N6y/pJk8buWs9NY5ERU2HSMfm+IuD/OtfdAnq6kESPw= +go.yaml.in/yaml/v3 v3.0.5/go.mod h1:HVTZu1O7/Vkt2N+BFy8Zza+lnLsABggaTM2ZpNIGuKg= go.yaml.in/yaml/v4 v4.0.0-rc.3 h1:3h1fjsh1CTAPjW7q/EMe+C8shx5d8ctzZTrLcs/j8Go= go.yaml.in/yaml/v4 v4.0.0-rc.3/go.mod h1:aZqd9kCMsGL7AuUv/m/PvWLdg5sjJsZ4oHDEnfPPfY0= golang.org/x/crypto v0.55.0 h1:+KWHjbgOaAQ66dh/YlkZKHlz9ZUlq61AFirAR9ntP8M= @@ -269,8 +263,8 @@ gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4= gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E= google.golang.org/api v0.293.0 h1:p9XIWOf63U4OgYx120ZwVU8+vl4XTPmWfgVPnmOAS9w= google.golang.org/api v0.293.0/go.mod h1:6n5tjEB1gzwniZTepZ0g5u+wM7Bof5GeULCx/zh8ZE0= -google.golang.org/genai v1.68.0 h1:gmALuBU6mRy46wupEt20wBR1dYAMY13t/jkTxpdzhzE= -google.golang.org/genai v1.68.0/go.mod h1:mDdPDFXo1Ats7f1WXVyZgWb/CkMzFWTWJruIMy7hGIU= +google.golang.org/genai v1.70.0 h1:V9oYOBvTDYbmeklOHjvxGeeLau71WiS2CWKrktQtDok= +google.golang.org/genai v1.70.0/go.mod h1:mDdPDFXo1Ats7f1WXVyZgWb/CkMzFWTWJruIMy7hGIU= google.golang.org/genproto v0.0.0-20260818201246-1b0934165a6f h1:mIpuZeRssq9TYLzKcruaLOCbOgJt8WDF1FSyEPZBw24= google.golang.org/genproto v0.0.0-20260818201246-1b0934165a6f/go.mod h1:UpDDw2l68z31m5UZN/Qi0Kow16ohhlJVlmqC3qRM5Q8= google.golang.org/genproto/googleapis/api v0.0.0-20260818201246-1b0934165a6f h1:zRL8hmUGXSGBJ2D+r85c0S3xhrg6BtfQ3V6KKbR/I9M= @@ -281,12 +275,7 @@ google.golang.org/grpc v1.83.0 h1:JeNZEKJFbQxArAMl+hiytHauacDNqJUllNfmIMmpqnQ= google.golang.org/grpc v1.83.0/go.mod h1:kDyl6SKsiHKt0uylY5gtn5cEjkrIOhQOGDgIc4JGwzQ= google.golang.org/protobuf v1.36.12 h1:pJOKDDOyeXErUroCihFAd5LQuwXBSpVnKGrj5o/fwxc= google.golang.org/protobuf v1.36.12/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/dnaeon/go-vcr.v4 v4.0.6-0.20251110073552-01de4eb40290 h1:g3ah7zaWmw41EtOgBNXpx8zk4HYuH3OMwB+qh1Dt834= gopkg.in/dnaeon/go-vcr.v4 v4.0.6-0.20251110073552-01de4eb40290/go.mod h1:sbq5oMEcM4PXngbcNbHhzfCP9OdZodLhrbRYoyg09HY= gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= -gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= From 111ec83d09367f221189ff56c5e4a5a5e9aec03d Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Tue, 1 Sep 2026 13:49:52 -0300 Subject: [PATCH 099/156] fix: adapt providers to openai-go v3.54.0 api changes The SDK bump (v3.50.0 -> v3.54.0) broke the build and Azure auth: - ResponseInputItemParamOfFunctionCallOutput dropped its callID parameter; set the new param.Opt CallID field directly instead. - The output_text.annotation.added event's Annotation field changed from `any` to a typed union struct, so read its fields directly instead of deserializing a map[string]any. - azure.WithAPIKey now requires azure.WithEndpoint, which forces the legacy deployments-style API and conflicts with our v1-preview /openai/v1 base URL. Set the Api-Key header (and delete Authorization) via plain header options instead, which matches the old SDK's exact wire behavior. Assisted-by: Crush:glm-5.3 --- providers/azure/azure.go | 4 ++-- providers/openai/responses_language_model.go | 24 ++++++++------------ providers/openai/tool_result_media_test.go | 4 ++-- 3 files changed, 13 insertions(+), 19 deletions(-) diff --git a/providers/azure/azure.go b/providers/azure/azure.go index 7435198dc..3d5604d0f 100644 --- a/providers/azure/azure.go +++ b/providers/azure/azure.go @@ -8,7 +8,6 @@ import ( "charm.land/fantasy" "charm.land/fantasy/providers/openai" - "github.com/openai/openai-go/v3/azure" "github.com/openai/openai-go/v3/option" ) @@ -52,7 +51,8 @@ func New(opts ...Option) (fantasy.Provider, error) { openai.WithName(Name), openai.WithBaseURL(o.baseURL), openai.WithSDKOptions( - azure.WithAPIKey(o.apiKey), + option.WithHeaderDel("Authorization"), + option.WithHeader("Api-Key", o.apiKey), ), )..., ) diff --git a/providers/openai/responses_language_model.go b/providers/openai/responses_language_model.go index 72ea3a18e..e02bb8579 100644 --- a/providers/openai/responses_language_model.go +++ b/providers/openai/responses_language_model.go @@ -665,7 +665,9 @@ func toResponsesPrompt(prompt fantasy.Prompt, systemMessageMode string, store bo continue } - input = append(input, responses.ResponseInputItemParamOfFunctionCallOutput(toolResultPart.ToolCallID, outputStr)) + functionCallOutput := responses.ResponseInputItemParamOfFunctionCallOutput(outputStr) + functionCallOutput.OfFunctionCallOutput.CallID = param.NewOpt(toolResultPart.ToolCallID) + input = append(input, functionCallOutput) if len(followupParts) > 0 { input = append(input, responses.ResponseInputItemParamOfMessage(followupParts, responses.EasyInputMessageRoleUser)) } @@ -1142,30 +1144,22 @@ func (o responsesLanguageModel) Stream(ctx context.Context, call fantasy.Call) ( case "response.output_text.annotation.added": added := event.AsResponseOutputTextAnnotationAdded() - // The Annotation field is typed as `any` in the SDK; - // it deserializes as map[string]any from JSON. - annotationMap, ok := added.Annotation.(map[string]any) - if !ok { - break - } - annotationType, _ := annotationMap["type"].(string) - switch annotationType { + annotation := added.Annotation + switch annotation.Type { case "url_citation": - url, _ := annotationMap["url"].(string) - title, _ := annotationMap["title"].(string) if !yield(fantasy.StreamPart{ Type: fantasy.StreamPartTypeSource, ID: uuid.NewString(), SourceType: fantasy.SourceTypeURL, - URL: url, - Title: title, + URL: annotation.URL, + Title: annotation.Title, }) { return } case "file_citation": title := "Document" - if fn, ok := annotationMap["filename"].(string); ok && fn != "" { - title = fn + if annotation.Filename != "" { + title = annotation.Filename } if !yield(fantasy.StreamPart{ Type: fantasy.StreamPartTypeSource, diff --git a/providers/openai/tool_result_media_test.go b/providers/openai/tool_result_media_test.go index cc7424cf0..7a182f92d 100644 --- a/providers/openai/tool_result_media_test.go +++ b/providers/openai/tool_result_media_test.go @@ -199,7 +199,7 @@ func TestToResponsesPrompt_MediaToolResult_ImagePNG(t *testing.T) { funcOut := input[1].OfFunctionCallOutput require.NotNil(t, funcOut) - require.Equal(t, "img-resp-1", funcOut.CallID) + require.Equal(t, "img-resp-1", funcOut.CallID.Value) require.Contains(t, funcOut.Output.OfString.Value, "image/png") userMsg := input[2].OfMessage @@ -241,7 +241,7 @@ func TestToResponsesPrompt_MediaToolResult_UnsupportedMediaType(t *testing.T) { // image message. require.Len(t, input, 2) require.NotNil(t, input[1].OfFunctionCallOutput) - require.Equal(t, "vid-resp-1", input[1].OfFunctionCallOutput.CallID) + require.Equal(t, "vid-resp-1", input[1].OfFunctionCallOutput.CallID.Value) require.Len(t, warnings, 1) require.Contains(t, warnings[0].Message, "video/mp4") } From cea4c7110f3f1645f3edfa4caca2ce8a87da3850 Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Tue, 1 Sep 2026 13:56:50 -0300 Subject: [PATCH 100/156] chore: go mod tidy --- go.mod | 2 -- go.sum | 10 ---------- 2 files changed, 12 deletions(-) diff --git a/go.mod b/go.mod index 03b6e3282..4132615b4 100644 --- a/go.mod +++ b/go.mod @@ -32,8 +32,6 @@ require ( cloud.google.com/go/iam v1.13.0 // indirect cloud.google.com/go/monitoring v1.30.0 // indirect cloud.google.com/go/storage v1.64.0 // indirect - github.com/Azure/azure-sdk-for-go/sdk/azcore v1.23.0 // indirect - github.com/Azure/azure-sdk-for-go/sdk/internal v1.12.0 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.35.0 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.59.0 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.59.0 // indirect diff --git a/go.sum b/go.sum index fed2d055d..04b2cc62d 100644 --- a/go.sum +++ b/go.sum @@ -24,12 +24,8 @@ cloud.google.com/go/trace v1.16.0 h1:GmQovzFc5F0CNfl0VLgL64aoTtu7xsM0YajW2GlG9+E cloud.google.com/go/trace v1.16.0/go.mod h1:r+bdAn16dKLSV1G2D5v3e58IlQlizfxWrUfjx7kM7X0= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.23.0 h1:4gRPBpN1f6xt88yi4WR26m7XaD9OlWtVT6bWPdGUIok= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.23.0/go.mod h1:G7QVLxw1j1JVyrO1MA95S8m8HStaaleDZYTcfGgjB2o= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.14.0 h1:CU4+EJeJi3TKYWEcYuSdWsjzw0nVsK/H0MSQOiPcymU= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.14.0/go.mod h1:q0+UTSRvShwUCrR/s5HtyInYphN7Wvxb7snFM3u+SLA= github.com/Azure/azure-sdk-for-go/sdk/internal v1.12.0 h1:fhqpLE3UEXi9lPaBRpQ6XuRW0nU7hgg4zlmZZa+a9q4= github.com/Azure/azure-sdk-for-go/sdk/internal v1.12.0/go.mod h1:7dCRMLwisfRH3dBupKeNCioWYUZ4SS09Z14H+7i8ZoY= -github.com/AzureAD/microsoft-authentication-library-for-go v1.7.2 h1:RHK7bS+HQMslb1sZpAokUt+zTVmue0hKSs2C791hhzU= -github.com/AzureAD/microsoft-authentication-library-for-go v1.7.2/go.mod h1:HKpQxkWaGLJ+D/5H8QRpyQXA1eKjxkFlOMwck5+33Jk= github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.35.0 h1:bN1gA3of5bXtbnLsRPrwfmbbe7A5UWFlcTHseujLnpc= github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.35.0/go.mod h1:Yj5vHEz/aAepZGliRJsA6uvHAVAQyEwajq9ORCHPxzM= github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.59.0 h1:c/Ivw7FuawPLfrr+zB0LZKeCchO2cAHQpF2qZ6OV7rQ= @@ -125,8 +121,6 @@ github.com/go-viper/mapstructure/v2 v2.5.0 h1:vM5IJoUAy3d7zRSVtIwQgBj7BiWtMPfmPE github.com/go-viper/mapstructure/v2 v2.5.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/goccy/go-yaml v1.19.2 h1:PmFC1S6h8ljIz6gMRBopkjP1TVT7xuwrButHID66PoM= github.com/goccy/go-yaml v1.19.2/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA= -github.com/golang-jwt/jwt/v5 v5.3.1 h1:kYf81DTWFe7t+1VvL7eS+jKFVWaUnK9cB1qbwn63YCY= -github.com/golang-jwt/jwt/v5 v5.3.1/go.mod h1:fxCRLWMO43lRc8nhHWY6LGqRcf+1gQWArsqaEUEa5bE= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= @@ -167,8 +161,6 @@ github.com/kaptinlin/jsonschema v0.9.9 h1:1N00sHfrZcBwcHgI646PuIf1VaODHPsqRnNi0O github.com/kaptinlin/jsonschema v0.9.9/go.mod h1:egi7QzDHFN/avPEqQgyGgXCcmC0cl/KxS2ePcHHRcOs= github.com/klauspost/compress v1.19.2 h1:hMRETovs/pu/dVWN7zIT1PGG8t509MwT6bO7XSi26R8= github.com/klauspost/compress v1.19.2/go.mod h1:cwPg85FWrGar70rWktvGQj8/hthj3wpl0PGDogxkrSQ= -github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= -github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= @@ -177,8 +169,6 @@ github.com/openai/openai-go/v3 v3.54.0 h1:qeNvIpFB/wzX7pI8USN1eruvzCS+XqOZ8mx73l github.com/openai/openai-go/v3 v3.54.0/go.mod h1:ufI1+K+t0ijRB3gk8eztiw1crcDpsBuxRQL4sbLIrts= github.com/pb33f/ordered-map/v2 v2.3.1 h1:5319HDO0aw4DA4gzi+zv4FXU9UlSs3xGZ40wcP1nBjY= github.com/pb33f/ordered-map/v2 v2.3.1/go.mod h1:qxFQgd0PkVUtOMCkTapqotNgzRhMPL7VvaHKbd1HnmQ= -github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ= -github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU= github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= github.com/prometheus/client_golang v1.24.1 h1:JnJkREXzWxUdCuPFpIWZiPispT9xVV59uiuyR2bPlnU= From 259c93674a6c0e081a833fde2a7f4ef8838e8e42 Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Tue, 1 Sep 2026 14:06:08 -0300 Subject: [PATCH 101/156] ci: update golangci-lint version --- .github/workflows/lint.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index ed3a1af7b..00ba969d9 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -9,6 +9,6 @@ jobs: uses: charmbracelet/meta/.github/workflows/lint.yml@main with: golangci_path: .golangci.yml - golangci_version: v2.9 + golangci_version: v2.13.2 timeout: 10m os: '["ubuntu-latest"]' From 9c89650e9e03cd54eaa5a8a04b45e35bc72232d3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 1 Sep 2026 14:19:06 -0300 Subject: [PATCH 102/156] chore(deps): bump github.com/ardanlabs/kronk (#351) Bumps the kronk group with 1 update in the / directory: [github.com/ardanlabs/kronk](https://github.com/ardanlabs/kronk). Updates `github.com/ardanlabs/kronk` from 1.31.5 to 1.32.3 - [Release notes](https://github.com/ardanlabs/kronk/releases) - [Commits](https://github.com/ardanlabs/kronk/compare/v1.31.5...v1.32.3) --- updated-dependencies: - dependency-name: github.com/ardanlabs/kronk dependency-version: 1.32.3 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: kronk ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 56 ++++++++++++++-------------- go.sum | 116 ++++++++++++++++++++++++++++----------------------------- 2 files changed, 86 insertions(+), 86 deletions(-) diff --git a/go.mod b/go.mod index 4132615b4..3d80bdfef 100644 --- a/go.mod +++ b/go.mod @@ -1,12 +1,12 @@ module charm.land/fantasy -go 1.27 +go 1.27.0 require ( charm.land/x/vcr v0.1.1 cloud.google.com/go/auth v0.23.2 github.com/anthropics/anthropic-sdk-go v1.68.0 - github.com/ardanlabs/kronk v1.31.5 + github.com/ardanlabs/kronk v1.32.3 github.com/aws/aws-sdk-go-v2 v1.45.1 github.com/aws/aws-sdk-go-v2/config v1.33.1 github.com/aws/smithy-go v1.28.1 @@ -31,22 +31,22 @@ require ( cloud.google.com/go/compute/metadata v0.9.0 // indirect cloud.google.com/go/iam v1.13.0 // indirect cloud.google.com/go/monitoring v1.30.0 // indirect - cloud.google.com/go/storage v1.64.0 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.35.0 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.59.0 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.59.0 // indirect + cloud.google.com/go/storage v1.65.1 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.36.0 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.60.0 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.60.0 // indirect github.com/ardanlabs/jinja v1.6.0 // indirect - github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.18 // indirect + github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.20 // indirect github.com/aws/aws-sdk-go-v2/credentials v1.20.1 // indirect github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.19.1 // indirect github.com/aws/aws-sdk-go-v2/internal/configsources v1.5.1 // indirect github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.8.1 // indirect github.com/aws/aws-sdk-go-v2/internal/v4a v1.5.1 // indirect github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.19 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.30 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.10.0 // indirect github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.14.1 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.38 // indirect - github.com/aws/aws-sdk-go-v2/service/s3 v1.107.2 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.41 // indirect + github.com/aws/aws-sdk-go-v2/service/s3 v1.108.0 // indirect github.com/aws/aws-sdk-go-v2/service/signin v1.7.1 // indirect github.com/aws/aws-sdk-go-v2/service/sso v1.35.1 // indirect github.com/aws/aws-sdk-go-v2/service/ssooidc v1.40.1 // indirect @@ -58,7 +58,7 @@ require ( github.com/cenkalti/backoff/v5 v5.0.3 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/cncf/xds/go v0.0.0-20260202195803-dba9d589def2 // indirect - github.com/ebitengine/purego v0.10.2 // indirect + github.com/ebitengine/purego v0.11.0-alpha.9 // indirect github.com/envoyproxy/go-control-plane/envoy v1.39.0 // indirect github.com/envoyproxy/protoc-gen-validate v1.3.3 // indirect github.com/felixge/httpsnoop v1.1.0 // indirect @@ -69,14 +69,14 @@ require ( github.com/google/go-cmp v0.7.0 // indirect github.com/google/s2a-go v0.1.9 // indirect github.com/googleapis/enterprise-certificate-proxy v0.3.21 // indirect - github.com/googleapis/gax-go/v2 v2.23.0 // indirect + github.com/googleapis/gax-go/v2 v2.24.0 // indirect github.com/gorilla/websocket v1.5.3 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.30.0 // indirect github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.74 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-getter v1.8.8 // indirect github.com/hashicorp/go-version v1.9.0 // indirect - github.com/hybridgroup/yzma v1.23.0 // indirect + github.com/hybridgroup/yzma v1.25.0 // indirect github.com/invopop/jsonschema v0.14.0 // indirect github.com/jupiterrider/ffi v0.7.0 // indirect github.com/kaptinlin/jsonpointer v0.4.28 // indirect @@ -97,16 +97,16 @@ require ( github.com/tidwall/sjson v1.2.5 // indirect github.com/ulikunitz/xz v0.5.16 // indirect go.opentelemetry.io/auto/sdk v1.2.1 // indirect - go.opentelemetry.io/contrib/detectors/gcp v1.45.0 // indirect - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.70.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.70.0 // indirect - go.opentelemetry.io/otel v1.45.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.45.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.45.0 // indirect - go.opentelemetry.io/otel/metric v1.45.0 // indirect - go.opentelemetry.io/otel/sdk v1.45.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.45.0 // indirect - go.opentelemetry.io/otel/trace v1.45.0 // indirect + go.opentelemetry.io/contrib/detectors/gcp v1.46.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.71.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.71.0 // indirect + go.opentelemetry.io/otel v1.46.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.46.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.46.0 // indirect + go.opentelemetry.io/otel/metric v1.46.0 // indirect + go.opentelemetry.io/otel/sdk v1.46.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.46.0 // indirect + go.opentelemetry.io/otel/trace v1.46.0 // indirect go.opentelemetry.io/proto/otlp v1.11.0 // indirect go.yaml.in/yaml/v2 v2.4.4 // indirect go.yaml.in/yaml/v3 v3.0.5 // indirect @@ -117,11 +117,11 @@ require ( golang.org/x/sys v0.47.0 // indirect golang.org/x/text v0.41.0 // indirect golang.org/x/time v0.15.0 // indirect - google.golang.org/api v0.293.0 // indirect - google.golang.org/genproto v0.0.0-20260818201246-1b0934165a6f // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20260818201246-1b0934165a6f // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20260818201246-1b0934165a6f // indirect - google.golang.org/grpc v1.83.0 // indirect + google.golang.org/api v0.294.0 // indirect + google.golang.org/genproto v0.0.0-20260825221802-da73d73af1c5 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20260825221802-da73d73af1c5 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20260825221802-da73d73af1c5 // indirect + google.golang.org/grpc v1.83.2 // indirect google.golang.org/protobuf v1.36.12 // indirect gopkg.in/dnaeon/go-vcr.v4 v4.0.6-0.20251110073552-01de4eb40290 // indirect ) diff --git a/go.sum b/go.sum index 04b2cc62d..a03077890 100644 --- a/go.sum +++ b/go.sum @@ -18,32 +18,32 @@ cloud.google.com/go/longrunning v1.2.0 h1:WjYH3YHBGCxGJP9M4dWGHBfXr/cFIjMkNgWcJj cloud.google.com/go/longrunning v1.2.0/go.mod h1:5KMQALFGOCtFoi2xSOA1u3H7WKlhmckgiyFw7+LGQp0= cloud.google.com/go/monitoring v1.30.0 h1:r/d+JUbyKmJ8b07iznuKfzVzrIXTWxHQ3lBRm3x2LlY= cloud.google.com/go/monitoring v1.30.0/go.mod h1:htlUR0QWVMrjFzZmN4LGnMAve9xB/eduwjmINxVZ8RM= -cloud.google.com/go/storage v1.64.0 h1:KLpxI/oX9LxeRsNqn877d2WyeT3ryiEwnGt8pwcSPZg= -cloud.google.com/go/storage v1.64.0/go.mod h1:lWyAtwvDZHdL3k68WVKbESP6bmWaV23ZJJ/JEVw/ZaQ= +cloud.google.com/go/storage v1.65.1 h1:LRRpBJUTf+OXDPX9jZUKZ3mSLIsz3htG+qUpeNZovyA= +cloud.google.com/go/storage v1.65.1/go.mod h1:UsS9OgFg/XHOSYakQ8ZtLWWeyGkk1WnmD/GsGfN0BHM= cloud.google.com/go/trace v1.16.0 h1:GmQovzFc5F0CNfl0VLgL64aoTtu7xsM0YajW2GlG9+E= cloud.google.com/go/trace v1.16.0/go.mod h1:r+bdAn16dKLSV1G2D5v3e58IlQlizfxWrUfjx7kM7X0= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.23.0 h1:4gRPBpN1f6xt88yi4WR26m7XaD9OlWtVT6bWPdGUIok= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.23.0/go.mod h1:G7QVLxw1j1JVyrO1MA95S8m8HStaaleDZYTcfGgjB2o= github.com/Azure/azure-sdk-for-go/sdk/internal v1.12.0 h1:fhqpLE3UEXi9lPaBRpQ6XuRW0nU7hgg4zlmZZa+a9q4= github.com/Azure/azure-sdk-for-go/sdk/internal v1.12.0/go.mod h1:7dCRMLwisfRH3dBupKeNCioWYUZ4SS09Z14H+7i8ZoY= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.35.0 h1:bN1gA3of5bXtbnLsRPrwfmbbe7A5UWFlcTHseujLnpc= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.35.0/go.mod h1:Yj5vHEz/aAepZGliRJsA6uvHAVAQyEwajq9ORCHPxzM= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.59.0 h1:c/Ivw7FuawPLfrr+zB0LZKeCchO2cAHQpF2qZ6OV7rQ= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.59.0/go.mod h1:Zba7lknY/d78oxbKqFTmCsaGwfpzeJ3ktrrLXtnTV6g= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.59.0 h1:xTXsqDOj5k9mK3VVWHYUryryJCIdYfXxdjKFwpzINUw= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.59.0/go.mod h1:V9g30lTKzfUsEW+gpWssck6u9IhARajmipodImLLcwI= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.59.0 h1:18FRm6ZcN/x9+ZmhMr96hLcTtlLn2/gHPuDLVeg7XcY= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.59.0/go.mod h1:YqwkQPrWSC7+byyc1VlKbWLBF5JsW5IoL6xUkemYSXk= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.36.0 h1:3SdxXLkgAfiHRWcGTq6fneq9jgoJzneiY0yPQnjoT2E= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.36.0/go.mod h1:1iIdl0k+ppn9wT0wzR9H7HkSvIui/4qgtnKW10cQtds= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.60.0 h1:HldzheTs05E3ybqSitI/wHaof6+XERRudgZLjYbs3eE= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.60.0/go.mod h1:evkqaSczW9g2BQm1veCtgNhJ4wCCsRrOsSgNIn9LHQk= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.60.0 h1:Fx8NtDCmKH4ML2hUkPz4Dq250903vRDojMjVCDKwQuc= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.60.0/go.mod h1:V9g30lTKzfUsEW+gpWssck6u9IhARajmipodImLLcwI= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.60.0 h1:Oblia1QXBJlM/wOY9ARRUtsXdDYiMCzk3eCMikqoLbI= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.60.0/go.mod h1:SRAbhyZ4R4FagHMM9VtRgSY/lheRoht2fKelZXQUenk= github.com/anthropics/anthropic-sdk-go v1.68.0 h1:FikM/c545Fw+6lp0iQ48hnfn1wK4SxBjkYoGrGMwMhY= github.com/anthropics/anthropic-sdk-go v1.68.0/go.mod h1:3EfIfmFqxH6rbiLcIP4tPFyXL/IHakx2wDG4OU+TIEI= github.com/ardanlabs/jinja v1.6.0 h1:CbqS/dxYM9qrmlBed1GsN64/tRY6SoWQWc5Sc+aw3iI= github.com/ardanlabs/jinja v1.6.0/go.mod h1:aXXzlJfjA+T3XNKA/YT5ZtDq2VJxt5a5siZ8cl9B35Q= -github.com/ardanlabs/kronk v1.31.5 h1:pU335FU7KOT2Mv4j4e2S+QaAVYumTRYYKgISkzrQT7Q= -github.com/ardanlabs/kronk v1.31.5/go.mod h1:ub5hRgH9xtMTTQOtBTPwzP67fx0dDwZGLwrWDpp+fuQ= +github.com/ardanlabs/kronk v1.32.3 h1:/7z88c+0cqkdLIkyWyR1HmICeXh0oFPZ+vju5Z81TZ0= +github.com/ardanlabs/kronk v1.32.3/go.mod h1:xU15Jy9JV/bVSNCHsItlPPX4oDWvTY7xkuZsDMuAvTo= github.com/aws/aws-sdk-go-v2 v1.45.1 h1:iIoG3NaLhV6UZpPXyPXlDj2I9oS8tV/nMcMnITCC6Ks= github.com/aws/aws-sdk-go-v2 v1.45.1/go.mod h1:bttEH6JqnUL8LepvDVfdrds/fZ5bCIxzpe3abyUrhDU= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.18 h1:LAfOuhAH331fmOjTQpAaOlH+Ftn7RzSDJ2VFwjdMMy4= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.18/go.mod h1:4e5xhuXHx1e4U9EthvbPP1r/DIMp5c2823OL8karzcM= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.20 h1:GPRlPwz40I2B2VrBEASOA3Bi77NyeqejNLkifosX0rs= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.20/go.mod h1:g7PNzKcsOKWb4fkSRBA7BZVAS6Y8IcxzN+nRohhQ1Q8= github.com/aws/aws-sdk-go-v2/config v1.33.1 h1:bq9jze1hQ5YTCLoVxNnbp0T7rglrlOE7N9YsHqjGkEw= github.com/aws/aws-sdk-go-v2/config v1.33.1/go.mod h1:2A3HQwG4zaL5Tm80rc6RZj8LmWWv4WYT5v8raSz/L7A= github.com/aws/aws-sdk-go-v2/credentials v1.20.1 h1:Z8GRNEx0u9sDkZOq4PUnN8mjGwbUQGRzMSXpvt3d8xQ= @@ -58,14 +58,14 @@ github.com/aws/aws-sdk-go-v2/internal/v4a v1.5.1 h1:yhw5KD1phVyP9vijxOUzDfEtJx+b github.com/aws/aws-sdk-go-v2/internal/v4a v1.5.1/go.mod h1:ZW2e0d7DYlRxlS9hEiMXE47gTdX5KRN4byUiNbUpG+Q= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.19 h1:bAdDl/HkGCcGPoe25ToSHEw23VIxt6CT5fLcg111BKg= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.19/go.mod h1:KaUzbLxv4CeSxh6ZCl9B4m7CuFenS8kUEaDs+f/DQr4= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.30 h1:5437eMoOwqqQpZn2XJy74mlDCuPYL81texMT3mXqgtU= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.30/go.mod h1:xfu2m3dOpvW8lj98wQYa8V9ku/Rta59hsbireGzhh3A= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.10.0 h1:U8/A0RRBaEspzH1uul3JHLbypXwEGUkRkvoT9f0ATcM= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.10.0/go.mod h1:UELStX5KwtJNtQxa+UuF8dc3z4UYc40e8yHYJSozNwY= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.14.1 h1:RmmWQPREQdk9U+PfqeHW3MqZaBaNK7TpV9W3RY+b+7g= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.14.1/go.mod h1:0A3W4F+68ZnNk5XcNL/e9HFMwnP8RlEicFfy6eOEDyw= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.38 h1:gX8B8y3Ho30B1LPxefDKMi/HZqWEb47U9ogs3DtSG0M= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.38/go.mod h1:l5WblZlcmGPe4/O7JY2HO25Z+xqTBvyfTyFbRMf8gYw= -github.com/aws/aws-sdk-go-v2/service/s3 v1.107.2 h1:GNU0/xtPEXMKilJZ/a8BedeuQnvu+Usi6qVm9EFfncc= -github.com/aws/aws-sdk-go-v2/service/s3 v1.107.2/go.mod h1:4jYWUecEsQtE73jPl7p3jrbYXH5ffcR4gegyCygagfg= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.41 h1:Q9DIKDuJix/oJnQxFpQ26L0EwVa/YNo4k2kbktrjQjE= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.41/go.mod h1:x+TuqkOIG1SZS0+yN54sExGA9ZpjhPO6vPdYnpTFX1M= +github.com/aws/aws-sdk-go-v2/service/s3 v1.108.0 h1:Yp+x5PKXEmoqHsgP/pAkBy5Tyq1UlXAzM0OInh0vxWw= +github.com/aws/aws-sdk-go-v2/service/s3 v1.108.0/go.mod h1:locV6DtXyp7Xzr2BG6jtsbeBi3YAWJ/CY4xUThYmIwQ= github.com/aws/aws-sdk-go-v2/service/signin v1.7.1 h1:mdMtSVKdQ3+mzBh+l0ogrFYZVQUCg6pJZOirA2ARsYE= github.com/aws/aws-sdk-go-v2/service/signin v1.7.1/go.mod h1:9IqUlsJDbUPcg6cgx3WEzXdjrbWzLDQrak0aaSqlTcI= github.com/aws/aws-sdk-go-v2/service/sso v1.35.1 h1:B6WFn91tobD6gG4724ONHaqrpKsoETGnv98LHe/yIGM= @@ -98,8 +98,8 @@ github.com/cncf/xds/go v0.0.0-20260202195803-dba9d589def2 h1:aBangftG7EVZoUb69Os github.com/cncf/xds/go v0.0.0-20260202195803-dba9d589def2/go.mod h1:qwXFYgsP6T7XnJtbKlf1HP8AjxZZyzxMmc+Lq5GjlU4= github.com/dnaeon/go-vcr v1.2.0 h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI= github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= -github.com/ebitengine/purego v0.10.2 h1:W809HbnvzAxgdm+aOvlSekrM16wGCdT/e76+9tS7gzE= -github.com/ebitengine/purego v0.10.2/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/ebitengine/purego v0.11.0-alpha.9 h1:nH3UEIa45o38JcEgQlPgBFuGU0BkdU68u3v/IXrgo9k= +github.com/ebitengine/purego v0.11.0-alpha.9/go.mod h1:DCHPP08djqhNSoTfImcnHYQRZmd0qhakvrozqaEYhGQ= github.com/envoyproxy/go-control-plane v0.14.0 h1:hbG2kr4RuFj222B6+7T83thSPqLjwBIfQawTkC++2HA= github.com/envoyproxy/go-control-plane v0.14.0/go.mod h1:NcS5X47pLl/hfqxU70yPwL9ZMkUlwlKxtAohpi2wBEU= github.com/envoyproxy/go-control-plane/envoy v1.39.0 h1:1uwRDYPYG8BIBU9Mj1sUAebNmlM6beu/ZKKweSLDxk8= @@ -133,8 +133,8 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/enterprise-certificate-proxy v0.3.21 h1:OFdQ3tnCX/zaQ0Cedur3D3z7kI6HiLX9g3TiAN4/DFU= github.com/googleapis/enterprise-certificate-proxy v0.3.21/go.mod h1:L3D/IQExI6LqEjBdXcZQ1WluSgigQmSwBboFstVPM4w= -github.com/googleapis/gax-go/v2 v2.23.0 h1:Tchl7qkvE7Ip3y+ztvNufYFvkfqTe7NfLTYGIdJRLuE= -github.com/googleapis/gax-go/v2 v2.23.0/go.mod h1:rBQKOVJCdb8IFEzg+FCwlt1LP/xMDGuqUXhUG+XMXEg= +github.com/googleapis/gax-go/v2 v2.24.0 h1:myMaPYyF9MecEmvQqMqomIwn9t/4KCZN9qnwsS76wlg= +github.com/googleapis/gax-go/v2 v2.24.0/go.mod h1:IaTHBDd7NHxSCiu0vEs8pQZu4dGZrWwuSoxCnk16OFM= github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/grpc-ecosystem/grpc-gateway/v2 v2.30.0 h1:/Tnpcb2E0Pz/tN9s3bfEY2Q8ePCEX9iuS+cneUwncnw= @@ -147,8 +147,8 @@ github.com/hashicorp/go-getter v1.8.8 h1:sRakhf+EH6s0LZLO2IgBwZ6hAFp+fZOZMNREwVE github.com/hashicorp/go-getter v1.8.8/go.mod h1:fqFlibKpwfns/s4oljLB3upJspyfFLQhS7031PlfUDc= github.com/hashicorp/go-version v1.9.0 h1:CeOIz6k+LoN3qX9Z0tyQrPtiB1DFYRPfCIBtaXPSCnA= github.com/hashicorp/go-version v1.9.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hybridgroup/yzma v1.23.0 h1:AqwwhnPOS0I4TzRTCuWxXqGK/kY2P+QZ3+qiJOM3Jl0= -github.com/hybridgroup/yzma v1.23.0/go.mod h1:wAMtNTjSnE79jTWzaeFSsuraam0TXKCPajMHA5s+OX8= +github.com/hybridgroup/yzma v1.25.0 h1:COWD3hgZJv0gMOugweWpdfJ4dw5H738VUtY079RteZ0= +github.com/hybridgroup/yzma v1.25.0/go.mod h1:wAMtNTjSnE79jTWzaeFSsuraam0TXKCPajMHA5s+OX8= github.com/invopop/jsonschema v0.14.0 h1:MHQqLhvpNUZfw+hM3AZDYK7jxO8FZoQeQM77g8iyZjg= github.com/invopop/jsonschema v0.14.0/go.mod h1:ygm6C2EaVNMBDPpaPlnOA2pFAxBnxGjFlMZABxm9n2I= github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= @@ -199,30 +199,30 @@ github.com/ulikunitz/xz v0.5.16 h1:ld6NyySjx5lowVKwJvMRLnW5nxKX/xnpSiFYZ/Lxur0= github.com/ulikunitz/xz v0.5.16/go.mod h1:H9Rt/W6/Qj27PGauhQc6nfCDy7vHpzsOThBSaYDoEhw= go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= -go.opentelemetry.io/contrib/detectors/gcp v1.45.0 h1:9jR0ZPRok9ryaOQ2Wx8rg5F7Aon59mxrqbVI60/vlBk= -go.opentelemetry.io/contrib/detectors/gcp v1.45.0/go.mod h1:VSme3o2fvSg5bVg0dRzyHaj4Z5EVhG+g2Fde6LKzmQA= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.70.0 h1:oECp5f+hN7nkwjU/8BxQ/q23bGPb8FIrD839owX222E= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.70.0/go.mod h1:DqEFwLumhzMBDQv9PcWbyoDxHI/4lAk6CM4nJBH39sc= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.70.0 h1:LMuyCAyfalSjDyjdC65nK6N0zoTT63+E/u95X0JovZI= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.70.0/go.mod h1:085m8qbm4hgc8rZWGDEa4vmyyo2c3nPxUslYUKUIU04= -go.opentelemetry.io/otel v1.45.0 h1:pdrWmLHofpubmArBv1LgFSv1Z0Ie/ppdZzu+kUN5EeU= -go.opentelemetry.io/otel v1.45.0/go.mod h1:XZxIqPapzEYnhNSScF5DIqXhm/rYi0FzCe2XddAwZfQ= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.45.0 h1:QRefszxJmfPdjXUUm3j6iDzY03mTPXMjqErFqQ67vUg= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.45.0/go.mod h1:Tiz03lTBVBrm7eWZBOidzEaYaJa8tjwGUGv6d8mlTyk= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.45.0 h1:fG5MCxGz8+2VtrN/WgqSpJFctVz24gpxj8CxkKmc8Ww= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.45.0/go.mod h1:BmAYTn+3ysbRe+IU2msxmf5Rx3g6DHvex+tWI3LdhYI= +go.opentelemetry.io/contrib/detectors/gcp v1.46.0 h1:PI8dGkqDaQkwJ8kOopqMhDTbrnK3UIeG/RCHH4HErbo= +go.opentelemetry.io/contrib/detectors/gcp v1.46.0/go.mod h1:nsrN5c/sOLoY2vsPxN/rQ0V0nvGrWJCqcW4UXLtqNG8= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.71.0 h1:B2h3uqicet1CT2N5TOFhS+Gq++9i0/CLmaxvhmhtP5s= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.71.0/go.mod h1:dylvB+ZiiwMvsDij9O84Uy7SijLgHMX4mbkncds+4Sw= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.71.0 h1:3g7B90UzBltIDKq1/5mrTGxTnOFDV0ICOhLoxiZ8jlg= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.71.0/go.mod h1:Ef8SuTh59BT7+ofpDxN9z+yOlc4t2GjLmKDgYNJL/NU= +go.opentelemetry.io/otel v1.46.0 h1:FHt5/CDyVxi/8IM1CH7VE/rRgq3kLHa2mSTVMO8AWyc= +go.opentelemetry.io/otel v1.46.0/go.mod h1:Gj3SEScelsNC45tp4nSxRYlS+f5iez7W8XPMCt905kE= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.46.0 h1:OFnwLJr+pF3iHrlGSzbxyuo6/6HyBlnlN1CWEJmBVcw= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.46.0/go.mod h1:716wFneO0ov19A2beH5hjfh9AK5z/VWNAtDijp1Y0/g= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.46.0 h1:w53CDeOA/Kurp7yRsegSr6pbbr759dOvJ+yNmWM6Hxs= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.46.0/go.mod h1:BOmGMCbAtvcJiSJ+hLuhgPLdDbimnraSl8irz3iY8sY= go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.44.0 h1:hqxVTu/GtBF+vJ8d1fzW7fRxZFvgoDjWcxwwCaFDYpU= go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.44.0/go.mod h1:z5fVEF4X5v0ESvlJqBrrFlBVoj5EQuefZpzsu7R+x5Q= -go.opentelemetry.io/otel/metric v1.45.0 h1:7Eg1uH7CJ5cXv9is6tnBe1FI6rj1nwUdbFypRm3br/M= -go.opentelemetry.io/otel/metric v1.45.0/go.mod h1:HAPbm1nd3p1PmFH7v2dR+6BjXxw+Lq4a2+pndMAm08s= -go.opentelemetry.io/otel/metric/x v0.67.0 h1:PcicCNZFkZ4bXfSooXdo3WN7RBOVOtjVdo1wD358Uns= -go.opentelemetry.io/otel/metric/x v0.67.0/go.mod h1:FBjCWZe6wgcqxcMtjdGiClDKXb2YxxXii0CXftE4QtI= -go.opentelemetry.io/otel/sdk v1.45.0 h1:4VVSMgQ83dUgW2aoX5f6JgLvHwIvzcuLnF9lUdCSpCw= -go.opentelemetry.io/otel/sdk v1.45.0/go.mod h1:Sr40LgXV7DsKMMJMKOhUWOgMWTfAaqvm2kF0g7ilwuA= -go.opentelemetry.io/otel/sdk/metric v1.45.0 h1:oVFszMfyj1Am6s24Vtc7wBb8BKLcwepJjNEYILuiE3o= -go.opentelemetry.io/otel/sdk/metric v1.45.0/go.mod h1:vUWUxDZvu1WVRj8JA8S0AdhsPrZoDpA2DdZauIh4mDA= -go.opentelemetry.io/otel/trace v1.45.0 h1:l/mP6Uv7oNO7/TblbhpbgMidxhq1uO/rPsikOyVhxag= -go.opentelemetry.io/otel/trace v1.45.0/go.mod h1:qoJJA2xNMnxRrdISU/kLtfUH2wNeQbiv+jhs/CxI8bc= +go.opentelemetry.io/otel/metric v1.46.0 h1:yBnkXvgV7AXFILZc5K6IZe/CBFF3OS7BJ8ov6/lj0K8= +go.opentelemetry.io/otel/metric v1.46.0/go.mod h1:iPmdWqifKUdzziPkvvzIJXITl56fQx2mGM/DHLB3/2o= +go.opentelemetry.io/otel/metric/x v0.68.0 h1:TA/cBT23D3MnxYPwHL7YFOdYGdx0A0v+s7Mzotpd1dU= +go.opentelemetry.io/otel/metric/x v0.68.0/go.mod h1:agudOmvWhwUTjgibWDzxD2PoWYnpw5Ht5jISYOD2Hd4= +go.opentelemetry.io/otel/sdk v1.46.0 h1:h5CNQQjEbuQXY/JfZtgt3i7HVFV3aHPO2OAwO2eTYPI= +go.opentelemetry.io/otel/sdk v1.46.0/go.mod h1:GAERFXFt5SYCEB+YiKUbMBeza6UaDH7GmGOZEfh2gSM= +go.opentelemetry.io/otel/sdk/metric v1.46.0 h1:0piZ26EG4RBfebb2jhDH6ERCYHoVWduc3kLgPCwSnSE= +go.opentelemetry.io/otel/sdk/metric v1.46.0/go.mod h1:I1PbKrdVc8Qu8HYVDNtqVIwLwjNrhsV/uFuxfwg8mO4= +go.opentelemetry.io/otel/trace v1.46.0 h1:OULy7ccdJnZtJ0UDYFOIGaCmiWzJ8Vi2G/Rsu60qs1c= +go.opentelemetry.io/otel/trace v1.46.0/go.mod h1:J7GAXweO77XSFkB/rmAqk9D6ihszhFjLU+d9WuUxDLI= go.opentelemetry.io/proto/otlp v1.11.0 h1:5rrYs0Ykyj50sdU/JU0x8etU+LubXWb+gED6TbEdMIk= go.opentelemetry.io/proto/otlp v1.11.0/go.mod h1:SmVizdCOAm3XBtG1g1NnOdhW6jtddT72hLMhv8VwA8E= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= @@ -251,18 +251,18 @@ golang.org/x/time v0.15.0 h1:bbrp8t3bGUeFOx08pvsMYRTCVSMk89u4tKbNOZbp88U= golang.org/x/time v0.15.0/go.mod h1:Y4YMaQmXwGQZoFaVFk4YpCt4FLQMYKZe9oeV/f4MSno= gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4= gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E= -google.golang.org/api v0.293.0 h1:p9XIWOf63U4OgYx120ZwVU8+vl4XTPmWfgVPnmOAS9w= -google.golang.org/api v0.293.0/go.mod h1:6n5tjEB1gzwniZTepZ0g5u+wM7Bof5GeULCx/zh8ZE0= +google.golang.org/api v0.294.0 h1:8gASjJxdtcIieB3OqbkLcF0FfbXVNqKtU5iozD1ssvA= +google.golang.org/api v0.294.0/go.mod h1:02qB8+Ox1ZFzcaKFMguy1nQLJmSIyvV6Ff4txJEXtl4= google.golang.org/genai v1.70.0 h1:V9oYOBvTDYbmeklOHjvxGeeLau71WiS2CWKrktQtDok= google.golang.org/genai v1.70.0/go.mod h1:mDdPDFXo1Ats7f1WXVyZgWb/CkMzFWTWJruIMy7hGIU= -google.golang.org/genproto v0.0.0-20260818201246-1b0934165a6f h1:mIpuZeRssq9TYLzKcruaLOCbOgJt8WDF1FSyEPZBw24= -google.golang.org/genproto v0.0.0-20260818201246-1b0934165a6f/go.mod h1:UpDDw2l68z31m5UZN/Qi0Kow16ohhlJVlmqC3qRM5Q8= -google.golang.org/genproto/googleapis/api v0.0.0-20260818201246-1b0934165a6f h1:zRL8hmUGXSGBJ2D+r85c0S3xhrg6BtfQ3V6KKbR/I9M= -google.golang.org/genproto/googleapis/api v0.0.0-20260818201246-1b0934165a6f/go.mod h1:q/3oV3jAi5vwelxsVAprMBC8BcM2zmNe+IjRGd+9/ks= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260818201246-1b0934165a6f h1:kMQMi+2r0XRQ/Ad2/tgd+5S7JYSBGYO4pwkLTE8F2y0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260818201246-1b0934165a6f/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= -google.golang.org/grpc v1.83.0 h1:JeNZEKJFbQxArAMl+hiytHauacDNqJUllNfmIMmpqnQ= -google.golang.org/grpc v1.83.0/go.mod h1:kDyl6SKsiHKt0uylY5gtn5cEjkrIOhQOGDgIc4JGwzQ= +google.golang.org/genproto v0.0.0-20260825221802-da73d73af1c5 h1:jPP56YzdY899KJ5W7efXHt/CkjlVfAaoFOwdi/IEAFA= +google.golang.org/genproto v0.0.0-20260825221802-da73d73af1c5/go.mod h1:gutZdP0DwAHp4vu5WaXgEK7tjsJ77ZEqzlOFWGZGziE= +google.golang.org/genproto/googleapis/api v0.0.0-20260825221802-da73d73af1c5 h1:izFU9hz7aeLI/Mi1J0991ae+xcwRLr7hTqWnB/9aIIU= +google.golang.org/genproto/googleapis/api v0.0.0-20260825221802-da73d73af1c5/go.mod h1:3LhxRw4YYkf+ylAfgaY9JlVLFKhokkCV8duhLLe7+t0= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260825221802-da73d73af1c5 h1:1VUiZAXyC+zmiFYi+WLtBzr68Cj8wOofHjjrA/kkizc= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260825221802-da73d73af1c5/go.mod h1:DjtHYE8FKJLivXcBEjGwndXfIC23G0VpXiXKqG179uA= +google.golang.org/grpc v1.83.2 h1:EManeRomTObA0BU7I8vXgg/78uE5MJ9M8B39EX2WscU= +google.golang.org/grpc v1.83.2/go.mod h1:YPI1hK3kDked6iHvgX3tR0y+nX/qpMFKhPgFsokw1S8= google.golang.org/protobuf v1.36.12 h1:pJOKDDOyeXErUroCihFAd5LQuwXBSpVnKGrj5o/fwxc= google.golang.org/protobuf v1.36.12/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/dnaeon/go-vcr.v4 v4.0.6-0.20251110073552-01de4eb40290 h1:g3ah7zaWmw41EtOgBNXpx8zk4HYuH3OMwB+qh1Dt834= From 73eb01dec54ee7923b9c77d3e03cc9fd78b28cf9 Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Tue, 1 Sep 2026 14:23:42 -0300 Subject: [PATCH 103/156] v0.42.1 --- version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.txt b/version.txt index 787ffc30a..339fd080a 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -0.42.0 +0.42.1 From 87a5a96caa3230b74fd9a84c29a2ca09a2140ef3 Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Fri, 4 Sep 2026 20:09:18 -0300 Subject: [PATCH 104/156] feat: add response header capture hook to the openai provider (#353) Assisted-by: Crush:glm-5.3 --- providers/openai/language_model.go | 129 ++++++- providers/openai/language_model_hooks.go | 7 + providers/openai/openai.go | 5 +- providers/openai/responses_language_model.go | 65 +++- providers/openai/responses_options.go | 16 + providers/openaicompat/header_test.go | 343 +++++++++++++++++++ 6 files changed, 553 insertions(+), 12 deletions(-) create mode 100644 providers/openaicompat/header_test.go diff --git a/providers/openai/language_model.go b/providers/openai/language_model.go index 501b78cad..c47464990 100644 --- a/providers/openai/language_model.go +++ b/providers/openai/language_model.go @@ -7,6 +7,8 @@ import ( "errors" "fmt" "io" + "maps" + "net/http" "reflect" "slices" "strings" @@ -16,6 +18,7 @@ import ( "charm.land/fantasy/schema" "github.com/google/uuid" "github.com/openai/openai-go/v3" + "github.com/openai/openai-go/v3/option" "github.com/openai/openai-go/v3/packages/param" "github.com/openai/openai-go/v3/shared" ) @@ -32,6 +35,7 @@ type languageModel struct { streamUsageFunc LanguageModelStreamUsageFunc streamExtraFunc LanguageModelStreamExtraFunc streamProviderMetadataFunc LanguageModelStreamProviderMetadataFunc + headerFunc LanguageModelHeaderFunc toPromptFunc LanguageModelToPromptFunc } @@ -80,6 +84,17 @@ func WithLanguageModelStreamUsageFunc(fn LanguageModelStreamUsageFunc) LanguageM } } +// WithLanguageModelHeaderFunc sets the response header function for the +// language model. When set, the HTTP response headers of each call are +// captured and passed to the function alongside the provider metadata, +// which it may mutate (e.g. copying headers of interest into ExtraFields). +// When unset, response headers are not captured at all. +func WithLanguageModelHeaderFunc(fn LanguageModelHeaderFunc) LanguageModelOption { + return func(l *languageModel) { + l.headerFunc = fn + } +} + // WithLanguageModelToPromptFunc sets the to prompt function for the language model. func WithLanguageModelToPromptFunc(fn LanguageModelToPromptFunc) LanguageModelOption { return func(l *languageModel) { @@ -125,6 +140,112 @@ type streamToolCall struct { hasFinished bool } +// responseCapture holds the raw HTTP response of a call so response headers +// can be surfaced through provider metadata. Capturing is only enabled when +// a header func is configured on the language model. +type responseCapture struct { + response *http.Response +} + +// requestOptions returns the given per-call request options with the raw +// HTTP response capture appended when the given header func is configured. +func (c *responseCapture) requestOptions(headerFunc LanguageModelHeaderFunc, opts []option.RequestOption) []option.RequestOption { + if headerFunc == nil { + return opts + } + return append(opts, + option.WithResponseInto(&c.response), + option.WithMiddleware(drainOnCloseMiddleware), + ) +} + +// drainOnCloseMiddleware wraps the response body so that a close before +// EOF — which the SSE stream does at its [DONE] sentinel — drains the +// remaining bytes first. net/http parses HTTP trailers only once the body +// has been read that far, so without the drain a trailer arriving after +// the stream's terminal event would be discarded. +func drainOnCloseMiddleware(req *http.Request, next option.MiddlewareNext) (*http.Response, error) { + res, err := next(req) + if err != nil || res == nil || res.Body == nil { + return res, err + } + res.Body = &drainOnCloseBody{ReadCloser: res.Body} + return res, err +} + +// drainOnCloseBody reads the wrapped body to EOF before closing it. +type drainOnCloseBody struct { + io.ReadCloser +} + +func (b *drainOnCloseBody) Close() error { + _, _ = io.Copy(io.Discard, b.ReadCloser) + return b.ReadCloser.Close() +} + +// header returns the captured response headers, with any HTTP trailers +// merged in (trailer keys win on collision), or nil when no response was +// captured. The header func runs after the response body has been fully +// consumed, so trailers — which net/http populates only then — are visible. +func (c *responseCapture) header() http.Header { + if c.response == nil { + return nil + } + if len(c.response.Trailer) == 0 { + return c.response.Header + } + merged := c.response.Header.Clone() + maps.Copy(merged, c.response.Trailer) + return merged +} + +// languageModelHeaderFunc returns the header func configured through the +// given language model options, if any. It is the only language model +// option also honored by the responses language model. +func languageModelHeaderFunc(opts []LanguageModelOption) LanguageModelHeaderFunc { + var lm languageModel + for _, opt := range opts { + opt(&lm) + } + return lm.headerFunc +} + +// applyHeaders invokes the configured header func against the non-stream +// provider metadata. It is a no-op when no header func is configured or no +// response was captured. +func (o languageModel) applyHeaders(header http.Header, providerMetadata fantasy.ProviderOptionsData) fantasy.ProviderOptionsData { + if o.headerFunc == nil || header == nil { + return providerMetadata + } + metadata, ok := providerMetadata.(*ProviderMetadata) + if !ok { + metadata = &ProviderMetadata{} + providerMetadata = metadata + } + o.headerFunc(header, metadata) + return providerMetadata +} + +// applyHeadersStream invokes the configured header func against the stream +// provider metadata, creating the metadata when the stream carried none. +// It is a no-op when no header func is configured or no response was +// captured. It must run once, after the stream loop, because +// streamUsageFunc replaces the metadata on every chunk. +func (o languageModel) applyHeadersStream(header http.Header, providerMetadata *fantasy.ProviderMetadata) { + if o.headerFunc == nil || header == nil { + return + } + if *providerMetadata == nil { + *providerMetadata = fantasy.ProviderMetadata{} + } + metadata, ok := (*providerMetadata)[Name].(*ProviderMetadata) + if !ok { + metadata = &ProviderMetadata{} + (*providerMetadata)[Name] = metadata + } + o.headerFunc(header, metadata) +} + // Model implements fantasy.LanguageModel. func (o languageModel) Model() string { return o.modelID @@ -243,11 +364,12 @@ func (o languageModel) prepareParams(call fantasy.Call) (*openai.ChatCompletionN // Generate implements fantasy.LanguageModel. func (o languageModel) Generate(ctx context.Context, call fantasy.Call) (*fantasy.Response, error) { + capture := responseCapture{} params, warnings, err := o.prepareParams(call) if err != nil { return nil, err } - response, err := o.client.Chat.Completions.New(ctx, *params, append(callUARequestOptions(call), callHeadersRequestOptions(call)...)...) + response, err := o.client.Chat.Completions.New(ctx, *params, capture.requestOptions(o.headerFunc, append(callUARequestOptions(call), callHeadersRequestOptions(call)...))...) if err != nil { return nil, toProviderErr(err) } @@ -272,6 +394,7 @@ func (o languageModel) Generate(ctx context.Context, call fantasy.Call) (*fantas } usage, providerMetadata := o.usageFunc(*response) + providerMetadata = o.applyHeaders(capture.header(), providerMetadata) mappedFinishReason := o.mapFinishReasonFunc(choice.FinishReason) // Terminal reasons that can cut output mid-call — length, @@ -329,6 +452,7 @@ func (o languageModel) Generate(ctx context.Context, call fantasy.Call) (*fantas // Stream implements fantasy.LanguageModel. func (o languageModel) Stream(ctx context.Context, call fantasy.Call) (fantasy.StreamResponse, error) { + capture := responseCapture{} params, warnings, err := o.prepareParams(call) if err != nil { return nil, err @@ -338,7 +462,7 @@ func (o languageModel) Stream(ctx context.Context, call fantasy.Call) (fantasy.S IncludeUsage: openai.Bool(true), } - stream := o.client.Chat.Completions.NewStreaming(ctx, *params, append(callUARequestOptions(call), callHeadersRequestOptions(call)...)...) + stream := o.client.Chat.Completions.NewStreaming(ctx, *params, capture.requestOptions(o.headerFunc, append(callUARequestOptions(call), callHeadersRequestOptions(call)...))...) isActiveText := false toolCalls := make(map[int64]streamToolCall) @@ -628,6 +752,7 @@ func (o languageModel) Stream(ctx context.Context, call fantasy.Call) (fantasy.S }}, }) } + o.applyHeadersStream(capture.header(), &providerMetadata) yield(fantasy.StreamPart{ Type: fantasy.StreamPartTypeFinish, Usage: usage, diff --git a/providers/openai/language_model_hooks.go b/providers/openai/language_model_hooks.go index 8b8556763..92849cbe6 100644 --- a/providers/openai/language_model_hooks.go +++ b/providers/openai/language_model_hooks.go @@ -3,6 +3,7 @@ package openai import ( "encoding/base64" "fmt" + "net/http" "strings" "charm.land/fantasy" @@ -32,6 +33,12 @@ type LanguageModelStreamUsageFunc = func(chunk openai.ChatCompletionChunk, ctx m // LanguageModelStreamProviderMetadataFunc is a function that handles stream provider metadata for the language model. type LanguageModelStreamProviderMetadataFunc = func(choice openai.ChatCompletionChoice, metadata fantasy.ProviderMetadata) fantasy.ProviderMetadata +// LanguageModelHeaderFunc is a function that receives the HTTP response +// headers of a completed call. It may copy headers of interest into the +// provider metadata, so they are surfaced to callers through +// [fantasy.Response] and the terminal [fantasy.StreamPart]. +type LanguageModelHeaderFunc = func(header http.Header, metadata *ProviderMetadata) + // LanguageModelToPromptFunc is a function that handles converting fantasy prompts to openai sdk messages. type LanguageModelToPromptFunc = func(prompt fantasy.Prompt, provider, model string) ([]openai.ChatCompletionMessageParamUnion, []fantasy.CallWarning) diff --git a/providers/openai/openai.go b/providers/openai/openai.go index b4878966a..46f3e6388 100644 --- a/providers/openai/openai.go +++ b/providers/openai/openai.go @@ -194,7 +194,10 @@ func (o *provider) LanguageModel(_ context.Context, modelID string) (fantasy.Lan if objectMode == fantasy.ObjectModeJSON { objectMode = fantasy.ObjectModeAuto } - return newResponsesLanguageModel(modelID, o.options.name, client, objectMode), nil + // The responses language model has its own parameter and usage + // handling; of the language model options, only the header hook + // is shared with the chat completions model. + return newResponsesLanguageModel(modelID, o.options.name, client, objectMode, languageModelHeaderFunc(o.options.languageModelOptions)), nil } languageModelOptions := append([]LanguageModelOption{}, o.options.languageModelOptions...) diff --git a/providers/openai/responses_language_model.go b/providers/openai/responses_language_model.go index e02bb8579..41c5cb40d 100644 --- a/providers/openai/responses_language_model.go +++ b/providers/openai/responses_language_model.go @@ -3,9 +3,12 @@ package openai import ( "context" "encoding/base64" + "encoding/json" "errors" "fmt" "io" + "maps" + "net/http" "reflect" "strings" @@ -26,18 +29,48 @@ type responsesLanguageModel struct { modelID string client openai.Client objectMode fantasy.ObjectMode + headerFunc LanguageModelHeaderFunc } // newResponsesLanguageModel implements a responses api model. -func newResponsesLanguageModel(modelID string, provider string, client openai.Client, objectMode fantasy.ObjectMode) responsesLanguageModel { +func newResponsesLanguageModel(modelID string, provider string, client openai.Client, objectMode fantasy.ObjectMode, headerFunc LanguageModelHeaderFunc) responsesLanguageModel { return responsesLanguageModel{ modelID: modelID, provider: provider, client: client, objectMode: objectMode, + headerFunc: headerFunc, } } +// applyHeaders invokes the configured header func against a chat +// completions metadata sink and copies the resulting extra fields into +// the responses provider metadata, creating the entry when the call +// carried none. It is a no-op when no header func is configured or no +// response was captured. +func (o responsesLanguageModel) applyHeaders(header http.Header, metadata *fantasy.ProviderMetadata) { + if o.headerFunc == nil || header == nil { + return + } + sink := &ProviderMetadata{} + o.headerFunc(header, sink) + if len(sink.ExtraFields) == 0 { + return + } + if *metadata == nil { + *metadata = fantasy.ProviderMetadata{} + } + responsesMetadata, ok := (*metadata)[Name].(*ResponsesProviderMetadata) + if !ok { + responsesMetadata = &ResponsesProviderMetadata{} + (*metadata)[Name] = responsesMetadata + } + if responsesMetadata.ExtraFields == nil { + responsesMetadata.ExtraFields = make(map[string]json.RawMessage) + } + maps.Copy(responsesMetadata.ExtraFields, sink.ExtraFields) +} + func (o responsesLanguageModel) Model() string { return o.modelID } @@ -773,12 +806,13 @@ func toResponsesTools(tools []fantasy.Tool, toolChoice *fantasy.ToolChoice, opti } func (o responsesLanguageModel) Generate(ctx context.Context, call fantasy.Call) (*fantasy.Response, error) { + capture := responseCapture{} params, warnings, err := o.prepareParams(call) if err != nil { return nil, err } - response, err := o.client.Responses.New(ctx, *params, append(callUARequestOptions(call), callHeadersRequestOptions(call)...)...) + response, err := o.client.Responses.New(ctx, *params, capture.requestOptions(o.headerFunc, append(callUARequestOptions(call), callHeadersRequestOptions(call)...))...) if err != nil { return nil, toProviderErr(err) } @@ -913,11 +947,14 @@ func (o responsesLanguageModel) Generate(ctx context.Context, call fantasy.Call) } } + metadata := responsesProviderMetadata(response.ID) + o.applyHeaders(capture.header(), &metadata) + return &fantasy.Response{ Content: content, Usage: usage, FinishReason: finishReason, - ProviderMetadata: responsesProviderMetadata(response.ID), + ProviderMetadata: metadata, Warnings: warnings, }, nil } @@ -943,12 +980,13 @@ func mapResponsesFinishReason(reason string, hasFunctionCall bool) fantasy.Finis } func (o responsesLanguageModel) Stream(ctx context.Context, call fantasy.Call) (fantasy.StreamResponse, error) { + capture := responseCapture{} params, warnings, err := o.prepareParams(call) if err != nil { return nil, err } - stream := o.client.Responses.NewStreaming(ctx, *params, append(callUARequestOptions(call), callHeadersRequestOptions(call)...)...) + stream := o.client.Responses.NewStreaming(ctx, *params, capture.requestOptions(o.headerFunc, append(callUARequestOptions(call), callHeadersRequestOptions(call)...))...) finishReason := fantasy.FinishReasonUnknown var usage fantasy.Usage @@ -1276,11 +1314,13 @@ func (o responsesLanguageModel) Stream(ctx context.Context, call fantasy.Call) ( }) } + metadata := responsesProviderMetadata(responseID) + o.applyHeaders(capture.header(), &metadata) yield(fantasy.StreamPart{ Type: fantasy.StreamPartTypeFinish, Usage: usage, FinishReason: finishReason, - ProviderMetadata: responsesProviderMetadata(responseID), + ProviderMetadata: metadata, }) }, nil } @@ -1437,7 +1477,8 @@ func (o responsesLanguageModel) generateObjectWithJSONMode(ctx context.Context, } // Make request - response, err := o.client.Responses.New(ctx, *params, append(objectCallUARequestOptions(call), objectCallHeadersRequestOptions(call)...)...) + capture := responseCapture{} + response, err := o.client.Responses.New(ctx, *params, capture.requestOptions(o.headerFunc, append(objectCallUARequestOptions(call), objectCallHeadersRequestOptions(call)...))...) if err != nil { return nil, toProviderErr(err) } @@ -1497,13 +1538,16 @@ func (o responsesLanguageModel) generateObjectWithJSONMode(ctx context.Context, return nil, err } + metadata := responsesProviderMetadata(response.ID) + o.applyHeaders(capture.header(), &metadata) + return &fantasy.ObjectResponse{ Object: obj, RawText: jsonText, Usage: usage, FinishReason: finishReason, Warnings: warnings, - ProviderMetadata: responsesProviderMetadata(response.ID), + ProviderMetadata: metadata, }, nil } @@ -1540,7 +1584,8 @@ func (o responsesLanguageModel) streamObjectWithJSONMode(ctx context.Context, ca Format: responses.ResponseFormatTextConfigParamOfJSONSchema(schemaName, jsonSchemaMap), } - stream := o.client.Responses.NewStreaming(ctx, *params, append(objectCallUARequestOptions(call), objectCallHeadersRequestOptions(call)...)...) + capture := responseCapture{} + stream := o.client.Responses.NewStreaming(ctx, *params, capture.requestOptions(o.headerFunc, append(objectCallUARequestOptions(call), objectCallHeadersRequestOptions(call)...))...) return func(yield func(fantasy.ObjectStreamPart) bool) { if len(warnings) > 0 { @@ -1675,11 +1720,13 @@ func (o responsesLanguageModel) streamObjectWithJSONMode(ctx context.Context, ca // Final validation and emit if lastParsedObject != nil { + metadata := responsesProviderMetadata(responseID) + o.applyHeaders(capture.header(), &metadata) yield(fantasy.ObjectStreamPart{ Type: fantasy.ObjectStreamPartTypeFinish, Usage: usage, FinishReason: finishReason, - ProviderMetadata: responsesProviderMetadata(responseID), + ProviderMetadata: metadata, }) } else { // No object was generated diff --git a/providers/openai/responses_options.go b/providers/openai/responses_options.go index 9d74411a0..daca70b10 100644 --- a/providers/openai/responses_options.go +++ b/providers/openai/responses_options.go @@ -53,6 +53,22 @@ func init() { // The ResponseID can be used as PreviousResponseID in follow-up requests to chain responses. type ResponsesProviderMetadata struct { ResponseID string `json:"response_id"` + // ExtraFields holds non-standard response fields, including any + // captured via [LanguageModelHeaderFunc]. + ExtraFields map[string]json.RawMessage `json:"extra_fields,omitempty"` +} + +// ExtraField unmarshals the extra field with the given key, if present, +// into target. +func (m *ResponsesProviderMetadata) ExtraField(key string, target any) bool { + if m == nil || m.ExtraFields == nil { + return false + } + raw, ok := m.ExtraFields[key] + if !ok { + return false + } + return json.Unmarshal(raw, target) == nil } var _ fantasy.ProviderOptionsData = (*ResponsesProviderMetadata)(nil) diff --git a/providers/openaicompat/header_test.go b/providers/openaicompat/header_test.go new file mode 100644 index 000000000..f10da5daa --- /dev/null +++ b/providers/openaicompat/header_test.go @@ -0,0 +1,343 @@ +package openaicompat + +import ( + "context" + "encoding/json" + "fmt" + "io" + "net/http" + "net/http/httptest" + "strconv" + "strings" + "testing" + "time" + + "charm.land/fantasy" + "charm.land/fantasy/providers/openai" + "github.com/stretchr/testify/require" +) + +// prismHeaderFunc copies the Hyper Prism router headers and trailers into +// the provider metadata extra fields, mirroring how Crush consumes them. +func prismHeaderFunc(header http.Header, metadata *openai.ProviderMetadata) { + for key, field := range map[string]string{ + "X-Prism-Model-Id": "x-prism-model-id", + "X-Prism-Model-Name": "x-prism-model-name", + "X-Prism-Hypercredit-Savings": "x-prism-hypercredit-savings", + } { + if v := header.Get(key); v != "" { + if metadata.ExtraFields == nil { + metadata.ExtraFields = make(map[string]json.RawMessage) + } + metadata.ExtraFields[field] = json.RawMessage(strconv.Quote(v)) + } + } +} + +// servePrism answers both streaming and non-streaming chat completion +// requests with canned payloads carrying the Prism router headers. +func servePrism(t *testing.T) *httptest.Server { + t.Helper() + srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("X-Prism-Model-Id", "prism-42") + w.Header().Set("X-Prism-Model-Name", "GPT-5.2 Codex Max") + var reqShape struct { + Stream bool `json:"stream"` + } + body, _ := io.ReadAll(r.Body) + _ = json.Unmarshal(body, &reqShape) + if reqShape.Stream { + w.Header().Set("Content-Type", "text/event-stream") + _, _ = w.Write([]byte("data: {\"id\":\"z\",\"created\":1,\"model\":\"prism\",\"choices\":[{\"index\":0,\"delta\":{\"role\":\"assistant\",\"content\":\"Hi\"},\"finish_reason\":null}]}\n\n")) + _, _ = w.Write([]byte("data: {\"id\":\"z\",\"created\":1,\"model\":\"prism\",\"choices\":[{\"index\":0,\"delta\":{},\"finish_reason\":\"stop\"}]}\n\n")) + _, _ = w.Write([]byte("data: {\"id\":\"z\",\"created\":1,\"model\":\"prism\",\"choices\":[],\"usage\":{\"prompt_tokens\":1,\"completion_tokens\":1,\"total_tokens\":2}}\n\n")) + _, _ = w.Write([]byte("data: [DONE]\n\n")) + return + } + w.Header().Set("Content-Type", "application/json") + _, _ = w.Write([]byte(`{"id":"z","created":1,"model":"prism","object":"chat.completion","choices":[{"index":0,"message":{"role":"assistant","content":"Hi"},"finish_reason":"stop"}],"usage":{"prompt_tokens":1,"completion_tokens":1,"total_tokens":2}}`)) + })) + t.Cleanup(srv.Close) + return srv +} + +func prompt() fantasy.Prompt { + return fantasy.Prompt{ + { + Role: fantasy.MessageRoleUser, + Content: []fantasy.MessagePart{fantasy.TextPart{Text: "Hello"}}, + }, + } +} + +func prismProvider(t *testing.T, srv *httptest.Server) fantasy.Provider { + t.Helper() + provider, err := New( + WithBaseURL(srv.URL), + WithAPIKey("test"), + WithLanguageModelOptions(openai.WithLanguageModelHeaderFunc(prismHeaderFunc)), + ) + require.NoError(t, err) + return provider +} + +func requirePrismFields(t *testing.T, metadata fantasy.ProviderMetadata) { + t.Helper() + data, ok := metadata[openai.Name] + require.True(t, ok, "expected openai provider metadata") + providerMetadata, ok := data.(*openai.ProviderMetadata) + require.True(t, ok, "expected *openai.ProviderMetadata") + require.NotNil(t, providerMetadata.ExtraFields) + + var modelID string + ok = providerMetadata.ExtraField("x-prism-model-id", &modelID) + require.True(t, ok) + require.Equal(t, "prism-42", modelID) + + var modelName string + ok = providerMetadata.ExtraField("x-prism-model-name", &modelName) + require.True(t, ok) + require.Equal(t, "GPT-5.2 Codex Max", modelName) +} + +func TestResponseHeaders_Generate(t *testing.T) { + t.Parallel() + srv := servePrism(t) + provider := prismProvider(t, srv) + lm, err := provider.LanguageModel(context.Background(), "prism") + require.NoError(t, err) + + response, err := lm.Generate(context.Background(), fantasy.Call{Prompt: prompt()}) + require.NoError(t, err) + requirePrismFields(t, response.ProviderMetadata) +} + +func TestResponseHeaders_Stream(t *testing.T) { + t.Parallel() + srv := servePrism(t) + provider := prismProvider(t, srv) + lm, err := provider.LanguageModel(context.Background(), "prism") + require.NoError(t, err) + + stream, err := lm.Stream(context.Background(), fantasy.Call{Prompt: prompt()}) + require.NoError(t, err) + var finish *fantasy.StreamPart + for part := range stream { + if part.Type == fantasy.StreamPartTypeFinish { + finish = &part + } + } + require.NotNil(t, finish, "expected a finish part") + requirePrismFields(t, finish.ProviderMetadata) +} + +func TestResponseHeaders_StreamWithoutUsage(t *testing.T) { + t.Parallel() + // A stream whose chunks carry no usage leaves the stream metadata nil + // after the loop; the header func must still surface the headers. + srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("X-Prism-Model-Id", "prism-42") + w.Header().Set("X-Prism-Model-Name", "GPT-5.2 Codex Max") + w.Header().Set("Content-Type", "text/event-stream") + _, _ = w.Write([]byte("data: {\"id\":\"z\",\"created\":1,\"model\":\"prism\",\"choices\":[{\"index\":0,\"delta\":{\"role\":\"assistant\",\"content\":\"Hi\"},\"finish_reason\":null}]}\n\n")) + _, _ = w.Write([]byte("data: {\"id\":\"z\",\"created\":1,\"model\":\"prism\",\"choices\":[{\"index\":0,\"delta\":{},\"finish_reason\":\"stop\"}]}\n\n")) + _, _ = w.Write([]byte("data: [DONE]\n\n")) + })) + t.Cleanup(srv.Close) + provider := prismProvider(t, srv) + lm, err := provider.LanguageModel(context.Background(), "prism") + require.NoError(t, err) + + stream, err := lm.Stream(context.Background(), fantasy.Call{Prompt: prompt()}) + require.NoError(t, err) + var finish *fantasy.StreamPart + for part := range stream { + if part.Type == fantasy.StreamPartTypeFinish { + finish = &part + } + } + require.NotNil(t, finish) + require.Zero(t, finish.Usage.TotalTokens) + requirePrismFields(t, finish.ProviderMetadata) +} + +// serveResponses answers Responses API requests (streaming and +// non-streaming) with canned payloads carrying the Prism router headers. +func serveResponses(t *testing.T) *httptest.Server { + t.Helper() + const responseBody = `{"id":"resp_1","object":"response","created_at":1,"status":"completed","model":"gpt-5","output":[{"id":"msg_1","type":"message","role":"assistant","status":"completed","content":[{"type":"output_text","text":"Hi","annotations":[]}]}],"usage":{"input_tokens":1,"output_tokens":1,"output_tokens_details":{},"total_tokens":2}}` + srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("X-Prism-Model-Id", "prism-42") + w.Header().Set("X-Prism-Model-Name", "GPT-5.2 Codex Max") + var reqShape struct { + Stream bool `json:"stream"` + } + body, _ := io.ReadAll(r.Body) + _ = json.Unmarshal(body, &reqShape) + if reqShape.Stream { + w.Header().Set("Content-Type", "text/event-stream") + rc := http.NewResponseController(w) + events := []string{ + `{"type":"response.created","response":` + responseBody + `}`, + `{"type":"response.output_item.added","output_index":0,"item":{"id":"msg_1","type":"message","role":"assistant","status":"in_progress","content":[]}}`, + `{"type":"response.output_text.delta","item_id":"msg_1","output_index":0,"content_index":0,"delta":"Hi"}`, + `{"type":"response.completed","response":` + responseBody + `}`, + } + for _, event := range events { + fmt.Fprintf(w, "event: %s\ndata: %s\n\n", strings.SplitN(event, ":", 2)[0][2:], event) + _ = rc.Flush() + } + return + } + w.Header().Set("Content-Type", "application/json") + _, _ = w.Write([]byte(responseBody)) + })) + t.Cleanup(srv.Close) + return srv +} + +func prismResponsesProvider(t *testing.T, srv *httptest.Server) fantasy.Provider { + t.Helper() + provider, err := New( + WithBaseURL(srv.URL), + WithAPIKey("test"), + WithUseResponsesAPI(), + WithLanguageModelOptions(openai.WithLanguageModelHeaderFunc(prismHeaderFunc)), + ) + require.NoError(t, err) + return provider +} + +func requirePrismResponsesFields(t *testing.T, metadata fantasy.ProviderMetadata) { + t.Helper() + data, ok := metadata[openai.Name] + require.True(t, ok, "expected openai provider metadata") + responsesMetadata, ok := data.(*openai.ResponsesProviderMetadata) + require.True(t, ok, "expected *openai.ResponsesProviderMetadata, got %T", data) + require.NotNil(t, responsesMetadata.ExtraFields) + + var modelID string + ok = responsesMetadata.ExtraField("x-prism-model-id", &modelID) + require.True(t, ok) + require.Equal(t, "prism-42", modelID) + + var modelName string + ok = responsesMetadata.ExtraField("x-prism-model-name", &modelName) + require.True(t, ok) + require.Equal(t, "GPT-5.2 Codex Max", modelName) +} + +func TestResponseHeaders_ResponsesGenerate(t *testing.T) { + t.Parallel() + srv := serveResponses(t) + provider := prismResponsesProvider(t, srv) + lm, err := provider.LanguageModel(context.Background(), "gpt-5") + require.NoError(t, err) + + response, err := lm.Generate(context.Background(), fantasy.Call{Prompt: prompt()}) + require.NoError(t, err) + requirePrismResponsesFields(t, response.ProviderMetadata) +} + +func TestResponseHeaders_ResponsesStream(t *testing.T) { + t.Parallel() + srv := serveResponses(t) + provider := prismResponsesProvider(t, srv) + lm, err := provider.LanguageModel(context.Background(), "gpt-5") + require.NoError(t, err) + + stream, err := lm.Stream(context.Background(), fantasy.Call{Prompt: prompt()}) + require.NoError(t, err) + var finish *fantasy.StreamPart + for part := range stream { + if part.Type == fantasy.StreamPartTypeFinish { + finish = &part + } + } + require.NotNil(t, finish, "expected a finish part") + requirePrismResponsesFields(t, finish.ProviderMetadata) +} + +// servePrismTrailers answers chat completion requests carrying the Prism +// savings as declared HTTP trailers, which net/http populates on the +// client only after the response body is fully consumed. +func servePrismTrailers(t *testing.T) *httptest.Server { + t.Helper() + srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + var reqShape struct { + Stream bool `json:"stream"` + } + body, _ := io.ReadAll(r.Body) + _ = json.Unmarshal(body, &reqShape) + w.Header().Set("Trailer", "X-Prism-Hypercredit-Savings") + if reqShape.Stream { + w.Header().Set("Content-Type", "text/event-stream") + rc := http.NewResponseController(w) + _, _ = w.Write([]byte("data: {\"id\":\"z\",\"created\":1,\"model\":\"prism\",\"choices\":[{\"index\":0,\"delta\":{\"role\":\"assistant\",\"content\":\"Hi\"},\"finish_reason\":null}]}\n\n")) + _ = rc.Flush() + _, _ = w.Write([]byte("data: {\"id\":\"z\",\"created\":1,\"model\":\"prism\",\"choices\":[{\"index\":0,\"delta\":{},\"finish_reason\":\"stop\"}]}\n\n")) + _ = rc.Flush() + _, _ = w.Write([]byte("data: {\"id\":\"z\",\"created\":1,\"model\":\"prism\",\"choices\":[],\"usage\":{\"prompt_tokens\":1,\"completion_tokens\":1,\"total_tokens\":2}}\n\n")) + _ = rc.Flush() + _, _ = w.Write([]byte("data: [DONE]\n\n")) + _ = rc.Flush() + // The savings trailer is written only after usage is final, which + // on a real server happens after the DONE sentinel has been sent: + // pricing and stats run in between. Give the client time to observe + // DONE first, so the test reproduces a trailer that arrives after + // the stream's terminal event. + time.Sleep(100 * time.Millisecond) + w.Header().Set("X-Prism-Hypercredit-Savings", "1.5") + return + } + w.Header().Set("Content-Type", "application/json") + _, _ = w.Write([]byte(`{"id":"z","created":1,"model":"prism","object":"chat.completion","choices":[{"index":0,"message":{"role":"assistant","content":"Hi"},"finish_reason":"stop"}],"usage":{"prompt_tokens":1,"completion_tokens":1,"total_tokens":2}}`)) + w.Header().Set("X-Prism-Hypercredit-Savings", "1.5") + })) + t.Cleanup(srv.Close) + return srv +} + +func requirePrismTrailerField(t *testing.T, metadata fantasy.ProviderMetadata) { + t.Helper() + data, ok := metadata[openai.Name] + require.True(t, ok, "expected openai provider metadata") + providerMetadata, ok := data.(*openai.ProviderMetadata) + require.True(t, ok, "expected *openai.ProviderMetadata") + + var savings string + ok = providerMetadata.ExtraField("x-prism-hypercredit-savings", &savings) + require.True(t, ok) + require.Equal(t, "1.5", savings) +} + +func TestResponseTrailers_Generate(t *testing.T) { + t.Parallel() + srv := servePrismTrailers(t) + provider := prismProvider(t, srv) + lm, err := provider.LanguageModel(context.Background(), "prism") + require.NoError(t, err) + + response, err := lm.Generate(context.Background(), fantasy.Call{Prompt: prompt()}) + require.NoError(t, err) + requirePrismTrailerField(t, response.ProviderMetadata) +} + +func TestResponseTrailers_Stream(t *testing.T) { + t.Parallel() + srv := servePrismTrailers(t) + provider := prismProvider(t, srv) + lm, err := provider.LanguageModel(context.Background(), "prism") + require.NoError(t, err) + + stream, err := lm.Stream(context.Background(), fantasy.Call{Prompt: prompt()}) + require.NoError(t, err) + var finish *fantasy.StreamPart + for part := range stream { + if part.Type == fantasy.StreamPartTypeFinish { + finish = &part + } + } + require.NotNil(t, finish, "expected a finish part") + requirePrismTrailerField(t, finish.ProviderMetadata) +} From cb378300dd77e7b434d6806b278dc87857a15fd6 Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Fri, 4 Sep 2026 20:09:42 -0300 Subject: [PATCH 105/156] v0.43.0 --- version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.txt b/version.txt index 339fd080a..8298bb08b 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -0.42.1 +0.43.0 From cfb053045bb1569e58599f86acbb847ec9cd7d3a Mon Sep 17 00:00:00 2001 From: Drew Smirnoff Date: Mon, 7 Sep 2026 17:54:22 +0400 Subject: [PATCH 106/156] fix: gpt series 6+ (#354) Signed-off-by: drew --- providers/openai/responses_options.go | 13 +++-- providers/openai/responses_options_test.go | 60 ++++++++++++++++++++++ 2 files changed, 69 insertions(+), 4 deletions(-) create mode 100644 providers/openai/responses_options_test.go diff --git a/providers/openai/responses_options.go b/providers/openai/responses_options.go index daca70b10..664113624 100644 --- a/providers/openai/responses_options.go +++ b/providers/openai/responses_options.go @@ -3,6 +3,7 @@ package openai import ( "encoding/json" + "regexp" "slices" "strings" @@ -295,18 +296,22 @@ func ParseResponsesOptions(data map[string]any) (*ResponsesProviderOptions, erro return &options, nil } +// responsesGenerationPattern matches the model generations that only +// speak the Responses API: gpt-4 and gpt-5 today, the newer generations +// as they ship (gpt-6, gpt-10, ...), and never the legacy gpt-3 family +// that predates it. +var responsesGenerationPattern = regexp.MustCompile(`gpt-(?:[4-9]|[1-9]\d)`) + // IsResponsesModel checks if a model ID is a Responses API model for OpenAI. func IsResponsesModel(modelID string) bool { return slices.Contains(responsesModelIDs, modelID) || - strings.Contains(strings.ToLower(modelID), "gpt-4") || - strings.Contains(strings.ToLower(modelID), "gpt-5") + responsesGenerationPattern.MatchString(strings.ToLower(modelID)) } // IsResponsesReasoningModel checks if a model ID is a Responses API reasoning model for OpenAI. func IsResponsesReasoningModel(modelID string) bool { return slices.Contains(responsesReasoningModelIDs, modelID) || - strings.Contains(strings.ToLower(modelID), "gpt-4") || - strings.Contains(strings.ToLower(modelID), "gpt-5") + responsesGenerationPattern.MatchString(strings.ToLower(modelID)) } // SearchContextSize controls how much context window space the diff --git a/providers/openai/responses_options_test.go b/providers/openai/responses_options_test.go new file mode 100644 index 000000000..c187a661c --- /dev/null +++ b/providers/openai/responses_options_test.go @@ -0,0 +1,60 @@ +package openai + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestIsResponsesModel(t *testing.T) { + tests := []struct { + modelID string + want bool + }{ + // Explicitly listed models. + {"gpt-4.1", true}, + {"gpt-4o-mini", true}, + {"chatgpt-4o-latest", true}, + {"o3", true}, + {"gpt-oss-120b", true}, + + // Generations caught by the pattern, listed or not. + {"gpt-5", true}, + {"gpt-5.1-codex", true}, + {"gpt-6-astra", true}, + {"GPT-6-ASTRA", true}, + {"gpt-10-turbo", true}, + + // Everything predating the Responses API stays on chat + // completions. + {"gpt-3.5-turbo-1106", true}, // in the explicit list + {"gpt-3-turbo-instruct", false}, + {"babbage-002", false}, + {"davinci-002", false}, + {"some-custom-model", false}, + } + + for _, tt := range tests { + assert.Equal(t, tt.want, IsResponsesModel(tt.modelID), tt.modelID) + } +} + +func TestIsResponsesReasoningModel(t *testing.T) { + tests := []struct { + modelID string + want bool + }{ + {"gpt-5.1-codex", true}, + {"gpt-6-astra", true}, + {"o4-mini", true}, + {"gpt-oss-120b", true}, + + {"gpt-4.1-mini", true}, // gpt-4 matches, as before + {"gpt-3-turbo-instruct", false}, + {"some-custom-model", false}, + } + + for _, tt := range tests { + assert.Equal(t, tt.want, IsResponsesReasoningModel(tt.modelID), tt.modelID) + } +} From 8a31daebf0dcd4a9a453d5de0c04497f6ecdf3fc Mon Sep 17 00:00:00 2001 From: drew Date: Mon, 7 Sep 2026 17:55:08 +0400 Subject: [PATCH 107/156] v0.43.1 Signed-off-by: drew From 1dada21b01e8fd8db05e8a784f52e2536fe20aaf Mon Sep 17 00:00:00 2001 From: Hua Guang Deng <416854993@qq.com> Date: Fri, 11 Sep 2026 04:59:46 +0800 Subject: [PATCH 108/156] fix(retry): preserve fractional retry header delays (#356) --- retry.go | 4 ++-- retry_test.go | 62 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+), 2 deletions(-) diff --git a/retry.go b/retry.go index 92e2e0d41..67dd469ef 100644 --- a/retry.go +++ b/retry.go @@ -28,14 +28,14 @@ func getRetryDelayInMs(err error, exponentialBackoffDelay time.Duration) time.Du // retry-ms is more precise than retry-after and used by e.g. OpenAI if retryAfterMs, exists := headers["retry-after-ms"]; exists { if timeoutMs, err := strconv.ParseFloat(retryAfterMs, 64); err == nil { - ms = time.Duration(timeoutMs) * time.Millisecond + ms = time.Duration(timeoutMs * float64(time.Millisecond)) } } // About the Retry-After header: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Retry-After if retryAfter, exists := headers["retry-after"]; exists && ms == 0 { if timeoutSeconds, err := strconv.ParseFloat(retryAfter, 64); err == nil { - ms = time.Duration(timeoutSeconds) * time.Second + ms = time.Duration(timeoutSeconds * float64(time.Second)) } else { // Try parsing as HTTP date if t, err := time.Parse(time.RFC1123, retryAfter); err == nil { diff --git a/retry_test.go b/retry_test.go index d2a58326b..ad1b7c429 100644 --- a/retry_test.go +++ b/retry_test.go @@ -412,3 +412,65 @@ func TestIsAuthError(t *testing.T) { t.Error("expected an AuthError-flagged error to be an auth error") } } + +func TestGetRetryDelayInMs(t *testing.T) { + t.Parallel() + const backoff = 5 * time.Second + for _, tt := range []struct { + name string + headers map[string]string + want time.Duration + }{ + {"fractional seconds", map[string]string{"retry-after": "1.5"}, 1500 * time.Millisecond}, + {"subsecond delay", map[string]string{"retry-after": "0.5"}, 500 * time.Millisecond}, + {"fractional milliseconds", map[string]string{"retry-after-ms": "1.5"}, 1500 * time.Microsecond}, + {"submillisecond delay", map[string]string{"retry-after-ms": "0.5"}, 500 * time.Microsecond}, + {"milliseconds take precedence", map[string]string{"retry-after-ms": "0.5", "retry-after": "2"}, 500 * time.Microsecond}, + {"integer seconds", map[string]string{"retry-after": "2"}, 2 * time.Second}, + {"integer milliseconds", map[string]string{"retry-after-ms": "250"}, 250 * time.Millisecond}, + {"invalid milliseconds fall back to seconds", map[string]string{"retry-after-ms": "invalid", "retry-after": "1.5"}, 1500 * time.Millisecond}, + {"missing headers", nil, backoff}, + {"invalid delay", map[string]string{"retry-after": "invalid"}, backoff}, + {"zero delay", map[string]string{"retry-after": "0"}, backoff}, + {"negative delay", map[string]string{"retry-after": "-1"}, backoff}, + {"excessive delay", map[string]string{"retry-after": "60"}, backoff}, + } { + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + err := &ProviderError{StatusCode: 429, ResponseHeaders: tt.headers} + if got := getRetryDelayInMs(err, backoff); got != tt.want { + t.Errorf("getRetryDelayInMs() = %v, want %v", got, tt.want) + } + }) + } +} + +func TestRetryWithExponentialBackoff_FractionalRetryHeader(t *testing.T) { + t.Parallel() + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + var delay time.Duration + attempts := 0 + retry := RetryWithExponentialBackoffRespectingRetryHeaders[int](RetryOptions{ + MaxRetries: 1, + InitialDelayIn: 5 * time.Second, + BackoffFactor: 2, + OnRetry: func(_ *ProviderError, d time.Duration) { + delay = d + cancel() // Observe the selected delay without sleeping or making another request. + }, + }) + _, err := retry(ctx, func() (int, error) { + attempts++ + return 0, &ProviderError{StatusCode: 429, ResponseHeaders: map[string]string{"retry-after": "1.5"}} + }) + if delay != 1500*time.Millisecond { + t.Errorf("retry delay = %v, want 1.5s", delay) + } + if !errors.Is(err, context.Canceled) { + t.Errorf("error = %v, want context.Canceled", err) + } + if attempts != 1 { + t.Errorf("attempts = %d, want 1", attempts) + } +} From 3ed8b4948dd8a75c3c5c3c8b9fb26c9948dbd4de Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Sat, 12 Sep 2026 08:59:24 -0400 Subject: [PATCH 109/156] openaicompat: drop reasoning-only assistant turns to fix regression MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A turn canceled while the model is still thinking lands in history with reasoning as its only part. On the wire it carries neither content nor tool calls, which strict OpenAI-compatible upstreams reject ("content or tool_calls must be set"), so every subsequent request fails once such a turn is in history (charmbracelet/crush#3794). Reasoning-only turns now fall through the empty-assistant drop, as before v0.42.0. The DeepSeek/Kimi replay contract only requires reasoning_content on turns that also carry content or tool calls, which still round-trip unchanged. 💘 Generated with Crush Assisted-by: Crush:kimi-k3 --- .../openaicompat/language_model_hooks.go | 14 +-- providers/openaicompat/openaicompat_test.go | 95 +++++++++++++++---- 2 files changed, 85 insertions(+), 24 deletions(-) diff --git a/providers/openaicompat/language_model_hooks.go b/providers/openaicompat/language_model_hooks.go index 353f28818..c0e940682 100644 --- a/providers/openaicompat/language_model_hooks.go +++ b/providers/openaicompat/language_model_hooks.go @@ -587,11 +587,13 @@ func hasVisibleCompatAssistantContent(msg *openaisdk.ChatCompletionAssistantMess if len(msg.ToolCalls) > 0 { return true } - // A reasoning-only turn is visible: reasoning_content must round-trip - // for DeepSeek-family replay, and dropping the turn breaks the - // conversation's message ordering. - if _, ok := msg.ExtraFields()["reasoning_content"]; ok { - return true - } + // A reasoning-only turn is not visible: it carries neither content nor + // tool calls, and strict OpenAI-compatible upstreams reject such + // messages outright ("content or tool_calls must be set"), failing every + // subsequent request once one lands in history (charmbracelet/crush#3794). + // The DeepSeek/Kimi replay contract only requires reasoning_content on + // turns that also carry content or tool calls, which pass the checks + // above; a bare reasoning turn is a truncated or canceled turn with no + // completion to resume from, so dropping it is safe. return false } diff --git a/providers/openaicompat/openaicompat_test.go b/providers/openaicompat/openaicompat_test.go index e91b7b26b..dab71f44b 100644 --- a/providers/openaicompat/openaicompat_test.go +++ b/providers/openaicompat/openaicompat_test.go @@ -5,6 +5,7 @@ import ( "testing" "charm.land/fantasy" + "github.com/openai/openai-go/v3/packages/param" "github.com/stretchr/testify/require" ) @@ -62,7 +63,7 @@ func TestToPromptFunc_ReasoningContent(t *testing.T) { require.Equal(t, "What about 3+3?", msg3.Content.OfString.Value) }) - t.Run("should handle assistant messages with only reasoning content", func(t *testing.T) { + t.Run("should drop assistant messages with only reasoning content", func(t *testing.T) { t.Parallel() prompt := fantasy.Prompt{ @@ -82,18 +83,17 @@ func TestToPromptFunc_ReasoningContent(t *testing.T) { messages, warnings := ToPromptFunc(prompt, "", "") - // Reasoning-only turns are visible content: reasoning_content must - // round-trip for DeepSeek-family replay (CHARM-2020). - require.Empty(t, warnings) - require.Len(t, messages, 2) + // A reasoning-only turn carries neither content nor tool calls, and + // strict upstreams reject that shape (charmbracelet/crush#3794). + // The DeepSeek-family replay contract only covers turns that also + // carry content or tool calls, so dropping is safe. + require.Len(t, warnings, 1) + require.Contains(t, warnings[0].Message, "dropping empty assistant message") + require.Len(t, messages, 1) msg := messages[0].OfUser require.NotNil(t, msg) require.Equal(t, "Hello", msg.Content.OfString.Value) - - assistantMsg := messages[1].OfAssistant - require.NotNil(t, assistantMsg) - require.Equal(t, "Internal reasoning only...", assistantMsg.ExtraFields()["reasoning_content"]) }) t.Run("should not add reasoning_content to messages without reasoning", func(t *testing.T) { @@ -980,10 +980,13 @@ func TestToPromptFunc_MixedTextSegmentOrder(t *testing.T) { require.Equal(t, map[string]any{"cache_control": map[string]string{"type": "ephemeral"}}, blocks[1].OfText.ExtraFields()) } -// A reasoning-only assistant turn must survive: reasoning_content is -// visible content. Dropping it breaks DeepSeek's replay contract on -// truncated thinking turns. -func TestToPromptFunc_ReasoningOnlyTurnKept(t *testing.T) { +// A reasoning-only assistant turn must be dropped: it serializes with +// neither content nor tool calls, which strict OpenAI-compatible upstreams +// reject ("content or tool_calls must be set"), locking the session once +// such a turn lands in history (charmbracelet/crush#3794). DeepSeek's +// replay contract only requires reasoning_content on turns that also carry +// content or tool calls; those are unaffected. +func TestToPromptFunc_ReasoningOnlyTurnDropped(t *testing.T) { t.Parallel() prompt := fantasy.Prompt{ @@ -991,12 +994,68 @@ func TestToPromptFunc_ReasoningOnlyTurnKept(t *testing.T) { {Role: fantasy.MessageRoleAssistant, Content: []fantasy.MessagePart{ fantasy.ReasoningPart{Text: "thinking…"}, }}, + {Role: fantasy.MessageRoleUser, Content: []fantasy.MessagePart{fantasy.TextPart{Text: "still there?"}}}, } messages, warnings := ToPromptFunc(prompt, "", "") - require.Empty(t, warnings) - require.Len(t, messages, 2, "reasoning-only assistant turn must not be dropped") - msg := messages[1].OfAssistant - require.NotNil(t, msg) - require.Equal(t, "thinking…", msg.ExtraFields()["reasoning_content"]) + require.Len(t, warnings, 1) + require.Contains(t, warnings[0].Message, "dropping empty assistant message") + require.Len(t, messages, 2, "reasoning-only assistant turn must be dropped") + for _, m := range messages { + require.NotNil(t, m.OfUser, "only user messages remain") + } +} + +// Regression test for charmbracelet/crush#3794: a turn canceled while the +// model was still thinking persists as an assistant message whose only part +// is reasoning. Re-sent in history it serializes with neither content nor +// tool calls, which strict upstreams reject ("Invalid assistant message: +// content or tool_calls must be set"), failing every later request. The +// canceled turn must be dropped, while a completed reasoning+tool-call turn +// in the same history keeps its reasoning_content (DeepSeek/Kimi replay). +func TestToPromptFunc_CanceledThinkingTurnDropped(t *testing.T) { + t.Parallel() + + prompt := fantasy.Prompt{ + {Role: fantasy.MessageRoleUser, Content: []fantasy.MessagePart{fantasy.TextPart{Text: "check the date"}}}, + {Role: fantasy.MessageRoleAssistant, Content: []fantasy.MessagePart{ + fantasy.ReasoningPart{Text: "I should call get_date."}, + fantasy.ToolCallPart{ToolCallID: "call_1", ToolName: "get_date", Input: "{}"}, + }}, + {Role: fantasy.MessageRoleTool, Content: []fantasy.MessagePart{ + fantasy.ToolResultPart{ + ToolCallID: "call_1", + Output: fantasy.ToolResultOutputContentText{Text: "2026-09-12"}, + }, + }}, + {Role: fantasy.MessageRoleUser, Content: []fantasy.MessagePart{fantasy.TextPart{Text: "and the weather?"}}}, + {Role: fantasy.MessageRoleAssistant, Content: []fantasy.MessagePart{ + fantasy.ReasoningPart{Text: "Thinking about weather…"}, // canceled mid-thought + }}, + {Role: fantasy.MessageRoleUser, Content: []fantasy.MessagePart{fantasy.TextPart{Text: "are you there?"}}}, + } + + messages, warnings := ToPromptFunc(prompt, "", "") + require.Len(t, warnings, 1) + require.Contains(t, warnings[0].Message, "dropping empty assistant message") + + // user, assistant(tool call), tool, user, user — the canceled turn is gone. + require.Len(t, messages, 5) + + assistant := messages[1].OfAssistant + require.NotNil(t, assistant) + require.Len(t, assistant.ToolCalls, 1) + require.Equal(t, "I should call get_date.", assistant.ExtraFields()["reasoning_content"], + "completed tool-call turns keep reasoning_content") + + // No assistant message may go out with neither content nor tool calls. + for i, m := range messages { + if m.OfAssistant == nil { + continue + } + valid := !param.IsOmitted(m.OfAssistant.Content.OfString) || + len(m.OfAssistant.Content.OfArrayOfContentParts) > 0 || + len(m.OfAssistant.ToolCalls) > 0 + require.True(t, valid, "assistant message %d has neither content nor tool calls", i) + } } From ea8ba4fcbd65b45311be26df88c61d01b64cc618 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Sat, 12 Sep 2026 20:56:39 -0400 Subject: [PATCH 110/156] openaicompat: add deepseek and kimi regression test MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add a validating fake upstream that rejects the two failure shapes with hard 400s, the way DeepSeek-class servers do: assistant messages with neither content nor tool calls (crush#3794), and tool-call turns missing reasoning_content when tools are present (crush#2696). A clean multi-step tool loop and a canceled-mid-thinking replay both run against it, so a regression in either direction fails CI. Verified fail-first on v0.43.1. 💘 Generated with Crush Assisted-by: Crush:kimi-k3 --- .../openaicompat/strict_upstream_test.go | 243 ++++++++++++++++++ 1 file changed, 243 insertions(+) create mode 100644 providers/openaicompat/strict_upstream_test.go diff --git a/providers/openaicompat/strict_upstream_test.go b/providers/openaicompat/strict_upstream_test.go new file mode 100644 index 000000000..3f702b6fd --- /dev/null +++ b/providers/openaicompat/strict_upstream_test.go @@ -0,0 +1,243 @@ +package openaicompat + +import ( + "context" + "encoding/json" + "fmt" + "io" + "net/http" + "net/http/httptest" + "strings" + "testing" + + "charm.land/fantasy" + "github.com/stretchr/testify/require" +) + +// This file pins the DeepSeek/Kimi replay contract against a strict upstream +// double. Unlike serveSSE, which records bodies for after-the-fact +// assertions, serveStrictDeepSeek enforces the two documented rejection rules +// as hard 400s, the way the real strict servers do: +// +// 1. An assistant message carrying neither content nor tool calls is +// rejected ("Invalid assistant message: content or tool_calls must be +// set"). Sending one bricks every later request, which is exactly what +// charmbracelet/crush#3794 and #3788 reported. +// 2. When the request carries tools, an assistant tool-call turn without a +// reasoning_content field is rejected ("The reasoning_content in the +// thinking mode must be passed back to the API"), per DeepSeek's +// thinking-mode guide; dropping it is what made models loop in +// charmbracelet/crush#2696. +// +// A client that satisfies both rules can drive multi-step tool loops and +// replay canceled-mid-thinking history without poisoning the session. + +// strictMessage mirrors one inbound messages[] entry with raw fields so the +// validator can distinguish absent/null/empty from a real value. +type strictMessage struct { + Role string `json:"role"` + Content json.RawMessage `json:"content"` + ToolCalls json.RawMessage `json:"tool_calls"` + ReasoningContent json.RawMessage `json:"reasoning_content"` +} + +type strictRequest struct { + Stream bool `json:"stream"` + Tools json.RawMessage `json:"tools"` + Messages []strictMessage `json:"messages"` +} + +// hasContent reports whether the message carries user-visible content: a +// non-empty string or a non-empty array of content parts. +func (m strictMessage) hasContent() bool { + raw := strings.TrimSpace(string(m.Content)) + if raw == "" || raw == "null" { + return false + } + var s string + if err := json.Unmarshal(m.Content, &s); err == nil { + return s != "" + } + var parts []json.RawMessage + if err := json.Unmarshal(m.Content, &parts); err == nil { + return len(parts) > 0 + } + return true +} + +func (m strictMessage) hasToolCalls() bool { + raw := strings.TrimSpace(string(m.ToolCalls)) + if raw == "" || raw == "null" { + return false + } + var calls []json.RawMessage + if err := json.Unmarshal(m.ToolCalls, &calls); err != nil { + return false + } + return len(calls) > 0 +} + +// hasReasoningField reports whether reasoning_content is present and not +// null. DeepSeek 400s a tool-call turn when the key is missing; a null means +// "no reasoning in this message" and is not accepted as replay. +func (m strictMessage) hasReasoningField() bool { + raw := strings.TrimSpace(string(m.ReasoningContent)) + return raw != "" && raw != "null" +} + +func strictError(w http.ResponseWriter, message string) { + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(http.StatusBadRequest) + _ = json.NewEncoder(w).Encode(map[string]any{ + "error": map[string]any{ + "message": message, + "type": "invalid_request_error", + "code": "invalid_request_error", + }, + }) +} + +// serveStrictDeepSeek returns an httptest server that validates every inbound +// request against the two contract rules above (answering 400 on violation) +// and otherwise behaves like serveSSE: streaming POSTs get the given SSE +// payloads in order, non-streaming POSTs get a canned completion. Every +// request body is recorded. +func serveStrictDeepSeek(t *testing.T, payloads ...string) (*httptest.Server, *[][]byte) { + t.Helper() + var bodies [][]byte + var calls int + srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + body, err := io.ReadAll(r.Body) + require.NoError(t, err) + bodies = append(bodies, body) + + var req strictRequest + if err := json.Unmarshal(body, &req); err != nil { + strictError(w, "bad request: openai_error") + return + } + + toolsPresent := len(strings.TrimSpace(string(req.Tools))) > 0 && + string(strings.TrimSpace(string(req.Tools))) != "null" + for _, m := range req.Messages { + if m.Role != "assistant" { + continue + } + if !m.hasContent() && !m.hasToolCalls() { + strictError(w, "Invalid assistant message: content or tool_calls must be set") + return + } + if toolsPresent && m.hasToolCalls() && !m.hasReasoningField() { + strictError(w, "The reasoning_content in the thinking mode must be passed back to the API") + return + } + } + + if !req.Stream { + w.Header().Set("Content-Type", "application/json") + _, _ = fmt.Fprint(w, `{"id":"y","created":1,"model":"deepseek-v4-flash","object":"chat.completion","choices":[{"index":0,"message":{"role":"assistant","content":"The date is 2026-08-28."},"finish_reason":"stop"}],"usage":{"prompt_tokens":200,"completion_tokens":10,"total_tokens":210}}`) + return + } + + payload := payloads[min(calls, len(payloads)-1)] + calls++ + + w.Header().Set("Content-Type", "text/event-stream") + rc := http.NewResponseController(w) + for event := range strings.Lines(payload) { + if strings.TrimSpace(event) == "" { + continue + } + fmt.Fprintf(w, "data: %s\n\n", strings.TrimSpace(event)) + _ = rc.Flush() + } + _, _ = fmt.Fprint(w, "data: [DONE]\n\n") + _ = rc.Flush() + })) + t.Cleanup(srv.Close) + return srv, &bodies +} + +// A multi-step tool loop against the strict upstream: thinking + tool call on +// step one, plain answer on step two. The server hard-validates both rules on +// every request, so the loop completing at all proves the reasoning replay +// contract held (charmbracelet/crush#2696) and no empty assistant message was +// ever emitted (charmbracelet/crush#3794). +func TestStrictUpstream_ToolCallLoop(t *testing.T) { + srv, bodies := serveStrictDeepSeek(t, deepseekThinkingToolCallSSE, cannedStopReplySSE) + provider, err := New(WithBaseURL(srv.URL), WithAPIKey("x")) + require.NoError(t, err) + lm, err := provider.LanguageModel(context.Background(), "deepseek-v4-flash") + require.NoError(t, err) + + var invocations []string + getDate := fantasy.NewAgentTool( + "get_date", + "Get the current date.", + func(_ context.Context, _ struct{}, _ fantasy.ToolCall) (fantasy.ToolResponse, error) { + invocations = append(invocations, "get_date") + return fantasy.NewTextResponse("2026-08-28"), nil + }, + ) + + agent := fantasy.NewAgent(lm, fantasy.WithTools(getDate)) + result, err := agent.Stream(context.Background(), fantasy.AgentStreamCall{Prompt: "what's the date?"}) + require.NoError(t, err, "the strict upstream rejected a request; the loop must run clean") + require.NotNil(t, result) + require.Equal(t, []string{"get_date"}, invocations) + + // Two steps: the tool-call turn and the final answer. The second request + // is the replay: the tool-call assistant message must carry the + // concatenated reasoning byte-for-byte. + require.Len(t, *bodies, 2) + var second strictRequest + require.NoError(t, json.Unmarshal((*bodies)[1], &second)) + var assistant *strictMessage + for i := range second.Messages { + if second.Messages[i].Role == "assistant" { + assistant = &second.Messages[i] + } + } + require.NotNil(t, assistant, "no assistant message in second request: %s", (*bodies)[1]) + require.JSONEq(t, `"The user wants the date. I'll call get_date."`, string(assistant.ReasoningContent), + "reasoning_content must round-trip byte-for-byte") +} + +// A turn canceled while the model was still thinking lands in history as an +// assistant message whose only part is reasoning (charmbracelet/crush#3794, +// #3788). Replayed on the next turn it must be dropped, not sent: the strict +// upstream 400s the empty shape, and once it is in history every later +// request fails the same way. A completed tool-call turn in the same history +// must keep its reasoning_content. +func TestStrictUpstream_CanceledThinkingTurnReplayed(t *testing.T) { + srv, bodies := serveStrictDeepSeek(t, cannedStopReplySSE) + provider, err := New(WithBaseURL(srv.URL), WithAPIKey("x")) + require.NoError(t, err) + lm, err := provider.LanguageModel(context.Background(), "deepseek-v4-flash") + require.NoError(t, err) + + prompt := fantasy.Prompt{ + {Role: fantasy.MessageRoleUser, Content: []fantasy.MessagePart{fantasy.TextPart{Text: "hi"}}}, + {Role: fantasy.MessageRoleAssistant, Content: []fantasy.MessagePart{ + fantasy.ReasoningPart{Text: "Thinking out loud, then the user hit escape…"}, + }}, + {Role: fantasy.MessageRoleUser, Content: []fantasy.MessagePart{fantasy.TextPart{Text: "are you there?"}}}, + } + + parts := streamParts(t, lm, prompt) + require.Zero(t, countType(parts, fantasy.StreamPartTypeError), + "stream errored; the strict upstream 400s the reasoning-only replay shape") + require.NotZero(t, countType(parts, fantasy.StreamPartTypeFinish), + "stream must finish; the strict upstream 400s the reasoning-only replay shape") + + require.Len(t, *bodies, 1) + var req strictRequest + require.NoError(t, json.Unmarshal((*bodies)[0], &req)) + for i, m := range req.Messages { + if m.Role != "assistant" { + continue + } + require.True(t, m.hasContent() || m.hasToolCalls(), + "assistant message %d went out with neither content nor tool calls: %s", i, (*bodies)[0]) + } +} From 326027229d6a8a37444b98119456df5a4f07ef2c Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 14 Sep 2026 07:47:16 -0400 Subject: [PATCH 111/156] v0.43.2 --- version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.txt b/version.txt index 8298bb08b..fda7553d4 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -0.43.0 +0.43.2 From 69d52a555a98bedf920935f6c5040adfc3f31328 Mon Sep 17 00:00:00 2001 From: Kieran Klukas Date: Mon, 14 Sep 2026 08:53:04 -0400 Subject: [PATCH 112/156] fix(anthropic): report tool calls the provider never closes A turn that runs into its output token limit stops in the middle of a tool call: the stream ends normally but never closes the content block holding that call. The call was announced and then never completed, so callers were left waiting on a tool call that could not arrive, with no error to react to and a turn that could never end. Tool calls are now tracked as they stream and reported when the stream ends, using the arguments that did arrive. Truncated arguments surface as an invalid tool call, which the model can be told about and retry, rather than as silence. The same tracking covers a block whose start event the SDK accumulator refuses to index, which previously dropped both the arguments and the call itself. When a call streamed no arguments of its own, the accumulator is only consulted for a block that carries that call's id. Position alone is the thing this tracking exists to survive, and handing a call the arguments of a different one would tell the model it asked for something it never named. The bounds check that came with it also removes a crash: an empty accumulator and a negative index used to read past the start of the slice. --- providers/anthropic/anthropic.go | 126 +++++++--- .../anthropic/stream_open_blocks_test.go | 229 ++++++++++++++++++ 2 files changed, 321 insertions(+), 34 deletions(-) create mode 100644 providers/anthropic/stream_open_blocks_test.go diff --git a/providers/anthropic/anthropic.go b/providers/anthropic/anthropic.go index 30a1a4af5..d6150c5c2 100644 --- a/providers/anthropic/anthropic.go +++ b/providers/anthropic/anthropic.go @@ -11,6 +11,7 @@ import ( "io" "maps" "math" + "slices" "strconv" "strings" @@ -1451,12 +1452,24 @@ func (a languageModel) Stream(ctx context.Context, call fantasy.Call) (fantasy.S sawMessageStop := false + // openToolBlocks holds tool_use blocks announced by content_block_start + // but not yet ended. The accumulator cannot serve this: it drops blocks + // it could not index, and max_tokens truncation sends no stop event. + openToolBlocks := map[int64]*openToolBlock{} + for stream.Next() { chunk := stream.Current() _ = acc.Accumulate(chunk) switch chunk.Type { case "content_block_start": contentBlockType := chunk.ContentBlock.Type + if contentBlockType == "tool_use" || contentBlockType == "server_tool_use" { + openToolBlocks[chunk.Index] = &openToolBlock{ + id: chunk.ContentBlock.ID, + name: chunk.ContentBlock.Name, + providerExecuted: contentBlockType == "server_tool_use", + } + } switch contentBlockType { case "text": if !yield(fantasy.StreamPart{ @@ -1501,6 +1514,15 @@ func (a languageModel) Stream(ctx context.Context, call fantasy.Call) (fantasy.S } } case "content_block_stop": + // Tool blocks end from openToolBlocks so that an accumulator + // that dropped the block cannot swallow the call. + if open, ok := openToolBlocks[chunk.Index]; ok { + delete(openToolBlocks, chunk.Index) + if !open.close(acc, chunk.Index, yield) { + return + } + continue + } if len(acc.Content)-1 < int(chunk.Index) { continue } @@ -1530,37 +1552,7 @@ func (a languageModel) Stream(ctx context.Context, call fantasy.Call) (fantasy.S return } case "tool_use": - if !yield(fantasy.StreamPart{ - Type: fantasy.StreamPartTypeToolInputEnd, - ID: contentBlock.ID, - }) { - return - } - if !yield(fantasy.StreamPart{ - Type: fantasy.StreamPartTypeToolCall, - ID: contentBlock.ID, - ToolCallName: contentBlock.Name, - ToolCallInput: string(contentBlock.Input), - }) { - return - } - case "server_tool_use": - if !yield(fantasy.StreamPart{ - Type: fantasy.StreamPartTypeToolInputEnd, - ID: contentBlock.ID, - ProviderExecuted: true, - }) { - return - } - if !yield(fantasy.StreamPart{ - Type: fantasy.StreamPartTypeToolCall, - ID: contentBlock.ID, - ToolCallName: contentBlock.Name, - ToolCallInput: string(contentBlock.Input), - ProviderExecuted: true, - }) { - return - } + // Handled above, from openToolBlocks. case "web_search_tool_result": // Read search results directly from the ContentBlockUnion // struct fields instead of using AsAny(). The Anthropic SDK's @@ -1643,13 +1635,17 @@ func (a languageModel) Stream(ctx context.Context, call fantasy.Call) (fantasy.S return } case "input_json_delta": - if len(acc.Content)-1 < int(chunk.Index) { + // Resolved from openToolBlocks, not the accumulator: the + // accumulator drops blocks it could not index, and a + // dropped delta silently shortens the tool call. + open, ok := openToolBlocks[chunk.Index] + if !ok { continue } - contentBlock := acc.Content[int(chunk.Index)] + open.input.WriteString(chunk.Delta.PartialJSON) if !yield(fantasy.StreamPart{ Type: fantasy.StreamPartTypeToolInputDelta, - ID: contentBlock.ID, + ID: open.id, ToolCallInput: chunk.Delta.PartialJSON, }) { return @@ -1684,6 +1680,16 @@ func (a languageModel) Stream(ctx context.Context, call fantasy.Call) (fantasy.S return } + // A turn stopped at max_tokens sends no content_block_stop for the + // block it was writing. Emit what is still open, truncated arguments + // and all, so the call is reported invalid rather than dropped. + for _, index := range slices.Sorted(maps.Keys(openToolBlocks)) { + open := openToolBlocks[index] + if !open.close(acc, index, yield) { + return + } + } + yield(fantasy.StreamPart{ Type: fantasy.StreamPartTypeFinish, ID: acc.ID, @@ -1700,6 +1706,58 @@ func (a languageModel) Stream(ctx context.Context, call fantasy.Call) (fantasy.S }, nil } +// openToolBlock is a tool_use block announced on the stream but not yet +// ended. It carries the arguments seen so far so the call can still be +// reported if no content_block_stop arrives. +type openToolBlock struct { + id string + name string + providerExecuted bool + input strings.Builder +} + +// close emits the end-of-input and tool call parts for the block. It reports +// whether the consumer wants more parts. +func (o *openToolBlock) close(acc anthropic.Message, index int64, yield func(fantasy.StreamPart) bool) bool { + if !yield(fantasy.StreamPart{ + Type: fantasy.StreamPartTypeToolInputEnd, + ID: o.id, + ProviderExecuted: o.providerExecuted, + }) { + return false + } + return yield(fantasy.StreamPart{ + Type: fantasy.StreamPartTypeToolCall, + ID: o.id, + ToolCallName: o.name, + ToolCallInput: o.arguments(acc, index), + ProviderExecuted: o.providerExecuted, + }) +} + +// arguments returns the call's arguments as JSON text. Deltas win; a block +// with no deltas falls back to the accumulator, then to an empty object so a +// no-argument call is still valid JSON. +func (o *openToolBlock) arguments(acc anthropic.Message, index int64) string { + if o.input.Len() > 0 { + return o.input.String() + } + // Only trust the accumulator when the block sitting at this index + // carries this call's ID. Index drift between the stream and the + // accumulator is the very thing this tracking exists to survive, so + // reading by position alone would be trusting the one thing already + // known to be unreliable, and another call's arguments are worse than + // none. A negative index cannot address a block at all. + if index >= 0 && int(index) < len(acc.Content) { + if block := acc.Content[index]; block.ID == o.id { + if input := string(block.Input); input != "" { + return input + } + } + } + return "{}" +} + // GenerateObject implements fantasy.LanguageModel. func (a languageModel) GenerateObject(ctx context.Context, call fantasy.ObjectCall) (*fantasy.ObjectResponse, error) { switch a.options.objectMode { diff --git a/providers/anthropic/stream_open_blocks_test.go b/providers/anthropic/stream_open_blocks_test.go new file mode 100644 index 000000000..61a3f9fca --- /dev/null +++ b/providers/anthropic/stream_open_blocks_test.go @@ -0,0 +1,229 @@ +package anthropic + +import ( + "context" + "testing" + + "charm.land/fantasy" + "github.com/anthropics/anthropic-sdk-go" + "github.com/stretchr/testify/require" +) + +// A tool call must be reported even when its block is never ended: +// max_tokens truncation omits content_block_stop, and the accumulator drops +// a block whose start it could not index. +func TestStream_ReportsToolCallsLeftOpenByTheProvider(t *testing.T) { + t.Parallel() + + messageStart := anthropicSSEEvent("message_start", `{"type":"message_start","message":{"id":"msg_1","type":"message","role":"assistant","model":"claude-sonnet-4-20250514","content":[],"stop_reason":null,"usage":{"input_tokens":1,"output_tokens":0}}}`) + toolStart := anthropicSSEEvent("content_block_start", `{"type":"content_block_start","index":0,"content_block":{"type":"tool_use","id":"toolu_1","name":"write","input":{}}}`) + partialArgs := anthropicSSEEvent("content_block_delta", `{"type":"content_block_delta","index":0,"delta":{"type":"input_json_delta","partial_json":"{\"path\":\"a.go\",\"content\":\"pack"}}`) + toolStop := anthropicSSEEvent("content_block_stop", `{"type":"content_block_stop","index":0}`) + maxTokens := anthropicSSEEvent("message_delta", `{"type":"message_delta","delta":{"stop_reason":"max_tokens","stop_sequence":null},"usage":{"output_tokens":64000}}`) + toolUse := anthropicSSEEvent("message_delta", `{"type":"message_delta","delta":{"stop_reason":"tool_use","stop_sequence":null},"usage":{"output_tokens":20}}`) + messageStop := anthropicSSEEvent("message_stop", `{"type":"message_stop"}`) + + // A start event at an unexpected index is dropped by the accumulator. + skewedStart := anthropicSSEEvent("content_block_start", `{"type":"content_block_start","index":3,"content_block":{"type":"tool_use","id":"toolu_2","name":"write","input":{}}}`) + skewedArgs := anthropicSSEEvent("content_block_delta", `{"type":"content_block_delta","index":3,"delta":{"type":"input_json_delta","partial_json":"{\"path\":\"b.go\"}"}}`) + skewedStop := anthropicSSEEvent("content_block_stop", `{"type":"content_block_stop","index":3}`) + + tests := []struct { + name string + chunks []string + wantInput string + wantFinish fantasy.FinishReason + wantToolName string + }{ + { + name: "complete tool call", + chunks: []string{messageStart, toolStart, partialArgs, toolStop, toolUse, messageStop}, + wantInput: `{"path":"a.go","content":"pack`, + wantFinish: fantasy.FinishReasonToolCalls, + wantToolName: "write", + }, + { + name: "tool call truncated at max_tokens", + chunks: []string{messageStart, toolStart, partialArgs, maxTokens, messageStop}, + wantInput: `{"path":"a.go","content":"pack`, + wantFinish: fantasy.FinishReasonLength, + wantToolName: "write", + }, + { + name: "tool call the accumulator could not index", + chunks: []string{messageStart, skewedStart, skewedArgs, skewedStop, toolUse, messageStop}, + wantInput: `{"path":"b.go"}`, + wantFinish: fantasy.FinishReasonToolCalls, + wantToolName: "write", + }, + { + // No parameters means no deltas, so the arguments come from the + // fallback. + name: "tool call with no arguments", + chunks: []string{messageStart, toolStart, toolStop, toolUse, messageStop}, + wantInput: `{}`, + wantFinish: fantasy.FinishReasonToolCalls, + wantToolName: "write", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + + server, _ := newAnthropicStreamingServer(tt.chunks) + defer server.Close() + + provider, err := New(WithAPIKey("test-api-key"), WithBaseURL(server.URL)) + require.NoError(t, err) + model, err := provider.LanguageModel(context.Background(), "claude-sonnet-4-20250514") + require.NoError(t, err) + + stream, err := model.Stream(context.Background(), fantasy.Call{Prompt: testPrompt()}) + require.NoError(t, err) + + var ( + toolCalls []fantasy.StreamPart + sawInputEnd bool + finishReason fantasy.FinishReason + streamErr error + ) + for part := range stream { + switch part.Type { + case fantasy.StreamPartTypeToolCall: + toolCalls = append(toolCalls, part) + case fantasy.StreamPartTypeToolInputEnd: + sawInputEnd = true + case fantasy.StreamPartTypeFinish: + finishReason = part.FinishReason + case fantasy.StreamPartTypeError: + streamErr = part.Error + } + } + + require.NoError(t, streamErr) + require.True(t, sawInputEnd, "a started tool call must report the end of its input") + require.Len(t, toolCalls, 1, "the tool call must be reported exactly once") + require.Equal(t, tt.wantToolName, toolCalls[0].ToolCallName) + require.Equal(t, tt.wantInput, toolCalls[0].ToolCallInput) + require.Equal(t, tt.wantFinish, finishReason) + }) + } +} + +// Abandoning iteration while blocks are still open must not panic or emit +// anything further. +func TestStream_StopsCleanlyWithOpenToolCall(t *testing.T) { + t.Parallel() + + chunks := []string{ + anthropicSSEEvent("message_start", `{"type":"message_start","message":{"id":"msg_1","type":"message","role":"assistant","model":"claude-sonnet-4-20250514","content":[],"stop_reason":null,"usage":{"input_tokens":1,"output_tokens":0}}}`), + anthropicSSEEvent("content_block_start", `{"type":"content_block_start","index":0,"content_block":{"type":"tool_use","id":"toolu_1","name":"write","input":{}}}`), + anthropicSSEEvent("content_block_delta", `{"type":"content_block_delta","index":0,"delta":{"type":"input_json_delta","partial_json":"{\"path\":"}}`), + anthropicSSEEvent("message_delta", `{"type":"message_delta","delta":{"stop_reason":"max_tokens","stop_sequence":null},"usage":{"output_tokens":9}}`), + anthropicSSEEvent("message_stop", `{"type":"message_stop"}`), + } + + server, _ := newAnthropicStreamingServer(chunks) + defer server.Close() + + provider, err := New(WithAPIKey("test-api-key"), WithBaseURL(server.URL)) + require.NoError(t, err) + model, err := provider.LanguageModel(context.Background(), "claude-sonnet-4-20250514") + require.NoError(t, err) + + stream, err := model.Stream(context.Background(), fantasy.Call{Prompt: testPrompt()}) + require.NoError(t, err) + + var seen int + for range stream { + seen++ + break + } + require.Equal(t, 1, seen) +} + +// The accumulator is indexed by position, and a block that could not be +// indexed leaves the positions of everything after it shifted. The fallback +// therefore has to confirm identity rather than trust position alone. +// +// This exercises arguments directly. Reaching the identity check through a +// stream is not currently possible: a dropped block only ever makes +// acc.Content shorter, so a drifted index fails the bounds check first. The +// check guards the contract rather than a reachable bug, and testing it at +// this level says so honestly instead of dressing it up as a stream case. +func TestOpenToolBlockArguments(t *testing.T) { + t.Parallel() + + mine := anthropic.ContentBlockUnion{Type: "tool_use", ID: "toolu_1", Input: []byte(`{"path":"a.go"}`)} + theirs := anthropic.ContentBlockUnion{Type: "tool_use", ID: "toolu_other", Input: []byte(`{"path":"other.go"}`)} + + tests := []struct { + name string + deltas string + content []anthropic.ContentBlockUnion + index int64 + want string + }{ + { + name: "deltas win over the accumulator", + deltas: `{"path":"from-delta.go"}`, + // Even a matching block does not override what was streamed. + content: []anthropic.ContentBlockUnion{mine}, + index: 0, + want: `{"path":"from-delta.go"}`, + }, + { + name: "falls back to the block with this call's ID", + content: []anthropic.ContentBlockUnion{mine}, + index: 0, + want: `{"path":"a.go"}`, + }, + { + name: "refuses a block belonging to another call", + // Position says yes, identity says no. Handing over another + // call's arguments would tell the model it asked for something + // it never named, which is worse than reporting none. + content: []anthropic.ContentBlockUnion{theirs}, + index: 0, + want: `{}`, + }, + { + name: "index past the end", + content: []anthropic.ContentBlockUnion{mine}, + index: 3, + want: `{}`, + }, + { + name: "negative index", + content: nil, + index: -1, + want: `{}`, + }, + { + name: "empty accumulator", + content: nil, + index: 0, + want: `{}`, + }, + { + name: "matching block with no input", + content: []anthropic.ContentBlockUnion{{Type: "tool_use", ID: "toolu_1"}}, + index: 0, + want: `{}`, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + + block := &openToolBlock{id: "toolu_1", name: "write"} + if tt.deltas != "" { + block.input.WriteString(tt.deltas) + } + got := block.arguments(anthropic.Message{Content: tt.content}, tt.index) + require.Equal(t, tt.want, got) + }) + } +} From ca3b510e392d0637779a64e4743a0f68c82401d8 Mon Sep 17 00:00:00 2001 From: Kieran Klukas Date: Sat, 12 Sep 2026 09:43:32 -0400 Subject: [PATCH 113/156] feat(anthropic): forward keepalives as stream parts Anthropic holds a stream open with ping events through a long reasoning pause, and the provider had no case for them, so nothing reached a consumer watching for activity. An idle-timeout watchdog counting stream parts sees a working stream as a silent one and aborts it. This bites hardest under thinking display "omitted", where a turn can produce no deltas at all before its first token. The catch-all follows the documented contract: streams "may also include any number of ping events", and new event types may be added, so "your code should handle unknown event types gracefully". --- model.go | 4 +++ providers/anthropic/anthropic.go | 19 +++++++++++ providers/anthropic/anthropic_test.go | 47 +++++++++++++++++++++++++++ 3 files changed, 70 insertions(+) diff --git a/model.go b/model.go index f33a46f93..3e3d6b91e 100644 --- a/model.go +++ b/model.go @@ -164,6 +164,10 @@ const ( StreamPartTypeFinish StreamPartType = "finish" // StreamPartTypeError represents error stream part type. StreamPartTypeError StreamPartType = "error" + // StreamPartTypeKeepalive represents a provider event that carries no + // content and only shows the stream is still alive. Consumers reading + // content can ignore it; an idle-timeout watchdog should not. + StreamPartTypeKeepalive StreamPartType = "keepalive" ) // StreamPart represents a part of a streaming response. diff --git a/providers/anthropic/anthropic.go b/providers/anthropic/anthropic.go index d6150c5c2..47366a184 100644 --- a/providers/anthropic/anthropic.go +++ b/providers/anthropic/anthropic.go @@ -1653,6 +1653,25 @@ func (a languageModel) Stream(ctx context.Context, call fantasy.Call) (fantasy.S } case "message_stop": sawMessageStop = true + default: + // Every other event (ping, message_start, message_delta, and + // anything added later) carries no content of its own, but it + // is proof the stream is alive. Dropping them silently makes a + // working stream look dead to anything watching for activity, + // which matters most when display is "omitted" and a long + // reasoning turn produces no deltas at all. + // + // The API documents that streams "may also include any number + // of ping events" and that new event types may be added and + // "your code should handle unknown event types gracefully", so + // the catch-all is the documented contract rather than a guess + // at the current event list. Nothing here depends on how often + // keepalives arrive. + // + // https://platform.claude.com/docs/en/build-with-claude/streaming + if !yield(fantasy.StreamPart{Type: fantasy.StreamPartTypeKeepalive}) { + return + } } } diff --git a/providers/anthropic/anthropic_test.go b/providers/anthropic/anthropic_test.go index 9bd74972b..98da1241a 100644 --- a/providers/anthropic/anthropic_test.go +++ b/providers/anthropic/anthropic_test.go @@ -3269,3 +3269,50 @@ func TestMapFinishReason(t *testing.T) { require.Equal(t, tc.expected, mapFinishReason(tc.reason), "stop_reason %q", tc.reason) } } + +// A long reasoning turn sends pings and nothing else. Those have to reach the +// consumer, or an idle-timeout watchdog cannot tell a thinking model from a +// dead connection. +func TestStream_ForwardsKeepalivesDuringSilence(t *testing.T) { + t.Parallel() + + chunks := []string{ + anthropicSSEEvent("message_start", `{"type":"message_start","message":{"id":"msg_ping","type":"message","role":"assistant","model":"claude-sonnet-4-20250514","content":[],"stop_reason":null,"usage":{"input_tokens":1,"output_tokens":0}}}`), + anthropicSSEEvent("content_block_start", `{"type":"content_block_start","index":0,"content_block":{"type":"text","text":""}}`), + // The quiet stretch: the model is working, the server is pinging. + anthropicSSEEvent("ping", `{"type":"ping"}`), + anthropicSSEEvent("ping", `{"type":"ping"}`), + anthropicSSEEvent("content_block_delta", `{"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"hello"}}`), + anthropicSSEEvent("content_block_stop", `{"type":"content_block_stop","index":0}`), + anthropicSSEEvent("message_delta", `{"type":"message_delta","delta":{"stop_reason":"end_turn","stop_sequence":null},"usage":{"output_tokens":1}}`), + anthropicSSEEvent("message_stop", `{"type":"message_stop"}`), + } + + server, _ := newAnthropicStreamingServer(chunks) + defer server.Close() + + provider, err := New(WithAPIKey("test-api-key"), WithBaseURL(server.URL)) + require.NoError(t, err) + model, err := provider.LanguageModel(context.Background(), "claude-sonnet-4-20250514") + require.NoError(t, err) + + stream, err := model.Stream(context.Background(), fantasy.Call{Prompt: testPrompt()}) + require.NoError(t, err) + + var types []fantasy.StreamPartType + var keepalives int + for part := range stream { + types = append(types, part.Type) + if part.Type == fantasy.StreamPartTypeKeepalive { + keepalives++ + } + } + + // Two pings, plus message_start and message_delta, all of which are + // activity without content. + require.GreaterOrEqual(t, keepalives, 2, "pings must surface as keepalives, got parts: %v", types) + + // The content still arrives, in order, unaffected by the keepalives. + require.Contains(t, types, fantasy.StreamPartTypeTextDelta) + require.Contains(t, types, fantasy.StreamPartTypeFinish) +} From 02d13f06dab327903f9eabf381bcdb5afbd749d9 Mon Sep 17 00:00:00 2001 From: Kieran Klukas Date: Sat, 12 Sep 2026 09:44:03 -0400 Subject: [PATCH 114/156] fix(anthropic): ask for summarized thinking on the 5 generation Claude Opus 5, Sonnet 5, Fable 5/5.1 and Mythos 5/5.1 default to thinking display "omitted", so callers get thinking blocks with an empty thinking field and no thinking deltas while the model reasons. The matcher only covered opus 4.7/4.8 and mythos-preview, so the whole 5 generation fell through and silently returned nothing to show. Deliberately broader than requiresAdaptiveThinking: asking for a display only adds a field the API accepts alongside either thinking type, where changing a model's thinking mode rewrites the request. --- providers/anthropic/anthropic.go | 44 ++++++++++++++++++--------- providers/anthropic/anthropic_test.go | 33 ++++++++++++++++++++ 2 files changed, 62 insertions(+), 15 deletions(-) diff --git a/providers/anthropic/anthropic.go b/providers/anthropic/anthropic.go index 47366a184..df3a17b85 100644 --- a/providers/anthropic/anthropic.go +++ b/providers/anthropic/anthropic.go @@ -55,6 +55,8 @@ func defaultsToAdaptiveThinking(model string) bool { return strings.Contains(model, "claude-mythos-preview") } +// requiresAdaptiveThinking reports whether the model rejects a manual +// budget_tokens configuration and must be sent adaptive thinking instead. func requiresAdaptiveThinking(model string) bool { return defaultsToAdaptiveThinking(model) || defaultsToOmittedOpusThinkingDisplay(model) } @@ -63,9 +65,33 @@ func setThinkingDisplay(param interface{ SetExtraFields(map[string]any) }, displ param.SetExtraFields(map[string]any{"display": string(display)}) } +// omittedThinkingDisplayFamilies are the model families that default to +// display "omitted". Matched by substring so dated snapshots and +// platform-qualified ids resolve the same as the bare alias. Keep in step +// with the display list in the thinking docs: +// https://platform.claude.com/docs/en/build-with-claude/thinking#controlling-thinking-display +var omittedThinkingDisplayFamilies = []string{ + "claude-opus-5", + "claude-sonnet-5", + "claude-fable-5", + "claude-mythos-5", +} + +// defaultsToOmittedThinkingDisplay reports whether the model returns empty +// thinking text unless a display is requested. Broader than +// [requiresAdaptiveThinking] on purpose: a display is accepted alongside +// either thinking type, so it is safe to list a model here. func defaultsToOmittedThinkingDisplay(model string) bool { model = strings.ToLower(strings.TrimSpace(model)) - return defaultsToAdaptiveThinking(model) || defaultsToOmittedOpusThinkingDisplay(model) + if defaultsToAdaptiveThinking(model) || defaultsToOmittedOpusThinkingDisplay(model) { + return true + } + for _, family := range omittedThinkingDisplayFamilies { + if strings.Contains(model, family) { + return true + } + } + return false } func defaultsToOmittedOpusThinkingDisplay(model string) bool { @@ -1654,20 +1680,8 @@ func (a languageModel) Stream(ctx context.Context, call fantasy.Call) (fantasy.S case "message_stop": sawMessageStop = true default: - // Every other event (ping, message_start, message_delta, and - // anything added later) carries no content of its own, but it - // is proof the stream is alive. Dropping them silently makes a - // working stream look dead to anything watching for activity, - // which matters most when display is "omitted" and a long - // reasoning turn produces no deltas at all. - // - // The API documents that streams "may also include any number - // of ping events" and that new event types may be added and - // "your code should handle unknown event types gracefully", so - // the catch-all is the documented contract rather than a guess - // at the current event list. Nothing here depends on how often - // keepalives arrive. - // + // Catch-all on purpose: Anthropic may add event types and + // documents that unknown ones should be handled gracefully. // https://platform.claude.com/docs/en/build-with-claude/streaming if !yield(fantasy.StreamPart{Type: fantasy.StreamPartTypeKeepalive}) { return diff --git a/providers/anthropic/anthropic_test.go b/providers/anthropic/anthropic_test.go index 98da1241a..b3662699a 100644 --- a/providers/anthropic/anthropic_test.go +++ b/providers/anthropic/anthropic_test.go @@ -830,10 +830,22 @@ func TestDefaultsToOmittedThinkingDisplay(t *testing.T) { {name: "bedrock opus 4.8", model: "us.anthropic.claude-opus-4-8-20260101-v1:0", want: true}, {name: "mythos preview", model: "claude-mythos-preview", want: true}, {name: "bedrock mythos preview", model: "anthropic.claude-mythos-preview", want: true}, + // The 5 generation also defaults to an omitted display. + {name: "opus 5", model: "claude-opus-5", want: true}, + {name: "opus 5 dated", model: "claude-opus-5-20260115", want: true}, + {name: "bedrock opus 5", model: "us.anthropic.claude-opus-5-v1:0", want: true}, + {name: "sonnet 5", model: "claude-sonnet-5", want: true}, + {name: "fable 5", model: "claude-fable-5", want: true}, + {name: "fable 5.1", model: "claude-fable-5-1", want: true}, + {name: "mythos 5", model: "claude-mythos-5", want: true}, + {name: "mythos 5.1", model: "claude-mythos-5-1", want: true}, + {name: "uppercase and padded", model: " CLAUDE-SONNET-5 ", want: true}, {name: "opus 4.6", model: "claude-opus-4-6-20260101", want: false}, {name: "opus 4 date only", model: "claude-opus-4-20250514", want: false}, {name: "bedrock opus 4 date only", model: "us.anthropic.claude-opus-4-20250514-v1:0", want: false}, {name: "sonnet", model: "claude-sonnet-4-20250514", want: false}, + {name: "sonnet 4.5", model: "claude-sonnet-4-5", want: false}, + {name: "haiku 4.5", model: "claude-haiku-4-5", want: false}, {name: "no minor", model: "claude-opus-4", want: false}, } @@ -3316,3 +3328,24 @@ func TestStream_ForwardsKeepalivesDuringSilence(t *testing.T) { require.Contains(t, types, fantasy.StreamPartTypeTextDelta) require.Contains(t, types, fantasy.StreamPartTypeFinish) } + +// An explicit caller preference always wins over the default. +func TestThinkingDisplayRespectsCallerChoice(t *testing.T) { + t.Parallel() + + omittedByChoice := ThinkingDisplayOmitted + display, ok := thinkingDisplay(&ProviderOptions{ThinkingDisplay: &omittedByChoice}, "claude-opus-5") + require.True(t, ok) + require.Equal(t, ThinkingDisplayOmitted, display) +} + +// Widening the display default must not change which models get adaptive +// thinking: that rewrites the request shape, where a display only adds a field. +func TestDisplayDefaultDoesNotChangeThinkingMode(t *testing.T) { + t.Parallel() + + require.False(t, requiresAdaptiveThinking("claude-opus-5")) + require.False(t, requiresAdaptiveThinking("claude-sonnet-5")) + require.True(t, requiresAdaptiveThinking("claude-opus-4-7")) + require.True(t, requiresAdaptiveThinking("claude-mythos-preview")) +} From cdbb992e2b45e5092afccae1da92803ac26b9f25 Mon Sep 17 00:00:00 2001 From: Sven Date: Tue, 15 Sep 2026 17:03:40 -0700 Subject: [PATCH 115/156] =?UTF-8?q?fix(providers):=20keep=20tool=20message?= =?UTF-8?q?s=20contiguous=20when=20expanding=20media=20to=E2=80=A6=20(#366?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- providers/openai/language_model_hooks.go | 42 ++++-- providers/openai/tool_result_media_test.go | 138 ++++++++++++++++++ .../openaicompat/language_model_hooks.go | 20 ++- .../openaicompat/tool_result_media_test.go | 138 ++++++++++++++++++ 4 files changed, 323 insertions(+), 15 deletions(-) diff --git a/providers/openai/language_model_hooks.go b/providers/openai/language_model_hooks.go index 92849cbe6..e01665ae5 100644 --- a/providers/openai/language_model_hooks.go +++ b/providers/openai/language_model_hooks.go @@ -305,7 +305,17 @@ func DefaultStreamProviderMetadataFunc(choice openai.ChatCompletionChoice, metad func DefaultToPrompt(prompt fantasy.Prompt, _, _ string) ([]openai.ChatCompletionMessageParamUnion, []fantasy.CallWarning) { var messages []openai.ChatCompletionMessageParamUnion var warnings []fantasy.CallWarning + // Defer synthetic user messages holding tool-result media (see + // ToolResultMediaMessages) until the contiguous run of tool messages + // ends: strict chat-completions validators require every tool message + // answering an assistant's tool_calls to immediately follow that + // assistant message. + var deferredMedia []openai.ChatCompletionMessageParamUnion for _, msg := range prompt { + if msg.Role != fantasy.MessageRoleTool && len(deferredMedia) > 0 { + messages = append(messages, deferredMedia...) + deferredMedia = nil + } switch msg.Role { case fantasy.MessageRoleSystem: var systemPromptParts []string @@ -592,8 +602,9 @@ func DefaultToPrompt(prompt fantasy.Prompt, _, _ string) ([]openai.ChatCompletio } // OpenAI Chat Completions tool messages cannot carry image // or audio content directly; see ToolResultMediaMessages. - mediaMessages, mediaWarnings := ToolResultMediaMessages(output, toolResultPart.ToolCallID) - messages = append(messages, mediaMessages...) + toolMessage, mediaMessages, mediaWarnings := ToolResultMediaMessages(output, toolResultPart.ToolCallID) + messages = append(messages, toolMessage) + deferredMedia = append(deferredMedia, mediaMessages...) warnings = append(warnings, mediaWarnings...) default: warnings = append(warnings, fantasy.CallWarning{ @@ -604,34 +615,43 @@ func DefaultToPrompt(prompt fantasy.Prompt, _, _ string) ([]openai.ChatCompletio } } } + messages = append(messages, deferredMedia...) return messages, warnings } // ToolResultMediaMessages maps a tool-result media output to the chat // completions messages that convey it. OpenAI tool messages can only carry -// text, so this emits a text tool message (using any accompanying text, or a +// text, so this returns a text tool message (using any accompanying text, or a // placeholder describing the media) to keep the tool_call/tool_result pairing -// valid, followed by a synthetic user message holding the actual image or -// audio content part so vision- and audio-capable models can see it. +// valid, plus synthetic user messages holding the actual image or audio +// content part so vision- and audio-capable models can see it. +// +// The two are returned separately because they belong in different places: the +// tool message must stay inside the contiguous run of tool messages answering +// an assistant's tool_calls, while the media messages must land after that run +// ends. Strict validators reject a tool message that does not immediately +// follow either its assistant message or another tool message. // // Unsupported media types produce only the text tool message plus a warning. // This is shared with OpenAI-compatible providers, which face the same // constraint. -func ToolResultMediaMessages(output fantasy.ToolResultOutputContentMedia, toolCallID string) ([]openai.ChatCompletionMessageParamUnion, []fantasy.CallWarning) { +func ToolResultMediaMessages(output fantasy.ToolResultOutputContentMedia, toolCallID string) (openai.ChatCompletionMessageParamUnion, []openai.ChatCompletionMessageParamUnion, []fantasy.CallWarning) { placeholder := output.Text if placeholder == "" { placeholder = fmt.Sprintf("The tool returned %s content; see the following user message.", output.MediaType) } - messages := []openai.ChatCompletionMessageParamUnion{openai.ToolMessage(placeholder, toolCallID)} + toolMessage := openai.ToolMessage(placeholder, toolCallID) mediaPart, warning, emit := toolResultMediaUserPart(output) if warning != nil { - return messages, []fantasy.CallWarning{*warning} + return toolMessage, nil, []fantasy.CallWarning{*warning} } - if emit { - messages = append(messages, openai.UserMessage([]openai.ChatCompletionContentPartUnionParam{mediaPart})) + if !emit { + return toolMessage, nil, nil } - return messages, nil + return toolMessage, []openai.ChatCompletionMessageParamUnion{ + openai.UserMessage([]openai.ChatCompletionContentPartUnionParam{mediaPart}), + }, nil } // toolResultMediaUserPart maps a tool-result media output to an OpenAI chat diff --git a/providers/openai/tool_result_media_test.go b/providers/openai/tool_result_media_test.go index 7a182f92d..c4af7ed18 100644 --- a/providers/openai/tool_result_media_test.go +++ b/providers/openai/tool_result_media_test.go @@ -165,6 +165,144 @@ func TestDefaultToPrompt_MediaToolResult_UnsupportedMediaType(t *testing.T) { require.Contains(t, warnings[0].Message, "video/mp4") } +// The ordering tests below all exercise the same invariant: the run of tool +// messages answering an assistant's tool_calls must stay contiguous, so the +// synthetic user messages carrying media land after the run ends. + +func mediaToolResult(id string) fantasy.MessagePart { + return fantasy.ToolResultPart{ + ToolCallID: id, + Output: fantasy.ToolResultOutputContentMedia{ + Data: base64.StdEncoding.EncodeToString([]byte{1, 2, 3}), + MediaType: "image/png", + }, + } +} + +func textToolResult(id string) fantasy.MessagePart { + return fantasy.ToolResultPart{ + ToolCallID: id, + Output: fantasy.ToolResultOutputContentText{Text: "ok"}, + } +} + +// A parallel tool-call batch with media results must keep its tool +// messages contiguous: strict validators report every tool_call_id after +// a mid-run user message as unanswered. +func TestDefaultToPrompt_MediaToolResult_ParallelBatchDeferred(t *testing.T) { + t.Parallel() + + prompt := fantasy.Prompt{ + { + Role: fantasy.MessageRoleAssistant, + Content: []fantasy.MessagePart{ + fantasy.ToolCallPart{ToolCallID: "img-1", ToolName: "view", Input: "{}"}, + fantasy.ToolCallPart{ToolCallID: "img-2", ToolName: "view", Input: "{}"}, + }, + }, + {Role: fantasy.MessageRoleTool, Content: []fantasy.MessagePart{mediaToolResult("img-1")}}, + {Role: fantasy.MessageRoleTool, Content: []fantasy.MessagePart{mediaToolResult("img-2")}}, + {Role: fantasy.MessageRoleUser, Content: []fantasy.MessagePart{fantasy.TextPart{Text: "next"}}}, + } + + messages, warnings := DefaultToPrompt(prompt, "openai", "gpt-4o") + + require.Empty(t, warnings) + // Assistant, two tool messages, two deferred user image messages, user. + require.Len(t, messages, 6) + require.NotNil(t, messages[1].OfTool) + require.Equal(t, "img-1", messages[1].OfTool.ToolCallID) + require.NotNil(t, messages[2].OfTool) + require.Equal(t, "img-2", messages[2].OfTool.ToolCallID) + require.NotNil(t, messages[3].OfUser) + require.NotNil(t, messages[3].OfUser.Content.OfArrayOfContentParts[0].OfImageURL) + require.NotNil(t, messages[4].OfUser) + require.NotNil(t, messages[4].OfUser.Content.OfArrayOfContentParts[0].OfImageURL) + require.NotNil(t, messages[5].OfUser) +} + +// When the tool run ends the prompt, the deferred media messages flush at +// the end rather than being dropped. +func TestDefaultToPrompt_MediaToolResult_DeferredFlushAtEnd(t *testing.T) { + t.Parallel() + + prompt := fantasy.Prompt{ + { + Role: fantasy.MessageRoleAssistant, + Content: []fantasy.MessagePart{ + fantasy.ToolCallPart{ToolCallID: "img-1", ToolName: "view", Input: "{}"}, + }, + }, + {Role: fantasy.MessageRoleTool, Content: []fantasy.MessagePart{mediaToolResult("img-1")}}, + } + + messages, warnings := DefaultToPrompt(prompt, "openai", "gpt-4o") + + require.Empty(t, warnings) + require.Len(t, messages, 3) + require.NotNil(t, messages[1].OfTool) + require.NotNil(t, messages[2].OfUser) + require.NotNil(t, messages[2].OfUser.Content.OfArrayOfContentParts[0].OfImageURL) +} + +// Only the media user messages are deferred. A text tool result later in the +// same batch still has to be emitted in place, right after the media result's +// own tool message. +func TestDefaultToPrompt_MediaToolResult_MixedBatchKeepsTextInline(t *testing.T) { + t.Parallel() + + prompt := fantasy.Prompt{ + { + Role: fantasy.MessageRoleAssistant, + Content: []fantasy.MessagePart{ + fantasy.ToolCallPart{ToolCallID: "img-1", ToolName: "view", Input: "{}"}, + fantasy.ToolCallPart{ToolCallID: "txt-1", ToolName: "grep", Input: "{}"}, + }, + }, + {Role: fantasy.MessageRoleTool, Content: []fantasy.MessagePart{mediaToolResult("img-1")}}, + {Role: fantasy.MessageRoleTool, Content: []fantasy.MessagePart{textToolResult("txt-1")}}, + {Role: fantasy.MessageRoleUser, Content: []fantasy.MessagePart{fantasy.TextPart{Text: "next"}}}, + } + + messages, warnings := DefaultToPrompt(prompt, "openai", "gpt-4o") + + require.Empty(t, warnings) + // Assistant, both tool messages, the deferred user image message, user. + require.Len(t, messages, 5) + require.NotNil(t, messages[1].OfTool) + require.Equal(t, "img-1", messages[1].OfTool.ToolCallID) + require.NotNil(t, messages[2].OfTool) + require.Equal(t, "txt-1", messages[2].OfTool.ToolCallID) + require.NotNil(t, messages[3].OfUser) + require.NotNil(t, messages[3].OfUser.Content.OfArrayOfContentParts[0].OfImageURL) + require.NotNil(t, messages[4].OfUser) +} + +// The run also ends at an assistant message, not just a user one. +func TestDefaultToPrompt_MediaToolResult_DeferredBeforeAssistant(t *testing.T) { + t.Parallel() + + prompt := fantasy.Prompt{ + { + Role: fantasy.MessageRoleAssistant, + Content: []fantasy.MessagePart{ + fantasy.ToolCallPart{ToolCallID: "img-1", ToolName: "view", Input: "{}"}, + }, + }, + {Role: fantasy.MessageRoleTool, Content: []fantasy.MessagePart{mediaToolResult("img-1")}}, + {Role: fantasy.MessageRoleAssistant, Content: []fantasy.MessagePart{fantasy.TextPart{Text: "done"}}}, + } + + messages, warnings := DefaultToPrompt(prompt, "openai", "gpt-4o") + + require.Empty(t, warnings) + require.Len(t, messages, 4) + require.NotNil(t, messages[1].OfTool) + require.NotNil(t, messages[2].OfUser) + require.NotNil(t, messages[2].OfUser.Content.OfArrayOfContentParts[0].OfImageURL) + require.NotNil(t, messages[3].OfAssistant) +} + func TestToResponsesPrompt_MediaToolResult_ImagePNG(t *testing.T) { t.Parallel() diff --git a/providers/openaicompat/language_model_hooks.go b/providers/openaicompat/language_model_hooks.go index c0e940682..255bca21c 100644 --- a/providers/openaicompat/language_model_hooks.go +++ b/providers/openaicompat/language_model_hooks.go @@ -189,8 +189,18 @@ func StreamExtraFunc(chunk openaisdk.ChatCompletionChunk, yield func(fantasy.Str func ToPromptFunc(prompt fantasy.Prompt, _, _ string) ([]openaisdk.ChatCompletionMessageParamUnion, []fantasy.CallWarning) { var messages []openaisdk.ChatCompletionMessageParamUnion var warnings []fantasy.CallWarning + // Defer synthetic user messages holding tool-result media (see + // openai.ToolResultMediaMessages) until the contiguous run of tool + // messages ends: strict chat-completions validators require every + // tool message answering an assistant's tool_calls to immediately + // follow that assistant message. + var deferredMedia []openaisdk.ChatCompletionMessageParamUnion for _, msg := range prompt { + if msg.Role != fantasy.MessageRoleTool && len(deferredMedia) > 0 { + messages = append(messages, deferredMedia...) + deferredMedia = nil + } switch msg.Role { case fantasy.MessageRoleSystem: var blocks []openaisdk.ChatCompletionContentPartTextParam @@ -548,10 +558,11 @@ func ToPromptFunc(prompt fantasy.Prompt, _, _ string) ([]openaisdk.ChatCompletio // OpenAI-compatible chat completions tool messages cannot // carry image or audio content directly; the SDK's content // union only accepts text. Reuse the openai provider's - // helper, which emits a text tool message plus a synthetic - // user message holding the media. - mediaMessages, mediaWarnings := openai.ToolResultMediaMessages(output, toolResultPart.ToolCallID) - messages = append(messages, mediaMessages...) + // helper, which splits the text tool message from the + // synthetic user message holding the media. + toolMessage, mediaMessages, mediaWarnings := openai.ToolResultMediaMessages(output, toolResultPart.ToolCallID) + messages = append(messages, toolMessage) + deferredMedia = append(deferredMedia, mediaMessages...) warnings = append(warnings, mediaWarnings...) default: warnings = append(warnings, fantasy.CallWarning{ @@ -562,6 +573,7 @@ func ToPromptFunc(prompt fantasy.Prompt, _, _ string) ([]openaisdk.ChatCompletio } } } + messages = append(messages, deferredMedia...) return messages, warnings } diff --git a/providers/openaicompat/tool_result_media_test.go b/providers/openaicompat/tool_result_media_test.go index 642b605b7..15e3ffaf4 100644 --- a/providers/openaicompat/tool_result_media_test.go +++ b/providers/openaicompat/tool_result_media_test.go @@ -207,3 +207,141 @@ func TestToPromptFunc_MediaToolResult_UnsupportedMediaType(t *testing.T) { require.Len(t, warnings, 1) require.Contains(t, warnings[0].Message, "video/mp4") } + +// The ordering tests below all exercise the same invariant: the run of tool +// messages answering an assistant's tool_calls must stay contiguous, so the +// synthetic user messages carrying media land after the run ends. + +func mediaToolResult(id string) fantasy.MessagePart { + return fantasy.ToolResultPart{ + ToolCallID: id, + Output: fantasy.ToolResultOutputContentMedia{ + Data: base64.StdEncoding.EncodeToString([]byte{1, 2, 3}), + MediaType: "image/png", + }, + } +} + +func textToolResult(id string) fantasy.MessagePart { + return fantasy.ToolResultPart{ + ToolCallID: id, + Output: fantasy.ToolResultOutputContentText{Text: "ok"}, + } +} + +// A parallel tool-call batch with media results must keep its tool +// messages contiguous: strict validators report every tool_call_id after +// a mid-run user message as unanswered. +func TestToPromptFunc_MediaToolResult_ParallelBatchDeferred(t *testing.T) { + t.Parallel() + + prompt := fantasy.Prompt{ + { + Role: fantasy.MessageRoleAssistant, + Content: []fantasy.MessagePart{ + fantasy.ToolCallPart{ToolCallID: "img-1", ToolName: "view", Input: "{}"}, + fantasy.ToolCallPart{ToolCallID: "img-2", ToolName: "view", Input: "{}"}, + }, + }, + {Role: fantasy.MessageRoleTool, Content: []fantasy.MessagePart{mediaToolResult("img-1")}}, + {Role: fantasy.MessageRoleTool, Content: []fantasy.MessagePart{mediaToolResult("img-2")}}, + {Role: fantasy.MessageRoleUser, Content: []fantasy.MessagePart{fantasy.TextPart{Text: "next"}}}, + } + + messages, warnings := ToPromptFunc(prompt, "", "") + + require.Empty(t, warnings) + // Assistant, two tool messages, two deferred user image messages, user. + require.Len(t, messages, 6) + require.NotNil(t, messages[1].OfTool) + require.Equal(t, "img-1", messages[1].OfTool.ToolCallID) + require.NotNil(t, messages[2].OfTool) + require.Equal(t, "img-2", messages[2].OfTool.ToolCallID) + require.NotNil(t, messages[3].OfUser) + require.NotNil(t, messages[3].OfUser.Content.OfArrayOfContentParts[0].OfImageURL) + require.NotNil(t, messages[4].OfUser) + require.NotNil(t, messages[4].OfUser.Content.OfArrayOfContentParts[0].OfImageURL) + require.NotNil(t, messages[5].OfUser) +} + +// When the tool run ends the prompt, the deferred media messages flush at +// the end rather than being lost. +func TestToPromptFunc_MediaToolResult_DeferredFlushAtEnd(t *testing.T) { + t.Parallel() + + prompt := fantasy.Prompt{ + { + Role: fantasy.MessageRoleAssistant, + Content: []fantasy.MessagePart{ + fantasy.ToolCallPart{ToolCallID: "img-1", ToolName: "view", Input: "{}"}, + }, + }, + {Role: fantasy.MessageRoleTool, Content: []fantasy.MessagePart{mediaToolResult("img-1")}}, + } + + messages, warnings := ToPromptFunc(prompt, "", "") + + require.Empty(t, warnings) + require.Len(t, messages, 3) + require.NotNil(t, messages[1].OfTool) + require.NotNil(t, messages[2].OfUser) + require.NotNil(t, messages[2].OfUser.Content.OfArrayOfContentParts[0].OfImageURL) +} + +// Only the media user messages are deferred. A text tool result later in the +// same batch still has to be emitted in place, right after the media result's +// own tool message. +func TestToPromptFunc_MediaToolResult_MixedBatchKeepsTextInline(t *testing.T) { + t.Parallel() + + prompt := fantasy.Prompt{ + { + Role: fantasy.MessageRoleAssistant, + Content: []fantasy.MessagePart{ + fantasy.ToolCallPart{ToolCallID: "img-1", ToolName: "view", Input: "{}"}, + fantasy.ToolCallPart{ToolCallID: "txt-1", ToolName: "grep", Input: "{}"}, + }, + }, + {Role: fantasy.MessageRoleTool, Content: []fantasy.MessagePart{mediaToolResult("img-1")}}, + {Role: fantasy.MessageRoleTool, Content: []fantasy.MessagePart{textToolResult("txt-1")}}, + {Role: fantasy.MessageRoleUser, Content: []fantasy.MessagePart{fantasy.TextPart{Text: "next"}}}, + } + + messages, warnings := ToPromptFunc(prompt, "", "") + + require.Empty(t, warnings) + // Assistant, both tool messages, the deferred user image message, user. + require.Len(t, messages, 5) + require.NotNil(t, messages[1].OfTool) + require.Equal(t, "img-1", messages[1].OfTool.ToolCallID) + require.NotNil(t, messages[2].OfTool) + require.Equal(t, "txt-1", messages[2].OfTool.ToolCallID) + require.NotNil(t, messages[3].OfUser) + require.NotNil(t, messages[3].OfUser.Content.OfArrayOfContentParts[0].OfImageURL) + require.NotNil(t, messages[4].OfUser) +} + +// The run also ends at an assistant message, not just a user one. +func TestToPromptFunc_MediaToolResult_DeferredBeforeAssistant(t *testing.T) { + t.Parallel() + + prompt := fantasy.Prompt{ + { + Role: fantasy.MessageRoleAssistant, + Content: []fantasy.MessagePart{ + fantasy.ToolCallPart{ToolCallID: "img-1", ToolName: "view", Input: "{}"}, + }, + }, + {Role: fantasy.MessageRoleTool, Content: []fantasy.MessagePart{mediaToolResult("img-1")}}, + {Role: fantasy.MessageRoleAssistant, Content: []fantasy.MessagePart{fantasy.TextPart{Text: "done"}}}, + } + + messages, warnings := ToPromptFunc(prompt, "", "") + + require.Empty(t, warnings) + require.Len(t, messages, 4) + require.NotNil(t, messages[1].OfTool) + require.NotNil(t, messages[2].OfUser) + require.NotNil(t, messages[2].OfUser.Content.OfArrayOfContentParts[0].OfImageURL) + require.NotNil(t, messages[3].OfAssistant) +} From f09d8408f18b8f4818d80816e155fd3482dcfd6b Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Thu, 17 Sep 2026 17:37:29 -0300 Subject: [PATCH 116/156] fix(providers): report output tokens inclusive of reasoning (#370) Consumers price and display output tokens as all generated tokens, with reasoning as an observability subset. Two provider shapes violated that: - Google's mapping reported candidatesTokenCount verbatim, which excludes thoughtsTokenCount on Vertex but includes it on AI Studio. mapUsage now decides per response from totalTokenCount, falling back to the configured backend when totals are ambiguous. - Vercel AI Gateway forwards Vertex usage verbatim: reasoning is disjoint from completion_tokens in an OpenAI-shaped envelope. Vercel's usage hooks fold it in whenever the upstream is Vertex, and every OpenAI-shaped hook (openai, openrouter, vercel, kronk) folds whenever reasoning exceeds output, which can only happen in the disjoint shape. The Responses API structured-output error path now reports usage through responsesUsage like the success path instead of a partial hand mapping. A reasoning-subset invariant assertion in the shared thinking test harness caught the Vercel case and now pins the behavior per provider. Assisted-by: Crush:kimi-k3 --- providers/google/google.go | 42 +++++++-- providers/google/usage_test.go | 90 +++++++++++++++++++ providers/kronk/language_model.go | 19 +++- providers/openai/language_model_hooks.go | 31 ++++++- providers/openai/responses_language_model.go | 15 ++-- providers/openrouter/language_model_hooks.go | 18 +++- providers/vercel/language_model_hooks.go | 45 ++++++++-- providers/vercel/language_model_hooks_test.go | 21 +++++ providertests/common_test.go | 13 +++ 9 files changed, 262 insertions(+), 32 deletions(-) create mode 100644 providers/google/usage_test.go create mode 100644 providers/vercel/language_model_hooks_test.go diff --git a/providers/google/google.go b/providers/google/google.go index 5930ba93d..be3b72f7e 100644 --- a/providers/google/google.go +++ b/providers/google/google.go @@ -847,7 +847,7 @@ func (g *languageModel) Stream(ctx context.Context, call fantasy.Call) (fantasy. // we need to make sure that there is actual tokendata if resp.UsageMetadata != nil && resp.UsageMetadata.TotalTokenCount != 0 { - currentUsage := mapUsage(resp.UsageMetadata) + currentUsage := g.mapUsage(resp.UsageMetadata) // if first usage chunk if usage == nil { usage = ¤tUsage @@ -1125,7 +1125,7 @@ func (g *languageModel) streamObjectWithJSONMode(ctx context.Context, call fanta // we need to make sure that there is actual tokendata if resp.UsageMetadata != nil && resp.UsageMetadata.TotalTokenCount != 0 { - currentUsage := mapUsage(resp.UsageMetadata) + currentUsage := g.mapUsage(resp.UsageMetadata) if usage == nil { usage = ¤tUsage } else { @@ -1437,7 +1437,7 @@ func (g languageModel) mapResponse(response *genai.GenerateContentResponse, warn return &fantasy.Response{ Content: content, - Usage: mapUsage(response.UsageMetadata), + Usage: g.mapUsage(response.UsageMetadata), FinishReason: finishReason, Warnings: warnings, }, nil @@ -1476,12 +1476,42 @@ func mapFinishReason(reason genai.FinishReason) fantasy.FinishReason { } } -func mapUsage(usage *genai.GenerateContentResponseUsageMetadata) fantasy.Usage { +// mapUsage maps Google's usage metadata to fantasy usage. +// +// Output tokens always include thoughts: downstream pricing never itemizes +// reasoning, so a surface that reports thoughts disjointly must be folded in +// here. Whether candidatesTokenCount already contains thoughtsTokenCount +// depends on the surface — AI Studio folds them in, Vertex reports them +// apart, and preview models have flipped between the two — so the totals +// decide per response: +// +// prompt + candidates == total → candidates already include thoughts +// prompt + candidates + thoughts == total → thoughts are disjoint; add them +// +// toolUsePromptTokenCount counts as prompt in both sums. When neither +// equality holds (partial metadata), fall back to the backend's documented +// behavior: Vertex disjoint, AI Studio inclusive. +func (g languageModel) mapUsage(usage *genai.GenerateContentResponseUsageMetadata) fantasy.Usage { + output := int64(usage.CandidatesTokenCount) + reasoning := int64(usage.ThoughtsTokenCount) + if reasoning > 0 { + prompt := int64(usage.PromptTokenCount) + int64(usage.ToolUsePromptTokenCount) + total := int64(usage.TotalTokenCount) + switch { + case prompt+output == total: + // Candidates already include thoughts (AI Studio). + case prompt+output+reasoning == total: + // Thoughts are reported disjointly (Vertex). + output += reasoning + case g.providerOptions.backend == genai.BackendVertexAI: + output += reasoning + } + } return fantasy.Usage{ InputTokens: int64(usage.PromptTokenCount), - OutputTokens: int64(usage.CandidatesTokenCount), + OutputTokens: output, TotalTokens: int64(usage.TotalTokenCount), - ReasoningTokens: int64(usage.ThoughtsTokenCount), + ReasoningTokens: reasoning, CacheCreationTokens: 0, CacheReadTokens: int64(usage.CachedContentTokenCount), } diff --git a/providers/google/usage_test.go b/providers/google/usage_test.go new file mode 100644 index 000000000..83c13824b --- /dev/null +++ b/providers/google/usage_test.go @@ -0,0 +1,90 @@ +package google + +import ( + "testing" + + "google.golang.org/genai" +) + +func TestMapUsage(t *testing.T) { + t.Run("vertex shape: thoughts disjoint from candidates", func(t *testing.T) { + lm := languageModel{providerOptions: options{backend: genai.BackendVertexAI}} + u := lm.mapUsage(&genai.GenerateContentResponseUsageMetadata{ + PromptTokenCount: 100, + CandidatesTokenCount: 50, + ThoughtsTokenCount: 30, + TotalTokenCount: 180, + }) + if u.OutputTokens != 80 { + t.Fatalf("expected output 50+30=80, got %d", u.OutputTokens) + } + if u.ReasoningTokens != 30 { + t.Fatalf("expected reasoning 30, got %d", u.ReasoningTokens) + } + }) + + t.Run("ai studio shape: candidates include thoughts", func(t *testing.T) { + lm := languageModel{providerOptions: options{backend: genai.BackendGeminiAPI}} + u := lm.mapUsage(&genai.GenerateContentResponseUsageMetadata{ + PromptTokenCount: 100, + CandidatesTokenCount: 80, // 50 visible + 30 thoughts + ThoughtsTokenCount: 30, + TotalTokenCount: 180, + }) + if u.OutputTokens != 80 { + t.Fatalf("expected output unchanged at 80, got %d", u.OutputTokens) + } + if u.ReasoningTokens != 30 { + t.Fatalf("expected reasoning 30, got %d", u.ReasoningTokens) + } + }) + + t.Run("tool use prompt tokens count as prompt in the discriminant", func(t *testing.T) { + lm := languageModel{providerOptions: options{backend: genai.BackendGeminiAPI}} + u := lm.mapUsage(&genai.GenerateContentResponseUsageMetadata{ + PromptTokenCount: 100, + ToolUsePromptTokenCount: 20, + CandidatesTokenCount: 50, + ThoughtsTokenCount: 30, + TotalTokenCount: 200, // 120 + 50 + 30: disjoint + }) + if u.OutputTokens != 80 { + t.Fatalf("expected output 50+30=80, got %d", u.OutputTokens) + } + }) + + t.Run("no thoughts leaves output untouched", func(t *testing.T) { + lm := languageModel{providerOptions: options{backend: genai.BackendVertexAI}} + u := lm.mapUsage(&genai.GenerateContentResponseUsageMetadata{ + PromptTokenCount: 100, + CandidatesTokenCount: 50, + TotalTokenCount: 150, + }) + if u.OutputTokens != 50 { + t.Fatalf("expected output 50, got %d", u.OutputTokens) + } + if u.ReasoningTokens != 0 { + t.Fatalf("expected reasoning 0, got %d", u.ReasoningTokens) + } + }) + + t.Run("ambiguous totals fall back to the backend default", func(t *testing.T) { + // Neither equality holds (partial or inconsistent metadata). + metadata := &genai.GenerateContentResponseUsageMetadata{ + PromptTokenCount: 100, + CandidatesTokenCount: 50, + ThoughtsTokenCount: 30, + TotalTokenCount: 177, + } + + vertex := languageModel{providerOptions: options{backend: genai.BackendVertexAI}} + if u := vertex.mapUsage(metadata); u.OutputTokens != 80 { + t.Fatalf("vertex fallback: expected output 80, got %d", u.OutputTokens) + } + + studio := languageModel{providerOptions: options{backend: genai.BackendGeminiAPI}} + if u := studio.mapUsage(metadata); u.OutputTokens != 50 { + t.Fatalf("ai studio fallback: expected output 50, got %d", u.OutputTokens) + } + }) +} diff --git a/providers/kronk/language_model.go b/providers/kronk/language_model.go index 943189ef9..4c8059502 100644 --- a/providers/kronk/language_model.go +++ b/providers/kronk/language_model.go @@ -8,6 +8,7 @@ import ( "charm.land/fantasy" "charm.land/fantasy/object" + "charm.land/fantasy/providers/openai" "github.com/ardanlabs/kronk/sdk/kronk/model" xjson "github.com/charmbracelet/x/json" "github.com/google/uuid" @@ -204,10 +205,15 @@ func (l *languageModel) Generate(ctx context.Context, call fantasy.Call) (*fanta usage := fantasy.Usage{} if response.Usage != nil { + outputTokens, totalTokens := openai.FoldDisjointReasoning( + int64(response.Usage.CompletionTokens), + int64(response.Usage.CompletionTokensDetails.ReasoningTokens), + int64(response.Usage.PromptTokens+response.Usage.CompletionTokens), + ) usage = fantasy.Usage{ InputTokens: int64(response.Usage.PromptTokens), - OutputTokens: int64(response.Usage.CompletionTokens), - TotalTokens: int64(response.Usage.PromptTokens + response.Usage.CompletionTokens), + OutputTokens: outputTokens, + TotalTokens: totalTokens, ReasoningTokens: int64(response.Usage.CompletionTokensDetails.ReasoningTokens), CacheReadTokens: int64(response.Usage.PromptTokensDetails.CachedTokens), } @@ -269,10 +275,15 @@ func (l *languageModel) Stream(ctx context.Context, call fantasy.Call) (fantasy. metadata.update(resp) if resp.Usage != nil { + outputTokens, totalTokens := openai.FoldDisjointReasoning( + int64(resp.Usage.CompletionTokens), + int64(resp.Usage.CompletionTokensDetails.ReasoningTokens), + int64(resp.Usage.PromptTokens+resp.Usage.CompletionTokens), + ) usage = fantasy.Usage{ InputTokens: int64(resp.Usage.PromptTokens), - OutputTokens: int64(resp.Usage.CompletionTokens), - TotalTokens: int64(resp.Usage.PromptTokens + resp.Usage.CompletionTokens), + OutputTokens: outputTokens, + TotalTokens: totalTokens, ReasoningTokens: int64(resp.Usage.CompletionTokensDetails.ReasoningTokens), CacheReadTokens: int64(resp.Usage.PromptTokensDetails.CachedTokens), } diff --git a/providers/openai/language_model_hooks.go b/providers/openai/language_model_hooks.go index e01665ae5..2a3aac462 100644 --- a/providers/openai/language_model_hooks.go +++ b/providers/openai/language_model_hooks.go @@ -207,6 +207,19 @@ func DefaultMapFinishReasonFunc(finishReason string) fantasy.FinishReason { } } +// FoldDisjointReasoning keeps output tokens all-inclusive. OpenAI reports +// reasoning as a subset of completion_tokens, but some OpenAI-shaped gateways +// report it disjointly (Vercel AI Gateway streaming Gemini, for one). +// Reasoning exceeding output can only happen in the disjoint shape — a subset +// can never exceed its parent — so folding it in is always safe, and total +// follows output. +func FoldDisjointReasoning(output, reasoning, total int64) (int64, int64) { + if reasoning > output { + return output + reasoning, total + reasoning + } + return output, total +} + // DefaultUsageFunc is the default implementation for calculating usage. func DefaultUsageFunc(response openai.ChatCompletion) (fantasy.Usage, fantasy.ProviderOptionsData) { completionTokenDetails := response.Usage.CompletionTokensDetails @@ -231,11 +244,16 @@ func DefaultUsageFunc(response openai.ChatCompletion) (fantasy.Usage, fantasy.Pr } // OpenAI reports prompt_tokens INCLUDING cached tokens. Subtract to avoid double-counting. inputTokens := max(response.Usage.PromptTokens-promptTokenDetails.CachedTokens, 0) + outputTokens, totalTokens := FoldDisjointReasoning( + response.Usage.CompletionTokens, + completionTokenDetails.ReasoningTokens, + response.Usage.TotalTokens, + ) providerMetadata.ExtraFields = ExtractExtraFields(response.Usage.JSON.ExtraFields) return fantasy.Usage{ InputTokens: inputTokens, - OutputTokens: response.Usage.CompletionTokens, - TotalTokens: response.Usage.TotalTokens, + OutputTokens: outputTokens, + TotalTokens: totalTokens, ReasoningTokens: completionTokenDetails.ReasoningTokens, CacheReadTokens: promptTokenDetails.CachedTokens, }, providerMetadata @@ -260,10 +278,15 @@ func DefaultStreamUsageFunc(chunk openai.ChatCompletionChunk, _ map[string]any, promptTokenDetails := chunk.Usage.PromptTokensDetails // OpenAI reports prompt_tokens INCLUDING cached tokens. Subtract to avoid double-counting. inputTokens := max(chunk.Usage.PromptTokens-promptTokenDetails.CachedTokens, 0) + outputTokens, totalTokens := FoldDisjointReasoning( + chunk.Usage.CompletionTokens, + completionTokenDetails.ReasoningTokens, + chunk.Usage.TotalTokens, + ) usage := fantasy.Usage{ InputTokens: inputTokens, - OutputTokens: chunk.Usage.CompletionTokens, - TotalTokens: chunk.Usage.TotalTokens, + OutputTokens: outputTokens, + TotalTokens: totalTokens, ReasoningTokens: completionTokenDetails.ReasoningTokens, CacheReadTokens: promptTokenDetails.CachedTokens, } diff --git a/providers/openai/responses_language_model.go b/providers/openai/responses_language_model.go index 41c5cb40d..98e23851c 100644 --- a/providers/openai/responses_language_model.go +++ b/providers/openai/responses_language_model.go @@ -409,10 +409,15 @@ func responsesProviderMetadata(responseID string) fantasy.ProviderMetadata { func responsesUsage(resp responses.Response) fantasy.Usage { // OpenAI reports input_tokens INCLUDING cached tokens. Subtract to avoid double-counting. inputTokens := max(resp.Usage.InputTokens-resp.Usage.InputTokensDetails.CachedTokens, 0) + outputTokens, totalTokens := FoldDisjointReasoning( + resp.Usage.OutputTokens, + resp.Usage.OutputTokensDetails.ReasoningTokens, + resp.Usage.InputTokens+resp.Usage.OutputTokens, + ) usage := fantasy.Usage{ InputTokens: inputTokens, - OutputTokens: resp.Usage.OutputTokens, - TotalTokens: resp.Usage.InputTokens + resp.Usage.OutputTokens, + OutputTokens: outputTokens, + TotalTokens: totalTokens, } if resp.Usage.OutputTokensDetails.ReasoningTokens != 0 { usage.ReasoningTokens = resp.Usage.OutputTokensDetails.ReasoningTokens @@ -1504,11 +1509,7 @@ func (o responsesLanguageModel) generateObjectWithJSONMode(ctx context.Context, } if jsonText == "" { - usage := fantasy.Usage{ - InputTokens: response.Usage.InputTokens, - OutputTokens: response.Usage.OutputTokens, - TotalTokens: response.Usage.InputTokens + response.Usage.OutputTokens, - } + usage := responsesUsage(*response) finishReason := mapResponsesFinishReason(response.IncompleteDetails.Reason, false) return nil, &fantasy.NoObjectGeneratedError{ RawText: "", diff --git a/providers/openrouter/language_model_hooks.go b/providers/openrouter/language_model_hooks.go index 8cc4d3407..b0ba9e997 100644 --- a/providers/openrouter/language_model_hooks.go +++ b/providers/openrouter/language_model_hooks.go @@ -457,11 +457,16 @@ func languageModelUsage(response openaisdk.ChatCompletion) (fantasy.Usage, fanta // OpenRouter reports prompt_tokens INCLUDING cached tokens. Subtract to avoid double-counting. inputTokens := max(usage.PromptTokens-promptTokenDetails.CachedTokens, 0) + outputTokens, totalTokens := openai.FoldDisjointReasoning( + usage.CompletionTokens, + completionTokenDetails.ReasoningTokens, + inputTokens+usage.CompletionTokens+promptTokenDetails.CachedTokens, + ) return fantasy.Usage{ InputTokens: inputTokens, - OutputTokens: usage.CompletionTokens, - TotalTokens: inputTokens + usage.CompletionTokens + promptTokenDetails.CachedTokens, + OutputTokens: outputTokens, + TotalTokens: totalTokens, ReasoningTokens: completionTokenDetails.ReasoningTokens, CacheReadTokens: promptTokenDetails.CachedTokens, }, providerMetadata @@ -496,11 +501,16 @@ func languageModelStreamUsage(chunk openaisdk.ChatCompletionChunk, _ map[string] // OpenRouter reports prompt_tokens INCLUDING cached tokens. Subtract to avoid double-counting. inputTokens := max(usage.PromptTokens-promptTokenDetails.CachedTokens, 0) + outputTokens, totalTokens := openai.FoldDisjointReasoning( + usage.CompletionTokens, + completionTokenDetails.ReasoningTokens, + inputTokens+usage.CompletionTokens+promptTokenDetails.CachedTokens, + ) aiUsage := fantasy.Usage{ InputTokens: inputTokens, - OutputTokens: usage.CompletionTokens, - TotalTokens: inputTokens + usage.CompletionTokens + promptTokenDetails.CachedTokens, + OutputTokens: outputTokens, + TotalTokens: totalTokens, ReasoningTokens: completionTokenDetails.ReasoningTokens, CacheReadTokens: promptTokenDetails.CachedTokens, } diff --git a/providers/vercel/language_model_hooks.go b/providers/vercel/language_model_hooks.go index 3361ecf4d..3e86a5958 100644 --- a/providers/vercel/language_model_hooks.go +++ b/providers/vercel/language_model_hooks.go @@ -485,6 +485,17 @@ func languageModelStreamExtra(chunk openaisdk.ChatCompletionChunk, yield func(fa return ctx, true } +// isVertexUpstream reports whether Vercel's upstream for the request was +// Vertex AI. Vercel forwards Vertex's usage verbatim, and Vertex reports +// thoughts disjoint from completion_tokens — unlike OpenAI's subset shape — +// so reasoning must be folded into output even when it does not exceed it +// (the numeric guard in FoldDisjointReasoning only proves disjointness when +// reasoning > output). The provider value arrives as raw JSON, quotes and +// all. +func isVertexUpstream(provider string) bool { + return strings.Trim(provider, `"`) == "vertex" +} + func languageModelUsage(response openaisdk.ChatCompletion) (fantasy.Usage, fantasy.ProviderOptionsData) { if len(response.Choices) == 0 { return fantasy.Usage{}, nil @@ -505,12 +516,21 @@ func languageModelUsage(response openaisdk.ChatCompletion) (fantasy.Usage, fanta // Vercel reports prompt_tokens INCLUDING cached tokens. Subtract to avoid double-counting. inputTokens := max(usage.PromptTokens-promptTokenDetails.CachedTokens, 0) + reasoning := completionTokenDetails.ReasoningTokens + outputTokens := usage.CompletionTokens + totalTokens := inputTokens + usage.CompletionTokens + promptTokenDetails.CachedTokens + if isVertexUpstream(provider) { + outputTokens += reasoning + totalTokens += reasoning + } else { + outputTokens, totalTokens = openaipkg.FoldDisjointReasoning(outputTokens, reasoning, totalTokens) + } return fantasy.Usage{ InputTokens: inputTokens, - OutputTokens: usage.CompletionTokens, - TotalTokens: inputTokens + usage.CompletionTokens + promptTokenDetails.CachedTokens, - ReasoningTokens: completionTokenDetails.ReasoningTokens, + OutputTokens: outputTokens, + TotalTokens: totalTokens, + ReasoningTokens: reasoning, CacheReadTokens: promptTokenDetails.CachedTokens, }, providerMetadata } @@ -531,8 +551,10 @@ func languageModelStreamUsage(chunk openaisdk.ChatCompletionChunk, _ map[string] } } + var provider string if p, ok := chunk.JSON.ExtraFields["provider"]; ok { - streamProviderMetadata.Provider = p.Raw() + provider = p.Raw() + streamProviderMetadata.Provider = provider } completionTokenDetails := usage.CompletionTokensDetails @@ -540,12 +562,21 @@ func languageModelStreamUsage(chunk openaisdk.ChatCompletionChunk, _ map[string] // Vercel reports prompt_tokens INCLUDING cached tokens. Subtract to avoid double-counting. inputTokens := max(usage.PromptTokens-promptTokenDetails.CachedTokens, 0) + reasoning := completionTokenDetails.ReasoningTokens + outputTokens := usage.CompletionTokens + totalTokens := inputTokens + usage.CompletionTokens + promptTokenDetails.CachedTokens + if isVertexUpstream(provider) { + outputTokens += reasoning + totalTokens += reasoning + } else { + outputTokens, totalTokens = openaipkg.FoldDisjointReasoning(outputTokens, reasoning, totalTokens) + } aiUsage := fantasy.Usage{ InputTokens: inputTokens, - OutputTokens: usage.CompletionTokens, - TotalTokens: inputTokens + usage.CompletionTokens + promptTokenDetails.CachedTokens, - ReasoningTokens: completionTokenDetails.ReasoningTokens, + OutputTokens: outputTokens, + TotalTokens: totalTokens, + ReasoningTokens: reasoning, CacheReadTokens: promptTokenDetails.CachedTokens, } diff --git a/providers/vercel/language_model_hooks_test.go b/providers/vercel/language_model_hooks_test.go new file mode 100644 index 000000000..575caacb6 --- /dev/null +++ b/providers/vercel/language_model_hooks_test.go @@ -0,0 +1,21 @@ +package vercel + +import "testing" + +func TestIsVertexUpstream(t *testing.T) { + tests := []struct { + provider string + want bool + }{ + {`"vertex"`, true}, + {`"google"`, false}, + {`"openai"`, false}, + {"", false}, + {"vertex", true}, // defensive: already-unquoted value + } + for _, tc := range tests { + if got := isVertexUpstream(tc.provider); got != tc.want { + t.Errorf("isVertexUpstream(%q) = %v, want %v", tc.provider, got, tc.want) + } + } +} diff --git a/providertests/common_test.go b/providertests/common_test.go index f13c93a92..8a691a534 100644 --- a/providertests/common_test.go +++ b/providertests/common_test.go @@ -327,6 +327,7 @@ func testThinking(t *testing.T, pairs []builderPair, thinkChecks func(*testing.T got := result.Response.Content.Text() require.True(t, strings.Contains(got, want1) && strings.Contains(got, want2), "unexpected response: got %q, want %q %q", got, want1, want2) + assertReasoningSubsetOfOutput(t, result.TotalUsage) thinkChecks(t, result) }) @@ -365,12 +366,24 @@ func testThinking(t *testing.T, pairs []builderPair, thinkChecks func(*testing.T got := result.Response.Content.Text() require.True(t, strings.Contains(got, want1) && strings.Contains(got, want2), "unexpected response: got %q, want %q %q", got, want1, want2) + assertReasoningSubsetOfOutput(t, result.TotalUsage) thinkChecks(t, result) }) }) } } +// assertReasoningSubsetOfOutput pins the RFC 0020 invariant: reasoning tokens +// are a subset of output tokens, never disjoint addends. A provider whose +// usage mapping violates this double-counts reasoning downstream. +func assertReasoningSubsetOfOutput(t *testing.T, usage fantasy.Usage) { + t.Helper() + if usage.ReasoningTokens > 0 { + require.GreaterOrEqual(t, usage.OutputTokens, usage.ReasoningTokens, + "reasoning tokens must be a subset of output tokens") + } +} + func containsAny(s string, subs ...string) bool { for _, sub := range subs { if strings.Contains(s, sub) { From b4bf5f953397562cde286c55f162f56ad5ead3f9 Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Thu, 17 Sep 2026 17:38:07 -0300 Subject: [PATCH 117/156] v0.44.0 --- version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.txt b/version.txt index fda7553d4..a8ab6c966 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -0.43.2 +0.44.0 From 73004b4c8bcf37afba158084f7e2ff45974540c0 Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Mon, 21 Sep 2026 15:03:08 -0300 Subject: [PATCH 118/156] fix: use our internal openai fork with bug fix (#381) Pinning the `fantasy-two` branch here: https://github.com/charmbracelet/openai-go/tree/fantasy-two We can revert this once this PR gets merged upstream: * https://github.com/openai/openai-go/pull/914 --- go.mod | 3 ++- go.sum | 10 ++++------ providers/azure/azure.go | 2 +- providers/openai/call_useragent.go | 2 +- providers/openai/error.go | 4 ++-- providers/openai/error_test.go | 2 +- providers/openai/language_model.go | 8 ++++---- providers/openai/language_model_hooks.go | 6 +++--- providers/openai/openai.go | 4 ++-- providers/openai/openai_test.go | 2 +- providers/openai/provider_options.go | 4 ++-- providers/openai/responses_language_model.go | 8 ++++---- providers/openaicompat/language_model_hooks.go | 6 +++--- providers/openaicompat/openaicompat.go | 2 +- providers/openaicompat/openaicompat_test.go | 2 +- providers/openrouter/language_model_hooks.go | 4 ++-- providers/openrouter/openrouter.go | 2 +- providers/vercel/language_model_hooks.go | 4 ++-- providers/vercel/vercel.go | 2 +- 19 files changed, 38 insertions(+), 39 deletions(-) diff --git a/go.mod b/go.mod index 3d80bdfef..e6735358b 100644 --- a/go.mod +++ b/go.mod @@ -10,6 +10,7 @@ require ( github.com/aws/aws-sdk-go-v2 v1.45.1 github.com/aws/aws-sdk-go-v2/config v1.33.1 github.com/aws/smithy-go v1.28.1 + github.com/charmbracelet/openai-go v0.0.0-20260921175203-216db9e71b83 github.com/charmbracelet/x/exp/slice v0.0.0-20250904123553-b4e2667e5ad5 github.com/charmbracelet/x/exp/strings v0.1.0 github.com/charmbracelet/x/json v0.2.0 @@ -17,7 +18,6 @@ require ( github.com/google/uuid v1.6.0 github.com/joho/godotenv v1.5.1 github.com/kaptinlin/jsonschema v0.9.9 - github.com/openai/openai-go/v3 v3.54.0 github.com/stretchr/testify v1.12.1 golang.org/x/net v0.58.0 golang.org/x/oauth2 v0.36.0 @@ -58,6 +58,7 @@ require ( github.com/cenkalti/backoff/v5 v5.0.3 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/cncf/xds/go v0.0.0-20260202195803-dba9d589def2 // indirect + github.com/coder/websocket v1.8.15 // indirect github.com/ebitengine/purego v0.11.0-alpha.9 // indirect github.com/envoyproxy/go-control-plane/envoy v1.39.0 // indirect github.com/envoyproxy/protoc-gen-validate v1.3.3 // indirect diff --git a/go.sum b/go.sum index a03077890..0e4a0659c 100644 --- a/go.sum +++ b/go.sum @@ -22,10 +22,6 @@ cloud.google.com/go/storage v1.65.1 h1:LRRpBJUTf+OXDPX9jZUKZ3mSLIsz3htG+qUpeNZov cloud.google.com/go/storage v1.65.1/go.mod h1:UsS9OgFg/XHOSYakQ8ZtLWWeyGkk1WnmD/GsGfN0BHM= cloud.google.com/go/trace v1.16.0 h1:GmQovzFc5F0CNfl0VLgL64aoTtu7xsM0YajW2GlG9+E= cloud.google.com/go/trace v1.16.0/go.mod h1:r+bdAn16dKLSV1G2D5v3e58IlQlizfxWrUfjx7kM7X0= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.23.0 h1:4gRPBpN1f6xt88yi4WR26m7XaD9OlWtVT6bWPdGUIok= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.23.0/go.mod h1:G7QVLxw1j1JVyrO1MA95S8m8HStaaleDZYTcfGgjB2o= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.12.0 h1:fhqpLE3UEXi9lPaBRpQ6XuRW0nU7hgg4zlmZZa+a9q4= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.12.0/go.mod h1:7dCRMLwisfRH3dBupKeNCioWYUZ4SS09Z14H+7i8ZoY= github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.36.0 h1:3SdxXLkgAfiHRWcGTq6fneq9jgoJzneiY0yPQnjoT2E= github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.36.0/go.mod h1:1iIdl0k+ppn9wT0wzR9H7HkSvIui/4qgtnKW10cQtds= github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.60.0 h1:HldzheTs05E3ybqSitI/wHaof6+XERRudgZLjYbs3eE= @@ -88,6 +84,8 @@ github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1x github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/charmbracelet/openai-go v0.0.0-20260921175203-216db9e71b83 h1:7k30XdmBd71VAErGCjTTiOAE9F1KUthN9jdCeqQtvZ4= +github.com/charmbracelet/openai-go v0.0.0-20260921175203-216db9e71b83/go.mod h1:8xPfrTomjYl827L3QQay36djXcEkXc80bpH+790o8/A= github.com/charmbracelet/x/exp/slice v0.0.0-20250904123553-b4e2667e5ad5 h1:DTSZxdV9qQagD4iGcAt9RgaRBZtJl01bfKgdLzUzUPI= github.com/charmbracelet/x/exp/slice v0.0.0-20250904123553-b4e2667e5ad5/go.mod h1:vI5nDVMWi6veaYH+0Fmvpbe/+cv/iJfMntdh+N0+Tms= github.com/charmbracelet/x/exp/strings v0.1.0 h1:i69S2XI7uG1u4NLGeJPSYU++Nmjvpo9nwd6aoEm7gkA= @@ -96,6 +94,8 @@ github.com/charmbracelet/x/json v0.2.0 h1:DqB+ZGx2h+Z+1s98HOuOyli+i97wsFQIxP2ZQA github.com/charmbracelet/x/json v0.2.0/go.mod h1:opFIflx2YgXgi49xVUu8gEQ21teFAxyMwvOiZhIvWNM= github.com/cncf/xds/go v0.0.0-20260202195803-dba9d589def2 h1:aBangftG7EVZoUb69Os8IaYg++6uMOdKK83QtkkvJik= github.com/cncf/xds/go v0.0.0-20260202195803-dba9d589def2/go.mod h1:qwXFYgsP6T7XnJtbKlf1HP8AjxZZyzxMmc+Lq5GjlU4= +github.com/coder/websocket v1.8.15 h1:6B2JPeOGlpff2Uz6vOEH1Vzpi0iUz20A+lPVhPHtNUA= +github.com/coder/websocket v1.8.15/go.mod h1:NX3SzP+inril6yawo5CQXx8+fk145lPDC6pumgx0mVg= github.com/dnaeon/go-vcr v1.2.0 h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI= github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= github.com/ebitengine/purego v0.11.0-alpha.9 h1:nH3UEIa45o38JcEgQlPgBFuGU0BkdU68u3v/IXrgo9k= @@ -165,8 +165,6 @@ github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/openai/openai-go/v3 v3.54.0 h1:qeNvIpFB/wzX7pI8USN1eruvzCS+XqOZ8mx73lGF6Lg= -github.com/openai/openai-go/v3 v3.54.0/go.mod h1:ufI1+K+t0ijRB3gk8eztiw1crcDpsBuxRQL4sbLIrts= github.com/pb33f/ordered-map/v2 v2.3.1 h1:5319HDO0aw4DA4gzi+zv4FXU9UlSs3xGZ40wcP1nBjY= github.com/pb33f/ordered-map/v2 v2.3.1/go.mod h1:qxFQgd0PkVUtOMCkTapqotNgzRhMPL7VvaHKbd1HnmQ= github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= diff --git a/providers/azure/azure.go b/providers/azure/azure.go index 3d5604d0f..807c27a66 100644 --- a/providers/azure/azure.go +++ b/providers/azure/azure.go @@ -8,7 +8,7 @@ import ( "charm.land/fantasy" "charm.land/fantasy/providers/openai" - "github.com/openai/openai-go/v3/option" + "github.com/charmbracelet/openai-go/option" ) type options struct { diff --git a/providers/openai/call_useragent.go b/providers/openai/call_useragent.go index 2602c0dab..baee1775e 100644 --- a/providers/openai/call_useragent.go +++ b/providers/openai/call_useragent.go @@ -3,7 +3,7 @@ package openai import ( "charm.land/fantasy" "charm.land/fantasy/providers/internal/httpheaders" - "github.com/openai/openai-go/v3/option" + "github.com/charmbracelet/openai-go/option" ) // callUARequestOptions returns per-request options that override the diff --git a/providers/openai/error.go b/providers/openai/error.go index 7b688c942..230104574 100644 --- a/providers/openai/error.go +++ b/providers/openai/error.go @@ -11,8 +11,8 @@ import ( "strings" "charm.land/fantasy" - "github.com/openai/openai-go/v3" - "github.com/openai/openai-go/v3/packages/ssestream" + "github.com/charmbracelet/openai-go" + "github.com/charmbracelet/openai-go/packages/ssestream" ) var ( diff --git a/providers/openai/error_test.go b/providers/openai/error_test.go index 01a8e31f6..57d8aa9ec 100644 --- a/providers/openai/error_test.go +++ b/providers/openai/error_test.go @@ -7,7 +7,7 @@ import ( "testing" "charm.land/fantasy" - "github.com/openai/openai-go/v3/packages/ssestream" + "github.com/charmbracelet/openai-go/packages/ssestream" ) func TestToProviderErr_WrapsUnexpectedEOF(t *testing.T) { diff --git a/providers/openai/language_model.go b/providers/openai/language_model.go index c47464990..56706d1b3 100644 --- a/providers/openai/language_model.go +++ b/providers/openai/language_model.go @@ -16,11 +16,11 @@ import ( "charm.land/fantasy" "charm.land/fantasy/object" "charm.land/fantasy/schema" + "github.com/charmbracelet/openai-go" + "github.com/charmbracelet/openai-go/option" + "github.com/charmbracelet/openai-go/packages/param" + "github.com/charmbracelet/openai-go/shared" "github.com/google/uuid" - "github.com/openai/openai-go/v3" - "github.com/openai/openai-go/v3/option" - "github.com/openai/openai-go/v3/packages/param" - "github.com/openai/openai-go/v3/shared" ) type languageModel struct { diff --git a/providers/openai/language_model_hooks.go b/providers/openai/language_model_hooks.go index 2a3aac462..32ecbeb24 100644 --- a/providers/openai/language_model_hooks.go +++ b/providers/openai/language_model_hooks.go @@ -7,9 +7,9 @@ import ( "strings" "charm.land/fantasy" - "github.com/openai/openai-go/v3" - "github.com/openai/openai-go/v3/packages/param" - "github.com/openai/openai-go/v3/shared" + "github.com/charmbracelet/openai-go" + "github.com/charmbracelet/openai-go/packages/param" + "github.com/charmbracelet/openai-go/shared" ) // LanguageModelPrepareCallFunc is a function that prepares the call for the language model. diff --git a/providers/openai/openai.go b/providers/openai/openai.go index 46f3e6388..d23f510a7 100644 --- a/providers/openai/openai.go +++ b/providers/openai/openai.go @@ -8,8 +8,8 @@ import ( "charm.land/fantasy" "charm.land/fantasy/providers/internal/httpheaders" - "github.com/openai/openai-go/v3" - "github.com/openai/openai-go/v3/option" + "github.com/charmbracelet/openai-go" + "github.com/charmbracelet/openai-go/option" ) const ( diff --git a/providers/openai/openai_test.go b/providers/openai/openai_test.go index e10400716..c8491378b 100644 --- a/providers/openai/openai_test.go +++ b/providers/openai/openai_test.go @@ -12,7 +12,7 @@ import ( "testing" "charm.land/fantasy" - "github.com/openai/openai-go/v3/packages/param" + "github.com/charmbracelet/openai-go/packages/param" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) diff --git a/providers/openai/provider_options.go b/providers/openai/provider_options.go index cf558ab40..2aa482fce 100644 --- a/providers/openai/provider_options.go +++ b/providers/openai/provider_options.go @@ -5,8 +5,8 @@ import ( "encoding/json" "charm.land/fantasy" - "github.com/openai/openai-go/v3" - "github.com/openai/openai-go/v3/packages/respjson" + "github.com/charmbracelet/openai-go" + "github.com/charmbracelet/openai-go/packages/respjson" ) // ReasoningEffort represents the reasoning effort level for OpenAI models. diff --git a/providers/openai/responses_language_model.go b/providers/openai/responses_language_model.go index 98e23851c..f69d685e7 100644 --- a/providers/openai/responses_language_model.go +++ b/providers/openai/responses_language_model.go @@ -15,11 +15,11 @@ import ( "charm.land/fantasy" "charm.land/fantasy/object" "charm.land/fantasy/schema" + "github.com/charmbracelet/openai-go" + "github.com/charmbracelet/openai-go/packages/param" + "github.com/charmbracelet/openai-go/responses" + "github.com/charmbracelet/openai-go/shared" "github.com/google/uuid" - "github.com/openai/openai-go/v3" - "github.com/openai/openai-go/v3/packages/param" - "github.com/openai/openai-go/v3/responses" - "github.com/openai/openai-go/v3/shared" ) const topLogprobsMax = 20 diff --git a/providers/openaicompat/language_model_hooks.go b/providers/openaicompat/language_model_hooks.go index 255bca21c..2dac8f7b4 100644 --- a/providers/openaicompat/language_model_hooks.go +++ b/providers/openaicompat/language_model_hooks.go @@ -8,9 +8,9 @@ import ( "charm.land/fantasy" "charm.land/fantasy/providers/openai" - openaisdk "github.com/openai/openai-go/v3" - "github.com/openai/openai-go/v3/packages/param" - "github.com/openai/openai-go/v3/shared" + openaisdk "github.com/charmbracelet/openai-go" + "github.com/charmbracelet/openai-go/packages/param" + "github.com/charmbracelet/openai-go/shared" ) const ( diff --git a/providers/openaicompat/openaicompat.go b/providers/openaicompat/openaicompat.go index af8948579..9bd9a13b2 100644 --- a/providers/openaicompat/openaicompat.go +++ b/providers/openaicompat/openaicompat.go @@ -4,7 +4,7 @@ package openaicompat import ( "charm.land/fantasy" "charm.land/fantasy/providers/openai" - "github.com/openai/openai-go/v3/option" + "github.com/charmbracelet/openai-go/option" ) type options struct { diff --git a/providers/openaicompat/openaicompat_test.go b/providers/openaicompat/openaicompat_test.go index dab71f44b..df0965fa3 100644 --- a/providers/openaicompat/openaicompat_test.go +++ b/providers/openaicompat/openaicompat_test.go @@ -5,7 +5,7 @@ import ( "testing" "charm.land/fantasy" - "github.com/openai/openai-go/v3/packages/param" + "github.com/charmbracelet/openai-go/packages/param" "github.com/stretchr/testify/require" ) diff --git a/providers/openrouter/language_model_hooks.go b/providers/openrouter/language_model_hooks.go index b0ba9e997..d0f921226 100644 --- a/providers/openrouter/language_model_hooks.go +++ b/providers/openrouter/language_model_hooks.go @@ -11,9 +11,9 @@ import ( "charm.land/fantasy/providers/anthropic" "charm.land/fantasy/providers/google" "charm.land/fantasy/providers/openai" + openaisdk "github.com/charmbracelet/openai-go" + "github.com/charmbracelet/openai-go/packages/param" xstrings "github.com/charmbracelet/x/exp/strings" - openaisdk "github.com/openai/openai-go/v3" - "github.com/openai/openai-go/v3/packages/param" ) const reasoningStartedCtx = "reasoning_started" diff --git a/providers/openrouter/openrouter.go b/providers/openrouter/openrouter.go index fc9c9756b..623186bc6 100644 --- a/providers/openrouter/openrouter.go +++ b/providers/openrouter/openrouter.go @@ -6,7 +6,7 @@ import ( "charm.land/fantasy" "charm.land/fantasy/providers/openai" - "github.com/openai/openai-go/v3/option" + "github.com/charmbracelet/openai-go/option" ) type options struct { diff --git a/providers/vercel/language_model_hooks.go b/providers/vercel/language_model_hooks.go index 3e86a5958..24548e29b 100644 --- a/providers/vercel/language_model_hooks.go +++ b/providers/vercel/language_model_hooks.go @@ -11,8 +11,8 @@ import ( "charm.land/fantasy/providers/anthropic" "charm.land/fantasy/providers/google" openaipkg "charm.land/fantasy/providers/openai" - openaisdk "github.com/openai/openai-go/v3" - "github.com/openai/openai-go/v3/packages/param" + openaisdk "github.com/charmbracelet/openai-go" + "github.com/charmbracelet/openai-go/packages/param" ) const reasoningStartedCtx = "reasoning_started" diff --git a/providers/vercel/vercel.go b/providers/vercel/vercel.go index 79f31f1df..65e8d31c3 100644 --- a/providers/vercel/vercel.go +++ b/providers/vercel/vercel.go @@ -4,7 +4,7 @@ package vercel import ( "charm.land/fantasy" "charm.land/fantasy/providers/openai" - "github.com/openai/openai-go/v3/option" + "github.com/charmbracelet/openai-go/option" ) type options struct { From d15c8ff3789133cb5b40c94ad58a118bd1b997f8 Mon Sep 17 00:00:00 2001 From: fei Date: Tue, 22 Sep 2026 02:04:00 +0800 Subject: [PATCH 119/156] fix(jsonrepair): keep a positive exponent sign (#378) A "+" right after e or E belongs to the exponent, so "1E+2" is one number. The parser stopped collecting at the "+", which split the literal in two and let the leftover "+2" be re-read as separate values: {"a": [1E+2, 2e+3]} -> {"a": [1, "E+2", 2, "e+3"]} Trailing garbage is now stripped in a loop, so a truncated exponent such as "1E+" drops both the "+" and the "E" instead of leaving an unparseable "1E" behind. --- jsonrepair/jsonrepair.go | 22 ++++++++++---- jsonrepair/jsonrepair_test.go | 54 +++++++++++++++++++++++++++++++++++ 2 files changed, 71 insertions(+), 5 deletions(-) diff --git a/jsonrepair/jsonrepair.go b/jsonrepair/jsonrepair.go index 26aa5b98a..16d316ffd 100644 --- a/jsonrepair/jsonrepair.go +++ b/jsonrepair/jsonrepair.go @@ -436,7 +436,7 @@ func (p *parser) parseNumber() (any, error) { numberStr := "" char, ok := p.getCharAt(0) isArray := p.context.current != nil && *p.context.current == contextArray - for ok && strings.ContainsRune(numberChars, char) && (!isArray || char != ',' || strings.Contains(numberStr, "/")) { + for ok && (strings.ContainsRune(numberChars, char) || isExponentSign(char, numberStr)) && (!isArray || char != ',' || strings.Contains(numberStr, "/")) { if char != '_' { numberStr += string(char) } @@ -447,12 +447,13 @@ func (p *parser) parseNumber() (any, error) { p.index -= len([]rune(numberStr)) return p.parseString() } - if len(numberStr) > 0 { + for len(numberStr) > 0 { last := numberStr[len(numberStr)-1] - if last == '-' || last == 'e' || last == 'E' || last == '/' || last == ',' { - numberStr = numberStr[:len(numberStr)-1] - p.index-- + if last != '-' && last != 'e' && last != 'E' && last != '/' && last != ',' && last != '+' { + break } + numberStr = numberStr[:len(numberStr)-1] + p.index-- } if strings.Contains(numberStr, "/") || strings.Contains(numberStr, "-") || strings.Contains(numberStr, ",") { if numberStr == "-" { @@ -482,6 +483,17 @@ func (p *parser) parseNumber() (any, error) { return numberValue{raw: numberStr}, nil } +// isExponentSign reports whether char is the "+" of an exponent such as "1e+2". +// "+" is deliberately left out of numberChars: anywhere else it is not part of +// a JSON number and has to end the literal. +func isExponentSign(char rune, numberStr string) bool { + if char != '+' || numberStr == "" { + return false + } + last := numberStr[len(numberStr)-1] + return last == 'e' || last == 'E' +} + func (p *parser) parseObject() (any, error) { obj := newOrderedObject() startIndex := p.index diff --git a/jsonrepair/jsonrepair_test.go b/jsonrepair/jsonrepair_test.go index 5340543ff..c316b5a14 100644 --- a/jsonrepair/jsonrepair_test.go +++ b/jsonrepair/jsonrepair_test.go @@ -742,6 +742,11 @@ func TestParseNumber(t *testing.T) { "value": json.Number("1234.56"), }, }, + { + name: "positive_exponent", + input: "2E+3", + want: json.Number("2000.0"), + }, } for _, tc := range cases { @@ -828,6 +833,55 @@ func TestParseNumberEdgeCases(t *testing.T) { input: "{\"key\": 1e10 }", want: "{\"key\": 10000000000.0}", }, + // A "+" belongs to the exponent, so the literal stays one number. + { + name: "positive_exponent", + input: "{\"key\": 1E+2}", + want: "{\"key\": 100.0}", + }, + { + name: "lowercase_positive_exponent", + input: "{\"key\": 1e+2}", + want: "{\"key\": 100.0}", + }, + { + name: "negative_with_positive_exponent", + input: "{\"key\": -1E+2}", + want: "{\"key\": -100.0}", + }, + { + name: "positive_exponent_in_array", + input: "{\"a\": [1E+2, 2e+3]}", + want: "{\"a\": [100.0, 2000.0]}", + }, + { + name: "large_positive_exponent", + input: "{\"key\": 1e+10}", + want: "{\"key\": 10000000000.0}", + }, + // src/index.test.ts:46 and :51 of josdejong/jsonrepair assert these two + // pass through unchanged. formatFloat rewrites the text either way, so + // what is pinned here is the value: on b4bf5f9 "2300e+3" decodes to 2300. + { + name: "upstream_corpus_zero_exponent", + input: "0e+2", + want: "0.0", + }, + { + name: "upstream_corpus_large_exponent", + input: "2300e+3", + want: "2300000.0", + }, + { + name: "truncated_positive_exponent", + input: "{\"key\": 1E+}", + want: "{\"key\": 1}", + }, + { + name: "plus_outside_exponent", + input: "{\"key\": 1+2}", + want: "{\"key\": 1}", + }, { name: "bad_exponent", input: "{\"key\": 1e }", From dc0e0b805a61cf81ebbe40859590fcf2844e30f4 Mon Sep 17 00:00:00 2001 From: fei Date: Tue, 22 Sep 2026 02:04:20 +0800 Subject: [PATCH 120/156] fix(jsonrepair): return a top-level json string document (#380) parseJSON let a top-level value start with a number or with t/f/n, but not with a quote, so the opening quote of a document such as `"str"` was skipped as junk and whatever followed it was parsed as JSON. RepairJSON then dropped every string-typed result before serialize, so both paths gave the same empty answer with a nil error: "str" -> "" "[" -> [] "{a:b}" -> {"a": "b}"} Give strings the same onlyWhitespaceBefore gate the numbers and booleans already have, accepting only '"' rather than every isStringDelimiter rune so `'tis the season` stays junk, and serialize the non-blank arm of the string-typed guard. Blank strings still repair to "". Fixes #379 --- jsonrepair/jsonrepair.go | 12 ++- jsonrepair/jsonrepair_test.go | 181 ++++++++++++++++++++++++++++++++++ 2 files changed, 190 insertions(+), 3 deletions(-) diff --git a/jsonrepair/jsonrepair.go b/jsonrepair/jsonrepair.go index 16d316ffd..7badc545a 100644 --- a/jsonrepair/jsonrepair.go +++ b/jsonrepair/jsonrepair.go @@ -231,6 +231,13 @@ func (p *parser) parseJSON() (any, error) { return p.parseNumber() } } + // Only the JSON quote character, not every isStringDelimiter rune: text + // that begins with an apostrophe or a curly quote has to stay junk. + if p.context.empty && char == '"' { + if onlyWhitespaceBefore(p) { + return p.parseString() + } + } if char == '#' || char == '/' { return p.parseComment() } @@ -1472,11 +1479,10 @@ func RepairJSON(input string, opts ...Option) (string, error) { return "", err } if str, ok := value.(string); ok { - trimmed := strings.TrimSpace(str) - if str == "" || trimmed == "" { + if strings.TrimSpace(str) == "" { return "", nil } - return "", nil + return serialize(value, ensureASCIIValue(cfg)), nil } if value == "" { return "", nil diff --git a/jsonrepair/jsonrepair_test.go b/jsonrepair/jsonrepair_test.go index c316b5a14..e5023ff8f 100644 --- a/jsonrepair/jsonrepair_test.go +++ b/jsonrepair/jsonrepair_test.go @@ -1279,6 +1279,187 @@ func TestParseStringBasics(t *testing.T) { } } +// A document may be a single JSON string, so repairing one has to hand it back +// rather than returning nothing. +func TestTopLevelString(t *testing.T) { + cases := []struct { + name string + input string + want string + }{ + { + name: "quoted_word", + input: `"str"`, + want: `"str"`, + }, + { + name: "quoted_number", + input: `"42"`, + want: `"42"`, + }, + { + name: "quoted_boolean_word", + input: `"true"`, + want: `"true"`, + }, + { + name: "quoted_phrase", + input: `"a b"`, + want: `"a b"`, + }, + { + name: "quoted_non_ascii", + input: `"★"`, + want: `"\u2605"`, + }, + // Guards: the blank rule and the junk around a quote stay as they are. + { + name: "blank_quoted", + input: `" "`, + want: "", + }, + { + name: "empty_quoted", + input: `""`, + want: "", + }, + { + name: "lone_quote", + input: `"`, + want: "", + }, + { + name: "bare_word", + input: `string`, + want: "", + }, + { + name: "word_before_object", + input: `stringbeforeobject {}`, + want: `{}`, + }, + { + name: "single_quoted", + input: "'key'", + want: "", + }, + { + name: "quote_after_text", + input: `he said "hi" now`, + want: "", + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + got, err := RepairJSON(tc.input) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + if got != tc.want { + t.Fatalf("got %q want %q", got, tc.want) + } + }) + } +} + +// The option paths have to agree with the default one. +func TestTopLevelStringOptions(t *testing.T) { + cases := []struct { + name string + input string + opts []Option + want string + }{ + { + name: "strict", + input: `"str"`, + opts: []Option{WithStrict()}, + want: `"str"`, + }, + { + name: "stream_stable", + input: `"str"`, + opts: []Option{WithStreamStable()}, + want: `"str"`, + }, + { + name: "skip_json_loads", + input: `"str"`, + opts: []Option{WithSkipJSONLoads()}, + want: `"str"`, + }, + { + name: "ensure_ascii_off", + input: `"★"`, + opts: []Option{WithEnsureASCII(false)}, + want: `"★"`, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + got, err := RepairJSON(tc.input, tc.opts...) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + if got != tc.want { + t.Fatalf("got %q want %q", got, tc.want) + } + }) + } +} + +// Repairing the repaired string must not change it again. +func TestTopLevelStringIdempotent(t *testing.T) { + once, err := RepairJSON(`"str"`) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + twice, err := RepairJSON(once) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + if once != `"str"` || twice != once { + t.Fatalf("first pass %q, second pass %q", once, twice) + } +} + +func TestLoadsTopLevelString(t *testing.T) { + cases := []struct { + name string + input string + want string + }{ + { + name: "quoted_word", + input: `"str"`, + want: "str", + }, + { + name: "quoted_number", + input: `"42"`, + want: "42", + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + got, err := Loads(tc.input) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + str, ok := got.(string) + if !ok { + t.Fatalf("got %#v (%T) want the string %q", got, got, tc.want) + } + if str != tc.want { + t.Fatalf("got %q want %q", str, tc.want) + } + }) + } +} + func TestMissingAndMixedQuotes(t *testing.T) { cases := []struct { name string From f4e8673507a4c39f10dbd7a6af1444f797496933 Mon Sep 17 00:00:00 2001 From: fei Date: Tue, 22 Sep 2026 02:09:02 +0800 Subject: [PATCH 121/156] fix(jsonrepair): decode UTF-16 surrogate pairs as one code point (#372) The escape decoder turned each \uXXXX into a rune on its own, so a non-BMP character written as a surrogate pair came out as two U+FFFD replacement characters. The repaired text is still valid JSON, so the loss was silent. --- jsonrepair/jsonrepair.go | 33 ++++++++- jsonrepair/jsonrepair_test.go | 134 ++++++++++++++++++++++++++++++++++ 2 files changed, 166 insertions(+), 1 deletion(-) diff --git a/jsonrepair/jsonrepair.go b/jsonrepair/jsonrepair.go index 7badc545a..0aebe2f6c 100644 --- a/jsonrepair/jsonrepair.go +++ b/jsonrepair/jsonrepair.go @@ -959,8 +959,14 @@ func (p *parser) parseString() (any, error) { if len(nextChars) == numChars && isHexString(string(nextChars)) { p.log("Found a unicode escape sequence, normalizing it") parsed, _ := strconv.ParseInt(string(nextChars), 16, 32) - stringAcc = append(stringAcc[:len(stringAcc)-1], rune(parsed)) + code := rune(parsed) p.index += 1 + numChars + if char == 'u' { + if paired, isPair := p.readSurrogatePair(code); isPair { + code = paired + } + } + stringAcc = append(stringAcc[:len(stringAcc)-1], code) char, ok = p.getCharAt(0) continue } @@ -1194,6 +1200,31 @@ func (p *parser) parseString() (any, error) { return string(stringAcc), nil } +// readSurrogatePair consumes the \uXXXX escape that follows a surrogate, so a +// non-BMP character decodes to one code point instead of two invalid ones. +func (p *parser) readSurrogatePair(high rune) (rune, bool) { + if !utf16.IsSurrogate(high) { + return 0, false + } + if p.sliceString(p.index, p.index+2) != "\\u" { + return 0, false + } + digits := p.sliceString(p.index+2, p.index+6) + if !isHexString(digits) { + return 0, false + } + parsed, err := strconv.ParseInt(digits, 16, 32) + if err != nil { + return 0, false + } + combined := utf16.DecodeRune(high, rune(parsed)) + if combined == unicode.ReplacementChar { + return 0, false + } + p.index += 6 + return combined, true +} + func (p *parser) parseBooleanOrNull() any { char, ok := p.getCharAt(0) if !ok { diff --git a/jsonrepair/jsonrepair_test.go b/jsonrepair/jsonrepair_test.go index e5023ff8f..8ce3b4390 100644 --- a/jsonrepair/jsonrepair_test.go +++ b/jsonrepair/jsonrepair_test.go @@ -1848,3 +1848,137 @@ func TestParseBooleanOrNull(t *testing.T) { }) } } + +// TestRepairJSONUnicodeSurrogatePairs covers the two \uXXXX escapes a non-BMP +// character is encoded as when the JSON text stays ASCII. +func TestRepairJSONUnicodeSurrogatePairs(t *testing.T) { + cases := []struct { + name string + input string + opts []Option + want string + }{ + { + name: "valid_pair_is_preserved", + input: `{"key": "\ud83d\ude00"}`, + want: `{"key": "\ud83d\ude00"}`, + }, + { + name: "pair_in_uppercase_hex", + input: `{"key": "\uD83D\uDE00"}`, + want: `{"key": "\ud83d\ude00"}`, + }, + { + name: "pair_written_literally", + input: `{"key": "\ud83d\ude00"}`, + opts: []Option{WithEnsureASCII(false)}, + want: `{"key": "😀"}`, + }, + { + name: "pair_in_object_key", + input: `{"\ud83d\ude00k": 1}`, + want: `{"\ud83d\ude00k": 1}`, + }, + { + name: "pair_in_array_item", + input: `["\ud83d\ude00", "x"]`, + want: `["\ud83d\ude00", "x"]`, + }, + { + name: "pair_then_bmp_escape", + input: `{"key": "\ud83d\ude00\u263a"}`, + want: `{"key": "\ud83d\ude00\u263a"}`, + }, + { + name: "truncated_object_with_pair", + input: `{"text": "hi \ud83d\ude00"`, + want: `{"text": "hi \ud83d\ude00"}`, + }, + { + name: "lone_high_surrogate_stays_replaced", + input: `{"key": "\ud83d"}`, + want: `{"key": "\ufffd"}`, + }, + { + name: "orphan_low_surrogate_stays_replaced", + input: `{"key": "\ude00"}`, + want: `{"key": "\ufffd"}`, + }, + { + name: "two_high_surrogates_stay_replaced", + input: `{"key": "\ud83d\ud83d"}`, + want: `{"key": "\ufffd\ufffd"}`, + }, + { + name: "high_surrogate_then_bmp_escape", + input: `{"key": "\ud83d\u263a"}`, + want: `{"key": "\ufffd\u263a"}`, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + got, err := RepairJSON(tc.input, tc.opts...) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + if got != tc.want { + t.Fatalf("got %q want %q", got, tc.want) + } + }) + } +} + +// TestRepairJSONUnicodeMatchesStdlib pins the invariant: repairing valid JSON +// must not change the value it decodes to. +func TestRepairJSONUnicodeMatchesStdlib(t *testing.T) { + nonASCII := []string{ + `"\ud83d\ude00"`, + `"\ud83d\ude00\ud83c\udf89"`, + `"emoji: \ud83d\ude00"`, + `"\ud840\udc00"`, + `"\u263a"`, + `"\ufffd"`, + `"\ud83d"`, + } + for _, raw := range nonASCII { + input := `{"key": ` + raw + `}` + var want any + if err := json.Unmarshal([]byte(input), &want); err != nil { + t.Fatalf("input %q is not valid json: %v", input, err) + } + repaired, err := RepairJSON(input) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + var got any + if err := json.Unmarshal([]byte(repaired), &got); err != nil { + t.Fatalf("repaired %q is not valid json: %v", repaired, err) + } + if !reflect.DeepEqual(want, got) { + t.Fatalf("input %q repaired %q: got %#v want %#v", input, repaired, got, want) + } + } +} + +// TestRepairJSONIdempotentOnOwnOutput feeds the repairer its own result back in, +// as happens when a streamed tool call is repaired again on the next chunk. +func TestRepairJSONIdempotentOnOwnOutput(t *testing.T) { + for _, input := range []string{ + `{"key": "😀 café 中"}`, + `{"key": "\ud83d\ude00"}`, + `{"items": ["\ud83c\udf89", "\ud840\udc00"]}`, + } { + first, err := RepairJSON(input) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + second, err := RepairJSON(first) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + if first != second { + t.Fatalf("input %q: first %q second %q", input, first, second) + } + } +} From 3ba6eac1727b031f67bd91a36164708aa88a4d4c Mon Sep 17 00:00:00 2001 From: fei Date: Tue, 22 Sep 2026 02:11:08 +0800 Subject: [PATCH 122/156] fix(jsonrepair): keep escape-decoded newlines at the end of a string (#374) parseString() decided whether to right-trim a string by looking at the last rune it had decoded, so a "\n" escape and a raw line break in the source were indistinguishable: repairing an already valid document silently removed its trailing whitespace. Trim only when the line break is literally present in the input before the closing quote, which is what the unterminated-string repair was meant to handle. Fixes #373 --- jsonrepair/jsonrepair.go | 7 +++++- jsonrepair/jsonrepair_test.go | 42 +++++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+), 1 deletion(-) diff --git a/jsonrepair/jsonrepair.go b/jsonrepair/jsonrepair.go index 0aebe2f6c..38b0f2310 100644 --- a/jsonrepair/jsonrepair.go +++ b/jsonrepair/jsonrepair.go @@ -1168,7 +1168,12 @@ func (p *parser) parseString() (any, error) { } else { p.index++ } - if !p.streamStable && (missingQuotes || (len(stringAcc) > 0 && stringAcc[len(stringAcc)-1] == '\n')) { + // Only a line break that is literally present in the source is dropped here. An + // escaped \n decodes to the same rune but is string content, so trimming it would + // silently change an already valid document. + prevChar, hasPrevChar := p.getCharAt(-2) + rawTrailingNewline := ok && char == rdelim && hasPrevChar && prevChar == '\n' + if !p.streamStable && (missingQuotes || rawTrailingNewline) { stringAcc = trimRightWhitespace(stringAcc) } if missingQuotes && p.context.empty { diff --git a/jsonrepair/jsonrepair_test.go b/jsonrepair/jsonrepair_test.go index 8ce3b4390..118f4bcbb 100644 --- a/jsonrepair/jsonrepair_test.go +++ b/jsonrepair/jsonrepair_test.go @@ -1607,6 +1607,48 @@ func TestEscaping(t *testing.T) { input: "{\"key_1\n\": \"value\"}", want: "{\"key_1\": \"value\"}", }, + // Regression tests for #373: a newline that came from an escape sequence is + // string content, so repairing an already valid document must not trim it. + { + name: "escaped_newline_at_end_of_value", + input: "{\"key\": \"line\\n\"}", + want: "{\"key\": \"line\\n\"}", + }, + { + name: "escaped_newline_at_end_of_key", + input: "{\"key\\n\": \"value\"}", + want: "{\"key\\n\": \"value\"}", + }, + { + name: "escaped_crlf_at_end_of_value", + input: "{\"key\": \"line\\r\\n\"}", + want: "{\"key\": \"line\\r\\n\"}", + }, + { + name: "escaped_newlines_at_end_of_value", + input: "{\"key\": \"line\\n\\n\"}", + want: "{\"key\": \"line\\n\\n\"}", + }, + { + name: "unicode_escaped_newline_at_end_of_value", + input: "{\"key\": \"line\\u000a\"}", + want: "{\"key\": \"line\\n\"}", + }, + { + name: "trailing_space_before_escaped_newline", + input: "{\"key\": \"line \\n\"}", + want: "{\"key\": \"line \\n\"}", + }, + { + name: "escaped_newline_before_trailing_space", + input: "{\"key\": \"line\\n \"}", + want: "{\"key\": \"line\\n \"}", + }, + { + name: "raw_newline_at_end_of_value", + input: "{\"key\": \"line\n\"}", + want: "{\"key\": \"line\"}", + }, { name: "tab_in_key", input: "{\"key\t_\": \"value\"}", From 314d85d1d97cf2bd1af05bab4e2012541026d290 Mon Sep 17 00:00:00 2001 From: fei Date: Tue, 22 Sep 2026 02:18:02 +0800 Subject: [PATCH 123/156] fix(jsonrepair): keep the sign of a negative number (#376) The "this is not actually a number" test in parseNumber scanned the collected literal for any "-", so it also matched the leading sign and re-emitted -1, -3.5 and -0 as strings, changing their JSON type. Only a "-" inside the literal, as in 10-20 or a UUID, marks something that is not a plain JSON number, so look from the second character onward and treat a "-" after an exponent marker as part of the exponent. A bare "-" never reaches the branch today because the trailing-character strip already removes it; the early guard keeps that behaviour direct instead of relying on the strip. Fixes #375 --- jsonrepair/jsonrepair.go | 28 ++++++++++++----- jsonrepair/jsonrepair_test.go | 58 ++++++++++++++++++++++++++++++++++- 2 files changed, 78 insertions(+), 8 deletions(-) diff --git a/jsonrepair/jsonrepair.go b/jsonrepair/jsonrepair.go index 38b0f2310..8ef013991 100644 --- a/jsonrepair/jsonrepair.go +++ b/jsonrepair/jsonrepair.go @@ -462,10 +462,10 @@ func (p *parser) parseNumber() (any, error) { numberStr = numberStr[:len(numberStr)-1] p.index-- } - if strings.Contains(numberStr, "/") || strings.Contains(numberStr, "-") || strings.Contains(numberStr, ",") { - if numberStr == "-" { - return "", nil - } + if numberStr == "" || numberStr == "-" { + return "", nil + } + if hasNumericSeparator(numberStr) { if strings.ContainsAny(numberStr, "eE") { floatVal, err := strconv.ParseFloat(numberStr, 64) if err == nil { @@ -484,9 +484,6 @@ func (p *parser) parseNumber() (any, error) { } return numberStr, nil } - if numberStr == "" { - return "", nil - } return numberValue{raw: numberStr}, nil } @@ -501,6 +498,23 @@ func isExponentSign(char rune, numberStr string) bool { return last == 'e' || last == 'E' } +// hasNumericSeparator reports whether the characters collected as a number are +// interleaved with something that cannot appear in a JSON number, such as the +// "-" of "10-20" or the "/" of "1/3". A "-" at the front is a sign and a "-" +// right after an exponent marker belongs to the exponent, so neither counts: +// both leave a literal that must keep its number type. +func hasNumericSeparator(numberStr string) bool { + if strings.ContainsAny(numberStr, "/,") { + return true + } + for i := 1; i < len(numberStr); i++ { + if numberStr[i] == '-' && numberStr[i-1] != 'e' && numberStr[i-1] != 'E' { + return true + } + } + return false +} + func (p *parser) parseObject() (any, error) { obj := newOrderedObject() startIndex := p.index diff --git a/jsonrepair/jsonrepair_test.go b/jsonrepair/jsonrepair_test.go index 118f4bcbb..67bcd8bb0 100644 --- a/jsonrepair/jsonrepair_test.go +++ b/jsonrepair/jsonrepair_test.go @@ -747,6 +747,23 @@ func TestParseNumber(t *testing.T) { input: "2E+3", want: json.Number("2000.0"), }, + { + name: "negative_integer", + input: "-10", + want: json.Number("-10"), + }, + { + name: "negative_float", + input: "-0.5", + want: json.Number("-0.5"), + }, + { + name: "negative_in_object", + input: "{\"offset\": -10}", + want: map[string]any{ + "offset": json.Number("-10"), + }, + }, } for _, tc := range cases { @@ -755,8 +772,10 @@ func TestParseNumber(t *testing.T) { if err != nil { t.Fatalf("unexpected error: %v", err) } + // The types matter here: "%#v" prints a string and a json.Number + // identically, so a value-level message hides the real regression. if !reflect.DeepEqual(got, tc.want) { - t.Fatalf("got %#v want %#v", got, tc.want) + t.Fatalf("got %#v (%T) want %#v (%T)", got, got, tc.want, tc.want) } }) } @@ -808,6 +827,43 @@ func TestParseNumberEdgeCases(t *testing.T) { input: "{\"key\": 1/3, \"foo\": \"bar\"}", want: "{\"key\": \"1/3\", \"foo\": \"bar\"}", }, + // Regression tests for #375: a leading "-" is a sign, so a negative + // number is a valid JSON number and must not be quoted into a string. + { + name: "negative_integer", + input: "{\"key\": -1}", + want: "{\"key\": -1}", + }, + { + name: "negative_float", + input: "{\"key\": -3.5}", + want: "{\"key\": -3.5}", + }, + { + name: "negative_zero", + input: "{\"key\": -0}", + want: "{\"key\": -0}", + }, + { + name: "negative_in_array", + input: "{\"offsets\": [-1, -2]}", + want: "{\"offsets\": [-1, -2]}", + }, + { + name: "negative_exponent", + input: "{\"key\": -1e-3}", + want: "{\"key\": -0.001}", + }, + { + name: "negative_in_truncated_object", + input: "{\"offset\": -1", + want: "{\"offset\": -1}", + }, + { + name: "negative_in_array_of_objects", + input: "[{\"a\": -1}, {\"b\": -2.5}]", + want: "[{\"a\": -1}, {\"b\": -2.5}]", + }, { name: "dash_number", input: "{\"key\": 10-20}", From d6020d0bb793da7a2086fb66d17ab5f793c11eab Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Mon, 21 Sep 2026 15:36:23 -0300 Subject: [PATCH 124/156] fix(openai): recognize baseten input-length error as context overflow (#382) Assisted-by: Crush:prism --- providers/openai/error.go | 7 +++++++ providers/openai/openai_test.go | 7 +++++++ 2 files changed, 14 insertions(+) diff --git a/providers/openai/error.go b/providers/openai/error.go index 230104574..d609a7786 100644 --- a/providers/openai/error.go +++ b/providers/openai/error.go @@ -18,6 +18,7 @@ import ( var ( openaiContextPattern = regexp.MustCompile(`maximum context length (?:is|of) (\d+) tokens.*?(?:resulted in|requested) ~?(\d+) tokens`) alibabaContextPattern = regexp.MustCompile(`Range of input length should be \[\d+,\s*(\d+)\]`) + basetenContextPattern = regexp.MustCompile(`Input length (\d+) exceeds the maximum allowed input length of (\d+) tokens`) vercelContextPattern = regexp.MustCompile(`Input too long:\s*(\d+)\s*input tokens,\s*limit is\s*(\d+)`) ) @@ -90,6 +91,12 @@ func parseContextTooLargeError(message string, providerErr *fantasy.ProviderErro providerErr.ContextMaxTokens, _ = strconv.Atoi(matches[1]) return } + if matches := basetenContextPattern.FindStringSubmatch(message); matches != nil { + providerErr.ContextTooLargeErr = true + providerErr.ContextUsedTokens, _ = strconv.Atoi(matches[1]) + providerErr.ContextMaxTokens, _ = strconv.Atoi(matches[2]) + return + } if matches := vercelContextPattern.FindStringSubmatch(message); matches != nil { providerErr.ContextTooLargeErr = true providerErr.ContextUsedTokens, _ = strconv.Atoi(matches[1]) diff --git a/providers/openai/openai_test.go b/providers/openai/openai_test.go index c8491378b..aa985b1e5 100644 --- a/providers/openai/openai_test.go +++ b/providers/openai/openai_test.go @@ -4002,6 +4002,13 @@ func TestParseContextTooLargeError(t *testing.T) { wantErr: true, wantMax: 245760, }, + { + name: "matches baseten format", + message: "Input length 265059 exceeds the maximum allowed input length of 262112 tokens.", + wantErr: true, + wantUsed: 265059, + wantMax: 262112, + }, { name: "matches vercel format", message: "Input too long: 518063 input tokens, limit is 262144 for this model", From 540ae6b96047a4af363a78b5882d72630faa25bf Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Tue, 22 Sep 2026 11:34:19 -0300 Subject: [PATCH 125/156] fix(openai): stream reasoning before content on batched chunks (#383) A batching host may put the reasoning tail and the first content or tool-call token in the same SSE delta. The reasoning hook ran after the content loop, so that chunk yielded the content parts first and the reasoning tail (and its end) after: block-based stream consumers, such as Anthropic-shaped /messages endpoints, close the reasoning block the moment a text or tool part opens, and the reasoning emitted afterwards lands on a duplicate block index and corrupts client reassembly. Run the extra hook before the per-choice content loop so reasoning parts for a chunk always precede that chunk's content and tool parts. Assisted-by: Crush:prism --- providers/openai/language_model.go | 25 ++++---- .../openaicompat/language_model_hooks.go | 8 +-- providers/openaicompat/replay_test.go | 62 +++++++++++++++++++ 3 files changed, 80 insertions(+), 15 deletions(-) diff --git a/providers/openai/language_model.go b/providers/openai/language_model.go index 56706d1b3..af38cf80a 100644 --- a/providers/openai/language_model.go +++ b/providers/openai/language_model.go @@ -489,6 +489,20 @@ func (o languageModel) Stream(ctx context.Context, call fantasy.Call) (fantasy.S if len(chunk.Choices) == 0 { continue } + // The extra hook receives the whole chunk and iterates choices + // itself; calling it per choice would duplicate its events once + // per additional choice. It must run before the content/tool + // loop: when a batching host puts the reasoning tail and the + // first content/tool-call token in the same delta, the reasoning + // belongs before that content — yielding it after inverts the + // part order and breaks block-based consumers. + if o.streamExtraFunc != nil { + updatedContext, shouldContinue := o.streamExtraFunc(chunk, yield, extraContext) + if !shouldContinue { + return + } + extraContext = updatedContext + } for _, choice := range chunk.Choices { if choice.FinishReason != "" { finishReason = choice.FinishReason @@ -579,17 +593,6 @@ func (o languageModel) Stream(ctx context.Context, call fantasy.Call) (fantasy.S } } } - - // The extra hook receives the whole chunk and iterates choices - // itself; calling it per choice would duplicate its events once - // per additional choice. - if o.streamExtraFunc != nil { - updatedContext, shouldContinue := o.streamExtraFunc(chunk, yield, extraContext) - if !shouldContinue { - return - } - extraContext = updatedContext - } for _, choice := range chunk.Choices { if annotations := parseAnnotationsFromDelta(choice.Delta); len(annotations) > 0 { for _, annotation := range annotations { diff --git a/providers/openaicompat/language_model_hooks.go b/providers/openaicompat/language_model_hooks.go index 2dac8f7b4..b5fea2bfe 100644 --- a/providers/openaicompat/language_model_hooks.go +++ b/providers/openaicompat/language_model_hooks.go @@ -168,10 +168,10 @@ func StreamExtraFunc(chunk openaisdk.ChatCompletionChunk, yield func(fantasy.Str if reasoningStarted && boundary { ctx[startedKey] = false ctx[endedKey] = true - // The openai main loop emits a chunk's text/tool-call parts before - // this hook runs, so on a batched boundary chunk the part order is - // ToolInputStart, ReasoningDelta(tail), ReasoningEnd. Parts are - // keyed by id, so consumers can still attribute them correctly. + // The openai main loop runs this hook before emitting a chunk's + // text/tool-call parts, so on a batched boundary chunk the part order + // is ReasoningDelta(tail), ReasoningEnd, then the content/tool parts: + // the reasoning in that delta semantically precedes the content. if !yield(fantasy.StreamPart{ Type: fantasy.StreamPartTypeReasoningEnd, ID: fmt.Sprintf("%d", inx), diff --git a/providers/openaicompat/replay_test.go b/providers/openaicompat/replay_test.go index 647d87e27..fa9c2b527 100644 --- a/providers/openaicompat/replay_test.go +++ b/providers/openaicompat/replay_test.go @@ -293,6 +293,68 @@ func TestReplay_DeepSeekBatchedBoundaryChunk(t *testing.T) { }) require.Equal(t, "Need the date. Calling.", reasoningText(parts)) require.Equal(t, 1, countType(parts, fantasy.StreamPartTypeToolCall), "types: %v", partTypes(parts)) + // The reasoning tail rides the same delta as the tool call, so it must + // be yielded before the tool parts: block-based consumers (e.g. + // Anthropic-shaped /messages endpoints) close their reasoning block when + // a tool part opens, and reasoning emitted after it lands in a block + // that was already closed. + lastReasoning, firstTool := -1, -1 + for i, p := range parts { + if p.Type == fantasy.StreamPartTypeReasoningDelta || p.Type == fantasy.StreamPartTypeReasoningEnd { + lastReasoning = i + } + if firstTool == -1 && (p.Type == fantasy.StreamPartTypeToolInputStart || p.Type == fantasy.StreamPartTypeToolCall) { + firstTool = i + } + } + require.Greater(t, lastReasoning, -1) + require.Greater(t, firstTool, -1) + require.Less(t, lastReasoning, firstTool, + "reasoning must precede tool parts on a batched boundary chunk: %v", partTypes(parts)) +} + +// A batching host may also put the reasoning tail and the first content token +// in the same delta. The reasoning must be yielded before the text parts for +// the same reason as above: a consumer that closes its reasoning block when +// text opens cannot place reasoning emitted afterwards. +const deepseekBatchedContentBoundarySSE = `{"id":"x","created":1,"model":"deepseek-v4-flash","choices":[{"index":0,"delta":{"role":"assistant","content":"","reasoning_content":null},"finish_reason":null}]} +{"id":"x","created":1,"model":"deepseek-v4-flash","choices":[{"index":0,"delta":{"content":null,"reasoning_content":"Long thinking about the answer."},"finish_reason":null}]} +{"id":"x","created":1,"model":"deepseek-v4-flash","choices":[{"index":0,"delta":{"content":"Hello","reasoning_content":" Done."},"finish_reason":null}]} +{"id":"x","created":1,"model":"deepseek-v4-flash","choices":[{"index":0,"delta":{"content":" world.","reasoning_content":null},"finish_reason":null}]} +{"id":"x","created":1,"model":"deepseek-v4-flash","choices":[{"index":0,"delta":{"content":"","reasoning_content":null},"finish_reason":"stop"}]}` + +func TestReplay_BatchedContentBoundaryChunkOrder(t *testing.T) { + srv, _ := serveSSE(t, deepseekBatchedContentBoundarySSE) + provider, err := New(WithBaseURL(srv.URL), WithAPIKey("x")) + require.NoError(t, err) + lm, err := provider.LanguageModel(context.Background(), "deepseek-v4-flash") + require.NoError(t, err) + + parts := streamParts(t, lm, fantasy.Prompt{ + {Role: fantasy.MessageRoleUser, Content: []fantasy.MessagePart{fantasy.TextPart{Text: "hi"}}}, + }) + require.Equal(t, "Long thinking about the answer. Done.", reasoningText(parts)) + var text strings.Builder + for _, p := range parts { + if p.Type == fantasy.StreamPartTypeTextDelta { + text.WriteString(p.Delta) + } + } + require.Equal(t, "Hello world.", text.String()) + + lastReasoning, firstText := -1, -1 + for i, p := range parts { + if p.Type == fantasy.StreamPartTypeReasoningDelta || p.Type == fantasy.StreamPartTypeReasoningEnd { + lastReasoning = i + } + if firstText == -1 && (p.Type == fantasy.StreamPartTypeTextStart || p.Type == fantasy.StreamPartTypeTextDelta) { + firstText = i + } + } + require.Greater(t, lastReasoning, -1) + require.Greater(t, firstText, -1) + require.Less(t, lastReasoning, firstText, + "reasoning must precede text parts on a batched boundary chunk: %v", partTypes(parts)) } // A.5: Kimi/Avian shape. Reasoning chunks carry reasoning_content, content From e394d2e6839ab5544797dbccce8c4eff4b156d00 Mon Sep 17 00:00:00 2001 From: yanyukang2003-ux Date: Tue, 22 Sep 2026 10:38:37 -0400 Subject: [PATCH 126/156] fix(retry): never retry a step because a tool returned an error (#367) In the streaming agent the retry closure wraps processStepStream, which returns the first tool that failed with a Go error as the step error. That error was classified like a provider failure: any net.Error is retried by type, and syscall.Errno and *url.Error implement the interface, so every wrapped file-system or HTTP error a tool returned re-ran the whole step, re-requesting the model and re-executing every tool, MaxRetries times. A tool wrapping a retryable *ProviderError retried the outer step too. Wrap the critical tool error in a new ToolExecutionError (tool name, call id, Unwrap to the tool's error) and treat it as non-retryable before any other classification. The Generate path is unaffected: it executes tools outside its retry closure. Co-authored-by: Claude Fable 5.1 --- agent.go | 12 +++++-- agent_stream_test.go | 79 +++++++++++++++++++++++++++++++++++++++++++ errors.go | 21 ++++++++++++ retry.go | 12 ++++++- retry_test.go | 80 ++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 201 insertions(+), 3 deletions(-) diff --git a/agent.go b/agent.go index 5843471b5..9a9a4de95 100644 --- a/agent.go +++ b/agent.go @@ -1683,7 +1683,11 @@ func (a *agent) processStepStream(ctx context.Context, stream StreamResponse, op toolResults = append(toolResults, result) if isCriticalError && toolExecutionErr == nil { if errorResult, ok := result.Result.(ToolResultOutputContentError); ok && errorResult.Error != nil { - toolExecutionErr = errorResult.Error + toolExecutionErr = &ToolExecutionError{ + ToolName: result.ToolName, + ToolCallID: result.ToolCallID, + Err: errorResult.Error, + } } } toolStateMu.Unlock() @@ -1695,7 +1699,11 @@ func (a *agent) processStepStream(ctx context.Context, stream StreamResponse, op toolResults = append(toolResults, result) if isCriticalError && toolExecutionErr == nil { if errorResult, ok := result.Result.(ToolResultOutputContentError); ok && errorResult.Error != nil { - toolExecutionErr = errorResult.Error + toolExecutionErr = &ToolExecutionError{ + ToolName: result.ToolName, + ToolCallID: result.ToolCallID, + Err: errorResult.Error, + } } } toolStateMu.Unlock() diff --git a/agent_stream_test.go b/agent_stream_test.go index cada78c14..a0311f25d 100644 --- a/agent_stream_test.go +++ b/agent_stream_test.go @@ -3,9 +3,12 @@ package fantasy import ( "context" "encoding/json" + "errors" "fmt" + "net" "strings" "sync" + "sync/atomic" "testing" "time" @@ -1056,3 +1059,79 @@ func TestStreamingAgent_ProviderExecutedToolCallGatedOnFinish(t *testing.T) { }) } } + +// TestStreamingAgent_ToolErrorIsNotRetried pins that a Go error returned +// from a tool's Run function ends the step without re-running it: the model +// is asked once, the tool runs once, OnRetry never fires, and the caller +// gets a ToolExecutionError that still unwraps to the tool's own error. The +// tool error here satisfies net.Error, which the retry loop treats as a +// transient network failure when it comes from the provider request. +func TestStreamingAgent_ToolErrorIsNotRetried(t *testing.T) { + t.Parallel() + + type input struct{} + toolErr := &net.OpError{Op: "dial", Net: "tcp", Err: errors.New("connection refused")} + + for _, tc := range []struct { + name string + tool func(runs *atomic.Int32) AgentTool + }{ + { + name: "sequential tool", + tool: func(runs *atomic.Int32) AgentTool { + return NewAgentTool("boom", "always fails", + func(ctx context.Context, in input, call ToolCall) (ToolResponse, error) { + runs.Add(1) + return ToolResponse{}, toolErr + }) + }, + }, + { + name: "parallel tool", + tool: func(runs *atomic.Int32) AgentTool { + return NewParallelAgentTool("boom", "always fails", + func(ctx context.Context, in input, call ToolCall) (ToolResponse, error) { + runs.Add(1) + return ToolResponse{}, toolErr + }) + }, + }, + } { + t.Run(tc.name, func(t *testing.T) { + t.Parallel() + + var toolRuns, streamCalls atomic.Int32 + mockModel := &mockLanguageModel{ + streamFunc: func(ctx context.Context, call Call) (StreamResponse, error) { + streamCalls.Add(1) + return func(yield func(StreamPart) bool) { + if !yield(StreamPart{Type: StreamPartTypeToolCall, ID: "call-1", ToolCallName: "boom", ToolCallInput: `{}`}) { + return + } + yield(StreamPart{Type: StreamPartTypeFinish, FinishReason: FinishReasonToolCalls, Usage: Usage{TotalTokens: 10}}) + }, nil + }, + } + + agent := NewAgent(mockModel, WithTools(tc.tool(&toolRuns))) + retries := 0 + _, err := agent.Stream(context.Background(), AgentStreamCall{ + Prompt: "run boom", + OnRetry: func(err *ProviderError, delay time.Duration) { + retries++ + }, + }) + require.Error(t, err) + + var execErr *ToolExecutionError + require.ErrorAs(t, err, &execErr) + require.Equal(t, "boom", execErr.ToolName) + require.Equal(t, "call-1", execErr.ToolCallID) + require.ErrorIs(t, err, toolErr, "the tool's own error must stay reachable") + + require.Equal(t, int32(1), streamCalls.Load(), "the step must not be re-run against the model") + require.Equal(t, int32(1), toolRuns.Load(), "the tool must not be re-executed") + require.Equal(t, 0, retries, "OnRetry must not fire for a tool error") + }) + } +} diff --git a/errors.go b/errors.go index d7861fc13..8954e8052 100644 --- a/errors.go +++ b/errors.go @@ -281,6 +281,27 @@ func (e RetryError) Unwrap() error { return nil } +// ToolExecutionError is returned by the agent when a tool's Run function +// returns a Go error. The failure ends the step, and it is never retried: +// the error is local to the tool, so re-running the step would only repeat +// the model request and re-execute every tool in it. Callers can use +// errors.As to find it and errors.Unwrap (or errors.Is/As) to reach the +// tool's own error. +type ToolExecutionError struct { + ToolName string + ToolCallID string + Err error +} + +func (e *ToolExecutionError) Error() string { + return fmt.Sprintf("tool %q failed: %v", e.ToolName, e.Err) +} + +// Unwrap returns the error the tool returned. +func (e *ToolExecutionError) Unwrap() error { + return e.Err +} + // ErrorTitleForStatusCode returns a human-readable title for a given HTTP status code. func ErrorTitleForStatusCode(statusCode int) string { return strings.ToLower(http.StatusText(statusCode)) diff --git a/retry.go b/retry.go index 67dd469ef..3e2ad220c 100644 --- a/retry.go +++ b/retry.go @@ -176,11 +176,21 @@ func isAuthError(err *ProviderError) bool { } // isRetryableError reports whether the error should be retried. -// It checks for retryable ProviderError, network-level connection errors +// A ToolExecutionError is never retried. Otherwise it checks for +// retryable ProviderError, network-level connection errors // (DNS failures, TCP timeouts, connection refused), and HTTP/2 stream- // level transport errors. The latter two categories may not be wrapped // in ProviderError when they occur outside the provider's error handler. func isRetryableError(err error) bool { + // A tool's Go error is local to the tool: re-running the step would + // repeat the model request and re-execute every tool in it without + // changing the outcome. Checked before ProviderError so a tool that + // surfaces a retryable provider error (a sub-agent hitting a 429, for + // example) does not retry the outer step either. + var toolErr *ToolExecutionError + if errors.As(err, &toolErr) { + return false + } var providerErr *ProviderError if errors.As(err, &providerErr) { return providerErr.IsRetryable() diff --git a/retry_test.go b/retry_test.go index ad1b7c429..b258b7c7c 100644 --- a/retry_test.go +++ b/retry_test.go @@ -474,3 +474,83 @@ func TestRetryWithExponentialBackoff_FractionalRetryHeader(t *testing.T) { t.Errorf("attempts = %d, want 1", attempts) } } + +func TestIsRetryableError_ToolExecutionError(t *testing.T) { + t.Parallel() + + t.Run("tool error wrapping a net.Error is not retryable", func(t *testing.T) { + t.Parallel() + err := &ToolExecutionError{ + ToolName: "view", + ToolCallID: "call-1", + Err: &net.OpError{Op: "dial", Net: "tcp", Err: errors.New("connection refused")}, + } + if isRetryableError(err) { + t.Error("expected a tool execution error to not be retryable") + } + }) + + t.Run("tool error wrapping a retryable ProviderError is not retryable", func(t *testing.T) { + t.Parallel() + err := &ToolExecutionError{ + ToolName: "sub_agent", + ToolCallID: "call-1", + Err: &ProviderError{StatusCode: 429, Message: "rate limited"}, + } + if isRetryableError(err) { + t.Error("expected a tool execution error to not be retryable") + } + }) + + t.Run("unwraps to the tool's own error", func(t *testing.T) { + t.Parallel() + inner := &net.OpError{Op: "dial", Net: "tcp", Err: errors.New("connection refused")} + err := error(&ToolExecutionError{ToolName: "fetch", ToolCallID: "call-1", Err: inner}) + var opErr *net.OpError + if !errors.As(err, &opErr) { + t.Fatal("expected errors.As to reach the wrapped net.OpError") + } + if got, want := err.Error(), `tool "fetch" failed: dial tcp: connection refused`; got != want { + t.Fatalf("Error() = %q, want %q", got, want) + } + }) +} + +func TestRetryWithExponentialBackoff_ToolExecutionError(t *testing.T) { + t.Parallel() + + attempts := 0 + retries := 0 + opts := RetryOptions{ + MaxRetries: 2, + InitialDelayIn: 1 * time.Millisecond, + BackoffFactor: 2.0, + OnRetry: func(err *ProviderError, delay time.Duration) { + retries++ + }, + } + toolErr := &ToolExecutionError{ + ToolName: "view", + ToolCallID: "call-1", + Err: &net.OpError{Op: "dial", Net: "tcp", Err: errors.New("connection refused")}, + } + + retryFn := RetryWithExponentialBackoffRespectingRetryHeaders[int](opts) + _, err := retryFn(context.Background(), func() (int, error) { + attempts++ + return 0, toolErr + }) + if !errors.Is(err, toolErr) { + t.Fatalf("expected the tool execution error to be returned as-is, got %v", err) + } + var retryErr *RetryError + if errors.As(err, &retryErr) { + t.Fatalf("expected no RetryError wrapper on a first-try failure, got %v", err) + } + if attempts != 1 { + t.Fatalf("expected 1 attempt, got %d", attempts) + } + if retries != 0 { + t.Fatalf("expected OnRetry not to be called, got %d calls", retries) + } +} From ec258577c7d825ec38cfdf8cbeaaa2f7e197aacd Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Tue, 22 Sep 2026 11:39:36 -0300 Subject: [PATCH 127/156] v0.45.1 --- version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.txt b/version.txt index a8ab6c966..ff12df2fb 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -0.44.0 +0.45.1 From 58c2e71509523bbce8c68bb6b0b85dc09352e0c1 Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Wed, 23 Sep 2026 10:10:28 -0300 Subject: [PATCH 128/156] fix(openai): recognize fireworks prompt-too-long error as context overflow (#385) Fireworks reports an oversized prompt with "The prompt is too long: N, model maximum context length: M", which was not matched, so a context overflow looked like a generic provider failure. Capture the used and maximum token counts so it is handled like the other providers. Assisted-by: Crush:prism --- providers/openai/error.go | 15 +++++++++++---- providers/openai/openai_test.go | 7 +++++++ 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/providers/openai/error.go b/providers/openai/error.go index d609a7786..e7c3d3069 100644 --- a/providers/openai/error.go +++ b/providers/openai/error.go @@ -16,10 +16,11 @@ import ( ) var ( - openaiContextPattern = regexp.MustCompile(`maximum context length (?:is|of) (\d+) tokens.*?(?:resulted in|requested) ~?(\d+) tokens`) - alibabaContextPattern = regexp.MustCompile(`Range of input length should be \[\d+,\s*(\d+)\]`) - basetenContextPattern = regexp.MustCompile(`Input length (\d+) exceeds the maximum allowed input length of (\d+) tokens`) - vercelContextPattern = regexp.MustCompile(`Input too long:\s*(\d+)\s*input tokens,\s*limit is\s*(\d+)`) + openaiContextPattern = regexp.MustCompile(`maximum context length (?:is|of) (\d+) tokens.*?(?:resulted in|requested) ~?(\d+) tokens`) + alibabaContextPattern = regexp.MustCompile(`Range of input length should be \[\d+,\s*(\d+)\]`) + basetenContextPattern = regexp.MustCompile(`Input length (\d+) exceeds the maximum allowed input length of (\d+) tokens`) + fireworksContextPattern = regexp.MustCompile(`The prompt is too long:\s*(\d+),\s*model maximum context length:\s*(\d+)`) + vercelContextPattern = regexp.MustCompile(`Input too long:\s*(\d+)\s*input tokens,\s*limit is\s*(\d+)`) ) func toProviderErr(err error) error { @@ -97,6 +98,12 @@ func parseContextTooLargeError(message string, providerErr *fantasy.ProviderErro providerErr.ContextMaxTokens, _ = strconv.Atoi(matches[2]) return } + if matches := fireworksContextPattern.FindStringSubmatch(message); matches != nil { + providerErr.ContextTooLargeErr = true + providerErr.ContextUsedTokens, _ = strconv.Atoi(matches[1]) + providerErr.ContextMaxTokens, _ = strconv.Atoi(matches[2]) + return + } if matches := vercelContextPattern.FindStringSubmatch(message); matches != nil { providerErr.ContextTooLargeErr = true providerErr.ContextUsedTokens, _ = strconv.Atoi(matches[1]) diff --git a/providers/openai/openai_test.go b/providers/openai/openai_test.go index aa985b1e5..760cef96d 100644 --- a/providers/openai/openai_test.go +++ b/providers/openai/openai_test.go @@ -4009,6 +4009,13 @@ func TestParseContextTooLargeError(t *testing.T) { wantUsed: 265059, wantMax: 262112, }, + { + name: "matches fireworks format", + message: "The prompt is too long: 1261484, model maximum context length: 1048573", + wantErr: true, + wantUsed: 1261484, + wantMax: 1048573, + }, { name: "matches vercel format", message: "Input too long: 518063 input tokens, limit is 262144 for this model", From 52de71592c514ec51d3ae1cc1295dba10718e737 Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Wed, 23 Sep 2026 10:11:06 -0300 Subject: [PATCH 129/156] v0.45.2 --- version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.txt b/version.txt index ff12df2fb..9f3a7d749 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -0.45.1 +0.45.2 From 25c7e857166c411cba530c2c9ad171370e6bbb3a Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Thu, 24 Sep 2026 11:49:50 -0300 Subject: [PATCH 130/156] chore(deps): pin `charmbracelet/x/exp/slice` to v0.1.0 --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index e6735358b..2dbf82882 100644 --- a/go.mod +++ b/go.mod @@ -11,7 +11,7 @@ require ( github.com/aws/aws-sdk-go-v2/config v1.33.1 github.com/aws/smithy-go v1.28.1 github.com/charmbracelet/openai-go v0.0.0-20260921175203-216db9e71b83 - github.com/charmbracelet/x/exp/slice v0.0.0-20250904123553-b4e2667e5ad5 + github.com/charmbracelet/x/exp/slice v0.1.0 github.com/charmbracelet/x/exp/strings v0.1.0 github.com/charmbracelet/x/json v0.2.0 github.com/go-viper/mapstructure/v2 v2.5.0 diff --git a/go.sum b/go.sum index 0e4a0659c..f73f03349 100644 --- a/go.sum +++ b/go.sum @@ -86,8 +86,8 @@ github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UF github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/charmbracelet/openai-go v0.0.0-20260921175203-216db9e71b83 h1:7k30XdmBd71VAErGCjTTiOAE9F1KUthN9jdCeqQtvZ4= github.com/charmbracelet/openai-go v0.0.0-20260921175203-216db9e71b83/go.mod h1:8xPfrTomjYl827L3QQay36djXcEkXc80bpH+790o8/A= -github.com/charmbracelet/x/exp/slice v0.0.0-20250904123553-b4e2667e5ad5 h1:DTSZxdV9qQagD4iGcAt9RgaRBZtJl01bfKgdLzUzUPI= -github.com/charmbracelet/x/exp/slice v0.0.0-20250904123553-b4e2667e5ad5/go.mod h1:vI5nDVMWi6veaYH+0Fmvpbe/+cv/iJfMntdh+N0+Tms= +github.com/charmbracelet/x/exp/slice v0.1.0 h1:m46dwuDf3M5SFYMRhxYkLC6z9WnENGVKbcbJlp13/og= +github.com/charmbracelet/x/exp/slice v0.1.0/go.mod h1:vqEfX6xzqW1pKKZUUiFOKg0OQ7bCh54Q2vR/tserrRA= github.com/charmbracelet/x/exp/strings v0.1.0 h1:i69S2XI7uG1u4NLGeJPSYU++Nmjvpo9nwd6aoEm7gkA= github.com/charmbracelet/x/exp/strings v0.1.0/go.mod h1:/ehtMPNh9K4odGFkqYJKpIYyePhdp1hLBRvyY4bWkH8= github.com/charmbracelet/x/json v0.2.0 h1:DqB+ZGx2h+Z+1s98HOuOyli+i97wsFQIxP2ZQANTPrQ= From 743e972cd4cb9e0de586b5f9b89f2af94a432415 Mon Sep 17 00:00:00 2001 From: fei Date: Mon, 28 Sep 2026 23:56:47 +0800 Subject: [PATCH 131/156] fix(jsonrepair): keep a raw line break that ends a string (#391) --- jsonrepair/jsonrepair.go | 12 ++++++------ jsonrepair/jsonrepair_test.go | 26 ++++++++++++++++++++++++-- 2 files changed, 30 insertions(+), 8 deletions(-) diff --git a/jsonrepair/jsonrepair.go b/jsonrepair/jsonrepair.go index 8ef013991..648a8b442 100644 --- a/jsonrepair/jsonrepair.go +++ b/jsonrepair/jsonrepair.go @@ -1182,12 +1182,12 @@ func (p *parser) parseString() (any, error) { } else { p.index++ } - // Only a line break that is literally present in the source is dropped here. An - // escaped \n decodes to the same rune but is string content, so trimming it would - // silently change an already valid document. - prevChar, hasPrevChar := p.getCharAt(-2) - rawTrailingNewline := ok && char == rdelim && hasPrevChar && prevChar == '\n' - if !p.streamStable && (missingQuotes || rawTrailingNewline) { + // A raw line break inside the string is string content, like a tab or a + // carriage return, and is escaped on output. It is only dropped when the + // closing quote is missing, which the branch above already handles: reaching + // this point with a closing quote means the string was terminated, and trimming + // there deleted a character the caller wrote. + if !p.streamStable && missingQuotes { stringAcc = trimRightWhitespace(stringAcc) } if missingQuotes && p.context.empty { diff --git a/jsonrepair/jsonrepair_test.go b/jsonrepair/jsonrepair_test.go index 67bcd8bb0..11ec3b75c 100644 --- a/jsonrepair/jsonrepair_test.go +++ b/jsonrepair/jsonrepair_test.go @@ -1661,7 +1661,7 @@ func TestEscaping(t *testing.T) { { name: "newline_in_key", input: "{\"key_1\n\": \"value\"}", - want: "{\"key_1\": \"value\"}", + want: "{\"key_1\\n\": \"value\"}", }, // Regression tests for #373: a newline that came from an escape sequence is // string content, so repairing an already valid document must not trim it. @@ -1703,7 +1703,29 @@ func TestEscaping(t *testing.T) { { name: "raw_newline_at_end_of_value", input: "{\"key\": \"line\n\"}", - want: "{\"key\": \"line\"}", + want: "{\"key\": \"line\\n\"}", + }, + // A raw line break is string content exactly like a raw tab or carriage + // return, which the cases above keep, so it must survive the repair too. + { + name: "raw_newline_at_end_of_key", + input: "{\"key\n\": \"value\"}", + want: "{\"key\\n\": \"value\"}", + }, + { + name: "raw_newlines_at_end_of_value", + input: "{\"key\": \"line\n\n\"}", + want: "{\"key\": \"line\\n\\n\"}", + }, + { + name: "raw_newline_at_end_of_nested_value", + input: "{\"key\": [\"line\n\"]}", + want: "{\"key\": [\"line\\n\"]}", + }, + { + name: "raw_newline_before_trailing_space", + input: "{\"key\": \"line\n \"}", + want: "{\"key\": \"line\\n \"}", }, { name: "tab_in_key", From a7348882539677572e35e9263427e5c81d6a2856 Mon Sep 17 00:00:00 2001 From: fei Date: Mon, 28 Sep 2026 23:59:22 +0800 Subject: [PATCH 132/156] fix(jsonrepair): keep a number with a leading zero as a string (#393) --- jsonrepair/jsonrepair.go | 18 ++++++++++++++++++ jsonrepair/jsonrepair_test.go | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+) diff --git a/jsonrepair/jsonrepair.go b/jsonrepair/jsonrepair.go index 648a8b442..6ae2550e9 100644 --- a/jsonrepair/jsonrepair.go +++ b/jsonrepair/jsonrepair.go @@ -476,6 +476,12 @@ func (p *parser) parseNumber() (any, error) { } return numberStr, nil } + if hasInvalidJSONIntegerPart(numberStr) { + // RFC 8259: int = zero / ( digit1-9 *DIGIT ). A literal with a leading zero + // is not a JSON number, so keeping it as one would hand back a document that + // still does not parse. Keep the literal as a string instead. + return numberStr, nil + } if strings.ContainsAny(numberStr, ".eE") { floatVal, err := strconv.ParseFloat(numberStr, 64) if err == nil { @@ -487,6 +493,18 @@ func (p *parser) parseNumber() (any, error) { return numberValue{raw: numberStr}, nil } +// hasInvalidJSONIntegerPart reports whether the literal's integer part starts with a +// zero that is followed by more digits, optionally behind a sign: "01", "007", +// "01.5", "-01e2". A bare "0" is a valid JSON number, and so are "0.5" and "0e2", +// where the digits after the fraction or the exponent say nothing about the int part. +func hasInvalidJSONIntegerPart(numberStr string) bool { + digits := strings.TrimPrefix(numberStr, "-") + if i := strings.IndexAny(digits, ".eE"); i >= 0 { + digits = digits[:i] + } + return len(digits) > 1 && digits[0] == '0' +} + // isExponentSign reports whether char is the "+" of an exponent such as "1e+2". // "+" is deliberately left out of numberChars: anywhere else it is not part of // a JSON number and has to end the literal. diff --git a/jsonrepair/jsonrepair_test.go b/jsonrepair/jsonrepair_test.go index 11ec3b75c..204ec9640 100644 --- a/jsonrepair/jsonrepair_test.go +++ b/jsonrepair/jsonrepair_test.go @@ -1737,6 +1737,39 @@ func TestEscaping(t *testing.T) { input: "{\"key\": '\u0076\u0061\u006c\u0075\u0065'}", want: "{\"key\": \"value\"}", }, + // A literal with a leading zero is not a JSON number, so it is kept as a + // string: returning it as a number would produce a document that still + // does not parse. + { + name: "number_with_leading_zero", + input: "{\"key\": 01}", + want: "{\"key\": \"01\"}", + }, + { + name: "number_with_leading_zeros", + input: "{\"key\": 007}", + want: "{\"key\": \"007\"}", + }, + { + name: "negative_number_with_leading_zero", + input: "{\"key\": -01}", + want: "{\"key\": \"-01\"}", + }, + { + name: "float_with_leading_zero", + input: "{\"key\": 01.5}", + want: "{\"key\": \"01.5\"}", + }, + { + name: "exponent_with_leading_zero", + input: "{\"key\": 01e2}", + want: "{\"key\": \"01e2\"}", + }, + { + name: "zero_and_zero_decimal_stay_numbers", + input: "{\"key\": 0, \"key2\": 0.5}", + want: "{\"key\": 0, \"key2\": 0.5}", + }, { name: "unicode_escape_skip_loads", input: "{\"key\": \"\\u0076\\u0061\\u006C\\u0075\\u0065\"}", From c0073c7d357dbbe277474d3bc9118a3d1f2d0403 Mon Sep 17 00:00:00 2001 From: Kieran Klukas Date: Mon, 28 Sep 2026 13:07:24 -0400 Subject: [PATCH 133/156] fix(retry): retry a request whose HTTP/2 connection died (#395) * fix(retry): retry a request whose HTTP/2 connection died A connection killed while the machine slept is noticed only by the transport's health-check ping, which reports "http2: client connection lost". That arrives as a plain error with no type to match and no net.Error behaviour, so it read as a permanent failure and the request was never retried, turning a recoverable stall into a hard error. A server's GOAWAY was unclassified for the same reason. Since Go 1.27 the standard library's http2 lives in an internal package, whose types an importer cannot name however they are declared, so errors.As against x/net/http2 never matches one and only the message is left to go on. Both are listed in full rather than added to the fragment list, since the fragments name protocol errors shaped "...: stream ID N; CODE" and GOAWAY's trailing frame detail would be mistaken for that CODE and returned in place of the message. Assisted-by: Crush:claude-opus-5 * refactor(errors): simplify the lost-connection test and matching The test faked a dead peer with a TCP proxy: a listener, an accept loop, two goroutines per connection and a tracked conn list, all to stop bytes flowing on a socket the test already owns through its dialer. Wrapping that connection does the same job in a fifth of the code, is closer to what a slept laptop does to a client socket, and drops the teardown ordering the proxy needed to avoid hanging the server. Fold the two message loops into one matcher, spell the expected messages out in the retry test so emptying the list cannot pass vacuously, and cut the comments back to what is not evident from the code. Assisted-by: Crush:claude-opus-5 --- errors.go | 54 +++++++++++--- errors_http2_live_test.go | 144 ++++++++++++++++++++++++++++++++++++++ errors_test.go | 74 ++++++++++++++++++++ 3 files changed, 263 insertions(+), 9 deletions(-) create mode 100644 errors_http2_live_test.go diff --git a/errors.go b/errors.go index 8954e8052..595140104 100644 --- a/errors.go +++ b/errors.go @@ -131,25 +131,53 @@ func NewIncompleteStreamError() *ProviderError { } // http2TransportErrorFragments are message fragments that identify a -// transient HTTP/2 transport failure. Go's standard library bundles its -// own copy of the http2 package whose error types are unexported, so they -// cannot be matched with errors.As. We fall back to matching these stable -// fragments, which both the stdlib and x/net/http2 use. The list is kept -// tight to avoid misclassifying application-level errors as transport -// failures. +// transient HTTP/2 transport failure. Go's standard library carries its own +// copy of the http2 package, since Go 1.27 at net/http/internal/http2, whose +// types an importer cannot name, so errors.As against x/net/http2 never +// matches one and only the message is left to go on. The list is kept tight +// to avoid misclassifying application-level errors as transport failures. +// +// These name protocol errors shaped "...: stream ID N; CODE", which is what +// cleanHTTP2ErrorMessage trims. A dead connection goes in +// http2ConnectionLostMessages instead. var http2TransportErrorFragments = []string{ "stream error:", // RST_STREAM: INTERNAL_ERROR, REFUSED_STREAM, CANCEL, etc. "connection error:", // connection-level protocol error } +// http2ConnectionLostMessages report an HTTP/2 connection that died under a +// request, rather than a protocol error carried over a live one. Retrying is +// the remedy, since a retry dials afresh, but they arrive as plain errors +// that are not net.Error and carry no type to match, so without this they +// read as permanent. +// +// Matched in full: they share no framing to parse, and the trailing frame +// detail on GOAWAY would misread as the "; CODE" of a stream error. +var http2ConnectionLostMessages = []string{ + "http2: client connection lost", // health-check ping went unanswered + "http2: server sent GOAWAY and closed the connection", // stdlib's GoAwayError +} + +// matchConnectionLost returns the entry of http2ConnectionLostMessages that +// msg contains, so a caller can both detect one and name it. +func matchConnectionLost(msg string) (string, bool) { + for _, lost := range http2ConnectionLostMessages { + if strings.Contains(msg, lost) { + return lost, true + } + } + return "", false +} + // IsTransportError reports whether err or any error in its chain is a // transient transport-level failure that is safe to retry on a fresh // connection. In practice these are HTTP/2 stream resets, connection // errors, and GOAWAY frames, which originate from the transport rather // than the application. // -// x/net/http2 error types are matched by type; Go's stdlib-bundled http2 -// uses unexported types, so those are matched by their message fragments. +// x/net/http2 error types are matched by type. The standard library's copy +// lives in an internal package, so its equivalents are matched by message +// instead. func IsTransportError(err error) bool { if err == nil { return false @@ -172,7 +200,8 @@ func IsTransportError(err error) bool { return true } } - return false + _, lost := matchConnectionLost(msg) + return lost } // NewTransportError wraps a transient transport error into a retryable @@ -231,8 +260,15 @@ func WrapTransportError(err error) error { // "stream error: stream ID 27; INTERNAL_ERROR; received from peer" → "INTERNAL_ERROR (received from peer)" // "stream error: stream ID 5; REFUSED_STREAM" → "REFUSED_STREAM" // "http2: connection error: INTERNAL_ERROR" → "INTERNAL_ERROR" +// "http2: client connection lost" → "client connection lost" +// "http2: server sent GOAWAY ...; LastStreamID=5, ErrCode=NO_ERROR" → "server sent GOAWAY and closed the connection" func extractHTTP2ErrorMessage(err error) string { msg := err.Error() + // Returned whole: these are already a sentence, and cleaning GOAWAY + // would strip it down to its trailing frame detail. + if lost, ok := matchConnectionLost(msg); ok { + return strings.TrimPrefix(lost, "http2: ") + } for _, fragment := range http2TransportErrorFragments { if i := strings.Index(msg, fragment); i != -1 { return cleanHTTP2ErrorMessage(msg[i:]) diff --git a/errors_http2_live_test.go b/errors_http2_live_test.go new file mode 100644 index 000000000..b64ae72c7 --- /dev/null +++ b/errors_http2_live_test.go @@ -0,0 +1,144 @@ +package fantasy + +import ( + "context" + "errors" + "io" + "net" + "net/http" + "net/http/httptest" + "sync" + "testing" + "time" +) + +// TestLostPingIsClassifiedLive pins http2ConnectionLostMessages to the +// message Go actually produces. The entry is matched as a string, so a +// reword in a future release would silently stop dead connections being +// retryable, and only this test would notice. +func TestLostPingIsClassifiedLive(t *testing.T) { + t.Parallel() + + // Streams a chunk so the response is live, then holds the stream open + // so the freeze lands mid-stream, where a real one would. + srv := httptest.NewUnstartedServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + _, _ = w.Write([]byte("data: hello\n\n")) + w.(http.Flusher).Flush() + <-r.Context().Done() + })) + srv.EnableHTTP2 = true + srv.StartTLS() + defer srv.Close() + + conn := &freezableConn{closed: make(chan struct{}), frozen: make(chan struct{})} + defer conn.Close() + + tr := &http.Transport{ + // A Transport carrying a TLSClientConfig does not negotiate h2 on + // its own, and the ping is h2-only, so without this the test would + // pass over HTTP/1.1 having proved nothing. + ForceAttemptHTTP2: true, + TLSClientConfig: srv.Client().Transport.(*http.Transport).TLSClientConfig.Clone(), + HTTP2: &http.HTTP2Config{ + SendPingTimeout: 200 * time.Millisecond, + PingTimeout: 200 * time.Millisecond, + }, + DialContext: func(ctx context.Context, network, addr string) (net.Conn, error) { + return conn.dial(ctx, network, addr) + }, + } + defer tr.CloseIdleConnections() + + resp, err := (&http.Client{Transport: tr}).Get(srv.URL) + if err != nil { + t.Fatalf("initial request: %v", err) + } + defer resp.Body.Close() + if resp.ProtoMajor != 2 { + t.Fatalf("got %s, want HTTP/2: the ping config only applies to h2", resp.Proto) + } + + buf := make([]byte, 64) + if _, err := resp.Body.Read(buf); err != nil { + t.Fatalf("reading first chunk: %v", err) + } + + conn.freeze() + + read := make(chan error, 1) + go func() { + for { + if _, err := resp.Body.Read(buf); err != nil { + read <- err + return + } + } + }() + + select { + case err := <-read: + if err == nil || errors.Is(err, io.EOF) { + t.Fatalf("expected a transport failure, got %v", err) + } + if !IsTransportError(err) { + t.Fatalf("IsTransportError(%q) = false, so a dead connection is no "+ + "longer retryable. Go reworded it; update http2ConnectionLostMessages.", err) + } + case <-time.After(10 * time.Second): + t.Fatal("the read never returned: no health check noticed the dead peer") + } +} + +// freezableConn is a client connection that goes deaf and mute on freeze +// while staying open, which is what a socket killed by a sleeping laptop +// looks like: the peer is gone, but no FIN or RST ever says so, and only +// the transport's health-check ping can tell that from a slow reply. +type freezableConn struct { + net.Conn + frozen chan struct{} + closed chan struct{} + once sync.Once +} + +func (c *freezableConn) dial(ctx context.Context, network, addr string) (net.Conn, error) { + conn, err := (&net.Dialer{}).DialContext(ctx, network, addr) + c.Conn = conn + return c, err +} + +func (c *freezableConn) freeze() { close(c.frozen) } + +func (c *freezableConn) isFrozen() bool { + select { + case <-c.frozen: + return true + default: + return false + } +} + +// Read parks until teardown once frozen, so no frame arrives to reset the +// transport's read-idle timer and the health check fires. +func (c *freezableConn) Read(p []byte) (int, error) { + if c.isFrozen() { + <-c.closed + return 0, io.EOF + } + return c.Conn.Read(p) +} + +// Write reports success without sending once frozen, so the health-check +// ping never reaches the server and goes unanswered. +func (c *freezableConn) Write(p []byte) (int, error) { + if c.isFrozen() { + return len(p), nil + } + return c.Conn.Write(p) +} + +// Close releases any parked Read and lets the server see EOF, which is +// what ends its handler and unblocks httptest.Server.Close. +func (c *freezableConn) Close() error { + c.once.Do(func() { close(c.closed) }) + return c.Conn.Close() +} diff --git a/errors_test.go b/errors_test.go index aaec57f3d..53520c22b 100644 --- a/errors_test.go +++ b/errors_test.go @@ -1,6 +1,7 @@ package fantasy import ( + "errors" "fmt" "testing" @@ -27,6 +28,10 @@ func TestIsTransportError(t *testing.T) { {"x/net StreamError", http2.StreamError{StreamID: 1, Code: http2.ErrCodeInternal}, true}, {"x/net ConnectionError", http2.ConnectionError(http2.ErrCodeInternal), true}, {"x/net GoAwayError", http2.GoAwayError{LastStreamID: 1, ErrCode: http2.ErrCodeInternal}, true}, + {"lost health-check ping", newTestError("http2: client connection lost"), true}, + {"wrapped lost ping", fmt.Errorf("reading body: %w", newTestError("http2: client connection lost")), true}, + {"stdlib GoAwayError", newTestError(`http2: server sent GOAWAY and closed the connection; LastStreamID=5, ErrCode=NO_ERROR, debug=""`), true}, + {"deliberate close is not transient", newTestError("http2: client connection force closed via ClientConn.Close"), false}, } for _, tt := range tests { @@ -111,3 +116,72 @@ type testError struct{ msg string } func (e *testError) Error() string { return e.msg } func newTestError(msg string) error { return &testError{msg: msg} } + +func TestExtractHTTP2ErrorMessage(t *testing.T) { + t.Parallel() + + tests := []struct { + name string + err error + want string + }{ + { + "lost ping drops the http2 prefix", + newTestError("http2: client connection lost"), + "client connection lost", + }, + { + // The trailing "; LastStreamID=…" reads like the "; CODE" of a + // stream error, so cleaning this one would return the frame + // bookkeeping and discard the part that says what happened. + "GOAWAY keeps the sentence, not the frame detail", + newTestError(`http2: server sent GOAWAY and closed the connection; LastStreamID=5, ErrCode=NO_ERROR, debug=""`), + "server sent GOAWAY and closed the connection", + }, + { + "stream errors still clean", + newTestError("stream error: stream ID 27; INTERNAL_ERROR; received from peer"), + "INTERNAL_ERROR (received from peer)", + }, + { + "unrecognised errors pass through", + newTestError("something went wrong"), + "something went wrong", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + if got := extractHTTP2ErrorMessage(tt.err); got != tt.want { + t.Errorf("extractHTTP2ErrorMessage(%v) = %q, want %q", tt.err, got, tt.want) + } + }) + } +} + +// TestConnectionLostIsRetryable covers the path the retry middleware walks. +// A lost connection reaches it as a bare error that is not a net.Error and +// carries no type to match, so without the message check it reads as +// permanent and the request is never retried. +func TestConnectionLostIsRetryable(t *testing.T) { + t.Parallel() + + // Spelled out rather than ranged over http2ConnectionLostMessages, so + // emptying that list fails here instead of passing vacuously. + for _, msg := range []string{ + "http2: client connection lost", + "http2: server sent GOAWAY and closed the connection", + } { + t.Run(msg, func(t *testing.T) { + t.Parallel() + err := newTestError(msg) + if !isRetryableError(err) { + t.Error("expected a lost connection to be retryable") + } + if wrapped := WrapTransportError(err); !errors.Is(wrapped, err) { + t.Errorf("WrapTransportError dropped the cause: %v", wrapped) + } + }) + } +} From 20cc5c9f1402f34162a9f49f88922a985a3b38d7 Mon Sep 17 00:00:00 2001 From: fei Date: Tue, 29 Sep 2026 21:53:49 +0800 Subject: [PATCH 134/156] fix(jsonrepair): keep out-of-float64 numbers as numbers (#398) parseNumber re-derives every literal with a fraction or exponent by round-tripping it through float64, and both range failures changed what the document said: 1e999 overflowed to ErrRange and fell through to the path that quotes the literal, so a number came back as a string, and 1e-999 underflowed to 0 with no error at all, so formatFloat wrote 0.0 and the value was gone. RFC 8259 puts no bound on the exponent, so both literals are valid JSON. Keep them as numbers, which is the same rule #393 applies from the other side: a literal that is not valid JSON is quoted so the document still parses, and a literal that is stays a number. --- jsonrepair/jsonrepair.go | 35 +++++++++++++++++++++++++++++++---- jsonrepair/jsonrepair_test.go | 23 +++++++++++++++++++++++ 2 files changed, 54 insertions(+), 4 deletions(-) diff --git a/jsonrepair/jsonrepair.go b/jsonrepair/jsonrepair.go index 6ae2550e9..4f57cb3c7 100644 --- a/jsonrepair/jsonrepair.go +++ b/jsonrepair/jsonrepair.go @@ -484,15 +484,42 @@ func (p *parser) parseNumber() (any, error) { } if strings.ContainsAny(numberStr, ".eE") { floatVal, err := strconv.ParseFloat(numberStr, 64) - if err == nil { - formatted := formatFloat(floatVal) - return numberValue{raw: formatted}, nil + if err != nil { + // RFC 8259 puts no bound on the exponent, so a literal larger than float64 is + // still a valid JSON number. Keep it a number: returning the text here hands + // the caller a string where the document said number. + if errors.Is(err, strconv.ErrRange) { + return numberValue{raw: numberStr}, nil + } + return numberStr, nil } - return numberStr, nil + if floatVal == 0 && !isZeroLiteral(numberStr) { + // Underflow reports zero with no error, so formatting it would replace the + // value with 0.0. The literal is valid JSON, so keep the caller's text. + return numberValue{raw: numberStr}, nil + } + formatted := formatFloat(floatVal) + return numberValue{raw: formatted}, nil } return numberValue{raw: numberStr}, nil } +// isZeroLiteral reports whether the mantissa of a number literal has no nonzero digit, +// which is what separates a literal that really is zero from one that float64 rounded +// down to it. The exponent does not decide this: 0e+2 is a zero. +func isZeroLiteral(numberStr string) bool { + mantissa := numberStr + if idx := strings.IndexAny(mantissa, "eE"); idx >= 0 { + mantissa = mantissa[:idx] + } + for _, r := range mantissa { + if r >= '1' && r <= '9' { + return false + } + } + return true +} + // hasInvalidJSONIntegerPart reports whether the literal's integer part starts with a // zero that is followed by more digits, optionally behind a sign: "01", "007", // "01.5", "-01e2". A bare "0" is a valid JSON number, and so are "0.5" and "0e2", diff --git a/jsonrepair/jsonrepair_test.go b/jsonrepair/jsonrepair_test.go index 204ec9640..77127b703 100644 --- a/jsonrepair/jsonrepair_test.go +++ b/jsonrepair/jsonrepair_test.go @@ -928,6 +928,29 @@ func TestParseNumberEdgeCases(t *testing.T) { input: "2300e+3", want: "2300000.0", }, + // A number bigger than float64 is still a valid JSON number, so it stays one. + { + name: "exponent_overflows_float64", + input: "{\"key\": 1e999}", + want: "{\"key\": 1e999}", + }, + { + name: "positive_exponent_overflows_float64", + input: "{\"key\": 1.0e+400}", + want: "{\"key\": 1.0e+400}", + }, + // float64 underflows to zero without reporting an error, which would + // rewrite the value. + { + name: "exponent_underflows_float64", + input: "{\"key\": 1e-999}", + want: "{\"key\": 1e-999}", + }, + { + name: "negative_exponent_underflows_float64", + input: "{\"key\": -1e-400}", + want: "{\"key\": -1e-400}", + }, { name: "truncated_positive_exponent", input: "{\"key\": 1E+}", From c33d8d36f2197b7be6c3f2133fa300218a57f866 Mon Sep 17 00:00:00 2001 From: takiAA <119551932+takiAA@users.noreply.github.com> Date: Tue, 29 Sep 2026 21:56:08 +0800 Subject: [PATCH 135/156] fix(jsonrepair): preserve form-feed and slash escapes (#397) --- jsonrepair/escapes_regression_test.go | 34 +++++++++++++++++++++++++++ jsonrepair/jsonrepair.go | 4 ++-- 2 files changed, 36 insertions(+), 2 deletions(-) create mode 100644 jsonrepair/escapes_regression_test.go diff --git a/jsonrepair/escapes_regression_test.go b/jsonrepair/escapes_regression_test.go new file mode 100644 index 000000000..307c0dacb --- /dev/null +++ b/jsonrepair/escapes_regression_test.go @@ -0,0 +1,34 @@ +package jsonrepair + +import ( + "encoding/json" + "reflect" + "testing" +) + +func TestRepairJSONStandardEscapes(t *testing.T) { + cases := []string{ + `{"text":"page\fbreak"}`, + `{"text":"https:\/\/example.com\/path"}`, + `{"\f":"value"}`, + `["\f", "\/", "\b", "\t", "\n", "\r"]`, + } + for _, input := range cases { + t.Run(input, func(t *testing.T) { + var want, got any + if err := json.Unmarshal([]byte(input), &want); err != nil { + t.Fatal(err) + } + repaired, err := RepairJSON(input) + if err != nil { + t.Fatal(err) + } + if err := json.Unmarshal([]byte(repaired), &got); err != nil { + t.Fatal(err) + } + if !reflect.DeepEqual(got, want) { + t.Fatalf("RepairJSON(%q) = %q; decoded got %#v, want %#v", input, repaired, got, want) + } + }) + } +} diff --git a/jsonrepair/jsonrepair.go b/jsonrepair/jsonrepair.go index 4f57cb3c7..5b596002d 100644 --- a/jsonrepair/jsonrepair.go +++ b/jsonrepair/jsonrepair.go @@ -992,9 +992,9 @@ func (p *parser) parseString() (any, error) { } if len(stringAcc) > 0 && stringAcc[len(stringAcc)-1] == '\\' { p.log("Found a stray escape sequence, normalizing it") - if char == rdelim || char == 't' || char == 'n' || char == 'r' || char == 'b' || char == '\\' { + if char == rdelim || char == 't' || char == 'n' || char == 'r' || char == 'b' || char == 'f' || char == '/' || char == '\\' { stringAcc = stringAcc[:len(stringAcc)-1] - escapeSeqs := map[rune]rune{'t': '\t', 'n': '\n', 'r': '\r', 'b': '\b'} + escapeSeqs := map[rune]rune{'t': '\t', 'n': '\n', 'r': '\r', 'b': '\b', 'f': '\f'} if replacement, ok := escapeSeqs[char]; ok { stringAcc = append(stringAcc, replacement) } else { From 8289a99faff121a75e7c0dbc93ff37355979ae6a Mon Sep 17 00:00:00 2001 From: Kieran Klukas Date: Thu, 24 Sep 2026 22:04:08 -0400 Subject: [PATCH 136/156] Revert "fix(retry): never retry a step because a tool returned an error (#367)" This reverts commit e394d2e6839ab5544797dbccce8c4eff4b156d00. --- agent.go | 12 ++----- agent_stream_test.go | 79 ------------------------------------------- errors.go | 21 ------------ retry.go | 12 +------ retry_test.go | 80 -------------------------------------------- 5 files changed, 3 insertions(+), 201 deletions(-) diff --git a/agent.go b/agent.go index 9a9a4de95..5843471b5 100644 --- a/agent.go +++ b/agent.go @@ -1683,11 +1683,7 @@ func (a *agent) processStepStream(ctx context.Context, stream StreamResponse, op toolResults = append(toolResults, result) if isCriticalError && toolExecutionErr == nil { if errorResult, ok := result.Result.(ToolResultOutputContentError); ok && errorResult.Error != nil { - toolExecutionErr = &ToolExecutionError{ - ToolName: result.ToolName, - ToolCallID: result.ToolCallID, - Err: errorResult.Error, - } + toolExecutionErr = errorResult.Error } } toolStateMu.Unlock() @@ -1699,11 +1695,7 @@ func (a *agent) processStepStream(ctx context.Context, stream StreamResponse, op toolResults = append(toolResults, result) if isCriticalError && toolExecutionErr == nil { if errorResult, ok := result.Result.(ToolResultOutputContentError); ok && errorResult.Error != nil { - toolExecutionErr = &ToolExecutionError{ - ToolName: result.ToolName, - ToolCallID: result.ToolCallID, - Err: errorResult.Error, - } + toolExecutionErr = errorResult.Error } } toolStateMu.Unlock() diff --git a/agent_stream_test.go b/agent_stream_test.go index a0311f25d..cada78c14 100644 --- a/agent_stream_test.go +++ b/agent_stream_test.go @@ -3,12 +3,9 @@ package fantasy import ( "context" "encoding/json" - "errors" "fmt" - "net" "strings" "sync" - "sync/atomic" "testing" "time" @@ -1059,79 +1056,3 @@ func TestStreamingAgent_ProviderExecutedToolCallGatedOnFinish(t *testing.T) { }) } } - -// TestStreamingAgent_ToolErrorIsNotRetried pins that a Go error returned -// from a tool's Run function ends the step without re-running it: the model -// is asked once, the tool runs once, OnRetry never fires, and the caller -// gets a ToolExecutionError that still unwraps to the tool's own error. The -// tool error here satisfies net.Error, which the retry loop treats as a -// transient network failure when it comes from the provider request. -func TestStreamingAgent_ToolErrorIsNotRetried(t *testing.T) { - t.Parallel() - - type input struct{} - toolErr := &net.OpError{Op: "dial", Net: "tcp", Err: errors.New("connection refused")} - - for _, tc := range []struct { - name string - tool func(runs *atomic.Int32) AgentTool - }{ - { - name: "sequential tool", - tool: func(runs *atomic.Int32) AgentTool { - return NewAgentTool("boom", "always fails", - func(ctx context.Context, in input, call ToolCall) (ToolResponse, error) { - runs.Add(1) - return ToolResponse{}, toolErr - }) - }, - }, - { - name: "parallel tool", - tool: func(runs *atomic.Int32) AgentTool { - return NewParallelAgentTool("boom", "always fails", - func(ctx context.Context, in input, call ToolCall) (ToolResponse, error) { - runs.Add(1) - return ToolResponse{}, toolErr - }) - }, - }, - } { - t.Run(tc.name, func(t *testing.T) { - t.Parallel() - - var toolRuns, streamCalls atomic.Int32 - mockModel := &mockLanguageModel{ - streamFunc: func(ctx context.Context, call Call) (StreamResponse, error) { - streamCalls.Add(1) - return func(yield func(StreamPart) bool) { - if !yield(StreamPart{Type: StreamPartTypeToolCall, ID: "call-1", ToolCallName: "boom", ToolCallInput: `{}`}) { - return - } - yield(StreamPart{Type: StreamPartTypeFinish, FinishReason: FinishReasonToolCalls, Usage: Usage{TotalTokens: 10}}) - }, nil - }, - } - - agent := NewAgent(mockModel, WithTools(tc.tool(&toolRuns))) - retries := 0 - _, err := agent.Stream(context.Background(), AgentStreamCall{ - Prompt: "run boom", - OnRetry: func(err *ProviderError, delay time.Duration) { - retries++ - }, - }) - require.Error(t, err) - - var execErr *ToolExecutionError - require.ErrorAs(t, err, &execErr) - require.Equal(t, "boom", execErr.ToolName) - require.Equal(t, "call-1", execErr.ToolCallID) - require.ErrorIs(t, err, toolErr, "the tool's own error must stay reachable") - - require.Equal(t, int32(1), streamCalls.Load(), "the step must not be re-run against the model") - require.Equal(t, int32(1), toolRuns.Load(), "the tool must not be re-executed") - require.Equal(t, 0, retries, "OnRetry must not fire for a tool error") - }) - } -} diff --git a/errors.go b/errors.go index 595140104..c05620a71 100644 --- a/errors.go +++ b/errors.go @@ -317,27 +317,6 @@ func (e RetryError) Unwrap() error { return nil } -// ToolExecutionError is returned by the agent when a tool's Run function -// returns a Go error. The failure ends the step, and it is never retried: -// the error is local to the tool, so re-running the step would only repeat -// the model request and re-execute every tool in it. Callers can use -// errors.As to find it and errors.Unwrap (or errors.Is/As) to reach the -// tool's own error. -type ToolExecutionError struct { - ToolName string - ToolCallID string - Err error -} - -func (e *ToolExecutionError) Error() string { - return fmt.Sprintf("tool %q failed: %v", e.ToolName, e.Err) -} - -// Unwrap returns the error the tool returned. -func (e *ToolExecutionError) Unwrap() error { - return e.Err -} - // ErrorTitleForStatusCode returns a human-readable title for a given HTTP status code. func ErrorTitleForStatusCode(statusCode int) string { return strings.ToLower(http.StatusText(statusCode)) diff --git a/retry.go b/retry.go index 3e2ad220c..67dd469ef 100644 --- a/retry.go +++ b/retry.go @@ -176,21 +176,11 @@ func isAuthError(err *ProviderError) bool { } // isRetryableError reports whether the error should be retried. -// A ToolExecutionError is never retried. Otherwise it checks for -// retryable ProviderError, network-level connection errors +// It checks for retryable ProviderError, network-level connection errors // (DNS failures, TCP timeouts, connection refused), and HTTP/2 stream- // level transport errors. The latter two categories may not be wrapped // in ProviderError when they occur outside the provider's error handler. func isRetryableError(err error) bool { - // A tool's Go error is local to the tool: re-running the step would - // repeat the model request and re-execute every tool in it without - // changing the outcome. Checked before ProviderError so a tool that - // surfaces a retryable provider error (a sub-agent hitting a 429, for - // example) does not retry the outer step either. - var toolErr *ToolExecutionError - if errors.As(err, &toolErr) { - return false - } var providerErr *ProviderError if errors.As(err, &providerErr) { return providerErr.IsRetryable() diff --git a/retry_test.go b/retry_test.go index b258b7c7c..ad1b7c429 100644 --- a/retry_test.go +++ b/retry_test.go @@ -474,83 +474,3 @@ func TestRetryWithExponentialBackoff_FractionalRetryHeader(t *testing.T) { t.Errorf("attempts = %d, want 1", attempts) } } - -func TestIsRetryableError_ToolExecutionError(t *testing.T) { - t.Parallel() - - t.Run("tool error wrapping a net.Error is not retryable", func(t *testing.T) { - t.Parallel() - err := &ToolExecutionError{ - ToolName: "view", - ToolCallID: "call-1", - Err: &net.OpError{Op: "dial", Net: "tcp", Err: errors.New("connection refused")}, - } - if isRetryableError(err) { - t.Error("expected a tool execution error to not be retryable") - } - }) - - t.Run("tool error wrapping a retryable ProviderError is not retryable", func(t *testing.T) { - t.Parallel() - err := &ToolExecutionError{ - ToolName: "sub_agent", - ToolCallID: "call-1", - Err: &ProviderError{StatusCode: 429, Message: "rate limited"}, - } - if isRetryableError(err) { - t.Error("expected a tool execution error to not be retryable") - } - }) - - t.Run("unwraps to the tool's own error", func(t *testing.T) { - t.Parallel() - inner := &net.OpError{Op: "dial", Net: "tcp", Err: errors.New("connection refused")} - err := error(&ToolExecutionError{ToolName: "fetch", ToolCallID: "call-1", Err: inner}) - var opErr *net.OpError - if !errors.As(err, &opErr) { - t.Fatal("expected errors.As to reach the wrapped net.OpError") - } - if got, want := err.Error(), `tool "fetch" failed: dial tcp: connection refused`; got != want { - t.Fatalf("Error() = %q, want %q", got, want) - } - }) -} - -func TestRetryWithExponentialBackoff_ToolExecutionError(t *testing.T) { - t.Parallel() - - attempts := 0 - retries := 0 - opts := RetryOptions{ - MaxRetries: 2, - InitialDelayIn: 1 * time.Millisecond, - BackoffFactor: 2.0, - OnRetry: func(err *ProviderError, delay time.Duration) { - retries++ - }, - } - toolErr := &ToolExecutionError{ - ToolName: "view", - ToolCallID: "call-1", - Err: &net.OpError{Op: "dial", Net: "tcp", Err: errors.New("connection refused")}, - } - - retryFn := RetryWithExponentialBackoffRespectingRetryHeaders[int](opts) - _, err := retryFn(context.Background(), func() (int, error) { - attempts++ - return 0, toolErr - }) - if !errors.Is(err, toolErr) { - t.Fatalf("expected the tool execution error to be returned as-is, got %v", err) - } - var retryErr *RetryError - if errors.As(err, &retryErr) { - t.Fatalf("expected no RetryError wrapper on a first-try failure, got %v", err) - } - if attempts != 1 { - t.Fatalf("expected 1 attempt, got %d", attempts) - } - if retries != 0 { - t.Fatalf("expected OnRetry not to be called, got %d calls", retries) - } -} From 82d42a7441d06ea4eeebf64ce6505caf481b7e10 Mon Sep 17 00:00:00 2001 From: Kieran Klukas Date: Thu, 24 Sep 2026 22:04:21 -0400 Subject: [PATCH 137/156] fix(agent): let a failing tool report back instead of ending the run A tool that returned a Go error ended the whole run: the step was thrown away and the model never learned what went wrong. In Go that return is how a tool says something ordinary, like a path that does not exist or a refused connection, so agents died on failures they could have recovered from. A panic was already survivable, which made an error the harsher of the two. Tool failures now become error results the model can act on, matching what Generate has always done. Cancellation still ends a run, checked against the loop's own context rather than waiting for a tool to report it. --- agent.go | 177 ++++++++++++++----------------------------- agent_stream_test.go | 133 ++++++++++++++++++++++++++++++++ agent_test.go | 66 ++++++++++++++-- tool.go | 14 +++- 4 files changed, 260 insertions(+), 130 deletions(-) diff --git a/agent.go b/agent.go index 5843471b5..3c6eb8904 100644 --- a/agent.go +++ b/agent.go @@ -584,7 +584,12 @@ func (a *agent) Generate(ctx context.Context, opts AgentCall) (*AgentResult, err var toolResults []ToolResultContent if !suppressed { - toolResults, err = a.executeTools(ctx, stepTools, stepExecProviderTools, stepToolCalls, nil) + toolResults = a.executeTools(ctx, stepTools, stepExecProviderTools, stepToolCalls, nil) + } + + // Stop a canceled run rather than looping back to the model. + if err := ctx.Err(); err != nil { + return nil, err } // If any tool result requested a stop, deliver all results but don't @@ -630,7 +635,7 @@ func (a *agent) Generate(ctx context.Context, opts AgentCall) (*AgentResult, err steps = append(steps, stepResult) shouldStop := isStopConditionMet(opts.StopWhen, steps) - if shouldStop || err != nil || stopTurnRequested || len(stepToolCalls) == 0 || result.FinishReason != FinishReasonToolCalls { + if shouldStop || stopTurnRequested || len(stepToolCalls) == 0 || result.FinishReason != FinishReasonToolCalls { break } } @@ -766,9 +771,9 @@ func toResponseMessages(content []Content) []Message { return messages } -func (a *agent) executeTools(ctx context.Context, allTools []AgentTool, execProviderTools []ExecutableProviderTool, toolCalls []ToolCallContent, toolResultCallback func(result ToolResultContent) error) ([]ToolResultContent, error) { +func (a *agent) executeTools(ctx context.Context, allTools []AgentTool, execProviderTools []ExecutableProviderTool, toolCalls []ToolCallContent, toolResultCallback func(result ToolResultContent) error) []ToolResultContent { if len(toolCalls) == 0 { - return nil, nil + return nil } // Create a map for quick tool lookup @@ -786,35 +791,27 @@ func (a *agent) executeTools(ctx context.Context, allTools []AgentTool, execProv results := make([]ToolResultContent, 0, len(toolCalls)) for _, toolCall := range toolCalls { - result, isCriticalError := a.executeSingleTool(ctx, toolMap, execProviderToolMap, toolCall, toolResultCallback) - results = append(results, result) - if isCriticalError { - if errorResult, ok := result.Result.(ToolResultOutputContentError); ok && errorResult.Error != nil { - return nil, errorResult.Error - } - } + results = append(results, a.executeSingleTool(ctx, toolMap, execProviderToolMap, toolCall, toolResultCallback)) } - return results, nil + return results } -// executeSingleTool executes a single tool and returns its result and a critical error flag. -func (a *agent) executeSingleTool(ctx context.Context, toolMap map[string]AgentTool, execProviderToolMap map[string]ExecutableProviderTool, toolCall ToolCallContent, toolResultCallback func(result ToolResultContent) error) (ToolResultContent, bool) { - result := ToolResultContent{ +// executeSingleTool runs one tool call. A tool that fails, by any means, +// produces an error result the model can act on. +func (a *agent) executeSingleTool(ctx context.Context, toolMap map[string]AgentTool, execProviderToolMap map[string]ExecutableProviderTool, toolCall ToolCallContent, toolResultCallback func(result ToolResultContent) error) (result ToolResultContent) { + result = ToolResultContent{ ToolCallID: toolCall.ToolCallID, ToolName: toolCall.ToolName, ProviderExecuted: false, } + if toolResultCallback != nil { + defer func() { _ = toolResultCallback(result) }() + } - // Skip invalid tool calls - create error result (not critical) if toolCall.Invalid { - result.Result = ToolResultOutputContentError{ - Error: toolCall.ValidationError, - } - if toolResultCallback != nil { - _ = toolResultCallback(result) - } - return result, false + result.Result = ToolResultOutputContentError{Error: toolCall.ValidationError} + return result } // Find the run function — either from a regular AgentTool or an @@ -826,57 +823,32 @@ func (a *agent) executeSingleTool(ctx context.Context, toolMap map[string]AgentT runTool = ept.Run } if runTool == nil { - result.Result = ToolResultOutputContentError{ - Error: errors.New("tool not found: " + toolCall.ToolName), - } - if toolResultCallback != nil { - _ = toolResultCallback(result) - } - return result, false + result.Result = ToolResultOutputContentError{Error: errors.New("tool not found: " + toolCall.ToolName)} + return result } - // Execute the tool, converting a panic into a failed tool result so a - // single misbehaving tool cannot take down the whole process. The panic - // value and stack are included so they survive in the transcript even - // when stderr is lost. toolResult, err := runToolSafely(ctx, runTool, ToolCall{ ID: toolCall.ToolCallID, Name: toolCall.ToolName, Input: toolCall.Input, }) - if err != nil { - result.Result = ToolResultOutputContentError{ - Error: err, - } - result.ClientMetadata = toolResult.Metadata - result.StopTurn = toolResult.StopTurn - if toolResultCallback != nil { - _ = toolResultCallback(result) - } - return result, true - } - result.ClientMetadata = toolResult.Metadata result.StopTurn = toolResult.StopTurn - if toolResult.IsError { - result.Result = ToolResultOutputContentError{ - Error: errors.New(toolResult.Content), - } - } else if toolResult.Type == "image" || toolResult.Type == "media" { + switch { + case err != nil: + result.Result = ToolResultOutputContentError{Error: err} + case toolResult.IsError: + result.Result = ToolResultOutputContentError{Error: errors.New(toolResult.Content)} + case toolResult.Type == "image", toolResult.Type == "media": result.Result = ToolResultOutputContentMedia{ Data: base64.StdEncoding.EncodeToString(toolResult.Data), MediaType: toolResult.MediaType, Text: toolResult.Content, } - } else { - result.Result = ToolResultOutputContentText{ - Text: toolResult.Content, - } + default: + result.Result = ToolResultOutputContentText{Text: toolResult.Content} } - if toolResultCallback != nil { - _ = toolResultCallback(result) - } - return result, false + return result } // runToolSafely invokes a tool's run function and converts any panic into a @@ -1659,51 +1631,6 @@ func (a *agent) processStepStream(ctx context.Context, stream StreamResponse, op } } - // All tool calls are now collected. Create the execution channel sized to - // avoid blocking during dispatch, start the coordinator, then flush the batch. - toolChan := make(chan toolExecutionRequest, len(pendingDispatches)) - var toolExecutionWg sync.WaitGroup - var toolStateMu sync.Mutex - toolResults := make([]ToolResultContent, 0, len(pendingDispatches)) - var toolExecutionErr error - - // Semaphores for controlling parallelism. - parallelSem := make(chan struct{}, 5) - var sequentialMu sync.Mutex - - // Single coordinator goroutine that dispatches tools. - toolExecutionWg.Go(func() { - for req := range toolChan { - if req.parallel { - parallelSem <- struct{}{} - toolExecutionWg.Go(func() { - defer func() { <-parallelSem }() - result, isCriticalError := a.executeSingleTool(ctx, toolMap, execProviderToolMap, req.toolCall, opts.OnToolResult) - toolStateMu.Lock() - toolResults = append(toolResults, result) - if isCriticalError && toolExecutionErr == nil { - if errorResult, ok := result.Result.(ToolResultOutputContentError); ok && errorResult.Error != nil { - toolExecutionErr = errorResult.Error - } - } - toolStateMu.Unlock() - }) - } else { - sequentialMu.Lock() - result, isCriticalError := a.executeSingleTool(ctx, toolMap, execProviderToolMap, req.toolCall, opts.OnToolResult) - toolStateMu.Lock() - toolResults = append(toolResults, result) - if isCriticalError && toolExecutionErr == nil { - if errorResult, ok := result.Result.(ToolResultOutputContentError); ok && errorResult.Error != nil { - toolExecutionErr = errorResult.Error - } - } - toolStateMu.Unlock() - sequentialMu.Unlock() - } - } - }) - // Process buffered tool calls now that the finish reason is known. // Abnormal finishes — length, content filter, provider error, unknown — // can accompany arguments that were cut short: record the raw call in @@ -1770,26 +1697,38 @@ func (a *agent) processStepStream(ctx context.Context, stream StreamResponse, op pendingDispatches = append(pendingDispatches, toolExecutionRequest{toolCall: validatedToolCall, parallel: isParallel}) } - // Dispatch all buffered tool calls now that every OnToolCall callback has - // been called, then close and wait. Dispatch only on an explicit - // tool-calls turn: any other finish reason (length, content filter, - // provider error, unknown) can accompany arguments that were cut short, - // and executing those is how truncated input reaches tools - // (CHARM-2020). The tool-call content stays in stepContent either way, - // so the step result records what the model tried to call. + // Run the buffered calls now that every OnToolCall callback has fired. + // Dispatch only on an explicit tool-calls turn: any other finish reason + // can accompany arguments that were cut short, and running those is how + // truncated input reaches tools (CHARM-2020). + toolResults := make([]ToolResultContent, 0, len(pendingDispatches)) if stepFinishReason == FinishReasonToolCalls { + var wg sync.WaitGroup + var mu sync.Mutex + parallelSem := make(chan struct{}, 5) + run := func(req toolExecutionRequest) { + result := a.executeSingleTool(ctx, toolMap, execProviderToolMap, req.toolCall, opts.OnToolResult) + mu.Lock() + toolResults = append(toolResults, result) + mu.Unlock() + } for _, req := range pendingDispatches { - toolChan <- req + if !req.parallel { + run(req) + continue + } + parallelSem <- struct{}{} + wg.Go(func() { + defer func() { <-parallelSem }() + run(req) + }) } + wg.Wait() } - // Close the tool execution channel and wait for all executions to complete. - close(toolChan) - toolExecutionWg.Wait() - - // Check for tool execution errors - if toolExecutionErr != nil { - return stepExecutionResult{}, toolExecutionErr + // Stop a canceled run rather than looping back to the model. + if err := ctx.Err(); err != nil { + return stepExecutionResult{}, err } // Add tool results to content in the order the model called the tools, diff --git a/agent_stream_test.go b/agent_stream_test.go index cada78c14..95227af3e 100644 --- a/agent_stream_test.go +++ b/agent_stream_test.go @@ -3,9 +3,12 @@ package fantasy import ( "context" "encoding/json" + "errors" "fmt" + "net" "strings" "sync" + "sync/atomic" "testing" "time" @@ -1056,3 +1059,133 @@ func TestStreamingAgent_ProviderExecutedToolCallGatedOnFinish(t *testing.T) { }) } } + +// TestStreamingAgent_ToolErrorReachesTheModel pins that a Go error returned +// from a tool's Run function becomes an error result the model can act on: +// the run continues, the tool runs once, and OnRetry never fires. The tool +// error here satisfies net.Error, which the retry loop treats as a transient +// network failure when it comes from the provider request. +func TestStreamingAgent_ToolErrorReachesTheModel(t *testing.T) { + t.Parallel() + + type input struct{} + toolErr := &net.OpError{Op: "dial", Net: "tcp", Err: errors.New("connection refused")} + + for _, tc := range []struct { + name string + tool func(runs *atomic.Int32) AgentTool + }{ + { + name: "sequential tool", + tool: func(runs *atomic.Int32) AgentTool { + return NewAgentTool("boom", "always fails", + func(ctx context.Context, in input, call ToolCall) (ToolResponse, error) { + runs.Add(1) + return ToolResponse{}, toolErr + }) + }, + }, + { + name: "parallel tool", + tool: func(runs *atomic.Int32) AgentTool { + return NewParallelAgentTool("boom", "always fails", + func(ctx context.Context, in input, call ToolCall) (ToolResponse, error) { + runs.Add(1) + return ToolResponse{}, toolErr + }) + }, + }, + } { + t.Run(tc.name, func(t *testing.T) { + t.Parallel() + + var toolRuns, streamCalls atomic.Int32 + mockModel := &mockLanguageModel{ + streamFunc: func(ctx context.Context, call Call) (StreamResponse, error) { + n := streamCalls.Add(1) + return func(yield func(StreamPart) bool) { + if n == 1 { + if !yield(StreamPart{Type: StreamPartTypeToolCall, ID: "call-1", ToolCallName: "boom", ToolCallInput: `{}`}) { + return + } + yield(StreamPart{Type: StreamPartTypeFinish, FinishReason: FinishReasonToolCalls, Usage: Usage{TotalTokens: 10}}) + return + } + if !yield(StreamPart{Type: StreamPartTypeTextStart, ID: "t1"}) { + return + } + if !yield(StreamPart{Type: StreamPartTypeTextDelta, ID: "t1", Delta: "could not reach it"}) { + return + } + if !yield(StreamPart{Type: StreamPartTypeTextEnd, ID: "t1"}) { + return + } + yield(StreamPart{Type: StreamPartTypeFinish, FinishReason: FinishReasonStop, Usage: Usage{TotalTokens: 10}}) + }, nil + }, + } + + agent := NewAgent(mockModel, WithTools(tc.tool(&toolRuns))) + retries := 0 + res, err := agent.Stream(context.Background(), AgentStreamCall{ + Prompt: "run boom", + OnRetry: func(err *ProviderError, delay time.Duration) { + retries++ + }, + }) + require.NoError(t, err, "a tool failure must not end the run") + require.Equal(t, FinishReasonStop, res.Response.FinishReason) + + var results []ToolResultContent + for _, step := range res.Steps { + results = append(results, step.Content.ToolResults()...) + } + require.Len(t, results, 1) + errResult, ok := results[0].Result.(ToolResultOutputContentError) + require.True(t, ok, "the tool failure must be recorded as an error result") + require.ErrorIs(t, errResult.Error, toolErr, "the tool's own error must stay reachable") + + require.Equal(t, int32(2), streamCalls.Load(), "the model must see the error and get to respond") + require.Equal(t, int32(1), toolRuns.Load(), "the tool must not be re-executed") + require.Equal(t, 0, retries, "OnRetry must not fire for a tool error") + }) + } +} + +// TestStreamingAgent_CancelDuringToolEndsRun pins that cancellation still +// ends the run now that a tool's error no longer does. The tool reports a +// plain failure rather than the context error, so the only thing that can +// stop the loop is the loop's own view of the context. +func TestStreamingAgent_CancelDuringToolEndsRun(t *testing.T) { + t.Parallel() + + type input struct{} + ctx, cancel := context.WithCancel(context.Background()) + + var toolRuns, streamCalls atomic.Int32 + tool := NewAgentTool("boom", "cancels the run", + func(ctx context.Context, in input, call ToolCall) (ToolResponse, error) { + toolRuns.Add(1) + cancel() + return ToolResponse{}, errors.New("could not finish") + }) + + mockModel := &mockLanguageModel{ + streamFunc: func(ctx context.Context, call Call) (StreamResponse, error) { + streamCalls.Add(1) + return func(yield func(StreamPart) bool) { + if !yield(StreamPart{Type: StreamPartTypeToolCall, ID: "call-1", ToolCallName: "boom", ToolCallInput: `{}`}) { + return + } + yield(StreamPart{Type: StreamPartTypeFinish, FinishReason: FinishReasonToolCalls, Usage: Usage{TotalTokens: 10}}) + }, nil + }, + } + + agent := NewAgent(mockModel, WithTools(tool)) + _, err := agent.Stream(ctx, AgentStreamCall{Prompt: "run boom"}) + + require.ErrorIs(t, err, context.Canceled) + require.Equal(t, int32(1), streamCalls.Load(), "the model must not be asked again after a cancel") + require.Equal(t, int32(1), toolRuns.Load()) +} diff --git a/agent_test.go b/agent_test.go index 476aaf0ca..2a1c4a107 100644 --- a/agent_test.go +++ b/agent_test.go @@ -2561,10 +2561,10 @@ func TestAgent_Generate_ExecutableProviderTool_ImageBase64(t *testing.T) { require.Equal(t, "image/png", mediaResult.MediaType) } -// TestAgent_Generate_ExecutableProviderTool_CriticalError verifies -// that a Go error returned from an ExecutableProviderTool's run -// function is treated as a critical error, stopping the agent loop. -func TestAgent_Generate_ExecutableProviderTool_CriticalError(t *testing.T) { +// TestAgent_Generate_ExecutableProviderTool_Error verifies that a Go error +// returned from an ExecutableProviderTool's run function reaches the model +// as an error result, like any other tool failure. +func TestAgent_Generate_ExecutableProviderTool_Error(t *testing.T) { t.Parallel() execTool := NewExecutableProviderTool( @@ -2582,6 +2582,13 @@ func TestAgent_Generate_ExecutableProviderTool_CriticalError(t *testing.T) { model := &mockLanguageModel{ generateFunc: func(ctx context.Context, call Call) (*Response, error) { callCount++ + if callCount > 1 { + return &Response{ + Content: []Content{TextContent{Text: "the screen is unavailable"}}, + Usage: Usage{TotalTokens: 10}, + FinishReason: FinishReasonStop, + }, nil + } return &Response{ Content: []Content{ ToolCallContent{ @@ -2603,10 +2610,53 @@ func TestAgent_Generate_ExecutableProviderTool_CriticalError(t *testing.T) { require.NoError(t, err) require.NotNil(t, result) - // The model should only be called once — the critical error stops - // the loop before a second model call. - require.Equal(t, 1, callCount) - require.Len(t, result.Steps, 1) + // The tool failure is reported to the model, which gets to answer. + require.Equal(t, 2, callCount) + require.Len(t, result.Steps, 2) + + results := result.Steps[0].Content.ToolResults() + require.Len(t, results, 1) + errResult, ok := results[0].Result.(ToolResultOutputContentError) + require.True(t, ok, "the tool failure must be recorded as an error result") + require.EqualError(t, errResult.Error, "vnc connection lost") +} + +// TestAgent_Generate_CancelDuringToolEndsRun pins that a cancel still ends a +// Generate run now that a tool's error no longer does. +func TestAgent_Generate_CancelDuringToolEndsRun(t *testing.T) { + t.Parallel() + + type input struct{} + ctx, cancel := context.WithCancel(context.Background()) + + toolRuns := 0 + tool := NewAgentTool("boom", "cancels the run", + func(ctx context.Context, in input, call ToolCall) (ToolResponse, error) { + toolRuns++ + cancel() + return ToolResponse{}, errors.New("could not finish") + }) + + callCount := 0 + model := &mockLanguageModel{ + generateFunc: func(ctx context.Context, call Call) (*Response, error) { + callCount++ + return &Response{ + Content: []Content{ + ToolCallContent{ToolCallID: "call-1", ToolName: "boom", Input: `{}`}, + }, + Usage: Usage{TotalTokens: 10}, + FinishReason: FinishReasonToolCalls, + }, nil + }, + } + + agent := NewAgent(model, WithTools(tool)) + _, err := agent.Generate(ctx, AgentCall{Prompt: "run boom"}) + + require.ErrorIs(t, err, context.Canceled) + require.Equal(t, 1, callCount, "the model must not be asked again after a cancel") + require.Equal(t, 1, toolRuns) } func TestAgent_Generate_StopTurn(t *testing.T) { diff --git a/tool.go b/tool.go index b856d55fa..e2fb57ec4 100644 --- a/tool.go +++ b/tool.go @@ -29,6 +29,11 @@ type ToolCall struct { } // ToolResponse represents the response from a tool execution, matching the existing pattern. +// +// A failure, whether a returned error or IsError, reaches the model as an +// error result and does not end the run. Returning an error discards the +// response, so a tool with a message for the model returns +// NewTextErrorResponse with a nil error. type ToolResponse struct { Type string `json:"type"` Content string `json:"content"` @@ -37,8 +42,10 @@ type ToolResponse struct { // MediaType specifies the MIME type of the media (e.g., "image/png", "audio/wav"). MediaType string `json:"media_type,omitempty"` Metadata string `json:"metadata,omitempty"` - IsError bool `json:"is_error"` - StopTurn bool `json:"stop_turn,omitempty"` + // IsError marks the response as a failure and is non fatal + IsError bool `json:"is_error"` + // StopTurn ends the agent loop after this toolcall and is fatal + StopTurn bool `json:"stop_turn,omitempty"` } // NewTextResponse creates a text response. @@ -49,7 +56,8 @@ func NewTextResponse(content string) ToolResponse { } } -// NewTextErrorResponse creates an error response. +// NewTextErrorResponse creates an error response. The model sees the content +// and gets to try again. func NewTextErrorResponse(content string) ToolResponse { return ToolResponse{ Type: "text", From 19f8e3e3ce7f4825f9ca825641718d20edce0d70 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 1 Oct 2026 11:34:07 -0300 Subject: [PATCH 138/156] chore(deps): bump github.com/ardanlabs/kronk (#405) Bumps the kronk group with 1 update: [github.com/ardanlabs/kronk](https://github.com/ardanlabs/kronk). Updates `github.com/ardanlabs/kronk` from 1.32.3 to 1.32.7 - [Release notes](https://github.com/ardanlabs/kronk/releases) - [Commits](https://github.com/ardanlabs/kronk/compare/v1.32.3...v1.32.7) --- updated-dependencies: - dependency-name: github.com/ardanlabs/kronk dependency-version: 1.32.7 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: kronk ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 84 ++++++++++++++-------------- go.sum | 172 ++++++++++++++++++++++++++++----------------------------- 2 files changed, 128 insertions(+), 128 deletions(-) diff --git a/go.mod b/go.mod index 2dbf82882..3dccb0c44 100644 --- a/go.mod +++ b/go.mod @@ -6,9 +6,9 @@ require ( charm.land/x/vcr v0.1.1 cloud.google.com/go/auth v0.23.2 github.com/anthropics/anthropic-sdk-go v1.68.0 - github.com/ardanlabs/kronk v1.32.3 - github.com/aws/aws-sdk-go-v2 v1.45.1 - github.com/aws/aws-sdk-go-v2/config v1.33.1 + github.com/ardanlabs/kronk v1.32.7 + github.com/aws/aws-sdk-go-v2 v1.47.0 + github.com/aws/aws-sdk-go-v2/config v1.33.5 github.com/aws/smithy-go v1.28.1 github.com/charmbracelet/openai-go v0.0.0-20260921175203-216db9e71b83 github.com/charmbracelet/x/exp/slice v0.1.0 @@ -19,8 +19,8 @@ require ( github.com/joho/godotenv v1.5.1 github.com/kaptinlin/jsonschema v0.9.9 github.com/stretchr/testify v1.12.1 - golang.org/x/net v0.58.0 - golang.org/x/oauth2 v0.36.0 + golang.org/x/net v0.59.0 + golang.org/x/oauth2 v0.37.0 google.golang.org/genai v1.70.0 ) @@ -31,26 +31,26 @@ require ( cloud.google.com/go/compute/metadata v0.9.0 // indirect cloud.google.com/go/iam v1.13.0 // indirect cloud.google.com/go/monitoring v1.30.0 // indirect - cloud.google.com/go/storage v1.65.1 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.36.0 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.60.0 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.60.0 // indirect + cloud.google.com/go/storage v1.68.0 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.38.0 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.62.0 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.62.0 // indirect github.com/ardanlabs/jinja v1.6.0 // indirect github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.20 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.20.1 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.19.1 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.5.1 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.8.1 // indirect - github.com/aws/aws-sdk-go-v2/internal/v4a v1.5.1 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.20.5 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.20.0 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.5.3 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.8.3 // indirect + github.com/aws/aws-sdk-go-v2/internal/v4a v1.5.3 // indirect github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.19 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.10.0 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.14.1 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.41 // indirect - github.com/aws/aws-sdk-go-v2/service/s3 v1.108.0 // indirect - github.com/aws/aws-sdk-go-v2/service/signin v1.7.1 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.35.1 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.40.1 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.47.1 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.11.3 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.14.3 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.20.3 // indirect + github.com/aws/aws-sdk-go-v2/service/s3 v1.113.1 // indirect + github.com/aws/aws-sdk-go-v2/service/signin v1.10.0 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.38.0 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.43.0 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.51.0 // indirect github.com/bahlo/generic-list-go v0.2.0 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d // indirect @@ -59,37 +59,37 @@ require ( github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/cncf/xds/go v0.0.0-20260202195803-dba9d589def2 // indirect github.com/coder/websocket v1.8.15 // indirect - github.com/ebitengine/purego v0.11.0-alpha.9 // indirect + github.com/ebitengine/purego v0.11.0 // indirect github.com/envoyproxy/go-control-plane/envoy v1.39.0 // indirect github.com/envoyproxy/protoc-gen-validate v1.3.3 // indirect github.com/felixge/httpsnoop v1.1.0 // indirect - github.com/go-jose/go-jose/v4 v4.1.4 // indirect + github.com/go-jose/go-jose/v4 v4.1.5 // indirect github.com/go-logr/logr v1.4.4 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/goccy/go-yaml v1.19.2 // indirect github.com/google/go-cmp v0.7.0 // indirect github.com/google/s2a-go v0.1.9 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.3.21 // indirect - github.com/googleapis/gax-go/v2 v2.24.0 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.3.22 // indirect + github.com/googleapis/gax-go/v2 v2.24.1 // indirect github.com/gorilla/websocket v1.5.3 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.30.0 // indirect github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.74 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect - github.com/hashicorp/go-getter v1.8.8 // indirect + github.com/hashicorp/go-getter v1.8.9 // indirect github.com/hashicorp/go-version v1.9.0 // indirect - github.com/hybridgroup/yzma v1.25.0 // indirect + github.com/hybridgroup/yzma v1.27.1-0.20260917101309-d48a589de711 // indirect github.com/invopop/jsonschema v0.14.0 // indirect github.com/jupiterrider/ffi v0.7.0 // indirect github.com/kaptinlin/jsonpointer v0.4.28 // indirect - github.com/klauspost/compress v1.19.2 // indirect + github.com/klauspost/compress v1.20.0 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/pb33f/ordered-map/v2 v2.3.1 // indirect github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect github.com/prometheus/client_golang v1.24.1 // indirect - github.com/prometheus/client_model v0.6.2 // indirect - github.com/prometheus/common v0.70.1 // indirect - github.com/prometheus/procfs v0.21.1 // indirect + github.com/prometheus/client_model v0.6.3 // indirect + github.com/prometheus/common v0.71.0 // indirect + github.com/prometheus/procfs v0.22.0 // indirect github.com/spiffe/go-spiffe/v2 v2.8.1 // indirect github.com/standard-webhooks/standard-webhooks/libraries v0.0.1 // indirect github.com/tidwall/gjson v1.19.0 // indirect @@ -112,16 +112,16 @@ require ( go.yaml.in/yaml/v2 v2.4.4 // indirect go.yaml.in/yaml/v3 v3.0.5 // indirect go.yaml.in/yaml/v4 v4.0.0-rc.3 // indirect - golang.org/x/crypto v0.55.0 // indirect - golang.org/x/image v0.45.0 // indirect - golang.org/x/sync v0.22.0 // indirect - golang.org/x/sys v0.47.0 // indirect - golang.org/x/text v0.41.0 // indirect - golang.org/x/time v0.15.0 // indirect - google.golang.org/api v0.294.0 // indirect - google.golang.org/genproto v0.0.0-20260825221802-da73d73af1c5 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20260825221802-da73d73af1c5 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20260825221802-da73d73af1c5 // indirect + golang.org/x/crypto v0.57.0 // indirect + golang.org/x/image v0.46.0 // indirect + golang.org/x/sync v0.23.0 // indirect + golang.org/x/sys v0.48.0 // indirect + golang.org/x/text v0.42.0 // indirect + golang.org/x/time v0.16.0 // indirect + google.golang.org/api v0.298.0 // indirect + google.golang.org/genproto v0.0.0-20260911204522-f61a6ca850bd // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20260911204522-f61a6ca850bd // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20260911204522-f61a6ca850bd // indirect google.golang.org/grpc v1.83.2 // indirect google.golang.org/protobuf v1.36.12 // indirect gopkg.in/dnaeon/go-vcr.v4 v4.0.6-0.20251110073552-01de4eb40290 // indirect diff --git a/go.sum b/go.sum index f73f03349..8a9a698d7 100644 --- a/go.sum +++ b/go.sum @@ -18,58 +18,58 @@ cloud.google.com/go/longrunning v1.2.0 h1:WjYH3YHBGCxGJP9M4dWGHBfXr/cFIjMkNgWcJj cloud.google.com/go/longrunning v1.2.0/go.mod h1:5KMQALFGOCtFoi2xSOA1u3H7WKlhmckgiyFw7+LGQp0= cloud.google.com/go/monitoring v1.30.0 h1:r/d+JUbyKmJ8b07iznuKfzVzrIXTWxHQ3lBRm3x2LlY= cloud.google.com/go/monitoring v1.30.0/go.mod h1:htlUR0QWVMrjFzZmN4LGnMAve9xB/eduwjmINxVZ8RM= -cloud.google.com/go/storage v1.65.1 h1:LRRpBJUTf+OXDPX9jZUKZ3mSLIsz3htG+qUpeNZovyA= -cloud.google.com/go/storage v1.65.1/go.mod h1:UsS9OgFg/XHOSYakQ8ZtLWWeyGkk1WnmD/GsGfN0BHM= +cloud.google.com/go/storage v1.68.0 h1:gqrAMJ51OZjYgU6AJ2U60um90YQhSjq8HEIQNtJ4C/8= +cloud.google.com/go/storage v1.68.0/go.mod h1:UsS9OgFg/XHOSYakQ8ZtLWWeyGkk1WnmD/GsGfN0BHM= cloud.google.com/go/trace v1.16.0 h1:GmQovzFc5F0CNfl0VLgL64aoTtu7xsM0YajW2GlG9+E= cloud.google.com/go/trace v1.16.0/go.mod h1:r+bdAn16dKLSV1G2D5v3e58IlQlizfxWrUfjx7kM7X0= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.36.0 h1:3SdxXLkgAfiHRWcGTq6fneq9jgoJzneiY0yPQnjoT2E= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.36.0/go.mod h1:1iIdl0k+ppn9wT0wzR9H7HkSvIui/4qgtnKW10cQtds= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.60.0 h1:HldzheTs05E3ybqSitI/wHaof6+XERRudgZLjYbs3eE= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.60.0/go.mod h1:evkqaSczW9g2BQm1veCtgNhJ4wCCsRrOsSgNIn9LHQk= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.60.0 h1:Fx8NtDCmKH4ML2hUkPz4Dq250903vRDojMjVCDKwQuc= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.60.0/go.mod h1:V9g30lTKzfUsEW+gpWssck6u9IhARajmipodImLLcwI= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.60.0 h1:Oblia1QXBJlM/wOY9ARRUtsXdDYiMCzk3eCMikqoLbI= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.60.0/go.mod h1:SRAbhyZ4R4FagHMM9VtRgSY/lheRoht2fKelZXQUenk= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.38.0 h1:rmzbFS2CkHq0y2L5LkMVWm+QXjjNEXxjmhrJqga/QGk= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.38.0/go.mod h1:iIyrdhveU5Ow84ipRlxtjCOQnIM0DiqSMxuxm50xwZY= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.62.0 h1:5y2LR2pripbccOte6BpZ+guv5O5W0OQIfKvUYZrGaAQ= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.62.0/go.mod h1:b3f7EifFRqkVt142USoGIP62uUeZm7ALCPrs1ZjWXYo= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.62.0 h1:tRsXhJnn0w0TNwJpVrB94wsrimzjWKFzdQlUhRdNUzc= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.62.0/go.mod h1:ifhe5teRNcbxg9p353DhOkOgczzL/IBLYFqT1cm1zpM= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.62.0 h1:aPMa5qZU9dp4fU34o+jQgVIPFIOi20oxYg8TLigmZLg= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.62.0/go.mod h1:sg6Wqbl0BKKZ5zKnQj2q0qic/3ziF894SCx1LpbX37Y= github.com/anthropics/anthropic-sdk-go v1.68.0 h1:FikM/c545Fw+6lp0iQ48hnfn1wK4SxBjkYoGrGMwMhY= github.com/anthropics/anthropic-sdk-go v1.68.0/go.mod h1:3EfIfmFqxH6rbiLcIP4tPFyXL/IHakx2wDG4OU+TIEI= github.com/ardanlabs/jinja v1.6.0 h1:CbqS/dxYM9qrmlBed1GsN64/tRY6SoWQWc5Sc+aw3iI= github.com/ardanlabs/jinja v1.6.0/go.mod h1:aXXzlJfjA+T3XNKA/YT5ZtDq2VJxt5a5siZ8cl9B35Q= -github.com/ardanlabs/kronk v1.32.3 h1:/7z88c+0cqkdLIkyWyR1HmICeXh0oFPZ+vju5Z81TZ0= -github.com/ardanlabs/kronk v1.32.3/go.mod h1:xU15Jy9JV/bVSNCHsItlPPX4oDWvTY7xkuZsDMuAvTo= -github.com/aws/aws-sdk-go-v2 v1.45.1 h1:iIoG3NaLhV6UZpPXyPXlDj2I9oS8tV/nMcMnITCC6Ks= -github.com/aws/aws-sdk-go-v2 v1.45.1/go.mod h1:bttEH6JqnUL8LepvDVfdrds/fZ5bCIxzpe3abyUrhDU= +github.com/ardanlabs/kronk v1.32.7 h1:JUKLyI11gkivAmhHJZ6VRYVfN7ZgljYr7+sj2BUaqDw= +github.com/ardanlabs/kronk v1.32.7/go.mod h1:5NYTsOG2BjDQanW45o6mxVprKCkLzAlKXhXl/8zxh2g= +github.com/aws/aws-sdk-go-v2 v1.47.0 h1:0jsHallhJCeaU0Ko48c/3FK1ctOQ7NpzggxriJOQ8MQ= +github.com/aws/aws-sdk-go-v2 v1.47.0/go.mod h1:bttEH6JqnUL8LepvDVfdrds/fZ5bCIxzpe3abyUrhDU= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.20 h1:GPRlPwz40I2B2VrBEASOA3Bi77NyeqejNLkifosX0rs= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.20/go.mod h1:g7PNzKcsOKWb4fkSRBA7BZVAS6Y8IcxzN+nRohhQ1Q8= -github.com/aws/aws-sdk-go-v2/config v1.33.1 h1:bq9jze1hQ5YTCLoVxNnbp0T7rglrlOE7N9YsHqjGkEw= -github.com/aws/aws-sdk-go-v2/config v1.33.1/go.mod h1:2A3HQwG4zaL5Tm80rc6RZj8LmWWv4WYT5v8raSz/L7A= -github.com/aws/aws-sdk-go-v2/credentials v1.20.1 h1:Z8GRNEx0u9sDkZOq4PUnN8mjGwbUQGRzMSXpvt3d8xQ= -github.com/aws/aws-sdk-go-v2/credentials v1.20.1/go.mod h1:uBIK00kFo95dnemqfFMTWx0X8YRqsh6ecIoCjjOkZqM= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.19.1 h1:YIEBqcqRnpi4Pfv0YHImtgi6czGCwKHANC7SwmUAVD0= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.19.1/go.mod h1:imEf0oufgAo8KAkCHhrOdqGEC0YWx1PPBQH82shSxGw= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.5.1 h1:pc138gM1CW+XPc60rEwUlwwuwWFQK16CI1T7v1F9Oec= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.5.1/go.mod h1:1+koxpPIbfBdfzP6vojm5/zTpTQ/micYwlxIiNB3TxI= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.8.1 h1:K0JsbZQj+1h208Ro1zHeA4l7bMp0NvRffHQ91q8Ol1s= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.8.1/go.mod h1:W3/vL6EtCIatICGy9ab29QhMuae+cOKPWcMxv02CO+Q= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.5.1 h1:yhw5KD1phVyP9vijxOUzDfEtJx+bt+L63k+VfuiYFAA= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.5.1/go.mod h1:ZW2e0d7DYlRxlS9hEiMXE47gTdX5KRN4byUiNbUpG+Q= +github.com/aws/aws-sdk-go-v2/config v1.33.5 h1:UA1dmokBFOLFoOyVBhO6HjM6edy0MIk5AZSkJVcksQw= +github.com/aws/aws-sdk-go-v2/config v1.33.5/go.mod h1:Dop8axzz0xx38GExIYWXdeyc8QQ7Cr+nPsxpD/LYy4U= +github.com/aws/aws-sdk-go-v2/credentials v1.20.5 h1:wklUVvHMc9xTQ3rcp49/ISpiMnhbCicJcA6n6S8m7J8= +github.com/aws/aws-sdk-go-v2/credentials v1.20.5/go.mod h1:fyEdrn6ccLFOkoK84j5bQyGTxp9zPt5l2XMhxf4DVZs= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.20.0 h1:AM4hHjww+PSFtt6E+UrBrPlZkWsePCLEt9AjkfQX+yM= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.20.0/go.mod h1:3x/yXezeQjpOvBb4jEMxrS8SXvpdvJ5abv6l5c1gWM8= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.5.3 h1:Hp/VgjP0BysR3OgLlR057Vz2LcbbVnoWeJ+3qWiS/fY= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.5.3/go.mod h1:nwGV5qw7F1IZPgxCvA/ph8N2TAuz+BkRG/bXn808qMA= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.8.3 h1:MUaM4f+kj1ZIBPZfUS8cxP1GKXXZtHJjAthy93AN7SM= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.8.3/go.mod h1:6YmVmEVRI5ZZzRjCSsb9SryKH0hAlMRdgA7kG9aDvBU= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.5.3 h1:fuSCw4Z2qfRCztMPO3GXJNSiEp6Wee+WOLwrHHUMy9c= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.5.3/go.mod h1:6SxcHheD1pPR5+kWm1wGvjlL/YqUsh267sAfEmN4K7A= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.19 h1:bAdDl/HkGCcGPoe25ToSHEw23VIxt6CT5fLcg111BKg= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.19/go.mod h1:KaUzbLxv4CeSxh6ZCl9B4m7CuFenS8kUEaDs+f/DQr4= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.10.0 h1:U8/A0RRBaEspzH1uul3JHLbypXwEGUkRkvoT9f0ATcM= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.10.0/go.mod h1:UELStX5KwtJNtQxa+UuF8dc3z4UYc40e8yHYJSozNwY= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.14.1 h1:RmmWQPREQdk9U+PfqeHW3MqZaBaNK7TpV9W3RY+b+7g= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.14.1/go.mod h1:0A3W4F+68ZnNk5XcNL/e9HFMwnP8RlEicFfy6eOEDyw= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.41 h1:Q9DIKDuJix/oJnQxFpQ26L0EwVa/YNo4k2kbktrjQjE= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.41/go.mod h1:x+TuqkOIG1SZS0+yN54sExGA9ZpjhPO6vPdYnpTFX1M= -github.com/aws/aws-sdk-go-v2/service/s3 v1.108.0 h1:Yp+x5PKXEmoqHsgP/pAkBy5Tyq1UlXAzM0OInh0vxWw= -github.com/aws/aws-sdk-go-v2/service/s3 v1.108.0/go.mod h1:locV6DtXyp7Xzr2BG6jtsbeBi3YAWJ/CY4xUThYmIwQ= -github.com/aws/aws-sdk-go-v2/service/signin v1.7.1 h1:mdMtSVKdQ3+mzBh+l0ogrFYZVQUCg6pJZOirA2ARsYE= -github.com/aws/aws-sdk-go-v2/service/signin v1.7.1/go.mod h1:9IqUlsJDbUPcg6cgx3WEzXdjrbWzLDQrak0aaSqlTcI= -github.com/aws/aws-sdk-go-v2/service/sso v1.35.1 h1:B6WFn91tobD6gG4724ONHaqrpKsoETGnv98LHe/yIGM= -github.com/aws/aws-sdk-go-v2/service/sso v1.35.1/go.mod h1:tWuiVBUtPBr8/rgRiYS8Uf85sHcAN+G7XS3D3CEoUh8= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.40.1 h1:6yeYCWFvgbI2TI3K6jr9LtBNhXgJ7g4xqD+DEiaDDmM= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.40.1/go.mod h1:naFe83jSMuYkH+QjQPX8n1MLhBkeCFM5Lsnh5m5wz3c= -github.com/aws/aws-sdk-go-v2/service/sts v1.47.1 h1:Sv2xPnRHlThSUtVujYuUBPI/Il8si6UPHXL8DMiB/F0= -github.com/aws/aws-sdk-go-v2/service/sts v1.47.1/go.mod h1:mKo/CzaCz8qytGW70NG4vIIGAx1HXTlb5lHNkC5k3lk= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.11.3 h1:BHKCSX4QXERe8So8rbWqaM7owqOmDJxATXgJwGng22A= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.11.3/go.mod h1:GqWeeKfYfezihA2KfFL9l7ohEdZWe1tuFWh3GfyNSnE= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.14.3 h1:bON1rJf67TSTDCKg816AAIE4xSTtoo9tl0XRkO72R+I= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.14.3/go.mod h1:c5BBpjJcQXpfeq9iASyVKA3T6vX6B6LEXY4mL/gklDY= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.20.3 h1:L8vIOxylma91TcR96NFTEC07G3JDwSl+CvK2b+IODms= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.20.3/go.mod h1:fmPIZQzTExYuBNWFyi1P7IoDjvskgphXqK1yObMzusM= +github.com/aws/aws-sdk-go-v2/service/s3 v1.113.1 h1:cFHmwLxZPvtoAlo79MboURL2+7b0TMHycnrcf5VZNXk= +github.com/aws/aws-sdk-go-v2/service/s3 v1.113.1/go.mod h1:/uA+2Qj4jd5qBWagVC1AyzzDFXVK997E7U04w7Kw0wI= +github.com/aws/aws-sdk-go-v2/service/signin v1.10.0 h1:ZD5qFpWcaOKdTuhBi431pIDkCgrMkMlMT6jlpSPoIRI= +github.com/aws/aws-sdk-go-v2/service/signin v1.10.0/go.mod h1:8Nuuf+tR346PjJ3MvZPh9pekbLiLQFWJhzMXfwy7alA= +github.com/aws/aws-sdk-go-v2/service/sso v1.38.0 h1:JGeeBcMlhg1xtOXYpeCaTQBZObtXMPQCUqBcmr65NRA= +github.com/aws/aws-sdk-go-v2/service/sso v1.38.0/go.mod h1:XwteswG9EOMRFm73UT0t+MbTwyLxMrEXkU6e+v92Lzo= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.43.0 h1:obhahQXDEdVEv8y5bTKXR30LVaxYe1kyYM0L7l2Iq+k= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.43.0/go.mod h1:6twZZ/aXHNy1vXUO8koUbp++MYzMASkOgEBdkbJYmO0= +github.com/aws/aws-sdk-go-v2/service/sts v1.51.0 h1:Zpnqa6XtrNzXZnwbdCqHOXpXhMsa01ql/pcRQ1sb4hk= +github.com/aws/aws-sdk-go-v2/service/sts v1.51.0/go.mod h1:/8JRcdTt//hG0Q4BTmGbuOplT7ABe+5rdtqUHqXvYIM= github.com/aws/smithy-go v1.28.1 h1:R/nXH00c8qcfCzQVELtRw+eLQWtzv+VAIEFJ1/xxXlQ= github.com/aws/smithy-go v1.28.1/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc= github.com/bahlo/generic-list-go v0.2.0 h1:5sz/EEAK+ls5wF+NeqDpk5+iNdMDXrh3z3nPnH1Wvgk= @@ -98,8 +98,8 @@ github.com/coder/websocket v1.8.15 h1:6B2JPeOGlpff2Uz6vOEH1Vzpi0iUz20A+lPVhPHtNU github.com/coder/websocket v1.8.15/go.mod h1:NX3SzP+inril6yawo5CQXx8+fk145lPDC6pumgx0mVg= github.com/dnaeon/go-vcr v1.2.0 h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI= github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= -github.com/ebitengine/purego v0.11.0-alpha.9 h1:nH3UEIa45o38JcEgQlPgBFuGU0BkdU68u3v/IXrgo9k= -github.com/ebitengine/purego v0.11.0-alpha.9/go.mod h1:DCHPP08djqhNSoTfImcnHYQRZmd0qhakvrozqaEYhGQ= +github.com/ebitengine/purego v0.11.0 h1:jhp/D+Nyv7UUW8HAcmcjt2N2rYrYi9m3SL21k0Ua/NI= +github.com/ebitengine/purego v0.11.0/go.mod h1:DCHPP08djqhNSoTfImcnHYQRZmd0qhakvrozqaEYhGQ= github.com/envoyproxy/go-control-plane v0.14.0 h1:hbG2kr4RuFj222B6+7T83thSPqLjwBIfQawTkC++2HA= github.com/envoyproxy/go-control-plane v0.14.0/go.mod h1:NcS5X47pLl/hfqxU70yPwL9ZMkUlwlKxtAohpi2wBEU= github.com/envoyproxy/go-control-plane/envoy v1.39.0 h1:1uwRDYPYG8BIBU9Mj1sUAebNmlM6beu/ZKKweSLDxk8= @@ -110,8 +110,8 @@ github.com/envoyproxy/protoc-gen-validate v1.3.3 h1:MVQghNeW+LZcmXe7SY1V36Z+WFMD github.com/envoyproxy/protoc-gen-validate v1.3.3/go.mod h1:TsndJ/ngyIdQRhMcVVGDDHINPLWB7C82oDArY51KfB0= github.com/felixge/httpsnoop v1.1.0 h1:3YtUj32ZZkqZtt3sZZsClsymw/QDuVfpNhoA31zeORc= github.com/felixge/httpsnoop v1.1.0/go.mod h1:Zqxgdd+1Rkcz8euOqdr7lqgCRJztwr5hp9vDSi5UZCE= -github.com/go-jose/go-jose/v4 v4.1.4 h1:moDMcTHmvE6Groj34emNPLs/qtYXRVcd6S7NHbHz3kA= -github.com/go-jose/go-jose/v4 v4.1.4/go.mod h1:x4oUasVrzR7071A4TnHLGSPpNOm2a21K9Kf04k1rs08= +github.com/go-jose/go-jose/v4 v4.1.5 h1:RjgjO2LOtWOJKUC5wpwY9LR3B3vwVAz6JS2YHfYU6eA= +github.com/go-jose/go-jose/v4 v4.1.5/go.mod h1:x4oUasVrzR7071A4TnHLGSPpNOm2a21K9Kf04k1rs08= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.4.4 h1:tG4xh9yMsRCAiodLVTxyrkzSZ9+o0L1Kg/+cPVcbP/8= github.com/go-logr/logr v1.4.4/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= @@ -131,10 +131,10 @@ github.com/google/s2a-go v0.1.9 h1:LGD7gtMgezd8a/Xak7mEWL0PjoTQFvpRudN895yqKW0= github.com/google/s2a-go v0.1.9/go.mod h1:YA0Ei2ZQL3acow2O62kdp9UlnvMmU7kA6Eutn0dXayM= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.3.21 h1:OFdQ3tnCX/zaQ0Cedur3D3z7kI6HiLX9g3TiAN4/DFU= -github.com/googleapis/enterprise-certificate-proxy v0.3.21/go.mod h1:L3D/IQExI6LqEjBdXcZQ1WluSgigQmSwBboFstVPM4w= -github.com/googleapis/gax-go/v2 v2.24.0 h1:myMaPYyF9MecEmvQqMqomIwn9t/4KCZN9qnwsS76wlg= -github.com/googleapis/gax-go/v2 v2.24.0/go.mod h1:IaTHBDd7NHxSCiu0vEs8pQZu4dGZrWwuSoxCnk16OFM= +github.com/googleapis/enterprise-certificate-proxy v0.3.22 h1:NU4XpII6jD+Dxcot94fqjE+AfJoE/lQP9q3faYGzC/c= +github.com/googleapis/enterprise-certificate-proxy v0.3.22/go.mod h1:L3D/IQExI6LqEjBdXcZQ1WluSgigQmSwBboFstVPM4w= +github.com/googleapis/gax-go/v2 v2.24.1 h1:AtqTN21IXMMWo99LiEVAiBfNNQmO40d8xUfZI640mc0= +github.com/googleapis/gax-go/v2 v2.24.1/go.mod h1:bWeBei0NVwaNZKb2y1HUBS7gLXIF3/Tu3pq7j8D2Tb0= github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/grpc-ecosystem/grpc-gateway/v2 v2.30.0 h1:/Tnpcb2E0Pz/tN9s3bfEY2Q8ePCEX9iuS+cneUwncnw= @@ -143,12 +143,12 @@ github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.74 h1:mymLUKThnV9wFvogOK8Nns github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.74/go.mod h1:Bh9qYL8ehmDxSg14Tk8oxFCP90XHfs6NxV1D84884xA= github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= -github.com/hashicorp/go-getter v1.8.8 h1:sRakhf+EH6s0LZLO2IgBwZ6hAFp+fZOZMNREwVELV80= -github.com/hashicorp/go-getter v1.8.8/go.mod h1:fqFlibKpwfns/s4oljLB3upJspyfFLQhS7031PlfUDc= +github.com/hashicorp/go-getter v1.8.9 h1:1AOTMUmz/S/GuqOTE6+bg6nwPXTEbKr3Tc/T/lVS7is= +github.com/hashicorp/go-getter v1.8.9/go.mod h1:qI7vH/m552bXutKe4UkWptOJl4bo2KeO/CSOoh4s0ps= github.com/hashicorp/go-version v1.9.0 h1:CeOIz6k+LoN3qX9Z0tyQrPtiB1DFYRPfCIBtaXPSCnA= github.com/hashicorp/go-version v1.9.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hybridgroup/yzma v1.25.0 h1:COWD3hgZJv0gMOugweWpdfJ4dw5H738VUtY079RteZ0= -github.com/hybridgroup/yzma v1.25.0/go.mod h1:wAMtNTjSnE79jTWzaeFSsuraam0TXKCPajMHA5s+OX8= +github.com/hybridgroup/yzma v1.27.1-0.20260917101309-d48a589de711 h1:tg8YSu7/puDjhGPZTAxTxCpyPEWC+26/KN5E9UbUOaE= +github.com/hybridgroup/yzma v1.27.1-0.20260917101309-d48a589de711/go.mod h1:wAMtNTjSnE79jTWzaeFSsuraam0TXKCPajMHA5s+OX8= github.com/invopop/jsonschema v0.14.0 h1:MHQqLhvpNUZfw+hM3AZDYK7jxO8FZoQeQM77g8iyZjg= github.com/invopop/jsonschema v0.14.0/go.mod h1:ygm6C2EaVNMBDPpaPlnOA2pFAxBnxGjFlMZABxm9n2I= github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= @@ -159,8 +159,8 @@ github.com/kaptinlin/jsonpointer v0.4.28 h1:PyxOfdml9PGpxQz+JnNLGsyzQ+Rnm+OVNTGc github.com/kaptinlin/jsonpointer v0.4.28/go.mod h1:JzeIDw1+60bryzOFea9P3zjKg8pfJHd+UIA/zfZ70x8= github.com/kaptinlin/jsonschema v0.9.9 h1:1N00sHfrZcBwcHgI646PuIf1VaODHPsqRnNi0OY2ERw= github.com/kaptinlin/jsonschema v0.9.9/go.mod h1:egi7QzDHFN/avPEqQgyGgXCcmC0cl/KxS2ePcHHRcOs= -github.com/klauspost/compress v1.19.2 h1:hMRETovs/pu/dVWN7zIT1PGG8t509MwT6bO7XSi26R8= -github.com/klauspost/compress v1.19.2/go.mod h1:cwPg85FWrGar70rWktvGQj8/hthj3wpl0PGDogxkrSQ= +github.com/klauspost/compress v1.20.0 h1:a3C1ke2ohxFymNlb2HWAHjDeKCI90scRskErZkR0ezA= +github.com/klauspost/compress v1.20.0/go.mod h1:LUdAzn7YLVvxLpc7y3V1m40wESHTgc1422pwwBSKYuI= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= @@ -171,12 +171,12 @@ github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgm github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= github.com/prometheus/client_golang v1.24.1 h1:JnJkREXzWxUdCuPFpIWZiPispT9xVV59uiuyR2bPlnU= github.com/prometheus/client_golang v1.24.1/go.mod h1:F+oSRECHg4sse5ucfYpYDeIv/hu68Zo0uoHKetWnzcE= -github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= -github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= -github.com/prometheus/common v0.70.1 h1:1HvjP4D5oL3t8RsPlwxA9onvvStjtIHYE5XuuwOi/PY= -github.com/prometheus/common v0.70.1/go.mod h1:VdFUQDMZK3VLkurFUVhia6uys/0suUp86TJz5qbJRhc= -github.com/prometheus/procfs v0.21.1 h1:GljZCt+zSTS+NZq88cyQ1LjZ+RCHp3uVuabBWA5+OJI= -github.com/prometheus/procfs v0.21.1/go.mod h1:aB55Cww9pdSJVHk0hUf0inxWyyjPogFIjmHKYgMKmtY= +github.com/prometheus/client_model v0.6.3 h1:O0jaTVAYNxTHYInEPFJt5I3+sN8zqBtVMPTB1qyxiEo= +github.com/prometheus/client_model v0.6.3/go.mod h1:gpN5P9S7Rr6Yr92PiQ+Ixvhf6JZEkF1dnxsYL2aPBEM= +github.com/prometheus/common v0.71.0 h1:9KDAKb7Mj3HEVKyFCK6Dc/HIwlBzZIN2l7/lrHl3KK8= +github.com/prometheus/common v0.71.0/go.mod h1:CLJ5H8TEsGX8bl31BdMkfhIZ+QmZ9tBPPotUxUbfcmk= +github.com/prometheus/procfs v0.22.0 h1:6q9+/JL9IKAPbCmBrv9n5O5Ty3NKnciV5X7YGw0oics= +github.com/prometheus/procfs v0.22.0/go.mod h1:CvmFr/GVhIjIvWJZW3tgkODBQMRIf0EyWMQLHCHab58= github.com/spiffe/go-spiffe/v2 v2.8.1 h1:eXZMLsu+3MLEPJyGJkolqtVrteZfQdUpOWj6LTiDl/E= github.com/spiffe/go-spiffe/v2 v2.8.1/go.mod h1:47Q0Q9/AqGha8QLHp+kxpH4Wca7X7EnOtlIJy3mxZ3U= github.com/standard-webhooks/standard-webhooks/libraries v0.0.1 h1:uOfcYT+3QungH6tIGSVCR/Y3KJmgJiHcojJbMTPDZAI= @@ -231,34 +231,34 @@ go.yaml.in/yaml/v3 v3.0.5 h1:N6y/pJk8buWs9NY5ERU2HSMfm+IuD/OtfdAnq6kESPw= go.yaml.in/yaml/v3 v3.0.5/go.mod h1:HVTZu1O7/Vkt2N+BFy8Zza+lnLsABggaTM2ZpNIGuKg= go.yaml.in/yaml/v4 v4.0.0-rc.3 h1:3h1fjsh1CTAPjW7q/EMe+C8shx5d8ctzZTrLcs/j8Go= go.yaml.in/yaml/v4 v4.0.0-rc.3/go.mod h1:aZqd9kCMsGL7AuUv/m/PvWLdg5sjJsZ4oHDEnfPPfY0= -golang.org/x/crypto v0.55.0 h1:+KWHjbgOaAQ66dh/YlkZKHlz9ZUlq61AFirAR9ntP8M= -golang.org/x/crypto v0.55.0/go.mod h1:uq0V9dE/fzQuJtbnL+2EhWOE63vo164FY8xqEnV9xis= -golang.org/x/image v0.45.0 h1:FMb1nTbH5H9vF55SriQHgFw5GnNL9Jg6L25BwXKzhB0= -golang.org/x/image v0.45.0/go.mod h1:n62x/7RqlwXDvGsSU4u6IUTUf6KghUZ9Bt7cG/T9Fx4= -golang.org/x/net v0.58.0 h1:ynWG7rqYi4ccpTEuPZ2QGWHktVEM9DMCj9yzDE0Q7To= -golang.org/x/net v0.58.0/go.mod h1:YwCddHnFlT7eLQqVprV19OnhLGtc5xOKgE0RyqgfWAU= -golang.org/x/oauth2 v0.36.0 h1:peZ/1z27fi9hUOFCAZaHyrpWG5lwe0RJEEEeH0ThlIs= -golang.org/x/oauth2 v0.36.0/go.mod h1:YDBUJMTkDnJS+A4BP4eZBjCqtokkg1hODuPjwiGPO7Q= -golang.org/x/sync v0.22.0 h1:SZjpbeLmrCk4xhRSZFNZW5gFUeCeFgjekvI/+gfScek= -golang.org/x/sync v0.22.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= -golang.org/x/sys v0.47.0 h1:o7XGOvZQCADBQQ4Y7VNq2dRWQR7JmOUW8Kxx4ZsNgWs= -golang.org/x/sys v0.47.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= -golang.org/x/text v0.41.0 h1:vz/seA0lnX87Othu2f/0L24RcgrXD9/YFTSuGjj3rH8= -golang.org/x/text v0.41.0/go.mod h1:jvf1O8ajNzZqhSrQBPbutR/EB83Cc0CFrezNQIwbb5M= -golang.org/x/time v0.15.0 h1:bbrp8t3bGUeFOx08pvsMYRTCVSMk89u4tKbNOZbp88U= -golang.org/x/time v0.15.0/go.mod h1:Y4YMaQmXwGQZoFaVFk4YpCt4FLQMYKZe9oeV/f4MSno= +golang.org/x/crypto v0.57.0 h1:3ZVCjf8Ggz7zneR/EHRVx68Ctf+2pmIMP2UFhh9cC6M= +golang.org/x/crypto v0.57.0/go.mod h1:Fdz0i5U6CoizGwLda9DttjSk6qlZo25zYNtR+ycvuZA= +golang.org/x/image v0.46.0 h1:b1+oYj0Jbp6K5MDT4i4/eZpYlk3V8SJhhDKh6LBHAyQ= +golang.org/x/image v0.46.0/go.mod h1:3B3W05VGVQyuXucLINLjXKrqISASfi4Xj+iCVkLMwew= +golang.org/x/net v0.59.0 h1:5zfYln+w5XCxwrnMMJPufRgNoXEaGxl0wo5GqPXyues= +golang.org/x/net v0.59.0/go.mod h1:2DA/G1UfVbCpQPeWTmMPGY7Cs2PkBkwu743bVX5PIVg= +golang.org/x/oauth2 v0.37.0 h1:JUlcxA8oAtauLfiH8FX2/FkAWHAdi0QtGCGc+hofE98= +golang.org/x/oauth2 v0.37.0/go.mod h1:IxwZNxUULJmpBFf9K/9NTMSIfZZuvuTy1gGxhigP/58= +golang.org/x/sync v0.23.0 h1:KameEIfc1IkluZyXWLn39Wd4tURc6GbCiISGiZm2bQk= +golang.org/x/sync v0.23.0/go.mod h1:sUUOizhqBxiL6pEWpqNLUiaJn1ShEbZ6BBqskPbjZm0= +golang.org/x/sys v0.48.0 h1:bbX/i/6MgT9BVLM9RT1thmxL04yeTAhbEz4SyadbXoo= +golang.org/x/sys v0.48.0/go.mod h1:hNLxWAXmnKAxqDtdwIYC4bM9oQPEecfsnNMuSxOs3og= +golang.org/x/text v0.42.0 h1:JbOZXgfeCPU9gacVtYliJqOhD+zhrEqK4LfdpmlUZqI= +golang.org/x/text v0.42.0/go.mod h1:ojzP1Z+2QtioaF8DTtO8K5q7JWVVYwZKenzujK0Zd0E= +golang.org/x/time v0.16.0 h1:vMb6ptszcQMkcwiRTAuNNU50gom6++Q/6gY2hDM6VDE= +golang.org/x/time v0.16.0/go.mod h1:rVKOqvZeKvrDKTQiAHJ7wmwP0RzleSphoEA9RcdLA0s= gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4= gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E= -google.golang.org/api v0.294.0 h1:8gASjJxdtcIieB3OqbkLcF0FfbXVNqKtU5iozD1ssvA= -google.golang.org/api v0.294.0/go.mod h1:02qB8+Ox1ZFzcaKFMguy1nQLJmSIyvV6Ff4txJEXtl4= +google.golang.org/api v0.298.0 h1:YW18RkHBMZBA1ergX0m4biagzgbiPTb2uTsRsDPWNRY= +google.golang.org/api v0.298.0/go.mod h1:02qB8+Ox1ZFzcaKFMguy1nQLJmSIyvV6Ff4txJEXtl4= google.golang.org/genai v1.70.0 h1:V9oYOBvTDYbmeklOHjvxGeeLau71WiS2CWKrktQtDok= google.golang.org/genai v1.70.0/go.mod h1:mDdPDFXo1Ats7f1WXVyZgWb/CkMzFWTWJruIMy7hGIU= -google.golang.org/genproto v0.0.0-20260825221802-da73d73af1c5 h1:jPP56YzdY899KJ5W7efXHt/CkjlVfAaoFOwdi/IEAFA= -google.golang.org/genproto v0.0.0-20260825221802-da73d73af1c5/go.mod h1:gutZdP0DwAHp4vu5WaXgEK7tjsJ77ZEqzlOFWGZGziE= -google.golang.org/genproto/googleapis/api v0.0.0-20260825221802-da73d73af1c5 h1:izFU9hz7aeLI/Mi1J0991ae+xcwRLr7hTqWnB/9aIIU= -google.golang.org/genproto/googleapis/api v0.0.0-20260825221802-da73d73af1c5/go.mod h1:3LhxRw4YYkf+ylAfgaY9JlVLFKhokkCV8duhLLe7+t0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260825221802-da73d73af1c5 h1:1VUiZAXyC+zmiFYi+WLtBzr68Cj8wOofHjjrA/kkizc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260825221802-da73d73af1c5/go.mod h1:DjtHYE8FKJLivXcBEjGwndXfIC23G0VpXiXKqG179uA= +google.golang.org/genproto v0.0.0-20260911204522-f61a6ca850bd h1:s/EXdxMDrmT++u0VepJKO4U6dzOPJVRdHKmrazC1Qxg= +google.golang.org/genproto v0.0.0-20260911204522-f61a6ca850bd/go.mod h1:JfZ1Hyx5mAJgX/ip0vEicmPvzE6rIrbacB7rHMfjD7Q= +google.golang.org/genproto/googleapis/api v0.0.0-20260911204522-f61a6ca850bd h1:jgCQeWccunvocKNK2RjhQHNiSjSeMMuBpQ/5pbP+2lA= +google.golang.org/genproto/googleapis/api v0.0.0-20260911204522-f61a6ca850bd/go.mod h1:r4KD2hOq82JBWpTWkJ9NZLf6EwmRvAPIFmk7hPNtd+0= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260911204522-f61a6ca850bd h1:29LZPNIJg+GEmJwZXruJJRwqy/wnWAYZXDtROToV/aQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260911204522-f61a6ca850bd/go.mod h1:DjtHYE8FKJLivXcBEjGwndXfIC23G0VpXiXKqG179uA= google.golang.org/grpc v1.83.2 h1:EManeRomTObA0BU7I8vXgg/78uE5MJ9M8B39EX2WscU= google.golang.org/grpc v1.83.2/go.mod h1:YPI1hK3kDked6iHvgX3tR0y+nX/qpMFKhPgFsokw1S8= google.golang.org/protobuf v1.36.12 h1:pJOKDDOyeXErUroCihFAd5LQuwXBSpVnKGrj5o/fwxc= From 3a9d44f4398cf7137035a7908404a176cc6122a8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 1 Oct 2026 12:04:23 -0300 Subject: [PATCH 139/156] chore(deps): bump the all group across 1 directory with 7 updates (#408) Bumps the all group with 7 updates in the / directory: | Package | From | To | | --- | --- | --- | | [cloud.google.com/go/auth](https://github.com/googleapis/google-cloud-go) | `0.23.2` | `0.24.0` | | [github.com/anthropics/anthropic-sdk-go](https://github.com/anthropics/anthropic-sdk-go) | `1.68.0` | `1.75.0` | | [github.com/aws/aws-sdk-go-v2](https://github.com/aws/aws-sdk-go-v2) | `1.47.0` | `1.47.1` | | [github.com/aws/aws-sdk-go-v2/config](https://github.com/aws/aws-sdk-go-v2) | `1.33.5` | `1.33.6` | | [github.com/aws/smithy-go](https://github.com/aws/smithy-go) | `1.28.1` | `1.28.2` | | [github.com/kaptinlin/jsonschema](https://github.com/kaptinlin/jsonschema) | `0.9.9` | `0.9.10` | | [google.golang.org/genai](https://github.com/googleapis/go-genai) | `1.70.0` | `1.71.0` | Updates `cloud.google.com/go/auth` from 0.23.2 to 0.24.0 - [Release notes](https://github.com/googleapis/google-cloud-go/releases) - [Changelog](https://github.com/googleapis/google-cloud-go/blob/main/CHANGES.md) - [Commits](https://github.com/googleapis/google-cloud-go/compare/auth/v0.23.2...v0.24.0) Updates `github.com/anthropics/anthropic-sdk-go` from 1.68.0 to 1.75.0 - [Release notes](https://github.com/anthropics/anthropic-sdk-go/releases) - [Changelog](https://github.com/anthropics/anthropic-sdk-go/blob/main/CHANGELOG.md) - [Commits](https://github.com/anthropics/anthropic-sdk-go/compare/v1.68.0...v1.75.0) Updates `github.com/aws/aws-sdk-go-v2` from 1.47.0 to 1.47.1 - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/v1.47.0...v1.47.1) Updates `github.com/aws/aws-sdk-go-v2/config` from 1.33.5 to 1.33.6 - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/config/v1.33.5...config/v1.33.6) Updates `github.com/aws/smithy-go` from 1.28.1 to 1.28.2 - [Release notes](https://github.com/aws/smithy-go/releases) - [Changelog](https://github.com/aws/smithy-go/blob/main/CHANGELOG.md) - [Commits](https://github.com/aws/smithy-go/compare/v1.28.1...v1.28.2) Updates `github.com/kaptinlin/jsonschema` from 0.9.9 to 0.9.10 - [Release notes](https://github.com/kaptinlin/jsonschema/releases) - [Commits](https://github.com/kaptinlin/jsonschema/compare/v0.9.9...v0.9.10) Updates `google.golang.org/genai` from 1.70.0 to 1.71.0 - [Release notes](https://github.com/googleapis/go-genai/releases) - [Changelog](https://github.com/googleapis/go-genai/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/go-genai/compare/v1.70.0...v1.71.0) --- updated-dependencies: - dependency-name: cloud.google.com/go/auth dependency-version: 0.24.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: all - dependency-name: github.com/anthropics/anthropic-sdk-go dependency-version: 1.75.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: all - dependency-name: github.com/aws/aws-sdk-go-v2 dependency-version: 1.47.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all - dependency-name: github.com/aws/aws-sdk-go-v2/config dependency-version: 1.33.6 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all - dependency-name: github.com/aws/smithy-go dependency-version: 1.28.2 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all - dependency-name: github.com/kaptinlin/jsonschema dependency-version: 0.9.10 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all - dependency-name: google.golang.org/genai dependency-version: 1.71.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: all ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 35 +++++++++++++++-------------- go.sum | 70 ++++++++++++++++++++++++++++++---------------------------- 2 files changed, 54 insertions(+), 51 deletions(-) diff --git a/go.mod b/go.mod index 3dccb0c44..493dded2a 100644 --- a/go.mod +++ b/go.mod @@ -4,12 +4,12 @@ go 1.27.0 require ( charm.land/x/vcr v0.1.1 - cloud.google.com/go/auth v0.23.2 - github.com/anthropics/anthropic-sdk-go v1.68.0 + cloud.google.com/go/auth v0.24.0 + github.com/anthropics/anthropic-sdk-go v1.75.0 github.com/ardanlabs/kronk v1.32.7 - github.com/aws/aws-sdk-go-v2 v1.47.0 - github.com/aws/aws-sdk-go-v2/config v1.33.5 - github.com/aws/smithy-go v1.28.1 + github.com/aws/aws-sdk-go-v2 v1.47.1 + github.com/aws/aws-sdk-go-v2/config v1.33.6 + github.com/aws/smithy-go v1.28.2 github.com/charmbracelet/openai-go v0.0.0-20260921175203-216db9e71b83 github.com/charmbracelet/x/exp/slice v0.1.0 github.com/charmbracelet/x/exp/strings v0.1.0 @@ -17,11 +17,11 @@ require ( github.com/go-viper/mapstructure/v2 v2.5.0 github.com/google/uuid v1.6.0 github.com/joho/godotenv v1.5.1 - github.com/kaptinlin/jsonschema v0.9.9 + github.com/kaptinlin/jsonschema v0.9.10 github.com/stretchr/testify v1.12.1 golang.org/x/net v0.59.0 golang.org/x/oauth2 v0.37.0 - google.golang.org/genai v1.70.0 + google.golang.org/genai v1.71.0 ) require ( @@ -37,20 +37,20 @@ require ( github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.62.0 // indirect github.com/ardanlabs/jinja v1.6.0 // indirect github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.20 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.20.5 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.20.0 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.5.3 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.8.3 // indirect - github.com/aws/aws-sdk-go-v2/internal/v4a v1.5.3 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.20.6 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.20.1 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.5.4 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.8.4 // indirect + github.com/aws/aws-sdk-go-v2/internal/v4a v1.5.4 // indirect github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.19 // indirect github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.11.3 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.14.3 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.14.4 // indirect github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.20.3 // indirect github.com/aws/aws-sdk-go-v2/service/s3 v1.113.1 // indirect - github.com/aws/aws-sdk-go-v2/service/signin v1.10.0 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.38.0 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.43.0 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.51.0 // indirect + github.com/aws/aws-sdk-go-v2/service/signin v1.10.1 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.38.1 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.43.1 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.51.1 // indirect github.com/bahlo/generic-list-go v0.2.0 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d // indirect @@ -97,6 +97,7 @@ require ( github.com/tidwall/pretty v1.2.1 // indirect github.com/tidwall/sjson v1.2.5 // indirect github.com/ulikunitz/xz v0.5.16 // indirect + github.com/yosida95/uritemplate/v3 v3.0.2 // indirect go.opentelemetry.io/auto/sdk v1.2.1 // indirect go.opentelemetry.io/contrib/detectors/gcp v1.46.0 // indirect go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.71.0 // indirect diff --git a/go.sum b/go.sum index 8a9a698d7..5d9e6eba1 100644 --- a/go.sum +++ b/go.sum @@ -4,8 +4,8 @@ charm.land/x/vcr v0.1.1 h1:PXCFMUG0rPtyk35rhfzYCJEduOzWXCIbrXTFq4OF/9Q= charm.land/x/vcr v0.1.1/go.mod h1:eByq2gqzWvcct/8XE2XO5KznoWEBiXH56+y2gphbltM= cloud.google.com/go v0.123.0 h1:2NAUJwPR47q+E35uaJeYoNhuNEM9kM8SjgRgdeOJUSE= cloud.google.com/go v0.123.0/go.mod h1:xBoMV08QcqUGuPW65Qfm1o9Y4zKZBpGS+7bImXLTAZU= -cloud.google.com/go/auth v0.23.2 h1:pxSCpfiji41hpzpPdMCftEUCezpgpqmmDdYiAjCKXxo= -cloud.google.com/go/auth v0.23.2/go.mod h1:4DhBRcqvtljQN3dJ57qtqbib5ZGCYE5f2crfiiC2EM0= +cloud.google.com/go/auth v0.24.0 h1:UYMbF8otPZnLAkNJ5/LYQYOq0ARcJS1P4JqTeMKbCYU= +cloud.google.com/go/auth v0.24.0/go.mod h1:IFG/AMA1VWfuTrdbieEsB2GcpJyJV/phGAvogkOoPR4= cloud.google.com/go/auth/oauth2adapt v0.2.8 h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIiLpZnkHRbnc= cloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c= cloud.google.com/go/compute/metadata v0.9.0 h1:pDUj4QMoPejqq20dK0Pg2N4yG9zIkYGdBtwLoEkH9Zs= @@ -30,48 +30,48 @@ github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0 github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.62.0/go.mod h1:ifhe5teRNcbxg9p353DhOkOgczzL/IBLYFqT1cm1zpM= github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.62.0 h1:aPMa5qZU9dp4fU34o+jQgVIPFIOi20oxYg8TLigmZLg= github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.62.0/go.mod h1:sg6Wqbl0BKKZ5zKnQj2q0qic/3ziF894SCx1LpbX37Y= -github.com/anthropics/anthropic-sdk-go v1.68.0 h1:FikM/c545Fw+6lp0iQ48hnfn1wK4SxBjkYoGrGMwMhY= -github.com/anthropics/anthropic-sdk-go v1.68.0/go.mod h1:3EfIfmFqxH6rbiLcIP4tPFyXL/IHakx2wDG4OU+TIEI= +github.com/anthropics/anthropic-sdk-go v1.75.0 h1:2oajsgiYwI0Hc8E6K9GttVe6CLwZlfhdxaqFqKVUnvA= +github.com/anthropics/anthropic-sdk-go v1.75.0/go.mod h1:x+lPk/cCl48uRegeP0hlYYBN1b7bEBTveInIMgLicnY= github.com/ardanlabs/jinja v1.6.0 h1:CbqS/dxYM9qrmlBed1GsN64/tRY6SoWQWc5Sc+aw3iI= github.com/ardanlabs/jinja v1.6.0/go.mod h1:aXXzlJfjA+T3XNKA/YT5ZtDq2VJxt5a5siZ8cl9B35Q= github.com/ardanlabs/kronk v1.32.7 h1:JUKLyI11gkivAmhHJZ6VRYVfN7ZgljYr7+sj2BUaqDw= github.com/ardanlabs/kronk v1.32.7/go.mod h1:5NYTsOG2BjDQanW45o6mxVprKCkLzAlKXhXl/8zxh2g= -github.com/aws/aws-sdk-go-v2 v1.47.0 h1:0jsHallhJCeaU0Ko48c/3FK1ctOQ7NpzggxriJOQ8MQ= -github.com/aws/aws-sdk-go-v2 v1.47.0/go.mod h1:bttEH6JqnUL8LepvDVfdrds/fZ5bCIxzpe3abyUrhDU= +github.com/aws/aws-sdk-go-v2 v1.47.1 h1:uOIZnp4PK3ZhKI0dNrJrhTEsLxbpXHTAJlwoS1pvAtw= +github.com/aws/aws-sdk-go-v2 v1.47.1/go.mod h1:bttEH6JqnUL8LepvDVfdrds/fZ5bCIxzpe3abyUrhDU= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.20 h1:GPRlPwz40I2B2VrBEASOA3Bi77NyeqejNLkifosX0rs= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.20/go.mod h1:g7PNzKcsOKWb4fkSRBA7BZVAS6Y8IcxzN+nRohhQ1Q8= -github.com/aws/aws-sdk-go-v2/config v1.33.5 h1:UA1dmokBFOLFoOyVBhO6HjM6edy0MIk5AZSkJVcksQw= -github.com/aws/aws-sdk-go-v2/config v1.33.5/go.mod h1:Dop8axzz0xx38GExIYWXdeyc8QQ7Cr+nPsxpD/LYy4U= -github.com/aws/aws-sdk-go-v2/credentials v1.20.5 h1:wklUVvHMc9xTQ3rcp49/ISpiMnhbCicJcA6n6S8m7J8= -github.com/aws/aws-sdk-go-v2/credentials v1.20.5/go.mod h1:fyEdrn6ccLFOkoK84j5bQyGTxp9zPt5l2XMhxf4DVZs= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.20.0 h1:AM4hHjww+PSFtt6E+UrBrPlZkWsePCLEt9AjkfQX+yM= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.20.0/go.mod h1:3x/yXezeQjpOvBb4jEMxrS8SXvpdvJ5abv6l5c1gWM8= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.5.3 h1:Hp/VgjP0BysR3OgLlR057Vz2LcbbVnoWeJ+3qWiS/fY= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.5.3/go.mod h1:nwGV5qw7F1IZPgxCvA/ph8N2TAuz+BkRG/bXn808qMA= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.8.3 h1:MUaM4f+kj1ZIBPZfUS8cxP1GKXXZtHJjAthy93AN7SM= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.8.3/go.mod h1:6YmVmEVRI5ZZzRjCSsb9SryKH0hAlMRdgA7kG9aDvBU= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.5.3 h1:fuSCw4Z2qfRCztMPO3GXJNSiEp6Wee+WOLwrHHUMy9c= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.5.3/go.mod h1:6SxcHheD1pPR5+kWm1wGvjlL/YqUsh267sAfEmN4K7A= +github.com/aws/aws-sdk-go-v2/config v1.33.6 h1:MBjkSTLczek/UgiK+EYPIoRTqE7gP8vtW3OFbFo7Nug= +github.com/aws/aws-sdk-go-v2/config v1.33.6/go.mod h1:grRAFzdAZJrwcbasJRg2MPvIrVjtlfXllHssN6+E1JE= +github.com/aws/aws-sdk-go-v2/credentials v1.20.6 h1:NpAFXCU7NzXNkdGK3zQTtsRJ+3v9tZQV0xcdRw8uBdw= +github.com/aws/aws-sdk-go-v2/credentials v1.20.6/go.mod h1:mcZCoiPnyMvP8VMNbygNX5lLqSlkYJIMPODylQMurOk= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.20.1 h1:8gALAAmacnIXh+z6VkdDanv4/IkG5APdg4DZLDTmLog= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.20.1/go.mod h1:Z7IJhJU+poOdJjUR2wpyY21ossQ1XS/R3Lk9Msq5kM4= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.5.4 h1:CLq4+8UHCI+ZZYl/EuJxXovaIVN2xeeT8JV+dsApQ5E= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.5.4/go.mod h1:Wv4q5sAM04xAMkoOedxLx2inVf6K5FdxYp+A61L+q/0= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.8.4 h1:dD4MR81I7YkpEBRk6UP9rocC2QnT3qVuXwzlYTtfGEs= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.8.4/go.mod h1:EcXV1kAFd5XwSkDHlj94gnF3q5CkJyYiIJfH8N0VmrE= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.5.4 h1:7Wo47d/xn/7KttCSBd8EGYeZ7ULRFRkUHr6vkZPBzVQ= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.5.4/go.mod h1:tDB2IVC1xC3vX8o+6uRlzhTxP3g1b77CZXFX/oD2FnQ= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.19 h1:bAdDl/HkGCcGPoe25ToSHEw23VIxt6CT5fLcg111BKg= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.19/go.mod h1:KaUzbLxv4CeSxh6ZCl9B4m7CuFenS8kUEaDs+f/DQr4= github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.11.3 h1:BHKCSX4QXERe8So8rbWqaM7owqOmDJxATXgJwGng22A= github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.11.3/go.mod h1:GqWeeKfYfezihA2KfFL9l7ohEdZWe1tuFWh3GfyNSnE= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.14.3 h1:bON1rJf67TSTDCKg816AAIE4xSTtoo9tl0XRkO72R+I= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.14.3/go.mod h1:c5BBpjJcQXpfeq9iASyVKA3T6vX6B6LEXY4mL/gklDY= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.14.4 h1:29SvnfGhXjTl8ONxFwbj2rs6lbhiFXD2CgFQmbT/bXY= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.14.4/go.mod h1:wm04I5DMuNVvZHFe/dHnUxincvNbbK7AiNBbYsQivek= github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.20.3 h1:L8vIOxylma91TcR96NFTEC07G3JDwSl+CvK2b+IODms= github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.20.3/go.mod h1:fmPIZQzTExYuBNWFyi1P7IoDjvskgphXqK1yObMzusM= github.com/aws/aws-sdk-go-v2/service/s3 v1.113.1 h1:cFHmwLxZPvtoAlo79MboURL2+7b0TMHycnrcf5VZNXk= github.com/aws/aws-sdk-go-v2/service/s3 v1.113.1/go.mod h1:/uA+2Qj4jd5qBWagVC1AyzzDFXVK997E7U04w7Kw0wI= -github.com/aws/aws-sdk-go-v2/service/signin v1.10.0 h1:ZD5qFpWcaOKdTuhBi431pIDkCgrMkMlMT6jlpSPoIRI= -github.com/aws/aws-sdk-go-v2/service/signin v1.10.0/go.mod h1:8Nuuf+tR346PjJ3MvZPh9pekbLiLQFWJhzMXfwy7alA= -github.com/aws/aws-sdk-go-v2/service/sso v1.38.0 h1:JGeeBcMlhg1xtOXYpeCaTQBZObtXMPQCUqBcmr65NRA= -github.com/aws/aws-sdk-go-v2/service/sso v1.38.0/go.mod h1:XwteswG9EOMRFm73UT0t+MbTwyLxMrEXkU6e+v92Lzo= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.43.0 h1:obhahQXDEdVEv8y5bTKXR30LVaxYe1kyYM0L7l2Iq+k= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.43.0/go.mod h1:6twZZ/aXHNy1vXUO8koUbp++MYzMASkOgEBdkbJYmO0= -github.com/aws/aws-sdk-go-v2/service/sts v1.51.0 h1:Zpnqa6XtrNzXZnwbdCqHOXpXhMsa01ql/pcRQ1sb4hk= -github.com/aws/aws-sdk-go-v2/service/sts v1.51.0/go.mod h1:/8JRcdTt//hG0Q4BTmGbuOplT7ABe+5rdtqUHqXvYIM= -github.com/aws/smithy-go v1.28.1 h1:R/nXH00c8qcfCzQVELtRw+eLQWtzv+VAIEFJ1/xxXlQ= -github.com/aws/smithy-go v1.28.1/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc= +github.com/aws/aws-sdk-go-v2/service/signin v1.10.1 h1:DzCCWLzcIRQ77F3DEUljud7bEjTgFOIKXP52NmVRyhU= +github.com/aws/aws-sdk-go-v2/service/signin v1.10.1/go.mod h1:xpo/geVldu8payT375WekctUzopG/hBU7miiqItMUlw= +github.com/aws/aws-sdk-go-v2/service/sso v1.38.1 h1:Umtl/0YZhng4xndfW3lKJrYYP7NLEjI6bGXVomwLcs0= +github.com/aws/aws-sdk-go-v2/service/sso v1.38.1/go.mod h1:rRD/dnm7q0HYE/I5TMaPgkWyyUGLcwuxHLABsLnQ3e0= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.43.1 h1:orIWdNiLgzrhu/11RcPPKO/SBzUUymbUQuZbSPImghg= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.43.1/go.mod h1:skwM/xsbR/1ReUTesv9BhpJp1VjajR7DWQnuVLwiXsQ= +github.com/aws/aws-sdk-go-v2/service/sts v1.51.1 h1:0HOqZXRvMytH6bFHVIc0oJX07sZjfhz0zXtjs6gdE8s= +github.com/aws/aws-sdk-go-v2/service/sts v1.51.1/go.mod h1:26zA0GhDrLo+yiLI2yXWxqB1PdsShfLikoI7GOEgugM= +github.com/aws/smithy-go v1.28.2 h1:myhcykQcatTul2B/zITjDk203G7t0awUAs1hVry5Bvg= +github.com/aws/smithy-go v1.28.2/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc= github.com/bahlo/generic-list-go v0.2.0 h1:5sz/EEAK+ls5wF+NeqDpk5+iNdMDXrh3z3nPnH1Wvgk= github.com/bahlo/generic-list-go v0.2.0/go.mod h1:2KvAjgMlE5NNynlg/5iLrrCCZ2+5xWbdbCW3pNTGyYg= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= @@ -157,8 +157,8 @@ github.com/jupiterrider/ffi v0.7.0 h1:RKsl6Ascal+3kyAqR5Qcbp83LceQMLc1VZbPfHWoNz github.com/jupiterrider/ffi v0.7.0/go.mod h1:9dauhpOfNqrqk28fxuu0kkdeFtT9Qr4vbfigiuIXN7c= github.com/kaptinlin/jsonpointer v0.4.28 h1:PyxOfdml9PGpxQz+JnNLGsyzQ+Rnm+OVNTGcgbVLqgg= github.com/kaptinlin/jsonpointer v0.4.28/go.mod h1:JzeIDw1+60bryzOFea9P3zjKg8pfJHd+UIA/zfZ70x8= -github.com/kaptinlin/jsonschema v0.9.9 h1:1N00sHfrZcBwcHgI646PuIf1VaODHPsqRnNi0OY2ERw= -github.com/kaptinlin/jsonschema v0.9.9/go.mod h1:egi7QzDHFN/avPEqQgyGgXCcmC0cl/KxS2ePcHHRcOs= +github.com/kaptinlin/jsonschema v0.9.10 h1:dnMgwshay3YVUjFEHn6Bnf5oZ3LE1iQAL4iB2vSmviM= +github.com/kaptinlin/jsonschema v0.9.10/go.mod h1:ZgmK1hBhK8zmScMktiE+DRr3U3POBHupO4TvnFntel0= github.com/klauspost/compress v1.20.0 h1:a3C1ke2ohxFymNlb2HWAHjDeKCI90scRskErZkR0ezA= github.com/klauspost/compress v1.20.0/go.mod h1:LUdAzn7YLVvxLpc7y3V1m40wESHTgc1422pwwBSKYuI= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= @@ -195,6 +195,8 @@ github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY= github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28= github.com/ulikunitz/xz v0.5.16 h1:ld6NyySjx5lowVKwJvMRLnW5nxKX/xnpSiFYZ/Lxur0= github.com/ulikunitz/xz v0.5.16/go.mod h1:H9Rt/W6/Qj27PGauhQc6nfCDy7vHpzsOThBSaYDoEhw= +github.com/yosida95/uritemplate/v3 v3.0.2 h1:Ed3Oyj9yrmi9087+NczuL5BwkIc4wvTb5zIM+UJPGz4= +github.com/yosida95/uritemplate/v3 v3.0.2/go.mod h1:ILOh0sOhIJR3+L/8afwt/kE++YT040gmv5BQTMR2HP4= go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= go.opentelemetry.io/contrib/detectors/gcp v1.46.0 h1:PI8dGkqDaQkwJ8kOopqMhDTbrnK3UIeG/RCHH4HErbo= @@ -251,8 +253,8 @@ gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4= gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E= google.golang.org/api v0.298.0 h1:YW18RkHBMZBA1ergX0m4biagzgbiPTb2uTsRsDPWNRY= google.golang.org/api v0.298.0/go.mod h1:02qB8+Ox1ZFzcaKFMguy1nQLJmSIyvV6Ff4txJEXtl4= -google.golang.org/genai v1.70.0 h1:V9oYOBvTDYbmeklOHjvxGeeLau71WiS2CWKrktQtDok= -google.golang.org/genai v1.70.0/go.mod h1:mDdPDFXo1Ats7f1WXVyZgWb/CkMzFWTWJruIMy7hGIU= +google.golang.org/genai v1.71.0 h1:Wfo9n0uSzMhZH7d+rP7QxxSWELEDSD4z6O8W/C9s3oM= +google.golang.org/genai v1.71.0/go.mod h1:mDdPDFXo1Ats7f1WXVyZgWb/CkMzFWTWJruIMy7hGIU= google.golang.org/genproto v0.0.0-20260911204522-f61a6ca850bd h1:s/EXdxMDrmT++u0VepJKO4U6dzOPJVRdHKmrazC1Qxg= google.golang.org/genproto v0.0.0-20260911204522-f61a6ca850bd/go.mod h1:JfZ1Hyx5mAJgX/ip0vEicmPvzE6rIrbacB7rHMfjD7Q= google.golang.org/genproto/googleapis/api v0.0.0-20260911204522-f61a6ca850bd h1:jgCQeWccunvocKNK2RjhQHNiSjSeMMuBpQ/5pbP+2lA= From d272c40391c5f87aa241c5b82014f83bdc48778a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 1 Oct 2026 12:04:35 -0300 Subject: [PATCH 140/156] chore(deps): bump github/issue-labeler from 3.4 to 3.5 in the all group (#403) Bumps the all group with 1 update: [github/issue-labeler](https://github.com/github/issue-labeler). Updates `github/issue-labeler` from 3.4 to 3.5 - [Release notes](https://github.com/github/issue-labeler/releases) - [Commits](https://github.com/github/issue-labeler/compare/v3.4...v3.5) --- updated-dependencies: - dependency-name: github/issue-labeler dependency-version: '3.5' dependency-type: direct:production update-type: version-update:semver-minor dependency-group: all ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/labeler.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/labeler.yml b/.github/workflows/labeler.yml index 52935102d..9b6cef46e 100644 --- a/.github/workflows/labeler.yml +++ b/.github/workflows/labeler.yml @@ -21,7 +21,7 @@ jobs: triage: runs-on: ubuntu-latest steps: - - uses: github/issue-labeler@v3.4 + - uses: github/issue-labeler@v3.5 with: configuration-path: .github/labeler.yml enable-versioned-regex: 0 From b0fadc9ae2e7da81a5d0262563d3ced9b594bd75 Mon Sep 17 00:00:00 2001 From: Kieran Klukas Date: Tue, 6 Oct 2026 19:16:07 -0400 Subject: [PATCH 141/156] fix: stop matching GOAWAY by a deprecated type (#415) --- errors.go | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/errors.go b/errors.go index c05620a71..d8ec6aa9f 100644 --- a/errors.go +++ b/errors.go @@ -155,7 +155,7 @@ var http2TransportErrorFragments = []string{ // detail on GOAWAY would misread as the "; CODE" of a stream error. var http2ConnectionLostMessages = []string{ "http2: client connection lost", // health-check ping went unanswered - "http2: server sent GOAWAY and closed the connection", // stdlib's GoAwayError + "http2: server sent GOAWAY and closed the connection", // GoAwayError, from either http2 copy } // matchConnectionLost returns the entry of http2ConnectionLostMessages that @@ -175,9 +175,11 @@ func matchConnectionLost(msg string) (string, bool) { // errors, and GOAWAY frames, which originate from the transport rather // than the application. // -// x/net/http2 error types are matched by type. The standard library's copy -// lives in an internal package, so its equivalents are matched by message -// instead. +// Stream and connection errors are matched by type against x/net/http2. +// GOAWAY is matched by message instead: x/net deprecated GoAwayError +// without offering a replacement, and the standard library's copy of the +// package is internal, so neither one's type can be named here for long. +// Both spell the failure the same way, so one fragment covers them. func IsTransportError(err error) bool { if err == nil { return false @@ -185,11 +187,8 @@ func IsTransportError(err error) bool { var ( streamErr http2.StreamError connErr http2.ConnectionError - goAwayErr http2.GoAwayError ) - if errors.As(err, &streamErr) || - errors.As(err, &connErr) || - errors.As(err, &goAwayErr) { + if errors.As(err, &streamErr) || errors.As(err, &connErr) { return true } // Wrapped errors embed the inner message, so scanning the top-level From 2b80c23a3929409317af09430e1f66197c75815d Mon Sep 17 00:00:00 2001 From: Kieran Klukas Date: Tue, 6 Oct 2026 18:17:29 -0400 Subject: [PATCH 142/156] fix(anthropic): title a mid-stream failure from what failed Anthropic can accept a request, answer 200, open the stream, and only then send an overloaded_error event down it. The SDK turns that event into a typed error carrying the status of the response it arrived in, so the status says the exchange succeeded while the body says the provider could not serve it. The title was derived from that status, so a turn that died of an overloaded provider was titled "ok" above the error contradicting it. Titles now prefer the status, then the payload's type, then a generic fallback. That ordering matters twice over: a 2xx cannot describe a failure at all, and Anthropic's own 529 is absent from the HTTP registry, so it used to read "provider request failed" while overloaded_error sat two fields away. Naming it from the payload is already what wrapStreamError does for the untyped form of the same event, so the two paths no longer disagree about identical failures. ProviderError also carries the provider's own error type now. Every provider parsed it to classify transient failures and then dropped it, which left callers wanting to tell an overload from a rate limit reaching into Message, a string built for people to read rather than for programs to parse. Anthropic, OpenAI and Google all fill it in; a failure recognised by message alone has no type to carry, and the field says so. The tests drive real streams and real rejected requests rather than hand-building SDK errors: the status on a mid-stream event and the fields behind an error type are the SDK's behaviour, not ours, and a hand-built error would assume the very thing worth checking. --- errors.go | 12 ++ providers/anthropic/error.go | 24 +++- providers/anthropic/error_test.go | 196 ++++++++++++++++++++++++++++++ providers/google/error.go | 1 + providers/google/error_test.go | 21 ++++ providers/openai/error.go | 2 + providers/openai/error_test.go | 85 +++++++++++++ 7 files changed, 340 insertions(+), 1 deletion(-) diff --git a/errors.go b/errors.go index d8ec6aa9f..62104fc01 100644 --- a/errors.go +++ b/errors.go @@ -57,6 +57,18 @@ type ProviderError struct { // events ride inside an already-successful 200 response, so the status // code alone cannot signal that a retry may succeed. TransientError bool + + // ErrorType is the provider's own name for the failure, e.g. + // "overloaded_error", "rate_limit_exceeded", "RESOURCE_EXHAUSTED". + // Providers already parse it to classify transient failures, so carrying + // it spares callers from reading it back out of Message, which is + // formatted for people rather than for parsing. + // + // Empty when the response named no type, and always empty for a failure + // a provider recognises by message alone rather than from a classified + // payload. Treat it as a hint worth acting on when present rather than a + // field every error carries. + ErrorType string } func (m *ProviderError) Error() string { diff --git a/providers/anthropic/error.go b/providers/anthropic/error.go index 65894c750..98b163b66 100644 --- a/providers/anthropic/error.go +++ b/providers/anthropic/error.go @@ -25,7 +25,7 @@ func toProviderErr(err error) error { var apiErr *anthropic.Error if errors.As(err, &apiErr) { providerErr := &fantasy.ProviderError{ - Title: cmp.Or(fantasy.ErrorTitleForStatusCode(apiErr.StatusCode), "provider request failed"), + Title: apiErrorTitle(apiErr), Message: apiErr.Error(), Cause: apiErr, URL: apiErr.Request.URL.String(), @@ -33,6 +33,7 @@ func toProviderErr(err error) error { RequestBody: apiErr.DumpRequest(true), ResponseHeaders: toHeaderMap(apiErr.Response.Header), ResponseBody: apiErr.DumpResponse(true), + ErrorType: string(apiErr.Type()), TransientError: fantasy.TransientStreamErrorTypes[string(apiErr.Type())], } @@ -58,6 +59,26 @@ func toProviderErr(err error) error { return fantasy.WrapTransportError(err) } +// apiErrorTitle names what the error describes rather than the exchange that +// carried it, preferring the status, then the payload's type, then a generic +// title. A mid-stream SSE event rides inside a response that already went out +// as a 2xx, so titling from that status puts "ok" above a failure, and only +// the payload can name that one. +func apiErrorTitle(apiErr *anthropic.Error) string { + errType := string(apiErr.Type()) + if apiErr.StatusCode >= http.StatusOK && apiErr.StatusCode < http.StatusMultipleChoices { + return streamErrorTitle(errType) + } + // Anthropic answers an overload with 529, which the HTTP registry does + // not name, so a status-derived title comes out empty and the payload's + // type is the only thing left that says what happened. + statusTitle := fantasy.ErrorTitleForStatusCode(apiErr.StatusCode) + if statusTitle == "" && errType != "" { + return streamErrorTitle(errType) + } + return cmp.Or(statusTitle, "provider request failed") +} + // streamErrorPrefix is the message prefix the Anthropic SDK uses for a // mid-stream `error` event. The SDK reports it via fmt.Errorf with no // exported type, so we match the prefix and parse the payload ourselves. @@ -99,6 +120,7 @@ func wrapStreamError(err error) *fantasy.ProviderError { Message: cmp.Or(message, payload), Cause: err, ResponseBody: []byte(payload), + ErrorType: errType, TransientError: fantasy.TransientStreamErrorTypes[errType], } } diff --git a/providers/anthropic/error_test.go b/providers/anthropic/error_test.go index 02a897bd5..ca76486fb 100644 --- a/providers/anthropic/error_test.go +++ b/providers/anthropic/error_test.go @@ -1,12 +1,15 @@ package anthropic import ( + "context" "errors" "fmt" "io" + "net/http" "testing" "charm.land/fantasy" + "github.com/anthropics/anthropic-sdk-go" ) func TestToProviderErr_WrapsUnexpectedEOF(t *testing.T) { @@ -174,3 +177,196 @@ func TestToProviderErr_StreamErrorWrappedByOuterError(t *testing.T) { t.Error("a wrapped mid-stream overload must still be retryable") } } + +// The same overload, arriving the way Anthropic actually sends it. +// +// Anthropic accepts the request and answers 200, opens the stream, and only +// then sends an overloaded_error event down it. The SDK turns that event into +// a typed error carrying the status of the response it arrived in, so the +// status says the exchange succeeded while the body says the provider could +// not serve it. Titling from the status put "ok" above the error. +// +// Driving a real stream rather than hand-building the SDK error is the point: +// the status on a mid-stream event is the SDK's behaviour, not ours, and a +// hand-built error would assume the very thing worth checking. +func TestToProviderErr_TitlesMidStreamOverloadFromThePayload(t *testing.T) { + t.Parallel() + + server, _ := newAnthropicStreamingServer([]string{ + anthropicSSEEvent("message_start", `{"type":"message_start","message":{"id":"msg_1","type":"message","role":"assistant","model":"claude-sonnet-4-20250514","content":[],"stop_reason":null,"usage":{"input_tokens":1,"output_tokens":0}}}`), + anthropicSSEEvent("error", `{"type":"error","error":{"details":null,"type":"overloaded_error","message":"Overloaded"}}`), + }) + defer server.Close() + + provider, err := New(WithAPIKey("test-api-key"), WithBaseURL(server.URL)) + if err != nil { + t.Fatalf("New: %v", err) + } + model, err := provider.LanguageModel(context.Background(), "claude-sonnet-4-20250514") + if err != nil { + t.Fatalf("LanguageModel: %v", err) + } + stream, err := model.Stream(context.Background(), fantasy.Call{Prompt: testPrompt()}) + if err != nil { + t.Fatalf("Stream: %v", err) + } + + var streamErr error + for _, part := range collectAnthropicStreamParts(stream) { + if part.Type == fantasy.StreamPartTypeError { + streamErr = part.Error + } + } + if streamErr == nil { + t.Fatal("the stream reported no error, so the overload never surfaced") + } + + var providerErr *fantasy.ProviderError + if !errors.As(streamErr, &providerErr) { + t.Fatalf("stream error is %T, want *fantasy.ProviderError", streamErr) + } + + // The premise: the SDK really does carry the response's status here. + if providerErr.StatusCode != http.StatusOK { + t.Fatalf("StatusCode = %d, want 200; a mid-stream event is meant to "+ + "arrive inside a successful response", providerErr.StatusCode) + } + if providerErr.Title != "provider overloaded" { + t.Errorf("Title = %q, want %q", providerErr.Title, "provider overloaded") + } + if !providerErr.TransientError { + t.Error("TransientError must stay set so the step is retried") + } + if !providerErr.IsRetryable() { + t.Error("a mid-stream overload must stay retryable") + } +} + +// The status names the failure where it can, since "too many requests" beats +// anything derived from a body. Where it cannot, the payload's type is the +// next best thing and a generic title is the last resort. +func TestAPIErrorTitle(t *testing.T) { + t.Parallel() + + for _, tc := range []struct { + name string + status int + errType string + want string + }{ + {"a named failure status wins", http.StatusTooManyRequests, "rate_limit_error", "too many requests"}, + {"even over a type that disagrees", http.StatusUnauthorized, "overloaded_error", "unauthorized"}, + {"a named status needs no type", http.StatusInternalServerError, "", "internal server error"}, + + // Anthropic answers an overload with 529, which the HTTP registry + // does not name, so without the payload this reads "provider request + // failed" while the error says overloaded_error two fields away. + {"an unnamed status defers to the type", 529, "overloaded_error", "provider overloaded"}, + {"an unnamed status with no type is generic", 529, "", "provider request failed"}, + + // A 2xx carried a mid-stream failure: its status describes the + // exchange, so only the payload can name the error. + {"a 2xx never titles from the status", http.StatusOK, "overloaded_error", "provider overloaded"}, + {"a 2xx with no type says so", http.StatusOK, "", "provider stream error"}, + + {"no HTTP exchange happened", 0, "", "provider request failed"}, + } { + t.Run(tc.name, func(t *testing.T) { + t.Parallel() + + if got := apiErrorTitle(apiErrorWithType(t, tc.status, tc.errType)); got != tc.want { + t.Errorf("apiErrorTitle(status %d, type %q) = %q, want %q", + tc.status, tc.errType, got, tc.want) + } + }) + } +} + +// apiErrorWithType builds an SDK error carrying errType. The field behind +// Type() is unexported, so it has to arrive the way the SDK fills it: by +// decoding an error envelope. +func apiErrorWithType(t *testing.T, status int, errType string) *anthropic.Error { + t.Helper() + + apiErr := &anthropic.Error{} + if errType != "" { + envelope := fmt.Sprintf(`{"type":"error","error":{"type":%q,"message":"x"}}`, errType) + if err := apiErr.UnmarshalJSON([]byte(envelope)); err != nil { + t.Fatalf("UnmarshalJSON(%s): %v", envelope, err) + } + if got := string(apiErr.Type()); got != errType { + t.Fatalf("the SDK did not take the type: Type() = %q, want %q", got, errType) + } + } + apiErr.StatusCode = status + return apiErr +} + +// ErrorType carries the provider's own name for the failure so callers do not +// have to read it back out of Message, which is formatted for people. +func TestToProviderErr_CarriesTheErrorType(t *testing.T) { + t.Parallel() + + t.Run("typed SDK error", func(t *testing.T) { + t.Parallel() + + server, _ := newAnthropicStreamingServer([]string{ + anthropicSSEEvent("message_start", `{"type":"message_start","message":{"id":"msg_1","type":"message","role":"assistant","model":"claude-sonnet-4-20250514","content":[],"stop_reason":null,"usage":{"input_tokens":1,"output_tokens":0}}}`), + anthropicSSEEvent("error", `{"type":"error","error":{"type":"overloaded_error","message":"Overloaded"}}`), + }) + defer server.Close() + + providerErr := streamProviderError(t, server.URL) + if providerErr.ErrorType != "overloaded_error" { + t.Errorf("ErrorType = %q, want %q", providerErr.ErrorType, "overloaded_error") + } + }) + + t.Run("untyped stream error", func(t *testing.T) { + t.Parallel() + + err := errors.New(streamErrorPrefix + ` {"type":"error","error":{"type":"api_error","message":"Internal"}}`) + + var providerErr *fantasy.ProviderError + if !errors.As(toProviderErr(err), &providerErr) { + t.Fatalf("toProviderErr did not wrap %v as *fantasy.ProviderError", err) + } + if providerErr.ErrorType != "api_error" { + t.Errorf("ErrorType = %q, want %q", providerErr.ErrorType, "api_error") + } + }) +} + +// streamProviderError drives one stream against url and returns the +// ProviderError it reported. +func streamProviderError(t *testing.T, url string) *fantasy.ProviderError { + t.Helper() + + provider, err := New(WithAPIKey("test-api-key"), WithBaseURL(url)) + if err != nil { + t.Fatalf("New: %v", err) + } + model, err := provider.LanguageModel(context.Background(), "claude-sonnet-4-20250514") + if err != nil { + t.Fatalf("LanguageModel: %v", err) + } + stream, err := model.Stream(context.Background(), fantasy.Call{Prompt: testPrompt()}) + if err != nil { + t.Fatalf("Stream: %v", err) + } + + var streamErr error + for _, part := range collectAnthropicStreamParts(stream) { + if part.Type == fantasy.StreamPartTypeError { + streamErr = part.Error + } + } + if streamErr == nil { + t.Fatal("the stream reported no error") + } + var providerErr *fantasy.ProviderError + if !errors.As(streamErr, &providerErr) { + t.Fatalf("stream error is %T, want *fantasy.ProviderError", streamErr) + } + return providerErr +} diff --git a/providers/google/error.go b/providers/google/error.go index 05a17666e..813a35732 100644 --- a/providers/google/error.go +++ b/providers/google/error.go @@ -25,6 +25,7 @@ func toProviderErr(err error) error { Cause: err, StatusCode: apiErr.Code, ResponseBody: []byte(apiErr.Message), + ErrorType: apiErr.Status, } parseContextTooLargeError(apiErr.Message, providerErr) diff --git a/providers/google/error_test.go b/providers/google/error_test.go index 693f35ee2..51ea9e31b 100644 --- a/providers/google/error_test.go +++ b/providers/google/error_test.go @@ -7,6 +7,7 @@ import ( "testing" "charm.land/fantasy" + "google.golang.org/genai" ) func TestToProviderErr_WrapsUnexpectedEOF(t *testing.T) { @@ -61,3 +62,23 @@ func TestToProviderErr_PassesThroughPlainEOF(t *testing.T) { t.Errorf("toProviderErr wrapped io.EOF as ProviderError; should pass through") } } + +// ErrorType carries Google's own name for the failure, so a caller can tell a +// quota refusal from a bad request without matching on prose. +func TestToProviderErr_CarriesTheErrorType(t *testing.T) { + t.Parallel() + + apiErr := genai.APIError{ + Code: 429, + Status: "RESOURCE_EXHAUSTED", + Message: "Resource has been exhausted", + } + + var providerErr *fantasy.ProviderError + if !errors.As(toProviderErr(apiErr), &providerErr) { + t.Fatalf("toProviderErr did not wrap %v as *fantasy.ProviderError", apiErr) + } + if providerErr.ErrorType != "RESOURCE_EXHAUSTED" { + t.Errorf("ErrorType = %q, want %q", providerErr.ErrorType, "RESOURCE_EXHAUSTED") + } +} diff --git a/providers/openai/error.go b/providers/openai/error.go index e7c3d3069..3ad06b5e6 100644 --- a/providers/openai/error.go +++ b/providers/openai/error.go @@ -36,6 +36,7 @@ func toProviderErr(err error) error { RequestBody: apiErr.DumpRequest(true), ResponseHeaders: toHeaderMap(apiErr.Response.Header), ResponseBody: apiErr.DumpResponse(true), + ErrorType: cmp.Or(apiErr.Type, apiErr.Code), } parseContextTooLargeError(message, providerErr) @@ -76,6 +77,7 @@ func toProviderErrFromStreamError(streamErr *ssestream.StreamError) *fantasy.Pro Message: cmp.Or(envelope.Error.Message, streamErr.Message), Cause: streamErr, ResponseBody: streamErr.Event.Data, + ErrorType: errType, TransientError: fantasy.TransientStreamErrorTypes[errType], } } diff --git a/providers/openai/error_test.go b/providers/openai/error_test.go index 57d8aa9ec..2e9f2d9e4 100644 --- a/providers/openai/error_test.go +++ b/providers/openai/error_test.go @@ -1,9 +1,12 @@ package openai import ( + "context" "errors" "fmt" "io" + "net/http" + "net/http/httptest" "testing" "charm.land/fantasy" @@ -167,3 +170,85 @@ func TestToProviderErr_StreamErrorMalformedBodyFallsBackToRawMessage(t *testing. t.Error("unparseable stream error body must not be assumed retryable") } } + +// ErrorType carries the provider's own name for the failure on both paths an +// OpenAI error can take, so a caller does not have to tell them apart. +func TestToProviderErr_CarriesTheErrorType(t *testing.T) { + t.Parallel() + + t.Run("stream error event", func(t *testing.T) { + t.Parallel() + + streamErr := &ssestream.StreamError{ + Event: ssestream.Event{ + Type: "error", + Data: []byte(`{"error":{"message":"Overloaded","type":"server_error"}}`), + }, + } + + var providerErr *fantasy.ProviderError + if !errors.As(toProviderErr(streamErr), &providerErr) { + t.Fatalf("toProviderErr did not wrap %v as *fantasy.ProviderError", streamErr) + } + if providerErr.ErrorType != "server_error" { + t.Errorf("ErrorType = %q, want %q", providerErr.ErrorType, "server_error") + } + }) + + // code stands in when the payload names no type: OpenAI puts the useful + // word in whichever it feels like, e.g. type "tokens" alongside code + // "rate_limit_exceeded". + t.Run("code stands in for a missing type", func(t *testing.T) { + t.Parallel() + + streamErr := &ssestream.StreamError{ + Event: ssestream.Event{ + Type: "error", + Data: []byte(`{"error":{"message":"Rate limited","code":"rate_limit_exceeded"}}`), + }, + } + + var providerErr *fantasy.ProviderError + if !errors.As(toProviderErr(streamErr), &providerErr) { + t.Fatalf("toProviderErr did not wrap %v as *fantasy.ProviderError", streamErr) + } + if providerErr.ErrorType != "rate_limit_exceeded" { + t.Errorf("ErrorType = %q, want %q", providerErr.ErrorType, "rate_limit_exceeded") + } + }) + + // The other path an OpenAI error takes: a rejected request rather than a + // failing stream. A real round trip is what builds the SDK error here, + // since it reads the type off fields only the transport fills in. + t.Run("rejected request", func(t *testing.T) { + t.Parallel() + + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(http.StatusTooManyRequests) + _, _ = w.Write([]byte(`{"error":{"message":"Rate limit reached","type":"tokens","code":"rate_limit_exceeded"}}`)) + })) + defer server.Close() + + provider, err := New(WithAPIKey("test-api-key"), WithBaseURL(server.URL)) + if err != nil { + t.Fatalf("New: %v", err) + } + model, err := provider.LanguageModel(context.Background(), "gpt-4") + if err != nil { + t.Fatalf("LanguageModel: %v", err) + } + _, err = model.Generate(context.Background(), fantasy.Call{Prompt: testPrompt}) + if err == nil { + t.Fatal("the request was meant to be rejected") + } + + var providerErr *fantasy.ProviderError + if !errors.As(err, &providerErr) { + t.Fatalf("error is %T, want *fantasy.ProviderError", err) + } + if providerErr.ErrorType != "tokens" { + t.Errorf("ErrorType = %q, want %q", providerErr.ErrorType, "tokens") + } + }) +} From cef7a845e97d0b4f6a8492a28322dd866c53678d Mon Sep 17 00:00:00 2001 From: Chen Yufeiyang Date: Tue, 13 Oct 2026 21:38:01 +0800 Subject: [PATCH 143/156] fix(openai): keep a content-filter Responses turn from becoming a tool-call turn (#399) mapResponsesFinishReason short-circuited on hasFunctionCall and whitelisted only max_tokens and max_output_tokens, so every other reason - content_filter included - became FinishReasonToolCalls and the switch's own content_filter arm was unreachable whenever a function call was present. A turn the safety filter cut short then looked like a complete tool-call turn. The chat-completions adapter in this package already suppresses the rewrite for length, content_filter and error, because dispatching a partially-serialized call executes truncated input (CHARM-2020), and agent.go skips validate, repair and dispatch for exactly those finish reasons. A terminal reason the upstream sent now always wins; only an unrecognised reason falls back to the tool-call inference. Same class as #392, different adapter. --- .../openai/responses_content_filter_test.go | 114 ++++++++++++++++++ providers/openai/responses_language_model.go | 33 +++-- 2 files changed, 139 insertions(+), 8 deletions(-) create mode 100644 providers/openai/responses_content_filter_test.go diff --git a/providers/openai/responses_content_filter_test.go b/providers/openai/responses_content_filter_test.go new file mode 100644 index 000000000..c44b7e25c --- /dev/null +++ b/providers/openai/responses_content_filter_test.go @@ -0,0 +1,114 @@ +package openai + +import ( + "context" + "testing" + + "charm.land/fantasy" + "github.com/stretchr/testify/require" +) + +// The Responses API documents `incomplete_details.reason` as one of +// "max_output_tokens", "max_messages", "content_filter", "steered". A turn cut +// short by a content filter can carry a partially-serialized function_call, and +// fantasy's agent suppresses dispatch on FinishReasonContentFilter +// (agent.go: `abnormalFinish`). Rewriting that reason into FinishReasonToolCalls +// makes a truncated call look like a complete tool-call turn again. +func TestResponsesGenerate_ContentFilterToolCallsKeepFilterReason(t *testing.T) { + t.Parallel() + + server := newMockServer() + defer server.close() + server.response = map[string]any{ + "id": "resp_filter", + "object": "response", + "model": "gpt-4.1", + "output": []any{ + map[string]any{ + "type": "function_call", + "id": "fc_filter", + "call_id": "call_filter", + "name": "test-tool", + "arguments": `{"value":"trunc`, + "status": "completed", + }, + }, + "status": "incomplete", + "incomplete_details": map[string]any{"reason": "content_filter"}, + "usage": map[string]any{ + "input_tokens": 10, + "output_tokens": 20, + "total_tokens": 30, + }, + } + + model := newResponsesProvider(t, server.server.URL) + + resp, err := model.Generate(context.Background(), fantasy.Call{ + Prompt: testPrompt, + Tools: []fantasy.Tool{fantasy.FunctionTool{ + Name: "test-tool", + InputSchema: map[string]any{ + "type": "object", + "properties": map[string]any{"value": map[string]any{"type": "string"}}, + }, + }}, + }) + require.NoError(t, err) + require.Equal(t, fantasy.FinishReasonContentFilter, resp.FinishReason) + require.NotEmpty(t, resp.Warnings) + require.Contains(t, resp.Warnings[0].Message, "arguments may be truncated") + for _, c := range resp.Content { + require.NotEqual(t, fantasy.ContentTypeToolCall, c.GetType(), "truncated tool call should be suppressed") + } +} + +func TestResponsesStream_ContentFilterToolCallsKeepFilterReason(t *testing.T) { + t.Parallel() + + chunks := []string{ + responsesSSEEvent("response.created", `{"type":"response.created","response":{"id":"resp_filter","status":"in_progress","output":[]}}`), + responsesSSEEvent("response.output_item.added", `{"type":"response.output_item.added","output_index":0,"item":{"type":"function_call","id":"fc_filter","call_id":"call_filter","name":"test-tool","status":"in_progress","arguments":""}}`), + responsesSSEEvent("response.function_call_arguments.delta", `{"type":"response.function_call_arguments.delta","output_index":0,"delta":"{\"value\":\"tr"}`), + responsesSSEEvent("response.output_item.done", `{"type":"response.output_item.done","output_index":0,"item":{"type":"function_call","id":"fc_filter","call_id":"call_filter","name":"test-tool","status":"completed","arguments":"{\"value\":\"tr"}}`), + responsesSSEEvent("response.incomplete", `{"type":"response.incomplete","response":{"id":"resp_filter","status":"incomplete","output":[],"incomplete_details":{"reason":"content_filter"},"usage":{"input_tokens":10,"output_tokens":20,"total_tokens":30}}}`), + } + + sms := newStreamingMockServer() + defer sms.close() + sms.chunks = chunks + + model := newResponsesProvider(t, sms.server.URL) + + stream, err := model.Stream(context.Background(), fantasy.Call{ + Prompt: testPrompt, + Tools: []fantasy.Tool{fantasy.FunctionTool{ + Name: "test-tool", + InputSchema: map[string]any{ + "type": "object", + "properties": map[string]any{"value": map[string]any{"type": "string"}}, + }, + }}, + }) + require.NoError(t, err) + + var parts []fantasy.StreamPart + stream(func(part fantasy.StreamPart) bool { + parts = append(parts, part) + return true + }) + + var finish *fantasy.StreamPart + var hasWarning bool + for i, part := range parts { + if part.Type == fantasy.StreamPartTypeFinish { + finish = &parts[i] + } + if part.Type == fantasy.StreamPartTypeWarnings { + hasWarning = true + } + } + require.NotNil(t, finish) + require.Equal(t, fantasy.FinishReasonContentFilter, finish.FinishReason) + require.True(t, hasWarning, "expected truncation warning") +} diff --git a/providers/openai/responses_language_model.go b/providers/openai/responses_language_model.go index f69d685e7..4445839b8 100644 --- a/providers/openai/responses_language_model.go +++ b/providers/openai/responses_language_model.go @@ -940,11 +940,11 @@ func (o responsesLanguageModel) Generate(ctx context.Context, call fantasy.Call) usage := responsesUsage(*response) finishReason := mapResponsesFinishReason(response.IncompleteDetails.Reason, hasFunctionCall) - truncatedWithToolCalls := hasFunctionCall && finishReason == fantasy.FinishReasonLength + truncatedWithToolCalls := hasFunctionCall && abnormalFinishReason(finishReason) if truncatedWithToolCalls { warnings = append(warnings, fantasy.CallWarning{ Type: fantasy.CallWarningTypeOther, - Message: "tool calls were returned but the model hit the token limit; arguments may be truncated", + Message: "tool calls were returned but the turn ended abnormally (token limit or content filter); arguments may be truncated", }) } else { for _, tc := range pendingFunctionCalls { @@ -965,10 +965,12 @@ func (o responsesLanguageModel) Generate(ctx context.Context, call fantasy.Call) } func mapResponsesFinishReason(reason string, hasFunctionCall bool) fantasy.FinishReason { - if hasFunctionCall && reason != "max_tokens" && reason != "max_output_tokens" { - return fantasy.FinishReasonToolCalls - } - + // A terminal reason the upstream actually sent always wins. Rewriting one + // into a tool-call turn hides a turn that was cut short, and the agent + // then validates, repairs and dispatches truncated arguments + // (CHARM-2020). The chat-completions adapter keeps length, content_filter + // and error for the same reason; only a reason the switch does not + // recognise falls back to the tool-call inference. switch reason { case "": if hasFunctionCall { @@ -980,10 +982,25 @@ func mapResponsesFinishReason(reason string, hasFunctionCall bool) fantasy.Finis case "content_filter": return fantasy.FinishReasonContentFilter default: + if hasFunctionCall { + return fantasy.FinishReasonToolCalls + } return fantasy.FinishReasonOther } } +// abnormalFinishReason reports whether a Responses turn ended abnormally. Such +// a turn can carry function-call arguments that were cut short mid-serialization, +// so the calls must not be dispatched (CHARM-2020). +func abnormalFinishReason(reason fantasy.FinishReason) bool { + switch reason { + case fantasy.FinishReasonLength, fantasy.FinishReasonContentFilter: + return true + default: + return false + } +} + func (o responsesLanguageModel) Stream(ctx context.Context, call fantasy.Call) (fantasy.StreamResponse, error) { capture := responseCapture{} params, warnings, err := o.prepareParams(call) @@ -1309,12 +1326,12 @@ func (o responsesLanguageModel) Stream(ctx context.Context, call fantasy.Call) ( return } - if hasFunctionCall && finishReason == fantasy.FinishReasonLength { + if hasFunctionCall && abnormalFinishReason(finishReason) { yield(fantasy.StreamPart{ Type: fantasy.StreamPartTypeWarnings, Warnings: []fantasy.CallWarning{{ Type: fantasy.CallWarningTypeOther, - Message: "tool calls were returned but the model hit the token limit; arguments may be truncated", + Message: "tool calls were returned but the turn ended abnormally (token limit or content filter); arguments may be truncated", }}, }) } From aa4a219127a0a1d3b0e3f4d7bf0c90b9b8c4b344 Mon Sep 17 00:00:00 2001 From: Chen Yufeiyang Date: Tue, 13 Oct 2026 21:38:31 +0800 Subject: [PATCH 144/156] fix(google): do not report a JSON-mode object stream as stopped (#400) streamObjectWithJSONMode substituted FinishReasonStop whenever no candidate had carried a finishReason, so a stream that closed without one - a socket cut, a proxy truncation, a dropped terminal chunk - finished with err == nil and a partially-typed value that the caller reads as a complete turn. The four other implementations of the same contract already refuse it: Generate and GenerateObject map a missing reason to FinishReasonUnknown, Stream yields a retryable IncompleteStreamError, and the object package emits no invented value. NewIncompleteStreamError's own doc comment names candidate.finishReason among the terminal signals whose absence means the stream was incomplete. --- providers/google/google.go | 14 +- providers/google/object_stream_finish_test.go | 138 ++++++++++++++++++ 2 files changed, 151 insertions(+), 1 deletion(-) create mode 100644 providers/google/object_stream_finish_test.go diff --git a/providers/google/google.go b/providers/google/google.go index be3b72f7e..c96dc0104 100644 --- a/providers/google/google.go +++ b/providers/google/google.go @@ -1142,7 +1142,19 @@ func (g *languageModel) streamObjectWithJSONMode(ctx context.Context, call fanta // Final validation and emit if streamErr == nil && lastParsedObject != nil { - finishReason := cmp.Or(lastFinishReason, fantasy.FinishReasonStop) + if lastFinishReason == "" { + // Truncated stream: no candidate emitted a finishReason + // before close. Reporting it as "stop" would hand the caller + // a cut-short object that looks complete; surface a retryable + // error instead, as Stream does. + yield(fantasy.ObjectStreamPart{ + Type: fantasy.ObjectStreamPartTypeError, + Error: fantasy.NewIncompleteStreamError(), + }) + return + } + + finishReason := lastFinishReason var finalUsage fantasy.Usage if usage != nil { diff --git a/providers/google/object_stream_finish_test.go b/providers/google/object_stream_finish_test.go new file mode 100644 index 000000000..1c7e61562 --- /dev/null +++ b/providers/google/object_stream_finish_test.go @@ -0,0 +1,138 @@ +package google + +import ( + "encoding/json" + "errors" + "net/http" + "net/http/httptest" + "testing" + + "charm.land/fantasy" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +// newJSONModeServer serves a Gemini JSON-mode structured-output stream. The +// candidate carries the schema-shaped text and, when finishReason is non-empty, +// that reason on a trailing chunk. An empty finishReason models an upstream +// that closed before it ever sent candidate.finishReason. +func newJSONModeServer(t *testing.T, finishReason string) *httptest.Server { + t.Helper() + + usage := map[string]any{ + "promptTokenCount": 5, + "candidatesTokenCount": 4, + "totalTokenCount": 9, + } + chunk := func(candidate map[string]any) map[string]any { + return map[string]any{"candidates": []map[string]any{candidate}, "usageMetadata": usage} + } + + return httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { + body := chunk(map[string]any{ + "content": map[string]any{"role": "model", "parts": []map[string]any{ + {"text": `{"answer":"hello"}`}, + }}, + }) + encoded, err := json.Marshal(body) + require.NoError(t, err) + + w.Header().Set("Content-Type", "text/event-stream") + _, _ = w.Write([]byte("data: " + string(encoded) + "\r\n\r\n")) + + if finishReason == "" { + return + } + last, err := json.Marshal(chunk(map[string]any{ + "content": map[string]any{"role": "model", "parts": []map[string]any{}}, + "finishReason": finishReason, + })) + require.NoError(t, err) + _, _ = w.Write([]byte("data: " + string(last) + "\r\n\r\n")) + })) +} + +func objectStreamModel(t *testing.T, baseURL string) fantasy.LanguageModel { + t.Helper() + + p, err := New(WithVertex("test-project", "us-central1"), WithBaseURL(baseURL), WithSkipAuth(true)) + require.NoError(t, err) + model, err := p.LanguageModel(t.Context(), "gemini-2.5-flash") + require.NoError(t, err) + return model +} + +func objectStreamCall() fantasy.ObjectCall { + return fantasy.ObjectCall{ + Prompt: fantasy.Prompt{{ + Role: fantasy.MessageRoleUser, + Content: []fantasy.MessagePart{fantasy.TextPart{Text: "Hi"}}, + }}, + Schema: fantasy.Schema{ + Type: "object", + Properties: map[string]*fantasy.Schema{ + "answer": {Type: "string"}, + }, + Required: []string{"answer"}, + }, + } +} + +// A JSON-mode object stream that closed before any candidate carried a +// finishReason was reported as a clean "stop", so a truncated object looked +// like a completed one and the retry middleware never engaged. The main Stream +// path already surfaces a retryable incomplete-stream error for the same input +// (google.go), and the OpenAI adapter has a regression test for it +// (TestChatCompletionsStreamObject_RequiresFinishReasonBeforeFinish). +func TestStreamObjectWithoutFinishReasonIsIncomplete(t *testing.T) { + t.Parallel() + + server := newJSONModeServer(t, "") + defer server.Close() + + stream, err := objectStreamModel(t, server.URL).StreamObject(t.Context(), objectStreamCall()) + require.NoError(t, err) + + var finishes []fantasy.ObjectStreamPart + var errorParts []fantasy.ObjectStreamPart + for part := range stream { + switch part.Type { + case fantasy.ObjectStreamPartTypeFinish: + finishes = append(finishes, part) + case fantasy.ObjectStreamPartTypeError: + errorParts = append(errorParts, part) + } + } + + require.Len(t, errorParts, 1, "a stream with no candidate.finishReason must report an error") + assert.Empty(t, finishes, "a stream with no candidate.finishReason must not report finish") + + var providerErr *fantasy.ProviderError + require.True(t, errors.As(errorParts[0].Error, &providerErr), + "want a *fantasy.ProviderError, got %T", errorParts[0].Error) + assert.True(t, providerErr.IsRetryable(), "the incomplete-stream error must be retryable") +} + +// A stream that does carry a terminal reason must still finish normally. +func TestStreamObjectWithFinishReasonFinishes(t *testing.T) { + t.Parallel() + + server := newJSONModeServer(t, "STOP") + defer server.Close() + + stream, err := objectStreamModel(t, server.URL).StreamObject(t.Context(), objectStreamCall()) + require.NoError(t, err) + + var finishes []fantasy.ObjectStreamPart + for part := range stream { + switch part.Type { + case fantasy.ObjectStreamPartTypeFinish: + finishes = append(finishes, part) + case fantasy.ObjectStreamPartTypeError: + t.Fatalf("unexpected error part: %v", part.Error) + } + } + + require.Len(t, finishes, 1) + assert.Equal(t, fantasy.FinishReasonStop, finishes[0].FinishReason) +} From 794d6d29635df4ac41066ce8def0121567d00701 Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Tue, 13 Oct 2026 10:45:50 -0300 Subject: [PATCH 145/156] v0.45.3 --- version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.txt b/version.txt index 9f3a7d749..460e2afaa 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -0.45.2 +0.45.3 From 2102231a3b18b672ac15e1cc48c2b04af9396d40 Mon Sep 17 00:00:00 2001 From: Kieran Klukas Date: Tue, 13 Oct 2026 16:26:49 -0400 Subject: [PATCH 146/156] fix(providers): stop losing tool results and cache hints on some providers (#368) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Four OpenAI-compatible providers each carried their own copy of the chat-completions prompt conversion, so a fix landed in one copy and quietly missed the others. Three bugs had accumulated that way: - An image or audio tool result produced no message at all on two of them, leaving the assistant's tool call unanswered and the request rejected by strict backends. - A turn with nothing visible in it was forwarded rather than dropped, and because the message stayed in the conversation the rejection repeated on every later request. - Prompt cache hints for tool results were attached to the wrapper rather than the value that gets sent, so they never reached the wire and every request went out uncached. The rules that were written once per provider are now written once, and a golden-file corpus runs every provider through the same prompts and records their output side by side, so a future divergence between them shows up as a diff rather than as a rejected request. 💘 Generated with Crush Assisted-by: Crush:claude-opus-5 --- .gitattributes | 1 + providers/anthropic/provider_options.go | 22 ++ providers/internal/prompttest/cases.go | 372 ++++++++++++++++++ providers/internal/prompttest/prompt_test.go | 27 ++ providers/internal/prompttest/prompttest.go | 195 +++++++++ .../testdata/assistant_cache_control.json | 31 ++ .../testdata/assistant_empty_is_dropped.json | 17 + .../assistant_reasoning_anthropic.json | 42 ++ .../testdata/assistant_reasoning_only.json | 26 ++ .../assistant_text_and_tool_calls.json | 43 ++ .../testdata/assistant_text_only.json | 15 + .../testdata/system_cache_control.json | 31 ++ .../testdata/system_multiple_text_parts.json | 15 + .../testdata/system_single_text.json | 15 + .../testdata/tool_result_cache_control.json | 51 +++ .../testdata/tool_result_error.json | 25 ++ .../tool_result_media_audio_mpeg.json | 37 ++ .../testdata/tool_result_media_audio_wav.json | 37 ++ .../testdata/tool_result_media_image.json | 36 ++ .../tool_result_media_image_with_text.json | 36 ++ .../tool_result_media_parallel_batch.json | 53 +++ .../tool_result_media_unsupported.json | 27 ++ .../prompttest/testdata/user_audio_wav.json | 19 + .../testdata/user_cache_control.json | 23 ++ .../testdata/user_empty_is_dropped.json | 15 + .../prompttest/testdata/user_pdf.json | 19 + .../testdata/user_text_and_image.json | 22 ++ .../testdata/user_unsupported_media.json | 9 + providers/openai/language_model_hooks.go | 165 +------- providers/openai/tool_messages.go | 203 ++++++++++ providers/openai/tool_run_buffer_test.go | 194 +++++++++ .../openaicompat/language_model_hooks.go | 120 +----- .../openaicompat/tool_result_media_test.go | 138 ------- providers/openrouter/language_model_hooks.go | 85 +--- providers/openrouter/prompt.go | 7 + providers/vercel/language_model_hooks.go | 86 +--- providers/vercel/prompt.go | 7 + .../anthropic/multi_tool.yaml | 4 +- .../anthropic/multi_tool_streaming.yaml | 4 +- .../anthropic/tool.yaml | 4 +- .../anthropic/tool_streaming.yaml | 4 +- .../claude-sonnet-4/multi_tool.yaml | 4 +- .../claude-sonnet-4/multi_tool_streaming.yaml | 4 +- .../claude-sonnet-4/tool.yaml | 4 +- .../claude-sonnet-4/tool_streaming.yaml | 4 +- 45 files changed, 1752 insertions(+), 546 deletions(-) create mode 100644 providers/internal/prompttest/cases.go create mode 100644 providers/internal/prompttest/prompt_test.go create mode 100644 providers/internal/prompttest/prompttest.go create mode 100644 providers/internal/prompttest/testdata/assistant_cache_control.json create mode 100644 providers/internal/prompttest/testdata/assistant_empty_is_dropped.json create mode 100644 providers/internal/prompttest/testdata/assistant_reasoning_anthropic.json create mode 100644 providers/internal/prompttest/testdata/assistant_reasoning_only.json create mode 100644 providers/internal/prompttest/testdata/assistant_text_and_tool_calls.json create mode 100644 providers/internal/prompttest/testdata/assistant_text_only.json create mode 100644 providers/internal/prompttest/testdata/system_cache_control.json create mode 100644 providers/internal/prompttest/testdata/system_multiple_text_parts.json create mode 100644 providers/internal/prompttest/testdata/system_single_text.json create mode 100644 providers/internal/prompttest/testdata/tool_result_cache_control.json create mode 100644 providers/internal/prompttest/testdata/tool_result_error.json create mode 100644 providers/internal/prompttest/testdata/tool_result_media_audio_mpeg.json create mode 100644 providers/internal/prompttest/testdata/tool_result_media_audio_wav.json create mode 100644 providers/internal/prompttest/testdata/tool_result_media_image.json create mode 100644 providers/internal/prompttest/testdata/tool_result_media_image_with_text.json create mode 100644 providers/internal/prompttest/testdata/tool_result_media_parallel_batch.json create mode 100644 providers/internal/prompttest/testdata/tool_result_media_unsupported.json create mode 100644 providers/internal/prompttest/testdata/user_audio_wav.json create mode 100644 providers/internal/prompttest/testdata/user_cache_control.json create mode 100644 providers/internal/prompttest/testdata/user_empty_is_dropped.json create mode 100644 providers/internal/prompttest/testdata/user_pdf.json create mode 100644 providers/internal/prompttest/testdata/user_text_and_image.json create mode 100644 providers/internal/prompttest/testdata/user_unsupported_media.json create mode 100644 providers/openai/tool_messages.go create mode 100644 providers/openai/tool_run_buffer_test.go create mode 100644 providers/openrouter/prompt.go create mode 100644 providers/vercel/prompt.go diff --git a/.gitattributes b/.gitattributes index 62404f9d5..87c36d570 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1 +1,2 @@ providertests/testdata/**/*.yaml -diff linguist-generated=true +providers/internal/prompttest/testdata/*.json text eol=lf diff --git a/providers/anthropic/provider_options.go b/providers/anthropic/provider_options.go index 34ad50276..3db8a56c5 100644 --- a/providers/anthropic/provider_options.go +++ b/providers/anthropic/provider_options.go @@ -206,6 +206,28 @@ type CacheControl struct { Type string `json:"type"` } +// CacheType returns the configured cache type, or the empty string when no +// cache control is set, so callers can tag a message without a nil check. +func (c *CacheControl) CacheType() string { + if c == nil { + return "" + } + return c.Type +} + +// ToolResultCacheType returns the prompt-cache hint for content part i of a +// tool message, falling back to the message's own options on the last part. +func ToolResultCacheType(msg fantasy.Message, i int) string { + if i < 0 || i >= len(msg.Content) { + return "" + } + cacheControl := GetCacheControl(msg.Content[i].Options()) + if cacheControl == nil && i == len(msg.Content)-1 { + cacheControl = GetCacheControl(msg.ProviderOptions) + } + return cacheControl.CacheType() +} + // NewProviderOptions creates new provider options for the Anthropic provider. func NewProviderOptions(opts *ProviderOptions) fantasy.ProviderOptions { return fantasy.ProviderOptions{ diff --git a/providers/internal/prompttest/cases.go b/providers/internal/prompttest/cases.go new file mode 100644 index 000000000..8ca5e9a09 --- /dev/null +++ b/providers/internal/prompttest/cases.go @@ -0,0 +1,372 @@ +package prompttest + +import ( + "encoding/base64" + + "charm.land/fantasy" + "charm.land/fantasy/providers/anthropic" +) + +// The corpus: one prompt per rule worth pinning, exercised against every +// chat-completions converter by Golden. + +func cacheControl() fantasy.ProviderOptions { + return fantasy.ProviderOptions{ + anthropic.Name: &anthropic.ProviderCacheControlOptions{ + CacheControl: anthropic.CacheControl{Type: "ephemeral"}, + }, + } +} + +func png() []byte { return []byte{0x89, 0x50, 0x4e, 0x47} } + +func b64(data []byte) string { return base64.StdEncoding.EncodeToString(data) } + +// Cases returns the shared corpus. Every converter should be able to handle +// every case; the point of the corpus is that the cases a converter handles +// badly show up in its golden files rather than going unnoticed. +func Cases() []Case { + return []Case{ + { + Name: "system_single_text", + Model: "gpt-4o", + Prompt: fantasy.Prompt{ + {Role: fantasy.MessageRoleSystem, Content: []fantasy.MessagePart{ + fantasy.TextPart{Text: "you are helpful"}, + }}, + {Role: fantasy.MessageRoleUser, Content: []fantasy.MessagePart{ + fantasy.TextPart{Text: "hello"}, + }}, + }, + }, + { + Name: "system_multiple_text_parts", + Model: "gpt-4o", + Prompt: fantasy.Prompt{ + {Role: fantasy.MessageRoleSystem, Content: []fantasy.MessagePart{ + fantasy.TextPart{Text: "first"}, + fantasy.TextPart{Text: "second"}, + }}, + {Role: fantasy.MessageRoleUser, Content: []fantasy.MessagePart{ + fantasy.TextPart{Text: "hello"}, + }}, + }, + }, + { + Name: "system_cache_control", + Model: "anthropic/claude-sonnet-4", + Prompt: fantasy.Prompt{ + { + Role: fantasy.MessageRoleSystem, + ProviderOptions: cacheControl(), + Content: []fantasy.MessagePart{ + fantasy.TextPart{Text: "cached system prompt"}, + }, + }, + {Role: fantasy.MessageRoleUser, Content: []fantasy.MessagePart{ + fantasy.TextPart{Text: "hello"}, + }}, + }, + }, + { + Name: "user_text_and_image", + Model: "gpt-4o", + Prompt: fantasy.Prompt{ + {Role: fantasy.MessageRoleUser, Content: []fantasy.MessagePart{ + fantasy.TextPart{Text: "what is this"}, + fantasy.FilePart{Filename: "a.png", MediaType: "image/png", Data: png()}, + }}, + }, + }, + { + Name: "user_pdf", + Model: "gpt-4o", + Prompt: fantasy.Prompt{ + {Role: fantasy.MessageRoleUser, Content: []fantasy.MessagePart{ + fantasy.FilePart{Filename: "doc.pdf", MediaType: "application/pdf", Data: []byte("%PDF-1.4")}, + }}, + }, + }, + { + Name: "user_audio_wav", + Model: "gpt-4o-audio-preview", + Prompt: fantasy.Prompt{ + {Role: fantasy.MessageRoleUser, Content: []fantasy.MessagePart{ + fantasy.FilePart{Filename: "a.wav", MediaType: "audio/wav", Data: []byte{1, 2, 3}}, + }}, + }, + }, + { + Name: "user_unsupported_media", + Model: "gpt-4o", + Prompt: fantasy.Prompt{ + {Role: fantasy.MessageRoleUser, Content: []fantasy.MessagePart{ + fantasy.FilePart{Filename: "a.mp4", MediaType: "video/mp4", Data: []byte{1, 2, 3}}, + }}, + }, + }, + { + Name: "user_cache_control", + Model: "anthropic/claude-sonnet-4", + Prompt: fantasy.Prompt{ + { + Role: fantasy.MessageRoleUser, + ProviderOptions: cacheControl(), + Content: []fantasy.MessagePart{ + fantasy.TextPart{Text: "cached user turn"}, + }, + }, + }, + }, + { + // Every converter should drop this and warn: an empty user message + // is not valid input and silently forwarding it produces an API + // error far from the cause. + Name: "user_empty_is_dropped", + Model: "gpt-4o", + Prompt: fantasy.Prompt{ + {Role: fantasy.MessageRoleUser, Content: []fantasy.MessagePart{ + fantasy.TextPart{Text: ""}, + }}, + {Role: fantasy.MessageRoleUser, Content: []fantasy.MessagePart{ + fantasy.TextPart{Text: "real turn"}, + }}, + }, + }, + { + Name: "assistant_text_only", + Model: "gpt-4o", + Prompt: fantasy.Prompt{ + {Role: fantasy.MessageRoleUser, Content: []fantasy.MessagePart{ + fantasy.TextPart{Text: "hi"}, + }}, + {Role: fantasy.MessageRoleAssistant, Content: []fantasy.MessagePart{ + fantasy.TextPart{Text: "hello there"}, + }}, + }, + }, + { + Name: "assistant_text_and_tool_calls", + Model: "gpt-4o", + Prompt: fantasy.Prompt{ + {Role: fantasy.MessageRoleUser, Content: []fantasy.MessagePart{ + fantasy.TextPart{Text: "look at these"}, + }}, + {Role: fantasy.MessageRoleAssistant, Content: []fantasy.MessagePart{ + fantasy.TextPart{Text: "on it"}, + fantasy.ToolCallPart{ToolCallID: "c1", ToolName: "view", Input: `{"path":"a"}`}, + fantasy.ToolCallPart{ToolCallID: "c2", ToolName: "view", Input: `{"path":"b"}`}, + }}, + {Role: fantasy.MessageRoleTool, Content: []fantasy.MessagePart{ + fantasy.ToolResultPart{ToolCallID: "c1", Output: fantasy.ToolResultOutputContentText{Text: "a body"}}, + }}, + {Role: fantasy.MessageRoleTool, Content: []fantasy.MessagePart{ + fantasy.ToolResultPart{ToolCallID: "c2", Output: fantasy.ToolResultOutputContentText{Text: "b body"}}, + }}, + }, + }, + { + // Every converter should drop this and warn. An assistant message + // with neither content nor tool_calls is rejected outright, and + // because it stays in history the rejection repeats on every + // later request (charmbracelet/crush#3794). + Name: "assistant_empty_is_dropped", + Model: "gpt-4o", + Prompt: fantasy.Prompt{ + {Role: fantasy.MessageRoleUser, Content: []fantasy.MessagePart{ + fantasy.TextPart{Text: "hi"}, + }}, + {Role: fantasy.MessageRoleAssistant, Content: []fantasy.MessagePart{}}, + {Role: fantasy.MessageRoleUser, Content: []fantasy.MessagePart{ + fantasy.TextPart{Text: "still here"}, + }}, + }, + }, + { + // The assistant turn is the one role whose cache hint travels on + // the message rather than on a content part, so it needs its own + // case to keep that path honest. + Name: "assistant_cache_control", + Model: "anthropic/claude-sonnet-4", + Prompt: fantasy.Prompt{ + {Role: fantasy.MessageRoleUser, Content: []fantasy.MessagePart{ + fantasy.TextPart{Text: "hi"}, + }}, + { + Role: fantasy.MessageRoleAssistant, + ProviderOptions: cacheControl(), + Content: []fantasy.MessagePart{ + fantasy.TextPart{Text: "cached assistant turn"}, + }, + }, + }, + }, + { + Name: "assistant_reasoning_anthropic", + Model: "anthropic/claude-sonnet-4", + Prompt: fantasy.Prompt{ + {Role: fantasy.MessageRoleUser, Content: []fantasy.MessagePart{ + fantasy.TextPart{Text: "think"}, + }}, + {Role: fantasy.MessageRoleAssistant, Content: []fantasy.MessagePart{ + fantasy.ReasoningPart{Text: "thinking about it"}, + fantasy.TextPart{Text: "the answer"}, + }}, + }, + }, + { + Name: "assistant_reasoning_only", + Model: "anthropic/claude-sonnet-4", + Prompt: fantasy.Prompt{ + {Role: fantasy.MessageRoleUser, Content: []fantasy.MessagePart{ + fantasy.TextPart{Text: "think"}, + }}, + {Role: fantasy.MessageRoleAssistant, Content: []fantasy.MessagePart{ + fantasy.ReasoningPart{Text: "only reasoning, no text"}, + }}, + }, + }, + { + Name: "tool_result_error", + Model: "gpt-4o", + Prompt: fantasy.Prompt{ + {Role: fantasy.MessageRoleAssistant, Content: []fantasy.MessagePart{ + fantasy.ToolCallPart{ToolCallID: "c1", ToolName: "view", Input: "{}"}, + }}, + {Role: fantasy.MessageRoleTool, Content: []fantasy.MessagePart{ + fantasy.ToolResultPart{ToolCallID: "c1", Output: fantasy.ToolResultOutputContentError{Error: errFixture{}}}, + }}, + }, + }, + { + // The tool_call declared above must be answered. A converter that + // drops the media result leaves an unanswered tool_call_id, which + // strict backends reject. + Name: "tool_result_media_image", + Model: "gpt-4o", + Prompt: fantasy.Prompt{ + {Role: fantasy.MessageRoleAssistant, Content: []fantasy.MessagePart{ + fantasy.ToolCallPart{ToolCallID: "c1", ToolName: "view", Input: "{}"}, + }}, + {Role: fantasy.MessageRoleTool, Content: []fantasy.MessagePart{ + fantasy.ToolResultPart{ToolCallID: "c1", Output: fantasy.ToolResultOutputContentMedia{ + Data: b64(png()), + MediaType: "image/png", + }}, + }}, + }, + }, + { + // Accompanying text wins over the generated placeholder, so the + // tool message reads as the tool's own answer. + Name: "tool_result_media_image_with_text", + Model: "gpt-4o", + Prompt: fantasy.Prompt{ + {Role: fantasy.MessageRoleAssistant, Content: []fantasy.MessagePart{ + fantasy.ToolCallPart{ToolCallID: "c1", ToolName: "view", Input: "{}"}, + }}, + {Role: fantasy.MessageRoleTool, Content: []fantasy.MessagePart{ + fantasy.ToolResultPart{ToolCallID: "c1", Output: fantasy.ToolResultOutputContentMedia{ + Data: b64(png()), + MediaType: "image/png", + Text: "Screenshot of the blockquote element.", + }}, + }}, + }, + }, + { + // Audio results travel as an input_audio part, format "wav". + Name: "tool_result_media_audio_wav", + Model: "gpt-4o-audio-preview", + Prompt: fantasy.Prompt{ + {Role: fantasy.MessageRoleAssistant, Content: []fantasy.MessagePart{ + fantasy.ToolCallPart{ToolCallID: "c1", ToolName: "say", Input: "{}"}, + }}, + {Role: fantasy.MessageRoleTool, Content: []fantasy.MessagePart{ + fantasy.ToolResultPart{ToolCallID: "c1", Output: fantasy.ToolResultOutputContentMedia{ + Data: b64([]byte{1, 2, 3}), + MediaType: "audio/wav", + }}, + }}, + }, + }, + { + // audio/mpeg and audio/mp3 both map to format "mp3", the branch + // the wav case above does not reach. + Name: "tool_result_media_audio_mpeg", + Model: "gpt-4o-audio-preview", + Prompt: fantasy.Prompt{ + {Role: fantasy.MessageRoleAssistant, Content: []fantasy.MessagePart{ + fantasy.ToolCallPart{ToolCallID: "c1", ToolName: "say", Input: "{}"}, + }}, + {Role: fantasy.MessageRoleTool, Content: []fantasy.MessagePart{ + fantasy.ToolResultPart{ToolCallID: "c1", Output: fantasy.ToolResultOutputContentMedia{ + Data: b64([]byte{1, 2, 3}), + MediaType: "audio/mpeg", + }}, + }}, + }, + }, + { + // An unsupported media type still has to answer the tool_call, so + // the text message goes out alone with a warning naming the type. + Name: "tool_result_media_unsupported", + Model: "gpt-4o", + Prompt: fantasy.Prompt{ + {Role: fantasy.MessageRoleAssistant, Content: []fantasy.MessagePart{ + fantasy.ToolCallPart{ToolCallID: "c1", ToolName: "record", Input: "{}"}, + }}, + {Role: fantasy.MessageRoleTool, Content: []fantasy.MessagePart{ + fantasy.ToolResultPart{ToolCallID: "c1", Output: fantasy.ToolResultOutputContentMedia{ + Data: b64([]byte{1, 2, 3}), + MediaType: "video/mp4", + }}, + }}, + }, + }, + { + // The ordering case from the media fix: a parallel batch must keep + // its tool messages contiguous. + Name: "tool_result_media_parallel_batch", + Model: "gpt-4o", + Prompt: fantasy.Prompt{ + {Role: fantasy.MessageRoleAssistant, Content: []fantasy.MessagePart{ + fantasy.ToolCallPart{ToolCallID: "c1", ToolName: "view", Input: "{}"}, + fantasy.ToolCallPart{ToolCallID: "c2", ToolName: "view", Input: "{}"}, + }}, + {Role: fantasy.MessageRoleTool, Content: []fantasy.MessagePart{ + fantasy.ToolResultPart{ToolCallID: "c1", Output: fantasy.ToolResultOutputContentMedia{ + Data: b64(png()), + MediaType: "image/png", + }}, + }}, + {Role: fantasy.MessageRoleTool, Content: []fantasy.MessagePart{ + fantasy.ToolResultPart{ToolCallID: "c2", Output: fantasy.ToolResultOutputContentText{Text: "plain"}}, + }}, + {Role: fantasy.MessageRoleUser, Content: []fantasy.MessagePart{ + fantasy.TextPart{Text: "next"}, + }}, + }, + }, + { + Name: "tool_result_cache_control", + Model: "anthropic/claude-sonnet-4", + Prompt: fantasy.Prompt{ + {Role: fantasy.MessageRoleAssistant, Content: []fantasy.MessagePart{ + fantasy.ToolCallPart{ToolCallID: "c1", ToolName: "view", Input: "{}"}, + }}, + { + Role: fantasy.MessageRoleTool, + ProviderOptions: cacheControl(), + Content: []fantasy.MessagePart{ + fantasy.ToolResultPart{ToolCallID: "c1", Output: fantasy.ToolResultOutputContentText{Text: "cached result"}}, + }, + }, + }, + }, + } +} + +type errFixture struct{} + +func (errFixture) Error() string { return "tool blew up" } diff --git a/providers/internal/prompttest/prompt_test.go b/providers/internal/prompttest/prompt_test.go new file mode 100644 index 000000000..cd5f8be3b --- /dev/null +++ b/providers/internal/prompttest/prompt_test.go @@ -0,0 +1,27 @@ +package prompttest_test + +import ( + "testing" + + "charm.land/fantasy/providers/internal/prompttest" + "charm.land/fantasy/providers/openai" + "charm.land/fantasy/providers/openaicompat" + "charm.land/fantasy/providers/openrouter" + "charm.land/fantasy/providers/vercel" +) + +// TestPrompt records every chat-completions converter's output for the shared +// corpus. One file per case holds all four providers, so a divergence between +// them is a difference between adjacent keys in the same file. +// +// Regenerate with: go test ./providers/internal/prompttest -update +func TestPrompt(t *testing.T) { + t.Parallel() + + prompttest.Golden(t, []prompttest.Converter{ + {Name: "openai", Convert: openai.DefaultToPrompt}, + {Name: "openaicompat", Convert: openaicompat.ToPromptFunc}, + {Name: "openrouter", Convert: openrouter.ToPrompt}, + {Name: "vercel", Convert: vercel.ToPrompt}, + }) +} diff --git a/providers/internal/prompttest/prompttest.go b/providers/internal/prompttest/prompttest.go new file mode 100644 index 000000000..1bd365229 --- /dev/null +++ b/providers/internal/prompttest/prompttest.go @@ -0,0 +1,195 @@ +// Package prompttest provides a shared corpus of prompts and a golden-file +// harness for the chat-completions prompt builders. +// +// Four providers (openai, openaicompat, openrouter, vercel) convert a +// fantasy.Prompt into the same OpenAI SDK message type, and each has its own +// copy of the conversion. One corpus runs through all four and records every +// converter's output for a case in a single file, testdata/.json, keyed +// by provider. The file is the behaviour matrix: a difference between +// providers is a difference between adjacent keys, visible without running a +// diff across four directories. +// +// Reviewing a change to any converter means reading the golden diff rather +// than the control flow, and a behaviour that only one provider has becomes +// visible instead of buried. Regenerate with: +// +// go test ./providers/internal/prompttest -update +package prompttest + +import ( + "encoding/json" + "flag" + "fmt" + "os" + "path/filepath" + "strings" + "testing" + + "charm.land/fantasy" + "charm.land/fantasy/providers/openai" +) + +var update = flag.Bool("update", false, "rewrite prompt golden files") + +// Case is one prompt fixture. Model is passed through to the converter because +// several providers branch on the model ID. +type Case struct { + Name string + Model string + Prompt fantasy.Prompt +} + +// Result is one converter's output for one case. Messages is stored as raw +// JSON so the harness records exactly what the SDK would put on the wire, +// including the extra fields providers attach for cache control and reasoning +// details. +type Result struct { + Messages json.RawMessage `json:"messages"` + Warnings []string `json:"warnings"` +} + +// Converter is one named prompt builder under test. +type Converter struct { + Name string + Convert openai.LanguageModelToPromptFunc +} + +// Golden runs every case through every converter and compares the recorded +// matrix against testdata, or rewrites it under -update. +// +// Warnings are recorded alongside the messages because dropping content +// silently and dropping it with a warning are very different behaviours, and +// only the record makes that difference visible. +func Golden(t *testing.T, converters []Converter) { + t.Helper() + + cases := Cases() + seen := make(map[string]bool, len(cases)) + for _, tc := range cases { + if seen[tc.Name] { + t.Fatalf("duplicate case name %q: both would write the same golden file", tc.Name) + } + seen[tc.Name] = true + } + + for _, tc := range cases { + t.Run(tc.Name, func(t *testing.T) { + t.Parallel() + got := record(t, tc, converters) + path := filepath.Join(goldenDir, tc.Name+".json") + if *update { + if err := os.MkdirAll(goldenDir, 0o750); err != nil { + t.Fatalf("create golden dir: %v", err) + } + if err := os.WriteFile(path, got, 0o600); err != nil { + t.Fatalf("write golden: %v", err) + } + return + } + want, err := os.ReadFile(path) + if err != nil { + t.Fatalf("read golden (run with -update to create): %v", err) + } + // record writes LF, so a CRLF checkout would mismatch every line + // while the diff rendered identically. + want = []byte(strings.ReplaceAll(string(want), "\r\n", "\n")) + if diff := lineDiff(string(want), string(got)); diff != "" { + t.Errorf("golden mismatch for %s:\n%s", tc.Name, diff) + } + }) + } + + t.Run("no_stale_goldens", func(t *testing.T) { + if *update { + t.Skip("rewriting goldens") + } + entries, err := os.ReadDir(goldenDir) + if err != nil { + t.Fatalf("read golden dir: %v", err) + } + for _, e := range entries { + if e.IsDir() || filepath.Ext(e.Name()) != ".json" { + continue + } + name := strings.TrimSuffix(e.Name(), ".json") + if !seen[name] { + t.Errorf("golden %s has no matching case; delete it or restore the case", e.Name()) + } + } + }) +} + +const goldenDir = "testdata" + +// record converts one case with every converter and marshals the matrix. +// +// Converters producing identical output share one entry, keyed by their +// comma-joined names, so agreement collapses to a single block and any file +// with more than one key names exactly who diverges. +func record(t *testing.T, tc Case, converters []Converter) []byte { + t.Helper() + + type group struct { + result Result + names []string + } + groups := map[string]*group{} + for _, c := range converters { + messages, warnings := c.Convert(tc.Prompt, c.Name, tc.Model) + raw, err := json.Marshal(messages) + if err != nil { + t.Fatalf("marshal %s messages: %v", c.Name, err) + } + texts := make([]string, 0, len(warnings)) + for _, w := range warnings { + texts = append(texts, string(w.Type)+": "+w.Message) + } + result := Result{Messages: raw, Warnings: texts} + key, err := json.Marshal(result) + if err != nil { + t.Fatalf("key %s result: %v", c.Name, err) + } + g, ok := groups[string(key)] + if !ok { + g = &group{result: result} + groups[string(key)] = g + } + g.names = append(g.names, c.Name) + } + + matrix := make(map[string]Result, len(groups)) + for _, g := range groups { + matrix[strings.Join(g.names, ",")] = g.result + } + got, err := json.MarshalIndent(matrix, "", " ") + if err != nil { + t.Fatalf("marshal matrix: %v", err) + } + return append(got, '\n') +} + +// lineDiff reports the differing lines between want and got, or "" when they +// match. Golden files here run to hundreds of base64-heavy lines, so printing +// both in full buries the one field that moved. +func lineDiff(want, got string) string { + if want == got { + return "" + } + wantLines, gotLines := strings.Split(want, "\n"), strings.Split(got, "\n") + var b strings.Builder + for i := 0; i < max(len(wantLines), len(gotLines)); i++ { + w, g := at(wantLines, i), at(gotLines, i) + if w == g { + continue + } + fmt.Fprintf(&b, " line %d:\n want: %s\n got: %s\n", i+1, w, g) + } + return b.String() +} + +func at(lines []string, i int) string { + if i < len(lines) { + return lines[i] + } + return "" +} diff --git a/providers/internal/prompttest/testdata/assistant_cache_control.json b/providers/internal/prompttest/testdata/assistant_cache_control.json new file mode 100644 index 000000000..c067f579e --- /dev/null +++ b/providers/internal/prompttest/testdata/assistant_cache_control.json @@ -0,0 +1,31 @@ +{ + "openai,openaicompat": { + "messages": [ + { + "content": "hi", + "role": "user" + }, + { + "content": "cached assistant turn", + "role": "assistant" + } + ], + "warnings": [] + }, + "openrouter,vercel": { + "messages": [ + { + "content": "hi", + "role": "user" + }, + { + "content": "cached assistant turn", + "role": "assistant", + "cache_control": { + "type": "ephemeral" + } + } + ], + "warnings": [] + } +} diff --git a/providers/internal/prompttest/testdata/assistant_empty_is_dropped.json b/providers/internal/prompttest/testdata/assistant_empty_is_dropped.json new file mode 100644 index 000000000..dba969e5f --- /dev/null +++ b/providers/internal/prompttest/testdata/assistant_empty_is_dropped.json @@ -0,0 +1,17 @@ +{ + "openai,openaicompat,openrouter,vercel": { + "messages": [ + { + "content": "hi", + "role": "user" + }, + { + "content": "still here", + "role": "user" + } + ], + "warnings": [ + "other: dropping empty assistant message (contains neither user-facing content nor tool calls)" + ] + } +} diff --git a/providers/internal/prompttest/testdata/assistant_reasoning_anthropic.json b/providers/internal/prompttest/testdata/assistant_reasoning_anthropic.json new file mode 100644 index 000000000..b3ca52703 --- /dev/null +++ b/providers/internal/prompttest/testdata/assistant_reasoning_anthropic.json @@ -0,0 +1,42 @@ +{ + "openai": { + "messages": [ + { + "content": "think", + "role": "user" + }, + { + "content": "the answer", + "role": "assistant" + } + ], + "warnings": [] + }, + "openaicompat": { + "messages": [ + { + "content": "think", + "role": "user" + }, + { + "content": "the answer", + "role": "assistant", + "reasoning_content": "thinking about it" + } + ], + "warnings": [] + }, + "openrouter,vercel": { + "messages": [ + { + "content": "think", + "role": "user" + }, + { + "content": "\u003cthoughts\u003ethinking about it\u003c/thoughts\u003e\nthe answer", + "role": "assistant" + } + ], + "warnings": [] + } +} diff --git a/providers/internal/prompttest/testdata/assistant_reasoning_only.json b/providers/internal/prompttest/testdata/assistant_reasoning_only.json new file mode 100644 index 000000000..a93c7ac26 --- /dev/null +++ b/providers/internal/prompttest/testdata/assistant_reasoning_only.json @@ -0,0 +1,26 @@ +{ + "openai,openaicompat": { + "messages": [ + { + "content": "think", + "role": "user" + } + ], + "warnings": [ + "other: dropping empty assistant message (contains neither user-facing content nor tool calls)" + ] + }, + "openrouter,vercel": { + "messages": [ + { + "content": "think", + "role": "user" + }, + { + "content": "\u003cthoughts\u003eonly reasoning, no text\u003c/thoughts\u003e", + "role": "assistant" + } + ], + "warnings": [] + } +} diff --git a/providers/internal/prompttest/testdata/assistant_text_and_tool_calls.json b/providers/internal/prompttest/testdata/assistant_text_and_tool_calls.json new file mode 100644 index 000000000..1f4e9e526 --- /dev/null +++ b/providers/internal/prompttest/testdata/assistant_text_and_tool_calls.json @@ -0,0 +1,43 @@ +{ + "openai,openaicompat,openrouter,vercel": { + "messages": [ + { + "content": "look at these", + "role": "user" + }, + { + "content": "on it", + "tool_calls": [ + { + "id": "c1", + "function": { + "arguments": "{\"path\":\"a\"}", + "name": "view" + }, + "type": "function" + }, + { + "id": "c2", + "function": { + "arguments": "{\"path\":\"b\"}", + "name": "view" + }, + "type": "function" + } + ], + "role": "assistant" + }, + { + "content": "a body", + "tool_call_id": "c1", + "role": "tool" + }, + { + "content": "b body", + "tool_call_id": "c2", + "role": "tool" + } + ], + "warnings": [] + } +} diff --git a/providers/internal/prompttest/testdata/assistant_text_only.json b/providers/internal/prompttest/testdata/assistant_text_only.json new file mode 100644 index 000000000..a2dc3ada1 --- /dev/null +++ b/providers/internal/prompttest/testdata/assistant_text_only.json @@ -0,0 +1,15 @@ +{ + "openai,openaicompat,openrouter,vercel": { + "messages": [ + { + "content": "hi", + "role": "user" + }, + { + "content": "hello there", + "role": "assistant" + } + ], + "warnings": [] + } +} diff --git a/providers/internal/prompttest/testdata/system_cache_control.json b/providers/internal/prompttest/testdata/system_cache_control.json new file mode 100644 index 000000000..6572e5d26 --- /dev/null +++ b/providers/internal/prompttest/testdata/system_cache_control.json @@ -0,0 +1,31 @@ +{ + "openai,openaicompat": { + "messages": [ + { + "content": "cached system prompt", + "role": "system" + }, + { + "content": "hello", + "role": "user" + } + ], + "warnings": [] + }, + "openrouter,vercel": { + "messages": [ + { + "content": "cached system prompt", + "role": "system", + "cache_control": { + "type": "ephemeral" + } + }, + { + "content": "hello", + "role": "user" + } + ], + "warnings": [] + } +} diff --git a/providers/internal/prompttest/testdata/system_multiple_text_parts.json b/providers/internal/prompttest/testdata/system_multiple_text_parts.json new file mode 100644 index 000000000..ada01dafc --- /dev/null +++ b/providers/internal/prompttest/testdata/system_multiple_text_parts.json @@ -0,0 +1,15 @@ +{ + "openai,openaicompat,openrouter,vercel": { + "messages": [ + { + "content": "first\nsecond", + "role": "system" + }, + { + "content": "hello", + "role": "user" + } + ], + "warnings": [] + } +} diff --git a/providers/internal/prompttest/testdata/system_single_text.json b/providers/internal/prompttest/testdata/system_single_text.json new file mode 100644 index 000000000..a5089cdac --- /dev/null +++ b/providers/internal/prompttest/testdata/system_single_text.json @@ -0,0 +1,15 @@ +{ + "openai,openaicompat,openrouter,vercel": { + "messages": [ + { + "content": "you are helpful", + "role": "system" + }, + { + "content": "hello", + "role": "user" + } + ], + "warnings": [] + } +} diff --git a/providers/internal/prompttest/testdata/tool_result_cache_control.json b/providers/internal/prompttest/testdata/tool_result_cache_control.json new file mode 100644 index 000000000..0aed84d19 --- /dev/null +++ b/providers/internal/prompttest/testdata/tool_result_cache_control.json @@ -0,0 +1,51 @@ +{ + "openai,openaicompat": { + "messages": [ + { + "tool_calls": [ + { + "id": "c1", + "function": { + "arguments": "{}", + "name": "view" + }, + "type": "function" + } + ], + "role": "assistant" + }, + { + "content": "cached result", + "tool_call_id": "c1", + "role": "tool" + } + ], + "warnings": [] + }, + "openrouter,vercel": { + "messages": [ + { + "tool_calls": [ + { + "id": "c1", + "function": { + "arguments": "{}", + "name": "view" + }, + "type": "function" + } + ], + "role": "assistant" + }, + { + "content": "cached result", + "tool_call_id": "c1", + "role": "tool", + "cache_control": { + "type": "ephemeral" + } + } + ], + "warnings": [] + } +} diff --git a/providers/internal/prompttest/testdata/tool_result_error.json b/providers/internal/prompttest/testdata/tool_result_error.json new file mode 100644 index 000000000..c4ee33167 --- /dev/null +++ b/providers/internal/prompttest/testdata/tool_result_error.json @@ -0,0 +1,25 @@ +{ + "openai,openaicompat,openrouter,vercel": { + "messages": [ + { + "tool_calls": [ + { + "id": "c1", + "function": { + "arguments": "{}", + "name": "view" + }, + "type": "function" + } + ], + "role": "assistant" + }, + { + "content": "tool blew up", + "tool_call_id": "c1", + "role": "tool" + } + ], + "warnings": [] + } +} diff --git a/providers/internal/prompttest/testdata/tool_result_media_audio_mpeg.json b/providers/internal/prompttest/testdata/tool_result_media_audio_mpeg.json new file mode 100644 index 000000000..67a8ffdf9 --- /dev/null +++ b/providers/internal/prompttest/testdata/tool_result_media_audio_mpeg.json @@ -0,0 +1,37 @@ +{ + "openai,openaicompat,openrouter,vercel": { + "messages": [ + { + "tool_calls": [ + { + "id": "c1", + "function": { + "arguments": "{}", + "name": "say" + }, + "type": "function" + } + ], + "role": "assistant" + }, + { + "content": "The tool returned audio/mpeg content; see the following user message.", + "tool_call_id": "c1", + "role": "tool" + }, + { + "content": [ + { + "input_audio": { + "data": "AQID", + "format": "mp3" + }, + "type": "input_audio" + } + ], + "role": "user" + } + ], + "warnings": [] + } +} diff --git a/providers/internal/prompttest/testdata/tool_result_media_audio_wav.json b/providers/internal/prompttest/testdata/tool_result_media_audio_wav.json new file mode 100644 index 000000000..0f1e412de --- /dev/null +++ b/providers/internal/prompttest/testdata/tool_result_media_audio_wav.json @@ -0,0 +1,37 @@ +{ + "openai,openaicompat,openrouter,vercel": { + "messages": [ + { + "tool_calls": [ + { + "id": "c1", + "function": { + "arguments": "{}", + "name": "say" + }, + "type": "function" + } + ], + "role": "assistant" + }, + { + "content": "The tool returned audio/wav content; see the following user message.", + "tool_call_id": "c1", + "role": "tool" + }, + { + "content": [ + { + "input_audio": { + "data": "AQID", + "format": "wav" + }, + "type": "input_audio" + } + ], + "role": "user" + } + ], + "warnings": [] + } +} diff --git a/providers/internal/prompttest/testdata/tool_result_media_image.json b/providers/internal/prompttest/testdata/tool_result_media_image.json new file mode 100644 index 000000000..14a5e5c56 --- /dev/null +++ b/providers/internal/prompttest/testdata/tool_result_media_image.json @@ -0,0 +1,36 @@ +{ + "openai,openaicompat,openrouter,vercel": { + "messages": [ + { + "tool_calls": [ + { + "id": "c1", + "function": { + "arguments": "{}", + "name": "view" + }, + "type": "function" + } + ], + "role": "assistant" + }, + { + "content": "The tool returned image/png content; see the following user message.", + "tool_call_id": "c1", + "role": "tool" + }, + { + "content": [ + { + "image_url": { + "url": "data:image/png;base64,iVBORw==" + }, + "type": "image_url" + } + ], + "role": "user" + } + ], + "warnings": [] + } +} diff --git a/providers/internal/prompttest/testdata/tool_result_media_image_with_text.json b/providers/internal/prompttest/testdata/tool_result_media_image_with_text.json new file mode 100644 index 000000000..bcd7cf743 --- /dev/null +++ b/providers/internal/prompttest/testdata/tool_result_media_image_with_text.json @@ -0,0 +1,36 @@ +{ + "openai,openaicompat,openrouter,vercel": { + "messages": [ + { + "tool_calls": [ + { + "id": "c1", + "function": { + "arguments": "{}", + "name": "view" + }, + "type": "function" + } + ], + "role": "assistant" + }, + { + "content": "Screenshot of the blockquote element.", + "tool_call_id": "c1", + "role": "tool" + }, + { + "content": [ + { + "image_url": { + "url": "data:image/png;base64,iVBORw==" + }, + "type": "image_url" + } + ], + "role": "user" + } + ], + "warnings": [] + } +} diff --git a/providers/internal/prompttest/testdata/tool_result_media_parallel_batch.json b/providers/internal/prompttest/testdata/tool_result_media_parallel_batch.json new file mode 100644 index 000000000..a22e53803 --- /dev/null +++ b/providers/internal/prompttest/testdata/tool_result_media_parallel_batch.json @@ -0,0 +1,53 @@ +{ + "openai,openaicompat,openrouter,vercel": { + "messages": [ + { + "tool_calls": [ + { + "id": "c1", + "function": { + "arguments": "{}", + "name": "view" + }, + "type": "function" + }, + { + "id": "c2", + "function": { + "arguments": "{}", + "name": "view" + }, + "type": "function" + } + ], + "role": "assistant" + }, + { + "content": "The tool returned image/png content; see the following user message.", + "tool_call_id": "c1", + "role": "tool" + }, + { + "content": "plain", + "tool_call_id": "c2", + "role": "tool" + }, + { + "content": [ + { + "image_url": { + "url": "data:image/png;base64,iVBORw==" + }, + "type": "image_url" + } + ], + "role": "user" + }, + { + "content": "next", + "role": "user" + } + ], + "warnings": [] + } +} diff --git a/providers/internal/prompttest/testdata/tool_result_media_unsupported.json b/providers/internal/prompttest/testdata/tool_result_media_unsupported.json new file mode 100644 index 000000000..030f10c93 --- /dev/null +++ b/providers/internal/prompttest/testdata/tool_result_media_unsupported.json @@ -0,0 +1,27 @@ +{ + "openai,openaicompat,openrouter,vercel": { + "messages": [ + { + "tool_calls": [ + { + "id": "c1", + "function": { + "arguments": "{}", + "name": "record" + }, + "type": "function" + } + ], + "role": "assistant" + }, + { + "content": "The tool returned video/mp4 content, which cannot be displayed.", + "tool_call_id": "c1", + "role": "tool" + } + ], + "warnings": [ + "other: tool result media type video/mp4 not supported, sending text placeholder only" + ] + } +} diff --git a/providers/internal/prompttest/testdata/user_audio_wav.json b/providers/internal/prompttest/testdata/user_audio_wav.json new file mode 100644 index 000000000..7e046eea4 --- /dev/null +++ b/providers/internal/prompttest/testdata/user_audio_wav.json @@ -0,0 +1,19 @@ +{ + "openai,openaicompat,openrouter,vercel": { + "messages": [ + { + "content": [ + { + "input_audio": { + "data": "AQID", + "format": "wav" + }, + "type": "input_audio" + } + ], + "role": "user" + } + ], + "warnings": [] + } +} diff --git a/providers/internal/prompttest/testdata/user_cache_control.json b/providers/internal/prompttest/testdata/user_cache_control.json new file mode 100644 index 000000000..98e2f8b13 --- /dev/null +++ b/providers/internal/prompttest/testdata/user_cache_control.json @@ -0,0 +1,23 @@ +{ + "openai,openaicompat": { + "messages": [ + { + "content": "cached user turn", + "role": "user" + } + ], + "warnings": [] + }, + "openrouter,vercel": { + "messages": [ + { + "content": "cached user turn", + "role": "user", + "cache_control": { + "type": "ephemeral" + } + } + ], + "warnings": [] + } +} diff --git a/providers/internal/prompttest/testdata/user_empty_is_dropped.json b/providers/internal/prompttest/testdata/user_empty_is_dropped.json new file mode 100644 index 000000000..19aa84a09 --- /dev/null +++ b/providers/internal/prompttest/testdata/user_empty_is_dropped.json @@ -0,0 +1,15 @@ +{ + "openai,openaicompat,openrouter,vercel": { + "messages": [ + { + "content": "", + "role": "user" + }, + { + "content": "real turn", + "role": "user" + } + ], + "warnings": [] + } +} diff --git a/providers/internal/prompttest/testdata/user_pdf.json b/providers/internal/prompttest/testdata/user_pdf.json new file mode 100644 index 000000000..a1b363793 --- /dev/null +++ b/providers/internal/prompttest/testdata/user_pdf.json @@ -0,0 +1,19 @@ +{ + "openai,openaicompat,openrouter,vercel": { + "messages": [ + { + "content": [ + { + "file": { + "file_data": "data:application/pdf;base64,JVBERi0xLjQ=", + "filename": "doc.pdf" + }, + "type": "file" + } + ], + "role": "user" + } + ], + "warnings": [] + } +} diff --git a/providers/internal/prompttest/testdata/user_text_and_image.json b/providers/internal/prompttest/testdata/user_text_and_image.json new file mode 100644 index 000000000..b73088fdb --- /dev/null +++ b/providers/internal/prompttest/testdata/user_text_and_image.json @@ -0,0 +1,22 @@ +{ + "openai,openaicompat,openrouter,vercel": { + "messages": [ + { + "content": [ + { + "text": "what is this", + "type": "text" + }, + { + "image_url": { + "url": "data:image/png;base64,iVBORw==" + }, + "type": "image_url" + } + ], + "role": "user" + } + ], + "warnings": [] + } +} diff --git a/providers/internal/prompttest/testdata/user_unsupported_media.json b/providers/internal/prompttest/testdata/user_unsupported_media.json new file mode 100644 index 000000000..241e1b253 --- /dev/null +++ b/providers/internal/prompttest/testdata/user_unsupported_media.json @@ -0,0 +1,9 @@ +{ + "openai,openaicompat,openrouter,vercel": { + "messages": null, + "warnings": [ + "other: file part media type video/mp4 not supported", + "other: dropping empty user message (contains neither user-facing content nor tool results)" + ] + } +} diff --git a/providers/openai/language_model_hooks.go b/providers/openai/language_model_hooks.go index 32ecbeb24..0c967f803 100644 --- a/providers/openai/language_model_hooks.go +++ b/providers/openai/language_model_hooks.go @@ -328,17 +328,9 @@ func DefaultStreamProviderMetadataFunc(choice openai.ChatCompletionChoice, metad func DefaultToPrompt(prompt fantasy.Prompt, _, _ string) ([]openai.ChatCompletionMessageParamUnion, []fantasy.CallWarning) { var messages []openai.ChatCompletionMessageParamUnion var warnings []fantasy.CallWarning - // Defer synthetic user messages holding tool-result media (see - // ToolResultMediaMessages) until the contiguous run of tool messages - // ends: strict chat-completions validators require every tool message - // answering an assistant's tool_calls to immediately follow that - // assistant message. - var deferredMedia []openai.ChatCompletionMessageParamUnion + var media ToolRunBuffer for _, msg := range prompt { - if msg.Role != fantasy.MessageRoleTool && len(deferredMedia) > 0 { - messages = append(messages, deferredMedia...) - deferredMedia = nil - } + messages = media.Role(msg.Role, messages) switch msg.Role { case fantasy.MessageRoleSystem: var systemPromptParts []string @@ -502,7 +494,7 @@ func DefaultToPrompt(prompt fantasy.Prompt, _, _ string) ([]openai.ChatCompletio } } } - if !hasVisibleUserContent(content) { + if !HasVisibleUserContent(content) { warnings = append(warnings, fantasy.CallWarning{ Type: fantasy.CallWarningTypeOther, Message: "dropping empty user message (contains neither user-facing content nor tool results)", @@ -563,7 +555,7 @@ func DefaultToPrompt(prompt fantasy.Prompt, _, _ string) ([]openai.ChatCompletio }) } } - if !hasVisibleAssistantContent(&assistantMsg) { + if !HasVisibleAssistantContent(&assistantMsg) { warnings = append(warnings, fantasy.CallWarning{ Type: fantasy.CallWarningTypeOther, Message: "dropping empty assistant message (contains neither user-facing content nor tool calls)", @@ -574,141 +566,19 @@ func DefaultToPrompt(prompt fantasy.Prompt, _, _ string) ([]openai.ChatCompletio OfAssistant: &assistantMsg, }) case fantasy.MessageRoleTool: - for _, c := range msg.Content { - if c.GetType() != fantasy.ContentTypeToolResult { - warnings = append(warnings, fantasy.CallWarning{ - Type: fantasy.CallWarningTypeOther, - Message: "tool message can only have tool result content", - }) - continue - } - - toolResultPart, ok := fantasy.AsContentType[fantasy.ToolResultPart](c) - if !ok { - warnings = append(warnings, fantasy.CallWarning{ - Type: fantasy.CallWarningTypeOther, - Message: "tool message result part does not have the right type", - }) - continue - } - - switch toolResultPart.Output.GetType() { - case fantasy.ToolResultContentTypeText: - output, ok := fantasy.AsToolResultOutputType[fantasy.ToolResultOutputContentText](toolResultPart.Output) - if !ok { - warnings = append(warnings, fantasy.CallWarning{ - Type: fantasy.CallWarningTypeOther, - Message: "tool result output does not have the right type", - }) - continue - } - messages = append(messages, openai.ToolMessage(output.Text, toolResultPart.ToolCallID)) - case fantasy.ToolResultContentTypeError: - // TODO: check if better handling is needed - output, ok := fantasy.AsToolResultOutputType[fantasy.ToolResultOutputContentError](toolResultPart.Output) - if !ok { - warnings = append(warnings, fantasy.CallWarning{ - Type: fantasy.CallWarningTypeOther, - Message: "tool result output does not have the right type", - }) - continue - } - messages = append(messages, openai.ToolMessage(output.Error.Error(), toolResultPart.ToolCallID)) - case fantasy.ToolResultContentTypeMedia: - output, ok := fantasy.AsToolResultOutputType[fantasy.ToolResultOutputContentMedia](toolResultPart.Output) - if !ok { - warnings = append(warnings, fantasy.CallWarning{ - Type: fantasy.CallWarningTypeOther, - Message: "tool result output does not have the right type", - }) - continue - } - // OpenAI Chat Completions tool messages cannot carry image - // or audio content directly; see ToolResultMediaMessages. - toolMessage, mediaMessages, mediaWarnings := ToolResultMediaMessages(output, toolResultPart.ToolCallID) - messages = append(messages, toolMessage) - deferredMedia = append(deferredMedia, mediaMessages...) - warnings = append(warnings, mediaWarnings...) - default: - warnings = append(warnings, fantasy.CallWarning{ - Type: fantasy.CallWarningTypeOther, - Message: fmt.Sprintf("tool result output type %q not supported", toolResultPart.Output.GetType()), - }) - } - } + toolMessages, deferred, toolWarnings := ToolMessages(msg, nil) + messages = append(messages, toolMessages...) + media.Defer(deferred...) + warnings = append(warnings, toolWarnings...) } } - messages = append(messages, deferredMedia...) - return messages, warnings -} - -// ToolResultMediaMessages maps a tool-result media output to the chat -// completions messages that convey it. OpenAI tool messages can only carry -// text, so this returns a text tool message (using any accompanying text, or a -// placeholder describing the media) to keep the tool_call/tool_result pairing -// valid, plus synthetic user messages holding the actual image or audio -// content part so vision- and audio-capable models can see it. -// -// The two are returned separately because they belong in different places: the -// tool message must stay inside the contiguous run of tool messages answering -// an assistant's tool_calls, while the media messages must land after that run -// ends. Strict validators reject a tool message that does not immediately -// follow either its assistant message or another tool message. -// -// Unsupported media types produce only the text tool message plus a warning. -// This is shared with OpenAI-compatible providers, which face the same -// constraint. -func ToolResultMediaMessages(output fantasy.ToolResultOutputContentMedia, toolCallID string) (openai.ChatCompletionMessageParamUnion, []openai.ChatCompletionMessageParamUnion, []fantasy.CallWarning) { - placeholder := output.Text - if placeholder == "" { - placeholder = fmt.Sprintf("The tool returned %s content; see the following user message.", output.MediaType) - } - toolMessage := openai.ToolMessage(placeholder, toolCallID) - - mediaPart, warning, emit := toolResultMediaUserPart(output) - if warning != nil { - return toolMessage, nil, []fantasy.CallWarning{*warning} - } - if !emit { - return toolMessage, nil, nil - } - return toolMessage, []openai.ChatCompletionMessageParamUnion{ - openai.UserMessage([]openai.ChatCompletionContentPartUnionParam{mediaPart}), - }, nil -} - -// toolResultMediaUserPart maps a tool-result media output to an OpenAI chat -// completions user content part. It returns the content part, an optional -// warning, and whether the caller should emit the returned part. -func toolResultMediaUserPart(output fantasy.ToolResultOutputContentMedia) (openai.ChatCompletionContentPartUnionParam, *fantasy.CallWarning, bool) { - switch { - case strings.HasPrefix(output.MediaType, "image/"): - data := "data:" + output.MediaType + ";base64," + output.Data - imageBlock := openai.ChatCompletionContentPartImageParam{ - ImageURL: openai.ChatCompletionContentPartImageImageURLParam{URL: data}, - } - return openai.ChatCompletionContentPartUnionParam{OfImageURL: &imageBlock}, nil, true - case output.MediaType == "audio/wav", output.MediaType == "audio/mpeg", output.MediaType == "audio/mp3": - format := "wav" - if output.MediaType != "audio/wav" { - format = "mp3" - } - audioBlock := openai.ChatCompletionContentPartInputAudioParam{ - InputAudio: openai.ChatCompletionContentPartInputAudioInputAudioParam{ - Data: output.Data, - Format: format, - }, - } - return openai.ChatCompletionContentPartUnionParam{OfInputAudio: &audioBlock}, nil, true - default: - return openai.ChatCompletionContentPartUnionParam{}, &fantasy.CallWarning{ - Type: fantasy.CallWarningTypeOther, - Message: fmt.Sprintf("tool result media type %s not supported, sending text placeholder only", output.MediaType), - }, false - } + return media.Close(messages), warnings } -func hasVisibleUserContent(content []openai.ChatCompletionContentPartUnionParam) bool { +// HasVisibleUserContent reports whether a user message carries anything the +// model can actually see. A message that converts to no visible parts must be +// dropped rather than sent: the API rejects a content-less user message. +func HasVisibleUserContent(content []openai.ChatCompletionContentPartUnionParam) bool { for _, part := range content { if part.OfText != nil || part.OfImageURL != nil || part.OfInputAudio != nil || part.OfFile != nil { return true @@ -717,12 +587,15 @@ func hasVisibleUserContent(content []openai.ChatCompletionContentPartUnionParam) return false } -func hasVisibleAssistantContent(msg *openai.ChatCompletionAssistantMessageParam) bool { - // Check if there's text content +// HasVisibleAssistantContent reports whether an assistant message carries text +// or tool calls. Reasoning alone is not enough: it travels in provider-specific +// extra fields, and strict upstreams reject a message holding only those +// ("content or tool_calls must be set"), then repeat that rejection on every +// later request because the message stays in history (charmbracelet/crush#3794). +func HasVisibleAssistantContent(msg *openai.ChatCompletionAssistantMessageParam) bool { if !param.IsOmitted(msg.Content.OfString) || len(msg.Content.OfArrayOfContentParts) > 0 { return true } - // Check if there are tool calls if len(msg.ToolCalls) > 0 { return true } diff --git a/providers/openai/tool_messages.go b/providers/openai/tool_messages.go new file mode 100644 index 000000000..d4fd0f9c5 --- /dev/null +++ b/providers/openai/tool_messages.go @@ -0,0 +1,203 @@ +package openai + +import ( + "fmt" + "strings" + + "github.com/charmbracelet/openai-go" + + "charm.land/fantasy" +) + +// ToolCacheTypeFunc returns the prompt-cache hint to attach to the tool result +// at index i of msg, or "" for none. Providers without prompt caching pass nil. +// +// See anthropic.ToolResultCacheType for the Anthropic-style implementation. +type ToolCacheTypeFunc func(msg fantasy.Message, i int) string + +// ToolMessages converts a tool-role prompt message into the chat-completions +// messages answering the assistant's tool_calls. +// +// Media results come back in deferred rather than messages: they convert to a +// user message, which cannot sit inside the run of tool messages. Hand them to +// a ToolRunBuffer. +func ToolMessages(msg fantasy.Message, cacheType ToolCacheTypeFunc) (messages, deferred []openai.ChatCompletionMessageParamUnion, warnings []fantasy.CallWarning) { + warn := func(format string, args ...any) { + warnings = append(warnings, fantasy.CallWarning{ + Type: fantasy.CallWarningTypeOther, + Message: fmt.Sprintf(format, args...), + }) + } + + for i, c := range msg.Content { + if c.GetType() != fantasy.ContentTypeToolResult { + warn("tool message can only have tool result content") + continue + } + part, ok := fantasy.AsContentType[fantasy.ToolResultPart](c) + if !ok { + warn("tool message result part does not have the right type") + continue + } + + var hint string + if cacheType != nil { + hint = cacheType(msg, i) + } + + switch part.Output.GetType() { + case fantasy.ToolResultContentTypeText: + output, ok := fantasy.AsToolResultOutputType[fantasy.ToolResultOutputContentText](part.Output) + if !ok { + warn("tool result output does not have the right type") + continue + } + messages = append(messages, textToolMessage(output.Text, part.ToolCallID, hint)) + case fantasy.ToolResultContentTypeError: + output, ok := fantasy.AsToolResultOutputType[fantasy.ToolResultOutputContentError](part.Output) + if !ok { + warn("tool result output does not have the right type") + continue + } + messages = append(messages, textToolMessage(output.Error.Error(), part.ToolCallID, hint)) + case fantasy.ToolResultContentTypeMedia: + output, ok := fantasy.AsToolResultOutputType[fantasy.ToolResultOutputContentMedia](part.Output) + if !ok { + warn("tool result output does not have the right type") + continue + } + tool, media, mediaWarnings := ToolResultMediaMessages(output, part.ToolCallID) + tagToolCacheControl(tool.OfTool, hint) + messages = append(messages, tool) + deferred = append(deferred, media...) + warnings = append(warnings, mediaWarnings...) + default: + // Skipping silently would leave the assistant's tool_call + // unanswered, which strict backends reject. + warn("tool result output type %q not supported", part.Output.GetType()) + } + } + return messages, deferred, warnings +} + +// textToolMessage builds a tool message, tagged for prompt caching when the +// provider asked for a hint. +func textToolMessage(text, toolCallID, cacheType string) openai.ChatCompletionMessageParamUnion { + msg := openai.ToolMessage(text, toolCallID) + tagToolCacheControl(msg.OfTool, cacheType) + return msg +} + +// tagToolCacheControl marks a tool message for Anthropic-style prompt caching. +// +// It takes the tool param rather than the message union that wraps it: the +// union is not the value that gets marshalled, so setting the extra field +// there compiles and silently drops the hint. +func tagToolCacheControl(msg *openai.ChatCompletionToolMessageParam, cacheType string) { + if msg == nil || cacheType == "" { + return + } + msg.SetExtraFields(map[string]any{ + "cache_control": map[string]string{"type": cacheType}, + }) +} + +// ToolResultMediaMessages maps a tool-result media output to the chat +// completions messages that convey it: a text tool message that keeps the +// tool_call/tool_result pairing valid, plus the user messages holding the image +// or audio itself, which a tool message cannot carry. +// +// The two are returned separately because the tool message must stay inside the +// run of tool messages while the media has to land after it. Unsupported media +// types return only the tool message, plus a warning. +func ToolResultMediaMessages(output fantasy.ToolResultOutputContentMedia, toolCallID string) (openai.ChatCompletionMessageParamUnion, []openai.ChatCompletionMessageParamUnion, []fantasy.CallWarning) { + mediaPart, warning, emit := toolResultMediaUserPart(output) + + placeholder := output.Text + if placeholder == "" && emit { + placeholder = fmt.Sprintf("The tool returned %s content; see the following user message.", output.MediaType) + } else if placeholder == "" { + placeholder = fmt.Sprintf("The tool returned %s content, which cannot be displayed.", output.MediaType) + } + toolMessage := openai.ToolMessage(placeholder, toolCallID) + + if warning != nil { + return toolMessage, nil, []fantasy.CallWarning{*warning} + } + if !emit { + return toolMessage, nil, nil + } + return toolMessage, []openai.ChatCompletionMessageParamUnion{ + openai.UserMessage([]openai.ChatCompletionContentPartUnionParam{mediaPart}), + }, nil +} + +// toolResultMediaUserPart maps a tool-result media output to a user content +// part, reporting whether the caller should emit it. +func toolResultMediaUserPart(output fantasy.ToolResultOutputContentMedia) (openai.ChatCompletionContentPartUnionParam, *fantasy.CallWarning, bool) { + switch { + case strings.HasPrefix(output.MediaType, "image/"): + data := "data:" + output.MediaType + ";base64," + output.Data + imageBlock := openai.ChatCompletionContentPartImageParam{ + ImageURL: openai.ChatCompletionContentPartImageImageURLParam{URL: data}, + } + return openai.ChatCompletionContentPartUnionParam{OfImageURL: &imageBlock}, nil, true + case output.MediaType == "audio/wav", output.MediaType == "audio/mpeg", output.MediaType == "audio/mp3": + format := "wav" + if output.MediaType != "audio/wav" { + format = "mp3" + } + audioBlock := openai.ChatCompletionContentPartInputAudioParam{ + InputAudio: openai.ChatCompletionContentPartInputAudioInputAudioParam{ + Data: output.Data, + Format: format, + }, + } + return openai.ChatCompletionContentPartUnionParam{OfInputAudio: &audioBlock}, nil, true + default: + return openai.ChatCompletionContentPartUnionParam{}, &fantasy.CallWarning{ + Type: fantasy.CallWarningTypeOther, + Message: fmt.Sprintf("tool result media type %s not supported, sending text placeholder only", output.MediaType), + }, false + } +} + +// ToolRunBuffer holds synthetic user messages carrying tool-result media back +// until the current run of tool messages ends. +// +// Chat-completions validators require every tool message answering an +// assistant's tool_calls to follow that assistant message with only other tool +// messages in between, so emitting media where it is produced splits the run +// and every tool_call_id after the split reads as unanswered. +type ToolRunBuffer struct { + deferred []openai.ChatCompletionMessageParamUnion +} + +// Role reports that a prompt message of the given role is about to be +// converted, flushing any deferred media when that role ends a tool run. +// It returns messages with the flush applied. +func (b *ToolRunBuffer) Role(role fantasy.MessageRole, messages []openai.ChatCompletionMessageParamUnion) []openai.ChatCompletionMessageParamUnion { + if role == fantasy.MessageRoleTool { + return messages + } + return b.flush(messages) +} + +// Defer holds media messages until the current tool run ends. +func (b *ToolRunBuffer) Defer(messages ...openai.ChatCompletionMessageParamUnion) { + b.deferred = append(b.deferred, messages...) +} + +// Close flushes anything still deferred when the prompt ends on a tool run. +func (b *ToolRunBuffer) Close(messages []openai.ChatCompletionMessageParamUnion) []openai.ChatCompletionMessageParamUnion { + return b.flush(messages) +} + +func (b *ToolRunBuffer) flush(messages []openai.ChatCompletionMessageParamUnion) []openai.ChatCompletionMessageParamUnion { + if len(b.deferred) == 0 { + return messages + } + messages = append(messages, b.deferred...) + b.deferred = nil + return messages +} diff --git a/providers/openai/tool_run_buffer_test.go b/providers/openai/tool_run_buffer_test.go new file mode 100644 index 000000000..27312ca31 --- /dev/null +++ b/providers/openai/tool_run_buffer_test.go @@ -0,0 +1,194 @@ +package openai + +import ( + "testing" + + "github.com/charmbracelet/openai-go" + "github.com/stretchr/testify/require" + + "charm.land/fantasy" +) + +// ToolRunBuffer owns one rule: a run of tool messages answering an assistant's +// tool_calls must stay contiguous, so synthetic media user messages land after +// the run ends. All four chat-completions converters route through it, which +// is why it is tested here rather than four times over. + +// label renders a message as a short role tag so the tests can assert on +// ordering without caring about content. +func label(m openai.ChatCompletionMessageParamUnion) string { + switch { + case m.OfTool != nil: + return "tool:" + m.OfTool.ToolCallID + case m.OfAssistant != nil: + return "assistant" + case m.OfUser != nil: + return "user" + default: + return "other" + } +} + +func labels(msgs []openai.ChatCompletionMessageParamUnion) []string { + out := make([]string, 0, len(msgs)) + for _, m := range msgs { + out = append(out, label(m)) + } + return out +} + +// step is one prompt message being converted: its role, what the converter +// emits inline, and what it defers. +type step struct { + role fantasy.MessageRole + emit []openai.ChatCompletionMessageParamUnion + deferred []openai.ChatCompletionMessageParamUnion +} + +// run drives the buffer the way every converter's loop does. +func run(steps []step) []openai.ChatCompletionMessageParamUnion { + var buf ToolRunBuffer + var messages []openai.ChatCompletionMessageParamUnion + for _, s := range steps { + messages = buf.Role(s.role, messages) + messages = append(messages, s.emit...) + buf.Defer(s.deferred...) + } + return buf.Close(messages) +} + +func assistant(text string) []openai.ChatCompletionMessageParamUnion { + return []openai.ChatCompletionMessageParamUnion{openai.AssistantMessage(text)} +} + +func tool(id string) []openai.ChatCompletionMessageParamUnion { + return []openai.ChatCompletionMessageParamUnion{openai.ToolMessage("result", id)} +} + +func user(text string) []openai.ChatCompletionMessageParamUnion { + return []openai.ChatCompletionMessageParamUnion{openai.UserMessage(text)} +} + +func TestToolRunBuffer(t *testing.T) { + t.Parallel() + + tests := []struct { + name string + steps []step + want []string + }{ + { + // Nothing deferred: the buffer must not reorder anything. + name: "passthrough", + steps: []step{ + {role: fantasy.MessageRoleUser, emit: user("hi")}, + {role: fantasy.MessageRoleAssistant, emit: assistant("hello")}, + }, + want: []string{"user", "assistant"}, + }, + { + // A parallel batch: both tool messages stay contiguous and the + // media lands after the run, before the next user turn. + name: "parallel batch keeps tool run contiguous", + steps: []step{ + {role: fantasy.MessageRoleAssistant, emit: assistant("on it")}, + {role: fantasy.MessageRoleTool, emit: tool("c1"), deferred: user("media1")}, + {role: fantasy.MessageRoleTool, emit: tool("c2"), deferred: user("media2")}, + {role: fantasy.MessageRoleUser, emit: user("next")}, + }, + want: []string{"assistant", "tool:c1", "tool:c2", "user", "user", "user"}, + }, + { + // A text result in the same batch still emits in place. + name: "mixed batch keeps text inline", + steps: []step{ + {role: fantasy.MessageRoleAssistant, emit: assistant("on it")}, + {role: fantasy.MessageRoleTool, emit: tool("img"), deferred: user("media")}, + {role: fantasy.MessageRoleTool, emit: tool("txt")}, + {role: fantasy.MessageRoleUser, emit: user("next")}, + }, + want: []string{"assistant", "tool:img", "tool:txt", "user", "user"}, + }, + { + // The run ends at an assistant message too, not just a user one. + name: "flush before assistant", + steps: []step{ + {role: fantasy.MessageRoleAssistant, emit: assistant("on it")}, + {role: fantasy.MessageRoleTool, emit: tool("c1"), deferred: user("media")}, + {role: fantasy.MessageRoleAssistant, emit: assistant("done")}, + }, + want: []string{"assistant", "tool:c1", "user", "assistant"}, + }, + { + // When the prompt ends on a tool run, Close flushes rather than + // dropping the media. + name: "flush at end", + steps: []step{ + {role: fantasy.MessageRoleAssistant, emit: assistant("on it")}, + {role: fantasy.MessageRoleTool, emit: tool("c1"), deferred: user("media")}, + }, + want: []string{"assistant", "tool:c1", "user"}, + }, + { + // Two assistant turns. The second turn's tool message must not be + // hoisted ahead of the first turn's trailing messages: this is the + // case a blind post-pass over the finished slice gets wrong. + name: "two turns keep their own runs", + steps: []step{ + {role: fantasy.MessageRoleAssistant, emit: assistant("first")}, + {role: fantasy.MessageRoleTool, emit: tool("c1"), deferred: user("media")}, + {role: fantasy.MessageRoleAssistant, emit: assistant("second")}, + {role: fantasy.MessageRoleTool, emit: tool("c2")}, + {role: fantasy.MessageRoleUser, emit: user("final")}, + }, + want: []string{"assistant", "tool:c1", "user", "assistant", "tool:c2", "user"}, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + require.Equal(t, tt.want, labels(run(tt.steps))) + }) + } +} + +// Close is the flush every converter ends on, so it has to be idempotent: a +// second call must not replay the media it already emitted. +func TestToolRunBufferCloseIsIdempotent(t *testing.T) { + t.Parallel() + + var buf ToolRunBuffer + var messages []openai.ChatCompletionMessageParamUnion + messages = append(messages, tool("c1")...) + buf.Defer(user("media")...) + + messages = buf.Close(messages) + require.Equal(t, []string{"tool:c1", "user"}, labels(messages)) + require.Equal(t, []string{"tool:c1", "user"}, labels(buf.Close(messages))) +} + +// Role flushes on a non-tool role, so calling it twice for the same run must +// not replay either. +func TestToolRunBufferRoleFlushesOnce(t *testing.T) { + t.Parallel() + + var buf ToolRunBuffer + buf.Defer(user("media")...) + + messages := buf.Role(fantasy.MessageRoleUser, nil) + require.Equal(t, []string{"user"}, labels(messages)) + require.Equal(t, []string{"user"}, labels(buf.Role(fantasy.MessageRoleUser, messages))) + require.Equal(t, []string{"user"}, labels(buf.Close(messages))) +} + +// A zero buffer that never defers anything must leave the slice untouched, +// including its nil case. +func TestToolRunBufferZeroValue(t *testing.T) { + t.Parallel() + + var buf ToolRunBuffer + require.Empty(t, buf.Close(nil)) + require.Empty(t, buf.Role(fantasy.MessageRoleTool, nil)) + require.Equal(t, []string{"tool:c1"}, labels(buf.Close(tool("c1")))) +} diff --git a/providers/openaicompat/language_model_hooks.go b/providers/openaicompat/language_model_hooks.go index b5fea2bfe..553841892 100644 --- a/providers/openaicompat/language_model_hooks.go +++ b/providers/openaicompat/language_model_hooks.go @@ -189,18 +189,10 @@ func StreamExtraFunc(chunk openaisdk.ChatCompletionChunk, yield func(fantasy.Str func ToPromptFunc(prompt fantasy.Prompt, _, _ string) ([]openaisdk.ChatCompletionMessageParamUnion, []fantasy.CallWarning) { var messages []openaisdk.ChatCompletionMessageParamUnion var warnings []fantasy.CallWarning - // Defer synthetic user messages holding tool-result media (see - // openai.ToolResultMediaMessages) until the contiguous run of tool - // messages ends: strict chat-completions validators require every - // tool message answering an assistant's tool_calls to immediately - // follow that assistant message. - var deferredMedia []openaisdk.ChatCompletionMessageParamUnion + var media openai.ToolRunBuffer for _, msg := range prompt { - if msg.Role != fantasy.MessageRoleTool && len(deferredMedia) > 0 { - messages = append(messages, deferredMedia...) - deferredMedia = nil - } + messages = media.Role(msg.Role, messages) switch msg.Role { case fantasy.MessageRoleSystem: var blocks []openaisdk.ChatCompletionContentPartTextParam @@ -378,7 +370,7 @@ func ToPromptFunc(prompt fantasy.Prompt, _, _ string) ([]openaisdk.ChatCompletio } } } - if !hasVisibleCompatUserContent(content) { + if !openai.HasVisibleUserContent(content) { warnings = append(warnings, fantasy.CallWarning{ Type: fantasy.CallWarningTypeOther, Message: "dropping empty user message (contains neither user-facing content nor tool results)", @@ -496,7 +488,7 @@ func ToPromptFunc(prompt fantasy.Prompt, _, _ string) ([]openaisdk.ChatCompletio "reasoning_content": strings.Join(reasoningTexts, "\n"), }) } - if !hasVisibleCompatAssistantContent(&assistantMsg) { + if !openai.HasVisibleAssistantContent(&assistantMsg) { warnings = append(warnings, fantasy.CallWarning{ Type: fantasy.CallWarningTypeOther, Message: "dropping empty assistant message (contains neither user-facing content nor tool calls)", @@ -507,105 +499,11 @@ func ToPromptFunc(prompt fantasy.Prompt, _, _ string) ([]openaisdk.ChatCompletio OfAssistant: &assistantMsg, }) case fantasy.MessageRoleTool: - for _, c := range msg.Content { - if c.GetType() != fantasy.ContentTypeToolResult { - warnings = append(warnings, fantasy.CallWarning{ - Type: fantasy.CallWarningTypeOther, - Message: "tool message can only have tool result content", - }) - continue - } - - toolResultPart, ok := fantasy.AsContentType[fantasy.ToolResultPart](c) - if !ok { - warnings = append(warnings, fantasy.CallWarning{ - Type: fantasy.CallWarningTypeOther, - Message: "tool message result part does not have the right type", - }) - continue - } - - switch toolResultPart.Output.GetType() { - case fantasy.ToolResultContentTypeText: - output, ok := fantasy.AsToolResultOutputType[fantasy.ToolResultOutputContentText](toolResultPart.Output) - if !ok { - warnings = append(warnings, fantasy.CallWarning{ - Type: fantasy.CallWarningTypeOther, - Message: "tool result output does not have the right type", - }) - continue - } - messages = append(messages, openaisdk.ToolMessage(output.Text, toolResultPart.ToolCallID)) - case fantasy.ToolResultContentTypeError: - output, ok := fantasy.AsToolResultOutputType[fantasy.ToolResultOutputContentError](toolResultPart.Output) - if !ok { - warnings = append(warnings, fantasy.CallWarning{ - Type: fantasy.CallWarningTypeOther, - Message: "tool result output does not have the right type", - }) - continue - } - messages = append(messages, openaisdk.ToolMessage(output.Error.Error(), toolResultPart.ToolCallID)) - case fantasy.ToolResultContentTypeMedia: - output, ok := fantasy.AsToolResultOutputType[fantasy.ToolResultOutputContentMedia](toolResultPart.Output) - if !ok { - warnings = append(warnings, fantasy.CallWarning{ - Type: fantasy.CallWarningTypeOther, - Message: "tool result output does not have the right type", - }) - continue - } - // OpenAI-compatible chat completions tool messages cannot - // carry image or audio content directly; the SDK's content - // union only accepts text. Reuse the openai provider's - // helper, which splits the text tool message from the - // synthetic user message holding the media. - toolMessage, mediaMessages, mediaWarnings := openai.ToolResultMediaMessages(output, toolResultPart.ToolCallID) - messages = append(messages, toolMessage) - deferredMedia = append(deferredMedia, mediaMessages...) - warnings = append(warnings, mediaWarnings...) - default: - warnings = append(warnings, fantasy.CallWarning{ - Type: fantasy.CallWarningTypeOther, - Message: fmt.Sprintf("tool result output type %q not supported", toolResultPart.Output.GetType()), - }) - } - } + toolMessages, deferred, toolWarnings := openai.ToolMessages(msg, nil) + messages = append(messages, toolMessages...) + media.Defer(deferred...) + warnings = append(warnings, toolWarnings...) } } - messages = append(messages, deferredMedia...) - return messages, warnings -} - -// toolResultMediaUserPart maps a tool-result media output to an OpenAI chat -// completions user content part. It returns the content part, an optional -// warning, and whether the caller should emit the returned part. - -func hasVisibleCompatUserContent(content []openaisdk.ChatCompletionContentPartUnionParam) bool { - for _, part := range content { - if part.OfText != nil || part.OfImageURL != nil || part.OfInputAudio != nil || part.OfFile != nil { - return true - } - } - return false -} - -func hasVisibleCompatAssistantContent(msg *openaisdk.ChatCompletionAssistantMessageParam) bool { - // Check if there's text content - if !param.IsOmitted(msg.Content.OfString) || len(msg.Content.OfArrayOfContentParts) > 0 { - return true - } - // Check if there are tool calls - if len(msg.ToolCalls) > 0 { - return true - } - // A reasoning-only turn is not visible: it carries neither content nor - // tool calls, and strict OpenAI-compatible upstreams reject such - // messages outright ("content or tool_calls must be set"), failing every - // subsequent request once one lands in history (charmbracelet/crush#3794). - // The DeepSeek/Kimi replay contract only requires reasoning_content on - // turns that also carry content or tool calls, which pass the checks - // above; a bare reasoning turn is a truncated or canceled turn with no - // completion to resume from, so dropping it is safe. - return false + return media.Close(messages), warnings } diff --git a/providers/openaicompat/tool_result_media_test.go b/providers/openaicompat/tool_result_media_test.go index 15e3ffaf4..642b605b7 100644 --- a/providers/openaicompat/tool_result_media_test.go +++ b/providers/openaicompat/tool_result_media_test.go @@ -207,141 +207,3 @@ func TestToPromptFunc_MediaToolResult_UnsupportedMediaType(t *testing.T) { require.Len(t, warnings, 1) require.Contains(t, warnings[0].Message, "video/mp4") } - -// The ordering tests below all exercise the same invariant: the run of tool -// messages answering an assistant's tool_calls must stay contiguous, so the -// synthetic user messages carrying media land after the run ends. - -func mediaToolResult(id string) fantasy.MessagePart { - return fantasy.ToolResultPart{ - ToolCallID: id, - Output: fantasy.ToolResultOutputContentMedia{ - Data: base64.StdEncoding.EncodeToString([]byte{1, 2, 3}), - MediaType: "image/png", - }, - } -} - -func textToolResult(id string) fantasy.MessagePart { - return fantasy.ToolResultPart{ - ToolCallID: id, - Output: fantasy.ToolResultOutputContentText{Text: "ok"}, - } -} - -// A parallel tool-call batch with media results must keep its tool -// messages contiguous: strict validators report every tool_call_id after -// a mid-run user message as unanswered. -func TestToPromptFunc_MediaToolResult_ParallelBatchDeferred(t *testing.T) { - t.Parallel() - - prompt := fantasy.Prompt{ - { - Role: fantasy.MessageRoleAssistant, - Content: []fantasy.MessagePart{ - fantasy.ToolCallPart{ToolCallID: "img-1", ToolName: "view", Input: "{}"}, - fantasy.ToolCallPart{ToolCallID: "img-2", ToolName: "view", Input: "{}"}, - }, - }, - {Role: fantasy.MessageRoleTool, Content: []fantasy.MessagePart{mediaToolResult("img-1")}}, - {Role: fantasy.MessageRoleTool, Content: []fantasy.MessagePart{mediaToolResult("img-2")}}, - {Role: fantasy.MessageRoleUser, Content: []fantasy.MessagePart{fantasy.TextPart{Text: "next"}}}, - } - - messages, warnings := ToPromptFunc(prompt, "", "") - - require.Empty(t, warnings) - // Assistant, two tool messages, two deferred user image messages, user. - require.Len(t, messages, 6) - require.NotNil(t, messages[1].OfTool) - require.Equal(t, "img-1", messages[1].OfTool.ToolCallID) - require.NotNil(t, messages[2].OfTool) - require.Equal(t, "img-2", messages[2].OfTool.ToolCallID) - require.NotNil(t, messages[3].OfUser) - require.NotNil(t, messages[3].OfUser.Content.OfArrayOfContentParts[0].OfImageURL) - require.NotNil(t, messages[4].OfUser) - require.NotNil(t, messages[4].OfUser.Content.OfArrayOfContentParts[0].OfImageURL) - require.NotNil(t, messages[5].OfUser) -} - -// When the tool run ends the prompt, the deferred media messages flush at -// the end rather than being lost. -func TestToPromptFunc_MediaToolResult_DeferredFlushAtEnd(t *testing.T) { - t.Parallel() - - prompt := fantasy.Prompt{ - { - Role: fantasy.MessageRoleAssistant, - Content: []fantasy.MessagePart{ - fantasy.ToolCallPart{ToolCallID: "img-1", ToolName: "view", Input: "{}"}, - }, - }, - {Role: fantasy.MessageRoleTool, Content: []fantasy.MessagePart{mediaToolResult("img-1")}}, - } - - messages, warnings := ToPromptFunc(prompt, "", "") - - require.Empty(t, warnings) - require.Len(t, messages, 3) - require.NotNil(t, messages[1].OfTool) - require.NotNil(t, messages[2].OfUser) - require.NotNil(t, messages[2].OfUser.Content.OfArrayOfContentParts[0].OfImageURL) -} - -// Only the media user messages are deferred. A text tool result later in the -// same batch still has to be emitted in place, right after the media result's -// own tool message. -func TestToPromptFunc_MediaToolResult_MixedBatchKeepsTextInline(t *testing.T) { - t.Parallel() - - prompt := fantasy.Prompt{ - { - Role: fantasy.MessageRoleAssistant, - Content: []fantasy.MessagePart{ - fantasy.ToolCallPart{ToolCallID: "img-1", ToolName: "view", Input: "{}"}, - fantasy.ToolCallPart{ToolCallID: "txt-1", ToolName: "grep", Input: "{}"}, - }, - }, - {Role: fantasy.MessageRoleTool, Content: []fantasy.MessagePart{mediaToolResult("img-1")}}, - {Role: fantasy.MessageRoleTool, Content: []fantasy.MessagePart{textToolResult("txt-1")}}, - {Role: fantasy.MessageRoleUser, Content: []fantasy.MessagePart{fantasy.TextPart{Text: "next"}}}, - } - - messages, warnings := ToPromptFunc(prompt, "", "") - - require.Empty(t, warnings) - // Assistant, both tool messages, the deferred user image message, user. - require.Len(t, messages, 5) - require.NotNil(t, messages[1].OfTool) - require.Equal(t, "img-1", messages[1].OfTool.ToolCallID) - require.NotNil(t, messages[2].OfTool) - require.Equal(t, "txt-1", messages[2].OfTool.ToolCallID) - require.NotNil(t, messages[3].OfUser) - require.NotNil(t, messages[3].OfUser.Content.OfArrayOfContentParts[0].OfImageURL) - require.NotNil(t, messages[4].OfUser) -} - -// The run also ends at an assistant message, not just a user one. -func TestToPromptFunc_MediaToolResult_DeferredBeforeAssistant(t *testing.T) { - t.Parallel() - - prompt := fantasy.Prompt{ - { - Role: fantasy.MessageRoleAssistant, - Content: []fantasy.MessagePart{ - fantasy.ToolCallPart{ToolCallID: "img-1", ToolName: "view", Input: "{}"}, - }, - }, - {Role: fantasy.MessageRoleTool, Content: []fantasy.MessagePart{mediaToolResult("img-1")}}, - {Role: fantasy.MessageRoleAssistant, Content: []fantasy.MessagePart{fantasy.TextPart{Text: "done"}}}, - } - - messages, warnings := ToPromptFunc(prompt, "", "") - - require.Empty(t, warnings) - require.Len(t, messages, 4) - require.NotNil(t, messages[1].OfTool) - require.NotNil(t, messages[2].OfUser) - require.NotNil(t, messages[2].OfUser.Content.OfArrayOfContentParts[0].OfImageURL) - require.NotNil(t, messages[3].OfAssistant) -} diff --git a/providers/openrouter/language_model_hooks.go b/providers/openrouter/language_model_hooks.go index d0f921226..0afbd9d6f 100644 --- a/providers/openrouter/language_model_hooks.go +++ b/providers/openrouter/language_model_hooks.go @@ -523,7 +523,9 @@ func languageModelStreamUsage(chunk openaisdk.ChatCompletionChunk, _ map[string] func languageModelToPrompt(prompt fantasy.Prompt, _, model string) ([]openaisdk.ChatCompletionMessageParamUnion, []fantasy.CallWarning) { var messages []openaisdk.ChatCompletionMessageParamUnion var warnings []fantasy.CallWarning + var media openai.ToolRunBuffer for _, msg := range prompt { + messages = media.Role(msg.Role, messages) switch msg.Role { case fantasy.MessageRoleSystem: var systemPromptParts []string @@ -748,6 +750,13 @@ func languageModelToPrompt(prompt fantasy.Prompt, _, model string) ([]openaisdk. } } } + if !openai.HasVisibleUserContent(content) { + warnings = append(warnings, fantasy.CallWarning{ + Type: fantasy.CallWarningTypeOther, + Message: "dropping empty user message (contains neither user-facing content nor tool results)", + }) + continue + } messages = append(messages, openaisdk.UserMessage(content)) case fantasy.MessageRoleAssistant: // simple assistant message just text content @@ -1000,74 +1009,22 @@ func languageModelToPrompt(prompt fantasy.Prompt, _, model string) ([]openaisdk. assistantMsg.ToolCalls = append(assistantMsg.ToolCalls, tc) } } + if !openai.HasVisibleAssistantContent(&assistantMsg) { + warnings = append(warnings, fantasy.CallWarning{ + Type: fantasy.CallWarningTypeOther, + Message: "dropping empty assistant message (contains neither user-facing content nor tool calls)", + }) + continue + } messages = append(messages, openaisdk.ChatCompletionMessageParamUnion{ OfAssistant: &assistantMsg, }) case fantasy.MessageRoleTool: - for i, c := range msg.Content { - isLastPart := i == len(msg.Content)-1 - cacheControl := anthropic.GetCacheControl(c.Options()) - if cacheControl == nil && isLastPart { - cacheControl = anthropic.GetCacheControl(msg.ProviderOptions) - } - if c.GetType() != fantasy.ContentTypeToolResult { - warnings = append(warnings, fantasy.CallWarning{ - Type: fantasy.CallWarningTypeOther, - Message: "tool message can only have tool result content", - }) - continue - } - - toolResultPart, ok := fantasy.AsContentType[fantasy.ToolResultPart](c) - if !ok { - warnings = append(warnings, fantasy.CallWarning{ - Type: fantasy.CallWarningTypeOther, - Message: "tool message result part does not have the right type", - }) - continue - } - - switch toolResultPart.Output.GetType() { - case fantasy.ToolResultContentTypeText: - output, ok := fantasy.AsToolResultOutputType[fantasy.ToolResultOutputContentText](toolResultPart.Output) - if !ok { - warnings = append(warnings, fantasy.CallWarning{ - Type: fantasy.CallWarningTypeOther, - Message: "tool result output does not have the right type", - }) - continue - } - tr := openaisdk.ToolMessage(output.Text, toolResultPart.ToolCallID) - if cacheControl != nil { - tr.SetExtraFields(map[string]any{ - "cache_control": map[string]string{ - "type": cacheControl.Type, - }, - }) - } - messages = append(messages, tr) - case fantasy.ToolResultContentTypeError: - // TODO: check if better handling is needed - output, ok := fantasy.AsToolResultOutputType[fantasy.ToolResultOutputContentError](toolResultPart.Output) - if !ok { - warnings = append(warnings, fantasy.CallWarning{ - Type: fantasy.CallWarningTypeOther, - Message: "tool result output does not have the right type", - }) - continue - } - tr := openaisdk.ToolMessage(output.Error.Error(), toolResultPart.ToolCallID) - if cacheControl != nil { - tr.SetExtraFields(map[string]any{ - "cache_control": map[string]string{ - "type": cacheControl.Type, - }, - }) - } - messages = append(messages, tr) - } - } + toolMessages, deferred, toolWarnings := openai.ToolMessages(msg, anthropic.ToolResultCacheType) + messages = append(messages, toolMessages...) + media.Defer(deferred...) + warnings = append(warnings, toolWarnings...) } } - return messages, warnings + return media.Close(messages), warnings } diff --git a/providers/openrouter/prompt.go b/providers/openrouter/prompt.go new file mode 100644 index 000000000..e669741c8 --- /dev/null +++ b/providers/openrouter/prompt.go @@ -0,0 +1,7 @@ +package openrouter + +import "charm.land/fantasy/providers/openai" + +// ToPrompt is the prompt converter this provider installs on its language +// models, exported for the shared corpus in providers/internal/prompttest. +var ToPrompt openai.LanguageModelToPromptFunc = languageModelToPrompt diff --git a/providers/vercel/language_model_hooks.go b/providers/vercel/language_model_hooks.go index 24548e29b..963bc2b65 100644 --- a/providers/vercel/language_model_hooks.go +++ b/providers/vercel/language_model_hooks.go @@ -588,8 +588,10 @@ func languageModelStreamUsage(chunk openaisdk.ChatCompletionChunk, _ map[string] func languageModelToPrompt(prompt fantasy.Prompt, _, model string) ([]openaisdk.ChatCompletionMessageParamUnion, []fantasy.CallWarning) { var messages []openaisdk.ChatCompletionMessageParamUnion var warnings []fantasy.CallWarning + var media openaipkg.ToolRunBuffer for _, msg := range prompt { + messages = media.Role(msg.Role, messages) switch msg.Role { case fantasy.MessageRoleSystem: var systemPromptParts []string @@ -795,7 +797,7 @@ func languageModelToPrompt(prompt fantasy.Prompt, _, model string) ([]openaisdk. } } } - if !hasVisibleUserContent(content) { + if !openaipkg.HasVisibleUserContent(content) { warnings = append(warnings, fantasy.CallWarning{ Type: fantasy.CallWarningTypeOther, Message: "dropping empty user message (contains neither user-facing content nor tool results)", @@ -1012,83 +1014,25 @@ func languageModelToPrompt(prompt fantasy.Prompt, _, model string) ([]openaisdk. assistantMsg.ToolCalls = append(assistantMsg.ToolCalls, tc) } } + if !openaipkg.HasVisibleAssistantContent(&assistantMsg) { + warnings = append(warnings, fantasy.CallWarning{ + Type: fantasy.CallWarningTypeOther, + Message: "dropping empty assistant message (contains neither user-facing content nor tool calls)", + }) + continue + } messages = append(messages, openaisdk.ChatCompletionMessageParamUnion{ OfAssistant: &assistantMsg, }) case fantasy.MessageRoleTool: - for i, c := range msg.Content { - isLastPart := i == len(msg.Content)-1 - cacheControl := anthropic.GetCacheControl(c.Options()) - if cacheControl == nil && isLastPart { - cacheControl = anthropic.GetCacheControl(msg.ProviderOptions) - } - if c.GetType() != fantasy.ContentTypeToolResult { - warnings = append(warnings, fantasy.CallWarning{ - Type: fantasy.CallWarningTypeOther, - Message: "tool message can only have tool result content", - }) - continue - } - toolResultPart, ok := fantasy.AsContentType[fantasy.ToolResultPart](c) - if !ok { - warnings = append(warnings, fantasy.CallWarning{ - Type: fantasy.CallWarningTypeOther, - Message: "tool message result part does not have the right type", - }) - continue - } - switch toolResultPart.Output.GetType() { - case fantasy.ToolResultContentTypeText: - output, ok := fantasy.AsToolResultOutputType[fantasy.ToolResultOutputContentText](toolResultPart.Output) - if !ok { - warnings = append(warnings, fantasy.CallWarning{ - Type: fantasy.CallWarningTypeOther, - Message: "tool result output does not have the right type", - }) - continue - } - tr := openaisdk.ToolMessage(output.Text, toolResultPart.ToolCallID) - if cacheControl != nil { - tr.SetExtraFields(map[string]any{ - "cache_control": map[string]string{ - "type": cacheControl.Type, - }, - }) - } - messages = append(messages, tr) - case fantasy.ToolResultContentTypeError: - output, ok := fantasy.AsToolResultOutputType[fantasy.ToolResultOutputContentError](toolResultPart.Output) - if !ok { - warnings = append(warnings, fantasy.CallWarning{ - Type: fantasy.CallWarningTypeOther, - Message: "tool result output does not have the right type", - }) - continue - } - tr := openaisdk.ToolMessage(output.Error.Error(), toolResultPart.ToolCallID) - if cacheControl != nil { - tr.SetExtraFields(map[string]any{ - "cache_control": map[string]string{ - "type": cacheControl.Type, - }, - }) - } - messages = append(messages, tr) - } - } - } - } - return messages, warnings -} - -func hasVisibleUserContent(content []openaisdk.ChatCompletionContentPartUnionParam) bool { - for _, part := range content { - if part.OfText != nil || part.OfImageURL != nil || part.OfInputAudio != nil || part.OfFile != nil { - return true + toolMessages, deferred, toolWarnings := openaipkg.ToolMessages(msg, anthropic.ToolResultCacheType) + messages = append(messages, toolMessages...) + media.Defer(deferred...) + warnings = append(warnings, toolWarnings...) } } - return false + return media.Close(messages), warnings } func structToMapJSON(s any) (map[string]any, error) { diff --git a/providers/vercel/prompt.go b/providers/vercel/prompt.go new file mode 100644 index 000000000..a8d2b287c --- /dev/null +++ b/providers/vercel/prompt.go @@ -0,0 +1,7 @@ +package vercel + +import openaipkg "charm.land/fantasy/providers/openai" + +// ToPrompt is the prompt converter this provider installs on its language +// models, exported for the shared corpus in providers/internal/prompttest. +var ToPrompt openaipkg.LanguageModelToPromptFunc = languageModelToPrompt diff --git a/providertests/testdata/TestOpenRouterCommonWithAnthropicCache/anthropic/multi_tool.yaml b/providertests/testdata/TestOpenRouterCommonWithAnthropicCache/anthropic/multi_tool.yaml index 4b5e30944..bec9618ad 100644 --- a/providertests/testdata/TestOpenRouterCommonWithAnthropicCache/anthropic/multi_tool.yaml +++ b/providertests/testdata/TestOpenRouterCommonWithAnthropicCache/anthropic/multi_tool.yaml @@ -36,9 +36,9 @@ interactions: proto: HTTP/1.1 proto_major: 1 proto_minor: 1 - content_length: 1385 + content_length: 1422 host: "" - body: '{"messages":[{"content":"You are a helpful assistant. CRITICAL: Always use both add and multiply at the same time ALWAYS.","role":"system","cache_control":{"type":"ephemeral"}},{"content":"Add and multiply the number 2 and 3","role":"user"},{"tool_calls":[{"id":"toolu_bdrk_011gzTohxPFN5kvawEZfCgDs","function":{"arguments":"{\"a\": 2, \"b\": 3}","name":"add"},"type":"function"},{"id":"toolu_bdrk_013ddv4UW7UB3M9EvYTGzg3L","function":{"arguments":"{\"a\": 2, \"b\": 3}","name":"multiply"},"type":"function","cache_control":{"type":"ephemeral"}}],"role":"assistant"},{"content":"5","tool_call_id":"toolu_bdrk_011gzTohxPFN5kvawEZfCgDs","role":"tool"},{"content":"6","tool_call_id":"toolu_bdrk_013ddv4UW7UB3M9EvYTGzg3L","role":"tool"}],"model":"anthropic/claude-haiku-4.5","max_tokens":4000,"tool_choice":"auto","tools":[{"function":{"name":"add","strict":false,"description":"Add two numbers","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"}},"type":"function"},{"function":{"name":"multiply","strict":false,"description":"Multiply two numbers","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"}},"type":"function"}],"usage":{"include":true}}' + body: '{"messages":[{"content":"You are a helpful assistant. CRITICAL: Always use both add and multiply at the same time ALWAYS.","role":"system","cache_control":{"type":"ephemeral"}},{"content":"Add and multiply the number 2 and 3","role":"user"},{"tool_calls":[{"id":"toolu_bdrk_011gzTohxPFN5kvawEZfCgDs","function":{"arguments":"{\"a\": 2, \"b\": 3}","name":"add"},"type":"function"},{"id":"toolu_bdrk_013ddv4UW7UB3M9EvYTGzg3L","function":{"arguments":"{\"a\": 2, \"b\": 3}","name":"multiply"},"type":"function","cache_control":{"type":"ephemeral"}}],"role":"assistant"},{"content":"5","tool_call_id":"toolu_bdrk_011gzTohxPFN5kvawEZfCgDs","role":"tool"},{"content":"6","tool_call_id":"toolu_bdrk_013ddv4UW7UB3M9EvYTGzg3L","role":"tool","cache_control":{"type":"ephemeral"}}],"model":"anthropic/claude-haiku-4.5","max_tokens":4000,"tool_choice":"auto","tools":[{"function":{"name":"add","strict":false,"description":"Add two numbers","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"}},"type":"function"},{"function":{"name":"multiply","strict":false,"description":"Multiply two numbers","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"}},"type":"function"}],"usage":{"include":true}}' headers: Accept: - application/json diff --git a/providertests/testdata/TestOpenRouterCommonWithAnthropicCache/anthropic/multi_tool_streaming.yaml b/providertests/testdata/TestOpenRouterCommonWithAnthropicCache/anthropic/multi_tool_streaming.yaml index 16d6b1090..946b96694 100644 --- a/providertests/testdata/TestOpenRouterCommonWithAnthropicCache/anthropic/multi_tool_streaming.yaml +++ b/providertests/testdata/TestOpenRouterCommonWithAnthropicCache/anthropic/multi_tool_streaming.yaml @@ -77,9 +77,9 @@ interactions: proto: HTTP/1.1 proto_major: 1 proto_minor: 1 - content_length: 1422 + content_length: 1459 host: "" - body: '{"messages":[{"content":"You are a helpful assistant. Always use both add and multiply at the same time.","role":"system","cache_control":{"type":"ephemeral"}},{"content":"Add and multiply the number 2 and 3","role":"user"},{"tool_calls":[{"id":"toolu_bdrk_01FS6PPeAPQTDNqXK3a3eRHr","function":{"arguments":"{\"a\": 2, \"b\": 3}","name":"add"},"type":"function"},{"id":"toolu_bdrk_01YRxwgSi9gzNNtQ9Bz5AX6u","function":{"arguments":"{\"a\": 2, \"b\": 3}","name":"multiply"},"type":"function","cache_control":{"type":"ephemeral"}}],"role":"assistant"},{"content":"5","tool_call_id":"toolu_bdrk_01FS6PPeAPQTDNqXK3a3eRHr","role":"tool"},{"content":"6","tool_call_id":"toolu_bdrk_01YRxwgSi9gzNNtQ9Bz5AX6u","role":"tool"}],"model":"anthropic/claude-haiku-4.5","max_tokens":4000,"stream_options":{"include_usage":true},"tool_choice":"auto","tools":[{"function":{"name":"add","strict":false,"description":"Add two numbers","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"}},"type":"function"},{"function":{"name":"multiply","strict":false,"description":"Multiply two numbers","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"}},"type":"function"}],"usage":{"include":true},"stream":true}' + body: '{"messages":[{"content":"You are a helpful assistant. Always use both add and multiply at the same time.","role":"system","cache_control":{"type":"ephemeral"}},{"content":"Add and multiply the number 2 and 3","role":"user"},{"tool_calls":[{"id":"toolu_bdrk_01FS6PPeAPQTDNqXK3a3eRHr","function":{"arguments":"{\"a\": 2, \"b\": 3}","name":"add"},"type":"function"},{"id":"toolu_bdrk_01YRxwgSi9gzNNtQ9Bz5AX6u","function":{"arguments":"{\"a\": 2, \"b\": 3}","name":"multiply"},"type":"function","cache_control":{"type":"ephemeral"}}],"role":"assistant"},{"content":"5","tool_call_id":"toolu_bdrk_01FS6PPeAPQTDNqXK3a3eRHr","role":"tool"},{"content":"6","tool_call_id":"toolu_bdrk_01YRxwgSi9gzNNtQ9Bz5AX6u","role":"tool","cache_control":{"type":"ephemeral"}}],"model":"anthropic/claude-haiku-4.5","max_tokens":4000,"stream_options":{"include_usage":true},"tool_choice":"auto","tools":[{"function":{"name":"add","strict":false,"description":"Add two numbers","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"}},"type":"function"},{"function":{"name":"multiply","strict":false,"description":"Multiply two numbers","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"}},"type":"function"}],"usage":{"include":true},"stream":true}' headers: Accept: - application/json diff --git a/providertests/testdata/TestOpenRouterCommonWithAnthropicCache/anthropic/tool.yaml b/providertests/testdata/TestOpenRouterCommonWithAnthropicCache/anthropic/tool.yaml index 83cc54104..88996fc74 100644 --- a/providertests/testdata/TestOpenRouterCommonWithAnthropicCache/anthropic/tool.yaml +++ b/providertests/testdata/TestOpenRouterCommonWithAnthropicCache/anthropic/tool.yaml @@ -36,9 +36,9 @@ interactions: proto: HTTP/1.1 proto_major: 1 proto_minor: 1 - content_length: 832 + content_length: 869 host: "" - body: '{"messages":[{"content":"You are a helpful assistant","role":"system","cache_control":{"type":"ephemeral"}},{"content":"What''s the weather in Florence,Italy?","role":"user"},{"tool_calls":[{"id":"toolu_bdrk_0156sNzvRkpm2xuxFNs2N49s","function":{"arguments":"{\"location\": \"Florence, Italy\"}","name":"weather"},"type":"function","cache_control":{"type":"ephemeral"}}],"role":"assistant"},{"content":"40 C","tool_call_id":"toolu_bdrk_0156sNzvRkpm2xuxFNs2N49s","role":"tool"}],"model":"anthropic/claude-haiku-4.5","max_tokens":4000,"tool_choice":"auto","tools":[{"function":{"name":"weather","strict":false,"description":"Get weather information for a location","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"}},"type":"function"}],"usage":{"include":true}}' + body: '{"messages":[{"content":"You are a helpful assistant","role":"system","cache_control":{"type":"ephemeral"}},{"content":"What''s the weather in Florence,Italy?","role":"user"},{"tool_calls":[{"id":"toolu_bdrk_0156sNzvRkpm2xuxFNs2N49s","function":{"arguments":"{\"location\": \"Florence, Italy\"}","name":"weather"},"type":"function","cache_control":{"type":"ephemeral"}}],"role":"assistant"},{"content":"40 C","tool_call_id":"toolu_bdrk_0156sNzvRkpm2xuxFNs2N49s","role":"tool","cache_control":{"type":"ephemeral"}}],"model":"anthropic/claude-haiku-4.5","max_tokens":4000,"tool_choice":"auto","tools":[{"function":{"name":"weather","strict":false,"description":"Get weather information for a location","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"}},"type":"function"}],"usage":{"include":true}}' headers: Accept: - application/json diff --git a/providertests/testdata/TestOpenRouterCommonWithAnthropicCache/anthropic/tool_streaming.yaml b/providertests/testdata/TestOpenRouterCommonWithAnthropicCache/anthropic/tool_streaming.yaml index ea83d71cd..c6d027e40 100644 --- a/providertests/testdata/TestOpenRouterCommonWithAnthropicCache/anthropic/tool_streaming.yaml +++ b/providertests/testdata/TestOpenRouterCommonWithAnthropicCache/anthropic/tool_streaming.yaml @@ -65,9 +65,9 @@ interactions: proto: HTTP/1.1 proto_major: 1 proto_minor: 1 - content_length: 886 + content_length: 923 host: "" - body: '{"messages":[{"content":"You are a helpful assistant","role":"system","cache_control":{"type":"ephemeral"}},{"content":"What''s the weather in Florence,Italy?","role":"user"},{"tool_calls":[{"id":"toolu_bdrk_01LTELMMWKNzJUfqvcC4sycZ","function":{"arguments":"{\"location\": \"Florence, Italy\"}","name":"weather"},"type":"function","cache_control":{"type":"ephemeral"}}],"role":"assistant"},{"content":"40 C","tool_call_id":"toolu_bdrk_01LTELMMWKNzJUfqvcC4sycZ","role":"tool"}],"model":"anthropic/claude-haiku-4.5","max_tokens":4000,"stream_options":{"include_usage":true},"tool_choice":"auto","tools":[{"function":{"name":"weather","strict":false,"description":"Get weather information for a location","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"}},"type":"function"}],"usage":{"include":true},"stream":true}' + body: '{"messages":[{"content":"You are a helpful assistant","role":"system","cache_control":{"type":"ephemeral"}},{"content":"What''s the weather in Florence,Italy?","role":"user"},{"tool_calls":[{"id":"toolu_bdrk_01LTELMMWKNzJUfqvcC4sycZ","function":{"arguments":"{\"location\": \"Florence, Italy\"}","name":"weather"},"type":"function","cache_control":{"type":"ephemeral"}}],"role":"assistant"},{"content":"40 C","tool_call_id":"toolu_bdrk_01LTELMMWKNzJUfqvcC4sycZ","role":"tool","cache_control":{"type":"ephemeral"}}],"model":"anthropic/claude-haiku-4.5","max_tokens":4000,"stream_options":{"include_usage":true},"tool_choice":"auto","tools":[{"function":{"name":"weather","strict":false,"description":"Get weather information for a location","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"}},"type":"function"}],"usage":{"include":true},"stream":true}' headers: Accept: - application/json diff --git a/providertests/testdata/TestVercelCommonWithAnthropicCache/claude-sonnet-4/multi_tool.yaml b/providertests/testdata/TestVercelCommonWithAnthropicCache/claude-sonnet-4/multi_tool.yaml index ec320000b..48290c6aa 100644 --- a/providertests/testdata/TestVercelCommonWithAnthropicCache/claude-sonnet-4/multi_tool.yaml +++ b/providertests/testdata/TestVercelCommonWithAnthropicCache/claude-sonnet-4/multi_tool.yaml @@ -36,9 +36,9 @@ interactions: proto: HTTP/1.1 proto_major: 1 proto_minor: 1 - content_length: 1333 + content_length: 1370 host: "" - body: '{"messages":[{"content":"You are a helpful assistant. CRITICAL: Always use both add and multiply at the same time ALWAYS.","role":"system","cache_control":{"type":"ephemeral"}},{"content":"Add and multiply the number 2 and 3","role":"user"},{"tool_calls":[{"id":"toolu_017xBrnU2wm7B5qJHXAWLWTZ","function":{"arguments":"{\"a\":2,\"b\":3}","name":"add"},"type":"function"},{"id":"toolu_01Ctibf2hfhsW1QEmoPx8RtM","function":{"arguments":"{\"a\":2,\"b\":3}","name":"multiply"},"type":"function","cache_control":{"type":"ephemeral"}}],"role":"assistant"},{"content":"5","tool_call_id":"toolu_017xBrnU2wm7B5qJHXAWLWTZ","role":"tool"},{"content":"6","tool_call_id":"toolu_01Ctibf2hfhsW1QEmoPx8RtM","role":"tool"}],"model":"anthropic/claude-sonnet-4","max_tokens":4000,"tool_choice":"auto","tools":[{"function":{"name":"add","strict":false,"description":"Add two numbers","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"}},"type":"function"},{"function":{"name":"multiply","strict":false,"description":"Multiply two numbers","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"}},"type":"function"}]}' + body: '{"messages":[{"content":"You are a helpful assistant. CRITICAL: Always use both add and multiply at the same time ALWAYS.","role":"system","cache_control":{"type":"ephemeral"}},{"content":"Add and multiply the number 2 and 3","role":"user"},{"tool_calls":[{"id":"toolu_017xBrnU2wm7B5qJHXAWLWTZ","function":{"arguments":"{\"a\":2,\"b\":3}","name":"add"},"type":"function"},{"id":"toolu_01Ctibf2hfhsW1QEmoPx8RtM","function":{"arguments":"{\"a\":2,\"b\":3}","name":"multiply"},"type":"function","cache_control":{"type":"ephemeral"}}],"role":"assistant"},{"content":"5","tool_call_id":"toolu_017xBrnU2wm7B5qJHXAWLWTZ","role":"tool"},{"content":"6","tool_call_id":"toolu_01Ctibf2hfhsW1QEmoPx8RtM","role":"tool","cache_control":{"type":"ephemeral"}}],"model":"anthropic/claude-sonnet-4","max_tokens":4000,"tool_choice":"auto","tools":[{"function":{"name":"add","strict":false,"description":"Add two numbers","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"}},"type":"function"},{"function":{"name":"multiply","strict":false,"description":"Multiply two numbers","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"}},"type":"function"}]}' headers: Accept: - application/json diff --git a/providertests/testdata/TestVercelCommonWithAnthropicCache/claude-sonnet-4/multi_tool_streaming.yaml b/providertests/testdata/TestVercelCommonWithAnthropicCache/claude-sonnet-4/multi_tool_streaming.yaml index 85d794596..520241d24 100644 --- a/providertests/testdata/TestVercelCommonWithAnthropicCache/claude-sonnet-4/multi_tool_streaming.yaml +++ b/providertests/testdata/TestVercelCommonWithAnthropicCache/claude-sonnet-4/multi_tool_streaming.yaml @@ -61,9 +61,9 @@ interactions: proto: HTTP/1.1 proto_major: 1 proto_minor: 1 - content_length: 1439 + content_length: 1476 host: "" - body: '{"messages":[{"content":"You are a helpful assistant. Always use both add and multiply at the same time.","role":"system","cache_control":{"type":"ephemeral"}},{"content":"Add and multiply the number 2 and 3","role":"user"},{"content":"I''ll add and multiply the numbers 2 and 3 for you.","tool_calls":[{"id":"toolu_018nsjoYvpEgDt9YVftLaq7w","function":{"arguments":"{\"a\": 2, \"b\": 3}","name":"add"},"type":"function"},{"id":"toolu_011V64RqpHWpxKAL2Wn728hN","function":{"arguments":"{\"a\": 2, \"b\": 3}","name":"multiply"},"type":"function","cache_control":{"type":"ephemeral"}}],"role":"assistant"},{"content":"5","tool_call_id":"toolu_018nsjoYvpEgDt9YVftLaq7w","role":"tool"},{"content":"6","tool_call_id":"toolu_011V64RqpHWpxKAL2Wn728hN","role":"tool"}],"model":"anthropic/claude-sonnet-4","max_tokens":4000,"stream_options":{"include_usage":true},"tool_choice":"auto","tools":[{"function":{"name":"add","strict":false,"description":"Add two numbers","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"}},"type":"function"},{"function":{"name":"multiply","strict":false,"description":"Multiply two numbers","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"}},"type":"function"}],"stream":true}' + body: '{"messages":[{"content":"You are a helpful assistant. Always use both add and multiply at the same time.","role":"system","cache_control":{"type":"ephemeral"}},{"content":"Add and multiply the number 2 and 3","role":"user"},{"content":"I''ll add and multiply the numbers 2 and 3 for you.","tool_calls":[{"id":"toolu_018nsjoYvpEgDt9YVftLaq7w","function":{"arguments":"{\"a\": 2, \"b\": 3}","name":"add"},"type":"function"},{"id":"toolu_011V64RqpHWpxKAL2Wn728hN","function":{"arguments":"{\"a\": 2, \"b\": 3}","name":"multiply"},"type":"function","cache_control":{"type":"ephemeral"}}],"role":"assistant"},{"content":"5","tool_call_id":"toolu_018nsjoYvpEgDt9YVftLaq7w","role":"tool"},{"content":"6","tool_call_id":"toolu_011V64RqpHWpxKAL2Wn728hN","role":"tool","cache_control":{"type":"ephemeral"}}],"model":"anthropic/claude-sonnet-4","max_tokens":4000,"stream_options":{"include_usage":true},"tool_choice":"auto","tools":[{"function":{"name":"add","strict":false,"description":"Add two numbers","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"}},"type":"function"},{"function":{"name":"multiply","strict":false,"description":"Multiply two numbers","parameters":{"properties":{"a":{"description":"first number","type":"integer"},"b":{"description":"second number","type":"integer"}},"required":["a","b"],"type":"object"}},"type":"function"}],"stream":true}' headers: Accept: - application/json diff --git a/providertests/testdata/TestVercelCommonWithAnthropicCache/claude-sonnet-4/tool.yaml b/providertests/testdata/TestVercelCommonWithAnthropicCache/claude-sonnet-4/tool.yaml index 107408f7e..40e71fa10 100644 --- a/providertests/testdata/TestVercelCommonWithAnthropicCache/claude-sonnet-4/tool.yaml +++ b/providertests/testdata/TestVercelCommonWithAnthropicCache/claude-sonnet-4/tool.yaml @@ -36,9 +36,9 @@ interactions: proto: HTTP/1.1 proto_major: 1 proto_minor: 1 - content_length: 794 + content_length: 831 host: "" - body: '{"messages":[{"content":"You are a helpful assistant","role":"system","cache_control":{"type":"ephemeral"}},{"content":"What''s the weather in Florence,Italy?","role":"user"},{"tool_calls":[{"id":"toolu_01HKZKf11CsN9crwBqrsn3yX","function":{"arguments":"{\"location\":\"Florence,Italy\"}","name":"weather"},"type":"function","cache_control":{"type":"ephemeral"}}],"role":"assistant"},{"content":"40 C","tool_call_id":"toolu_01HKZKf11CsN9crwBqrsn3yX","role":"tool"}],"model":"anthropic/claude-sonnet-4","max_tokens":4000,"tool_choice":"auto","tools":[{"function":{"name":"weather","strict":false,"description":"Get weather information for a location","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"}},"type":"function"}]}' + body: '{"messages":[{"content":"You are a helpful assistant","role":"system","cache_control":{"type":"ephemeral"}},{"content":"What''s the weather in Florence,Italy?","role":"user"},{"tool_calls":[{"id":"toolu_01HKZKf11CsN9crwBqrsn3yX","function":{"arguments":"{\"location\":\"Florence,Italy\"}","name":"weather"},"type":"function","cache_control":{"type":"ephemeral"}}],"role":"assistant"},{"content":"40 C","tool_call_id":"toolu_01HKZKf11CsN9crwBqrsn3yX","role":"tool","cache_control":{"type":"ephemeral"}}],"model":"anthropic/claude-sonnet-4","max_tokens":4000,"tool_choice":"auto","tools":[{"function":{"name":"weather","strict":false,"description":"Get weather information for a location","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"}},"type":"function"}]}' headers: Accept: - application/json diff --git a/providertests/testdata/TestVercelCommonWithAnthropicCache/claude-sonnet-4/tool_streaming.yaml b/providertests/testdata/TestVercelCommonWithAnthropicCache/claude-sonnet-4/tool_streaming.yaml index e3f7f8bf3..83ad8efa5 100644 --- a/providertests/testdata/TestVercelCommonWithAnthropicCache/claude-sonnet-4/tool_streaming.yaml +++ b/providertests/testdata/TestVercelCommonWithAnthropicCache/claude-sonnet-4/tool_streaming.yaml @@ -57,9 +57,9 @@ interactions: proto: HTTP/1.1 proto_major: 1 proto_minor: 1 - content_length: 912 + content_length: 949 host: "" - body: '{"messages":[{"content":"You are a helpful assistant","role":"system","cache_control":{"type":"ephemeral"}},{"content":"What''s the weather in Florence,Italy?","role":"user"},{"content":"I''ll check the weather in Florence, Italy for you.","tool_calls":[{"id":"toolu_01M5YDg4x4mT5NJ8zPJB7y3S","function":{"arguments":"{\"location\": \"Florence,Italy\"}","name":"weather"},"type":"function","cache_control":{"type":"ephemeral"}}],"role":"assistant"},{"content":"40 C","tool_call_id":"toolu_01M5YDg4x4mT5NJ8zPJB7y3S","role":"tool"}],"model":"anthropic/claude-sonnet-4","max_tokens":4000,"stream_options":{"include_usage":true},"tool_choice":"auto","tools":[{"function":{"name":"weather","strict":false,"description":"Get weather information for a location","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"}},"type":"function"}],"stream":true}' + body: '{"messages":[{"content":"You are a helpful assistant","role":"system","cache_control":{"type":"ephemeral"}},{"content":"What''s the weather in Florence,Italy?","role":"user"},{"content":"I''ll check the weather in Florence, Italy for you.","tool_calls":[{"id":"toolu_01M5YDg4x4mT5NJ8zPJB7y3S","function":{"arguments":"{\"location\": \"Florence,Italy\"}","name":"weather"},"type":"function","cache_control":{"type":"ephemeral"}}],"role":"assistant"},{"content":"40 C","tool_call_id":"toolu_01M5YDg4x4mT5NJ8zPJB7y3S","role":"tool","cache_control":{"type":"ephemeral"}}],"model":"anthropic/claude-sonnet-4","max_tokens":4000,"stream_options":{"include_usage":true},"tool_choice":"auto","tools":[{"function":{"name":"weather","strict":false,"description":"Get weather information for a location","parameters":{"properties":{"location":{"description":"the city","type":"string"}},"required":["location"],"type":"object"}},"type":"function"}],"stream":true}' headers: Accept: - application/json From a0f6ed131fe1d8e783fc50e3c341474b36fdbb2e Mon Sep 17 00:00:00 2001 From: Lars Artmann Date: Fri, 16 Oct 2026 23:20:36 +0200 Subject: [PATCH 147/156] chore: use errors.AsType instead of errors.As (#419) --- errors.go | 13 +++---- providers/anthropic/anthropic_test.go | 4 +- providers/anthropic/error.go | 3 +- providers/anthropic/error_test.go | 39 +++++++++---------- providers/google/error.go | 4 +- providers/google/error_test.go | 11 +++--- providers/google/object_stream_finish_test.go | 5 +-- providers/kronk/error.go | 3 +- providers/kronk/error_test.go | 8 ++-- providers/openai/error.go | 6 +-- providers/openai/error_test.go | 35 ++++++++--------- providers/openai/openai_test.go | 3 +- retry.go | 16 ++++---- retry_test.go | 7 ++-- 14 files changed, 72 insertions(+), 85 deletions(-) diff --git a/errors.go b/errors.go index 62104fc01..87fbf9fdd 100644 --- a/errors.go +++ b/errors.go @@ -196,11 +196,10 @@ func IsTransportError(err error) bool { if err == nil { return false } - var ( - streamErr http2.StreamError - connErr http2.ConnectionError - ) - if errors.As(err, &streamErr) || errors.As(err, &connErr) { + if _, ok := errors.AsType[http2.StreamError](err); ok { + return true + } + if _, ok := errors.AsType[http2.ConnectionError](err); ok { return true } // Wrapped errors embed the inner message, so scanning the top-level @@ -356,6 +355,6 @@ func (e *NoObjectGeneratedError) Error() string { // IsNoObjectGeneratedError checks if an error is of type NoObjectGeneratedError. func IsNoObjectGeneratedError(err error) bool { - var target *NoObjectGeneratedError - return errors.As(err, &target) + _, ok := errors.AsType[*NoObjectGeneratedError](err) + return ok } diff --git a/providers/anthropic/anthropic_test.go b/providers/anthropic/anthropic_test.go index b3662699a..d6ae3c472 100644 --- a/providers/anthropic/anthropic_test.go +++ b/providers/anthropic/anthropic_test.go @@ -996,13 +996,13 @@ func TestStream_RequiresMessageStopBeforeFinish(t *testing.T) { require.Contains(t, errorParts[0].Error.Error(), tt.wantErrContain) } - var providerErr *fantasy.ProviderError if tt.wantRetryable { + var providerErr *fantasy.ProviderError require.ErrorAs(t, errorParts[0].Error, &providerErr) require.True(t, providerErr.IsRetryable()) } else { require.NotErrorIs(t, errorParts[0].Error, io.ErrUnexpectedEOF) - if errors.As(errorParts[0].Error, &providerErr) { + if providerErr, ok := errors.AsType[*fantasy.ProviderError](errorParts[0].Error); ok { require.False(t, providerErr.IsRetryable()) require.NotErrorIs(t, providerErr.Cause, io.ErrUnexpectedEOF) } diff --git a/providers/anthropic/error.go b/providers/anthropic/error.go index 98b163b66..af500f0b8 100644 --- a/providers/anthropic/error.go +++ b/providers/anthropic/error.go @@ -22,8 +22,7 @@ var anthropicContextPattern = regexp.MustCompile(`prompt is too long:\s*(\d+)\s* const awsCredentialErrorFragment = "failed to refresh cached credentials" //nolint:gosec // false positive: error message fragment, not a credential func toProviderErr(err error) error { - var apiErr *anthropic.Error - if errors.As(err, &apiErr) { + if apiErr, ok := errors.AsType[*anthropic.Error](err); ok { providerErr := &fantasy.ProviderError{ Title: apiErrorTitle(apiErr), Message: apiErr.Error(), diff --git a/providers/anthropic/error_test.go b/providers/anthropic/error_test.go index ca76486fb..0362c6179 100644 --- a/providers/anthropic/error_test.go +++ b/providers/anthropic/error_test.go @@ -31,8 +31,8 @@ func TestToProviderErr_WrapsUnexpectedEOF(t *testing.T) { got := toProviderErr(tc.err) - var providerErr *fantasy.ProviderError - if !errors.As(got, &providerErr) { + providerErr, ok := errors.AsType[*fantasy.ProviderError](got) + if !ok { t.Fatalf("toProviderErr did not wrap %v as *fantasy.ProviderError (got %T)", tc.err, got) } if !errors.Is(providerErr.Cause, io.ErrUnexpectedEOF) { @@ -63,8 +63,7 @@ func TestToProviderErr_PassesThroughPlainEOF(t *testing.T) { // calls toProviderErr with io.EOF. But if it ever did, we should not // wrap it: io.EOF is not "retryable" in the ProviderError sense. got := toProviderErr(io.EOF) - var providerErr *fantasy.ProviderError - if errors.As(got, &providerErr) { + if _, ok := errors.AsType[*fantasy.ProviderError](got); ok { t.Errorf("toProviderErr wrapped io.EOF as ProviderError; should pass through") } } @@ -84,8 +83,8 @@ func TestToProviderErr_FlagsExpiredBedrockCredentials(t *testing.T) { t.Run(tc.name, func(t *testing.T) { t.Parallel() - var providerErr *fantasy.ProviderError - if !errors.As(toProviderErr(tc.err), &providerErr) { + providerErr, ok := errors.AsType[*fantasy.ProviderError](toProviderErr(tc.err)) + if !ok { t.Fatalf("toProviderErr did not wrap %v as *fantasy.ProviderError", tc.err) } if !providerErr.AuthError { @@ -102,8 +101,8 @@ func TestToProviderErr_RetriesMidStreamOverload(t *testing.T) { err := errors.New(`received error while streaming: {"type":"error","error":{"details":null,"type":"overloaded_error","message":"Overloaded"}}`) - var providerErr *fantasy.ProviderError - if !errors.As(toProviderErr(err), &providerErr) { + providerErr, ok := errors.AsType[*fantasy.ProviderError](toProviderErr(err)) + if !ok { t.Fatalf("toProviderErr did not wrap %v as *fantasy.ProviderError", err) } if !providerErr.IsRetryable() { @@ -135,8 +134,8 @@ func TestToProviderErr_StreamErrorTransientTypes(t *testing.T) { err := errors.New(`received error while streaming: {"type":"error","error":{"type":"` + errType + `","message":"transient"}}`) - var providerErr *fantasy.ProviderError - if !errors.As(toProviderErr(err), &providerErr) { + providerErr, ok := errors.AsType[*fantasy.ProviderError](toProviderErr(err)) + if !ok { t.Fatalf("toProviderErr did not wrap %v as *fantasy.ProviderError", err) } if !providerErr.IsRetryable() { @@ -151,8 +150,8 @@ func TestToProviderErr_PermanentStreamErrorNotRetried(t *testing.T) { err := errors.New(`received error while streaming: {"type":"error","error":{"type":"invalid_request_error","message":"bad tool schema"}}`) - var providerErr *fantasy.ProviderError - if !errors.As(toProviderErr(err), &providerErr) { + providerErr, ok := errors.AsType[*fantasy.ProviderError](toProviderErr(err)) + if !ok { t.Fatalf("toProviderErr did not wrap %v as *fantasy.ProviderError", err) } if providerErr.IsRetryable() { @@ -169,8 +168,8 @@ func TestToProviderErr_StreamErrorWrappedByOuterError(t *testing.T) { inner := errors.New(`received error while streaming: {"type":"error","error":{"type":"overloaded_error","message":"Overloaded"}}`) err := fmt.Errorf("anthropic: %w", inner) - var providerErr *fantasy.ProviderError - if !errors.As(toProviderErr(err), &providerErr) { + providerErr, ok := errors.AsType[*fantasy.ProviderError](toProviderErr(err)) + if !ok { t.Fatalf("toProviderErr did not wrap %v as *fantasy.ProviderError", err) } if !providerErr.IsRetryable() { @@ -221,8 +220,8 @@ func TestToProviderErr_TitlesMidStreamOverloadFromThePayload(t *testing.T) { t.Fatal("the stream reported no error, so the overload never surfaced") } - var providerErr *fantasy.ProviderError - if !errors.As(streamErr, &providerErr) { + providerErr, ok := errors.AsType[*fantasy.ProviderError](streamErr) + if !ok { t.Fatalf("stream error is %T, want *fantasy.ProviderError", streamErr) } @@ -327,8 +326,8 @@ func TestToProviderErr_CarriesTheErrorType(t *testing.T) { err := errors.New(streamErrorPrefix + ` {"type":"error","error":{"type":"api_error","message":"Internal"}}`) - var providerErr *fantasy.ProviderError - if !errors.As(toProviderErr(err), &providerErr) { + providerErr, ok := errors.AsType[*fantasy.ProviderError](toProviderErr(err)) + if !ok { t.Fatalf("toProviderErr did not wrap %v as *fantasy.ProviderError", err) } if providerErr.ErrorType != "api_error" { @@ -364,8 +363,8 @@ func streamProviderError(t *testing.T, url string) *fantasy.ProviderError { if streamErr == nil { t.Fatal("the stream reported no error") } - var providerErr *fantasy.ProviderError - if !errors.As(streamErr, &providerErr) { + providerErr, ok := errors.AsType[*fantasy.ProviderError](streamErr) + if !ok { t.Fatalf("stream error is %T, want *fantasy.ProviderError", streamErr) } return providerErr diff --git a/providers/google/error.go b/providers/google/error.go index 813a35732..6a7163c9b 100644 --- a/providers/google/error.go +++ b/providers/google/error.go @@ -13,8 +13,8 @@ import ( var googleContextPattern = regexp.MustCompile(`input token count.*?(\d+).*?exceeds.*?maximum.*?(\d+)`) func toProviderErr(err error) error { - var apiErr genai.APIError - if !errors.As(err, &apiErr) { + apiErr, ok := errors.AsType[genai.APIError](err) + if !ok { // Wrap transient transport failures so `.IsRetryable()` works. return fantasy.WrapTransportError(err) } diff --git a/providers/google/error_test.go b/providers/google/error_test.go index 51ea9e31b..4ea01104c 100644 --- a/providers/google/error_test.go +++ b/providers/google/error_test.go @@ -29,8 +29,8 @@ func TestToProviderErr_WrapsUnexpectedEOF(t *testing.T) { got := toProviderErr(tc.err) - var providerErr *fantasy.ProviderError - if !errors.As(got, &providerErr) { + providerErr, ok := errors.AsType[*fantasy.ProviderError](got) + if !ok { t.Fatalf("toProviderErr did not wrap %v as *fantasy.ProviderError (got %T)", tc.err, got) } if !errors.Is(providerErr.Cause, io.ErrUnexpectedEOF) { @@ -57,8 +57,7 @@ func TestToProviderErr_PassesThroughPlainEOF(t *testing.T) { t.Parallel() got := toProviderErr(io.EOF) - var providerErr *fantasy.ProviderError - if errors.As(got, &providerErr) { + if _, ok := errors.AsType[*fantasy.ProviderError](got); ok { t.Errorf("toProviderErr wrapped io.EOF as ProviderError; should pass through") } } @@ -74,8 +73,8 @@ func TestToProviderErr_CarriesTheErrorType(t *testing.T) { Message: "Resource has been exhausted", } - var providerErr *fantasy.ProviderError - if !errors.As(toProviderErr(apiErr), &providerErr) { + providerErr, ok := errors.AsType[*fantasy.ProviderError](toProviderErr(apiErr)) + if !ok { t.Fatalf("toProviderErr did not wrap %v as *fantasy.ProviderError", apiErr) } if providerErr.ErrorType != "RESOURCE_EXHAUSTED" { diff --git a/providers/google/object_stream_finish_test.go b/providers/google/object_stream_finish_test.go index 1c7e61562..f9537ba19 100644 --- a/providers/google/object_stream_finish_test.go +++ b/providers/google/object_stream_finish_test.go @@ -107,9 +107,8 @@ func TestStreamObjectWithoutFinishReasonIsIncomplete(t *testing.T) { require.Len(t, errorParts, 1, "a stream with no candidate.finishReason must report an error") assert.Empty(t, finishes, "a stream with no candidate.finishReason must not report finish") - var providerErr *fantasy.ProviderError - require.True(t, errors.As(errorParts[0].Error, &providerErr), - "want a *fantasy.ProviderError, got %T", errorParts[0].Error) + providerErr, ok := errors.AsType[*fantasy.ProviderError](errorParts[0].Error) + require.True(t, ok, "want a *fantasy.ProviderError, got %T", errorParts[0].Error) assert.True(t, providerErr.IsRetryable(), "the incomplete-stream error must be retryable") } diff --git a/providers/kronk/error.go b/providers/kronk/error.go index a60925202..44ce256d8 100644 --- a/providers/kronk/error.go +++ b/providers/kronk/error.go @@ -60,8 +60,7 @@ func toProviderErr(err error) error { func toOperationErr(title string, err error) error { mappedErr := toProviderErr(err) - var providerErr *fantasy.ProviderError - if errors.As(mappedErr, &providerErr) && providerErr.Title == "kronk request failed" { + if providerErr, ok := errors.AsType[*fantasy.ProviderError](mappedErr); ok && providerErr.Title == "kronk request failed" { providerErr.Title = title } return mappedErr diff --git a/providers/kronk/error_test.go b/providers/kronk/error_test.go index baa9d4469..0611f2088 100644 --- a/providers/kronk/error_test.go +++ b/providers/kronk/error_test.go @@ -43,8 +43,8 @@ func TestToProviderErr(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { got := toProviderErr(tt.err) - var providerErr *fantasy.ProviderError - if gotProviderErr := errors.As(got, &providerErr); gotProviderErr != tt.wantProviderErr { + providerErr, gotProviderErr := errors.AsType[*fantasy.ProviderError](got) + if gotProviderErr != tt.wantProviderErr { t.Fatalf("ProviderError: got %t, want %t", gotProviderErr, tt.wantProviderErr) } if !tt.wantProviderErr { @@ -73,8 +73,8 @@ func TestToOperationErr(t *testing.T) { baseErr := errors.New("load failed") err := toOperationErr("kronk model loading failed", baseErr) - var providerErr *fantasy.ProviderError - if !errors.As(err, &providerErr) { + providerErr, ok := errors.AsType[*fantasy.ProviderError](err) + if !ok { t.Fatalf("error: got %T, want *fantasy.ProviderError", err) } if got, want := providerErr.Title, "kronk model loading failed"; got != want { diff --git a/providers/openai/error.go b/providers/openai/error.go index 3ad06b5e6..68033bfd2 100644 --- a/providers/openai/error.go +++ b/providers/openai/error.go @@ -24,8 +24,7 @@ var ( ) func toProviderErr(err error) error { - var apiErr *openai.Error - if errors.As(err, &apiErr) { + if apiErr, ok := errors.AsType[*openai.Error](err); ok { message := toProviderErrMessage(apiErr) providerErr := &fantasy.ProviderError{ Title: cmp.Or(fantasy.ErrorTitleForStatusCode(apiErr.StatusCode), "provider request failed"), @@ -46,8 +45,7 @@ func toProviderErr(err error) error { // Mid-stream SSE error events surface as *ssestream.StreamError, not // *openai.Error, so they need their own classification path. - var streamErr *ssestream.StreamError - if errors.As(err, &streamErr) { + if streamErr, ok := errors.AsType[*ssestream.StreamError](err); ok { return toProviderErrFromStreamError(streamErr) } diff --git a/providers/openai/error_test.go b/providers/openai/error_test.go index 2e9f2d9e4..2c1247603 100644 --- a/providers/openai/error_test.go +++ b/providers/openai/error_test.go @@ -32,8 +32,8 @@ func TestToProviderErr_WrapsUnexpectedEOF(t *testing.T) { got := toProviderErr(tc.err) - var providerErr *fantasy.ProviderError - if !errors.As(got, &providerErr) { + providerErr, ok := errors.AsType[*fantasy.ProviderError](got) + if !ok { t.Fatalf("toProviderErr did not wrap %v as *fantasy.ProviderError (got %T)", tc.err, got) } if !errors.Is(providerErr.Cause, io.ErrUnexpectedEOF) { @@ -60,8 +60,7 @@ func TestToProviderErr_PassesThroughPlainEOF(t *testing.T) { t.Parallel() got := toProviderErr(io.EOF) - var providerErr *fantasy.ProviderError - if errors.As(got, &providerErr) { + if _, ok := errors.AsType[*fantasy.ProviderError](got); ok { t.Errorf("toProviderErr wrapped io.EOF as ProviderError; should pass through") } } @@ -80,8 +79,8 @@ func TestToProviderErr_StreamErrorServerErrorIsRetryable(t *testing.T) { got := toProviderErr(streamErr) - var providerErr *fantasy.ProviderError - if !errors.As(got, &providerErr) { + providerErr, ok := errors.AsType[*fantasy.ProviderError](got) + if !ok { t.Fatalf("toProviderErr did not wrap StreamError as *fantasy.ProviderError (got %T)", got) } if !providerErr.IsRetryable() { @@ -117,8 +116,8 @@ func TestToProviderErr_StreamErrorTransientTypes(t *testing.T) { got := toProviderErr(streamErr) - var providerErr *fantasy.ProviderError - if !errors.As(got, &providerErr) { + providerErr, ok := errors.AsType[*fantasy.ProviderError](got) + if !ok { t.Fatalf("toProviderErr did not wrap StreamError (got %T)", got) } if !providerErr.IsRetryable() { @@ -140,8 +139,8 @@ func TestToProviderErr_StreamErrorUnknownTypeIsNotRetryable(t *testing.T) { got := toProviderErr(streamErr) - var providerErr *fantasy.ProviderError - if !errors.As(got, &providerErr) { + providerErr, ok := errors.AsType[*fantasy.ProviderError](got) + if !ok { t.Fatalf("toProviderErr did not wrap StreamError as *fantasy.ProviderError (got %T)", got) } if providerErr.IsRetryable() { @@ -159,8 +158,8 @@ func TestToProviderErr_StreamErrorMalformedBodyFallsBackToRawMessage(t *testing. got := toProviderErr(streamErr) - var providerErr *fantasy.ProviderError - if !errors.As(got, &providerErr) { + providerErr, ok := errors.AsType[*fantasy.ProviderError](got) + if !ok { t.Fatalf("toProviderErr did not wrap StreamError as *fantasy.ProviderError (got %T)", got) } if providerErr.Message != streamErr.Message { @@ -186,8 +185,8 @@ func TestToProviderErr_CarriesTheErrorType(t *testing.T) { }, } - var providerErr *fantasy.ProviderError - if !errors.As(toProviderErr(streamErr), &providerErr) { + providerErr, ok := errors.AsType[*fantasy.ProviderError](toProviderErr(streamErr)) + if !ok { t.Fatalf("toProviderErr did not wrap %v as *fantasy.ProviderError", streamErr) } if providerErr.ErrorType != "server_error" { @@ -208,8 +207,8 @@ func TestToProviderErr_CarriesTheErrorType(t *testing.T) { }, } - var providerErr *fantasy.ProviderError - if !errors.As(toProviderErr(streamErr), &providerErr) { + providerErr, ok := errors.AsType[*fantasy.ProviderError](toProviderErr(streamErr)) + if !ok { t.Fatalf("toProviderErr did not wrap %v as *fantasy.ProviderError", streamErr) } if providerErr.ErrorType != "rate_limit_exceeded" { @@ -243,8 +242,8 @@ func TestToProviderErr_CarriesTheErrorType(t *testing.T) { t.Fatal("the request was meant to be rejected") } - var providerErr *fantasy.ProviderError - if !errors.As(err, &providerErr) { + providerErr, ok := errors.AsType[*fantasy.ProviderError](err) + if !ok { t.Fatalf("error is %T, want *fantasy.ProviderError", err) } if providerErr.ErrorType != "tokens" { diff --git a/providers/openai/openai_test.go b/providers/openai/openai_test.go index 760cef96d..94fec16a1 100644 --- a/providers/openai/openai_test.go +++ b/providers/openai/openai_test.go @@ -4947,8 +4947,7 @@ func requireNotRetryableUnexpectedEOF(t *testing.T, err error) { t.Helper() require.NotErrorIs(t, err, io.ErrUnexpectedEOF) - var providerErr *fantasy.ProviderError - if errors.As(err, &providerErr) { + if providerErr, ok := errors.AsType[*fantasy.ProviderError](err); ok { require.False(t, providerErr.IsRetryable()) require.NotErrorIs(t, providerErr.Cause, io.ErrUnexpectedEOF) } diff --git a/retry.go b/retry.go index 67dd469ef..3d44f6b96 100644 --- a/retry.go +++ b/retry.go @@ -17,8 +17,8 @@ type RetryFunction[T any] func(ctx context.Context, fn RetryFn[T]) (T, error) // getRetryDelayInMs calculates the retry delay based on error headers and exponential backoff. func getRetryDelayInMs(err error, exponentialBackoffDelay time.Duration) time.Duration { - var providerErr *ProviderError - if !errors.As(err, &providerErr) || providerErr.ResponseHeaders == nil { + providerErr, ok := errors.AsType[*ProviderError](err) + if !ok || providerErr.ResponseHeaders == nil { return exponentialBackoffDelay } @@ -68,8 +68,8 @@ func RetryWithExponentialBackoffRespectingRetryHeaders[T any](options RetryOptio if err == nil || options.OnAuthRefresh == nil { return result, err } - var authErr *ProviderError - if !errors.As(err, &authErr) || !isAuthError(authErr) { + authErr, ok := errors.AsType[*ProviderError](err) + if !ok || !isAuthError(authErr) { return result, err } if refreshErr := options.OnAuthRefresh(ctx, authErr); refreshErr != nil { @@ -145,7 +145,7 @@ func retryWithExponentialBackoff[T any](ctx context.Context, fn RetryFn[T], opti if isRetryableError(err) && tryNumber <= options.MaxRetries { delay := getRetryDelayInMs(err, options.InitialDelayIn) if options.OnRetry != nil { - errors.As(err, &providerErr) + providerErr, _ = errors.AsType[*ProviderError](err) options.OnRetry(providerErr, delay) } @@ -181,15 +181,13 @@ func isAuthError(err *ProviderError) bool { // level transport errors. The latter two categories may not be wrapped // in ProviderError when they occur outside the provider's error handler. func isRetryableError(err error) bool { - var providerErr *ProviderError - if errors.As(err, &providerErr) { + if providerErr, ok := errors.AsType[*ProviderError](err); ok { return providerErr.IsRetryable() } if isAbortError(err) { return false } - var netErr net.Error - if errors.As(err, &netErr) { + if _, ok := errors.AsType[net.Error](err); ok { return true } return IsTransportError(err) diff --git a/retry_test.go b/retry_test.go index ad1b7c429..cfd105fe6 100644 --- a/retry_test.go +++ b/retry_test.go @@ -165,8 +165,7 @@ func TestRetryWithExponentialBackoff_ConnectionErrors(t *testing.T) { return 0, &net.OpError{Op: "dial", Net: "tcp", Err: errors.New("connection refused")} }) - var retryErr *RetryError - if !errors.As(err, &retryErr) { + if _, ok := errors.AsType[*RetryError](err); !ok { t.Fatalf("expected RetryError, got %T: %v", err, err) } }) @@ -298,8 +297,8 @@ func TestRetryWithAuthRefresh(t *testing.T) { return 0, authErr() }) - var providerErr *ProviderError - if !errors.As(err, &providerErr) || providerErr.StatusCode != 401 { + providerErr, ok := errors.AsType[*ProviderError](err) + if !ok || providerErr.StatusCode != 401 { t.Fatalf("expected original 401 ProviderError, got %T: %v", err, err) } if attempts != 1 { From 91ec35643424b9e7fd9cb38740c21ae3c4ecf32d Mon Sep 17 00:00:00 2001 From: Lars Artmann Date: Tue, 20 Oct 2026 15:16:06 +0200 Subject: [PATCH 148/156] ci: fix govulncheck (#423) --- .github/workflows/lint.yml | 2 +- go.mod | 4 ++-- go.sum | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 00ba969d9..c0ff86023 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -9,6 +9,6 @@ jobs: uses: charmbracelet/meta/.github/workflows/lint.yml@main with: golangci_path: .golangci.yml - golangci_version: v2.13.2 + golangci_version: v2.15.0 timeout: 10m os: '["ubuntu-latest"]' diff --git a/go.mod b/go.mod index 493dded2a..e6341fc93 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module charm.land/fantasy -go 1.27.0 +go 1.27.2 require ( charm.land/x/vcr v0.1.1 @@ -19,7 +19,7 @@ require ( github.com/joho/godotenv v1.5.1 github.com/kaptinlin/jsonschema v0.9.10 github.com/stretchr/testify v1.12.1 - golang.org/x/net v0.59.0 + golang.org/x/net v0.60.0 golang.org/x/oauth2 v0.37.0 google.golang.org/genai v1.71.0 ) diff --git a/go.sum b/go.sum index 5d9e6eba1..35e3531b1 100644 --- a/go.sum +++ b/go.sum @@ -237,8 +237,8 @@ golang.org/x/crypto v0.57.0 h1:3ZVCjf8Ggz7zneR/EHRVx68Ctf+2pmIMP2UFhh9cC6M= golang.org/x/crypto v0.57.0/go.mod h1:Fdz0i5U6CoizGwLda9DttjSk6qlZo25zYNtR+ycvuZA= golang.org/x/image v0.46.0 h1:b1+oYj0Jbp6K5MDT4i4/eZpYlk3V8SJhhDKh6LBHAyQ= golang.org/x/image v0.46.0/go.mod h1:3B3W05VGVQyuXucLINLjXKrqISASfi4Xj+iCVkLMwew= -golang.org/x/net v0.59.0 h1:5zfYln+w5XCxwrnMMJPufRgNoXEaGxl0wo5GqPXyues= -golang.org/x/net v0.59.0/go.mod h1:2DA/G1UfVbCpQPeWTmMPGY7Cs2PkBkwu743bVX5PIVg= +golang.org/x/net v0.60.0 h1:79p50tfZlm0J9YfoDsSi639qSXNGVwEzOPLCxM2FsYU= +golang.org/x/net v0.60.0/go.mod h1:2DA/G1UfVbCpQPeWTmMPGY7Cs2PkBkwu743bVX5PIVg= golang.org/x/oauth2 v0.37.0 h1:JUlcxA8oAtauLfiH8FX2/FkAWHAdi0QtGCGc+hofE98= golang.org/x/oauth2 v0.37.0/go.mod h1:IxwZNxUULJmpBFf9K/9NTMSIfZZuvuTy1gGxhigP/58= golang.org/x/sync v0.23.0 h1:KameEIfc1IkluZyXWLn39Wd4tURc6GbCiISGiZm2bQk= From fbc40756f99bd4c465c5a23f9754af91ef1b5390 Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Thu, 22 Oct 2026 17:33:16 -0300 Subject: [PATCH 149/156] fix(openai): recognize parasail's prompt-length error as context overflow (#431) Parasail reports an oversized prompt with "this model's maximum context length is N tokens, but the prompt contains M input tokens", which was not matched, so a context overflow looked like a generic provider failure. Capture the maximum and used token counts so it is handled like the other providers. Assisted-by: Crush:prism --- providers/openai/error.go | 7 +++++++ providers/openai/openai_test.go | 7 +++++++ 2 files changed, 14 insertions(+) diff --git a/providers/openai/error.go b/providers/openai/error.go index 68033bfd2..1fc8d707e 100644 --- a/providers/openai/error.go +++ b/providers/openai/error.go @@ -20,6 +20,7 @@ var ( alibabaContextPattern = regexp.MustCompile(`Range of input length should be \[\d+,\s*(\d+)\]`) basetenContextPattern = regexp.MustCompile(`Input length (\d+) exceeds the maximum allowed input length of (\d+) tokens`) fireworksContextPattern = regexp.MustCompile(`The prompt is too long:\s*(\d+),\s*model maximum context length:\s*(\d+)`) + parasailContextPattern = regexp.MustCompile(`maximum context length is (\d+) tokens, but the prompt contains (\d+) input tokens`) vercelContextPattern = regexp.MustCompile(`Input too long:\s*(\d+)\s*input tokens,\s*limit is\s*(\d+)`) ) @@ -104,6 +105,12 @@ func parseContextTooLargeError(message string, providerErr *fantasy.ProviderErro providerErr.ContextMaxTokens, _ = strconv.Atoi(matches[2]) return } + if matches := parasailContextPattern.FindStringSubmatch(message); matches != nil { + providerErr.ContextTooLargeErr = true + providerErr.ContextMaxTokens, _ = strconv.Atoi(matches[1]) + providerErr.ContextUsedTokens, _ = strconv.Atoi(matches[2]) + return + } if matches := vercelContextPattern.FindStringSubmatch(message); matches != nil { providerErr.ContextTooLargeErr = true providerErr.ContextUsedTokens, _ = strconv.Atoi(matches[1]) diff --git a/providers/openai/openai_test.go b/providers/openai/openai_test.go index 94fec16a1..ad52cd0bf 100644 --- a/providers/openai/openai_test.go +++ b/providers/openai/openai_test.go @@ -4016,6 +4016,13 @@ func TestParseContextTooLargeError(t *testing.T) { wantUsed: 1261484, wantMax: 1048573, }, + { + name: "matches parasail format", + message: "this model's maximum context length is 1048576 tokens, but the prompt contains 1210787 input tokens", + wantErr: true, + wantUsed: 1210787, + wantMax: 1048576, + }, { name: "matches vercel format", message: "Input too long: 518063 input tokens, limit is 262144 for this model", From 032caa134fc34977855350ef532f78ddfa4188b2 Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Thu, 22 Oct 2026 17:34:31 -0300 Subject: [PATCH 150/156] v0.45.4 --- version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.txt b/version.txt index 460e2afaa..ac8f038e0 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -0.45.3 +0.45.4 From 8908c1a89143c242ee5e86881b394abf1df2872a Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Fri, 23 Oct 2026 10:06:03 -0300 Subject: [PATCH 151/156] fix(openai): recognize parasail's alternative context message Assisted-by: Crush:prism --- providers/openai/error.go | 21 ++++++++++++++------- providers/openai/openai_test.go | 7 +++++++ 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/providers/openai/error.go b/providers/openai/error.go index 1fc8d707e..31d85f1fc 100644 --- a/providers/openai/error.go +++ b/providers/openai/error.go @@ -16,12 +16,13 @@ import ( ) var ( - openaiContextPattern = regexp.MustCompile(`maximum context length (?:is|of) (\d+) tokens.*?(?:resulted in|requested) ~?(\d+) tokens`) - alibabaContextPattern = regexp.MustCompile(`Range of input length should be \[\d+,\s*(\d+)\]`) - basetenContextPattern = regexp.MustCompile(`Input length (\d+) exceeds the maximum allowed input length of (\d+) tokens`) - fireworksContextPattern = regexp.MustCompile(`The prompt is too long:\s*(\d+),\s*model maximum context length:\s*(\d+)`) - parasailContextPattern = regexp.MustCompile(`maximum context length is (\d+) tokens, but the prompt contains (\d+) input tokens`) - vercelContextPattern = regexp.MustCompile(`Input too long:\s*(\d+)\s*input tokens,\s*limit is\s*(\d+)`) + openaiContextPattern = regexp.MustCompile(`maximum context length (?:is|of) (\d+) tokens.*?(?:resulted in|requested) ~?(\d+) tokens`) + alibabaContextPattern = regexp.MustCompile(`Range of input length should be \[\d+,\s*(\d+)\]`) + basetenContextPattern = regexp.MustCompile(`Input length (\d+) exceeds the maximum allowed input length of (\d+) tokens`) + fireworksContextPattern = regexp.MustCompile(`The prompt is too long:\s*(\d+),\s*model maximum context length:\s*(\d+)`) + parasailOneContextPattern = regexp.MustCompile(`maximum context length is (\d+) tokens, but the prompt contains (\d+) input tokens`) + parasailTwoContextPattern = regexp.MustCompile(`maximum context length is (\d+) tokens\. However, you requested \d+ output tokens and your prompt contains at least (\d+) input tokens`) + vercelContextPattern = regexp.MustCompile(`Input too long:\s*(\d+)\s*input tokens,\s*limit is\s*(\d+)`) ) func toProviderErr(err error) error { @@ -105,7 +106,13 @@ func parseContextTooLargeError(message string, providerErr *fantasy.ProviderErro providerErr.ContextMaxTokens, _ = strconv.Atoi(matches[2]) return } - if matches := parasailContextPattern.FindStringSubmatch(message); matches != nil { + if matches := parasailOneContextPattern.FindStringSubmatch(message); matches != nil { + providerErr.ContextTooLargeErr = true + providerErr.ContextMaxTokens, _ = strconv.Atoi(matches[1]) + providerErr.ContextUsedTokens, _ = strconv.Atoi(matches[2]) + return + } + if matches := parasailTwoContextPattern.FindStringSubmatch(message); matches != nil { providerErr.ContextTooLargeErr = true providerErr.ContextMaxTokens, _ = strconv.Atoi(matches[1]) providerErr.ContextUsedTokens, _ = strconv.Atoi(matches[2]) diff --git a/providers/openai/openai_test.go b/providers/openai/openai_test.go index ad52cd0bf..c48e194ce 100644 --- a/providers/openai/openai_test.go +++ b/providers/openai/openai_test.go @@ -4023,6 +4023,13 @@ func TestParseContextTooLargeError(t *testing.T) { wantUsed: 1210787, wantMax: 1048576, }, + { + name: "matches parasail format with requested output", + message: "This model's maximum context length is 1048576 tokens. However, you requested 16000 output tokens and your prompt contains at least 1032577 input tokens, for a total of at least 1048577 tokens. Please reduce the length of the input prompt or the number of requested output tokens. (parameter=input_tokens, value=1032577)", + wantErr: true, + wantUsed: 1032577, + wantMax: 1048576, + }, { name: "matches vercel format", message: "Input too long: 518063 input tokens, limit is 262144 for this model", From 07bdedba9aa1346ec2d45b38f2a2f6b746503cbc Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Fri, 23 Oct 2026 10:09:14 -0300 Subject: [PATCH 152/156] v0.45.5 --- version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.txt b/version.txt index ac8f038e0..d5a51828f 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -0.45.4 +0.45.5 From 28d60cb0e9be8cd4b23ad4751d0b2af17c392196 Mon Sep 17 00:00:00 2001 From: William Kennedy Date: Fri, 23 Oct 2026 12:28:52 -0500 Subject: [PATCH 153/156] chore(deps): bump kronk to v1.33.0 (#432) Update both modules and adapt the Kronk provider to the typed NUMA strategy and string model metadata. Remove the unsupported per-model offload minimum batch option. Amp-Thread-ID: https://ampcode.com/threads/T-01a169a1-9771-71c8-a7ed-cf942193f399 Co-authored-by: Amp --- examples/go.mod | 159 ++++++------ examples/go.sum | 342 +++++++++++++------------ go.mod | 132 +++++----- go.sum | 276 ++++++++++---------- providers/kronk/language_model_test.go | 4 +- providers/kronk/options.go | 7 +- providers/kronk/provider_options.go | 2 +- 7 files changed, 460 insertions(+), 462 deletions(-) diff --git a/examples/go.mod b/examples/go.mod index b2765b8f4..ad77e3f29 100644 --- a/examples/go.mod +++ b/examples/go.mod @@ -1,6 +1,6 @@ module charm.land/fantasy/examples -go 1.26.6 +go 1.27.3 replace charm.land/fantasy => ../ @@ -14,36 +14,35 @@ require ( require ( cel.dev/expr v0.25.3 // indirect cloud.google.com/go v0.123.0 // indirect - cloud.google.com/go/auth v0.23.1 // indirect - cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect - cloud.google.com/go/compute/metadata v0.9.0 // indirect - cloud.google.com/go/iam v1.13.0 // indirect - cloud.google.com/go/monitoring v1.30.0 // indirect - cloud.google.com/go/storage v1.64.0 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.35.0 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.59.0 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.59.0 // indirect - github.com/anthropics/anthropic-sdk-go v1.63.1 // indirect - github.com/ardanlabs/jinja v1.6.0 // indirect - github.com/ardanlabs/kronk v1.31.5 // indirect - github.com/aws/aws-sdk-go-v2 v1.43.6 // indirect - github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.18 // indirect - github.com/aws/aws-sdk-go-v2/config v1.32.37 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.19.36 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.37 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.37 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.37 // indirect - github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.38 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.17 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.30 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.37 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.38 // indirect - github.com/aws/aws-sdk-go-v2/service/s3 v1.107.2 // indirect - github.com/aws/aws-sdk-go-v2/service/signin v1.5.6 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.33.6 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.38.6 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.45.6 // indirect - github.com/aws/smithy-go v1.27.8 // indirect + cloud.google.com/go/auth v0.24.1 // indirect + cloud.google.com/go/auth/oauth2adapt v0.3.0 // indirect + cloud.google.com/go/compute/metadata v0.10.0 // indirect + cloud.google.com/go/iam v1.14.0 // indirect + cloud.google.com/go/monitoring v1.31.0 // indirect + cloud.google.com/go/storage v1.69.0 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.62.0 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.62.0 // indirect + github.com/anthropics/anthropic-sdk-go v1.75.0 // indirect + github.com/ardanlabs/jinja v1.9.0 // indirect + github.com/ardanlabs/kronk v1.33.0 // indirect + github.com/aws/aws-sdk-go-v2 v1.47.3 // indirect + github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.22 // indirect + github.com/aws/aws-sdk-go-v2/config v1.33.9 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.20.9 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.20.3 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.5.6 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.8.6 // indirect + github.com/aws/aws-sdk-go-v2/internal/v4a v1.5.6 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.21 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.11.7 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.14.6 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.20.6 // indirect + github.com/aws/aws-sdk-go-v2/service/s3 v1.114.3 // indirect + github.com/aws/aws-sdk-go-v2/service/signin v1.10.4 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.38.4 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.43.4 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.51.4 // indirect + github.com/aws/smithy-go v1.28.6 // indirect github.com/bahlo/generic-list-go v0.2.0 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d // indirect @@ -51,89 +50,91 @@ require ( github.com/cenkalti/backoff/v5 v5.0.3 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/charmbracelet/colorprofile v0.3.2 // indirect + github.com/charmbracelet/openai-go v0.0.0-20260921175203-216db9e71b83 // indirect github.com/charmbracelet/x/ansi v0.10.2 // indirect github.com/charmbracelet/x/cellbuf v0.0.14-0.20250811133356-e0c5dbe5ea4a // indirect - github.com/charmbracelet/x/exp/slice v0.0.0-20250904123553-b4e2667e5ad5 // indirect + github.com/charmbracelet/x/exp/slice v0.1.0 // indirect github.com/charmbracelet/x/exp/strings v0.1.0 // indirect github.com/charmbracelet/x/json v0.2.0 // indirect github.com/cncf/xds/go v0.0.0-20260202195803-dba9d589def2 // indirect - github.com/ebitengine/purego v0.10.2 // indirect - github.com/envoyproxy/go-control-plane/envoy v1.39.0 // indirect + github.com/coder/websocket v1.8.15 // indirect + github.com/ebitengine/purego v0.11.2 // indirect + github.com/envoyproxy/go-control-plane/envoy v1.40.0 // indirect github.com/envoyproxy/protoc-gen-validate v1.3.3 // indirect github.com/felixge/httpsnoop v1.1.0 // indirect - github.com/go-jose/go-jose/v4 v4.1.4 // indirect - github.com/go-json-experiment/json v0.0.0-20260623181947-01eb4420fa68 // indirect + github.com/go-jose/go-jose/v4 v4.1.6 // indirect github.com/go-logfmt/logfmt v0.6.0 // indirect github.com/go-logr/logr v1.4.4 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-viper/mapstructure/v2 v2.5.0 // indirect github.com/goccy/go-yaml v1.19.2 // indirect github.com/google/go-cmp v0.7.0 // indirect - github.com/google/s2a-go v0.1.9 // indirect + github.com/google/s2a-go v0.1.11 // indirect github.com/google/uuid v1.6.0 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.3.21 // indirect - github.com/googleapis/gax-go/v2 v2.23.0 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.3.23 // indirect + github.com/googleapis/gax-go/v2 v2.27.0 // indirect github.com/gorilla/websocket v1.5.3 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.30.0 // indirect - github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.74 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.32.0 // indirect + github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.76 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect - github.com/hashicorp/go-getter v1.8.8 // indirect + github.com/hashicorp/go-getter v1.8.10 // indirect github.com/hashicorp/go-version v1.9.0 // indirect - github.com/hybridgroup/yzma v1.23.0 // indirect + github.com/hybridgroup/yzma v1.30.1-0.20261020171642-4e61a127c953 // indirect github.com/invopop/jsonschema v0.14.0 // indirect - github.com/jupiterrider/ffi v0.7.0 // indirect + github.com/jupiterrider/ffi v0.8.0 // indirect github.com/kaptinlin/jsonpointer v0.4.28 // indirect - github.com/kaptinlin/jsonschema v0.9.8 // indirect - github.com/klauspost/compress v1.19.2 // indirect + github.com/kaptinlin/jsonschema v0.9.10 // indirect + github.com/klauspost/compress v1.20.3 // indirect github.com/lucasb-eyer/go-colorful v1.3.0 // indirect github.com/mattn/go-runewidth v0.0.17 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/muesli/cancelreader v0.2.2 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect - github.com/openai/openai-go/v3 v3.50.0 // indirect github.com/pb33f/ordered-map/v2 v2.3.1 // indirect github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect - github.com/prometheus/client_golang v1.24.1 // indirect - github.com/prometheus/client_model v0.6.2 // indirect - github.com/prometheus/common v0.70.1 // indirect - github.com/prometheus/procfs v0.21.1 // indirect + github.com/prometheus/client_golang v1.25.0 // indirect + github.com/prometheus/client_model v0.6.3 // indirect + github.com/prometheus/common v0.72.1 // indirect + github.com/prometheus/procfs v0.22.0 // indirect github.com/rivo/uniseg v0.4.7 // indirect - github.com/spiffe/go-spiffe/v2 v2.8.1 // indirect + github.com/spiffe/go-spiffe/v2 v2.9.0 // indirect github.com/standard-webhooks/standard-webhooks/libraries v0.0.1 // indirect github.com/tidwall/gjson v1.19.0 // indirect github.com/tidwall/match v1.1.1 // indirect github.com/tidwall/pretty v1.2.1 // indirect github.com/tidwall/sjson v1.2.5 // indirect - github.com/ulikunitz/xz v0.5.16 // indirect + github.com/ulikunitz/xz v0.5.17 // indirect github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect + github.com/yosida95/uritemplate/v3 v3.0.2 // indirect go.opentelemetry.io/auto/sdk v1.2.1 // indirect - go.opentelemetry.io/contrib/detectors/gcp v1.45.0 // indirect - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.70.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.70.0 // indirect - go.opentelemetry.io/otel v1.45.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.45.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.45.0 // indirect - go.opentelemetry.io/otel/metric v1.45.0 // indirect - go.opentelemetry.io/otel/sdk v1.45.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.45.0 // indirect - go.opentelemetry.io/otel/trace v1.45.0 // indirect - go.opentelemetry.io/proto/otlp v1.11.0 // indirect + go.opentelemetry.io/contrib/detectors/gcp v1.47.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.72.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.72.0 // indirect + go.opentelemetry.io/otel v1.47.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.47.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.47.0 // indirect + go.opentelemetry.io/otel/log v1.47.0 // indirect + go.opentelemetry.io/otel/metric v1.47.0 // indirect + go.opentelemetry.io/otel/sdk v1.47.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.47.0 // indirect + go.opentelemetry.io/otel/trace v1.47.0 // indirect + go.opentelemetry.io/proto/otlp v1.11.1 // indirect go.yaml.in/yaml/v2 v2.4.4 // indirect go.yaml.in/yaml/v4 v4.0.0-rc.3 // indirect - golang.org/x/crypto v0.55.0 // indirect - golang.org/x/exp v0.0.0-20260312153236-7ab1446f8b90 // indirect - golang.org/x/image v0.45.0 // indirect - golang.org/x/net v0.58.0 // indirect - golang.org/x/oauth2 v0.36.0 // indirect - golang.org/x/sync v0.22.0 // indirect - golang.org/x/sys v0.47.0 // indirect - golang.org/x/text v0.41.0 // indirect - golang.org/x/time v0.15.0 // indirect - google.golang.org/api v0.293.0 // indirect - google.golang.org/genai v1.68.0 // indirect - google.golang.org/genproto v0.0.0-20260818201246-1b0934165a6f // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20260818201246-1b0934165a6f // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20260818201246-1b0934165a6f // indirect - google.golang.org/grpc v1.83.0 // indirect + golang.org/x/crypto v0.58.0 // indirect + golang.org/x/exp v0.0.0-20261014143641-f0251eb4aa3e // indirect + golang.org/x/image v0.47.0 // indirect + golang.org/x/net v0.61.0 // indirect + golang.org/x/oauth2 v0.37.0 // indirect + golang.org/x/sync v0.24.0 // indirect + golang.org/x/sys v0.49.0 // indirect + golang.org/x/text v0.43.0 // indirect + golang.org/x/time v0.16.0 // indirect + google.golang.org/api v0.307.0 // indirect + google.golang.org/genai v1.71.0 // indirect + google.golang.org/genproto v0.0.0-20261019180522-ce908d29299b // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20261019180522-ce908d29299b // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20261019180522-ce908d29299b // indirect + google.golang.org/grpc v1.84.0 // indirect google.golang.org/protobuf v1.36.12 // indirect ) diff --git a/examples/go.sum b/examples/go.sum index 00f0e5a57..a0a19b2a0 100644 --- a/examples/go.sum +++ b/examples/go.sum @@ -2,74 +2,72 @@ cel.dev/expr v0.25.3 h1:A2jO8jwOugrrovveCWfj0KEZOfqiLgAcwjpHPhzIGw0= cel.dev/expr v0.25.3/go.mod h1:hrXvqGP6G6gyx8UAHSHJ5RGk//1Oj5nXQ2NI02Nrsg4= cloud.google.com/go v0.123.0 h1:2NAUJwPR47q+E35uaJeYoNhuNEM9kM8SjgRgdeOJUSE= cloud.google.com/go v0.123.0/go.mod h1:xBoMV08QcqUGuPW65Qfm1o9Y4zKZBpGS+7bImXLTAZU= -cloud.google.com/go/auth v0.23.1 h1:1tPpBPG02lQHmoiAvs9egyCASqXP0xgobptjZzov/Jg= -cloud.google.com/go/auth v0.23.1/go.mod h1:4DhBRcqvtljQN3dJ57qtqbib5ZGCYE5f2crfiiC2EM0= -cloud.google.com/go/auth/oauth2adapt v0.2.8 h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIiLpZnkHRbnc= -cloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c= -cloud.google.com/go/compute/metadata v0.9.0 h1:pDUj4QMoPejqq20dK0Pg2N4yG9zIkYGdBtwLoEkH9Zs= -cloud.google.com/go/compute/metadata v0.9.0/go.mod h1:E0bWwX5wTnLPedCKqk3pJmVgCBSM6qQI1yTBdEb3C10= -cloud.google.com/go/iam v1.13.0 h1:ufT3FPT5rFFXu6UtLkNoxaOaV5EuA1dsSkmemCSTo6U= -cloud.google.com/go/iam v1.13.0/go.mod h1:gHXdDEiPDvqd1q1KwBDGQlgZY/BwY760zU2LhOZS5w0= -cloud.google.com/go/logging v1.19.1 h1:7SsLhyTDBDrJw+Ll6Ns3I2mByqHXvJUc3rGjSlwiWgU= -cloud.google.com/go/logging v1.19.1/go.mod h1:2IkQ/d8jVJqV2qW8ZUGUiMjdZG1gkLD2JReGbZ8isqg= -cloud.google.com/go/longrunning v1.2.0 h1:WjYH3YHBGCxGJP9M4dWGHBfXr/cFIjMkNgWcJj7/iMM= -cloud.google.com/go/longrunning v1.2.0/go.mod h1:5KMQALFGOCtFoi2xSOA1u3H7WKlhmckgiyFw7+LGQp0= -cloud.google.com/go/monitoring v1.30.0 h1:r/d+JUbyKmJ8b07iznuKfzVzrIXTWxHQ3lBRm3x2LlY= -cloud.google.com/go/monitoring v1.30.0/go.mod h1:htlUR0QWVMrjFzZmN4LGnMAve9xB/eduwjmINxVZ8RM= -cloud.google.com/go/storage v1.64.0 h1:KLpxI/oX9LxeRsNqn877d2WyeT3ryiEwnGt8pwcSPZg= -cloud.google.com/go/storage v1.64.0/go.mod h1:lWyAtwvDZHdL3k68WVKbESP6bmWaV23ZJJ/JEVw/ZaQ= +cloud.google.com/go/auth v0.24.1 h1:NTmd2iJb4DsGIav0KiqFMYI88nMshA2wnFMBatRmoCs= +cloud.google.com/go/auth v0.24.1/go.mod h1:1dmBXa9xfBvBr39ZnDUDkaaA91ccq9CcqENDgJA4d7c= +cloud.google.com/go/auth/oauth2adapt v0.3.0 h1:FY8oSZpCYoUNv6QxVODuMjQz4IlSOVeiQtZ08vLPz88= +cloud.google.com/go/auth/oauth2adapt v0.3.0/go.mod h1:7+2uCm7++XFO+/lN06c2HXpDXb/NMNn2/UwyBPbTnkk= +cloud.google.com/go/compute/metadata v0.10.0 h1:pyKMUQSwchgkIBBJGdILqQbs/BNJXqwSA7Ej6LAvvtY= +cloud.google.com/go/compute/metadata v0.10.0/go.mod h1:rGFHRrIif570kSibjFTMbt6/4/tzgJWFGI/HVol4GIk= +cloud.google.com/go/iam v1.14.0 h1:YRIB1/4xxwJ+NfI6RQr1WaOoHHeV0MizJEj940nBXJA= +cloud.google.com/go/iam v1.14.0/go.mod h1:JTPZfbHdGXJrOYREtkRoFzCDGaBdbA7ILLKO/DDuav0= +cloud.google.com/go/logging v1.20.0 h1:l7yzCB8/JSY5PHT9RsaqdT1jaBGbM6KlSJDX210HlXM= +cloud.google.com/go/logging v1.20.0/go.mod h1:ALUaJQZM691Eeujy9kFx0xREq3AMPuGd+pTRZuTYv+w= +cloud.google.com/go/longrunning v1.3.0 h1:lZ6c8SJJBmILp/Wnr3vGnBLa0q+cYfSHRCcUfVI2hpI= +cloud.google.com/go/longrunning v1.3.0/go.mod h1:wpgLxCn+UA3/TZ1bj/fW39mfDpwVlMPu1xKJyoMt7V0= +cloud.google.com/go/monitoring v1.31.0 h1:LCuAoYiq8snyL/eDAG/VC73uWFXeax8+YEfmoNGJUrY= +cloud.google.com/go/monitoring v1.31.0/go.mod h1:7uk2dIJIf7ra64dI1VuQ0ttoFqvtKjdzq46u6zNP1hU= +cloud.google.com/go/storage v1.69.0 h1:jAAMC1411HEh78nKsU0Zns+eFj3TnhjAWIhg5Ud/XBM= +cloud.google.com/go/storage v1.69.0/go.mod h1:PELYsxTYm2peE4mwLEC1+mS1dA/kUSRUxNv56rOy44g= cloud.google.com/go/trace v1.16.0 h1:GmQovzFc5F0CNfl0VLgL64aoTtu7xsM0YajW2GlG9+E= cloud.google.com/go/trace v1.16.0/go.mod h1:r+bdAn16dKLSV1G2D5v3e58IlQlizfxWrUfjx7kM7X0= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.35.0 h1:bN1gA3of5bXtbnLsRPrwfmbbe7A5UWFlcTHseujLnpc= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.35.0/go.mod h1:Yj5vHEz/aAepZGliRJsA6uvHAVAQyEwajq9ORCHPxzM= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.59.0 h1:c/Ivw7FuawPLfrr+zB0LZKeCchO2cAHQpF2qZ6OV7rQ= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.59.0/go.mod h1:Zba7lknY/d78oxbKqFTmCsaGwfpzeJ3ktrrLXtnTV6g= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.59.0 h1:xTXsqDOj5k9mK3VVWHYUryryJCIdYfXxdjKFwpzINUw= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.59.0/go.mod h1:V9g30lTKzfUsEW+gpWssck6u9IhARajmipodImLLcwI= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.59.0 h1:18FRm6ZcN/x9+ZmhMr96hLcTtlLn2/gHPuDLVeg7XcY= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.59.0/go.mod h1:YqwkQPrWSC7+byyc1VlKbWLBF5JsW5IoL6xUkemYSXk= -github.com/anthropics/anthropic-sdk-go v1.63.1 h1:M9dIoZzUWB453ulVpBkQp3FX0769udzrTscDrsJk1w4= -github.com/anthropics/anthropic-sdk-go v1.63.1/go.mod h1:3EfIfmFqxH6rbiLcIP4tPFyXL/IHakx2wDG4OU+TIEI= -github.com/ardanlabs/jinja v1.6.0 h1:CbqS/dxYM9qrmlBed1GsN64/tRY6SoWQWc5Sc+aw3iI= -github.com/ardanlabs/jinja v1.6.0/go.mod h1:aXXzlJfjA+T3XNKA/YT5ZtDq2VJxt5a5siZ8cl9B35Q= -github.com/ardanlabs/kronk v1.31.5 h1:pU335FU7KOT2Mv4j4e2S+QaAVYumTRYYKgISkzrQT7Q= -github.com/ardanlabs/kronk v1.31.5/go.mod h1:ub5hRgH9xtMTTQOtBTPwzP67fx0dDwZGLwrWDpp+fuQ= -github.com/aws/aws-sdk-go-v2 v1.43.6 h1:RrmFcqCBxkJuf7g1axVo5krB4jM/AO8r5e5oujrgdoQ= -github.com/aws/aws-sdk-go-v2 v1.43.6/go.mod h1:tXpPM+v0D1lndmga+HqqLDIzUFJlEeR21aspVklHF00= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.18 h1:LAfOuhAH331fmOjTQpAaOlH+Ftn7RzSDJ2VFwjdMMy4= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.18/go.mod h1:4e5xhuXHx1e4U9EthvbPP1r/DIMp5c2823OL8karzcM= -github.com/aws/aws-sdk-go-v2/config v1.32.37 h1:Ljl7LOJB6ym0liuEl0+TZ3d7f5I8MEZN1Cj9PINlj/g= -github.com/aws/aws-sdk-go-v2/config v1.32.37/go.mod h1:WJ7pe7ZPpmG8Q5kKS53zeypIV4FBGACxmte8Uc6SgUc= -github.com/aws/aws-sdk-go-v2/credentials v1.19.36 h1:84s5xMme6ENYEdKG8rsbSFFg/8+lbHBeM9QYSO0gnDk= -github.com/aws/aws-sdk-go-v2/credentials v1.19.36/go.mod h1:c46BLdagDLIswjgt+GeQOslXgeS0E6wCacs5yZbxPGk= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.37 h1:b5tb+CZItBkydC7r3hTNdSO3pszG1R2EtnA+7TePQPk= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.37/go.mod h1:ZQ+6SU9X0oz6+7MUCSswv9Mjci4eaqZr21HI2RVy/yA= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.37 h1:lznzIOvvbqjfe8UAaciCRJgBgJsxuTROKlhZuXQWfv8= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.37/go.mod h1:otfkzyfQeMMLZAqX59GSXTL3o22BR/l6HFaRzzbWSqA= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.37 h1:zCEORWo0eU0gDjG+IyApE/2B+ZGG1m+GU7B263XV8ds= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.37/go.mod h1:i6c0PEl3TNOWxRbQ++KQcVenPWS/GoQeiklKhNuqzJ8= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.38 h1:A3UAuCmx7LyUcrixBTzKJYYIUZ2yTvn6ZhT8PB+7APk= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.38/go.mod h1:1PDUYG9Z+JrbbsobsAZHjWOm9QBT/djiK3QbykTL5Z4= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.17 h1:OvYZOB3qA6zvfdRFiRFRzVSiElMYrz3GdntkXZxlp1o= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.17/go.mod h1:JgR/2Ew50ACfIWau1oeMRX59tMtC0kM+PYQGEaT04cY= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.30 h1:5437eMoOwqqQpZn2XJy74mlDCuPYL81texMT3mXqgtU= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.30/go.mod h1:xfu2m3dOpvW8lj98wQYa8V9ku/Rta59hsbireGzhh3A= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.37 h1:a3D4AjrOrTrP8+d9ILBthqrElf0z1JNol09Xvnwcys8= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.37/go.mod h1:ky0gTu+ukvUTuUKFIpp6Wid4oninrkCyvbFkVs0kpHM= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.38 h1:gX8B8y3Ho30B1LPxefDKMi/HZqWEb47U9ogs3DtSG0M= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.38/go.mod h1:l5WblZlcmGPe4/O7JY2HO25Z+xqTBvyfTyFbRMf8gYw= -github.com/aws/aws-sdk-go-v2/service/s3 v1.107.2 h1:GNU0/xtPEXMKilJZ/a8BedeuQnvu+Usi6qVm9EFfncc= -github.com/aws/aws-sdk-go-v2/service/s3 v1.107.2/go.mod h1:4jYWUecEsQtE73jPl7p3jrbYXH5ffcR4gegyCygagfg= -github.com/aws/aws-sdk-go-v2/service/signin v1.5.6 h1:i68sFvXidKlkiSvI7d7Ilc1/UvW4CtBOaivH7jhG4fs= -github.com/aws/aws-sdk-go-v2/service/signin v1.5.6/go.mod h1:/h7Obr9WTtzbjTHGASRQwLN7Bupw+TC3x8x7fyx39hE= -github.com/aws/aws-sdk-go-v2/service/sso v1.33.6 h1:tpfGChmjUmv3W9WlRvy+stwKDTbFFdq8Zk9DbFPrfMU= -github.com/aws/aws-sdk-go-v2/service/sso v1.33.6/go.mod h1:CSjiDzmG/lsKkTOYjbkM+duLmRlW+LOxD64Na44ijnI= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.38.6 h1:49BBtY68A+KJCQ3a2F3eUe6ROsKucxUdfHKoqorc0wI= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.38.6/go.mod h1:ptG2hbs7QltE1GcQY0MpS4bfrc51KCnBXUr7OT1EEfE= -github.com/aws/aws-sdk-go-v2/service/sts v1.45.6 h1:JvExZWabChDM0qJAirQYGfOYo0ndT3edXj+fqSPNjkE= -github.com/aws/aws-sdk-go-v2/service/sts v1.45.6/go.mod h1:XZcaQkV2cItp6yEkrwljyaPOf22RuX7T43jxap/FOmM= -github.com/aws/smithy-go v1.27.8 h1:FR0dxZfIlV7Z8eh2iHfIofdunw382XsDV3Mxt9nUvRY= -github.com/aws/smithy-go v1.27.8/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.62.0 h1:5y2LR2pripbccOte6BpZ+guv5O5W0OQIfKvUYZrGaAQ= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.62.0/go.mod h1:b3f7EifFRqkVt142USoGIP62uUeZm7ALCPrs1ZjWXYo= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.62.0 h1:tRsXhJnn0w0TNwJpVrB94wsrimzjWKFzdQlUhRdNUzc= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.62.0/go.mod h1:ifhe5teRNcbxg9p353DhOkOgczzL/IBLYFqT1cm1zpM= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.62.0 h1:aPMa5qZU9dp4fU34o+jQgVIPFIOi20oxYg8TLigmZLg= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.62.0/go.mod h1:sg6Wqbl0BKKZ5zKnQj2q0qic/3ziF894SCx1LpbX37Y= +github.com/anthropics/anthropic-sdk-go v1.75.0 h1:2oajsgiYwI0Hc8E6K9GttVe6CLwZlfhdxaqFqKVUnvA= +github.com/anthropics/anthropic-sdk-go v1.75.0/go.mod h1:x+lPk/cCl48uRegeP0hlYYBN1b7bEBTveInIMgLicnY= +github.com/ardanlabs/jinja v1.9.0 h1:69fjYzJ7OmsjQvXoiiQXuPgZcMmAPHk5vTYmcOMEu7I= +github.com/ardanlabs/jinja v1.9.0/go.mod h1:VMzH0tsq4PgTbN64PqBqqqBKZvKlhkrxHVagcB5Tj8g= +github.com/ardanlabs/kronk v1.33.0 h1:wMcFpSuC4RLyugiXEcyZhkqEVJJ5CyrSSYYf60/3Wk4= +github.com/ardanlabs/kronk v1.33.0/go.mod h1:gNZ9T6t2TOTH02SS+/A7elDqT1hGs4e8jh0uNJ5OtpU= +github.com/aws/aws-sdk-go-v2 v1.47.3 h1:HRoT/MkNi3bjO5xF4dCzLzvVmkvRGHj3/cLINDnJejk= +github.com/aws/aws-sdk-go-v2 v1.47.3/go.mod h1:xSl+OSI5ZUw6bSMupWc218zE5Pl+65MCCu3ySWFY99A= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.22 h1:oiEmPz/YMMeh/JvAE8xSxNCIsvWE6lpFe4ZPlyFykQI= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.22/go.mod h1:QWUDuRi9PFjBHIU2iH1Pkldbe7zqLfXJC4wWLbF8nuQ= +github.com/aws/aws-sdk-go-v2/config v1.33.9 h1:Hv6bcQUJVnmuWaKjqD6Ot8sE75NrWsWV20oGT5aWle0= +github.com/aws/aws-sdk-go-v2/config v1.33.9/go.mod h1:ivowmrZNfBQLcg4QkaItgi5wae4Bzot9RzIdbY1hfTg= +github.com/aws/aws-sdk-go-v2/credentials v1.20.9 h1:SNO55PnWhaDafsOcv16lCA0kdoFMl/YlegWoVsU02s0= +github.com/aws/aws-sdk-go-v2/credentials v1.20.9/go.mod h1:+2reOTRtdD3VSBqpRDNwrZIYy8yMCYa7oK3WKTJ/I1I= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.20.3 h1:gr3b87OLB29jymWPzp/CAyXwQRJVE+sC4Wm0qBIKHsk= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.20.3/go.mod h1:BRjf4L/Yx2hY54o+ZibPbLJyMMeSwqYQXwcJfqW66a8= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.5.6 h1:CqL8NN3p4I0JTwwV5MEoatIl4Y2amZ2X9dRD+0hbRL0= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.5.6/go.mod h1:exdJ32hMqXl0Wyo6NwqEC5yIhtua3+PDaKE8P29m4qE= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.8.6 h1:FpBq24TG6WVSObTNhQOv7Q0088rounUUlwn3zlNItkM= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.8.6/go.mod h1:ONzdPVYC95oBOu0VWNEsKEntcoemP3xVKjT+qWml1s4= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.5.6 h1:Qmn60RWuk9+bd2ddvJJqwf3Cpac3VvGMOdbGemtUhX4= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.5.6/go.mod h1:h/YJhe4AVyQxEUMluph10iqV7mjajH7A9L+BHF5ppis= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.21 h1:e6YW5uME30TkrElR+4/xcY7NB6CCj2dcv7vtmGXhfhQ= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.21/go.mod h1:obpHAMP693+f3/A8PkLhIqfK1C+NWWn8zXzqD3OH520= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.11.7 h1:CwvFlKw0uUScfgOMflXSRZa+ayXgOf6wk7lhyMemQYU= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.11.7/go.mod h1:4SbD8BB+p+QEnG0aX6DoWwrtk9SufyYXRsUv0nve8LE= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.14.6 h1:LHHdobjo5le1sjJdolitV7uVvYg3wkaeM1Ju2fDgeZQ= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.14.6/go.mod h1:CBGB0evAiaMD3Lk4wPO7LQCcCZLuhzL5Qf/wfEUHQ5w= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.20.6 h1:mYViDr2azcgxOpRrObZOl631bvavqILoE/L+Kxgbwys= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.20.6/go.mod h1:OXVdAo9jNhggB+hJRGOyy7WolGTKB6Rg7IIulDeSzPM= +github.com/aws/aws-sdk-go-v2/service/s3 v1.114.3 h1:NyeuyXkZL476uoAowNActm4XJO1QPKf7aassgXHpiqA= +github.com/aws/aws-sdk-go-v2/service/s3 v1.114.3/go.mod h1:GfoBeKMDJecgRUsGf/0RGdx0NJAh81ObTd922h8pQys= +github.com/aws/aws-sdk-go-v2/service/signin v1.10.4 h1:tvpDjuUvgKURf3Yk4hOaGbZ4QdY+070OWcA5d6LUv2A= +github.com/aws/aws-sdk-go-v2/service/signin v1.10.4/go.mod h1:3ibVKg5Ng82Zby8++jELTD2nHxiPk2DJRLEeW/LKp8M= +github.com/aws/aws-sdk-go-v2/service/sso v1.38.4 h1:ChCtagixSFOxltv0o6E3NT8F7ksvZtZGPwUBynO5Nmk= +github.com/aws/aws-sdk-go-v2/service/sso v1.38.4/go.mod h1:+FEO9jrVMpc9oN3CdAxJbtlQEu3z8UddDPSedpeM3PY= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.43.4 h1:j6c+HA4AoS0EBEjArPjavFEBrucJEryfrQU0TffmACk= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.43.4/go.mod h1:RhghaXUk9q66VtOQUX1FdPddQuHnqQZzbB0fEYXmPRA= +github.com/aws/aws-sdk-go-v2/service/sts v1.51.4 h1:OKEfbf2tcfsF2pBk/S9QqNpo6alaAtiBs4hysCsBjPw= +github.com/aws/aws-sdk-go-v2/service/sts v1.51.4/go.mod h1:mCd6qGo9b8hTtfjgsmNkFlzwjyce4owd7HDVFnCLXhM= +github.com/aws/smithy-go v1.28.6 h1:Pj+/sUviNYjow8ELRtNwKHZ9ECeF+7pATX3+shjLIrw= +github.com/aws/smithy-go v1.28.6/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc= github.com/aymanbagabas/go-udiff v0.2.0 h1:TK0fH4MteXUDspT88n8CKzvK0X9O2xu9yQjWpi6yML8= github.com/aymanbagabas/go-udiff v0.2.0/go.mod h1:RE4Ex0qsGkTAJoQdQQCA0uG+nAzJO/pI/QwceO5fgrA= github.com/bahlo/generic-list-go v0.2.0 h1:5sz/EEAK+ls5wF+NeqDpk5+iNdMDXrh3z3nPnH1Wvgk= @@ -90,14 +88,16 @@ github.com/charmbracelet/lipgloss/v2 v2.0.0-beta1 h1:SOylT6+BQzPHEjn15TIzawBPVD0 github.com/charmbracelet/lipgloss/v2 v2.0.0-beta1/go.mod h1:tRlx/Hu0lo/j9viunCN2H+Ze6JrmdjQlXUQvvArgaOc= github.com/charmbracelet/log/v2 v2.0.0-20251001162505-358b5269b546 h1:ZcOMUkKhtM6TbQKfB6C/GusIG6hdTMybJ4gNboQpjYg= github.com/charmbracelet/log/v2 v2.0.0-20251001162505-358b5269b546/go.mod h1:ooW2QKtnlCj7Kc5Atb7TQPRo699Fy+jhtLgX6a/EAh8= +github.com/charmbracelet/openai-go v0.0.0-20260921175203-216db9e71b83 h1:7k30XdmBd71VAErGCjTTiOAE9F1KUthN9jdCeqQtvZ4= +github.com/charmbracelet/openai-go v0.0.0-20260921175203-216db9e71b83/go.mod h1:8xPfrTomjYl827L3QQay36djXcEkXc80bpH+790o8/A= github.com/charmbracelet/x/ansi v0.10.2 h1:ith2ArZS0CJG30cIUfID1LXN7ZFXRCww6RUvAPA+Pzw= github.com/charmbracelet/x/ansi v0.10.2/go.mod h1:HbLdJjQH4UH4AqA2HpRWuWNluRE6zxJH/yteYEYCFa8= github.com/charmbracelet/x/cellbuf v0.0.14-0.20250811133356-e0c5dbe5ea4a h1:zYSNtEJM9jwHbJts2k+Hroj+xQwsW1yxc4Wopdv7KaI= github.com/charmbracelet/x/cellbuf v0.0.14-0.20250811133356-e0c5dbe5ea4a/go.mod h1:rc2bsPC6MWae3LdOxNO1mOb443NlMrrDL0xEya48NNc= github.com/charmbracelet/x/exp/golden v0.0.0-20240806155701-69247e0abc2a h1:G99klV19u0QnhiizODirwVksQB91TJKV/UaTnACcG30= github.com/charmbracelet/x/exp/golden v0.0.0-20240806155701-69247e0abc2a/go.mod h1:wDlXFlCrmJ8J+swcL/MnGUuYnqgQdW9rhSD61oNMb6U= -github.com/charmbracelet/x/exp/slice v0.0.0-20250904123553-b4e2667e5ad5 h1:DTSZxdV9qQagD4iGcAt9RgaRBZtJl01bfKgdLzUzUPI= -github.com/charmbracelet/x/exp/slice v0.0.0-20250904123553-b4e2667e5ad5/go.mod h1:vI5nDVMWi6veaYH+0Fmvpbe/+cv/iJfMntdh+N0+Tms= +github.com/charmbracelet/x/exp/slice v0.1.0 h1:m46dwuDf3M5SFYMRhxYkLC6z9WnENGVKbcbJlp13/og= +github.com/charmbracelet/x/exp/slice v0.1.0/go.mod h1:vqEfX6xzqW1pKKZUUiFOKg0OQ7bCh54Q2vR/tserrRA= github.com/charmbracelet/x/exp/strings v0.1.0 h1:i69S2XI7uG1u4NLGeJPSYU++Nmjvpo9nwd6aoEm7gkA= github.com/charmbracelet/x/exp/strings v0.1.0/go.mod h1:/ehtMPNh9K4odGFkqYJKpIYyePhdp1hLBRvyY4bWkH8= github.com/charmbracelet/x/json v0.2.0 h1:DqB+ZGx2h+Z+1s98HOuOyli+i97wsFQIxP2ZQANTPrQ= @@ -106,24 +106,24 @@ github.com/charmbracelet/x/term v0.2.2 h1:xVRT/S2ZcKdhhOuSP4t5cLi5o+JxklsoEObBSg github.com/charmbracelet/x/term v0.2.2/go.mod h1:kF8CY5RddLWrsgVwpw4kAa6TESp6EB5y3uxGLeCqzAI= github.com/cncf/xds/go v0.0.0-20260202195803-dba9d589def2 h1:aBangftG7EVZoUb69Os8IaYg++6uMOdKK83QtkkvJik= github.com/cncf/xds/go v0.0.0-20260202195803-dba9d589def2/go.mod h1:qwXFYgsP6T7XnJtbKlf1HP8AjxZZyzxMmc+Lq5GjlU4= +github.com/coder/websocket v1.8.15 h1:6B2JPeOGlpff2Uz6vOEH1Vzpi0iUz20A+lPVhPHtNUA= +github.com/coder/websocket v1.8.15/go.mod h1:NX3SzP+inril6yawo5CQXx8+fk145lPDC6pumgx0mVg= github.com/dnaeon/go-vcr v1.2.0 h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI= github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= -github.com/ebitengine/purego v0.10.2 h1:W809HbnvzAxgdm+aOvlSekrM16wGCdT/e76+9tS7gzE= -github.com/ebitengine/purego v0.10.2/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/ebitengine/purego v0.11.2 h1:WWiTx8rD8zYdOwSj8O/NiNbsOvSAgJMTlyV1XlbUSeU= +github.com/ebitengine/purego v0.11.2/go.mod h1:DCHPP08djqhNSoTfImcnHYQRZmd0qhakvrozqaEYhGQ= github.com/envoyproxy/go-control-plane v0.14.0 h1:hbG2kr4RuFj222B6+7T83thSPqLjwBIfQawTkC++2HA= github.com/envoyproxy/go-control-plane v0.14.0/go.mod h1:NcS5X47pLl/hfqxU70yPwL9ZMkUlwlKxtAohpi2wBEU= -github.com/envoyproxy/go-control-plane/envoy v1.39.0 h1:1uwRDYPYG8BIBU9Mj1sUAebNmlM6beu/ZKKweSLDxk8= -github.com/envoyproxy/go-control-plane/envoy v1.39.0/go.mod h1:5e4ylfTZO723MEEFsCpSW4ZEBWR8mwkEyXfwJBTCZ9c= +github.com/envoyproxy/go-control-plane/envoy v1.40.0 h1:G4dcl8KE/HVPnZ25BBdvGZWi8JjyeBfQSvm95U5P1Qc= +github.com/envoyproxy/go-control-plane/envoy v1.40.0/go.mod h1:UZVGjwWu2QV8PkGSlXmqWiSgqCGZe16TgIu4jDl3T5w= github.com/envoyproxy/go-control-plane/ratelimit v0.1.0 h1:/G9QYbddjL25KvtKTv3an9lx6VBE2cnb8wp1vEGNYGI= github.com/envoyproxy/go-control-plane/ratelimit v0.1.0/go.mod h1:Wk+tMFAFbCXaJPzVVHnPgRKdUdwW/KdbRt94AzgRee4= github.com/envoyproxy/protoc-gen-validate v1.3.3 h1:MVQghNeW+LZcmXe7SY1V36Z+WFMDjpqGAGacLe2T0ds= github.com/envoyproxy/protoc-gen-validate v1.3.3/go.mod h1:TsndJ/ngyIdQRhMcVVGDDHINPLWB7C82oDArY51KfB0= github.com/felixge/httpsnoop v1.1.0 h1:3YtUj32ZZkqZtt3sZZsClsymw/QDuVfpNhoA31zeORc= github.com/felixge/httpsnoop v1.1.0/go.mod h1:Zqxgdd+1Rkcz8euOqdr7lqgCRJztwr5hp9vDSi5UZCE= -github.com/go-jose/go-jose/v4 v4.1.4 h1:moDMcTHmvE6Groj34emNPLs/qtYXRVcd6S7NHbHz3kA= -github.com/go-jose/go-jose/v4 v4.1.4/go.mod h1:x4oUasVrzR7071A4TnHLGSPpNOm2a21K9Kf04k1rs08= -github.com/go-json-experiment/json v0.0.0-20260623181947-01eb4420fa68 h1:KZaTBSyshWX3MP5jukJcNSuXDQTO+rNpt0J564dX/eg= -github.com/go-json-experiment/json v0.0.0-20260623181947-01eb4420fa68/go.mod h1:tphK2c80bpPhMOI4v6bIc2xWywPfbqi1Z06+RcrMkDg= +github.com/go-jose/go-jose/v4 v4.1.6 h1:sNRkftxFJxwsILiQukqp5z83QBSmntVwmgRY7AqBDO4= +github.com/go-jose/go-jose/v4 v4.1.6/go.mod h1:x4oUasVrzR7071A4TnHLGSPpNOm2a21K9Kf04k1rs08= github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4= github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= @@ -141,38 +141,38 @@ github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/martian/v3 v3.3.3 h1:DIhPTQrbPkgs2yJYdXU/eNACCG5DVQjySNRNlflZ9Fc= github.com/google/martian/v3 v3.3.3/go.mod h1:iEPrYcgCF7jA9OtScMFQyAlZZ4YXTKEtJ1E6RWzmBA0= -github.com/google/s2a-go v0.1.9 h1:LGD7gtMgezd8a/Xak7mEWL0PjoTQFvpRudN895yqKW0= -github.com/google/s2a-go v0.1.9/go.mod h1:YA0Ei2ZQL3acow2O62kdp9UlnvMmU7kA6Eutn0dXayM= +github.com/google/s2a-go v0.1.11 h1:7v1V1TraNGP63WptsAkNqr2w8jgm4vM6A6qx6Lsw9iM= +github.com/google/s2a-go v0.1.11/go.mod h1:pz4tyvwXvJLLbyrkh6FW1eS2zPUXMaTmyNhYtyP2tNw= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.3.21 h1:OFdQ3tnCX/zaQ0Cedur3D3z7kI6HiLX9g3TiAN4/DFU= -github.com/googleapis/enterprise-certificate-proxy v0.3.21/go.mod h1:L3D/IQExI6LqEjBdXcZQ1WluSgigQmSwBboFstVPM4w= -github.com/googleapis/gax-go/v2 v2.23.0 h1:Tchl7qkvE7Ip3y+ztvNufYFvkfqTe7NfLTYGIdJRLuE= -github.com/googleapis/gax-go/v2 v2.23.0/go.mod h1:rBQKOVJCdb8IFEzg+FCwlt1LP/xMDGuqUXhUG+XMXEg= +github.com/googleapis/enterprise-certificate-proxy v0.3.23 h1:J+VGF1wjAM2dU2kKUXZxJdDppRLReWP7KWcclfngQhc= +github.com/googleapis/enterprise-certificate-proxy v0.3.23/go.mod h1:Y8NO/15GNLkrXI3OR5xOFmeU3XLX1sLSdtlXgJ0zmIw= +github.com/googleapis/gax-go/v2 v2.27.0 h1:qe2iQOUzxb3fd6x6ewpIEixPQhJ+0Ihc/RRZhKA/2g0= +github.com/googleapis/gax-go/v2 v2.27.0/go.mod h1:RofiqDw3ehcG4L0H1zO3D2Itpwd3/uS/7wdmbNDF1DE= github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.30.0 h1:/Tnpcb2E0Pz/tN9s3bfEY2Q8ePCEX9iuS+cneUwncnw= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.30.0/go.mod h1:zOBXOsUaBSjKgmH4OGzV1esUpR3oUSCPYVd2cUBjKYY= -github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.74 h1:mymLUKThnV9wFvogOK8NnsMP9/vlhnjXY98gr2QIGW8= -github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.74/go.mod h1:Bh9qYL8ehmDxSg14Tk8oxFCP90XHfs6NxV1D84884xA= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.32.0 h1:QMILzF8BA7xftE4zVORkRrlv08m12St3csK4RsyRgRs= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.32.0/go.mod h1:+ZQ6iUL8+ATyxGDQNuRKpNwJFdGDUi0e7E1QL9MvI7U= +github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.76 h1:lv1kai0y585J8lMNBhyOoVQssXp3pBv5lLeKb38n+BY= +github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.76/go.mod h1:LlNlsklP+YHM+y1x1SNdOgbXIih0fyqpvB8iGik/sDo= github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= -github.com/hashicorp/go-getter v1.8.8 h1:sRakhf+EH6s0LZLO2IgBwZ6hAFp+fZOZMNREwVELV80= -github.com/hashicorp/go-getter v1.8.8/go.mod h1:fqFlibKpwfns/s4oljLB3upJspyfFLQhS7031PlfUDc= +github.com/hashicorp/go-getter v1.8.10 h1:uufJp+uacA0fSDRxclsHkiE6yUQTKgwv5b25QexgVM8= +github.com/hashicorp/go-getter v1.8.10/go.mod h1:5HyKGCQmT+I3MGAM76vk/fWpktjwxn7xruCUr9CrVuo= github.com/hashicorp/go-version v1.9.0 h1:CeOIz6k+LoN3qX9Z0tyQrPtiB1DFYRPfCIBtaXPSCnA= github.com/hashicorp/go-version v1.9.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hybridgroup/yzma v1.23.0 h1:AqwwhnPOS0I4TzRTCuWxXqGK/kY2P+QZ3+qiJOM3Jl0= -github.com/hybridgroup/yzma v1.23.0/go.mod h1:wAMtNTjSnE79jTWzaeFSsuraam0TXKCPajMHA5s+OX8= +github.com/hybridgroup/yzma v1.30.1-0.20261020171642-4e61a127c953 h1:9JeY59VBx5tXm1NPjXhBqiOkUxDUcZ5L5CtcxnDGoQg= +github.com/hybridgroup/yzma v1.30.1-0.20261020171642-4e61a127c953/go.mod h1:ovV3WQ5v3X53vqo9Izg/28QHEXaVasW9b4Kgkhk05T0= github.com/invopop/jsonschema v0.14.0 h1:MHQqLhvpNUZfw+hM3AZDYK7jxO8FZoQeQM77g8iyZjg= github.com/invopop/jsonschema v0.14.0/go.mod h1:ygm6C2EaVNMBDPpaPlnOA2pFAxBnxGjFlMZABxm9n2I= -github.com/jupiterrider/ffi v0.7.0 h1:RKsl6Ascal+3kyAqR5Qcbp83LceQMLc1VZbPfHWoNzs= -github.com/jupiterrider/ffi v0.7.0/go.mod h1:9dauhpOfNqrqk28fxuu0kkdeFtT9Qr4vbfigiuIXN7c= +github.com/jupiterrider/ffi v0.8.0 h1:IH6lto8OZaRIulQYObtZibII4tq71hXT6Z+KLBcxCcQ= +github.com/jupiterrider/ffi v0.8.0/go.mod h1:9dauhpOfNqrqk28fxuu0kkdeFtT9Qr4vbfigiuIXN7c= github.com/kaptinlin/jsonpointer v0.4.28 h1:PyxOfdml9PGpxQz+JnNLGsyzQ+Rnm+OVNTGcgbVLqgg= github.com/kaptinlin/jsonpointer v0.4.28/go.mod h1:JzeIDw1+60bryzOFea9P3zjKg8pfJHd+UIA/zfZ70x8= -github.com/kaptinlin/jsonschema v0.9.8 h1:srpfx2MAm4ecYz0zJLbz6fiW+UXiuv+vGhUqZUIWmrg= -github.com/kaptinlin/jsonschema v0.9.8/go.mod h1:TP7RFmFBNExjBE0b3fsM6RpA/9PeOzfg2g4weXqOrDg= -github.com/klauspost/compress v1.19.2 h1:hMRETovs/pu/dVWN7zIT1PGG8t509MwT6bO7XSi26R8= -github.com/klauspost/compress v1.19.2/go.mod h1:cwPg85FWrGar70rWktvGQj8/hthj3wpl0PGDogxkrSQ= +github.com/kaptinlin/jsonschema v0.9.10 h1:dnMgwshay3YVUjFEHn6Bnf5oZ3LE1iQAL4iB2vSmviM= +github.com/kaptinlin/jsonschema v0.9.10/go.mod h1:ZgmK1hBhK8zmScMktiE+DRr3U3POBHupO4TvnFntel0= +github.com/klauspost/compress v1.20.3 h1:zWNoFqq/lSuYQRim3dUXlXeA0IqwuZGicdG5ZTfY5j4= +github.com/klauspost/compress v1.20.3/go.mod h1:LUdAzn7YLVvxLpc7y3V1m40wESHTgc1422pwwBSKYuI= github.com/lucasb-eyer/go-colorful v1.3.0 h1:2/yBRLdWBZKrf7gB40FoiKfAWYQ0lqNcbuQwVHXptag= github.com/lucasb-eyer/go-colorful v1.3.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= github.com/mattn/go-runewidth v0.0.17 h1:78v8ZlW0bP43XfmAfPsdXcoNCelfMHsDmd/pkENfrjQ= @@ -183,29 +183,27 @@ github.com/muesli/cancelreader v0.2.2 h1:3I4Kt4BQjOR54NavqnDogx/MIoWBFa0StPA8ELU github.com/muesli/cancelreader v0.2.2/go.mod h1:3XuTXfFS2VjM+HTLZY9Ak0l6eUKfijIfMUZ4EgX0QYo= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/openai/openai-go/v3 v3.50.0 h1:CXn+C8a10oQiI5CMyMbCiykhITVhVxhdHX8j3CfLa2U= -github.com/openai/openai-go/v3 v3.50.0/go.mod h1:Ogjo0gDct+Jm7yCqaCjLGQGygeV8xNfNHV1/yKvCji0= github.com/pb33f/ordered-map/v2 v2.3.1 h1:5319HDO0aw4DA4gzi+zv4FXU9UlSs3xGZ40wcP1nBjY= github.com/pb33f/ordered-map/v2 v2.3.1/go.mod h1:qxFQgd0PkVUtOMCkTapqotNgzRhMPL7VvaHKbd1HnmQ= github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= -github.com/prometheus/client_golang v1.24.1 h1:JnJkREXzWxUdCuPFpIWZiPispT9xVV59uiuyR2bPlnU= -github.com/prometheus/client_golang v1.24.1/go.mod h1:F+oSRECHg4sse5ucfYpYDeIv/hu68Zo0uoHKetWnzcE= -github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= -github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= -github.com/prometheus/common v0.70.1 h1:1HvjP4D5oL3t8RsPlwxA9onvvStjtIHYE5XuuwOi/PY= -github.com/prometheus/common v0.70.1/go.mod h1:VdFUQDMZK3VLkurFUVhia6uys/0suUp86TJz5qbJRhc= -github.com/prometheus/procfs v0.21.1 h1:GljZCt+zSTS+NZq88cyQ1LjZ+RCHp3uVuabBWA5+OJI= -github.com/prometheus/procfs v0.21.1/go.mod h1:aB55Cww9pdSJVHk0hUf0inxWyyjPogFIjmHKYgMKmtY= +github.com/prometheus/client_golang v1.25.0 h1:cDtW1TcFsMi1RJc8khwCKB4VhzwV04aKqbYtNOXuiK0= +github.com/prometheus/client_golang v1.25.0/go.mod h1:j2X/4/kaQHLPnmyEU8zjmkndo1T317VpCIQEml8LTKk= +github.com/prometheus/client_model v0.6.3 h1:O0jaTVAYNxTHYInEPFJt5I3+sN8zqBtVMPTB1qyxiEo= +github.com/prometheus/client_model v0.6.3/go.mod h1:gpN5P9S7Rr6Yr92PiQ+Ixvhf6JZEkF1dnxsYL2aPBEM= +github.com/prometheus/common v0.72.1 h1:ZAiQed/nk8IIcsdzb2TlJu23NEUDyDLQ9TXTN2WRK6Y= +github.com/prometheus/common v0.72.1/go.mod h1:1IoBY4IRaJnhs2ESjNzjilP1cJ/P8pimGoomq7zRXrA= +github.com/prometheus/procfs v0.22.0 h1:6q9+/JL9IKAPbCmBrv9n5O5Ty3NKnciV5X7YGw0oics= +github.com/prometheus/procfs v0.22.0/go.mod h1:CvmFr/GVhIjIvWJZW3tgkODBQMRIf0EyWMQLHCHab58= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= -github.com/spiffe/go-spiffe/v2 v2.8.1 h1:eXZMLsu+3MLEPJyGJkolqtVrteZfQdUpOWj6LTiDl/E= -github.com/spiffe/go-spiffe/v2 v2.8.1/go.mod h1:47Q0Q9/AqGha8QLHp+kxpH4Wca7X7EnOtlIJy3mxZ3U= +github.com/spiffe/go-spiffe/v2 v2.9.0 h1:g5qTg3qIP1HXV+GzuyEfSJFVxUCpEP5Ui1OINVJHPB4= +github.com/spiffe/go-spiffe/v2 v2.9.0/go.mod h1:w2CLWKLMTX/PPYUEUPv3ltH0RXsw5S8suwNF46w9/Aw= github.com/standard-webhooks/standard-webhooks/libraries v0.0.1 h1:uOfcYT+3QungH6tIGSVCR/Y3KJmgJiHcojJbMTPDZAI= github.com/standard-webhooks/standard-webhooks/libraries v0.0.1/go.mod h1:L1MQhA6x4dn9r007T033lsaZMv9EmBAdXyU/+EF40fo= -github.com/stretchr/testify v1.12.0 h1:K6Mr6jO9JICuend/5xzTM03ydSV3vdNRYAdPSukj8uI= -github.com/stretchr/testify v1.12.0/go.mod h1:bOYBZb5qJ00vPzWfIqBUZPaxK8jWiXc6d3ErP4Ca9Gw= +github.com/stretchr/testify v1.12.1 h1:EuwCh5fleGS7H32xRwO3wRGT7DxrDhLAT6FF8MpWDWE= +github.com/stretchr/testify v1.12.1/go.mod h1:MDEgiDPPsNp5cuIrHPPCyornHKgEVbtFUmoNlxoYthg= github.com/tidwall/gjson v1.14.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/gjson v1.19.0 h1:xwxm7n691Uf3u5OFjzngavjGTh55KX5q/9w9xHW88JU= github.com/tidwall/gjson v1.19.0/go.mod h1:V37/opeE/JbLUOfH0QTXiNez2l0RUjYUhpT4szFQAfc= @@ -216,79 +214,83 @@ github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4= github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY= github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28= -github.com/ulikunitz/xz v0.5.16 h1:ld6NyySjx5lowVKwJvMRLnW5nxKX/xnpSiFYZ/Lxur0= -github.com/ulikunitz/xz v0.5.16/go.mod h1:H9Rt/W6/Qj27PGauhQc6nfCDy7vHpzsOThBSaYDoEhw= +github.com/ulikunitz/xz v0.5.17 h1:flR0y/x1hgM8EGV1AW3Xll6T413G0glV8UfBwR617V4= +github.com/ulikunitz/xz v0.5.17/go.mod h1:H9Rt/W6/Qj27PGauhQc6nfCDy7vHpzsOThBSaYDoEhw= github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavMF/ppJZNG9ZpyihvCd0w101no= github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM= +github.com/yosida95/uritemplate/v3 v3.0.2 h1:Ed3Oyj9yrmi9087+NczuL5BwkIc4wvTb5zIM+UJPGz4= +github.com/yosida95/uritemplate/v3 v3.0.2/go.mod h1:ILOh0sOhIJR3+L/8afwt/kE++YT040gmv5BQTMR2HP4= go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= -go.opentelemetry.io/contrib/detectors/gcp v1.45.0 h1:9jR0ZPRok9ryaOQ2Wx8rg5F7Aon59mxrqbVI60/vlBk= -go.opentelemetry.io/contrib/detectors/gcp v1.45.0/go.mod h1:VSme3o2fvSg5bVg0dRzyHaj4Z5EVhG+g2Fde6LKzmQA= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.70.0 h1:oECp5f+hN7nkwjU/8BxQ/q23bGPb8FIrD839owX222E= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.70.0/go.mod h1:DqEFwLumhzMBDQv9PcWbyoDxHI/4lAk6CM4nJBH39sc= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.70.0 h1:LMuyCAyfalSjDyjdC65nK6N0zoTT63+E/u95X0JovZI= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.70.0/go.mod h1:085m8qbm4hgc8rZWGDEa4vmyyo2c3nPxUslYUKUIU04= -go.opentelemetry.io/otel v1.45.0 h1:pdrWmLHofpubmArBv1LgFSv1Z0Ie/ppdZzu+kUN5EeU= -go.opentelemetry.io/otel v1.45.0/go.mod h1:XZxIqPapzEYnhNSScF5DIqXhm/rYi0FzCe2XddAwZfQ= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.45.0 h1:QRefszxJmfPdjXUUm3j6iDzY03mTPXMjqErFqQ67vUg= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.45.0/go.mod h1:Tiz03lTBVBrm7eWZBOidzEaYaJa8tjwGUGv6d8mlTyk= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.45.0 h1:fG5MCxGz8+2VtrN/WgqSpJFctVz24gpxj8CxkKmc8Ww= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.45.0/go.mod h1:BmAYTn+3ysbRe+IU2msxmf5Rx3g6DHvex+tWI3LdhYI= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.44.0 h1:hqxVTu/GtBF+vJ8d1fzW7fRxZFvgoDjWcxwwCaFDYpU= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.44.0/go.mod h1:z5fVEF4X5v0ESvlJqBrrFlBVoj5EQuefZpzsu7R+x5Q= -go.opentelemetry.io/otel/metric v1.45.0 h1:7Eg1uH7CJ5cXv9is6tnBe1FI6rj1nwUdbFypRm3br/M= -go.opentelemetry.io/otel/metric v1.45.0/go.mod h1:HAPbm1nd3p1PmFH7v2dR+6BjXxw+Lq4a2+pndMAm08s= -go.opentelemetry.io/otel/metric/x v0.67.0 h1:PcicCNZFkZ4bXfSooXdo3WN7RBOVOtjVdo1wD358Uns= -go.opentelemetry.io/otel/metric/x v0.67.0/go.mod h1:FBjCWZe6wgcqxcMtjdGiClDKXb2YxxXii0CXftE4QtI= -go.opentelemetry.io/otel/sdk v1.45.0 h1:4VVSMgQ83dUgW2aoX5f6JgLvHwIvzcuLnF9lUdCSpCw= -go.opentelemetry.io/otel/sdk v1.45.0/go.mod h1:Sr40LgXV7DsKMMJMKOhUWOgMWTfAaqvm2kF0g7ilwuA= -go.opentelemetry.io/otel/sdk/metric v1.45.0 h1:oVFszMfyj1Am6s24Vtc7wBb8BKLcwepJjNEYILuiE3o= -go.opentelemetry.io/otel/sdk/metric v1.45.0/go.mod h1:vUWUxDZvu1WVRj8JA8S0AdhsPrZoDpA2DdZauIh4mDA= -go.opentelemetry.io/otel/trace v1.45.0 h1:l/mP6Uv7oNO7/TblbhpbgMidxhq1uO/rPsikOyVhxag= -go.opentelemetry.io/otel/trace v1.45.0/go.mod h1:qoJJA2xNMnxRrdISU/kLtfUH2wNeQbiv+jhs/CxI8bc= -go.opentelemetry.io/proto/otlp v1.11.0 h1:5rrYs0Ykyj50sdU/JU0x8etU+LubXWb+gED6TbEdMIk= -go.opentelemetry.io/proto/otlp v1.11.0/go.mod h1:SmVizdCOAm3XBtG1g1NnOdhW6jtddT72hLMhv8VwA8E= +go.opentelemetry.io/contrib/detectors/gcp v1.47.0 h1:Ct6+aaiSO6Nk5SOb6PYcR7iWp+83YF/pL1OJcGqOmbg= +go.opentelemetry.io/contrib/detectors/gcp v1.47.0/go.mod h1:3N259ss0b1AVOs+fYw7lOO0mcUwNqSIpQ+Zitpuqx00= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.72.0 h1:Tq+E65HaNbZTeqcLw6QUhsV+/EIWdkfUH2CQzcrlE5M= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.72.0/go.mod h1:A+EVhDakAj1waJBPhmTszZaSr08ww8MRRKy1nB1rqck= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.72.0 h1:LxwW/9ctSCv+QkE/cLR7M91ZIkXNMqJtEMi1vCw9U8s= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.72.0/go.mod h1:tOsftB4SslBwwErVEPaenU2RpThXWPIU8DoJHEC4dyw= +go.opentelemetry.io/otel v1.47.0 h1:j7ALJ/zgkS7Z6aeJW09p8VC9804bC+PpeTfCD4XPnOM= +go.opentelemetry.io/otel v1.47.0/go.mod h1:8wS9O2qfXrYrzp6hIF/HOYJJf/wIhFPhR2xLuP+iXQU= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.47.0 h1:julhjPeUH/q/7hinbSdDdqt5h7Zw9YWmRlWRhI0jd54= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.47.0/go.mod h1:Ao2mz688LH/tFf0yMAenidq6k2YNSx6SIY2q6jDACck= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.47.0 h1:UFpxOpYPmMNUtOWhdb+nC1WELIgVf8z9higURrbzYU4= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.47.0/go.mod h1:YBGjxe3lt0jtXoEXxGrGhv/jM7oUBUDVK7zhAvNyEjc= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.45.0 h1:dm9iyzn6tioYZtwqaiBSU0TSI8Yu/8dTIbfG0+B49DY= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.45.0/go.mod h1:xAvxYjYK28qvt+yu4BYZ/zMmAjwMXINXD6JiMyeB8iI= +go.opentelemetry.io/otel/log v1.47.0 h1:cOTS1CcLbSQeZKanGJ+0JpF/+t4PELi3O3bbl2lqCcI= +go.opentelemetry.io/otel/log v1.47.0/go.mod h1:9byitSQ5pLC6PpqwGXjqdMKya6ZTswHRZh2vvXT33nw= +go.opentelemetry.io/otel/metric v1.47.0 h1:4PptaldXx3Eat1XjMZ68pPJEs5wrhlemctZE9a3UdWY= +go.opentelemetry.io/otel/metric v1.47.0/go.mod h1:ADGSXxRrXM6bjbvLo535EstVFlPpPYZm4LBKixjDHwU= +go.opentelemetry.io/otel/metric/x v0.69.0 h1:DjRLr15H83v+hCW7JA9NoJvOkYTtmq5YoDRbe9deYpM= +go.opentelemetry.io/otel/metric/x v0.69.0/go.mod h1:uVvsMPMFFyj/HUQfrUnH3JjnOQ1dwFDorgFLRBasM0k= +go.opentelemetry.io/otel/sdk v1.47.0 h1:zWXEr4j2lFefG87TU6Yg8a7ngfohIKFZHKp0Hf5hC6I= +go.opentelemetry.io/otel/sdk v1.47.0/go.mod h1:VUc24kiOeoGsxG8G9ULx3fWKvB7jMhnGE8Oi607lgR0= +go.opentelemetry.io/otel/sdk/metric v1.47.0 h1:lfISg2j93VT6yqdk9OfUaZmw/GfcZqCCV3jdXtsPnKw= +go.opentelemetry.io/otel/sdk/metric v1.47.0/go.mod h1:ypLp+mW1Nt2x+Szt3b5/i1syodyts49lMOwxpDI3VGw= +go.opentelemetry.io/otel/trace v1.47.0 h1:JOjX/Oci8K94QHddo+bbfya/Ai/nf6/dt9ZfrFNWSrM= +go.opentelemetry.io/otel/trace v1.47.0/go.mod h1:jNaSLa2PZEYFG6fRjJABAu+bw4FS08uDmPg28lTghu0= +go.opentelemetry.io/proto/otlp v1.11.1 h1:SCrPqH9NE5CmBrOqpjNCiT0X5mGwMyGERXdogfR7Yjw= +go.opentelemetry.io/proto/otlp v1.11.1/go.mod h1:wq8W4aSf6bOy8RZyESOeQFr9Pu7wydWX/TY4sgvrTPg= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.yaml.in/yaml/v2 v2.4.4 h1:tuyd0P+2Ont/d6e2rl3be67goVK4R6deVxCUX5vyPaQ= go.yaml.in/yaml/v2 v2.4.4/go.mod h1:gMZqIpDtDqOfM0uNfy0SkpRhvUryYH0Z6wdMYcacYXQ= +go.yaml.in/yaml/v3 v3.0.5 h1:N6y/pJk8buWs9NY5ERU2HSMfm+IuD/OtfdAnq6kESPw= +go.yaml.in/yaml/v3 v3.0.5/go.mod h1:HVTZu1O7/Vkt2N+BFy8Zza+lnLsABggaTM2ZpNIGuKg= go.yaml.in/yaml/v4 v4.0.0-rc.3 h1:3h1fjsh1CTAPjW7q/EMe+C8shx5d8ctzZTrLcs/j8Go= go.yaml.in/yaml/v4 v4.0.0-rc.3/go.mod h1:aZqd9kCMsGL7AuUv/m/PvWLdg5sjJsZ4oHDEnfPPfY0= -golang.org/x/crypto v0.55.0 h1:+KWHjbgOaAQ66dh/YlkZKHlz9ZUlq61AFirAR9ntP8M= -golang.org/x/crypto v0.55.0/go.mod h1:uq0V9dE/fzQuJtbnL+2EhWOE63vo164FY8xqEnV9xis= -golang.org/x/exp v0.0.0-20260312153236-7ab1446f8b90 h1:jiDhWWeC7jfWqR9c/uplMOqJ0sbNlNWv0UkzE0vX1MA= -golang.org/x/exp v0.0.0-20260312153236-7ab1446f8b90/go.mod h1:xE1HEv6b+1SCZ5/uscMRjUBKtIxworgEcEi+/n9NQDQ= -golang.org/x/image v0.45.0 h1:FMb1nTbH5H9vF55SriQHgFw5GnNL9Jg6L25BwXKzhB0= -golang.org/x/image v0.45.0/go.mod h1:n62x/7RqlwXDvGsSU4u6IUTUf6KghUZ9Bt7cG/T9Fx4= -golang.org/x/net v0.58.0 h1:ynWG7rqYi4ccpTEuPZ2QGWHktVEM9DMCj9yzDE0Q7To= -golang.org/x/net v0.58.0/go.mod h1:YwCddHnFlT7eLQqVprV19OnhLGtc5xOKgE0RyqgfWAU= -golang.org/x/oauth2 v0.36.0 h1:peZ/1z27fi9hUOFCAZaHyrpWG5lwe0RJEEEeH0ThlIs= -golang.org/x/oauth2 v0.36.0/go.mod h1:YDBUJMTkDnJS+A4BP4eZBjCqtokkg1hODuPjwiGPO7Q= -golang.org/x/sync v0.22.0 h1:SZjpbeLmrCk4xhRSZFNZW5gFUeCeFgjekvI/+gfScek= -golang.org/x/sync v0.22.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= -golang.org/x/sys v0.47.0 h1:o7XGOvZQCADBQQ4Y7VNq2dRWQR7JmOUW8Kxx4ZsNgWs= -golang.org/x/sys v0.47.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= -golang.org/x/text v0.41.0 h1:vz/seA0lnX87Othu2f/0L24RcgrXD9/YFTSuGjj3rH8= -golang.org/x/text v0.41.0/go.mod h1:jvf1O8ajNzZqhSrQBPbutR/EB83Cc0CFrezNQIwbb5M= -golang.org/x/time v0.15.0 h1:bbrp8t3bGUeFOx08pvsMYRTCVSMk89u4tKbNOZbp88U= -golang.org/x/time v0.15.0/go.mod h1:Y4YMaQmXwGQZoFaVFk4YpCt4FLQMYKZe9oeV/f4MSno= +golang.org/x/crypto v0.58.0 h1:COkYLr4k7nDI4r6QtMML2AfzeIswWHAJthLS6K/M/54= +golang.org/x/crypto v0.58.0/go.mod h1:Xh+kl5A+M0gMiWDytH2Hhr5Z7WbNCpv/eB/EFgfSk+w= +golang.org/x/exp v0.0.0-20261014143641-f0251eb4aa3e h1:HgI6W1OolKK6tcV74is+rl9SMT0njsHlp0TbQiGXI/A= +golang.org/x/exp v0.0.0-20261014143641-f0251eb4aa3e/go.mod h1:DBoxwWhjaW8DJJw/YeM4zpeOKMC1FMXSblsYy+1mFSw= +golang.org/x/image v0.47.0 h1:za/8gVz++PPZqmZJBNSISICN5Rrj5zixP/8K++fgmqo= +golang.org/x/image v0.47.0/go.mod h1:IkN5o4A7vq55vXN8FWjjnhg9Rs2GOtffqsSi9mWAKYE= +golang.org/x/net v0.61.0 h1:RR+6j/BTBCrggOLugxa+66R8FvoN6MHlzDlZIbN9YFw= +golang.org/x/net v0.61.0/go.mod h1:WgDCOTH8iwtB66T4/GfI94AHo/hhdb7Hah9NDseQfiI= +golang.org/x/oauth2 v0.37.0 h1:JUlcxA8oAtauLfiH8FX2/FkAWHAdi0QtGCGc+hofE98= +golang.org/x/oauth2 v0.37.0/go.mod h1:IxwZNxUULJmpBFf9K/9NTMSIfZZuvuTy1gGxhigP/58= +golang.org/x/sync v0.24.0 h1:iqiDrGoDgyuvAKrhLQthUEzU/R378N78gXbBjxed7oA= +golang.org/x/sync v0.24.0/go.mod h1:sUUOizhqBxiL6pEWpqNLUiaJn1ShEbZ6BBqskPbjZm0= +golang.org/x/sys v0.49.0 h1:XbzkgYJHdqh/8m2Uu0W/dQv8nktxx4BFHp1M0gROTXA= +golang.org/x/sys v0.49.0/go.mod h1:hNLxWAXmnKAxqDtdwIYC4bM9oQPEecfsnNMuSxOs3og= +golang.org/x/text v0.43.0 h1:1QivrlhwAsnMOcqgOdl9my7s9OyZl8O5/UGUTJVXoWc= +golang.org/x/text v0.43.0/go.mod h1:hbSIYA/amXcRXTFSZqh8tWHEoqRvvbKPJ2uz/KU+a+s= +golang.org/x/time v0.16.0 h1:vMb6ptszcQMkcwiRTAuNNU50gom6++Q/6gY2hDM6VDE= +golang.org/x/time v0.16.0/go.mod h1:rVKOqvZeKvrDKTQiAHJ7wmwP0RzleSphoEA9RcdLA0s= gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4= gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E= -google.golang.org/api v0.293.0 h1:p9XIWOf63U4OgYx120ZwVU8+vl4XTPmWfgVPnmOAS9w= -google.golang.org/api v0.293.0/go.mod h1:6n5tjEB1gzwniZTepZ0g5u+wM7Bof5GeULCx/zh8ZE0= -google.golang.org/genai v1.68.0 h1:gmALuBU6mRy46wupEt20wBR1dYAMY13t/jkTxpdzhzE= -google.golang.org/genai v1.68.0/go.mod h1:mDdPDFXo1Ats7f1WXVyZgWb/CkMzFWTWJruIMy7hGIU= -google.golang.org/genproto v0.0.0-20260818201246-1b0934165a6f h1:mIpuZeRssq9TYLzKcruaLOCbOgJt8WDF1FSyEPZBw24= -google.golang.org/genproto v0.0.0-20260818201246-1b0934165a6f/go.mod h1:UpDDw2l68z31m5UZN/Qi0Kow16ohhlJVlmqC3qRM5Q8= -google.golang.org/genproto/googleapis/api v0.0.0-20260818201246-1b0934165a6f h1:zRL8hmUGXSGBJ2D+r85c0S3xhrg6BtfQ3V6KKbR/I9M= -google.golang.org/genproto/googleapis/api v0.0.0-20260818201246-1b0934165a6f/go.mod h1:q/3oV3jAi5vwelxsVAprMBC8BcM2zmNe+IjRGd+9/ks= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260818201246-1b0934165a6f h1:kMQMi+2r0XRQ/Ad2/tgd+5S7JYSBGYO4pwkLTE8F2y0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260818201246-1b0934165a6f/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= -google.golang.org/grpc v1.83.0 h1:JeNZEKJFbQxArAMl+hiytHauacDNqJUllNfmIMmpqnQ= -google.golang.org/grpc v1.83.0/go.mod h1:kDyl6SKsiHKt0uylY5gtn5cEjkrIOhQOGDgIc4JGwzQ= +google.golang.org/api v0.307.0 h1:KJJv1V/cOeCUrgKFippAhSg98QlR2IZFqubQKf7gQdg= +google.golang.org/api v0.307.0/go.mod h1:4XMH+b/ZEfuTbK7FnrFRY9c4xfFHVflGTKuy/i5wUmE= +google.golang.org/genai v1.71.0 h1:Wfo9n0uSzMhZH7d+rP7QxxSWELEDSD4z6O8W/C9s3oM= +google.golang.org/genai v1.71.0/go.mod h1:mDdPDFXo1Ats7f1WXVyZgWb/CkMzFWTWJruIMy7hGIU= +google.golang.org/genproto v0.0.0-20261019180522-ce908d29299b h1:+t2qGqt6R8CO622uiX1JpnRvRvSOQoVRV0DiPzUjKXg= +google.golang.org/genproto v0.0.0-20261019180522-ce908d29299b/go.mod h1:XRIfc1yr5xsbF8xFw5+g7SEmLJX/eQ7MMazTRbnMMvI= +google.golang.org/genproto/googleapis/api v0.0.0-20261019180522-ce908d29299b h1:nB3spRIaSPtxJpxb0k41yljROvm2Jrwfs2pSNdKS5y8= +google.golang.org/genproto/googleapis/api v0.0.0-20261019180522-ce908d29299b/go.mod h1:9N4vtjEwvgQKEdlFVQO0M44ErhecQ9DCSQfGoZ51M6w= +google.golang.org/genproto/googleapis/rpc v0.0.0-20261019180522-ce908d29299b h1:6WNWHZk91dp4gZ25642OALkuG1UVNZbwENJD19DnB8k= +google.golang.org/genproto/googleapis/rpc v0.0.0-20261019180522-ce908d29299b/go.mod h1:OaIUM3+LpYcK2GXM4FTmhWoIq371Owdr+Cc7/BsYHHc= +google.golang.org/grpc v1.84.0 h1:soMyaPJ8pAak5PIQ0DGBUir0XRo2fRoMqhNWMLlLxO0= +google.golang.org/grpc v1.84.0/go.mod h1:ljCht0DrxQrXBDRTZp52Qxh3Ffk8CdYm2sj4O2QN2C0= google.golang.org/protobuf v1.36.12 h1:pJOKDDOyeXErUroCihFAd5LQuwXBSpVnKGrj5o/fwxc= google.golang.org/protobuf v1.36.12/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= -gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/go.mod b/go.mod index e6341fc93..3ae7e38d2 100644 --- a/go.mod +++ b/go.mod @@ -1,15 +1,15 @@ module charm.land/fantasy -go 1.27.2 +go 1.27.3 require ( charm.land/x/vcr v0.1.1 - cloud.google.com/go/auth v0.24.0 + cloud.google.com/go/auth v0.24.1 github.com/anthropics/anthropic-sdk-go v1.75.0 - github.com/ardanlabs/kronk v1.32.7 - github.com/aws/aws-sdk-go-v2 v1.47.1 - github.com/aws/aws-sdk-go-v2/config v1.33.6 - github.com/aws/smithy-go v1.28.2 + github.com/ardanlabs/kronk v1.33.0 + github.com/aws/aws-sdk-go-v2 v1.47.3 + github.com/aws/aws-sdk-go-v2/config v1.33.9 + github.com/aws/smithy-go v1.28.6 github.com/charmbracelet/openai-go v0.0.0-20260921175203-216db9e71b83 github.com/charmbracelet/x/exp/slice v0.1.0 github.com/charmbracelet/x/exp/strings v0.1.0 @@ -19,7 +19,7 @@ require ( github.com/joho/godotenv v1.5.1 github.com/kaptinlin/jsonschema v0.9.10 github.com/stretchr/testify v1.12.1 - golang.org/x/net v0.60.0 + golang.org/x/net v0.61.0 golang.org/x/oauth2 v0.37.0 google.golang.org/genai v1.71.0 ) @@ -27,30 +27,29 @@ require ( require ( cel.dev/expr v0.25.3 // indirect cloud.google.com/go v0.123.0 // indirect - cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect - cloud.google.com/go/compute/metadata v0.9.0 // indirect - cloud.google.com/go/iam v1.13.0 // indirect - cloud.google.com/go/monitoring v1.30.0 // indirect - cloud.google.com/go/storage v1.68.0 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.38.0 // indirect + cloud.google.com/go/auth/oauth2adapt v0.3.0 // indirect + cloud.google.com/go/compute/metadata v0.10.0 // indirect + cloud.google.com/go/iam v1.14.0 // indirect + cloud.google.com/go/monitoring v1.31.0 // indirect + cloud.google.com/go/storage v1.69.0 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.62.0 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.62.0 // indirect - github.com/ardanlabs/jinja v1.6.0 // indirect - github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.20 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.20.6 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.20.1 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.5.4 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.8.4 // indirect - github.com/aws/aws-sdk-go-v2/internal/v4a v1.5.4 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.19 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.11.3 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.14.4 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.20.3 // indirect - github.com/aws/aws-sdk-go-v2/service/s3 v1.113.1 // indirect - github.com/aws/aws-sdk-go-v2/service/signin v1.10.1 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.38.1 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.43.1 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.51.1 // indirect + github.com/ardanlabs/jinja v1.9.0 // indirect + github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.22 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.20.9 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.20.3 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.5.6 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.8.6 // indirect + github.com/aws/aws-sdk-go-v2/internal/v4a v1.5.6 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.21 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.11.7 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.14.6 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.20.6 // indirect + github.com/aws/aws-sdk-go-v2/service/s3 v1.114.3 // indirect + github.com/aws/aws-sdk-go-v2/service/signin v1.10.4 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.38.4 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.43.4 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.51.4 // indirect github.com/bahlo/generic-list-go v0.2.0 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d // indirect @@ -59,71 +58,72 @@ require ( github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/cncf/xds/go v0.0.0-20260202195803-dba9d589def2 // indirect github.com/coder/websocket v1.8.15 // indirect - github.com/ebitengine/purego v0.11.0 // indirect - github.com/envoyproxy/go-control-plane/envoy v1.39.0 // indirect + github.com/ebitengine/purego v0.11.2 // indirect + github.com/envoyproxy/go-control-plane/envoy v1.40.0 // indirect github.com/envoyproxy/protoc-gen-validate v1.3.3 // indirect github.com/felixge/httpsnoop v1.1.0 // indirect - github.com/go-jose/go-jose/v4 v4.1.5 // indirect + github.com/go-jose/go-jose/v4 v4.1.6 // indirect github.com/go-logr/logr v1.4.4 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/goccy/go-yaml v1.19.2 // indirect github.com/google/go-cmp v0.7.0 // indirect - github.com/google/s2a-go v0.1.9 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.3.22 // indirect - github.com/googleapis/gax-go/v2 v2.24.1 // indirect + github.com/google/s2a-go v0.1.11 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.3.23 // indirect + github.com/googleapis/gax-go/v2 v2.27.0 // indirect github.com/gorilla/websocket v1.5.3 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.30.0 // indirect - github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.74 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.32.0 // indirect + github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.76 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect - github.com/hashicorp/go-getter v1.8.9 // indirect + github.com/hashicorp/go-getter v1.8.10 // indirect github.com/hashicorp/go-version v1.9.0 // indirect - github.com/hybridgroup/yzma v1.27.1-0.20260917101309-d48a589de711 // indirect + github.com/hybridgroup/yzma v1.30.1-0.20261020171642-4e61a127c953 // indirect github.com/invopop/jsonschema v0.14.0 // indirect - github.com/jupiterrider/ffi v0.7.0 // indirect + github.com/jupiterrider/ffi v0.8.0 // indirect github.com/kaptinlin/jsonpointer v0.4.28 // indirect - github.com/klauspost/compress v1.20.0 // indirect + github.com/klauspost/compress v1.20.3 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/pb33f/ordered-map/v2 v2.3.1 // indirect github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect - github.com/prometheus/client_golang v1.24.1 // indirect + github.com/prometheus/client_golang v1.25.0 // indirect github.com/prometheus/client_model v0.6.3 // indirect - github.com/prometheus/common v0.71.0 // indirect + github.com/prometheus/common v0.72.1 // indirect github.com/prometheus/procfs v0.22.0 // indirect - github.com/spiffe/go-spiffe/v2 v2.8.1 // indirect + github.com/spiffe/go-spiffe/v2 v2.9.0 // indirect github.com/standard-webhooks/standard-webhooks/libraries v0.0.1 // indirect github.com/tidwall/gjson v1.19.0 // indirect github.com/tidwall/match v1.1.1 // indirect github.com/tidwall/pretty v1.2.1 // indirect github.com/tidwall/sjson v1.2.5 // indirect - github.com/ulikunitz/xz v0.5.16 // indirect + github.com/ulikunitz/xz v0.5.17 // indirect github.com/yosida95/uritemplate/v3 v3.0.2 // indirect go.opentelemetry.io/auto/sdk v1.2.1 // indirect - go.opentelemetry.io/contrib/detectors/gcp v1.46.0 // indirect - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.71.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.71.0 // indirect - go.opentelemetry.io/otel v1.46.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.46.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.46.0 // indirect - go.opentelemetry.io/otel/metric v1.46.0 // indirect - go.opentelemetry.io/otel/sdk v1.46.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.46.0 // indirect - go.opentelemetry.io/otel/trace v1.46.0 // indirect - go.opentelemetry.io/proto/otlp v1.11.0 // indirect + go.opentelemetry.io/contrib/detectors/gcp v1.47.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.72.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.72.0 // indirect + go.opentelemetry.io/otel v1.47.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.47.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.47.0 // indirect + go.opentelemetry.io/otel/log v1.47.0 // indirect + go.opentelemetry.io/otel/metric v1.47.0 // indirect + go.opentelemetry.io/otel/sdk v1.47.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.47.0 // indirect + go.opentelemetry.io/otel/trace v1.47.0 // indirect + go.opentelemetry.io/proto/otlp v1.11.1 // indirect go.yaml.in/yaml/v2 v2.4.4 // indirect go.yaml.in/yaml/v3 v3.0.5 // indirect go.yaml.in/yaml/v4 v4.0.0-rc.3 // indirect - golang.org/x/crypto v0.57.0 // indirect - golang.org/x/image v0.46.0 // indirect - golang.org/x/sync v0.23.0 // indirect - golang.org/x/sys v0.48.0 // indirect - golang.org/x/text v0.42.0 // indirect + golang.org/x/crypto v0.58.0 // indirect + golang.org/x/image v0.47.0 // indirect + golang.org/x/sync v0.24.0 // indirect + golang.org/x/sys v0.49.0 // indirect + golang.org/x/text v0.43.0 // indirect golang.org/x/time v0.16.0 // indirect - google.golang.org/api v0.298.0 // indirect - google.golang.org/genproto v0.0.0-20260911204522-f61a6ca850bd // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20260911204522-f61a6ca850bd // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20260911204522-f61a6ca850bd // indirect - google.golang.org/grpc v1.83.2 // indirect + google.golang.org/api v0.307.0 // indirect + google.golang.org/genproto v0.0.0-20261019180522-ce908d29299b // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20261019180522-ce908d29299b // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20261019180522-ce908d29299b // indirect + google.golang.org/grpc v1.84.0 // indirect google.golang.org/protobuf v1.36.12 // indirect gopkg.in/dnaeon/go-vcr.v4 v4.0.6-0.20251110073552-01de4eb40290 // indirect ) diff --git a/go.sum b/go.sum index 35e3531b1..0d08c559e 100644 --- a/go.sum +++ b/go.sum @@ -4,26 +4,24 @@ charm.land/x/vcr v0.1.1 h1:PXCFMUG0rPtyk35rhfzYCJEduOzWXCIbrXTFq4OF/9Q= charm.land/x/vcr v0.1.1/go.mod h1:eByq2gqzWvcct/8XE2XO5KznoWEBiXH56+y2gphbltM= cloud.google.com/go v0.123.0 h1:2NAUJwPR47q+E35uaJeYoNhuNEM9kM8SjgRgdeOJUSE= cloud.google.com/go v0.123.0/go.mod h1:xBoMV08QcqUGuPW65Qfm1o9Y4zKZBpGS+7bImXLTAZU= -cloud.google.com/go/auth v0.24.0 h1:UYMbF8otPZnLAkNJ5/LYQYOq0ARcJS1P4JqTeMKbCYU= -cloud.google.com/go/auth v0.24.0/go.mod h1:IFG/AMA1VWfuTrdbieEsB2GcpJyJV/phGAvogkOoPR4= -cloud.google.com/go/auth/oauth2adapt v0.2.8 h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIiLpZnkHRbnc= -cloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c= -cloud.google.com/go/compute/metadata v0.9.0 h1:pDUj4QMoPejqq20dK0Pg2N4yG9zIkYGdBtwLoEkH9Zs= -cloud.google.com/go/compute/metadata v0.9.0/go.mod h1:E0bWwX5wTnLPedCKqk3pJmVgCBSM6qQI1yTBdEb3C10= -cloud.google.com/go/iam v1.13.0 h1:ufT3FPT5rFFXu6UtLkNoxaOaV5EuA1dsSkmemCSTo6U= -cloud.google.com/go/iam v1.13.0/go.mod h1:gHXdDEiPDvqd1q1KwBDGQlgZY/BwY760zU2LhOZS5w0= -cloud.google.com/go/logging v1.19.1 h1:7SsLhyTDBDrJw+Ll6Ns3I2mByqHXvJUc3rGjSlwiWgU= -cloud.google.com/go/logging v1.19.1/go.mod h1:2IkQ/d8jVJqV2qW8ZUGUiMjdZG1gkLD2JReGbZ8isqg= -cloud.google.com/go/longrunning v1.2.0 h1:WjYH3YHBGCxGJP9M4dWGHBfXr/cFIjMkNgWcJj7/iMM= -cloud.google.com/go/longrunning v1.2.0/go.mod h1:5KMQALFGOCtFoi2xSOA1u3H7WKlhmckgiyFw7+LGQp0= -cloud.google.com/go/monitoring v1.30.0 h1:r/d+JUbyKmJ8b07iznuKfzVzrIXTWxHQ3lBRm3x2LlY= -cloud.google.com/go/monitoring v1.30.0/go.mod h1:htlUR0QWVMrjFzZmN4LGnMAve9xB/eduwjmINxVZ8RM= -cloud.google.com/go/storage v1.68.0 h1:gqrAMJ51OZjYgU6AJ2U60um90YQhSjq8HEIQNtJ4C/8= -cloud.google.com/go/storage v1.68.0/go.mod h1:UsS9OgFg/XHOSYakQ8ZtLWWeyGkk1WnmD/GsGfN0BHM= +cloud.google.com/go/auth v0.24.1 h1:NTmd2iJb4DsGIav0KiqFMYI88nMshA2wnFMBatRmoCs= +cloud.google.com/go/auth v0.24.1/go.mod h1:1dmBXa9xfBvBr39ZnDUDkaaA91ccq9CcqENDgJA4d7c= +cloud.google.com/go/auth/oauth2adapt v0.3.0 h1:FY8oSZpCYoUNv6QxVODuMjQz4IlSOVeiQtZ08vLPz88= +cloud.google.com/go/auth/oauth2adapt v0.3.0/go.mod h1:7+2uCm7++XFO+/lN06c2HXpDXb/NMNn2/UwyBPbTnkk= +cloud.google.com/go/compute/metadata v0.10.0 h1:pyKMUQSwchgkIBBJGdILqQbs/BNJXqwSA7Ej6LAvvtY= +cloud.google.com/go/compute/metadata v0.10.0/go.mod h1:rGFHRrIif570kSibjFTMbt6/4/tzgJWFGI/HVol4GIk= +cloud.google.com/go/iam v1.14.0 h1:YRIB1/4xxwJ+NfI6RQr1WaOoHHeV0MizJEj940nBXJA= +cloud.google.com/go/iam v1.14.0/go.mod h1:JTPZfbHdGXJrOYREtkRoFzCDGaBdbA7ILLKO/DDuav0= +cloud.google.com/go/logging v1.20.0 h1:l7yzCB8/JSY5PHT9RsaqdT1jaBGbM6KlSJDX210HlXM= +cloud.google.com/go/logging v1.20.0/go.mod h1:ALUaJQZM691Eeujy9kFx0xREq3AMPuGd+pTRZuTYv+w= +cloud.google.com/go/longrunning v1.3.0 h1:lZ6c8SJJBmILp/Wnr3vGnBLa0q+cYfSHRCcUfVI2hpI= +cloud.google.com/go/longrunning v1.3.0/go.mod h1:wpgLxCn+UA3/TZ1bj/fW39mfDpwVlMPu1xKJyoMt7V0= +cloud.google.com/go/monitoring v1.31.0 h1:LCuAoYiq8snyL/eDAG/VC73uWFXeax8+YEfmoNGJUrY= +cloud.google.com/go/monitoring v1.31.0/go.mod h1:7uk2dIJIf7ra64dI1VuQ0ttoFqvtKjdzq46u6zNP1hU= +cloud.google.com/go/storage v1.69.0 h1:jAAMC1411HEh78nKsU0Zns+eFj3TnhjAWIhg5Ud/XBM= +cloud.google.com/go/storage v1.69.0/go.mod h1:PELYsxTYm2peE4mwLEC1+mS1dA/kUSRUxNv56rOy44g= cloud.google.com/go/trace v1.16.0 h1:GmQovzFc5F0CNfl0VLgL64aoTtu7xsM0YajW2GlG9+E= cloud.google.com/go/trace v1.16.0/go.mod h1:r+bdAn16dKLSV1G2D5v3e58IlQlizfxWrUfjx7kM7X0= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.38.0 h1:rmzbFS2CkHq0y2L5LkMVWm+QXjjNEXxjmhrJqga/QGk= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.38.0/go.mod h1:iIyrdhveU5Ow84ipRlxtjCOQnIM0DiqSMxuxm50xwZY= github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.62.0 h1:5y2LR2pripbccOte6BpZ+guv5O5W0OQIfKvUYZrGaAQ= github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.62.0/go.mod h1:b3f7EifFRqkVt142USoGIP62uUeZm7ALCPrs1ZjWXYo= github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.62.0 h1:tRsXhJnn0w0TNwJpVrB94wsrimzjWKFzdQlUhRdNUzc= @@ -32,46 +30,46 @@ github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapp github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.62.0/go.mod h1:sg6Wqbl0BKKZ5zKnQj2q0qic/3ziF894SCx1LpbX37Y= github.com/anthropics/anthropic-sdk-go v1.75.0 h1:2oajsgiYwI0Hc8E6K9GttVe6CLwZlfhdxaqFqKVUnvA= github.com/anthropics/anthropic-sdk-go v1.75.0/go.mod h1:x+lPk/cCl48uRegeP0hlYYBN1b7bEBTveInIMgLicnY= -github.com/ardanlabs/jinja v1.6.0 h1:CbqS/dxYM9qrmlBed1GsN64/tRY6SoWQWc5Sc+aw3iI= -github.com/ardanlabs/jinja v1.6.0/go.mod h1:aXXzlJfjA+T3XNKA/YT5ZtDq2VJxt5a5siZ8cl9B35Q= -github.com/ardanlabs/kronk v1.32.7 h1:JUKLyI11gkivAmhHJZ6VRYVfN7ZgljYr7+sj2BUaqDw= -github.com/ardanlabs/kronk v1.32.7/go.mod h1:5NYTsOG2BjDQanW45o6mxVprKCkLzAlKXhXl/8zxh2g= -github.com/aws/aws-sdk-go-v2 v1.47.1 h1:uOIZnp4PK3ZhKI0dNrJrhTEsLxbpXHTAJlwoS1pvAtw= -github.com/aws/aws-sdk-go-v2 v1.47.1/go.mod h1:bttEH6JqnUL8LepvDVfdrds/fZ5bCIxzpe3abyUrhDU= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.20 h1:GPRlPwz40I2B2VrBEASOA3Bi77NyeqejNLkifosX0rs= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.20/go.mod h1:g7PNzKcsOKWb4fkSRBA7BZVAS6Y8IcxzN+nRohhQ1Q8= -github.com/aws/aws-sdk-go-v2/config v1.33.6 h1:MBjkSTLczek/UgiK+EYPIoRTqE7gP8vtW3OFbFo7Nug= -github.com/aws/aws-sdk-go-v2/config v1.33.6/go.mod h1:grRAFzdAZJrwcbasJRg2MPvIrVjtlfXllHssN6+E1JE= -github.com/aws/aws-sdk-go-v2/credentials v1.20.6 h1:NpAFXCU7NzXNkdGK3zQTtsRJ+3v9tZQV0xcdRw8uBdw= -github.com/aws/aws-sdk-go-v2/credentials v1.20.6/go.mod h1:mcZCoiPnyMvP8VMNbygNX5lLqSlkYJIMPODylQMurOk= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.20.1 h1:8gALAAmacnIXh+z6VkdDanv4/IkG5APdg4DZLDTmLog= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.20.1/go.mod h1:Z7IJhJU+poOdJjUR2wpyY21ossQ1XS/R3Lk9Msq5kM4= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.5.4 h1:CLq4+8UHCI+ZZYl/EuJxXovaIVN2xeeT8JV+dsApQ5E= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.5.4/go.mod h1:Wv4q5sAM04xAMkoOedxLx2inVf6K5FdxYp+A61L+q/0= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.8.4 h1:dD4MR81I7YkpEBRk6UP9rocC2QnT3qVuXwzlYTtfGEs= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.8.4/go.mod h1:EcXV1kAFd5XwSkDHlj94gnF3q5CkJyYiIJfH8N0VmrE= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.5.4 h1:7Wo47d/xn/7KttCSBd8EGYeZ7ULRFRkUHr6vkZPBzVQ= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.5.4/go.mod h1:tDB2IVC1xC3vX8o+6uRlzhTxP3g1b77CZXFX/oD2FnQ= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.19 h1:bAdDl/HkGCcGPoe25ToSHEw23VIxt6CT5fLcg111BKg= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.19/go.mod h1:KaUzbLxv4CeSxh6ZCl9B4m7CuFenS8kUEaDs+f/DQr4= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.11.3 h1:BHKCSX4QXERe8So8rbWqaM7owqOmDJxATXgJwGng22A= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.11.3/go.mod h1:GqWeeKfYfezihA2KfFL9l7ohEdZWe1tuFWh3GfyNSnE= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.14.4 h1:29SvnfGhXjTl8ONxFwbj2rs6lbhiFXD2CgFQmbT/bXY= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.14.4/go.mod h1:wm04I5DMuNVvZHFe/dHnUxincvNbbK7AiNBbYsQivek= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.20.3 h1:L8vIOxylma91TcR96NFTEC07G3JDwSl+CvK2b+IODms= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.20.3/go.mod h1:fmPIZQzTExYuBNWFyi1P7IoDjvskgphXqK1yObMzusM= -github.com/aws/aws-sdk-go-v2/service/s3 v1.113.1 h1:cFHmwLxZPvtoAlo79MboURL2+7b0TMHycnrcf5VZNXk= -github.com/aws/aws-sdk-go-v2/service/s3 v1.113.1/go.mod h1:/uA+2Qj4jd5qBWagVC1AyzzDFXVK997E7U04w7Kw0wI= -github.com/aws/aws-sdk-go-v2/service/signin v1.10.1 h1:DzCCWLzcIRQ77F3DEUljud7bEjTgFOIKXP52NmVRyhU= -github.com/aws/aws-sdk-go-v2/service/signin v1.10.1/go.mod h1:xpo/geVldu8payT375WekctUzopG/hBU7miiqItMUlw= -github.com/aws/aws-sdk-go-v2/service/sso v1.38.1 h1:Umtl/0YZhng4xndfW3lKJrYYP7NLEjI6bGXVomwLcs0= -github.com/aws/aws-sdk-go-v2/service/sso v1.38.1/go.mod h1:rRD/dnm7q0HYE/I5TMaPgkWyyUGLcwuxHLABsLnQ3e0= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.43.1 h1:orIWdNiLgzrhu/11RcPPKO/SBzUUymbUQuZbSPImghg= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.43.1/go.mod h1:skwM/xsbR/1ReUTesv9BhpJp1VjajR7DWQnuVLwiXsQ= -github.com/aws/aws-sdk-go-v2/service/sts v1.51.1 h1:0HOqZXRvMytH6bFHVIc0oJX07sZjfhz0zXtjs6gdE8s= -github.com/aws/aws-sdk-go-v2/service/sts v1.51.1/go.mod h1:26zA0GhDrLo+yiLI2yXWxqB1PdsShfLikoI7GOEgugM= -github.com/aws/smithy-go v1.28.2 h1:myhcykQcatTul2B/zITjDk203G7t0awUAs1hVry5Bvg= -github.com/aws/smithy-go v1.28.2/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc= +github.com/ardanlabs/jinja v1.9.0 h1:69fjYzJ7OmsjQvXoiiQXuPgZcMmAPHk5vTYmcOMEu7I= +github.com/ardanlabs/jinja v1.9.0/go.mod h1:VMzH0tsq4PgTbN64PqBqqqBKZvKlhkrxHVagcB5Tj8g= +github.com/ardanlabs/kronk v1.33.0 h1:wMcFpSuC4RLyugiXEcyZhkqEVJJ5CyrSSYYf60/3Wk4= +github.com/ardanlabs/kronk v1.33.0/go.mod h1:gNZ9T6t2TOTH02SS+/A7elDqT1hGs4e8jh0uNJ5OtpU= +github.com/aws/aws-sdk-go-v2 v1.47.3 h1:HRoT/MkNi3bjO5xF4dCzLzvVmkvRGHj3/cLINDnJejk= +github.com/aws/aws-sdk-go-v2 v1.47.3/go.mod h1:xSl+OSI5ZUw6bSMupWc218zE5Pl+65MCCu3ySWFY99A= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.22 h1:oiEmPz/YMMeh/JvAE8xSxNCIsvWE6lpFe4ZPlyFykQI= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.22/go.mod h1:QWUDuRi9PFjBHIU2iH1Pkldbe7zqLfXJC4wWLbF8nuQ= +github.com/aws/aws-sdk-go-v2/config v1.33.9 h1:Hv6bcQUJVnmuWaKjqD6Ot8sE75NrWsWV20oGT5aWle0= +github.com/aws/aws-sdk-go-v2/config v1.33.9/go.mod h1:ivowmrZNfBQLcg4QkaItgi5wae4Bzot9RzIdbY1hfTg= +github.com/aws/aws-sdk-go-v2/credentials v1.20.9 h1:SNO55PnWhaDafsOcv16lCA0kdoFMl/YlegWoVsU02s0= +github.com/aws/aws-sdk-go-v2/credentials v1.20.9/go.mod h1:+2reOTRtdD3VSBqpRDNwrZIYy8yMCYa7oK3WKTJ/I1I= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.20.3 h1:gr3b87OLB29jymWPzp/CAyXwQRJVE+sC4Wm0qBIKHsk= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.20.3/go.mod h1:BRjf4L/Yx2hY54o+ZibPbLJyMMeSwqYQXwcJfqW66a8= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.5.6 h1:CqL8NN3p4I0JTwwV5MEoatIl4Y2amZ2X9dRD+0hbRL0= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.5.6/go.mod h1:exdJ32hMqXl0Wyo6NwqEC5yIhtua3+PDaKE8P29m4qE= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.8.6 h1:FpBq24TG6WVSObTNhQOv7Q0088rounUUlwn3zlNItkM= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.8.6/go.mod h1:ONzdPVYC95oBOu0VWNEsKEntcoemP3xVKjT+qWml1s4= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.5.6 h1:Qmn60RWuk9+bd2ddvJJqwf3Cpac3VvGMOdbGemtUhX4= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.5.6/go.mod h1:h/YJhe4AVyQxEUMluph10iqV7mjajH7A9L+BHF5ppis= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.21 h1:e6YW5uME30TkrElR+4/xcY7NB6CCj2dcv7vtmGXhfhQ= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.21/go.mod h1:obpHAMP693+f3/A8PkLhIqfK1C+NWWn8zXzqD3OH520= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.11.7 h1:CwvFlKw0uUScfgOMflXSRZa+ayXgOf6wk7lhyMemQYU= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.11.7/go.mod h1:4SbD8BB+p+QEnG0aX6DoWwrtk9SufyYXRsUv0nve8LE= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.14.6 h1:LHHdobjo5le1sjJdolitV7uVvYg3wkaeM1Ju2fDgeZQ= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.14.6/go.mod h1:CBGB0evAiaMD3Lk4wPO7LQCcCZLuhzL5Qf/wfEUHQ5w= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.20.6 h1:mYViDr2azcgxOpRrObZOl631bvavqILoE/L+Kxgbwys= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.20.6/go.mod h1:OXVdAo9jNhggB+hJRGOyy7WolGTKB6Rg7IIulDeSzPM= +github.com/aws/aws-sdk-go-v2/service/s3 v1.114.3 h1:NyeuyXkZL476uoAowNActm4XJO1QPKf7aassgXHpiqA= +github.com/aws/aws-sdk-go-v2/service/s3 v1.114.3/go.mod h1:GfoBeKMDJecgRUsGf/0RGdx0NJAh81ObTd922h8pQys= +github.com/aws/aws-sdk-go-v2/service/signin v1.10.4 h1:tvpDjuUvgKURf3Yk4hOaGbZ4QdY+070OWcA5d6LUv2A= +github.com/aws/aws-sdk-go-v2/service/signin v1.10.4/go.mod h1:3ibVKg5Ng82Zby8++jELTD2nHxiPk2DJRLEeW/LKp8M= +github.com/aws/aws-sdk-go-v2/service/sso v1.38.4 h1:ChCtagixSFOxltv0o6E3NT8F7ksvZtZGPwUBynO5Nmk= +github.com/aws/aws-sdk-go-v2/service/sso v1.38.4/go.mod h1:+FEO9jrVMpc9oN3CdAxJbtlQEu3z8UddDPSedpeM3PY= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.43.4 h1:j6c+HA4AoS0EBEjArPjavFEBrucJEryfrQU0TffmACk= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.43.4/go.mod h1:RhghaXUk9q66VtOQUX1FdPddQuHnqQZzbB0fEYXmPRA= +github.com/aws/aws-sdk-go-v2/service/sts v1.51.4 h1:OKEfbf2tcfsF2pBk/S9QqNpo6alaAtiBs4hysCsBjPw= +github.com/aws/aws-sdk-go-v2/service/sts v1.51.4/go.mod h1:mCd6qGo9b8hTtfjgsmNkFlzwjyce4owd7HDVFnCLXhM= +github.com/aws/smithy-go v1.28.6 h1:Pj+/sUviNYjow8ELRtNwKHZ9ECeF+7pATX3+shjLIrw= +github.com/aws/smithy-go v1.28.6/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc= github.com/bahlo/generic-list-go v0.2.0 h1:5sz/EEAK+ls5wF+NeqDpk5+iNdMDXrh3z3nPnH1Wvgk= github.com/bahlo/generic-list-go v0.2.0/go.mod h1:2KvAjgMlE5NNynlg/5iLrrCCZ2+5xWbdbCW3pNTGyYg= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= @@ -98,20 +96,20 @@ github.com/coder/websocket v1.8.15 h1:6B2JPeOGlpff2Uz6vOEH1Vzpi0iUz20A+lPVhPHtNU github.com/coder/websocket v1.8.15/go.mod h1:NX3SzP+inril6yawo5CQXx8+fk145lPDC6pumgx0mVg= github.com/dnaeon/go-vcr v1.2.0 h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI= github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= -github.com/ebitengine/purego v0.11.0 h1:jhp/D+Nyv7UUW8HAcmcjt2N2rYrYi9m3SL21k0Ua/NI= -github.com/ebitengine/purego v0.11.0/go.mod h1:DCHPP08djqhNSoTfImcnHYQRZmd0qhakvrozqaEYhGQ= +github.com/ebitengine/purego v0.11.2 h1:WWiTx8rD8zYdOwSj8O/NiNbsOvSAgJMTlyV1XlbUSeU= +github.com/ebitengine/purego v0.11.2/go.mod h1:DCHPP08djqhNSoTfImcnHYQRZmd0qhakvrozqaEYhGQ= github.com/envoyproxy/go-control-plane v0.14.0 h1:hbG2kr4RuFj222B6+7T83thSPqLjwBIfQawTkC++2HA= github.com/envoyproxy/go-control-plane v0.14.0/go.mod h1:NcS5X47pLl/hfqxU70yPwL9ZMkUlwlKxtAohpi2wBEU= -github.com/envoyproxy/go-control-plane/envoy v1.39.0 h1:1uwRDYPYG8BIBU9Mj1sUAebNmlM6beu/ZKKweSLDxk8= -github.com/envoyproxy/go-control-plane/envoy v1.39.0/go.mod h1:5e4ylfTZO723MEEFsCpSW4ZEBWR8mwkEyXfwJBTCZ9c= +github.com/envoyproxy/go-control-plane/envoy v1.40.0 h1:G4dcl8KE/HVPnZ25BBdvGZWi8JjyeBfQSvm95U5P1Qc= +github.com/envoyproxy/go-control-plane/envoy v1.40.0/go.mod h1:UZVGjwWu2QV8PkGSlXmqWiSgqCGZe16TgIu4jDl3T5w= github.com/envoyproxy/go-control-plane/ratelimit v0.1.0 h1:/G9QYbddjL25KvtKTv3an9lx6VBE2cnb8wp1vEGNYGI= github.com/envoyproxy/go-control-plane/ratelimit v0.1.0/go.mod h1:Wk+tMFAFbCXaJPzVVHnPgRKdUdwW/KdbRt94AzgRee4= github.com/envoyproxy/protoc-gen-validate v1.3.3 h1:MVQghNeW+LZcmXe7SY1V36Z+WFMDjpqGAGacLe2T0ds= github.com/envoyproxy/protoc-gen-validate v1.3.3/go.mod h1:TsndJ/ngyIdQRhMcVVGDDHINPLWB7C82oDArY51KfB0= github.com/felixge/httpsnoop v1.1.0 h1:3YtUj32ZZkqZtt3sZZsClsymw/QDuVfpNhoA31zeORc= github.com/felixge/httpsnoop v1.1.0/go.mod h1:Zqxgdd+1Rkcz8euOqdr7lqgCRJztwr5hp9vDSi5UZCE= -github.com/go-jose/go-jose/v4 v4.1.5 h1:RjgjO2LOtWOJKUC5wpwY9LR3B3vwVAz6JS2YHfYU6eA= -github.com/go-jose/go-jose/v4 v4.1.5/go.mod h1:x4oUasVrzR7071A4TnHLGSPpNOm2a21K9Kf04k1rs08= +github.com/go-jose/go-jose/v4 v4.1.6 h1:sNRkftxFJxwsILiQukqp5z83QBSmntVwmgRY7AqBDO4= +github.com/go-jose/go-jose/v4 v4.1.6/go.mod h1:x4oUasVrzR7071A4TnHLGSPpNOm2a21K9Kf04k1rs08= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.4.4 h1:tG4xh9yMsRCAiodLVTxyrkzSZ9+o0L1Kg/+cPVcbP/8= github.com/go-logr/logr v1.4.4/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= @@ -127,40 +125,40 @@ github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/martian/v3 v3.3.3 h1:DIhPTQrbPkgs2yJYdXU/eNACCG5DVQjySNRNlflZ9Fc= github.com/google/martian/v3 v3.3.3/go.mod h1:iEPrYcgCF7jA9OtScMFQyAlZZ4YXTKEtJ1E6RWzmBA0= -github.com/google/s2a-go v0.1.9 h1:LGD7gtMgezd8a/Xak7mEWL0PjoTQFvpRudN895yqKW0= -github.com/google/s2a-go v0.1.9/go.mod h1:YA0Ei2ZQL3acow2O62kdp9UlnvMmU7kA6Eutn0dXayM= +github.com/google/s2a-go v0.1.11 h1:7v1V1TraNGP63WptsAkNqr2w8jgm4vM6A6qx6Lsw9iM= +github.com/google/s2a-go v0.1.11/go.mod h1:pz4tyvwXvJLLbyrkh6FW1eS2zPUXMaTmyNhYtyP2tNw= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.3.22 h1:NU4XpII6jD+Dxcot94fqjE+AfJoE/lQP9q3faYGzC/c= -github.com/googleapis/enterprise-certificate-proxy v0.3.22/go.mod h1:L3D/IQExI6LqEjBdXcZQ1WluSgigQmSwBboFstVPM4w= -github.com/googleapis/gax-go/v2 v2.24.1 h1:AtqTN21IXMMWo99LiEVAiBfNNQmO40d8xUfZI640mc0= -github.com/googleapis/gax-go/v2 v2.24.1/go.mod h1:bWeBei0NVwaNZKb2y1HUBS7gLXIF3/Tu3pq7j8D2Tb0= +github.com/googleapis/enterprise-certificate-proxy v0.3.23 h1:J+VGF1wjAM2dU2kKUXZxJdDppRLReWP7KWcclfngQhc= +github.com/googleapis/enterprise-certificate-proxy v0.3.23/go.mod h1:Y8NO/15GNLkrXI3OR5xOFmeU3XLX1sLSdtlXgJ0zmIw= +github.com/googleapis/gax-go/v2 v2.27.0 h1:qe2iQOUzxb3fd6x6ewpIEixPQhJ+0Ihc/RRZhKA/2g0= +github.com/googleapis/gax-go/v2 v2.27.0/go.mod h1:RofiqDw3ehcG4L0H1zO3D2Itpwd3/uS/7wdmbNDF1DE= github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.30.0 h1:/Tnpcb2E0Pz/tN9s3bfEY2Q8ePCEX9iuS+cneUwncnw= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.30.0/go.mod h1:zOBXOsUaBSjKgmH4OGzV1esUpR3oUSCPYVd2cUBjKYY= -github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.74 h1:mymLUKThnV9wFvogOK8NnsMP9/vlhnjXY98gr2QIGW8= -github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.74/go.mod h1:Bh9qYL8ehmDxSg14Tk8oxFCP90XHfs6NxV1D84884xA= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.32.0 h1:QMILzF8BA7xftE4zVORkRrlv08m12St3csK4RsyRgRs= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.32.0/go.mod h1:+ZQ6iUL8+ATyxGDQNuRKpNwJFdGDUi0e7E1QL9MvI7U= +github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.76 h1:lv1kai0y585J8lMNBhyOoVQssXp3pBv5lLeKb38n+BY= +github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.76/go.mod h1:LlNlsklP+YHM+y1x1SNdOgbXIih0fyqpvB8iGik/sDo= github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= -github.com/hashicorp/go-getter v1.8.9 h1:1AOTMUmz/S/GuqOTE6+bg6nwPXTEbKr3Tc/T/lVS7is= -github.com/hashicorp/go-getter v1.8.9/go.mod h1:qI7vH/m552bXutKe4UkWptOJl4bo2KeO/CSOoh4s0ps= +github.com/hashicorp/go-getter v1.8.10 h1:uufJp+uacA0fSDRxclsHkiE6yUQTKgwv5b25QexgVM8= +github.com/hashicorp/go-getter v1.8.10/go.mod h1:5HyKGCQmT+I3MGAM76vk/fWpktjwxn7xruCUr9CrVuo= github.com/hashicorp/go-version v1.9.0 h1:CeOIz6k+LoN3qX9Z0tyQrPtiB1DFYRPfCIBtaXPSCnA= github.com/hashicorp/go-version v1.9.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hybridgroup/yzma v1.27.1-0.20260917101309-d48a589de711 h1:tg8YSu7/puDjhGPZTAxTxCpyPEWC+26/KN5E9UbUOaE= -github.com/hybridgroup/yzma v1.27.1-0.20260917101309-d48a589de711/go.mod h1:wAMtNTjSnE79jTWzaeFSsuraam0TXKCPajMHA5s+OX8= +github.com/hybridgroup/yzma v1.30.1-0.20261020171642-4e61a127c953 h1:9JeY59VBx5tXm1NPjXhBqiOkUxDUcZ5L5CtcxnDGoQg= +github.com/hybridgroup/yzma v1.30.1-0.20261020171642-4e61a127c953/go.mod h1:ovV3WQ5v3X53vqo9Izg/28QHEXaVasW9b4Kgkhk05T0= github.com/invopop/jsonschema v0.14.0 h1:MHQqLhvpNUZfw+hM3AZDYK7jxO8FZoQeQM77g8iyZjg= github.com/invopop/jsonschema v0.14.0/go.mod h1:ygm6C2EaVNMBDPpaPlnOA2pFAxBnxGjFlMZABxm9n2I= github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= -github.com/jupiterrider/ffi v0.7.0 h1:RKsl6Ascal+3kyAqR5Qcbp83LceQMLc1VZbPfHWoNzs= -github.com/jupiterrider/ffi v0.7.0/go.mod h1:9dauhpOfNqrqk28fxuu0kkdeFtT9Qr4vbfigiuIXN7c= +github.com/jupiterrider/ffi v0.8.0 h1:IH6lto8OZaRIulQYObtZibII4tq71hXT6Z+KLBcxCcQ= +github.com/jupiterrider/ffi v0.8.0/go.mod h1:9dauhpOfNqrqk28fxuu0kkdeFtT9Qr4vbfigiuIXN7c= github.com/kaptinlin/jsonpointer v0.4.28 h1:PyxOfdml9PGpxQz+JnNLGsyzQ+Rnm+OVNTGcgbVLqgg= github.com/kaptinlin/jsonpointer v0.4.28/go.mod h1:JzeIDw1+60bryzOFea9P3zjKg8pfJHd+UIA/zfZ70x8= github.com/kaptinlin/jsonschema v0.9.10 h1:dnMgwshay3YVUjFEHn6Bnf5oZ3LE1iQAL4iB2vSmviM= github.com/kaptinlin/jsonschema v0.9.10/go.mod h1:ZgmK1hBhK8zmScMktiE+DRr3U3POBHupO4TvnFntel0= -github.com/klauspost/compress v1.20.0 h1:a3C1ke2ohxFymNlb2HWAHjDeKCI90scRskErZkR0ezA= -github.com/klauspost/compress v1.20.0/go.mod h1:LUdAzn7YLVvxLpc7y3V1m40wESHTgc1422pwwBSKYuI= +github.com/klauspost/compress v1.20.3 h1:zWNoFqq/lSuYQRim3dUXlXeA0IqwuZGicdG5ZTfY5j4= +github.com/klauspost/compress v1.20.3/go.mod h1:LUdAzn7YLVvxLpc7y3V1m40wESHTgc1422pwwBSKYuI= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= @@ -169,16 +167,16 @@ github.com/pb33f/ordered-map/v2 v2.3.1 h1:5319HDO0aw4DA4gzi+zv4FXU9UlSs3xGZ40wcP github.com/pb33f/ordered-map/v2 v2.3.1/go.mod h1:qxFQgd0PkVUtOMCkTapqotNgzRhMPL7VvaHKbd1HnmQ= github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= -github.com/prometheus/client_golang v1.24.1 h1:JnJkREXzWxUdCuPFpIWZiPispT9xVV59uiuyR2bPlnU= -github.com/prometheus/client_golang v1.24.1/go.mod h1:F+oSRECHg4sse5ucfYpYDeIv/hu68Zo0uoHKetWnzcE= +github.com/prometheus/client_golang v1.25.0 h1:cDtW1TcFsMi1RJc8khwCKB4VhzwV04aKqbYtNOXuiK0= +github.com/prometheus/client_golang v1.25.0/go.mod h1:j2X/4/kaQHLPnmyEU8zjmkndo1T317VpCIQEml8LTKk= github.com/prometheus/client_model v0.6.3 h1:O0jaTVAYNxTHYInEPFJt5I3+sN8zqBtVMPTB1qyxiEo= github.com/prometheus/client_model v0.6.3/go.mod h1:gpN5P9S7Rr6Yr92PiQ+Ixvhf6JZEkF1dnxsYL2aPBEM= -github.com/prometheus/common v0.71.0 h1:9KDAKb7Mj3HEVKyFCK6Dc/HIwlBzZIN2l7/lrHl3KK8= -github.com/prometheus/common v0.71.0/go.mod h1:CLJ5H8TEsGX8bl31BdMkfhIZ+QmZ9tBPPotUxUbfcmk= +github.com/prometheus/common v0.72.1 h1:ZAiQed/nk8IIcsdzb2TlJu23NEUDyDLQ9TXTN2WRK6Y= +github.com/prometheus/common v0.72.1/go.mod h1:1IoBY4IRaJnhs2ESjNzjilP1cJ/P8pimGoomq7zRXrA= github.com/prometheus/procfs v0.22.0 h1:6q9+/JL9IKAPbCmBrv9n5O5Ty3NKnciV5X7YGw0oics= github.com/prometheus/procfs v0.22.0/go.mod h1:CvmFr/GVhIjIvWJZW3tgkODBQMRIf0EyWMQLHCHab58= -github.com/spiffe/go-spiffe/v2 v2.8.1 h1:eXZMLsu+3MLEPJyGJkolqtVrteZfQdUpOWj6LTiDl/E= -github.com/spiffe/go-spiffe/v2 v2.8.1/go.mod h1:47Q0Q9/AqGha8QLHp+kxpH4Wca7X7EnOtlIJy3mxZ3U= +github.com/spiffe/go-spiffe/v2 v2.9.0 h1:g5qTg3qIP1HXV+GzuyEfSJFVxUCpEP5Ui1OINVJHPB4= +github.com/spiffe/go-spiffe/v2 v2.9.0/go.mod h1:w2CLWKLMTX/PPYUEUPv3ltH0RXsw5S8suwNF46w9/Aw= github.com/standard-webhooks/standard-webhooks/libraries v0.0.1 h1:uOfcYT+3QungH6tIGSVCR/Y3KJmgJiHcojJbMTPDZAI= github.com/standard-webhooks/standard-webhooks/libraries v0.0.1/go.mod h1:L1MQhA6x4dn9r007T033lsaZMv9EmBAdXyU/+EF40fo= github.com/stretchr/testify v1.12.1 h1:EuwCh5fleGS7H32xRwO3wRGT7DxrDhLAT6FF8MpWDWE= @@ -193,38 +191,40 @@ github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4= github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY= github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28= -github.com/ulikunitz/xz v0.5.16 h1:ld6NyySjx5lowVKwJvMRLnW5nxKX/xnpSiFYZ/Lxur0= -github.com/ulikunitz/xz v0.5.16/go.mod h1:H9Rt/W6/Qj27PGauhQc6nfCDy7vHpzsOThBSaYDoEhw= +github.com/ulikunitz/xz v0.5.17 h1:flR0y/x1hgM8EGV1AW3Xll6T413G0glV8UfBwR617V4= +github.com/ulikunitz/xz v0.5.17/go.mod h1:H9Rt/W6/Qj27PGauhQc6nfCDy7vHpzsOThBSaYDoEhw= github.com/yosida95/uritemplate/v3 v3.0.2 h1:Ed3Oyj9yrmi9087+NczuL5BwkIc4wvTb5zIM+UJPGz4= github.com/yosida95/uritemplate/v3 v3.0.2/go.mod h1:ILOh0sOhIJR3+L/8afwt/kE++YT040gmv5BQTMR2HP4= go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= -go.opentelemetry.io/contrib/detectors/gcp v1.46.0 h1:PI8dGkqDaQkwJ8kOopqMhDTbrnK3UIeG/RCHH4HErbo= -go.opentelemetry.io/contrib/detectors/gcp v1.46.0/go.mod h1:nsrN5c/sOLoY2vsPxN/rQ0V0nvGrWJCqcW4UXLtqNG8= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.71.0 h1:B2h3uqicet1CT2N5TOFhS+Gq++9i0/CLmaxvhmhtP5s= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.71.0/go.mod h1:dylvB+ZiiwMvsDij9O84Uy7SijLgHMX4mbkncds+4Sw= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.71.0 h1:3g7B90UzBltIDKq1/5mrTGxTnOFDV0ICOhLoxiZ8jlg= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.71.0/go.mod h1:Ef8SuTh59BT7+ofpDxN9z+yOlc4t2GjLmKDgYNJL/NU= -go.opentelemetry.io/otel v1.46.0 h1:FHt5/CDyVxi/8IM1CH7VE/rRgq3kLHa2mSTVMO8AWyc= -go.opentelemetry.io/otel v1.46.0/go.mod h1:Gj3SEScelsNC45tp4nSxRYlS+f5iez7W8XPMCt905kE= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.46.0 h1:OFnwLJr+pF3iHrlGSzbxyuo6/6HyBlnlN1CWEJmBVcw= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.46.0/go.mod h1:716wFneO0ov19A2beH5hjfh9AK5z/VWNAtDijp1Y0/g= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.46.0 h1:w53CDeOA/Kurp7yRsegSr6pbbr759dOvJ+yNmWM6Hxs= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.46.0/go.mod h1:BOmGMCbAtvcJiSJ+hLuhgPLdDbimnraSl8irz3iY8sY= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.44.0 h1:hqxVTu/GtBF+vJ8d1fzW7fRxZFvgoDjWcxwwCaFDYpU= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.44.0/go.mod h1:z5fVEF4X5v0ESvlJqBrrFlBVoj5EQuefZpzsu7R+x5Q= -go.opentelemetry.io/otel/metric v1.46.0 h1:yBnkXvgV7AXFILZc5K6IZe/CBFF3OS7BJ8ov6/lj0K8= -go.opentelemetry.io/otel/metric v1.46.0/go.mod h1:iPmdWqifKUdzziPkvvzIJXITl56fQx2mGM/DHLB3/2o= -go.opentelemetry.io/otel/metric/x v0.68.0 h1:TA/cBT23D3MnxYPwHL7YFOdYGdx0A0v+s7Mzotpd1dU= -go.opentelemetry.io/otel/metric/x v0.68.0/go.mod h1:agudOmvWhwUTjgibWDzxD2PoWYnpw5Ht5jISYOD2Hd4= -go.opentelemetry.io/otel/sdk v1.46.0 h1:h5CNQQjEbuQXY/JfZtgt3i7HVFV3aHPO2OAwO2eTYPI= -go.opentelemetry.io/otel/sdk v1.46.0/go.mod h1:GAERFXFt5SYCEB+YiKUbMBeza6UaDH7GmGOZEfh2gSM= -go.opentelemetry.io/otel/sdk/metric v1.46.0 h1:0piZ26EG4RBfebb2jhDH6ERCYHoVWduc3kLgPCwSnSE= -go.opentelemetry.io/otel/sdk/metric v1.46.0/go.mod h1:I1PbKrdVc8Qu8HYVDNtqVIwLwjNrhsV/uFuxfwg8mO4= -go.opentelemetry.io/otel/trace v1.46.0 h1:OULy7ccdJnZtJ0UDYFOIGaCmiWzJ8Vi2G/Rsu60qs1c= -go.opentelemetry.io/otel/trace v1.46.0/go.mod h1:J7GAXweO77XSFkB/rmAqk9D6ihszhFjLU+d9WuUxDLI= -go.opentelemetry.io/proto/otlp v1.11.0 h1:5rrYs0Ykyj50sdU/JU0x8etU+LubXWb+gED6TbEdMIk= -go.opentelemetry.io/proto/otlp v1.11.0/go.mod h1:SmVizdCOAm3XBtG1g1NnOdhW6jtddT72hLMhv8VwA8E= +go.opentelemetry.io/contrib/detectors/gcp v1.47.0 h1:Ct6+aaiSO6Nk5SOb6PYcR7iWp+83YF/pL1OJcGqOmbg= +go.opentelemetry.io/contrib/detectors/gcp v1.47.0/go.mod h1:3N259ss0b1AVOs+fYw7lOO0mcUwNqSIpQ+Zitpuqx00= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.72.0 h1:Tq+E65HaNbZTeqcLw6QUhsV+/EIWdkfUH2CQzcrlE5M= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.72.0/go.mod h1:A+EVhDakAj1waJBPhmTszZaSr08ww8MRRKy1nB1rqck= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.72.0 h1:LxwW/9ctSCv+QkE/cLR7M91ZIkXNMqJtEMi1vCw9U8s= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.72.0/go.mod h1:tOsftB4SslBwwErVEPaenU2RpThXWPIU8DoJHEC4dyw= +go.opentelemetry.io/otel v1.47.0 h1:j7ALJ/zgkS7Z6aeJW09p8VC9804bC+PpeTfCD4XPnOM= +go.opentelemetry.io/otel v1.47.0/go.mod h1:8wS9O2qfXrYrzp6hIF/HOYJJf/wIhFPhR2xLuP+iXQU= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.47.0 h1:julhjPeUH/q/7hinbSdDdqt5h7Zw9YWmRlWRhI0jd54= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.47.0/go.mod h1:Ao2mz688LH/tFf0yMAenidq6k2YNSx6SIY2q6jDACck= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.47.0 h1:UFpxOpYPmMNUtOWhdb+nC1WELIgVf8z9higURrbzYU4= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.47.0/go.mod h1:YBGjxe3lt0jtXoEXxGrGhv/jM7oUBUDVK7zhAvNyEjc= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.45.0 h1:dm9iyzn6tioYZtwqaiBSU0TSI8Yu/8dTIbfG0+B49DY= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.45.0/go.mod h1:xAvxYjYK28qvt+yu4BYZ/zMmAjwMXINXD6JiMyeB8iI= +go.opentelemetry.io/otel/log v1.47.0 h1:cOTS1CcLbSQeZKanGJ+0JpF/+t4PELi3O3bbl2lqCcI= +go.opentelemetry.io/otel/log v1.47.0/go.mod h1:9byitSQ5pLC6PpqwGXjqdMKya6ZTswHRZh2vvXT33nw= +go.opentelemetry.io/otel/metric v1.47.0 h1:4PptaldXx3Eat1XjMZ68pPJEs5wrhlemctZE9a3UdWY= +go.opentelemetry.io/otel/metric v1.47.0/go.mod h1:ADGSXxRrXM6bjbvLo535EstVFlPpPYZm4LBKixjDHwU= +go.opentelemetry.io/otel/metric/x v0.69.0 h1:DjRLr15H83v+hCW7JA9NoJvOkYTtmq5YoDRbe9deYpM= +go.opentelemetry.io/otel/metric/x v0.69.0/go.mod h1:uVvsMPMFFyj/HUQfrUnH3JjnOQ1dwFDorgFLRBasM0k= +go.opentelemetry.io/otel/sdk v1.47.0 h1:zWXEr4j2lFefG87TU6Yg8a7ngfohIKFZHKp0Hf5hC6I= +go.opentelemetry.io/otel/sdk v1.47.0/go.mod h1:VUc24kiOeoGsxG8G9ULx3fWKvB7jMhnGE8Oi607lgR0= +go.opentelemetry.io/otel/sdk/metric v1.47.0 h1:lfISg2j93VT6yqdk9OfUaZmw/GfcZqCCV3jdXtsPnKw= +go.opentelemetry.io/otel/sdk/metric v1.47.0/go.mod h1:ypLp+mW1Nt2x+Szt3b5/i1syodyts49lMOwxpDI3VGw= +go.opentelemetry.io/otel/trace v1.47.0 h1:JOjX/Oci8K94QHddo+bbfya/Ai/nf6/dt9ZfrFNWSrM= +go.opentelemetry.io/otel/trace v1.47.0/go.mod h1:jNaSLa2PZEYFG6fRjJABAu+bw4FS08uDmPg28lTghu0= +go.opentelemetry.io/proto/otlp v1.11.1 h1:SCrPqH9NE5CmBrOqpjNCiT0X5mGwMyGERXdogfR7Yjw= +go.opentelemetry.io/proto/otlp v1.11.1/go.mod h1:wq8W4aSf6bOy8RZyESOeQFr9Pu7wydWX/TY4sgvrTPg= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.yaml.in/yaml/v2 v2.4.4 h1:tuyd0P+2Ont/d6e2rl3be67goVK4R6deVxCUX5vyPaQ= @@ -233,36 +233,36 @@ go.yaml.in/yaml/v3 v3.0.5 h1:N6y/pJk8buWs9NY5ERU2HSMfm+IuD/OtfdAnq6kESPw= go.yaml.in/yaml/v3 v3.0.5/go.mod h1:HVTZu1O7/Vkt2N+BFy8Zza+lnLsABggaTM2ZpNIGuKg= go.yaml.in/yaml/v4 v4.0.0-rc.3 h1:3h1fjsh1CTAPjW7q/EMe+C8shx5d8ctzZTrLcs/j8Go= go.yaml.in/yaml/v4 v4.0.0-rc.3/go.mod h1:aZqd9kCMsGL7AuUv/m/PvWLdg5sjJsZ4oHDEnfPPfY0= -golang.org/x/crypto v0.57.0 h1:3ZVCjf8Ggz7zneR/EHRVx68Ctf+2pmIMP2UFhh9cC6M= -golang.org/x/crypto v0.57.0/go.mod h1:Fdz0i5U6CoizGwLda9DttjSk6qlZo25zYNtR+ycvuZA= -golang.org/x/image v0.46.0 h1:b1+oYj0Jbp6K5MDT4i4/eZpYlk3V8SJhhDKh6LBHAyQ= -golang.org/x/image v0.46.0/go.mod h1:3B3W05VGVQyuXucLINLjXKrqISASfi4Xj+iCVkLMwew= -golang.org/x/net v0.60.0 h1:79p50tfZlm0J9YfoDsSi639qSXNGVwEzOPLCxM2FsYU= -golang.org/x/net v0.60.0/go.mod h1:2DA/G1UfVbCpQPeWTmMPGY7Cs2PkBkwu743bVX5PIVg= +golang.org/x/crypto v0.58.0 h1:COkYLr4k7nDI4r6QtMML2AfzeIswWHAJthLS6K/M/54= +golang.org/x/crypto v0.58.0/go.mod h1:Xh+kl5A+M0gMiWDytH2Hhr5Z7WbNCpv/eB/EFgfSk+w= +golang.org/x/image v0.47.0 h1:za/8gVz++PPZqmZJBNSISICN5Rrj5zixP/8K++fgmqo= +golang.org/x/image v0.47.0/go.mod h1:IkN5o4A7vq55vXN8FWjjnhg9Rs2GOtffqsSi9mWAKYE= +golang.org/x/net v0.61.0 h1:RR+6j/BTBCrggOLugxa+66R8FvoN6MHlzDlZIbN9YFw= +golang.org/x/net v0.61.0/go.mod h1:WgDCOTH8iwtB66T4/GfI94AHo/hhdb7Hah9NDseQfiI= golang.org/x/oauth2 v0.37.0 h1:JUlcxA8oAtauLfiH8FX2/FkAWHAdi0QtGCGc+hofE98= golang.org/x/oauth2 v0.37.0/go.mod h1:IxwZNxUULJmpBFf9K/9NTMSIfZZuvuTy1gGxhigP/58= -golang.org/x/sync v0.23.0 h1:KameEIfc1IkluZyXWLn39Wd4tURc6GbCiISGiZm2bQk= -golang.org/x/sync v0.23.0/go.mod h1:sUUOizhqBxiL6pEWpqNLUiaJn1ShEbZ6BBqskPbjZm0= -golang.org/x/sys v0.48.0 h1:bbX/i/6MgT9BVLM9RT1thmxL04yeTAhbEz4SyadbXoo= -golang.org/x/sys v0.48.0/go.mod h1:hNLxWAXmnKAxqDtdwIYC4bM9oQPEecfsnNMuSxOs3og= -golang.org/x/text v0.42.0 h1:JbOZXgfeCPU9gacVtYliJqOhD+zhrEqK4LfdpmlUZqI= -golang.org/x/text v0.42.0/go.mod h1:ojzP1Z+2QtioaF8DTtO8K5q7JWVVYwZKenzujK0Zd0E= +golang.org/x/sync v0.24.0 h1:iqiDrGoDgyuvAKrhLQthUEzU/R378N78gXbBjxed7oA= +golang.org/x/sync v0.24.0/go.mod h1:sUUOizhqBxiL6pEWpqNLUiaJn1ShEbZ6BBqskPbjZm0= +golang.org/x/sys v0.49.0 h1:XbzkgYJHdqh/8m2Uu0W/dQv8nktxx4BFHp1M0gROTXA= +golang.org/x/sys v0.49.0/go.mod h1:hNLxWAXmnKAxqDtdwIYC4bM9oQPEecfsnNMuSxOs3og= +golang.org/x/text v0.43.0 h1:1QivrlhwAsnMOcqgOdl9my7s9OyZl8O5/UGUTJVXoWc= +golang.org/x/text v0.43.0/go.mod h1:hbSIYA/amXcRXTFSZqh8tWHEoqRvvbKPJ2uz/KU+a+s= golang.org/x/time v0.16.0 h1:vMb6ptszcQMkcwiRTAuNNU50gom6++Q/6gY2hDM6VDE= golang.org/x/time v0.16.0/go.mod h1:rVKOqvZeKvrDKTQiAHJ7wmwP0RzleSphoEA9RcdLA0s= gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4= gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E= -google.golang.org/api v0.298.0 h1:YW18RkHBMZBA1ergX0m4biagzgbiPTb2uTsRsDPWNRY= -google.golang.org/api v0.298.0/go.mod h1:02qB8+Ox1ZFzcaKFMguy1nQLJmSIyvV6Ff4txJEXtl4= +google.golang.org/api v0.307.0 h1:KJJv1V/cOeCUrgKFippAhSg98QlR2IZFqubQKf7gQdg= +google.golang.org/api v0.307.0/go.mod h1:4XMH+b/ZEfuTbK7FnrFRY9c4xfFHVflGTKuy/i5wUmE= google.golang.org/genai v1.71.0 h1:Wfo9n0uSzMhZH7d+rP7QxxSWELEDSD4z6O8W/C9s3oM= google.golang.org/genai v1.71.0/go.mod h1:mDdPDFXo1Ats7f1WXVyZgWb/CkMzFWTWJruIMy7hGIU= -google.golang.org/genproto v0.0.0-20260911204522-f61a6ca850bd h1:s/EXdxMDrmT++u0VepJKO4U6dzOPJVRdHKmrazC1Qxg= -google.golang.org/genproto v0.0.0-20260911204522-f61a6ca850bd/go.mod h1:JfZ1Hyx5mAJgX/ip0vEicmPvzE6rIrbacB7rHMfjD7Q= -google.golang.org/genproto/googleapis/api v0.0.0-20260911204522-f61a6ca850bd h1:jgCQeWccunvocKNK2RjhQHNiSjSeMMuBpQ/5pbP+2lA= -google.golang.org/genproto/googleapis/api v0.0.0-20260911204522-f61a6ca850bd/go.mod h1:r4KD2hOq82JBWpTWkJ9NZLf6EwmRvAPIFmk7hPNtd+0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260911204522-f61a6ca850bd h1:29LZPNIJg+GEmJwZXruJJRwqy/wnWAYZXDtROToV/aQ= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260911204522-f61a6ca850bd/go.mod h1:DjtHYE8FKJLivXcBEjGwndXfIC23G0VpXiXKqG179uA= -google.golang.org/grpc v1.83.2 h1:EManeRomTObA0BU7I8vXgg/78uE5MJ9M8B39EX2WscU= -google.golang.org/grpc v1.83.2/go.mod h1:YPI1hK3kDked6iHvgX3tR0y+nX/qpMFKhPgFsokw1S8= +google.golang.org/genproto v0.0.0-20261019180522-ce908d29299b h1:+t2qGqt6R8CO622uiX1JpnRvRvSOQoVRV0DiPzUjKXg= +google.golang.org/genproto v0.0.0-20261019180522-ce908d29299b/go.mod h1:XRIfc1yr5xsbF8xFw5+g7SEmLJX/eQ7MMazTRbnMMvI= +google.golang.org/genproto/googleapis/api v0.0.0-20261019180522-ce908d29299b h1:nB3spRIaSPtxJpxb0k41yljROvm2Jrwfs2pSNdKS5y8= +google.golang.org/genproto/googleapis/api v0.0.0-20261019180522-ce908d29299b/go.mod h1:9N4vtjEwvgQKEdlFVQO0M44ErhecQ9DCSQfGoZ51M6w= +google.golang.org/genproto/googleapis/rpc v0.0.0-20261019180522-ce908d29299b h1:6WNWHZk91dp4gZ25642OALkuG1UVNZbwENJD19DnB8k= +google.golang.org/genproto/googleapis/rpc v0.0.0-20261019180522-ce908d29299b/go.mod h1:OaIUM3+LpYcK2GXM4FTmhWoIq371Owdr+Cc7/BsYHHc= +google.golang.org/grpc v1.84.0 h1:soMyaPJ8pAak5PIQ0DGBUir0XRo2fRoMqhNWMLlLxO0= +google.golang.org/grpc v1.84.0/go.mod h1:ljCht0DrxQrXBDRTZp52Qxh3Ffk8CdYm2sj4O2QN2C0= google.golang.org/protobuf v1.36.12 h1:pJOKDDOyeXErUroCihFAd5LQuwXBSpVnKGrj5o/fwxc= google.golang.org/protobuf v1.36.12/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/dnaeon/go-vcr.v4 v4.0.6-0.20251110073552-01de4eb40290 h1:g3ah7zaWmw41EtOgBNXpx8zk4HYuH3OMwB+qh1Dt834= diff --git a/providers/kronk/language_model_test.go b/providers/kronk/language_model_test.go index c86568579..3127db218 100644 --- a/providers/kronk/language_model_test.go +++ b/providers/kronk/language_model_test.go @@ -94,7 +94,7 @@ func TestGenerateResponse(t *testing.T) { modelInfo: model.ModelInfo{ ID: "loaded-model", Desc: "test model", - Type: model.ModelTypeDense, + Type: "Dense", HasProjection: true, Size: 1024, VRAMTotal: 768, @@ -184,7 +184,7 @@ func TestGenerateResponse(t *testing.T) { func TestStreamResponse(t *testing.T) { toolFinish := model.FinishReasonTool client := fakeChatModel{ - modelInfo: model.ModelInfo{ID: "loaded-model", Type: model.ModelTypeDense}, + modelInfo: model.ModelInfo{ID: "loaded-model", Type: "Dense"}, streamResponse: []model.ChatResponse{ {Model: "response-model", SystemFingerprint: "fp_kronk", Choices: []model.Choice{{Delta: &model.ResponseMessage{Reasoning: "thinking"}}}}, {Choices: []model.Choice{{Delta: &model.ResponseMessage{ToolCallDeltas: []model.ResponseToolCallDelta{ diff --git a/providers/kronk/options.go b/providers/kronk/options.go index f8826ca04..5e296fdfe 100644 --- a/providers/kronk/options.go +++ b/providers/kronk/options.go @@ -169,7 +169,7 @@ func WithNThreadsBatch(v int) Option { } // WithNUMA configures the NUMA strategy. -func WithNUMA(v string) Option { +func WithNUMA(v model.NUMAStrategy) Option { return withModelOption(model.WithNUMA(v)) } @@ -183,11 +183,6 @@ func WithOpOffload(v bool) Option { return withModelOption(model.WithOpOffload(v)) } -// WithOpOffloadMinBatch configures the minimum batch size for operation offloading. -func WithOpOffloadMinBatch(v int) Option { - return withModelOption(model.WithOpOffloadMinBatch(v)) -} - // WithPrefillBatchSize configures the maximum number of prompt tokens processed per decode iteration. func WithPrefillBatchSize(v int) Option { return withModelOption(model.WithPrefillBatchSize(v)) diff --git a/providers/kronk/provider_options.go b/providers/kronk/provider_options.go index 74626a8b1..43a562fe4 100644 --- a/providers/kronk/provider_options.go +++ b/providers/kronk/provider_options.go @@ -57,7 +57,7 @@ func newProviderMetadata(info model.ModelInfo) *ProviderMetadata { return &ProviderMetadata{ Model: info.ID, ModelDescription: info.Desc, - ModelType: info.Type.String(), + ModelType: info.Type, HasProjection: info.HasProjection, ModelSizeBytes: info.Size, VRAMBytes: info.VRAMTotal, From fe6c6678031660f532103cef6af46edf9182f6ab Mon Sep 17 00:00:00 2001 From: Ethan Dickson Date: Mon, 26 Oct 2026 02:27:01 +0000 Subject: [PATCH 154/156] chore: build the upstream sync on coder's SDK forks and Go 1.26 coder/coder ships the coder forks of anthropic-sdk-go and openai-go and builds with Go 1.26, so keep both after the upstream sync: - Import github.com/charmbracelet/anthropic-sdk-go and github.com/openai/openai-go/v3 again instead of upstream's github.com/anthropics/anthropic-sdk-go v1.75 (#336) and github.com/charmbracelet/openai-go (#381). The existing replaces point both at the coder forks. - anthropic: adapt to the older SDK API (anthropic.Model conversion, NewThinkingConfigAdaptiveParam) and read the error type from the raw error envelope, since the SDK has no Error.Type accessor. - openai: revert 111ec83 (openai-go v3.54 API adaptation). - go.mod: go 1.26.5. Pin kronk v1.31.5, the last release that builds with Go 1.26, and its jinja v1.8.0 and yzma v1.23.0. Revert 28d60cb's kronk provider adaptation (typed NUMA strategy, string model type), which needs kronk v1.33. - examples/go.mod: same Go and kronk pins. --- examples/go.mod | 23 +- examples/go.sum | 42 ++-- go.mod | 22 +- go.sum | 223 +----------------- providers/anthropic/anthropic.go | 16 +- providers/anthropic/anthropic_test.go | 2 +- providers/anthropic/call_useragent.go | 2 +- providers/anthropic/computer_use.go | 4 +- providers/anthropic/error.go | 19 +- providers/anthropic/error_test.go | 11 +- .../anthropic/stream_open_blocks_test.go | 2 +- providers/azure/azure.go | 2 +- providers/bedrock/bedrock.go | 2 +- providers/kronk/language_model_test.go | 4 +- providers/kronk/options.go | 7 +- providers/kronk/provider_options.go | 2 +- providers/openai/call_useragent.go | 2 +- providers/openai/error.go | 4 +- providers/openai/error_test.go | 2 +- providers/openai/language_model.go | 8 +- providers/openai/language_model_hooks.go | 6 +- providers/openai/openai.go | 4 +- providers/openai/openai_test.go | 2 +- providers/openai/provider_options.go | 4 +- providers/openai/responses_language_model.go | 32 ++- providers/openai/tool_messages.go | 2 +- providers/openai/tool_result_media_test.go | 4 +- providers/openai/tool_run_buffer_test.go | 2 +- .../openaicompat/language_model_hooks.go | 6 +- providers/openaicompat/openaicompat.go | 2 +- providers/openaicompat/openaicompat_test.go | 2 +- providers/openrouter/language_model_hooks.go | 4 +- providers/openrouter/openrouter.go | 2 +- providers/vercel/language_model_hooks.go | 4 +- providers/vercel/vercel.go | 2 +- 35 files changed, 130 insertions(+), 347 deletions(-) diff --git a/examples/go.mod b/examples/go.mod index ad77e3f29..1ffe7aac2 100644 --- a/examples/go.mod +++ b/examples/go.mod @@ -1,6 +1,6 @@ module charm.land/fantasy/examples -go 1.27.3 +go 1.26.5 replace charm.land/fantasy => ../ @@ -22,9 +22,8 @@ require ( cloud.google.com/go/storage v1.69.0 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.62.0 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.62.0 // indirect - github.com/anthropics/anthropic-sdk-go v1.75.0 // indirect - github.com/ardanlabs/jinja v1.9.0 // indirect - github.com/ardanlabs/kronk v1.33.0 // indirect + github.com/ardanlabs/jinja v1.8.0 // indirect + github.com/ardanlabs/kronk v1.31.5 // indirect github.com/aws/aws-sdk-go-v2 v1.47.3 // indirect github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.22 // indirect github.com/aws/aws-sdk-go-v2/config v1.33.9 // indirect @@ -43,26 +42,24 @@ require ( github.com/aws/aws-sdk-go-v2/service/ssooidc v1.43.4 // indirect github.com/aws/aws-sdk-go-v2/service/sts v1.51.4 // indirect github.com/aws/smithy-go v1.28.6 // indirect - github.com/bahlo/generic-list-go v0.2.0 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d // indirect - github.com/buger/jsonparser v1.1.2 // indirect github.com/cenkalti/backoff/v5 v5.0.3 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/charmbracelet/anthropic-sdk-go v0.0.0-20260223140439-63879b0b8dab // indirect github.com/charmbracelet/colorprofile v0.3.2 // indirect - github.com/charmbracelet/openai-go v0.0.0-20260921175203-216db9e71b83 // indirect github.com/charmbracelet/x/ansi v0.10.2 // indirect github.com/charmbracelet/x/cellbuf v0.0.14-0.20250811133356-e0c5dbe5ea4a // indirect github.com/charmbracelet/x/exp/slice v0.1.0 // indirect github.com/charmbracelet/x/exp/strings v0.1.0 // indirect github.com/charmbracelet/x/json v0.2.0 // indirect github.com/cncf/xds/go v0.0.0-20260202195803-dba9d589def2 // indirect - github.com/coder/websocket v1.8.15 // indirect github.com/ebitengine/purego v0.11.2 // indirect github.com/envoyproxy/go-control-plane/envoy v1.40.0 // indirect github.com/envoyproxy/protoc-gen-validate v1.3.3 // indirect github.com/felixge/httpsnoop v1.1.0 // indirect github.com/go-jose/go-jose/v4 v4.1.6 // indirect + github.com/go-json-experiment/json v0.0.0-20260623181947-01eb4420fa68 // indirect github.com/go-logfmt/logfmt v0.6.0 // indirect github.com/go-logr/logr v1.4.4 // indirect github.com/go-logr/stdr v1.2.2 // indirect @@ -79,18 +76,17 @@ require ( github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-getter v1.8.10 // indirect github.com/hashicorp/go-version v1.9.0 // indirect - github.com/hybridgroup/yzma v1.30.1-0.20261020171642-4e61a127c953 // indirect - github.com/invopop/jsonschema v0.14.0 // indirect + github.com/hybridgroup/yzma v1.23.0 // indirect github.com/jupiterrider/ffi v0.8.0 // indirect github.com/kaptinlin/jsonpointer v0.4.28 // indirect - github.com/kaptinlin/jsonschema v0.9.10 // indirect + github.com/kaptinlin/jsonschema v0.9.8 // indirect github.com/klauspost/compress v1.20.3 // indirect github.com/lucasb-eyer/go-colorful v1.3.0 // indirect github.com/mattn/go-runewidth v0.0.17 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/muesli/cancelreader v0.2.2 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect - github.com/pb33f/ordered-map/v2 v2.3.1 // indirect + github.com/openai/openai-go/v3 v3.50.0 // indirect github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect github.com/prometheus/client_golang v1.25.0 // indirect github.com/prometheus/client_model v0.6.3 // indirect @@ -98,14 +94,12 @@ require ( github.com/prometheus/procfs v0.22.0 // indirect github.com/rivo/uniseg v0.4.7 // indirect github.com/spiffe/go-spiffe/v2 v2.9.0 // indirect - github.com/standard-webhooks/standard-webhooks/libraries v0.0.1 // indirect github.com/tidwall/gjson v1.19.0 // indirect github.com/tidwall/match v1.1.1 // indirect github.com/tidwall/pretty v1.2.1 // indirect github.com/tidwall/sjson v1.2.5 // indirect github.com/ulikunitz/xz v0.5.17 // indirect github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect - github.com/yosida95/uritemplate/v3 v3.0.2 // indirect go.opentelemetry.io/auto/sdk v1.2.1 // indirect go.opentelemetry.io/contrib/detectors/gcp v1.47.0 // indirect go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.72.0 // indirect @@ -120,7 +114,6 @@ require ( go.opentelemetry.io/otel/trace v1.47.0 // indirect go.opentelemetry.io/proto/otlp v1.11.1 // indirect go.yaml.in/yaml/v2 v2.4.4 // indirect - go.yaml.in/yaml/v4 v4.0.0-rc.3 // indirect golang.org/x/crypto v0.58.0 // indirect golang.org/x/exp v0.0.0-20261014143641-f0251eb4aa3e // indirect golang.org/x/image v0.47.0 // indirect diff --git a/examples/go.sum b/examples/go.sum index a0a19b2a0..4705b3df0 100644 --- a/examples/go.sum +++ b/examples/go.sum @@ -26,12 +26,10 @@ github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0 github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.62.0/go.mod h1:ifhe5teRNcbxg9p353DhOkOgczzL/IBLYFqT1cm1zpM= github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.62.0 h1:aPMa5qZU9dp4fU34o+jQgVIPFIOi20oxYg8TLigmZLg= github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.62.0/go.mod h1:sg6Wqbl0BKKZ5zKnQj2q0qic/3ziF894SCx1LpbX37Y= -github.com/anthropics/anthropic-sdk-go v1.75.0 h1:2oajsgiYwI0Hc8E6K9GttVe6CLwZlfhdxaqFqKVUnvA= -github.com/anthropics/anthropic-sdk-go v1.75.0/go.mod h1:x+lPk/cCl48uRegeP0hlYYBN1b7bEBTveInIMgLicnY= -github.com/ardanlabs/jinja v1.9.0 h1:69fjYzJ7OmsjQvXoiiQXuPgZcMmAPHk5vTYmcOMEu7I= -github.com/ardanlabs/jinja v1.9.0/go.mod h1:VMzH0tsq4PgTbN64PqBqqqBKZvKlhkrxHVagcB5Tj8g= -github.com/ardanlabs/kronk v1.33.0 h1:wMcFpSuC4RLyugiXEcyZhkqEVJJ5CyrSSYYf60/3Wk4= -github.com/ardanlabs/kronk v1.33.0/go.mod h1:gNZ9T6t2TOTH02SS+/A7elDqT1hGs4e8jh0uNJ5OtpU= +github.com/ardanlabs/jinja v1.8.0 h1:NuRapYr/hv8J+4v1KymVAbbu6vuqMu+poXkJHfXqLs4= +github.com/ardanlabs/jinja v1.8.0/go.mod h1:VE5Fa3Zglc+e4tFaapOnA6BRMBRDI7A2qCd3Jse6oyw= +github.com/ardanlabs/kronk v1.31.5 h1:pU335FU7KOT2Mv4j4e2S+QaAVYumTRYYKgISkzrQT7Q= +github.com/ardanlabs/kronk v1.31.5/go.mod h1:ub5hRgH9xtMTTQOtBTPwzP67fx0dDwZGLwrWDpp+fuQ= github.com/aws/aws-sdk-go-v2 v1.47.3 h1:HRoT/MkNi3bjO5xF4dCzLzvVmkvRGHj3/cLINDnJejk= github.com/aws/aws-sdk-go-v2 v1.47.3/go.mod h1:xSl+OSI5ZUw6bSMupWc218zE5Pl+65MCCu3ySWFY99A= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.22 h1:oiEmPz/YMMeh/JvAE8xSxNCIsvWE6lpFe4ZPlyFykQI= @@ -70,26 +68,22 @@ github.com/aws/smithy-go v1.28.6 h1:Pj+/sUviNYjow8ELRtNwKHZ9ECeF+7pATX3+shjLIrw= github.com/aws/smithy-go v1.28.6/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc= github.com/aymanbagabas/go-udiff v0.2.0 h1:TK0fH4MteXUDspT88n8CKzvK0X9O2xu9yQjWpi6yML8= github.com/aymanbagabas/go-udiff v0.2.0/go.mod h1:RE4Ex0qsGkTAJoQdQQCA0uG+nAzJO/pI/QwceO5fgrA= -github.com/bahlo/generic-list-go v0.2.0 h1:5sz/EEAK+ls5wF+NeqDpk5+iNdMDXrh3z3nPnH1Wvgk= -github.com/bahlo/generic-list-go v0.2.0/go.mod h1:2KvAjgMlE5NNynlg/5iLrrCCZ2+5xWbdbCW3pNTGyYg= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d h1:xDfNPAt8lFiC1UJrqV3uuy861HCTo708pDMbjHHdCas= github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d/go.mod h1:6QX/PXZ00z/TKoufEY6K/a0k6AhaJrQKdFe6OfVXsa4= -github.com/buger/jsonparser v1.1.2 h1:frqHqw7otoVbk5M8LlE/L7HTnIq2v9RX6EJ48i9AxJk= -github.com/buger/jsonparser v1.1.2/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/charmbracelet/anthropic-sdk-go v0.0.0-20260223140439-63879b0b8dab h1:J7XQLgl9sefgTnTGrmX3xqvp5o6MCiBzEjGv5igAlc4= +github.com/charmbracelet/anthropic-sdk-go v0.0.0-20260223140439-63879b0b8dab/go.mod h1:hqlYqR7uPKOKfnNeicUbZp0Ps0GeYFlKYtwh5HGDCx8= github.com/charmbracelet/colorprofile v0.3.2 h1:9J27WdztfJQVAQKX2WOlSSRB+5gaKqqITmrvb1uTIiI= github.com/charmbracelet/colorprofile v0.3.2/go.mod h1:mTD5XzNeWHj8oqHb+S1bssQb7vIHbepiebQ2kPKVKbI= github.com/charmbracelet/lipgloss/v2 v2.0.0-beta1 h1:SOylT6+BQzPHEjn15TIzawBPVD0QmhKXbcb3jY0ZIKU= github.com/charmbracelet/lipgloss/v2 v2.0.0-beta1/go.mod h1:tRlx/Hu0lo/j9viunCN2H+Ze6JrmdjQlXUQvvArgaOc= github.com/charmbracelet/log/v2 v2.0.0-20251001162505-358b5269b546 h1:ZcOMUkKhtM6TbQKfB6C/GusIG6hdTMybJ4gNboQpjYg= github.com/charmbracelet/log/v2 v2.0.0-20251001162505-358b5269b546/go.mod h1:ooW2QKtnlCj7Kc5Atb7TQPRo699Fy+jhtLgX6a/EAh8= -github.com/charmbracelet/openai-go v0.0.0-20260921175203-216db9e71b83 h1:7k30XdmBd71VAErGCjTTiOAE9F1KUthN9jdCeqQtvZ4= -github.com/charmbracelet/openai-go v0.0.0-20260921175203-216db9e71b83/go.mod h1:8xPfrTomjYl827L3QQay36djXcEkXc80bpH+790o8/A= github.com/charmbracelet/x/ansi v0.10.2 h1:ith2ArZS0CJG30cIUfID1LXN7ZFXRCww6RUvAPA+Pzw= github.com/charmbracelet/x/ansi v0.10.2/go.mod h1:HbLdJjQH4UH4AqA2HpRWuWNluRE6zxJH/yteYEYCFa8= github.com/charmbracelet/x/cellbuf v0.0.14-0.20250811133356-e0c5dbe5ea4a h1:zYSNtEJM9jwHbJts2k+Hroj+xQwsW1yxc4Wopdv7KaI= @@ -106,8 +100,6 @@ github.com/charmbracelet/x/term v0.2.2 h1:xVRT/S2ZcKdhhOuSP4t5cLi5o+JxklsoEObBSg github.com/charmbracelet/x/term v0.2.2/go.mod h1:kF8CY5RddLWrsgVwpw4kAa6TESp6EB5y3uxGLeCqzAI= github.com/cncf/xds/go v0.0.0-20260202195803-dba9d589def2 h1:aBangftG7EVZoUb69Os8IaYg++6uMOdKK83QtkkvJik= github.com/cncf/xds/go v0.0.0-20260202195803-dba9d589def2/go.mod h1:qwXFYgsP6T7XnJtbKlf1HP8AjxZZyzxMmc+Lq5GjlU4= -github.com/coder/websocket v1.8.15 h1:6B2JPeOGlpff2Uz6vOEH1Vzpi0iUz20A+lPVhPHtNUA= -github.com/coder/websocket v1.8.15/go.mod h1:NX3SzP+inril6yawo5CQXx8+fk145lPDC6pumgx0mVg= github.com/dnaeon/go-vcr v1.2.0 h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI= github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= github.com/ebitengine/purego v0.11.2 h1:WWiTx8rD8zYdOwSj8O/NiNbsOvSAgJMTlyV1XlbUSeU= @@ -124,6 +116,8 @@ github.com/felixge/httpsnoop v1.1.0 h1:3YtUj32ZZkqZtt3sZZsClsymw/QDuVfpNhoA31zeO github.com/felixge/httpsnoop v1.1.0/go.mod h1:Zqxgdd+1Rkcz8euOqdr7lqgCRJztwr5hp9vDSi5UZCE= github.com/go-jose/go-jose/v4 v4.1.6 h1:sNRkftxFJxwsILiQukqp5z83QBSmntVwmgRY7AqBDO4= github.com/go-jose/go-jose/v4 v4.1.6/go.mod h1:x4oUasVrzR7071A4TnHLGSPpNOm2a21K9Kf04k1rs08= +github.com/go-json-experiment/json v0.0.0-20260623181947-01eb4420fa68 h1:KZaTBSyshWX3MP5jukJcNSuXDQTO+rNpt0J564dX/eg= +github.com/go-json-experiment/json v0.0.0-20260623181947-01eb4420fa68/go.mod h1:tphK2c80bpPhMOI4v6bIc2xWywPfbqi1Z06+RcrMkDg= github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4= github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= @@ -161,16 +155,14 @@ github.com/hashicorp/go-getter v1.8.10 h1:uufJp+uacA0fSDRxclsHkiE6yUQTKgwv5b25Qe github.com/hashicorp/go-getter v1.8.10/go.mod h1:5HyKGCQmT+I3MGAM76vk/fWpktjwxn7xruCUr9CrVuo= github.com/hashicorp/go-version v1.9.0 h1:CeOIz6k+LoN3qX9Z0tyQrPtiB1DFYRPfCIBtaXPSCnA= github.com/hashicorp/go-version v1.9.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hybridgroup/yzma v1.30.1-0.20261020171642-4e61a127c953 h1:9JeY59VBx5tXm1NPjXhBqiOkUxDUcZ5L5CtcxnDGoQg= -github.com/hybridgroup/yzma v1.30.1-0.20261020171642-4e61a127c953/go.mod h1:ovV3WQ5v3X53vqo9Izg/28QHEXaVasW9b4Kgkhk05T0= -github.com/invopop/jsonschema v0.14.0 h1:MHQqLhvpNUZfw+hM3AZDYK7jxO8FZoQeQM77g8iyZjg= -github.com/invopop/jsonschema v0.14.0/go.mod h1:ygm6C2EaVNMBDPpaPlnOA2pFAxBnxGjFlMZABxm9n2I= +github.com/hybridgroup/yzma v1.23.0 h1:AqwwhnPOS0I4TzRTCuWxXqGK/kY2P+QZ3+qiJOM3Jl0= +github.com/hybridgroup/yzma v1.23.0/go.mod h1:wAMtNTjSnE79jTWzaeFSsuraam0TXKCPajMHA5s+OX8= github.com/jupiterrider/ffi v0.8.0 h1:IH6lto8OZaRIulQYObtZibII4tq71hXT6Z+KLBcxCcQ= github.com/jupiterrider/ffi v0.8.0/go.mod h1:9dauhpOfNqrqk28fxuu0kkdeFtT9Qr4vbfigiuIXN7c= github.com/kaptinlin/jsonpointer v0.4.28 h1:PyxOfdml9PGpxQz+JnNLGsyzQ+Rnm+OVNTGcgbVLqgg= github.com/kaptinlin/jsonpointer v0.4.28/go.mod h1:JzeIDw1+60bryzOFea9P3zjKg8pfJHd+UIA/zfZ70x8= -github.com/kaptinlin/jsonschema v0.9.10 h1:dnMgwshay3YVUjFEHn6Bnf5oZ3LE1iQAL4iB2vSmviM= -github.com/kaptinlin/jsonschema v0.9.10/go.mod h1:ZgmK1hBhK8zmScMktiE+DRr3U3POBHupO4TvnFntel0= +github.com/kaptinlin/jsonschema v0.9.8 h1:srpfx2MAm4ecYz0zJLbz6fiW+UXiuv+vGhUqZUIWmrg= +github.com/kaptinlin/jsonschema v0.9.8/go.mod h1:TP7RFmFBNExjBE0b3fsM6RpA/9PeOzfg2g4weXqOrDg= github.com/klauspost/compress v1.20.3 h1:zWNoFqq/lSuYQRim3dUXlXeA0IqwuZGicdG5ZTfY5j4= github.com/klauspost/compress v1.20.3/go.mod h1:LUdAzn7YLVvxLpc7y3V1m40wESHTgc1422pwwBSKYuI= github.com/lucasb-eyer/go-colorful v1.3.0 h1:2/yBRLdWBZKrf7gB40FoiKfAWYQ0lqNcbuQwVHXptag= @@ -183,8 +175,8 @@ github.com/muesli/cancelreader v0.2.2 h1:3I4Kt4BQjOR54NavqnDogx/MIoWBFa0StPA8ELU github.com/muesli/cancelreader v0.2.2/go.mod h1:3XuTXfFS2VjM+HTLZY9Ak0l6eUKfijIfMUZ4EgX0QYo= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/pb33f/ordered-map/v2 v2.3.1 h1:5319HDO0aw4DA4gzi+zv4FXU9UlSs3xGZ40wcP1nBjY= -github.com/pb33f/ordered-map/v2 v2.3.1/go.mod h1:qxFQgd0PkVUtOMCkTapqotNgzRhMPL7VvaHKbd1HnmQ= +github.com/openai/openai-go/v3 v3.50.0 h1:CXn+C8a10oQiI5CMyMbCiykhITVhVxhdHX8j3CfLa2U= +github.com/openai/openai-go/v3 v3.50.0/go.mod h1:Ogjo0gDct+Jm7yCqaCjLGQGygeV8xNfNHV1/yKvCji0= github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= github.com/prometheus/client_golang v1.25.0 h1:cDtW1TcFsMi1RJc8khwCKB4VhzwV04aKqbYtNOXuiK0= @@ -200,8 +192,6 @@ github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/spiffe/go-spiffe/v2 v2.9.0 h1:g5qTg3qIP1HXV+GzuyEfSJFVxUCpEP5Ui1OINVJHPB4= github.com/spiffe/go-spiffe/v2 v2.9.0/go.mod h1:w2CLWKLMTX/PPYUEUPv3ltH0RXsw5S8suwNF46w9/Aw= -github.com/standard-webhooks/standard-webhooks/libraries v0.0.1 h1:uOfcYT+3QungH6tIGSVCR/Y3KJmgJiHcojJbMTPDZAI= -github.com/standard-webhooks/standard-webhooks/libraries v0.0.1/go.mod h1:L1MQhA6x4dn9r007T033lsaZMv9EmBAdXyU/+EF40fo= github.com/stretchr/testify v1.12.1 h1:EuwCh5fleGS7H32xRwO3wRGT7DxrDhLAT6FF8MpWDWE= github.com/stretchr/testify v1.12.1/go.mod h1:MDEgiDPPsNp5cuIrHPPCyornHKgEVbtFUmoNlxoYthg= github.com/tidwall/gjson v1.14.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= @@ -218,8 +208,6 @@ github.com/ulikunitz/xz v0.5.17 h1:flR0y/x1hgM8EGV1AW3Xll6T413G0glV8UfBwR617V4= github.com/ulikunitz/xz v0.5.17/go.mod h1:H9Rt/W6/Qj27PGauhQc6nfCDy7vHpzsOThBSaYDoEhw= github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavMF/ppJZNG9ZpyihvCd0w101no= github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM= -github.com/yosida95/uritemplate/v3 v3.0.2 h1:Ed3Oyj9yrmi9087+NczuL5BwkIc4wvTb5zIM+UJPGz4= -github.com/yosida95/uritemplate/v3 v3.0.2/go.mod h1:ILOh0sOhIJR3+L/8afwt/kE++YT040gmv5BQTMR2HP4= go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= go.opentelemetry.io/contrib/detectors/gcp v1.47.0 h1:Ct6+aaiSO6Nk5SOb6PYcR7iWp+83YF/pL1OJcGqOmbg= @@ -256,8 +244,6 @@ go.yaml.in/yaml/v2 v2.4.4 h1:tuyd0P+2Ont/d6e2rl3be67goVK4R6deVxCUX5vyPaQ= go.yaml.in/yaml/v2 v2.4.4/go.mod h1:gMZqIpDtDqOfM0uNfy0SkpRhvUryYH0Z6wdMYcacYXQ= go.yaml.in/yaml/v3 v3.0.5 h1:N6y/pJk8buWs9NY5ERU2HSMfm+IuD/OtfdAnq6kESPw= go.yaml.in/yaml/v3 v3.0.5/go.mod h1:HVTZu1O7/Vkt2N+BFy8Zza+lnLsABggaTM2ZpNIGuKg= -go.yaml.in/yaml/v4 v4.0.0-rc.3 h1:3h1fjsh1CTAPjW7q/EMe+C8shx5d8ctzZTrLcs/j8Go= -go.yaml.in/yaml/v4 v4.0.0-rc.3/go.mod h1:aZqd9kCMsGL7AuUv/m/PvWLdg5sjJsZ4oHDEnfPPfY0= golang.org/x/crypto v0.58.0 h1:COkYLr4k7nDI4r6QtMML2AfzeIswWHAJthLS6K/M/54= golang.org/x/crypto v0.58.0/go.mod h1:Xh+kl5A+M0gMiWDytH2Hhr5Z7WbNCpv/eB/EFgfSk+w= golang.org/x/exp v0.0.0-20261014143641-f0251eb4aa3e h1:HgI6W1OolKK6tcV74is+rl9SMT0njsHlp0TbQiGXI/A= diff --git a/go.mod b/go.mod index 0dc084a7f..ed1728602 100644 --- a/go.mod +++ b/go.mod @@ -1,23 +1,23 @@ module charm.land/fantasy -go 1.27.3 +go 1.26.5 require ( charm.land/x/vcr v0.1.1 cloud.google.com/go/auth v0.24.1 - github.com/anthropics/anthropic-sdk-go v1.75.0 - github.com/ardanlabs/kronk v1.33.0 + github.com/ardanlabs/kronk v1.31.5 github.com/aws/aws-sdk-go-v2 v1.47.3 github.com/aws/aws-sdk-go-v2/config v1.33.9 github.com/aws/smithy-go v1.28.6 - github.com/charmbracelet/openai-go v0.0.0-20260921175203-216db9e71b83 + github.com/charmbracelet/anthropic-sdk-go v0.0.0-20260223140439-63879b0b8dab github.com/charmbracelet/x/exp/slice v0.1.0 github.com/charmbracelet/x/exp/strings v0.1.0 github.com/charmbracelet/x/json v0.2.0 github.com/go-viper/mapstructure/v2 v2.5.0 github.com/google/uuid v1.6.0 github.com/joho/godotenv v1.5.1 - github.com/kaptinlin/jsonschema v0.9.10 + github.com/kaptinlin/jsonschema v0.9.8 + github.com/openai/openai-go/v3 v3.50.0 github.com/stretchr/testify v1.12.1 golang.org/x/net v0.61.0 golang.org/x/oauth2 v0.37.0 @@ -34,7 +34,7 @@ require ( cloud.google.com/go/storage v1.69.0 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.62.0 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.62.0 // indirect - github.com/ardanlabs/jinja v1.9.0 // indirect + github.com/ardanlabs/jinja v1.8.0 // indirect github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.22 // indirect github.com/aws/aws-sdk-go-v2/credentials v1.20.9 // indirect github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.20.3 // indirect @@ -50,19 +50,17 @@ require ( github.com/aws/aws-sdk-go-v2/service/sso v1.38.4 // indirect github.com/aws/aws-sdk-go-v2/service/ssooidc v1.43.4 // indirect github.com/aws/aws-sdk-go-v2/service/sts v1.51.4 // indirect - github.com/bahlo/generic-list-go v0.2.0 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d // indirect - github.com/buger/jsonparser v1.1.2 // indirect github.com/cenkalti/backoff/v5 v5.0.3 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/cncf/xds/go v0.0.0-20260202195803-dba9d589def2 // indirect - github.com/coder/websocket v1.8.15 // indirect github.com/ebitengine/purego v0.11.2 // indirect github.com/envoyproxy/go-control-plane/envoy v1.40.0 // indirect github.com/envoyproxy/protoc-gen-validate v1.3.3 // indirect github.com/felixge/httpsnoop v1.1.0 // indirect github.com/go-jose/go-jose/v4 v4.1.6 // indirect + github.com/go-json-experiment/json v0.0.0-20260623181947-01eb4420fa68 // indirect github.com/go-logr/logr v1.4.4 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/goccy/go-yaml v1.19.2 // indirect @@ -76,27 +74,23 @@ require ( github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-getter v1.8.10 // indirect github.com/hashicorp/go-version v1.9.0 // indirect - github.com/hybridgroup/yzma v1.30.1-0.20261020171642-4e61a127c953 // indirect - github.com/invopop/jsonschema v0.14.0 // indirect + github.com/hybridgroup/yzma v1.23.0 // indirect github.com/jupiterrider/ffi v0.8.0 // indirect github.com/kaptinlin/jsonpointer v0.4.28 // indirect github.com/klauspost/compress v1.20.3 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect - github.com/pb33f/ordered-map/v2 v2.3.1 // indirect github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect github.com/prometheus/client_golang v1.25.0 // indirect github.com/prometheus/client_model v0.6.3 // indirect github.com/prometheus/common v0.72.1 // indirect github.com/prometheus/procfs v0.22.0 // indirect github.com/spiffe/go-spiffe/v2 v2.9.0 // indirect - github.com/standard-webhooks/standard-webhooks/libraries v0.0.1 // indirect github.com/tidwall/gjson v1.19.0 // indirect github.com/tidwall/match v1.1.1 // indirect github.com/tidwall/pretty v1.2.1 // indirect github.com/tidwall/sjson v1.2.5 // indirect github.com/ulikunitz/xz v0.5.17 // indirect - github.com/yosida95/uritemplate/v3 v3.0.2 // indirect go.opentelemetry.io/auto/sdk v1.2.1 // indirect go.opentelemetry.io/contrib/detectors/gcp v1.47.0 // indirect go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.72.0 // indirect diff --git a/go.sum b/go.sum index 41e765888..88a17c5c9 100644 --- a/go.sum +++ b/go.sum @@ -1,165 +1,81 @@ -cel.dev/expr v0.25.2 h1:K6j46C81hXtZQfuX60cVWQFBJahKSE2gfRbNuvr5bFs= -cel.dev/expr v0.25.2/go.mod h1:hrXvqGP6G6gyx8UAHSHJ5RGk//1Oj5nXQ2NI02Nrsg4= cel.dev/expr v0.25.3 h1:A2jO8jwOugrrovveCWfj0KEZOfqiLgAcwjpHPhzIGw0= cel.dev/expr v0.25.3/go.mod h1:hrXvqGP6G6gyx8UAHSHJ5RGk//1Oj5nXQ2NI02Nrsg4= charm.land/x/vcr v0.1.1 h1:PXCFMUG0rPtyk35rhfzYCJEduOzWXCIbrXTFq4OF/9Q= charm.land/x/vcr v0.1.1/go.mod h1:eByq2gqzWvcct/8XE2XO5KznoWEBiXH56+y2gphbltM= cloud.google.com/go v0.123.0 h1:2NAUJwPR47q+E35uaJeYoNhuNEM9kM8SjgRgdeOJUSE= cloud.google.com/go v0.123.0/go.mod h1:xBoMV08QcqUGuPW65Qfm1o9Y4zKZBpGS+7bImXLTAZU= -cloud.google.com/go/auth v0.22.0 h1:Xp9wAKkLoeaYb5pYZZoQGz4E9sdPxIbzS3gywZE3ciQ= -cloud.google.com/go/auth v0.22.0/go.mod h1:M9o2Oz+YI2jAfxewJgb1vyI3vceHF+eohmxyzmrl+9s= cloud.google.com/go/auth v0.24.1 h1:NTmd2iJb4DsGIav0KiqFMYI88nMshA2wnFMBatRmoCs= cloud.google.com/go/auth v0.24.1/go.mod h1:1dmBXa9xfBvBr39ZnDUDkaaA91ccq9CcqENDgJA4d7c= -cloud.google.com/go/auth/oauth2adapt v0.2.8 h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIiLpZnkHRbnc= -cloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c= cloud.google.com/go/auth/oauth2adapt v0.3.0 h1:FY8oSZpCYoUNv6QxVODuMjQz4IlSOVeiQtZ08vLPz88= cloud.google.com/go/auth/oauth2adapt v0.3.0/go.mod h1:7+2uCm7++XFO+/lN06c2HXpDXb/NMNn2/UwyBPbTnkk= cloud.google.com/go/compute/metadata v0.10.0 h1:pyKMUQSwchgkIBBJGdILqQbs/BNJXqwSA7Ej6LAvvtY= cloud.google.com/go/compute/metadata v0.10.0/go.mod h1:rGFHRrIif570kSibjFTMbt6/4/tzgJWFGI/HVol4GIk= -cloud.google.com/go/compute/metadata v0.9.0 h1:pDUj4QMoPejqq20dK0Pg2N4yG9zIkYGdBtwLoEkH9Zs= -cloud.google.com/go/compute/metadata v0.9.0/go.mod h1:E0bWwX5wTnLPedCKqk3pJmVgCBSM6qQI1yTBdEb3C10= -cloud.google.com/go/iam v1.12.0 h1:Aki3bX9aHUDKPHfnRJfDcTdVedvy6quGBQcTqx3DRXk= -cloud.google.com/go/iam v1.12.0/go.mod h1:FEZ4lXpADAC2AIpQY7LANNjjwyQ2jK439CI2VaD+sLY= cloud.google.com/go/iam v1.14.0 h1:YRIB1/4xxwJ+NfI6RQr1WaOoHHeV0MizJEj940nBXJA= cloud.google.com/go/iam v1.14.0/go.mod h1:JTPZfbHdGXJrOYREtkRoFzCDGaBdbA7ILLKO/DDuav0= -cloud.google.com/go/logging v1.19.0 h1:NCqhdVUg3wQ8Cobdf16FDSuTGi3+6+hdSBHrY5TsR6Q= -cloud.google.com/go/logging v1.19.0/go.mod h1:i40NZCHC9Gqvod4yE+yQfDWwlgwW/SrshkkGibCHxcA= cloud.google.com/go/logging v1.20.0 h1:l7yzCB8/JSY5PHT9RsaqdT1jaBGbM6KlSJDX210HlXM= cloud.google.com/go/logging v1.20.0/go.mod h1:ALUaJQZM691Eeujy9kFx0xREq3AMPuGd+pTRZuTYv+w= -cloud.google.com/go/longrunning v1.2.0 h1:WjYH3YHBGCxGJP9M4dWGHBfXr/cFIjMkNgWcJj7/iMM= -cloud.google.com/go/longrunning v1.2.0/go.mod h1:5KMQALFGOCtFoi2xSOA1u3H7WKlhmckgiyFw7+LGQp0= cloud.google.com/go/longrunning v1.3.0 h1:lZ6c8SJJBmILp/Wnr3vGnBLa0q+cYfSHRCcUfVI2hpI= cloud.google.com/go/longrunning v1.3.0/go.mod h1:wpgLxCn+UA3/TZ1bj/fW39mfDpwVlMPu1xKJyoMt7V0= -cloud.google.com/go/monitoring v1.30.0 h1:r/d+JUbyKmJ8b07iznuKfzVzrIXTWxHQ3lBRm3x2LlY= -cloud.google.com/go/monitoring v1.30.0/go.mod h1:htlUR0QWVMrjFzZmN4LGnMAve9xB/eduwjmINxVZ8RM= cloud.google.com/go/monitoring v1.31.0 h1:LCuAoYiq8snyL/eDAG/VC73uWFXeax8+YEfmoNGJUrY= cloud.google.com/go/monitoring v1.31.0/go.mod h1:7uk2dIJIf7ra64dI1VuQ0ttoFqvtKjdzq46u6zNP1hU= -cloud.google.com/go/storage v1.64.0 h1:KLpxI/oX9LxeRsNqn877d2WyeT3ryiEwnGt8pwcSPZg= -cloud.google.com/go/storage v1.64.0/go.mod h1:lWyAtwvDZHdL3k68WVKbESP6bmWaV23ZJJ/JEVw/ZaQ= cloud.google.com/go/storage v1.69.0 h1:jAAMC1411HEh78nKsU0Zns+eFj3TnhjAWIhg5Ud/XBM= cloud.google.com/go/storage v1.69.0/go.mod h1:PELYsxTYm2peE4mwLEC1+mS1dA/kUSRUxNv56rOy44g= cloud.google.com/go/trace v1.16.0 h1:GmQovzFc5F0CNfl0VLgL64aoTtu7xsM0YajW2GlG9+E= cloud.google.com/go/trace v1.16.0/go.mod h1:r+bdAn16dKLSV1G2D5v3e58IlQlizfxWrUfjx7kM7X0= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.22.0 h1:aokoqcHvaGjiM3VpjKDfMMnF/8epJ+Q1HLJ7CudztqE= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.22.0/go.mod h1:/WYEx9pcM9Y+Dd/APJaNlSvVSvzl54rrMdZT5+Oi2LM= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.14.0 h1:CU4+EJeJi3TKYWEcYuSdWsjzw0nVsK/H0MSQOiPcymU= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.14.0/go.mod h1:q0+UTSRvShwUCrR/s5HtyInYphN7Wvxb7snFM3u+SLA= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.12.0 h1:fhqpLE3UEXi9lPaBRpQ6XuRW0nU7hgg4zlmZZa+a9q4= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.12.0/go.mod h1:7dCRMLwisfRH3dBupKeNCioWYUZ4SS09Z14H+7i8ZoY= -github.com/AzureAD/microsoft-authentication-library-for-go v1.7.2 h1:RHK7bS+HQMslb1sZpAokUt+zTVmue0hKSs2C791hhzU= -github.com/AzureAD/microsoft-authentication-library-for-go v1.7.2/go.mod h1:HKpQxkWaGLJ+D/5H8QRpyQXA1eKjxkFlOMwck5+33Jk= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.35.0 h1:bN1gA3of5bXtbnLsRPrwfmbbe7A5UWFlcTHseujLnpc= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.35.0/go.mod h1:Yj5vHEz/aAepZGliRJsA6uvHAVAQyEwajq9ORCHPxzM= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.59.0 h1:c/Ivw7FuawPLfrr+zB0LZKeCchO2cAHQpF2qZ6OV7rQ= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.59.0/go.mod h1:Zba7lknY/d78oxbKqFTmCsaGwfpzeJ3ktrrLXtnTV6g= github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.62.0 h1:5y2LR2pripbccOte6BpZ+guv5O5W0OQIfKvUYZrGaAQ= github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.62.0/go.mod h1:b3f7EifFRqkVt142USoGIP62uUeZm7ALCPrs1ZjWXYo= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.59.0 h1:xTXsqDOj5k9mK3VVWHYUryryJCIdYfXxdjKFwpzINUw= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.59.0/go.mod h1:V9g30lTKzfUsEW+gpWssck6u9IhARajmipodImLLcwI= github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.62.0 h1:tRsXhJnn0w0TNwJpVrB94wsrimzjWKFzdQlUhRdNUzc= github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.62.0/go.mod h1:ifhe5teRNcbxg9p353DhOkOgczzL/IBLYFqT1cm1zpM= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.59.0 h1:18FRm6ZcN/x9+ZmhMr96hLcTtlLn2/gHPuDLVeg7XcY= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.59.0/go.mod h1:YqwkQPrWSC7+byyc1VlKbWLBF5JsW5IoL6xUkemYSXk= github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.62.0 h1:aPMa5qZU9dp4fU34o+jQgVIPFIOi20oxYg8TLigmZLg= github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.62.0/go.mod h1:sg6Wqbl0BKKZ5zKnQj2q0qic/3ziF894SCx1LpbX37Y= -github.com/anthropics/anthropic-sdk-go v1.75.0 h1:2oajsgiYwI0Hc8E6K9GttVe6CLwZlfhdxaqFqKVUnvA= -github.com/anthropics/anthropic-sdk-go v1.75.0/go.mod h1:x+lPk/cCl48uRegeP0hlYYBN1b7bEBTveInIMgLicnY= -github.com/ardanlabs/jinja v1.5.0 h1:OkNpmq9fXiCDRHMLCsd+VO/uk8L/tVwNJE+yA3JAhhM= -github.com/ardanlabs/jinja v1.5.0/go.mod h1:aXXzlJfjA+T3XNKA/YT5ZtDq2VJxt5a5siZ8cl9B35Q= -github.com/ardanlabs/jinja v1.9.0 h1:69fjYzJ7OmsjQvXoiiQXuPgZcMmAPHk5vTYmcOMEu7I= -github.com/ardanlabs/jinja v1.9.0/go.mod h1:VMzH0tsq4PgTbN64PqBqqqBKZvKlhkrxHVagcB5Tj8g= -github.com/ardanlabs/kronk v1.29.9 h1:ThmbRCKSXGLl68tOHCMp5gNBCmyEV1Syi66aP+HMoxo= -github.com/ardanlabs/kronk v1.29.9/go.mod h1:419Te3wIWthLXzUvkP0LIh6FVA9Hh1JsCKA2XY+M3jU= -github.com/ardanlabs/kronk v1.33.0 h1:wMcFpSuC4RLyugiXEcyZhkqEVJJ5CyrSSYYf60/3Wk4= -github.com/ardanlabs/kronk v1.33.0/go.mod h1:gNZ9T6t2TOTH02SS+/A7elDqT1hGs4e8jh0uNJ5OtpU= -github.com/aws/aws-sdk-go-v2 v1.43.4 h1:b9FTvbRwy+JCsfp2Wp6wV/KbOx3Aj7nkoFb2cRX0IhE= -github.com/aws/aws-sdk-go-v2 v1.43.4/go.mod h1:70vwSy16txshwG+g55WkpgPKDIByzHI8ccBsOteo3bQ= +github.com/ardanlabs/jinja v1.8.0 h1:NuRapYr/hv8J+4v1KymVAbbu6vuqMu+poXkJHfXqLs4= +github.com/ardanlabs/jinja v1.8.0/go.mod h1:VE5Fa3Zglc+e4tFaapOnA6BRMBRDI7A2qCd3Jse6oyw= +github.com/ardanlabs/kronk v1.31.5 h1:pU335FU7KOT2Mv4j4e2S+QaAVYumTRYYKgISkzrQT7Q= +github.com/ardanlabs/kronk v1.31.5/go.mod h1:ub5hRgH9xtMTTQOtBTPwzP67fx0dDwZGLwrWDpp+fuQ= github.com/aws/aws-sdk-go-v2 v1.47.3 h1:HRoT/MkNi3bjO5xF4dCzLzvVmkvRGHj3/cLINDnJejk= github.com/aws/aws-sdk-go-v2 v1.47.3/go.mod h1:xSl+OSI5ZUw6bSMupWc218zE5Pl+65MCCu3ySWFY99A= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.15 h1:rq/p1VNFfygoKEQ9hHMKsKBE98lspPvT8IxaFs5mFhw= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.15/go.mod h1:bELIhlPfW8OkpDhP1MvCjHDtvv8NhiBTz+K4o26zrXA= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.22 h1:oiEmPz/YMMeh/JvAE8xSxNCIsvWE6lpFe4ZPlyFykQI= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.22/go.mod h1:QWUDuRi9PFjBHIU2iH1Pkldbe7zqLfXJC4wWLbF8nuQ= -github.com/aws/aws-sdk-go-v2/config v1.32.35 h1:UEzXuET8E42lxBPijuACu/tEK7v5lFPlk0Q+GT5WD9E= -github.com/aws/aws-sdk-go-v2/config v1.32.35/go.mod h1:KaMtJpFa2JlL2BStjjHQVwQpzZEmw+ND/EgVrfFoo2g= github.com/aws/aws-sdk-go-v2/config v1.33.9 h1:Hv6bcQUJVnmuWaKjqD6Ot8sE75NrWsWV20oGT5aWle0= github.com/aws/aws-sdk-go-v2/config v1.33.9/go.mod h1:ivowmrZNfBQLcg4QkaItgi5wae4Bzot9RzIdbY1hfTg= -github.com/aws/aws-sdk-go-v2/credentials v1.19.34 h1:y6GkSmcv5myd1ngrYbGmiLlwQqB6TQhOuN/tbSSuWDY= -github.com/aws/aws-sdk-go-v2/credentials v1.19.34/go.mod h1:w3dTcnDVoQIewjo7JG45hduAToikiIFLC4FIO7fndvw= github.com/aws/aws-sdk-go-v2/credentials v1.20.9 h1:SNO55PnWhaDafsOcv16lCA0kdoFMl/YlegWoVsU02s0= github.com/aws/aws-sdk-go-v2/credentials v1.20.9/go.mod h1:+2reOTRtdD3VSBqpRDNwrZIYy8yMCYa7oK3WKTJ/I1I= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.35 h1:+S7kbJoLDDQ5tE+lHrUBgMkzC8NLgsaioS2F3dVoFAE= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.35/go.mod h1:Ak7xXviIARfFdNUJ9Etb0bdVDt/KAvKjMGJVLWXDzik= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.20.3 h1:gr3b87OLB29jymWPzp/CAyXwQRJVE+sC4Wm0qBIKHsk= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.20.3/go.mod h1:BRjf4L/Yx2hY54o+ZibPbLJyMMeSwqYQXwcJfqW66a8= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.35 h1:kzVuGlatQtYinwBJEEyLAbggepCoavosiaHHX9+fD+c= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.35/go.mod h1:0yLx0yEI+SfqeJMPvOtIEFoZbiQYXMGszBueiutQyaI= github.com/aws/aws-sdk-go-v2/internal/configsources v1.5.6 h1:CqL8NN3p4I0JTwwV5MEoatIl4Y2amZ2X9dRD+0hbRL0= github.com/aws/aws-sdk-go-v2/internal/configsources v1.5.6/go.mod h1:exdJ32hMqXl0Wyo6NwqEC5yIhtua3+PDaKE8P29m4qE= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.35 h1:WK6CjihTuLisCjSKKbildJ79sGZZgbBz3iNa7VsKIhU= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.35/go.mod h1:KYleN57luLoe97R7vTnx8PMcVrr9gAcRECtOjl91DNg= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.8.6 h1:FpBq24TG6WVSObTNhQOv7Q0088rounUUlwn3zlNItkM= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.8.6/go.mod h1:ONzdPVYC95oBOu0VWNEsKEntcoemP3xVKjT+qWml1s4= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.36 h1:jbGY4CXLzZElOXgGsexlC3Hi+3YM0rSmk4opFXKqg/k= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.36/go.mod h1:uBu/9aKsS/UQGc72RAt3y54kjgYQxmhut8ZD2dXCDNE= github.com/aws/aws-sdk-go-v2/internal/v4a v1.5.6 h1:Qmn60RWuk9+bd2ddvJJqwf3Cpac3VvGMOdbGemtUhX4= github.com/aws/aws-sdk-go-v2/internal/v4a v1.5.6/go.mod h1:h/YJhe4AVyQxEUMluph10iqV7mjajH7A9L+BHF5ppis= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.15 h1:JJLBQxwY+AFwuPAi5ivGc1ChnTdUt4cXMv7e76m2c/Y= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.15/go.mod h1:lQknBIe78MVL0cQOQDlag8KGflMbMEVFx9mB6O8ENvk= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.21 h1:e6YW5uME30TkrElR+4/xcY7NB6CCj2dcv7vtmGXhfhQ= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.21/go.mod h1:obpHAMP693+f3/A8PkLhIqfK1C+NWWn8zXzqD3OH520= github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.11.7 h1:CwvFlKw0uUScfgOMflXSRZa+ayXgOf6wk7lhyMemQYU= github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.11.7/go.mod h1:4SbD8BB+p+QEnG0aX6DoWwrtk9SufyYXRsUv0nve8LE= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.26 h1:Eflerh7atY6HN0yz60peNLOkJA2ZKUyYjZexMbqwMCE= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.26/go.mod h1:dCAXNDmik9NuTjfsvCvW22S6ZFpxmtoliFoQu5XFkh8= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.35 h1:BBEElKh4a+rKshvjrfpajTe9CbpZvrbb4Jkg2PB7RzA= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.35/go.mod h1:zaZk983w//8beSruBVec/mr4CmDwgZitW/qzGhAAX0g= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.14.6 h1:LHHdobjo5le1sjJdolitV7uVvYg3wkaeM1Ju2fDgeZQ= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.14.6/go.mod h1:CBGB0evAiaMD3Lk4wPO7LQCcCZLuhzL5Qf/wfEUHQ5w= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.34 h1:Lercr2QB2rOrCwyOusmnQ7IiopfkGcZAgMJbjcSdK/s= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.34/go.mod h1:W0xXPPCb2HAqa3cp2f/nRvE+jGgBmchiuXrfBRlfb1I= github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.20.6 h1:mYViDr2azcgxOpRrObZOl631bvavqILoE/L+Kxgbwys= github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.20.6/go.mod h1:OXVdAo9jNhggB+hJRGOyy7WolGTKB6Rg7IIulDeSzPM= -github.com/aws/aws-sdk-go-v2/service/s3 v1.106.2 h1:lFSYDEyC1JHucMH3fdczMTnDaghqNttyRXKM8JY9EJQ= -github.com/aws/aws-sdk-go-v2/service/s3 v1.106.2/go.mod h1:aw1E7RCjxs5Sd8N6WdICMcMroff12Tzxte+ELXXNqRU= github.com/aws/aws-sdk-go-v2/service/s3 v1.114.3 h1:NyeuyXkZL476uoAowNActm4XJO1QPKf7aassgXHpiqA= github.com/aws/aws-sdk-go-v2/service/s3 v1.114.3/go.mod h1:GfoBeKMDJecgRUsGf/0RGdx0NJAh81ObTd922h8pQys= github.com/aws/aws-sdk-go-v2/service/signin v1.10.4 h1:tvpDjuUvgKURf3Yk4hOaGbZ4QdY+070OWcA5d6LUv2A= github.com/aws/aws-sdk-go-v2/service/signin v1.10.4/go.mod h1:3ibVKg5Ng82Zby8++jELTD2nHxiPk2DJRLEeW/LKp8M= -github.com/aws/aws-sdk-go-v2/service/signin v1.5.4 h1:cOJELVNrq5Q3Udry2GLuHUM7MhwpeaQRdYaoa6GI/yI= -github.com/aws/aws-sdk-go-v2/service/signin v1.5.4/go.mod h1:f4LxzKBtaTxD7xh3PiVg3CE1tchQemfmghaJr+NbK2c= -github.com/aws/aws-sdk-go-v2/service/sso v1.33.4 h1:AMW7a7S8iQaHjBYZdU3PCq4GKRPijTPRAc7e6XtEThY= -github.com/aws/aws-sdk-go-v2/service/sso v1.33.4/go.mod h1:QQNsFV1DVXoXcZt18FS8lI8rtUrlDyAuWZLQ5shunv4= github.com/aws/aws-sdk-go-v2/service/sso v1.38.4 h1:ChCtagixSFOxltv0o6E3NT8F7ksvZtZGPwUBynO5Nmk= github.com/aws/aws-sdk-go-v2/service/sso v1.38.4/go.mod h1:+FEO9jrVMpc9oN3CdAxJbtlQEu3z8UddDPSedpeM3PY= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.38.4 h1:AsbZcJAQPRmHDJG8K1N0pof/1zPWjVT8TFlTWuGLSvo= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.38.4/go.mod h1:6imqztH0//t0mKbl6yWl7swSEl7F/w32oAmqB3vP1ag= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.43.4 h1:j6c+HA4AoS0EBEjArPjavFEBrucJEryfrQU0TffmACk= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.43.4/go.mod h1:RhghaXUk9q66VtOQUX1FdPddQuHnqQZzbB0fEYXmPRA= -github.com/aws/aws-sdk-go-v2/service/sts v1.45.4 h1:w/AryDYMjSUANSQ2uoZxJovUsMTwWJNTv3IMex30Y+4= -github.com/aws/aws-sdk-go-v2/service/sts v1.45.4/go.mod h1:WeBiAa67azG7Su9Vf+ChGDBLiAozJCXzdjXiPBUwtbc= github.com/aws/aws-sdk-go-v2/service/sts v1.51.4 h1:OKEfbf2tcfsF2pBk/S9QqNpo6alaAtiBs4hysCsBjPw= github.com/aws/aws-sdk-go-v2/service/sts v1.51.4/go.mod h1:mCd6qGo9b8hTtfjgsmNkFlzwjyce4owd7HDVFnCLXhM= -github.com/aws/smithy-go v1.27.6 h1:0zjT8jgK3jbrTT7JJ3EE6JsMhX8JTrZ+f1sEndYDXrA= -github.com/aws/smithy-go v1.27.6/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc= github.com/aws/smithy-go v1.28.6 h1:Pj+/sUviNYjow8ELRtNwKHZ9ECeF+7pATX3+shjLIrw= github.com/aws/smithy-go v1.28.6/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc= -github.com/bahlo/generic-list-go v0.2.0 h1:5sz/EEAK+ls5wF+NeqDpk5+iNdMDXrh3z3nPnH1Wvgk= -github.com/bahlo/generic-list-go v0.2.0/go.mod h1:2KvAjgMlE5NNynlg/5iLrrCCZ2+5xWbdbCW3pNTGyYg= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d h1:xDfNPAt8lFiC1UJrqV3uuy861HCTo708pDMbjHHdCas= github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d/go.mod h1:6QX/PXZ00z/TKoufEY6K/a0k6AhaJrQKdFe6OfVXsa4= -github.com/buger/jsonparser v1.1.2 h1:frqHqw7otoVbk5M8LlE/L7HTnIq2v9RX6EJ48i9AxJk= -github.com/buger/jsonparser v1.1.2/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/charmbracelet/openai-go v0.0.0-20260921175203-216db9e71b83 h1:7k30XdmBd71VAErGCjTTiOAE9F1KUthN9jdCeqQtvZ4= -github.com/charmbracelet/openai-go v0.0.0-20260921175203-216db9e71b83/go.mod h1:8xPfrTomjYl827L3QQay36djXcEkXc80bpH+790o8/A= -github.com/charmbracelet/x/exp/slice v0.0.0-20250904123553-b4e2667e5ad5 h1:DTSZxdV9qQagD4iGcAt9RgaRBZtJl01bfKgdLzUzUPI= -github.com/charmbracelet/x/exp/slice v0.0.0-20250904123553-b4e2667e5ad5/go.mod h1:vI5nDVMWi6veaYH+0Fmvpbe/+cv/iJfMntdh+N0+Tms= github.com/charmbracelet/x/exp/slice v0.1.0 h1:m46dwuDf3M5SFYMRhxYkLC6z9WnENGVKbcbJlp13/og= github.com/charmbracelet/x/exp/slice v0.1.0/go.mod h1:vqEfX6xzqW1pKKZUUiFOKg0OQ7bCh54Q2vR/tserrRA= github.com/charmbracelet/x/exp/strings v0.1.0 h1:i69S2XI7uG1u4NLGeJPSYU++Nmjvpo9nwd6aoEm7gkA= @@ -172,20 +88,12 @@ github.com/coder/anthropic-sdk-go v0.0.0-20260428122333-47cab198e449 h1:X4XOtomD github.com/coder/anthropic-sdk-go v0.0.0-20260428122333-47cab198e449/go.mod h1:hqlYqR7uPKOKfnNeicUbZp0Ps0GeYFlKYtwh5HGDCx8= github.com/coder/openai-go/v3 v3.0.0-20260810104509-c6da967b6fba h1:XY8zcakes91/AaLABciCM5wkahoF8YL9iAh/NPusmfo= github.com/coder/openai-go/v3 v3.0.0-20260810104509-c6da967b6fba/go.mod h1:Ogjo0gDct+Jm7yCqaCjLGQGygeV8xNfNHV1/yKvCji0= -github.com/coder/websocket v1.8.15 h1:6B2JPeOGlpff2Uz6vOEH1Vzpi0iUz20A+lPVhPHtNUA= -github.com/coder/websocket v1.8.15/go.mod h1:NX3SzP+inril6yawo5CQXx8+fk145lPDC6pumgx0mVg= -github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= -github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dnaeon/go-vcr v1.2.0 h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI= github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= -github.com/ebitengine/purego v0.10.2 h1:W809HbnvzAxgdm+aOvlSekrM16wGCdT/e76+9tS7gzE= -github.com/ebitengine/purego v0.10.2/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= github.com/ebitengine/purego v0.11.2 h1:WWiTx8rD8zYdOwSj8O/NiNbsOvSAgJMTlyV1XlbUSeU= github.com/ebitengine/purego v0.11.2/go.mod h1:DCHPP08djqhNSoTfImcnHYQRZmd0qhakvrozqaEYhGQ= github.com/envoyproxy/go-control-plane v0.14.0 h1:hbG2kr4RuFj222B6+7T83thSPqLjwBIfQawTkC++2HA= github.com/envoyproxy/go-control-plane v0.14.0/go.mod h1:NcS5X47pLl/hfqxU70yPwL9ZMkUlwlKxtAohpi2wBEU= -github.com/envoyproxy/go-control-plane/envoy v1.37.0 h1:u3riX6BoYRfF4Dr7dwSOroNfdSbEPe9Yyl09/B6wBrQ= -github.com/envoyproxy/go-control-plane/envoy v1.37.0/go.mod h1:DReE9MMrmecPy+YvQOAOHNYMALuowAnbjjEMkkWOi6A= github.com/envoyproxy/go-control-plane/envoy v1.40.0 h1:G4dcl8KE/HVPnZ25BBdvGZWi8JjyeBfQSvm95U5P1Qc= github.com/envoyproxy/go-control-plane/envoy v1.40.0/go.mod h1:UZVGjwWu2QV8PkGSlXmqWiSgqCGZe16TgIu4jDl3T5w= github.com/envoyproxy/go-control-plane/ratelimit v0.1.0 h1:/G9QYbddjL25KvtKTv3an9lx6VBE2cnb8wp1vEGNYGI= @@ -194,8 +102,6 @@ github.com/envoyproxy/protoc-gen-validate v1.3.3 h1:MVQghNeW+LZcmXe7SY1V36Z+WFMD github.com/envoyproxy/protoc-gen-validate v1.3.3/go.mod h1:TsndJ/ngyIdQRhMcVVGDDHINPLWB7C82oDArY51KfB0= github.com/felixge/httpsnoop v1.1.0 h1:3YtUj32ZZkqZtt3sZZsClsymw/QDuVfpNhoA31zeORc= github.com/felixge/httpsnoop v1.1.0/go.mod h1:Zqxgdd+1Rkcz8euOqdr7lqgCRJztwr5hp9vDSi5UZCE= -github.com/go-jose/go-jose/v4 v4.1.4 h1:moDMcTHmvE6Groj34emNPLs/qtYXRVcd6S7NHbHz3kA= -github.com/go-jose/go-jose/v4 v4.1.4/go.mod h1:x4oUasVrzR7071A4TnHLGSPpNOm2a21K9Kf04k1rs08= github.com/go-jose/go-jose/v4 v4.1.6 h1:sNRkftxFJxwsILiQukqp5z83QBSmntVwmgRY7AqBDO4= github.com/go-jose/go-jose/v4 v4.1.6/go.mod h1:x4oUasVrzR7071A4TnHLGSPpNOm2a21K9Kf04k1rs08= github.com/go-json-experiment/json v0.0.0-20260623181947-01eb4420fa68 h1:KZaTBSyshWX3MP5jukJcNSuXDQTO+rNpt0J564dX/eg= @@ -209,8 +115,6 @@ github.com/go-viper/mapstructure/v2 v2.5.0 h1:vM5IJoUAy3d7zRSVtIwQgBj7BiWtMPfmPE github.com/go-viper/mapstructure/v2 v2.5.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/goccy/go-yaml v1.19.2 h1:PmFC1S6h8ljIz6gMRBopkjP1TVT7xuwrButHID66PoM= github.com/goccy/go-yaml v1.19.2/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA= -github.com/golang-jwt/jwt/v5 v5.3.1 h1:kYf81DTWFe7t+1VvL7eS+jKFVWaUnK9cB1qbwn63YCY= -github.com/golang-jwt/jwt/v5 v5.3.1/go.mod h1:fxCRLWMO43lRc8nhHWY6LGqRcf+1gQWArsqaEUEa5bE= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= @@ -219,102 +123,52 @@ github.com/google/martian/v3 v3.3.3 h1:DIhPTQrbPkgs2yJYdXU/eNACCG5DVQjySNRNlflZ9 github.com/google/martian/v3 v3.3.3/go.mod h1:iEPrYcgCF7jA9OtScMFQyAlZZ4YXTKEtJ1E6RWzmBA0= github.com/google/s2a-go v0.1.11 h1:7v1V1TraNGP63WptsAkNqr2w8jgm4vM6A6qx6Lsw9iM= github.com/google/s2a-go v0.1.11/go.mod h1:pz4tyvwXvJLLbyrkh6FW1eS2zPUXMaTmyNhYtyP2tNw= -github.com/google/s2a-go v0.1.9 h1:LGD7gtMgezd8a/Xak7mEWL0PjoTQFvpRudN895yqKW0= -github.com/google/s2a-go v0.1.9/go.mod h1:YA0Ei2ZQL3acow2O62kdp9UlnvMmU7kA6Eutn0dXayM= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.3.19 h1:mMOE7DN2+p76/EdIrmAy9B9bH+yC4563vmnJ34QR8i4= -github.com/googleapis/enterprise-certificate-proxy v0.3.19/go.mod h1:rSEsBUemEBZEexP2y6jPp16LUmUbjmSbcPMQizR0o4k= github.com/googleapis/enterprise-certificate-proxy v0.3.23 h1:J+VGF1wjAM2dU2kKUXZxJdDppRLReWP7KWcclfngQhc= github.com/googleapis/enterprise-certificate-proxy v0.3.23/go.mod h1:Y8NO/15GNLkrXI3OR5xOFmeU3XLX1sLSdtlXgJ0zmIw= -github.com/googleapis/gax-go/v2 v2.23.0 h1:Tchl7qkvE7Ip3y+ztvNufYFvkfqTe7NfLTYGIdJRLuE= -github.com/googleapis/gax-go/v2 v2.23.0/go.mod h1:rBQKOVJCdb8IFEzg+FCwlt1LP/xMDGuqUXhUG+XMXEg= github.com/googleapis/gax-go/v2 v2.27.0 h1:qe2iQOUzxb3fd6x6ewpIEixPQhJ+0Ihc/RRZhKA/2g0= github.com/googleapis/gax-go/v2 v2.27.0/go.mod h1:RofiqDw3ehcG4L0H1zO3D2Itpwd3/uS/7wdmbNDF1DE= github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.29.0 h1:5VipnvEpbqr2gA2VbM+nYVbkIF28c5ZQfqCBQ5g2xfk= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.29.0/go.mod h1:Hyl3n6Twe1hvtd9XUXDec4pTvgMSEixRuQKPTMH2bNs= github.com/grpc-ecosystem/grpc-gateway/v2 v2.32.0 h1:QMILzF8BA7xftE4zVORkRrlv08m12St3csK4RsyRgRs= github.com/grpc-ecosystem/grpc-gateway/v2 v2.32.0/go.mod h1:+ZQ6iUL8+ATyxGDQNuRKpNwJFdGDUi0e7E1QL9MvI7U= -github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.74 h1:mymLUKThnV9wFvogOK8NnsMP9/vlhnjXY98gr2QIGW8= -github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.74/go.mod h1:Bh9qYL8ehmDxSg14Tk8oxFCP90XHfs6NxV1D84884xA= github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.76 h1:lv1kai0y585J8lMNBhyOoVQssXp3pBv5lLeKb38n+BY= github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.76/go.mod h1:LlNlsklP+YHM+y1x1SNdOgbXIih0fyqpvB8iGik/sDo= github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= github.com/hashicorp/go-getter v1.8.10 h1:uufJp+uacA0fSDRxclsHkiE6yUQTKgwv5b25QexgVM8= github.com/hashicorp/go-getter v1.8.10/go.mod h1:5HyKGCQmT+I3MGAM76vk/fWpktjwxn7xruCUr9CrVuo= -github.com/hashicorp/go-getter v1.8.6 h1:9sQboWULaydVphxc4S64oAI4YqpuCk7nPmvbk131ebY= -github.com/hashicorp/go-getter v1.8.6/go.mod h1:nVH12eOV2P58dIiL3rsU6Fh3wLeJEKBOJzhMmzlSWoo= github.com/hashicorp/go-version v1.9.0 h1:CeOIz6k+LoN3qX9Z0tyQrPtiB1DFYRPfCIBtaXPSCnA= github.com/hashicorp/go-version v1.9.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hybridgroup/yzma v1.21.0 h1:xBgCH9ziielLeexci8eJ/PvnxCzgLktOaoHH5p/ef30= -github.com/hybridgroup/yzma v1.21.0/go.mod h1:wAMtNTjSnE79jTWzaeFSsuraam0TXKCPajMHA5s+OX8= -github.com/hybridgroup/yzma v1.30.1-0.20261020171642-4e61a127c953 h1:9JeY59VBx5tXm1NPjXhBqiOkUxDUcZ5L5CtcxnDGoQg= -github.com/hybridgroup/yzma v1.30.1-0.20261020171642-4e61a127c953/go.mod h1:ovV3WQ5v3X53vqo9Izg/28QHEXaVasW9b4Kgkhk05T0= -github.com/invopop/jsonschema v0.14.0 h1:MHQqLhvpNUZfw+hM3AZDYK7jxO8FZoQeQM77g8iyZjg= -github.com/invopop/jsonschema v0.14.0/go.mod h1:ygm6C2EaVNMBDPpaPlnOA2pFAxBnxGjFlMZABxm9n2I= +github.com/hybridgroup/yzma v1.23.0 h1:AqwwhnPOS0I4TzRTCuWxXqGK/kY2P+QZ3+qiJOM3Jl0= +github.com/hybridgroup/yzma v1.23.0/go.mod h1:wAMtNTjSnE79jTWzaeFSsuraam0TXKCPajMHA5s+OX8= github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= -github.com/jupiterrider/ffi v0.7.0 h1:RKsl6Ascal+3kyAqR5Qcbp83LceQMLc1VZbPfHWoNzs= -github.com/jupiterrider/ffi v0.7.0/go.mod h1:9dauhpOfNqrqk28fxuu0kkdeFtT9Qr4vbfigiuIXN7c= github.com/jupiterrider/ffi v0.8.0 h1:IH6lto8OZaRIulQYObtZibII4tq71hXT6Z+KLBcxCcQ= github.com/jupiterrider/ffi v0.8.0/go.mod h1:9dauhpOfNqrqk28fxuu0kkdeFtT9Qr4vbfigiuIXN7c= github.com/kaptinlin/jsonpointer v0.4.28 h1:PyxOfdml9PGpxQz+JnNLGsyzQ+Rnm+OVNTGcgbVLqgg= github.com/kaptinlin/jsonpointer v0.4.28/go.mod h1:JzeIDw1+60bryzOFea9P3zjKg8pfJHd+UIA/zfZ70x8= -github.com/kaptinlin/jsonschema v0.9.10 h1:dnMgwshay3YVUjFEHn6Bnf5oZ3LE1iQAL4iB2vSmviM= -github.com/kaptinlin/jsonschema v0.9.10/go.mod h1:ZgmK1hBhK8zmScMktiE+DRr3U3POBHupO4TvnFntel0= github.com/kaptinlin/jsonschema v0.9.8 h1:srpfx2MAm4ecYz0zJLbz6fiW+UXiuv+vGhUqZUIWmrg= github.com/kaptinlin/jsonschema v0.9.8/go.mod h1:TP7RFmFBNExjBE0b3fsM6RpA/9PeOzfg2g4weXqOrDg= -github.com/klauspost/compress v1.19.1 h1:VsB4HPswih7mmZ8WleSFQ75c/Ui1M4trX5oAsJnhSlk= -github.com/klauspost/compress v1.19.1/go.mod h1:cwPg85FWrGar70rWktvGQj8/hthj3wpl0PGDogxkrSQ= github.com/klauspost/compress v1.20.3 h1:zWNoFqq/lSuYQRim3dUXlXeA0IqwuZGicdG5ZTfY5j4= github.com/klauspost/compress v1.20.3/go.mod h1:LUdAzn7YLVvxLpc7y3V1m40wESHTgc1422pwwBSKYuI= -github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= -github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= -github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= -github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= -github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/pb33f/ordered-map/v2 v2.3.1 h1:5319HDO0aw4DA4gzi+zv4FXU9UlSs3xGZ40wcP1nBjY= -github.com/pb33f/ordered-map/v2 v2.3.1/go.mod h1:qxFQgd0PkVUtOMCkTapqotNgzRhMPL7VvaHKbd1HnmQ= -github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ= -github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU= github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= -github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= -github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.24.1 h1:JnJkREXzWxUdCuPFpIWZiPispT9xVV59uiuyR2bPlnU= -github.com/prometheus/client_golang v1.24.1/go.mod h1:F+oSRECHg4sse5ucfYpYDeIv/hu68Zo0uoHKetWnzcE= github.com/prometheus/client_golang v1.25.0 h1:cDtW1TcFsMi1RJc8khwCKB4VhzwV04aKqbYtNOXuiK0= github.com/prometheus/client_golang v1.25.0/go.mod h1:j2X/4/kaQHLPnmyEU8zjmkndo1T317VpCIQEml8LTKk= -github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= -github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= github.com/prometheus/client_model v0.6.3 h1:O0jaTVAYNxTHYInEPFJt5I3+sN8zqBtVMPTB1qyxiEo= github.com/prometheus/client_model v0.6.3/go.mod h1:gpN5P9S7Rr6Yr92PiQ+Ixvhf6JZEkF1dnxsYL2aPBEM= -github.com/prometheus/common v0.70.1 h1:1HvjP4D5oL3t8RsPlwxA9onvvStjtIHYE5XuuwOi/PY= -github.com/prometheus/common v0.70.1/go.mod h1:VdFUQDMZK3VLkurFUVhia6uys/0suUp86TJz5qbJRhc= github.com/prometheus/common v0.72.1 h1:ZAiQed/nk8IIcsdzb2TlJu23NEUDyDLQ9TXTN2WRK6Y= github.com/prometheus/common v0.72.1/go.mod h1:1IoBY4IRaJnhs2ESjNzjilP1cJ/P8pimGoomq7zRXrA= -github.com/prometheus/procfs v0.21.1 h1:GljZCt+zSTS+NZq88cyQ1LjZ+RCHp3uVuabBWA5+OJI= -github.com/prometheus/procfs v0.21.1/go.mod h1:aB55Cww9pdSJVHk0hUf0inxWyyjPogFIjmHKYgMKmtY= github.com/prometheus/procfs v0.22.0 h1:6q9+/JL9IKAPbCmBrv9n5O5Ty3NKnciV5X7YGw0oics= github.com/prometheus/procfs v0.22.0/go.mod h1:CvmFr/GVhIjIvWJZW3tgkODBQMRIf0EyWMQLHCHab58= -github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= -github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= -github.com/spiffe/go-spiffe/v2 v2.8.1 h1:eXZMLsu+3MLEPJyGJkolqtVrteZfQdUpOWj6LTiDl/E= -github.com/spiffe/go-spiffe/v2 v2.8.1/go.mod h1:47Q0Q9/AqGha8QLHp+kxpH4Wca7X7EnOtlIJy3mxZ3U= github.com/spiffe/go-spiffe/v2 v2.9.0 h1:g5qTg3qIP1HXV+GzuyEfSJFVxUCpEP5Ui1OINVJHPB4= github.com/spiffe/go-spiffe/v2 v2.9.0/go.mod h1:w2CLWKLMTX/PPYUEUPv3ltH0RXsw5S8suwNF46w9/Aw= -github.com/standard-webhooks/standard-webhooks/libraries v0.0.1 h1:uOfcYT+3QungH6tIGSVCR/Y3KJmgJiHcojJbMTPDZAI= -github.com/standard-webhooks/standard-webhooks/libraries v0.0.1/go.mod h1:L1MQhA6x4dn9r007T033lsaZMv9EmBAdXyU/+EF40fo= -github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= -github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= github.com/stretchr/testify v1.12.1 h1:EuwCh5fleGS7H32xRwO3wRGT7DxrDhLAT6FF8MpWDWE= github.com/stretchr/testify v1.12.1/go.mod h1:MDEgiDPPsNp5cuIrHPPCyornHKgEVbtFUmoNlxoYthg= github.com/tidwall/gjson v1.14.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= @@ -327,66 +181,36 @@ github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4= github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY= github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28= -github.com/ulikunitz/xz v0.5.16 h1:ld6NyySjx5lowVKwJvMRLnW5nxKX/xnpSiFYZ/Lxur0= -github.com/ulikunitz/xz v0.5.16/go.mod h1:H9Rt/W6/Qj27PGauhQc6nfCDy7vHpzsOThBSaYDoEhw= github.com/ulikunitz/xz v0.5.17 h1:flR0y/x1hgM8EGV1AW3Xll6T413G0glV8UfBwR617V4= github.com/ulikunitz/xz v0.5.17/go.mod h1:H9Rt/W6/Qj27PGauhQc6nfCDy7vHpzsOThBSaYDoEhw= -github.com/yosida95/uritemplate/v3 v3.0.2 h1:Ed3Oyj9yrmi9087+NczuL5BwkIc4wvTb5zIM+UJPGz4= -github.com/yosida95/uritemplate/v3 v3.0.2/go.mod h1:ILOh0sOhIJR3+L/8afwt/kE++YT040gmv5BQTMR2HP4= go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= -go.opentelemetry.io/contrib/detectors/gcp v1.44.0 h1:NmLfL734pJhM0JKaYd2Y28+nY9dPRWYAAbxhRCrKXPw= -go.opentelemetry.io/contrib/detectors/gcp v1.44.0/go.mod h1:tNAsgd8avTGke1+MndXlU5Cru4PQ9Ai/cCNWQv/ZJ/s= go.opentelemetry.io/contrib/detectors/gcp v1.47.0 h1:Ct6+aaiSO6Nk5SOb6PYcR7iWp+83YF/pL1OJcGqOmbg= go.opentelemetry.io/contrib/detectors/gcp v1.47.0/go.mod h1:3N259ss0b1AVOs+fYw7lOO0mcUwNqSIpQ+Zitpuqx00= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.69.0 h1:2yEATaop1/a1I4psnSLgWVPLWwCzkqWakgJy7xTDVy0= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.69.0/go.mod h1:D7J12YRapIekYyPWgGPlA/23pRmpSEZC5xJC/TTLI9U= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.72.0 h1:Tq+E65HaNbZTeqcLw6QUhsV+/EIWdkfUH2CQzcrlE5M= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.72.0/go.mod h1:A+EVhDakAj1waJBPhmTszZaSr08ww8MRRKy1nB1rqck= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.69.0 h1:8tvICD4vSTOOsNrsI4Ljf6C+6UKvpTEH5XY3JMoyPoo= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.69.0/go.mod h1:z9+yiacE0IHRqM4qFfkbt/JYlmYXgss8GY/jXoNuPJI= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.72.0 h1:LxwW/9ctSCv+QkE/cLR7M91ZIkXNMqJtEMi1vCw9U8s= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.72.0/go.mod h1:tOsftB4SslBwwErVEPaenU2RpThXWPIU8DoJHEC4dyw= -go.opentelemetry.io/otel v1.44.0 h1:JjwHmHpA4iZ3wBxluu2fbbE7j4kqlE8jXyAyPXH7HqU= -go.opentelemetry.io/otel v1.44.0/go.mod h1:BMgjTHL9WPRlRjL2oZCBTL4whCGtXch2H4BhOPIAyYc= go.opentelemetry.io/otel v1.47.0 h1:j7ALJ/zgkS7Z6aeJW09p8VC9804bC+PpeTfCD4XPnOM= go.opentelemetry.io/otel v1.47.0/go.mod h1:8wS9O2qfXrYrzp6hIF/HOYJJf/wIhFPhR2xLuP+iXQU= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.44.0 h1:4YsVu3B8+3qtWYYrsUYgn0OG78pN0rnNPRGX4SbokQI= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.44.0/go.mod h1:+wnlSn0mD1ADVMe3v9Z/WIaiz6q6gL2J/ejaAmdmv80= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.47.0 h1:julhjPeUH/q/7hinbSdDdqt5h7Zw9YWmRlWRhI0jd54= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.47.0/go.mod h1:Ao2mz688LH/tFf0yMAenidq6k2YNSx6SIY2q6jDACck= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.44.0 h1:qazEJlUOQzhCpzQpFETGby7EdqjI1wsd0W+6Gg1SCTU= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.44.0/go.mod h1:fOD2Yefuxixkx3ahVNf0O/PERb6r4OlbxfATVnYvzCo= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.47.0 h1:UFpxOpYPmMNUtOWhdb+nC1WELIgVf8z9higURrbzYU4= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.47.0/go.mod h1:YBGjxe3lt0jtXoEXxGrGhv/jM7oUBUDVK7zhAvNyEjc= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.44.0 h1:hqxVTu/GtBF+vJ8d1fzW7fRxZFvgoDjWcxwwCaFDYpU= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.44.0/go.mod h1:z5fVEF4X5v0ESvlJqBrrFlBVoj5EQuefZpzsu7R+x5Q= go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.45.0 h1:dm9iyzn6tioYZtwqaiBSU0TSI8Yu/8dTIbfG0+B49DY= go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.45.0/go.mod h1:xAvxYjYK28qvt+yu4BYZ/zMmAjwMXINXD6JiMyeB8iI= go.opentelemetry.io/otel/log v1.47.0 h1:cOTS1CcLbSQeZKanGJ+0JpF/+t4PELi3O3bbl2lqCcI= go.opentelemetry.io/otel/log v1.47.0/go.mod h1:9byitSQ5pLC6PpqwGXjqdMKya6ZTswHRZh2vvXT33nw= -go.opentelemetry.io/otel/metric v1.44.0 h1:1w0gILTcHdr3YI+ixLyjemwrVnsMURbTZFrSYCdDdmc= -go.opentelemetry.io/otel/metric v1.44.0/go.mod h1:8O7hanEPBNgEMmybD3s2VBKcgWOCsA6tzHBPODAiquo= go.opentelemetry.io/otel/metric v1.47.0 h1:4PptaldXx3Eat1XjMZ68pPJEs5wrhlemctZE9a3UdWY= go.opentelemetry.io/otel/metric v1.47.0/go.mod h1:ADGSXxRrXM6bjbvLo535EstVFlPpPYZm4LBKixjDHwU= -go.opentelemetry.io/otel/metric/x v0.66.0 h1:YkCrx1zLOChi9ZcZ6euupOcsgzbVlec7D/xoEU1+cTA= -go.opentelemetry.io/otel/metric/x v0.66.0/go.mod h1:d1+BDj9t96do0/1LoU1ayfCv79ZgNE41qbhBvnMOBZk= go.opentelemetry.io/otel/metric/x v0.69.0 h1:DjRLr15H83v+hCW7JA9NoJvOkYTtmq5YoDRbe9deYpM= go.opentelemetry.io/otel/metric/x v0.69.0/go.mod h1:uVvsMPMFFyj/HUQfrUnH3JjnOQ1dwFDorgFLRBasM0k= -go.opentelemetry.io/otel/sdk v1.44.0 h1:nHYwb9lK+fJPU/dnT6s7W7Z8itMWyqrnVfbheVYrZ58= -go.opentelemetry.io/otel/sdk v1.44.0/go.mod h1:Osuydd3Se74nqjAKxid74N5eC+jfEqfTegHRnq58oK0= go.opentelemetry.io/otel/sdk v1.47.0 h1:zWXEr4j2lFefG87TU6Yg8a7ngfohIKFZHKp0Hf5hC6I= go.opentelemetry.io/otel/sdk v1.47.0/go.mod h1:VUc24kiOeoGsxG8G9ULx3fWKvB7jMhnGE8Oi607lgR0= -go.opentelemetry.io/otel/sdk/metric v1.44.0 h1:3LlKgI+VjbVsjNRFZJZAJ30WjXC5VkNRks6si09iEfI= -go.opentelemetry.io/otel/sdk/metric v1.44.0/go.mod h1:5B5pMARnXxKhltooO4xUuCBorl65a4EpnTalObqOigA= go.opentelemetry.io/otel/sdk/metric v1.47.0 h1:lfISg2j93VT6yqdk9OfUaZmw/GfcZqCCV3jdXtsPnKw= go.opentelemetry.io/otel/sdk/metric v1.47.0/go.mod h1:ypLp+mW1Nt2x+Szt3b5/i1syodyts49lMOwxpDI3VGw= -go.opentelemetry.io/otel/trace v1.44.0 h1:jxF5CsGYCe74MCRx2X4g7WsY/VBKRqqpNvXlX/6gtIk= -go.opentelemetry.io/otel/trace v1.44.0/go.mod h1:oLl1jrMQAVo6v3GAggN+1VH9VIz9iUSvW53sW1Q8PIE= go.opentelemetry.io/otel/trace v1.47.0 h1:JOjX/Oci8K94QHddo+bbfya/Ai/nf6/dt9ZfrFNWSrM= go.opentelemetry.io/otel/trace v1.47.0/go.mod h1:jNaSLa2PZEYFG6fRjJABAu+bw4FS08uDmPg28lTghu0= -go.opentelemetry.io/proto/otlp v1.11.0 h1:5rrYs0Ykyj50sdU/JU0x8etU+LubXWb+gED6TbEdMIk= -go.opentelemetry.io/proto/otlp v1.11.0/go.mod h1:SmVizdCOAm3XBtG1g1NnOdhW6jtddT72hLMhv8VwA8E= go.opentelemetry.io/proto/otlp v1.11.1 h1:SCrPqH9NE5CmBrOqpjNCiT0X5mGwMyGERXdogfR7Yjw= go.opentelemetry.io/proto/otlp v1.11.1/go.mod h1:wq8W4aSf6bOy8RZyESOeQFr9Pu7wydWX/TY4sgvrTPg= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= @@ -397,74 +221,39 @@ go.yaml.in/yaml/v3 v3.0.5 h1:N6y/pJk8buWs9NY5ERU2HSMfm+IuD/OtfdAnq6kESPw= go.yaml.in/yaml/v3 v3.0.5/go.mod h1:HVTZu1O7/Vkt2N+BFy8Zza+lnLsABggaTM2ZpNIGuKg= go.yaml.in/yaml/v4 v4.0.0-rc.3 h1:3h1fjsh1CTAPjW7q/EMe+C8shx5d8ctzZTrLcs/j8Go= go.yaml.in/yaml/v4 v4.0.0-rc.3/go.mod h1:aZqd9kCMsGL7AuUv/m/PvWLdg5sjJsZ4oHDEnfPPfY0= -golang.org/x/crypto v0.54.0 h1:YLIA59K4fiNzHzjnZt2tUJQjQtUWfWbeHBqKtk3eScw= -golang.org/x/crypto v0.54.0/go.mod h1:KWL8ny2AZdGR2cWmzeHrp2azQPGogOv+HeQaVEXC2dk= golang.org/x/crypto v0.58.0 h1:COkYLr4k7nDI4r6QtMML2AfzeIswWHAJthLS6K/M/54= golang.org/x/crypto v0.58.0/go.mod h1:Xh+kl5A+M0gMiWDytH2Hhr5Z7WbNCpv/eB/EFgfSk+w= -golang.org/x/image v0.45.0 h1:FMb1nTbH5H9vF55SriQHgFw5GnNL9Jg6L25BwXKzhB0= -golang.org/x/image v0.45.0/go.mod h1:n62x/7RqlwXDvGsSU4u6IUTUf6KghUZ9Bt7cG/T9Fx4= golang.org/x/image v0.47.0 h1:za/8gVz++PPZqmZJBNSISICN5Rrj5zixP/8K++fgmqo= golang.org/x/image v0.47.0/go.mod h1:IkN5o4A7vq55vXN8FWjjnhg9Rs2GOtffqsSi9mWAKYE= -golang.org/x/net v0.57.0 h1:K5+3DljvIuDG9/Jv9rvyMywYNFCQ9RSUY6OOTTkT+tE= -golang.org/x/net v0.57.0/go.mod h1:KpXc8iv+r3XplLAG/f7Jsf9RPszJzdR0f58q9vGOuEU= golang.org/x/net v0.61.0 h1:RR+6j/BTBCrggOLugxa+66R8FvoN6MHlzDlZIbN9YFw= golang.org/x/net v0.61.0/go.mod h1:WgDCOTH8iwtB66T4/GfI94AHo/hhdb7Hah9NDseQfiI= -golang.org/x/oauth2 v0.36.0 h1:peZ/1z27fi9hUOFCAZaHyrpWG5lwe0RJEEEeH0ThlIs= -golang.org/x/oauth2 v0.36.0/go.mod h1:YDBUJMTkDnJS+A4BP4eZBjCqtokkg1hODuPjwiGPO7Q= golang.org/x/oauth2 v0.37.0 h1:JUlcxA8oAtauLfiH8FX2/FkAWHAdi0QtGCGc+hofE98= golang.org/x/oauth2 v0.37.0/go.mod h1:IxwZNxUULJmpBFf9K/9NTMSIfZZuvuTy1gGxhigP/58= -golang.org/x/sync v0.22.0 h1:SZjpbeLmrCk4xhRSZFNZW5gFUeCeFgjekvI/+gfScek= -golang.org/x/sync v0.22.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= golang.org/x/sync v0.24.0 h1:iqiDrGoDgyuvAKrhLQthUEzU/R378N78gXbBjxed7oA= golang.org/x/sync v0.24.0/go.mod h1:sUUOizhqBxiL6pEWpqNLUiaJn1ShEbZ6BBqskPbjZm0= -golang.org/x/sys v0.47.0 h1:o7XGOvZQCADBQQ4Y7VNq2dRWQR7JmOUW8Kxx4ZsNgWs= -golang.org/x/sys v0.47.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= golang.org/x/sys v0.49.0 h1:XbzkgYJHdqh/8m2Uu0W/dQv8nktxx4BFHp1M0gROTXA= golang.org/x/sys v0.49.0/go.mod h1:hNLxWAXmnKAxqDtdwIYC4bM9oQPEecfsnNMuSxOs3og= -golang.org/x/text v0.41.0 h1:vz/seA0lnX87Othu2f/0L24RcgrXD9/YFTSuGjj3rH8= -golang.org/x/text v0.41.0/go.mod h1:jvf1O8ajNzZqhSrQBPbutR/EB83Cc0CFrezNQIwbb5M= golang.org/x/text v0.43.0 h1:1QivrlhwAsnMOcqgOdl9my7s9OyZl8O5/UGUTJVXoWc= golang.org/x/text v0.43.0/go.mod h1:hbSIYA/amXcRXTFSZqh8tWHEoqRvvbKPJ2uz/KU+a+s= -golang.org/x/time v0.15.0 h1:bbrp8t3bGUeFOx08pvsMYRTCVSMk89u4tKbNOZbp88U= -golang.org/x/time v0.15.0/go.mod h1:Y4YMaQmXwGQZoFaVFk4YpCt4FLQMYKZe9oeV/f4MSno= golang.org/x/time v0.16.0 h1:vMb6ptszcQMkcwiRTAuNNU50gom6++Q/6gY2hDM6VDE= golang.org/x/time v0.16.0/go.mod h1:rVKOqvZeKvrDKTQiAHJ7wmwP0RzleSphoEA9RcdLA0s= gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4= gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E= -google.golang.org/api v0.291.0 h1:wfPbbY+mr9c7wZLqqzrHJLft/q8iFKREd6IgTBUene0= -google.golang.org/api v0.291.0/go.mod h1:at7kwWbuonglBFEBoeMDAV1bguHqL3qf0BHFsv3coa0= google.golang.org/api v0.307.0 h1:KJJv1V/cOeCUrgKFippAhSg98QlR2IZFqubQKf7gQdg= google.golang.org/api v0.307.0/go.mod h1:4XMH+b/ZEfuTbK7FnrFRY9c4xfFHVflGTKuy/i5wUmE= -google.golang.org/genai v1.67.0 h1:m3V2AK2zbyViUq9rhTkMgkxu32Fueypy5Pzd9yV8GwU= -google.golang.org/genai v1.67.0/go.mod h1:mDdPDFXo1Ats7f1WXVyZgWb/CkMzFWTWJruIMy7hGIU= google.golang.org/genai v1.71.0 h1:Wfo9n0uSzMhZH7d+rP7QxxSWELEDSD4z6O8W/C9s3oM= google.golang.org/genai v1.71.0/go.mod h1:mDdPDFXo1Ats7f1WXVyZgWb/CkMzFWTWJruIMy7hGIU= -google.golang.org/genproto v0.0.0-20260729162451-8efbd57d26e0 h1:xJf8e9ReUqiexuIT3OWJkvA4RdgR8K4Hfheq8gaKxIM= -google.golang.org/genproto v0.0.0-20260729162451-8efbd57d26e0/go.mod h1:0MNk3ibJAyOwDZVlp18knQe3jRyFxpcU06xjxhgjx0M= google.golang.org/genproto v0.0.0-20261019180522-ce908d29299b h1:+t2qGqt6R8CO622uiX1JpnRvRvSOQoVRV0DiPzUjKXg= google.golang.org/genproto v0.0.0-20261019180522-ce908d29299b/go.mod h1:XRIfc1yr5xsbF8xFw5+g7SEmLJX/eQ7MMazTRbnMMvI= -google.golang.org/genproto/googleapis/api v0.0.0-20260729162451-8efbd57d26e0 h1:ybvH/ZpOcpCrjtkb7oW/fdlzbEmRVeumw19SRQmNFKU= -google.golang.org/genproto/googleapis/api v0.0.0-20260729162451-8efbd57d26e0/go.mod h1:HJ9MpJLeDSstBkx1LILTpd5f41ADSMZcTPypw02qEGw= google.golang.org/genproto/googleapis/api v0.0.0-20261019180522-ce908d29299b h1:nB3spRIaSPtxJpxb0k41yljROvm2Jrwfs2pSNdKS5y8= google.golang.org/genproto/googleapis/api v0.0.0-20261019180522-ce908d29299b/go.mod h1:9N4vtjEwvgQKEdlFVQO0M44ErhecQ9DCSQfGoZ51M6w= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260729162451-8efbd57d26e0 h1:mJiOtnGp0k/BcSgdu03G2NwnscCfCH+h2QKUBZr18KI= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260729162451-8efbd57d26e0/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= google.golang.org/genproto/googleapis/rpc v0.0.0-20261019180522-ce908d29299b h1:6WNWHZk91dp4gZ25642OALkuG1UVNZbwENJD19DnB8k= google.golang.org/genproto/googleapis/rpc v0.0.0-20261019180522-ce908d29299b/go.mod h1:OaIUM3+LpYcK2GXM4FTmhWoIq371Owdr+Cc7/BsYHHc= -google.golang.org/grpc v1.83.0 h1:JeNZEKJFbQxArAMl+hiytHauacDNqJUllNfmIMmpqnQ= -google.golang.org/grpc v1.83.0/go.mod h1:kDyl6SKsiHKt0uylY5gtn5cEjkrIOhQOGDgIc4JGwzQ= google.golang.org/grpc v1.84.0 h1:soMyaPJ8pAak5PIQ0DGBUir0XRo2fRoMqhNWMLlLxO0= google.golang.org/grpc v1.84.0/go.mod h1:ljCht0DrxQrXBDRTZp52Qxh3Ffk8CdYm2sj4O2QN2C0= -google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= -google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= google.golang.org/protobuf v1.36.12 h1:pJOKDDOyeXErUroCihFAd5LQuwXBSpVnKGrj5o/fwxc= google.golang.org/protobuf v1.36.12/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/dnaeon/go-vcr.v4 v4.0.6-0.20251110073552-01de4eb40290 h1:g3ah7zaWmw41EtOgBNXpx8zk4HYuH3OMwB+qh1Dt834= gopkg.in/dnaeon/go-vcr.v4 v4.0.6-0.20251110073552-01de4eb40290/go.mod h1:sbq5oMEcM4PXngbcNbHhzfCP9OdZodLhrbRYoyg09HY= gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= -gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/providers/anthropic/anthropic.go b/providers/anthropic/anthropic.go index de680f12e..9ecc01534 100644 --- a/providers/anthropic/anthropic.go +++ b/providers/anthropic/anthropic.go @@ -18,12 +18,12 @@ import ( "charm.land/fantasy" "charm.land/fantasy/object" "charm.land/fantasy/providers/internal/httpheaders" - "github.com/anthropics/anthropic-sdk-go" - "github.com/anthropics/anthropic-sdk-go/bedrock" - "github.com/anthropics/anthropic-sdk-go/option" - "github.com/anthropics/anthropic-sdk-go/packages/param" - "github.com/anthropics/anthropic-sdk-go/vertex" "github.com/aws/aws-sdk-go-v2/config" + "github.com/charmbracelet/anthropic-sdk-go" + "github.com/charmbracelet/anthropic-sdk-go/bedrock" + "github.com/charmbracelet/anthropic-sdk-go/option" + "github.com/charmbracelet/anthropic-sdk-go/packages/param" + "github.com/charmbracelet/anthropic-sdk-go/vertex" "golang.org/x/oauth2/google" ) @@ -579,7 +579,7 @@ func (a languageModel) prepareParams(call fantasy.Call) ( params.System = systemBlocks params.Messages = messages - params.Model = a.modelID + params.Model = anthropic.Model(a.modelID) params.MaxTokens = 4096 if call.MaxOutputTokens != nil { @@ -647,7 +647,7 @@ func (a languageModel) prepareParams(call fantasy.Call) ( return nil, nil, nil, nil, &fantasy.Error{Title: "no budget", Message: "thinking requires budget"} } if requiresAdaptiveThinking(a.modelID) { - adaptive := anthropic.ThinkingConfigAdaptiveParam{} + adaptive := anthropic.NewThinkingConfigAdaptiveParam() if display, ok := thinkingDisplay(providerOptions, a.modelID); ok { setThinkingDisplay(&adaptive, display) } @@ -660,7 +660,7 @@ func (a languageModel) prepareParams(call fantasy.Call) ( } warnings = stripThinkingUnsupportedParams(params, call, warnings) case defaultsToAdaptiveThinking(a.modelID): - adaptive := anthropic.ThinkingConfigAdaptiveParam{} + adaptive := anthropic.NewThinkingConfigAdaptiveParam() if display, ok := thinkingDisplay(providerOptions, a.modelID); ok { setThinkingDisplay(&adaptive, display) } diff --git a/providers/anthropic/anthropic_test.go b/providers/anthropic/anthropic_test.go index e0b6d4f09..3d30877cb 100644 --- a/providers/anthropic/anthropic_test.go +++ b/providers/anthropic/anthropic_test.go @@ -14,7 +14,7 @@ import ( "time" "charm.land/fantasy" - "github.com/anthropics/anthropic-sdk-go" + "github.com/charmbracelet/anthropic-sdk-go" "github.com/stretchr/testify/require" ) diff --git a/providers/anthropic/call_useragent.go b/providers/anthropic/call_useragent.go index bf80e6637..47d451efa 100644 --- a/providers/anthropic/call_useragent.go +++ b/providers/anthropic/call_useragent.go @@ -3,7 +3,7 @@ package anthropic import ( "charm.land/fantasy" "charm.land/fantasy/providers/internal/httpheaders" - "github.com/anthropics/anthropic-sdk-go/option" + "github.com/charmbracelet/anthropic-sdk-go/option" ) func callUARequestOptions(call fantasy.Call) []option.RequestOption { diff --git a/providers/anthropic/computer_use.go b/providers/anthropic/computer_use.go index c130bde6f..f4526e9ae 100644 --- a/providers/anthropic/computer_use.go +++ b/providers/anthropic/computer_use.go @@ -7,8 +7,8 @@ import ( "fmt" "charm.land/fantasy" - anthropicsdk "github.com/anthropics/anthropic-sdk-go" - "github.com/anthropics/anthropic-sdk-go/packages/param" + anthropicsdk "github.com/charmbracelet/anthropic-sdk-go" + "github.com/charmbracelet/anthropic-sdk-go/packages/param" ) // computerUseToolID is the canonical identifier for diff --git a/providers/anthropic/error.go b/providers/anthropic/error.go index af500f0b8..c0ed9846b 100644 --- a/providers/anthropic/error.go +++ b/providers/anthropic/error.go @@ -10,7 +10,7 @@ import ( "strings" "charm.land/fantasy" - "github.com/anthropics/anthropic-sdk-go" + "github.com/charmbracelet/anthropic-sdk-go" ) var anthropicContextPattern = regexp.MustCompile(`prompt is too long:\s*(\d+)\s*tokens?\s*>\s*(\d+)\s*maximum`) @@ -32,8 +32,8 @@ func toProviderErr(err error) error { RequestBody: apiErr.DumpRequest(true), ResponseHeaders: toHeaderMap(apiErr.Response.Header), ResponseBody: apiErr.DumpResponse(true), - ErrorType: string(apiErr.Type()), - TransientError: fantasy.TransientStreamErrorTypes[string(apiErr.Type())], + ErrorType: apiErrorType(apiErr), + TransientError: fantasy.TransientStreamErrorTypes[apiErrorType(apiErr)], } parseContextTooLargeError(apiErr.Error(), providerErr) @@ -64,7 +64,7 @@ func toProviderErr(err error) error { // as a 2xx, so titling from that status puts "ok" above a failure, and only // the payload can name that one. func apiErrorTitle(apiErr *anthropic.Error) string { - errType := string(apiErr.Type()) + errType := apiErrorType(apiErr) if apiErr.StatusCode >= http.StatusOK && apiErr.StatusCode < http.StatusMultipleChoices { return streamErrorTitle(errType) } @@ -93,6 +93,17 @@ type streamErrorEnvelope struct { } `json:"error"` } +// apiErrorType reads the error type from an API error body. The coder +// anthropic-sdk-go fork predates the SDK's Error.Type accessor, so this +// decodes the same {"error":{"type":"..."}} envelope that accessor reads. +func apiErrorType(apiErr *anthropic.Error) string { + var envelope streamErrorEnvelope + if json.Unmarshal([]byte(apiErr.RawJSON()), &envelope) != nil || envelope.Error == nil { + return "" + } + return envelope.Error.Type +} + // wrapStreamError classifies a mid-stream SSE error event as a // ProviderError, marking it transient when the payload names a temporary // server-side condition. Returns nil if err is not a stream error event. diff --git a/providers/anthropic/error_test.go b/providers/anthropic/error_test.go index 0362c6179..b2552a064 100644 --- a/providers/anthropic/error_test.go +++ b/providers/anthropic/error_test.go @@ -9,7 +9,7 @@ import ( "testing" "charm.land/fantasy" - "github.com/anthropics/anthropic-sdk-go" + "github.com/charmbracelet/anthropic-sdk-go" ) func TestToProviderErr_WrapsUnexpectedEOF(t *testing.T) { @@ -281,9 +281,8 @@ func TestAPIErrorTitle(t *testing.T) { } } -// apiErrorWithType builds an SDK error carrying errType. The field behind -// Type() is unexported, so it has to arrive the way the SDK fills it: by -// decoding an error envelope. +// apiErrorWithType builds an SDK error carrying errType. It has to arrive the +// way the SDK fills it: by decoding an error envelope. func apiErrorWithType(t *testing.T, status int, errType string) *anthropic.Error { t.Helper() @@ -293,8 +292,8 @@ func apiErrorWithType(t *testing.T, status int, errType string) *anthropic.Error if err := apiErr.UnmarshalJSON([]byte(envelope)); err != nil { t.Fatalf("UnmarshalJSON(%s): %v", envelope, err) } - if got := string(apiErr.Type()); got != errType { - t.Fatalf("the SDK did not take the type: Type() = %q, want %q", got, errType) + if got := apiErrorType(apiErr); got != errType { + t.Fatalf("the SDK did not take the type: apiErrorType() = %q, want %q", got, errType) } } apiErr.StatusCode = status diff --git a/providers/anthropic/stream_open_blocks_test.go b/providers/anthropic/stream_open_blocks_test.go index 61a3f9fca..37e6c6ea1 100644 --- a/providers/anthropic/stream_open_blocks_test.go +++ b/providers/anthropic/stream_open_blocks_test.go @@ -5,7 +5,7 @@ import ( "testing" "charm.land/fantasy" - "github.com/anthropics/anthropic-sdk-go" + "github.com/charmbracelet/anthropic-sdk-go" "github.com/stretchr/testify/require" ) diff --git a/providers/azure/azure.go b/providers/azure/azure.go index 807c27a66..3d5604d0f 100644 --- a/providers/azure/azure.go +++ b/providers/azure/azure.go @@ -8,7 +8,7 @@ import ( "charm.land/fantasy" "charm.land/fantasy/providers/openai" - "github.com/charmbracelet/openai-go/option" + "github.com/openai/openai-go/v3/option" ) type options struct { diff --git a/providers/bedrock/bedrock.go b/providers/bedrock/bedrock.go index 93c75894f..695174f18 100644 --- a/providers/bedrock/bedrock.go +++ b/providers/bedrock/bedrock.go @@ -8,7 +8,7 @@ import ( "charm.land/fantasy" "charm.land/fantasy/providers/anthropic" - "github.com/anthropics/anthropic-sdk-go/option" + "github.com/charmbracelet/anthropic-sdk-go/option" ) type options struct { diff --git a/providers/kronk/language_model_test.go b/providers/kronk/language_model_test.go index 3127db218..c86568579 100644 --- a/providers/kronk/language_model_test.go +++ b/providers/kronk/language_model_test.go @@ -94,7 +94,7 @@ func TestGenerateResponse(t *testing.T) { modelInfo: model.ModelInfo{ ID: "loaded-model", Desc: "test model", - Type: "Dense", + Type: model.ModelTypeDense, HasProjection: true, Size: 1024, VRAMTotal: 768, @@ -184,7 +184,7 @@ func TestGenerateResponse(t *testing.T) { func TestStreamResponse(t *testing.T) { toolFinish := model.FinishReasonTool client := fakeChatModel{ - modelInfo: model.ModelInfo{ID: "loaded-model", Type: "Dense"}, + modelInfo: model.ModelInfo{ID: "loaded-model", Type: model.ModelTypeDense}, streamResponse: []model.ChatResponse{ {Model: "response-model", SystemFingerprint: "fp_kronk", Choices: []model.Choice{{Delta: &model.ResponseMessage{Reasoning: "thinking"}}}}, {Choices: []model.Choice{{Delta: &model.ResponseMessage{ToolCallDeltas: []model.ResponseToolCallDelta{ diff --git a/providers/kronk/options.go b/providers/kronk/options.go index 5e296fdfe..f8826ca04 100644 --- a/providers/kronk/options.go +++ b/providers/kronk/options.go @@ -169,7 +169,7 @@ func WithNThreadsBatch(v int) Option { } // WithNUMA configures the NUMA strategy. -func WithNUMA(v model.NUMAStrategy) Option { +func WithNUMA(v string) Option { return withModelOption(model.WithNUMA(v)) } @@ -183,6 +183,11 @@ func WithOpOffload(v bool) Option { return withModelOption(model.WithOpOffload(v)) } +// WithOpOffloadMinBatch configures the minimum batch size for operation offloading. +func WithOpOffloadMinBatch(v int) Option { + return withModelOption(model.WithOpOffloadMinBatch(v)) +} + // WithPrefillBatchSize configures the maximum number of prompt tokens processed per decode iteration. func WithPrefillBatchSize(v int) Option { return withModelOption(model.WithPrefillBatchSize(v)) diff --git a/providers/kronk/provider_options.go b/providers/kronk/provider_options.go index 43a562fe4..74626a8b1 100644 --- a/providers/kronk/provider_options.go +++ b/providers/kronk/provider_options.go @@ -57,7 +57,7 @@ func newProviderMetadata(info model.ModelInfo) *ProviderMetadata { return &ProviderMetadata{ Model: info.ID, ModelDescription: info.Desc, - ModelType: info.Type, + ModelType: info.Type.String(), HasProjection: info.HasProjection, ModelSizeBytes: info.Size, VRAMBytes: info.VRAMTotal, diff --git a/providers/openai/call_useragent.go b/providers/openai/call_useragent.go index baee1775e..2602c0dab 100644 --- a/providers/openai/call_useragent.go +++ b/providers/openai/call_useragent.go @@ -3,7 +3,7 @@ package openai import ( "charm.land/fantasy" "charm.land/fantasy/providers/internal/httpheaders" - "github.com/charmbracelet/openai-go/option" + "github.com/openai/openai-go/v3/option" ) // callUARequestOptions returns per-request options that override the diff --git a/providers/openai/error.go b/providers/openai/error.go index 31d85f1fc..ff028f3b9 100644 --- a/providers/openai/error.go +++ b/providers/openai/error.go @@ -11,8 +11,8 @@ import ( "strings" "charm.land/fantasy" - "github.com/charmbracelet/openai-go" - "github.com/charmbracelet/openai-go/packages/ssestream" + "github.com/openai/openai-go/v3" + "github.com/openai/openai-go/v3/packages/ssestream" ) var ( diff --git a/providers/openai/error_test.go b/providers/openai/error_test.go index 2c1247603..1d9e3a0a9 100644 --- a/providers/openai/error_test.go +++ b/providers/openai/error_test.go @@ -10,7 +10,7 @@ import ( "testing" "charm.land/fantasy" - "github.com/charmbracelet/openai-go/packages/ssestream" + "github.com/openai/openai-go/v3/packages/ssestream" ) func TestToProviderErr_WrapsUnexpectedEOF(t *testing.T) { diff --git a/providers/openai/language_model.go b/providers/openai/language_model.go index ad7991344..c7b3d3601 100644 --- a/providers/openai/language_model.go +++ b/providers/openai/language_model.go @@ -16,11 +16,11 @@ import ( "charm.land/fantasy" "charm.land/fantasy/object" "charm.land/fantasy/schema" - "github.com/charmbracelet/openai-go" - "github.com/charmbracelet/openai-go/option" - "github.com/charmbracelet/openai-go/packages/param" - "github.com/charmbracelet/openai-go/shared" "github.com/google/uuid" + "github.com/openai/openai-go/v3" + "github.com/openai/openai-go/v3/option" + "github.com/openai/openai-go/v3/packages/param" + "github.com/openai/openai-go/v3/shared" ) type languageModel struct { diff --git a/providers/openai/language_model_hooks.go b/providers/openai/language_model_hooks.go index b04ecdbd8..234a83b1a 100644 --- a/providers/openai/language_model_hooks.go +++ b/providers/openai/language_model_hooks.go @@ -7,9 +7,9 @@ import ( "strings" "charm.land/fantasy" - "github.com/charmbracelet/openai-go" - "github.com/charmbracelet/openai-go/packages/param" - "github.com/charmbracelet/openai-go/shared" + "github.com/openai/openai-go/v3" + "github.com/openai/openai-go/v3/packages/param" + "github.com/openai/openai-go/v3/shared" ) // LanguageModelPrepareCallFunc is a function that prepares the call for the language model. diff --git a/providers/openai/openai.go b/providers/openai/openai.go index 70a0b1d5b..918932ba8 100644 --- a/providers/openai/openai.go +++ b/providers/openai/openai.go @@ -8,8 +8,8 @@ import ( "charm.land/fantasy" "charm.land/fantasy/providers/internal/httpheaders" - "github.com/charmbracelet/openai-go" - "github.com/charmbracelet/openai-go/option" + "github.com/openai/openai-go/v3" + "github.com/openai/openai-go/v3/option" ) const ( diff --git a/providers/openai/openai_test.go b/providers/openai/openai_test.go index f1246cea1..38376246b 100644 --- a/providers/openai/openai_test.go +++ b/providers/openai/openai_test.go @@ -12,7 +12,7 @@ import ( "testing" "charm.land/fantasy" - "github.com/charmbracelet/openai-go/packages/param" + "github.com/openai/openai-go/v3/packages/param" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) diff --git a/providers/openai/provider_options.go b/providers/openai/provider_options.go index 2aa482fce..cf558ab40 100644 --- a/providers/openai/provider_options.go +++ b/providers/openai/provider_options.go @@ -5,8 +5,8 @@ import ( "encoding/json" "charm.land/fantasy" - "github.com/charmbracelet/openai-go" - "github.com/charmbracelet/openai-go/packages/respjson" + "github.com/openai/openai-go/v3" + "github.com/openai/openai-go/v3/packages/respjson" ) // ReasoningEffort represents the reasoning effort level for OpenAI models. diff --git a/providers/openai/responses_language_model.go b/providers/openai/responses_language_model.go index 90249b5b7..bcb432ebd 100644 --- a/providers/openai/responses_language_model.go +++ b/providers/openai/responses_language_model.go @@ -16,11 +16,11 @@ import ( "charm.land/fantasy" "charm.land/fantasy/object" "charm.land/fantasy/schema" - "github.com/charmbracelet/openai-go" - "github.com/charmbracelet/openai-go/packages/param" - "github.com/charmbracelet/openai-go/responses" - "github.com/charmbracelet/openai-go/shared" "github.com/google/uuid" + "github.com/openai/openai-go/v3" + "github.com/openai/openai-go/v3/packages/param" + "github.com/openai/openai-go/v3/responses" + "github.com/openai/openai-go/v3/shared" ) const topLogprobsMax = 20 @@ -838,9 +838,7 @@ func toResponsesPromptWithValidation(prompt fantasy.Prompt, systemMessageMode st continue } - functionCallOutput := responses.ResponseInputItemParamOfFunctionCallOutput(outputStr) - functionCallOutput.OfFunctionCallOutput.CallID = param.NewOpt(toolResultPart.ToolCallID) - input = append(input, functionCallOutput) + input = append(input, responses.ResponseInputItemParamOfFunctionCallOutput(toolResultPart.ToolCallID, outputStr)) if len(followupParts) > 0 { input = append(input, responses.ResponseInputItemParamOfMessage(followupParts, responses.EasyInputMessageRoleUser)) } @@ -1561,22 +1559,30 @@ func (o responsesLanguageModel) Stream(ctx context.Context, call fantasy.Call) ( case "response.output_text.annotation.added": added := event.AsResponseOutputTextAnnotationAdded() - annotation := added.Annotation - switch annotation.Type { + // The Annotation field is typed as `any` in the SDK; + // it deserializes as map[string]any from JSON. + annotationMap, ok := added.Annotation.(map[string]any) + if !ok { + break + } + annotationType, _ := annotationMap["type"].(string) + switch annotationType { case "url_citation": + url, _ := annotationMap["url"].(string) + title, _ := annotationMap["title"].(string) if !yield(fantasy.StreamPart{ Type: fantasy.StreamPartTypeSource, ID: uuid.NewString(), SourceType: fantasy.SourceTypeURL, - URL: annotation.URL, - Title: annotation.Title, + URL: url, + Title: title, }) { return } case "file_citation": title := "Document" - if annotation.Filename != "" { - title = annotation.Filename + if fn, ok := annotationMap["filename"].(string); ok && fn != "" { + title = fn } if !yield(fantasy.StreamPart{ Type: fantasy.StreamPartTypeSource, diff --git a/providers/openai/tool_messages.go b/providers/openai/tool_messages.go index d4fd0f9c5..9d3abf178 100644 --- a/providers/openai/tool_messages.go +++ b/providers/openai/tool_messages.go @@ -4,7 +4,7 @@ import ( "fmt" "strings" - "github.com/charmbracelet/openai-go" + "github.com/openai/openai-go/v3" "charm.land/fantasy" ) diff --git a/providers/openai/tool_result_media_test.go b/providers/openai/tool_result_media_test.go index fc42a9908..aa86cbd67 100644 --- a/providers/openai/tool_result_media_test.go +++ b/providers/openai/tool_result_media_test.go @@ -337,7 +337,7 @@ func TestToResponsesPrompt_MediaToolResult_ImagePNG(t *testing.T) { funcOut := input[1].OfFunctionCallOutput require.NotNil(t, funcOut) - require.Equal(t, "img-resp-1", funcOut.CallID.Value) + require.Equal(t, "img-resp-1", funcOut.CallID) require.Contains(t, funcOut.Output.OfString.Value, "image/png") userMsg := input[2].OfMessage @@ -380,7 +380,7 @@ func TestToResponsesPrompt_MediaToolResult_UnsupportedMediaType(t *testing.T) { // image message. require.Len(t, input, 2) require.NotNil(t, input[1].OfFunctionCallOutput) - require.Equal(t, "vid-resp-1", input[1].OfFunctionCallOutput.CallID.Value) + require.Equal(t, "vid-resp-1", input[1].OfFunctionCallOutput.CallID) require.Len(t, warnings, 1) require.Contains(t, warnings[0].Message, "video/mp4") } diff --git a/providers/openai/tool_run_buffer_test.go b/providers/openai/tool_run_buffer_test.go index 27312ca31..7b847bdfc 100644 --- a/providers/openai/tool_run_buffer_test.go +++ b/providers/openai/tool_run_buffer_test.go @@ -3,7 +3,7 @@ package openai import ( "testing" - "github.com/charmbracelet/openai-go" + "github.com/openai/openai-go/v3" "github.com/stretchr/testify/require" "charm.land/fantasy" diff --git a/providers/openaicompat/language_model_hooks.go b/providers/openaicompat/language_model_hooks.go index 553841892..740292d34 100644 --- a/providers/openaicompat/language_model_hooks.go +++ b/providers/openaicompat/language_model_hooks.go @@ -8,9 +8,9 @@ import ( "charm.land/fantasy" "charm.land/fantasy/providers/openai" - openaisdk "github.com/charmbracelet/openai-go" - "github.com/charmbracelet/openai-go/packages/param" - "github.com/charmbracelet/openai-go/shared" + openaisdk "github.com/openai/openai-go/v3" + "github.com/openai/openai-go/v3/packages/param" + "github.com/openai/openai-go/v3/shared" ) const ( diff --git a/providers/openaicompat/openaicompat.go b/providers/openaicompat/openaicompat.go index 9bd9a13b2..af8948579 100644 --- a/providers/openaicompat/openaicompat.go +++ b/providers/openaicompat/openaicompat.go @@ -4,7 +4,7 @@ package openaicompat import ( "charm.land/fantasy" "charm.land/fantasy/providers/openai" - "github.com/charmbracelet/openai-go/option" + "github.com/openai/openai-go/v3/option" ) type options struct { diff --git a/providers/openaicompat/openaicompat_test.go b/providers/openaicompat/openaicompat_test.go index df0965fa3..dab71f44b 100644 --- a/providers/openaicompat/openaicompat_test.go +++ b/providers/openaicompat/openaicompat_test.go @@ -5,7 +5,7 @@ import ( "testing" "charm.land/fantasy" - "github.com/charmbracelet/openai-go/packages/param" + "github.com/openai/openai-go/v3/packages/param" "github.com/stretchr/testify/require" ) diff --git a/providers/openrouter/language_model_hooks.go b/providers/openrouter/language_model_hooks.go index 0afbd9d6f..d9accd2c2 100644 --- a/providers/openrouter/language_model_hooks.go +++ b/providers/openrouter/language_model_hooks.go @@ -11,9 +11,9 @@ import ( "charm.land/fantasy/providers/anthropic" "charm.land/fantasy/providers/google" "charm.land/fantasy/providers/openai" - openaisdk "github.com/charmbracelet/openai-go" - "github.com/charmbracelet/openai-go/packages/param" xstrings "github.com/charmbracelet/x/exp/strings" + openaisdk "github.com/openai/openai-go/v3" + "github.com/openai/openai-go/v3/packages/param" ) const reasoningStartedCtx = "reasoning_started" diff --git a/providers/openrouter/openrouter.go b/providers/openrouter/openrouter.go index 623186bc6..fc9c9756b 100644 --- a/providers/openrouter/openrouter.go +++ b/providers/openrouter/openrouter.go @@ -6,7 +6,7 @@ import ( "charm.land/fantasy" "charm.land/fantasy/providers/openai" - "github.com/charmbracelet/openai-go/option" + "github.com/openai/openai-go/v3/option" ) type options struct { diff --git a/providers/vercel/language_model_hooks.go b/providers/vercel/language_model_hooks.go index 963bc2b65..79e809ac0 100644 --- a/providers/vercel/language_model_hooks.go +++ b/providers/vercel/language_model_hooks.go @@ -11,8 +11,8 @@ import ( "charm.land/fantasy/providers/anthropic" "charm.land/fantasy/providers/google" openaipkg "charm.land/fantasy/providers/openai" - openaisdk "github.com/charmbracelet/openai-go" - "github.com/charmbracelet/openai-go/packages/param" + openaisdk "github.com/openai/openai-go/v3" + "github.com/openai/openai-go/v3/packages/param" ) const reasoningStartedCtx = "reasoning_started" diff --git a/providers/vercel/vercel.go b/providers/vercel/vercel.go index 65e8d31c3..79f31f1df 100644 --- a/providers/vercel/vercel.go +++ b/providers/vercel/vercel.go @@ -4,7 +4,7 @@ package vercel import ( "charm.land/fantasy" "charm.land/fantasy/providers/openai" - "github.com/charmbracelet/openai-go/option" + "github.com/openai/openai-go/v3/option" ) type options struct { From bedfd1eb117a50014ecaf5b3b19d64d2427c4b44 Mon Sep 17 00:00:00 2001 From: Ethan Dickson Date: Mon, 26 Oct 2026 02:27:08 +0000 Subject: [PATCH 155/156] fix(providers/anthropic): reconcile fork patches with upstream streaming and thinking display - Forward message_start and message_delta as keepalives. Upstream forwards every content-free event as a keepalive (ca3b510), but the fork handles both events itself for per-request usage (coder/fantasy#50) and refusal metadata (coder/fantasy#41), so they never reached the catch-all. - Claude 5 models keep adaptive thinking from the fork's version rule (coder/fantasy#47) and now also get upstream's summarized display default (02d13f0). Update both tests to expect that. - The coder SDK fork reports a mid-stream error event as an untyped error, so drop the upstream test's assertion that it carries status 200. The title and retry assertions still hold through wrapStreamError. --- providers/anthropic/anthropic.go | 6 ++++++ providers/anthropic/anthropic_test.go | 10 +++++++--- providers/anthropic/error_test.go | 9 +++------ 3 files changed, 16 insertions(+), 9 deletions(-) diff --git a/providers/anthropic/anthropic.go b/providers/anthropic/anthropic.go index 9ecc01534..e0158174c 100644 --- a/providers/anthropic/anthropic.go +++ b/providers/anthropic/anthropic.go @@ -1780,6 +1780,9 @@ func (a languageModel) Stream(ctx context.Context, call fantasy.Call) (fantasy.S case "message_start": usage := chunk.AsMessageStart().Message.Usage messageStartUsage = &usage + if !yield(fantasy.StreamPart{Type: fantasy.StreamPartTypeKeepalive}) { + return + } case "content_block_start": contentBlockType := chunk.ContentBlock.Type if contentBlockType == "tool_use" || contentBlockType == "server_tool_use" { @@ -1980,6 +1983,9 @@ func (a languageModel) Stream(ctx context.Context, call fantasy.Call) (fantasy.S if rm := parseAnthropicRefusal(chunk.AsMessageDelta().Delta.RawJSON()); rm != nil { refusalMeta = rm } + if !yield(fantasy.StreamPart{Type: fantasy.StreamPartTypeKeepalive}) { + return + } case "message_stop": sawMessageStop = true default: diff --git a/providers/anthropic/anthropic_test.go b/providers/anthropic/anthropic_test.go index 3d30877cb..7a6eab17b 100644 --- a/providers/anthropic/anthropic_test.go +++ b/providers/anthropic/anthropic_test.go @@ -1095,7 +1095,8 @@ func TestGenerate_SendsThinkingDisplay(t *testing.T) { options: func() *ProviderOptions { return &ProviderOptions{Thinking: &ThinkingProviderOption{BudgetTokens: 2048}} }, - wantType: "adaptive", + wantType: "adaptive", + wantDisplay: "summarized", }, { name: "older opus models keep provider default", @@ -4105,11 +4106,14 @@ func TestThinkingDisplayRespectsCallerChoice(t *testing.T) { // Widening the display default must not change which models get adaptive // thinking: that rewrites the request shape, where a display only adds a field. +// Claude 5+ still gets adaptive thinking here, from its version rule +// (thinkingOnByDefault), not from the display default. func TestDisplayDefaultDoesNotChangeThinkingMode(t *testing.T) { t.Parallel() - require.False(t, requiresAdaptiveThinking("claude-opus-5")) - require.False(t, requiresAdaptiveThinking("claude-sonnet-5")) + require.True(t, thinkingOnByDefault("claude-opus-5")) + require.True(t, requiresAdaptiveThinking("claude-opus-5")) + require.True(t, requiresAdaptiveThinking("claude-sonnet-5")) require.True(t, requiresAdaptiveThinking("claude-opus-4-7")) require.True(t, requiresAdaptiveThinking("claude-mythos-preview")) } diff --git a/providers/anthropic/error_test.go b/providers/anthropic/error_test.go index b2552a064..77fd84f81 100644 --- a/providers/anthropic/error_test.go +++ b/providers/anthropic/error_test.go @@ -187,7 +187,9 @@ func TestToProviderErr_StreamErrorWrappedByOuterError(t *testing.T) { // // Driving a real stream rather than hand-building the SDK error is the point: // the status on a mid-stream event is the SDK's behaviour, not ours, and a -// hand-built error would assume the very thing worth checking. +// hand-built error would assume the very thing worth checking. The pinned +// coder anthropic-sdk-go fork still reports the event as an untyped error, so +// the title comes from wrapStreamError and no status is set. func TestToProviderErr_TitlesMidStreamOverloadFromThePayload(t *testing.T) { t.Parallel() @@ -225,11 +227,6 @@ func TestToProviderErr_TitlesMidStreamOverloadFromThePayload(t *testing.T) { t.Fatalf("stream error is %T, want *fantasy.ProviderError", streamErr) } - // The premise: the SDK really does carry the response's status here. - if providerErr.StatusCode != http.StatusOK { - t.Fatalf("StatusCode = %d, want 200; a mid-stream event is meant to "+ - "arrive inside a successful response", providerErr.StatusCode) - } if providerErr.Title != "provider overloaded" { t.Errorf("Title = %q, want %q", providerErr.Title, "provider overloaded") } From eea77ce78f60142a3832b0e4c3fef2973122f690 Mon Sep 17 00:00:00 2001 From: Ethan Dickson Date: Mon, 26 Oct 2026 03:00:16 +0000 Subject: [PATCH 156/156] ci: run govulncheck with Go 1.26.10 Go 1.26.6 has standard library vulnerabilities that Go 1.26.9 and 1.26.10 fix (GO-2026-6603, -6605, -6607, -6608, -6610, -6611, -6612, -6613, -6617 and -6809), so govulncheck fails on every PR. --- .github/workflows/build.yml | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 35b979c1d..849bb8b7f 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -12,12 +12,11 @@ jobs: GOTOOLCHAIN: local steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - # Keep the module baseline in go.mod, but run the scanner with Go 1.26.6 - # so it uses a fixed standard library (GO-2026-5026, GO-2026-5972, - # GO-2026-6088, GO-2026-6090, GO-2026-6218). + # Keep the module baseline in go.mod, but run the scanner with Go 1.26.10 + # so it scans a patched standard library. - uses: actions/setup-go@4a3601121dd01d1626a1e23e37211e3254c1c06c # v6.4.0 with: - go-version: "1.26.6" + go-version: "1.26.10" cache: true check-latest: true - run: |