on main help sign in
feat(responses): opt in specific copilot models to responses
f6dc495Kieran Klukas
go.mod+1−1
@@ -7,7 +7,7 @@ require (
7 charm.land/bubbletea/v2 v2.0.6
7 charm.land/bubbletea/v2 v2.0.6
8 charm.land/catwalk v0.40.0
8 charm.land/catwalk v0.40.0
9 charm.land/fang/v2 v2.0.1
9 charm.land/fang/v2 v2.0.1
10− charm.land/fantasy v0.23.2
10+ charm.land/fantasy v0.24.0
11 charm.land/glamour/v2 v2.0.0
11 charm.land/glamour/v2 v2.0.0
12 charm.land/lipgloss/v2 v2.0.3
12 charm.land/lipgloss/v2 v2.0.3
13 charm.land/log/v2 v2.0.0
13 charm.land/log/v2 v2.0.0
go.sum+2−2
@@ -6,8 +6,8 @@ charm.land/catwalk v0.40.0 h1:Ldqr2YzTqk2QdXAFFa5W/EiFoxNGMQc7KXekze5Z+Cw=
6charm.land/catwalk v0.40.0/go.mod h1:LmMFJdRqF5F7qKa+xqD9SBq7tph7L98GU3ZFa1TxftA=
6charm.land/catwalk v0.40.0/go.mod h1:LmMFJdRqF5F7qKa+xqD9SBq7tph7L98GU3ZFa1TxftA=
7charm.land/fang/v2 v2.0.1 h1:zQCM8JQJ1JnQX/66B5jlCYBUxL2as5JXQZ2KJ6EL0mY=
7charm.land/fang/v2 v2.0.1 h1:zQCM8JQJ1JnQX/66B5jlCYBUxL2as5JXQZ2KJ6EL0mY=
8charm.land/fang/v2 v2.0.1/go.mod h1:S1GmkpcvK+OB5w9caywUnJcsMew45Ot8FXqoz8ALrII=
8charm.land/fang/v2 v2.0.1/go.mod h1:S1GmkpcvK+OB5w9caywUnJcsMew45Ot8FXqoz8ALrII=
9−charm.land/fantasy v0.23.2 h1:9gUknrENwv0lV379Hs7m/GK2c/9m+gWXyfbox1tVHrg=
9+charm.land/fantasy v0.24.0 h1:/q35T2TvrqTYqMnFOBHEqp8IWoKMxh05Y7r5wsF/6F4=
10−charm.land/fantasy v0.23.2/go.mod h1:8QrWUzIcKwZQP+aAnC9vLu3iID6hu9/Jt+rPMiieBkc=
10+charm.land/fantasy v0.24.0/go.mod h1:8QrWUzIcKwZQP+aAnC9vLu3iID6hu9/Jt+rPMiieBkc=
11charm.land/glamour/v2 v2.0.0 h1:IDBoqLEy7Hdpb9VOXN+khLP/XSxtJy1VsHuW/yF87+U=
11charm.land/glamour/v2 v2.0.0 h1:IDBoqLEy7Hdpb9VOXN+khLP/XSxtJy1VsHuW/yF87+U=
12charm.land/glamour/v2 v2.0.0/go.mod h1:kjq9WB0s8vuUYZNYey2jp4Lgd9f4cKdzAw88FZtpj/w=
12charm.land/glamour/v2 v2.0.0/go.mod h1:kjq9WB0s8vuUYZNYey2jp4Lgd9f4cKdzAw88FZtpj/w=
13charm.land/lipgloss/v2 v2.0.3 h1:yM2zJ4Cf5Y51b7RHIwioil4ApI/aypFXXVHSwlM6RzU=
13charm.land/lipgloss/v2 v2.0.3 h1:yM2zJ4Cf5Y51b7RHIwioil4ApI/aypFXXVHSwlM6RzU=
internal/agent/coordinator.go+15−1
@@ -62,6 +62,15 @@ var (
62 errSmallModelNotFound = errors.New("small model not found in provider config")
62 errSmallModelNotFound = errors.New("small model not found in provider config")
63)
63)
64
64
65+// Copilot models that use the Responses API instead of Chat Completions.
66+var copilotResponsesModels = map[string]bool{
67+ "gpt-5.2": true,
68+ "gpt-5.2-codex": true,
69+ "gpt-5.3-codex": true,
70+ "gpt-5.4-mini": true,
71+ "gpt-5-mini": true,
72+}
73+
65type Coordinator interface {
74type Coordinator interface {
66 // INFO: (kujtim) this is not used yet we will use this when we have multiple agents
75 // INFO: (kujtim) this is not used yet we will use this when we have multiple agents
67 // SetMainAgent(string)
76 // SetMainAgent(string)
@@ -731,7 +740,12 @@ func (c *coordinator) buildOpenaiCompatProvider(baseURL, apiKey string, headers
731 // Set HTTP client based on provider and debug mode.
740 // Set HTTP client based on provider and debug mode.
732 var httpClient *http.Client
741 var httpClient *http.Client
733 if providerID == string(catwalk.InferenceProviderCopilot) {
742 if providerID == string(catwalk.InferenceProviderCopilot) {
743+ opts = append(opts,
734− opts = append(opts, openaicompat.WithUseResponsesAPI())
744+ openaicompat.WithUseResponsesAPI(),
745+ openaicompat.WithResponsesAPIFunc(func(modelID string) bool {
746+ return copilotResponsesModels[modelID]
747+ }),
748+ )
735 httpClient = copilot.NewClient(isSubAgent, c.cfg.Config().Options.Debug)
749 httpClient = copilot.NewClient(isSubAgent, c.cfg.Config().Options.Debug)
736 } else if c.cfg.Config().Options.Debug {
750 } else if c.cfg.Config().Options.Debug {
737 httpClient = log.NewHTTPClient()
751 httpClient = log.NewHTTPClient()