From 823f06fe8da7ccd3d077099111874c1c29496766 Mon Sep 17 00:00:00 2001 From: Ayush7614 Date: Mon, 20 Jul 2026 15:52:52 +0530 Subject: [PATCH 1/2] feat(providers): add Fireworks AI provider preset Add an OpenAI-compatible Fireworks catalog entry with curated coding models, models.dev alias mapping, onboarding tests, and README setup. --- README.md | 7 ++++++ .../cli/provider_catalog_onboarding_test.go | 1 + internal/providercatalog/catalog.go | 1 + internal/providercatalog/catalog_test.go | 25 ++++++++++++++++++- internal/providermodelcatalog/catalog.go | 6 +++++ internal/providermodelcatalog/catalog_test.go | 5 ++++ internal/providermodelcatalog/remote.go | 2 ++ internal/providermodelcatalog/remote_test.go | 1 + 8 files changed, 47 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 15a881fbb..9361e7e9c 100644 --- a/README.md +++ b/README.md @@ -130,6 +130,7 @@ export OPENAI_API_KEY=sk-... export ANTHROPIC_API_KEY=... export GEMINI_API_KEY=... export LONGCAT_API_KEY=... +export FIREWORKS_API_KEY=... export MINIMAX_API_KEY=... export MINIMAXI_API_KEY=... ``` @@ -140,6 +141,12 @@ To configure Meituan LongCat (LongCat-2.0) directly, run: zero providers setup longcat --set-active ``` +To configure Fireworks AI directly, run: + +```bash +zero providers setup fireworks --set-active +``` + MiniMax presets use the Anthropic-compatible endpoints for the global and China regions: diff --git a/internal/cli/provider_catalog_onboarding_test.go b/internal/cli/provider_catalog_onboarding_test.go index c9da4219b..485ef53dd 100644 --- a/internal/cli/provider_catalog_onboarding_test.go +++ b/internal/cli/provider_catalog_onboarding_test.go @@ -19,6 +19,7 @@ func TestProviderCatalogRuntimeProvidersShowOnboardingSetupHints(t *testing.T) { {id: "openai", name: "OpenAI", transport: "openai", defaultModel: "gpt-4.1"}, {id: "groq", name: "Groq", transport: "openai-compatible", defaultModel: "llama-3.3-70b-versatile"}, {id: "longcat", name: "LongCat", transport: "openai-compatible", defaultModel: "LongCat-2.0"}, + {id: "fireworks", name: "Fireworks AI", transport: "openai-compatible", defaultModel: "accounts/fireworks/models/deepseek-v3"}, {id: "ollama-cloud", name: "Ollama Cloud", transport: "openai-compatible", defaultModel: "qwen3-coder:480b"}, {id: "ollama", name: "Ollama Local", transport: "openai-compatible", defaultModel: "llama3.1"}, } diff --git a/internal/providercatalog/catalog.go b/internal/providercatalog/catalog.go index 5b1075177..f60e5828d 100644 --- a/internal/providercatalog/catalog.go +++ b/internal/providercatalog/catalog.go @@ -129,6 +129,7 @@ var descriptors = []Descriptor{ openAICompat("groq", "Groq", "https://api.groq.com/openai/v1", "llama-3.3-70b-versatile", []string{"GROQ_API_KEY"}), openAICompat("deepseek", "DeepSeek", "https://api.deepseek.com/v1", "deepseek-chat", []string{"DEEPSEEK_API_KEY"}), openAICompat("together", "Together AI", "https://api.together.xyz/v1", "meta-llama/Llama-3.3-70B-Instruct-Turbo", []string{"TOGETHER_API_KEY"}), + openAICompat("fireworks", "Fireworks AI", "https://api.fireworks.ai/inference/v1", "accounts/fireworks/models/deepseek-v3", []string{"FIREWORKS_API_KEY"}, "fireworks-ai"), openAICompat("dashscope", "DashScope", "https://dashscope-intl.aliyuncs.com/compatible-mode/v1", "qwen-plus", []string{"DASHSCOPE_API_KEY", "QWEN_API_KEY"}, "qwen"), openAICompat("moonshot", "Moonshot AI", "https://api.moonshot.ai/v1", "kimi-k2-0905-preview", []string{"MOONSHOT_API_KEY"}, "kimi"), openAICompat("longcat", "LongCat", "https://api.longcat.chat/openai", "LongCat-2.0", []string{"LONGCAT_API_KEY"}, "meituan longcat", "meituan", "longcat-2.0"), diff --git a/internal/providercatalog/catalog_test.go b/internal/providercatalog/catalog_test.go index c9c5ccfcf..29885c057 100644 --- a/internal/providercatalog/catalog_test.go +++ b/internal/providercatalog/catalog_test.go @@ -21,6 +21,7 @@ var expectedCatalogIDs = []string{ "groq", "deepseek", "together", + "fireworks", "dashscope", "moonshot", "longcat", @@ -125,6 +126,28 @@ func TestLongCatDescriptor(t *testing.T) { } } +func TestFireworksDescriptor(t *testing.T) { + descriptor, err := Require("fireworks") + if err != nil { + t.Fatalf("Require(fireworks) error = %v", err) + } + if descriptor.Name != "Fireworks AI" { + t.Fatalf("Name = %q, want Fireworks AI", descriptor.Name) + } + if descriptor.DefaultBaseURL != "https://api.fireworks.ai/inference/v1" { + t.Fatalf("DefaultBaseURL = %q, want Fireworks OpenAI-compatible endpoint", descriptor.DefaultBaseURL) + } + if descriptor.DefaultModel != "accounts/fireworks/models/deepseek-v3" { + t.Fatalf("DefaultModel = %q, want accounts/fireworks/models/deepseek-v3", descriptor.DefaultModel) + } + if descriptor.Transport != TransportOpenAICompatible { + t.Fatalf("Transport = %q, want %q", descriptor.Transport, TransportOpenAICompatible) + } + if !reflect.DeepEqual(descriptor.AuthEnvVars, []string{"FIREWORKS_API_KEY"}) { + t.Fatalf("AuthEnvVars = %#v, want FIREWORKS_API_KEY", descriptor.AuthEnvVars) + } +} + func TestCatalogDescriptorsExposeRequiredDefaults(t *testing.T) { for _, descriptor := range All() { if descriptor.ID == "" { @@ -293,7 +316,7 @@ func TestListByTransportPreservesCatalogOrder(t *testing.T) { TransportBedrock: {"bedrock"}, TransportVertex: {"vertex"}, TransportAnthropicCompat: {"minimax", "minimaxi-cn", "opencode-go-anthropic-compatible", "custom-anthropic-compatible"}, - TransportOpenAICompat: {"gitlawb-opengateway", "ollama-cloud", "ollama", "lmstudio", "openrouter", "huggingface", "chatgpt", "groq", "deepseek", "together", "dashscope", "moonshot", "longcat", "nvidia-nim", "mistral", "github", "xai", "venice", "xiaomi-mimo", "bankr", "zai", "zai-cn", "kilocode", "opencode", "opencode-go", "atomic-chat", "chatgpt-proxy", "custom-openai-compatible"}, + TransportOpenAICompat: {"gitlawb-opengateway", "ollama-cloud", "ollama", "lmstudio", "openrouter", "huggingface", "chatgpt", "groq", "deepseek", "together", "fireworks", "dashscope", "moonshot", "longcat", "nvidia-nim", "mistral", "github", "xai", "venice", "xiaomi-mimo", "bankr", "zai", "zai-cn", "kilocode", "opencode", "opencode-go", "atomic-chat", "chatgpt-proxy", "custom-openai-compatible"}, } for transport, wantIDs := range cases { diff --git a/internal/providermodelcatalog/catalog.go b/internal/providermodelcatalog/catalog.go index c077daa63..439c69337 100644 --- a/internal/providermodelcatalog/catalog.go +++ b/internal/providermodelcatalog/catalog.go @@ -111,6 +111,12 @@ var curatedModels = map[string][]Model{ {ID: "deepseek-ai/DeepSeek-R1", Description: "reasoning model"}, {ID: "meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8", Description: "multimodal model"}, }, + "fireworks": { + {ID: "accounts/fireworks/models/deepseek-v3", Description: "catalog default"}, + {ID: "accounts/fireworks/models/llama-v3p3-70b-instruct", Description: "general model"}, + {ID: "accounts/fireworks/models/qwen2p5-coder-32b-instruct", Description: "coding model"}, + {ID: "accounts/fireworks/models/deepseek-r1", Description: "reasoning model"}, + }, "dashscope": { {ID: "qwen-plus", Description: "catalog default"}, {ID: "qwen-max", Description: "strong general model"}, diff --git a/internal/providermodelcatalog/catalog_test.go b/internal/providermodelcatalog/catalog_test.go index 127b98105..d6f9dd43d 100644 --- a/internal/providermodelcatalog/catalog_test.go +++ b/internal/providermodelcatalog/catalog_test.go @@ -28,6 +28,11 @@ func TestModelsAreProviderScoped(t *testing.T) { want: []string{"llama-3.3-70b-versatile", "openai/gpt-oss-120b"}, notWant: []string{"gpt-4.1", "claude-sonnet-4.5"}, }, + { + provider: "fireworks", + want: []string{"accounts/fireworks/models/deepseek-v3", "accounts/fireworks/models/qwen2p5-coder-32b-instruct"}, + notWant: []string{"gpt-4.1", "llama-3.3-70b-versatile"}, + }, { provider: "chatgpt", want: []string{"gpt-5.5", "gpt-5.4", "gpt-5.4-mini", "gpt-5.3-codex-spark"}, diff --git a/internal/providermodelcatalog/remote.go b/internal/providermodelcatalog/remote.go index 994bcc009..5d8841054 100644 --- a/internal/providermodelcatalog/remote.go +++ b/internal/providermodelcatalog/remote.go @@ -132,6 +132,8 @@ func ModelsDevProviderID(provider providercatalog.Descriptor) string { return "zai" case "minimaxi-cn": return "minimax" + case "fireworks": + return "fireworks-ai" default: return strings.TrimSpace(provider.ID) } diff --git a/internal/providermodelcatalog/remote_test.go b/internal/providermodelcatalog/remote_test.go index 4e3d5da03..d7e83bf42 100644 --- a/internal/providermodelcatalog/remote_test.go +++ b/internal/providermodelcatalog/remote_test.go @@ -131,6 +131,7 @@ func TestModelsDevProviderIDMapsZeroAliases(t *testing.T) { "ollama-cloud": "ollama-cloud", "zai-cn": "zai", "minimaxi-cn": "minimax", + "fireworks": "fireworks-ai", } for zeroID, want := range tests { provider, ok := providercatalog.Get(zeroID) From 627bbab4948cb72d783f540e37039f3ba50e4629 Mon Sep 17 00:00:00 2001 From: Ayush7614 Date: Mon, 20 Jul 2026 16:51:32 +0530 Subject: [PATCH 2/2] fix(provider): use correct Fireworks DeepSeek V3 model ID Update default and catalog model IDs to deepseek-v3-0324 per Fireworks API. --- internal/cli/provider_catalog_onboarding_test.go | 2 +- internal/providercatalog/catalog.go | 2 +- internal/providercatalog/catalog_test.go | 4 ++-- internal/providermodelcatalog/catalog.go | 2 +- internal/providermodelcatalog/catalog_test.go | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/internal/cli/provider_catalog_onboarding_test.go b/internal/cli/provider_catalog_onboarding_test.go index 485ef53dd..cbbc857e1 100644 --- a/internal/cli/provider_catalog_onboarding_test.go +++ b/internal/cli/provider_catalog_onboarding_test.go @@ -19,7 +19,7 @@ func TestProviderCatalogRuntimeProvidersShowOnboardingSetupHints(t *testing.T) { {id: "openai", name: "OpenAI", transport: "openai", defaultModel: "gpt-4.1"}, {id: "groq", name: "Groq", transport: "openai-compatible", defaultModel: "llama-3.3-70b-versatile"}, {id: "longcat", name: "LongCat", transport: "openai-compatible", defaultModel: "LongCat-2.0"}, - {id: "fireworks", name: "Fireworks AI", transport: "openai-compatible", defaultModel: "accounts/fireworks/models/deepseek-v3"}, + {id: "fireworks", name: "Fireworks AI", transport: "openai-compatible", defaultModel: "accounts/fireworks/models/deepseek-v3-0324"}, {id: "ollama-cloud", name: "Ollama Cloud", transport: "openai-compatible", defaultModel: "qwen3-coder:480b"}, {id: "ollama", name: "Ollama Local", transport: "openai-compatible", defaultModel: "llama3.1"}, } diff --git a/internal/providercatalog/catalog.go b/internal/providercatalog/catalog.go index 0995d6577..248d20678 100644 --- a/internal/providercatalog/catalog.go +++ b/internal/providercatalog/catalog.go @@ -138,7 +138,7 @@ var descriptors = []Descriptor{ openAICompat("groq", "Groq", "https://api.groq.com/openai/v1", "llama-3.3-70b-versatile", []string{"GROQ_API_KEY"}), openAICompat("deepseek", "DeepSeek", "https://api.deepseek.com/v1", "deepseek-chat", []string{"DEEPSEEK_API_KEY"}), openAICompat("together", "Together AI", "https://api.together.xyz/v1", "meta-llama/Llama-3.3-70B-Instruct-Turbo", []string{"TOGETHER_API_KEY"}), - openAICompat("fireworks", "Fireworks AI", "https://api.fireworks.ai/inference/v1", "accounts/fireworks/models/deepseek-v3", []string{"FIREWORKS_API_KEY"}, "fireworks-ai"), + openAICompat("fireworks", "Fireworks AI", "https://api.fireworks.ai/inference/v1", "accounts/fireworks/models/deepseek-v3-0324", []string{"FIREWORKS_API_KEY"}, "fireworks-ai"), openAICompat("dashscope", "DashScope", "https://dashscope-intl.aliyuncs.com/compatible-mode/v1", "qwen-plus", []string{"DASHSCOPE_API_KEY", "QWEN_API_KEY"}, "qwen"), openAICompat("moonshot", "Moonshot AI", "https://api.moonshot.ai/v1", "kimi-k2-0905-preview", []string{"MOONSHOT_API_KEY"}, "kimi"), openAICompat("longcat", "LongCat", "https://api.longcat.chat/openai", "LongCat-2.0", []string{"LONGCAT_API_KEY"}, "meituan longcat", "meituan", "longcat-2.0"), diff --git a/internal/providercatalog/catalog_test.go b/internal/providercatalog/catalog_test.go index a307b6cc6..cd34405c5 100644 --- a/internal/providercatalog/catalog_test.go +++ b/internal/providercatalog/catalog_test.go @@ -166,8 +166,8 @@ func TestFireworksDescriptor(t *testing.T) { if descriptor.DefaultBaseURL != "https://api.fireworks.ai/inference/v1" { t.Fatalf("DefaultBaseURL = %q, want Fireworks OpenAI-compatible endpoint", descriptor.DefaultBaseURL) } - if descriptor.DefaultModel != "accounts/fireworks/models/deepseek-v3" { - t.Fatalf("DefaultModel = %q, want accounts/fireworks/models/deepseek-v3", descriptor.DefaultModel) + if descriptor.DefaultModel != "accounts/fireworks/models/deepseek-v3-0324" { + t.Fatalf("DefaultModel = %q, want accounts/fireworks/models/deepseek-v3-0324", descriptor.DefaultModel) } if descriptor.Transport != TransportOpenAICompatible { t.Fatalf("Transport = %q, want %q", descriptor.Transport, TransportOpenAICompatible) diff --git a/internal/providermodelcatalog/catalog.go b/internal/providermodelcatalog/catalog.go index 81446fe18..913aa8ab7 100644 --- a/internal/providermodelcatalog/catalog.go +++ b/internal/providermodelcatalog/catalog.go @@ -123,7 +123,7 @@ var curatedModels = map[string][]Model{ {ID: "meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8", Description: "multimodal model"}, }, "fireworks": { - {ID: "accounts/fireworks/models/deepseek-v3", Description: "catalog default"}, + {ID: "accounts/fireworks/models/deepseek-v3-0324", Description: "catalog default"}, {ID: "accounts/fireworks/models/llama-v3p3-70b-instruct", Description: "general model"}, {ID: "accounts/fireworks/models/qwen2p5-coder-32b-instruct", Description: "coding model"}, {ID: "accounts/fireworks/models/deepseek-r1", Description: "reasoning model"}, diff --git a/internal/providermodelcatalog/catalog_test.go b/internal/providermodelcatalog/catalog_test.go index c8fab7bdc..10f9087ed 100644 --- a/internal/providermodelcatalog/catalog_test.go +++ b/internal/providermodelcatalog/catalog_test.go @@ -30,7 +30,7 @@ func TestModelsAreProviderScoped(t *testing.T) { }, { provider: "fireworks", - want: []string{"accounts/fireworks/models/deepseek-v3", "accounts/fireworks/models/qwen2p5-coder-32b-instruct"}, + want: []string{"accounts/fireworks/models/deepseek-v3-0324", "accounts/fireworks/models/qwen2p5-coder-32b-instruct"}, notWant: []string{"gpt-4.1", "llama-3.3-70b-versatile"}, }, {