Skip to content

Commit 5db557a

Browse files
committed
Better encapsulation
Signed-off-by: David Gageot <david.gageot@docker.com>
1 parent f29bc29 commit 5db557a

5 files changed

Lines changed: 26 additions & 20 deletions

File tree

pkg/model/provider/anthropic/client.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ func NewClient(ctx context.Context, cfg *latest.ModelConfig, env environment.Pro
121121

122122
slog.Debug("Anthropic client created successfully", "model", cfg.Model)
123123

124-
if globalOptions.StructuredOutput != nil {
124+
if globalOptions.StructuredOutput() != nil {
125125
return &Client{}, errors.New("anthropic does not support native structured_output")
126126
}
127127

pkg/model/provider/dmr/client.go

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -384,15 +384,16 @@ func (c *Client) CreateChatCompletionStream(ctx context.Context, messages []chat
384384
} else {
385385
slog.Error("Failed to marshal DMR request to JSON", "error", err)
386386
}
387-
if c.ModelOptions.StructuredOutput != nil {
388-
slog.Debug("Adding structured output to DMR request", "structured_output", c.ModelOptions.StructuredOutput)
387+
if structuredOutput := c.ModelOptions.StructuredOutput(); structuredOutput != nil {
388+
slog.Debug("Adding structured output to DMR request", "structured_output", structuredOutput)
389+
389390
request.ResponseFormat = &openai.ChatCompletionResponseFormat{
390391
Type: openai.ChatCompletionResponseFormatTypeJSONSchema,
391392
JSONSchema: &openai.ChatCompletionResponseFormatJSONSchema{
392-
Name: c.ModelOptions.StructuredOutput.Name,
393-
Description: c.ModelOptions.StructuredOutput.Description,
394-
Schema: jsonSchema(c.ModelOptions.StructuredOutput.Schema),
395-
Strict: c.ModelOptions.StructuredOutput.Strict,
393+
Name: structuredOutput.Name,
394+
Description: structuredOutput.Description,
395+
Schema: jsonSchema(structuredOutput.Schema),
396+
Strict: structuredOutput.Strict,
396397
},
397398
}
398399
}

pkg/model/provider/gemini/client.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -251,9 +251,9 @@ func (c *Client) buildConfig() *genai.GenerateContentConfig {
251251
}
252252
}
253253

254-
if c.ModelOptions.StructuredOutput != nil {
254+
if structuredOutput := c.ModelOptions.StructuredOutput(); structuredOutput != nil {
255255
config.ResponseMIMEType = "application/json"
256-
config.ResponseJsonSchema = c.ModelOptions.StructuredOutput.Schema
256+
config.ResponseJsonSchema = structuredOutput.Schema
257257
}
258258

259259
return config

pkg/model/provider/openai/client.go

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -283,17 +283,18 @@ func (c *Client) CreateChatCompletionStream(
283283
}
284284

285285
// Apply structured output configuration
286-
if c.ModelOptions.StructuredOutput != nil {
286+
if structuredOutput := c.ModelOptions.StructuredOutput(); structuredOutput != nil {
287+
slog.Debug("OpenAI request using structured output", "name", structuredOutput.Name, "strict", structuredOutput.Strict)
288+
287289
request.ResponseFormat = &openai.ChatCompletionResponseFormat{
288290
Type: openai.ChatCompletionResponseFormatTypeJSONSchema,
289291
JSONSchema: &openai.ChatCompletionResponseFormatJSONSchema{
290-
Name: c.ModelOptions.StructuredOutput.Name,
291-
Description: c.ModelOptions.StructuredOutput.Description,
292-
Schema: jsonSchema(c.ModelOptions.StructuredOutput.Schema),
293-
Strict: c.ModelOptions.StructuredOutput.Strict,
292+
Name: structuredOutput.Name,
293+
Description: structuredOutput.Description,
294+
Schema: jsonSchema(structuredOutput.Schema),
295+
Strict: structuredOutput.Strict,
294296
},
295297
}
296-
slog.Debug("OpenAI request using structured output", "name", c.ModelOptions.StructuredOutput.Name, "strict", c.ModelOptions.StructuredOutput.Strict)
297298
}
298299

299300
// Log the request in JSON format for debugging

pkg/model/provider/options/options.go

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,17 @@ import (
66

77
type ModelOptions struct {
88
gateway string
9-
StructuredOutput *latest.StructuredOutput
9+
structuredOutput *latest.StructuredOutput
1010
}
1111

1212
func (c *ModelOptions) Gateway() string {
1313
return c.gateway
1414
}
1515

16+
func (c *ModelOptions) StructuredOutput() *latest.StructuredOutput {
17+
return c.structuredOutput
18+
}
19+
1620
type Opt func(*ModelOptions)
1721

1822
func WithGateway(gateway string) Opt {
@@ -21,9 +25,9 @@ func WithGateway(gateway string) Opt {
2125
}
2226
}
2327

24-
func WithStructuredOutput(output *latest.StructuredOutput) Opt {
28+
func WithStructuredOutput(structuredOutput *latest.StructuredOutput) Opt {
2529
return func(cfg *ModelOptions) {
26-
cfg.StructuredOutput = output
30+
cfg.structuredOutput = structuredOutput
2731
}
2832
}
2933

@@ -34,8 +38,8 @@ func FromModelOptions(m ModelOptions) []Opt {
3438
if g := m.Gateway(); g != "" {
3539
out = append(out, WithGateway(g))
3640
}
37-
if m.StructuredOutput != nil {
38-
out = append(out, WithStructuredOutput(m.StructuredOutput))
41+
if m.structuredOutput != nil {
42+
out = append(out, WithStructuredOutput(m.structuredOutput))
3943
}
4044
return out
4145
}

0 commit comments

Comments
 (0)