Skip to content

Commit 3eaccba

Browse files
authored
Refine Go SDK pre-GA API surfaces (#1549)
* Refine Go SDK pre-GA API surfaces * fix codereview comments
1 parent 4f88e9c commit 3eaccba

15 files changed

Lines changed: 271 additions & 177 deletions

docs/auth/byok.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -409,7 +409,7 @@ func main() {
409409
Name: "My Custom Model",
410410
Capabilities: copilot.ModelCapabilities{
411411
Supports: copilot.ModelSupports{Vision: false, ReasoningEffort: false},
412-
Limits: copilot.ModelLimits{MaxContextWindowTokens: 128000},
412+
Limits: copilot.ModelLimits{MaxContextWindowTokens: copilot.Int(128000)},
413413
},
414414
},
415415
}, nil
@@ -478,7 +478,7 @@ When using BYOK, be aware of these limitations:
478478

479479
### Identity limitations
480480

481-
BYOK authentication uses **static credentials only**.
481+
BYOK authentication uses **static credentials only**.
482482

483483
You must use an API key or static bearer token that you manage yourself.
484484

docs/features/mcp.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ func main() {
120120
"my-local-server": copilot.MCPStdioServerConfig{
121121
Command: "node",
122122
Args: []string{"./mcp-server.js"},
123-
Tools: &[]string{"*"},
123+
Tools: []string{"*"},
124124
},
125125
},
126126
})

go/README.md

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -810,11 +810,10 @@ name, ok, err := ui.Input(ctx, "Enter the release name", &copilot.UIInputOptions
810810
})
811811

