on main help sign in
feat: add aliababa (singapore) provider (#2949)
4882cbcAndrey Nering
README.md+1
@@ -193,6 +193,7 @@ That said, you can also set environment variables for preferred providers.
193| `CEREBRAS_API_KEY` | Cerebras |
193| `CEREBRAS_API_KEY` | Cerebras |
194| `OPENROUTER_API_KEY` | OpenRouter |
194| `OPENROUTER_API_KEY` | OpenRouter |
195| `IONET_API_KEY` | io.net |
195| `IONET_API_KEY` | io.net |
196+| `ALIBABA_SINGAPORE_API_KEY` | Alibaba (Singapore) |
196| `GROQ_API_KEY` | Groq |
197| `GROQ_API_KEY` | Groq |
197| `AVIAN_API_KEY` | Avian |
198| `AVIAN_API_KEY` | Avian |
198| `OPENCODE_API_KEY` | OpenCode Zen & Go |
199| `OPENCODE_API_KEY` | OpenCode Zen & Go |
go.mod+1−1
@@ -5,7 +5,7 @@ go 1.26.3
5require (
5require (
6 charm.land/bubbles/v2 v2.1.0
6 charm.land/bubbles/v2 v2.1.0
7 charm.land/bubbletea/v2 v2.0.6
7 charm.land/bubbletea/v2 v2.0.6
8− charm.land/catwalk v0.40.4
8+ charm.land/catwalk v0.41.0
9 charm.land/fang/v2 v2.0.1
9 charm.land/fang/v2 v2.0.1
10 charm.land/fantasy v0.25.0
10 charm.land/fantasy v0.25.0
11 charm.land/glamour/v2 v2.0.0
11 charm.land/glamour/v2 v2.0.0
go.sum+2−2
@@ -2,8 +2,8 @@ charm.land/bubbles/v2 v2.1.0 h1:YSnNh5cPYlYjPxRrzs5VEn3vwhtEn3jVGRBT3M7/I0g=
2charm.land/bubbles/v2 v2.1.0/go.mod h1:l97h4hym2hvWBVfmJDtrEHHCtkIKeTEb3TTJ4ZOB3wY=
2charm.land/bubbles/v2 v2.1.0/go.mod h1:l97h4hym2hvWBVfmJDtrEHHCtkIKeTEb3TTJ4ZOB3wY=
3charm.land/bubbletea/v2 v2.0.6 h1:UHN/91OyuhaOFGSrBXQ/hMZD8IO1Uc4BvHlgHXL2WJo=
3charm.land/bubbletea/v2 v2.0.6 h1:UHN/91OyuhaOFGSrBXQ/hMZD8IO1Uc4BvHlgHXL2WJo=
4charm.land/bubbletea/v2 v2.0.6/go.mod h1:MH/D8ZLlN3op37vQvijKuU29g3rqTp+aQapURFonF9g=
4charm.land/bubbletea/v2 v2.0.6/go.mod h1:MH/D8ZLlN3op37vQvijKuU29g3rqTp+aQapURFonF9g=
5−charm.land/catwalk v0.40.4 h1:rVMn+bzrrqRZjT2MGExeyd4ziqCCVAnRCMNp1A2aaKg=
5+charm.land/catwalk v0.41.0 h1:rGeGrEJLFIFqz+glpCD4ICTo2PzL1GMFqGN+jpQn7O4=
6−charm.land/catwalk v0.40.4/go.mod h1:LmMFJdRqF5F7qKa+xqD9SBq7tph7L98GU3ZFa1TxftA=
6+charm.land/catwalk v0.41.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=
9charm.land/fantasy v0.25.0 h1:oXOWY1ivmTSnhYGzAolscF8zKtavWZyBWv0LHRSwN5Q=
9charm.land/fantasy v0.25.0 h1:oXOWY1ivmTSnhYGzAolscF8zKtavWZyBWv0LHRSwN5Q=
internal/agent/coordinator.go+4
@@ -392,6 +392,10 @@ func getProviderOptions(model Model, providerCfg config.ProviderConfig) fantasy.
392 "type": "disabled",
392 "type": "disabled",
393 }
393 }
394 }
394 }
395+ case string(catwalk.InferenceProviderAlibabaSingapore):
396+ if model.CatwalkCfg.CanReason {
397+ extraBody["enable_thinking"] = model.ModelCfg.Think
398+ }
395 }
399 }
396
400
397 mergedOptions["extra_body"] = extraBody
401 mergedOptions["extra_body"] = extraBody
internal/config/config.go+7
@@ -745,6 +745,13 @@ func (c *ProviderConfig) TestConnection(resolver VariableResolver) error {
745 case catwalk.InferenceProviderMiniMax, catwalk.InferenceProviderMiniMaxChina:
745 case catwalk.InferenceProviderMiniMax, catwalk.InferenceProviderMiniMaxChina:
746 // NOTE: MiniMax has no good endpoint we can use to validate the API key.
746 // NOTE: MiniMax has no good endpoint we can use to validate the API key.
747 return nil
747 return nil
748+ case catwalk.InferenceProviderAlibabaSingapore:
749+ // NOTE: Alibaba has no good endpoint we can use to validate the API key.
750+ // Let's at least check the pattern.
751+ if !strings.HasPrefix(apiKey, "sk-") {
752+ return fmt.Errorf("invalid API key format for provider %s", c.ID)
753+ }
754+ return nil
748 }
755 }
749
756
750 switch c.Type {
757 switch c.Type {