Skip to content

Commit 85a75b2

Browse files
committed
feat: Add ExtraBody/ExtraFields support for custom OpenAI-compatible API parameters
This change enables passing custom parameters to OpenAI-compatible API providers via the provider config's extra_body field. The implementation maps extra_body to Fantasy's extra_fields, which are then passed through to the underlying OpenAI SDK's SetExtraFields() method. Key changes: - Added extra_body mapping to extra_fields in getProviderOptions() - Merge extra_body options into provider options chain - Uses charm.land/fantasy v0.1.1 with ExtraFields support This enables advanced provider features like Z.AI GLM's thinking mode: { "providers": { "z.ai": { "extra_body": { "thinking": { "type": "enabled", "budget_tokens": 26214 } } } } } The extra_body parameters are correctly passed through the HTTP request to the provider API.
1 parent 35c05ff commit 85a75b2

File tree

2 files changed

+21
-2
lines changed

2 files changed

+21
-2
lines changed

go.mod

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,11 @@ require (
5050
mvdan.cc/sh/v3 v3.12.1-0.20250902163504-3cf4fd5717a5
5151
)
5252

53+
require (
54+
github.com/anthropics/anthropic-sdk-go v1.14.0 // indirect
55+
google.golang.org/genai v1.32.0 // indirect
56+
)
57+
5358
require (
5459
cloud.google.com/go v0.116.0 // indirect
5560
cloud.google.com/go/auth v0.17.0 // indirect
@@ -58,7 +63,6 @@ require (
5863
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.17.0 // indirect
5964
github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0 // indirect
6065
github.com/andybalholm/cascadia v1.3.3 // indirect
61-
github.com/anthropics/anthropic-sdk-go v1.14.0 // indirect
6266
github.com/aws/aws-sdk-go-v2 v1.39.3 // indirect
6367
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.3 // indirect
6468
github.com/aws/aws-sdk-go-v2/config v1.27.27 // indirect
@@ -158,7 +162,6 @@ require (
158162
golang.org/x/text v0.30.0
159163
golang.org/x/time v0.12.0 // indirect
160164
google.golang.org/api v0.239.0 // indirect
161-
google.golang.org/genai v1.32.0 // indirect
162165
google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822 // indirect
163166
google.golang.org/grpc v1.74.2 // indirect
164167
google.golang.org/protobuf v1.36.10 // indirect

internal/agent/coordinator.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,7 @@ func getProviderOptions(model Model, providerCfg config.ProviderConfig) fantasy.
142142
cfgOpts := []byte("{}")
143143
providerCfgOpts := []byte("{}")
144144
catwalkOpts := []byte("{}")
145+
extraBodyOpts := []byte("{}")
145146

146147
if model.ModelCfg.ProviderOptions != nil {
147148
data, err := json.Marshal(model.ModelCfg.ProviderOptions)
@@ -164,9 +165,24 @@ func getProviderOptions(model Model, providerCfg config.ProviderConfig) fantasy.
164165
}
165166
}
166167

168+
// Merge extra_body from provider config (for Z.AI GLM thinking mode, etc.)
169+
// Map it to extra_fields which Fantasy's ExtraFields expects
170+
if providerCfg.ExtraBody != nil && len(providerCfg.ExtraBody) > 0 {
171+
extraBodyData := map[string]any{
172+
"extra_fields": providerCfg.ExtraBody,
173+
}
174+
data, err := json.Marshal(extraBodyData)
175+
if err == nil {
176+
extraBodyOpts = data
177+
} else {
178+
slog.Warn("Failed to marshal extra_body from provider config", "error", err)
179+
}
180+
}
181+
167182
readers := []io.Reader{
168183
bytes.NewReader(catwalkOpts),
169184
bytes.NewReader(providerCfgOpts),
185+
bytes.NewReader(extraBodyOpts),
170186
bytes.NewReader(cfgOpts),
171187
}
172188

0 commit comments

Comments
 (0)