812812
// Full custom elicitation with a schema
813-
result, err := ui.Elicitation(ctx, "Configure deployment", rpc.RequestedSchema{
814-
Type: rpc.RequestedSchemaTypeObject,
815-
Properties: map[string]rpc.Property{
816-
"target": {Type: rpc.PropertyTypeString, Enum: []string{"staging", "production"}},
817-
"force": {Type: rpc.PropertyTypeBoolean},
813+
result, err := ui.Elicitation(ctx, "Configure deployment", copilot.ElicitationSchema{
814+
Properties: map[string]any{
815+
"target": map[string]any{"type": "string", "enum": []string{"staging", "production"}},
816+
"force": map[string]any{"type": "boolean"},
818817
},
819818
Required: []string{"target"},
820819
})
@@ -839,7 +838,7 @@ session, err := client.CreateSession(ctx, &copilot.SessionConfig{
839838

840839
// Return the user's response
841840
return copilot.ElicitationResult{
842-
Action: "accept",
841+
Action: copilot.ElicitationActionAccept,
843842
Content: map[string]any{"confirmed": true},
844843
}, nil
845844
},

go/client_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -867,7 +867,7 @@ func TestListModelsWithCustomHandler(t *testing.T) {
867867
Name: "My Custom Model",
868868
Capabilities: ModelCapabilities{
869869
Supports: ModelSupports{Vision: false, ReasoningEffort: false},
870-
Limits: ModelLimits{MaxContextWindowTokens: 128000},
870+
Limits: ModelLimits{MaxContextWindowTokens: Int(128000)},
871871
},
872872
},
873873
}
@@ -899,7 +899,7 @@ func TestListModelsHandlerCachesResults(t *testing.T) {
899899
Name: "Cached Model",
900900
Capabilities: ModelCapabilities{
901901
Supports: ModelSupports{Vision: false, ReasoningEffort: false},
902-
Limits: ModelLimits{MaxContextWindowTokens: 128000},
902+
Limits: ModelLimits{MaxContextWindowTokens: Int(128000)},
903903
},
904904
},
905905
}

go/internal/e2e/commands_and_elicitation_e2e_test.go

Lines changed: 22 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -437,7 +437,7 @@ func TestUIElicitationCallbackE2E(t *testing.T) {
437437
session, err := client.CreateSession(t.Context(), &copilot.SessionConfig{
438438
OnPermissionRequest: copilot.PermissionHandler.ApproveAll,
439439
OnElicitationRequest: func(ctx copilot.ElicitationContext) (copilot.ElicitationResult, error) {
440-
return copilot.ElicitationResult{Action: "accept", Content: map[string]any{}}, nil
440+
return copilot.ElicitationResult{Action: copilot.ElicitationActionAccept, Content: map[string]any{}}, nil
441441
},
442442
})
443443
if err != nil {
@@ -481,7 +481,7 @@ func TestUIElicitationCallbackE2E(t *testing.T) {
481481
t.Errorf("Expected RequestedSchema to contain 'confirmed' property")
482482
}
483483
return copilot.ElicitationResult{
484-
Action: "accept",
484+
Action: copilot.ElicitationActionAccept,
485485
Content: map[string]any{"confirmed": true},
486486
}, nil
487487
},
@@ -505,7 +505,7 @@ func TestUIElicitationCallbackE2E(t *testing.T) {
505505
session, err := client.CreateSession(t.Context(), &copilot.SessionConfig{
506506
OnPermissionRequest: copilot.PermissionHandler.ApproveAll,
507507
OnElicitationRequest: func(ec copilot.ElicitationContext) (copilot.ElicitationResult, error) {
508-
return copilot.ElicitationResult{Action: "decline"}, nil
508+
return copilot.ElicitationResult{Action: copilot.ElicitationActionDecline}, nil
509509
},
510510
})
511511
if err != nil {
@@ -534,7 +534,7 @@ func TestUIElicitationCallbackE2E(t *testing.T) {
534534
t.Errorf("Expected RequestedSchema to contain 'selection' property")
535535
}
536536
return copilot.ElicitationResult{
537-
Action: "accept",
537+
Action: copilot.ElicitationActionAccept,
538538
Content: map[string]any{"selection": "beta"},
539539
}, nil
540540
},
@@ -568,7 +568,7 @@ func TestUIElicitationCallbackE2E(t *testing.T) {
568568
t.Errorf("Expected RequestedSchema to contain 'value' property")
569569
}
570570
return copilot.ElicitationResult{
571-
Action: "accept",
571+
Action: copilot.ElicitationActionAccept,
572572
Content: map[string]any{"value": "typed value"},
573573
}, nil
574574
},
@@ -601,9 +601,9 @@ func TestUIElicitationCallbackE2E(t *testing.T) {
601601
ctx.ConfigureForTest(t)
602602

603603
responses := []copilot.ElicitationResult{
604-
{Action: "accept", Content: map[string]any{"name": "Mona"}},
605-
{Action: "decline"},
606-
{Action: "cancel"},
604+
{Action: copilot.ElicitationActionAccept, Content: map[string]any{"name": "Mona"}},
605+
{Action: copilot.ElicitationActionDecline},
606+
{Action: copilot.ElicitationActionCancel},
607607
}
608608
var idx int
609609

@@ -625,9 +625,8 @@ func TestUIElicitationCallbackE2E(t *testing.T) {
625625
t.Fatalf("CreateSession failed: %v", err)
626626
}
627627

628-
schema := rpc.UIElicitationSchema{
629-
Type: rpc.UIElicitationSchemaTypeObject,
630-
Properties: map[string]rpc.UIElicitationSchemaProperty{
628+
schema := copilot.ElicitationSchema{
629+
Properties: map[string]any{
631630
"name": &rpc.UIElicitationSchemaPropertyString{},
632631
},
633632
Required: []string{"name"},
@@ -637,26 +636,26 @@ func TestUIElicitationCallbackE2E(t *testing.T) {
637636
if err != nil {
638637
t.Fatalf("Elicitation accept call failed: %v", err)
639638
}
640-
if accept.Action != "accept" {
639+
if accept.Action != copilot.ElicitationActionAccept {
641640
t.Errorf("Expected accept.Action='accept', got %q", accept.Action)
642641
}
643-
if accept.Content == nil || fmt.Sprintf("%v", accept.Content["name"]) != "Mona" {
642+
if accept.Content == nil || accept.Content["name"] != "Mona" {
644643
t.Errorf("Expected accept.Content[name]='Mona', got %v", accept.Content)
645644
}
646645

647646
decline, err := session.UI().Elicitation(t.Context(), "Name?", schema)
648647
if err != nil {
649648
t.Fatalf("Elicitation decline call failed: %v", err)
650649
}
651-
if decline.Action != "decline" {
650+
if decline.Action != copilot.ElicitationActionDecline {
652651
t.Errorf("Expected decline.Action='decline', got %q", decline.Action)
653652
}
654653

655654
cancel, err := session.UI().Elicitation(t.Context(), "Name?", schema)
656655
if err != nil {
657656
t.Fatalf("Elicitation cancel call failed: %v", err)
658657
}
659-
if cancel.Action != "cancel" {
658+
if cancel.Action != copilot.ElicitationActionCancel {
660659
t.Errorf("Expected cancel.Action='cancel', got %q", cancel.Action)
661660
}
662661
})
@@ -681,7 +680,7 @@ func TestUIElicitationCallbackE2E(t *testing.T) {
681680
session, err := client.CreateSession(t.Context(), &copilot.SessionConfig{
682681
OnPermissionRequest: copilot.PermissionHandler.ApproveAll,
683682
OnElicitationRequest: func(ec copilot.ElicitationContext) (copilot.ElicitationResult, error) {
684-
return copilot.ElicitationResult{Action: "accept", Content: map[string]any{}}, nil
683+
return copilot.ElicitationResult{Action: copilot.ElicitationActionAccept, Content: map[string]any{}}, nil
685684
},
686685
})
687686
if err != nil {
@@ -694,29 +693,14 @@ func TestUIElicitationCallbackE2E(t *testing.T) {
694693
})
695694
}
696695

697-
// schemaHasProperty reports whether the elicitation schema map has a top-level
698-
// property with the given name. RequestedSchema["properties"] is typically a
699-
// map[string]rpc.UIElicitationSchemaProperty, but we accept any map[string]X.
700-
func schemaHasProperty(schema map[string]any, name string) bool {
696+
// schemaHasProperty reports whether the elicitation schema has a top-level
697+
// property with the given name.
698+
func schemaHasProperty(schema *copilot.ElicitationSchema, name string) bool {
701699
if schema == nil {
702700
return false
703701
}
704-
props, ok := schema["properties"]
705-
if !ok || props == nil {
706-
return false
707-
}
708-
switch p := props.(type) {
709-
case map[string]any:
710-
_, found := p[name]
711-
return found
712-
case map[string]rpc.UIElicitationSchemaProperty:
713-
_, found := p[name]
714-
return found
715-
default:
716-
// Fallback: marshal/unmarshal via reflection-friendly route.
717-
// For test diagnostic purposes we treat unknown shapes as not found.
718-
return false
719-
}
702+
_, found := schema.Properties[name]
703+
return found
720704
}
721705

722706
func TestUIElicitationMultiClientE2E(t *testing.T) {
@@ -776,7 +760,7 @@ func TestUIElicitationMultiClientE2E(t *testing.T) {
776760
OnPermissionRequest: copilot.PermissionHandler.ApproveAll,
777761
SuppressResumeEvent: true,
778762
OnElicitationRequest: func(ctx copilot.ElicitationContext) (copilot.ElicitationResult, error) {
779-
return copilot.ElicitationResult{Action: "accept", Content: map[string]any{}}, nil
763+
return copilot.ElicitationResult{Action: copilot.ElicitationActionAccept, Content: map[string]any{}}, nil
780764
},
781765
})
782766
if err != nil {
@@ -836,7 +820,7 @@ func TestUIElicitationMultiClientE2E(t *testing.T) {
836820
OnPermissionRequest: copilot.PermissionHandler.ApproveAll,
837821
SuppressResumeEvent: true,
838822
OnElicitationRequest: func(ctx copilot.ElicitationContext) (copilot.ElicitationResult, error) {
839-
return copilot.ElicitationResult{Action: "accept", Content: map[string]any{}}, nil
823+
return copilot.ElicitationResult{Action: copilot.ElicitationActionAccept, Content: map[string]any{}}, nil
840824
},
841825
})
842826
if err != nil {

go/internal/e2e/mcp_and_agents_e2e_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ func TestMCPServersE2E(t *testing.T) {
5959
mcpServers := map[string]copilot.MCPServerConfig{
6060
"test-server": copilot.MCPStdioServerConfig{
6161
Command: "git",
62-
Tools: &[]string{"*"},
62+
Tools: []string{"*"},
6363
},
6464
}
6565

@@ -125,7 +125,7 @@ func TestMCPServersE2E(t *testing.T) {
125125
"env-echo": copilot.MCPStdioServerConfig{
126126
Command: "node",
127127
Args: []string{mcpServerPath},
128-
Tools: &[]string{"*"},
128+
Tools: []string{"*"},
129129
Env: map[string]string{"TEST_SECRET": "hunter2"},
130130
WorkingDirectory: mcpServerDir,
131131
},

go/internal/e2e/mcp_server_helpers_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ func testMCPServers(t *testing.T, serverNames ...string) map[string]copilot.MCPS
2323
mcpServers[serverName] = copilot.MCPStdioServerConfig{
2424
Command: "node",
2525
Args: []string{mcpServerPath},
26-
Tools: &[]string{"*"},
26+
Tools: []string{"*"},
2727
WorkingDirectory: mcpServerDir,
2828
}
2929
}

go/internal/e2e/pre_mcp_tool_call_hook_e2e_test.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,12 @@ func TestPreMCPToolCallHookE2E(t *testing.T) {
1919
metaEchoServer := filepath.Join(testHarnessDir, "test-mcp-meta-echo-server.mjs")
2020

2121
metaEchoConfig := func() map[string]copilot.MCPServerConfig {
22-
tools := []string{"*"}
2322
return map[string]copilot.MCPServerConfig{
2423
"meta-echo": copilot.MCPStdioServerConfig{
2524
Command: "node",
2625
Args: []string{metaEchoServer},
2726
WorkingDirectory: testHarnessDir,
28-
Tools: &tools,
27+
Tools: []string{"*"},
2928
},
3029
}
3130
}

go/internal/e2e/rpc_tasks_and_handlers_e2e_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -311,7 +311,7 @@ func TestRPCTasksAndHandlersE2E(t *testing.T) {
311311
OnElicitationRequest: func(ctx copilot.ElicitationContext) (copilot.ElicitationResult, error) {
312312
handlerContext <- ctx
313313
return copilot.ElicitationResult{
314-
Action: "accept",
314+
Action: copilot.ElicitationActionAccept,
315315
Content: map[string]any{
316316
"answer": "from handler",
317317
"confirmed": true,
@@ -347,7 +347,7 @@ func TestRPCTasksAndHandlersE2E(t *testing.T) {
347347
if ctx.SessionID != session.SessionID || ctx.Message != "Need details" {
348348
t.Fatalf("Unexpected elicitation context: %+v", ctx)
349349
}
350-
if _, ok := ctx.RequestedSchema["properties"]; !ok {
350+
if ctx.RequestedSchema == nil || ctx.RequestedSchema.Properties == nil {
351351
t.Fatalf("Expected requested schema to include properties, got %+v", ctx.RequestedSchema)
352352
}
353353
if response.Action != rpc.UIElicitationResponseActionAccept {

0 commit comments

Comments
 (0)