Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion agent-schema.json
Original file line number Diff line number Diff line change
Expand Up @@ -182,7 +182,7 @@
"properties": {
"provider": {
"type": "string",
"description": "The underlying provider type. Defaults to \"openai\" when not set. Supported values: openai, anthropic, google, amazon-bedrock, dmr, and any built-in alias (requesty, openrouter, azure, xai, ollama, mistral, baseten, ovhcloud, groq, deepseek, cerebras, etc.).",
"description": "The underlying provider type. Defaults to \"openai\" when not set. Supported values: openai, anthropic, google, amazon-bedrock, dmr, and any built-in alias (requesty, openrouter, azure, xai, ollama, mistral, baseten, ovhcloud, groq, fireworks, deepseek, cerebras, etc.).",
"examples": [
"openai",
"anthropic",
Expand Down
2 changes: 2 additions & 0 deletions docs/_data/nav.yml
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,8 @@
url: /providers/deepseek/
- title: Docker Model Runner
url: /providers/dmr/
- title: Fireworks AI
url: /providers/fireworks/
- title: GitHub Copilot
url: /providers/github-copilot/
- title: Google Gemini
Expand Down
1 change: 1 addition & 0 deletions docs/concepts/models/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,7 @@ for details.
| Baseten | `baseten` | DeepSeek, Kimi, GLM, Llama models | `BASETEN_API_KEY` |
| OVHcloud | `ovhcloud` | Qwen, Llama, Mistral, DeepSeek (EU-hosted) | `OVH_AI_ENDPOINTS_ACCESS_TOKEN` |
| Groq | `groq` | Llama, Qwen, GPT-OSS (fast inference) | `GROQ_API_KEY` |
| Fireworks AI | `fireworks` | Kimi, Llama, Qwen, DeepSeek, GLM (open models) | `FIREWORKS_API_KEY` |
| DeepSeek | `deepseek` | DeepSeek-V3 chat and R1 reasoner | `DEEPSEEK_API_KEY` |
| Cerebras | `cerebras` | GPT-OSS, GLM (fast inference) | `CEREBRAS_API_KEY` |
| Requesty | `requesty` | Multi-provider gateway | `REQUESTY_API_KEY` |
Expand Down
6 changes: 3 additions & 3 deletions docs/configuration/models/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ models:
first_available: [list] # Optional: candidate model refs, tried in order by available credentials.
# Mutually exclusive with other model settings.
provider: string # Required unless using first_available. One of: openai, anthropic, google, amazon-bedrock,
# dmr, mistral, xai, nebius, minimax, baseten, ovhcloud, groq, deepseek, cerebras, requesty, openrouter,
# dmr, mistral, xai, nebius, minimax, baseten, ovhcloud, groq, fireworks, deepseek, cerebras, requesty, openrouter,
# azure, ollama, github-copilot, or a named provider defined
# under the top-level `providers:` section.
model: string # Required: model identifier
Expand Down Expand Up @@ -48,7 +48,7 @@ models:
| Property | Type | Required | Description |
| --------------------- | ---------- | -------- | ------------------------------------------------------------------------------------- |
| `first_available` | array | ✗ | Candidate model references tried in order; selects the first whose credentials are configured. Mutually exclusive with other model settings. |
| `provider` | string | ✓/✗ | Required for regular model definitions; omitted for `first_available` selectors. Provider: `openai`, `anthropic`, `google`, `amazon-bedrock`, `dmr`, `mistral`, `xai`, `nebius`, `minimax`, `baseten`, `ovhcloud`, `groq`, `deepseek`, `cerebras`, `requesty`, `openrouter`, `azure`, `ollama`, `github-copilot`, or any [named provider]({{ '/providers/custom/' | relative_url }}). |
| `provider` | string | ✓/✗ | Required for regular model definitions; omitted for `first_available` selectors. Provider: `openai`, `anthropic`, `google`, `amazon-bedrock`, `dmr`, `mistral`, `xai`, `nebius`, `minimax`, `baseten`, `ovhcloud`, `groq`, `fireworks`, `deepseek`, `cerebras`, `requesty`, `openrouter`, `azure`, `ollama`, `github-copilot`, or any [named provider]({{ '/providers/custom/' | relative_url }}). |
| `model` | string | ✓/✗ | Required for regular model definitions; omitted for `first_available` selectors. Model name (e.g., `gpt-4o`, `claude-sonnet-4-5`, `gemini-3.5-flash`) |
| `temperature` | float | ✗ | Sampling randomness. Range is provider-dependent — typically `0.0–2.0` (Anthropic caps at `1.0`). `0.0` is deterministic. |
| `max_tokens` | int | ✗ | Maximum response length in tokens |
Expand Down Expand Up @@ -404,7 +404,7 @@ See the [Anthropic provider page]({{ '/providers/anthropic/#thinking-display' |
## Custom HTTP Headers

For OpenAI-compatible providers (`openai`, `github-copilot`, `mistral`, `xai`,
`nebius`, `minimax`, `baseten`, `ovhcloud`, `groq`, `deepseek`, `cerebras`, `requesty`, `openrouter`, `ollama`, and any custom provider using the OpenAI API),
`nebius`, `minimax`, `baseten`, `ovhcloud`, `groq`, `fireworks`, `deepseek`, `cerebras`, `requesty`, `openrouter`, `ollama`, and any custom provider using the OpenAI API),
`provider_opts.http_headers` adds arbitrary HTTP headers to every outgoing
request:

Expand Down
102 changes: 102 additions & 0 deletions docs/providers/fireworks/index.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
---
title: "Fireworks AI"
description: "Use Fireworks AI models with docker-agent."
permalink: /providers/fireworks/
---

# Fireworks AI

_Use Fireworks AI models with docker-agent._

## Overview

[Fireworks AI](https://fireworks.ai/) is a fast inference host for open-weight
models, serving Kimi K2, Llama, Qwen, DeepSeek, GLM and others through an
OpenAI-compatible API. docker-agent includes built-in support for Fireworks AI
as an alias provider.

## Setup

1. Create an API key from the [Fireworks dashboard](https://fireworks.ai/account/api-keys).
2. Set the environment variable:

```bash
export FIREWORKS_API_KEY=your-api-key
```

## Usage

### Inline Syntax

The simplest way to use Fireworks AI:

```yaml
agents:
root:
model: fireworks/accounts/fireworks/models/kimi-k2-instruct
description: Assistant using Fireworks AI
instruction: You are a helpful assistant.
```

### Named Model

For more control over parameters:

```yaml
models:
fireworks_model:
provider: fireworks
model: accounts/fireworks/models/kimi-k2-instruct
temperature: 0.7
max_tokens: 8192

agents:
root:
model: fireworks_model
description: Assistant using Fireworks AI
instruction: You are a helpful assistant.
```

## Available Models

Fireworks serves a broad, changing catalog of open-weight models. Model IDs use
the `accounts/fireworks/models/<name>` form. Check the
[Fireworks model library](https://fireworks.ai/models) for current IDs, context
limits, and pricing.

| Model | Description |
| --- | --- |
| `accounts/fireworks/models/kimi-k2-instruct` | Kimi K2, large open MoE chat and tool-calling model |
| `accounts/fireworks/models/llama-v3p3-70b-instruct` | Llama 3.3 70B instruct |
| `accounts/fireworks/models/qwen3-235b-a22b` | Qwen 3 235B MoE |

> Model IDs are case-sensitive and must be passed exactly as the catalogue lists
> them.

## How It Works

Fireworks AI is implemented as a built-in alias in docker-agent:

- **API Type:** OpenAI-compatible (`openai_chatcompletions`)
- **Base URL:** `https://api.fireworks.ai/inference/v1`
- **Token Variable:** `FIREWORKS_API_KEY`

Because Fireworks fronts open-weight models whose chat templates may reject more
than one leading system message, docker-agent coalesces its per-source system
messages into a single one for this provider.

## Example: Code Assistant

```yaml
agents:
coder:
model: fireworks/accounts/fireworks/models/kimi-k2-instruct
description: Code assistant using Kimi K2 on Fireworks AI
instruction: |
You are an expert programmer.
Write clean, well-documented code and follow language best practices.
toolsets:
- type: filesystem
- type: shell
- type: think
```
1 change: 1 addition & 0 deletions docs/providers/overview/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ docker-agent also includes built-in aliases for these providers:
| Baseten | `baseten` | `BASETEN_API_KEY` |
| OVHcloud | `ovhcloud` | `OVH_AI_ENDPOINTS_ACCESS_TOKEN` |
| Groq | `groq` | `GROQ_API_KEY` |
| Fireworks AI | `fireworks` | `FIREWORKS_API_KEY` |
| DeepSeek | `deepseek` | `DEEPSEEK_API_KEY` |
| Cerebras | `cerebras` | `CEREBRAS_API_KEY` |
| Requesty | `requesty` | `REQUESTY_API_KEY` |
Expand Down
1 change: 1 addition & 0 deletions examples/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -196,6 +196,7 @@ remote MCP endpoints.
| [`baseten.yaml`](baseten.yaml) | Baseten cloud provider. |
| [`ovhcloud.yaml`](ovhcloud.yaml) | OVHcloud AI Endpoints provider. |
| [`groq.yaml`](groq.yaml) | Groq fast-inference provider. |
| [`fireworks.yaml`](fireworks.yaml) | Fireworks AI open-model inference provider. |
| [`deepseek.yaml`](deepseek.yaml) | DeepSeek chat and reasoning provider. |
| [`cerebras.yaml`](cerebras.yaml) | Cerebras fast-inference provider. |
| [`grok.yaml`](grok.yaml) | xAI Grok model. |
Expand Down
17 changes: 17 additions & 0 deletions examples/fireworks.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# yaml-language-server: $schema=../agent-schema.json

models:
fireworks_model:
provider: fireworks
model: accounts/fireworks/models/kimi-k2-instruct

agents:
root:
model: fireworks_model
description: Assistant using Fireworks AI
instruction: |
You are a helpful assistant.
toolsets:
- type: filesystem
- type: shell
- type: think
2 changes: 2 additions & 0 deletions pkg/config/auto.go
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ var cloudProviders = []providerConfig{
{"baseten", []string{"BASETEN_API_KEY"}, "BASETEN_API_KEY"},
{"ovhcloud", []string{"OVH_AI_ENDPOINTS_ACCESS_TOKEN"}, "OVH_AI_ENDPOINTS_ACCESS_TOKEN"},
{"groq", []string{"GROQ_API_KEY"}, "GROQ_API_KEY"},
{"fireworks", []string{"FIREWORKS_API_KEY"}, "FIREWORKS_API_KEY"},
{"deepseek", []string{"DEEPSEEK_API_KEY"}, "DEEPSEEK_API_KEY"},
{"cerebras", []string{"CEREBRAS_API_KEY"}, "CEREBRAS_API_KEY"},
{"amazon-bedrock", []string{
Expand Down Expand Up @@ -115,6 +116,7 @@ var DefaultModels = map[string]string{
"baseten": "deepseek-ai/DeepSeek-V3.1",
"ovhcloud": "Qwen3.5-397B-A17B",
"groq": "llama-3.3-70b-versatile",
"fireworks": "accounts/fireworks/models/kimi-k2-instruct",
"deepseek": "deepseek-chat",
"cerebras": "gpt-oss-120b",
"amazon-bedrock": "global.anthropic.claude-sonnet-4-5-20250929-v1:0",
Expand Down
37 changes: 32 additions & 5 deletions pkg/config/auto_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,13 @@ func TestAvailableProviders_NoGateway(t *testing.T) {
},
expectedProvider: "groq",
},
{
name: "fireworks api key present",
envVars: map[string]string{
"FIREWORKS_API_KEY": "test-key",
},
expectedProvider: "fireworks",
},
{
name: "deepseek api key present",
envVars: map[string]string{
Expand Down Expand Up @@ -279,6 +286,15 @@ func TestAutoModelConfig(t *testing.T) {
expectedModel: "llama-3.3-70b-versatile",
expectedMaxTokens: 32000,
},
{
name: "fireworks provider",
envVars: map[string]string{
"FIREWORKS_API_KEY": "test-key",
},
expectedProvider: "fireworks",
expectedModel: "accounts/fireworks/models/kimi-k2-instruct",
expectedMaxTokens: 32000,
},
{
name: "deepseek provider",
envVars: map[string]string{
Expand Down Expand Up @@ -379,7 +395,7 @@ func TestDefaultModels(t *testing.T) {
t.Parallel()

// Test that DefaultModels map has all expected providers
expectedProviders := []string{"openai", "anthropic", "google", "dmr", "mistral", "openrouter", "baseten", "ovhcloud", "groq", "deepseek", "cerebras", "amazon-bedrock", "opencode-zen", "opencode-go"}
expectedProviders := []string{"openai", "anthropic", "google", "dmr", "mistral", "openrouter", "baseten", "ovhcloud", "groq", "fireworks", "deepseek", "cerebras", "amazon-bedrock", "opencode-zen", "opencode-go"}

for _, provider := range expectedProviders {
t.Run(provider, func(t *testing.T) {
Expand All @@ -399,6 +415,7 @@ func TestDefaultModels(t *testing.T) {
assert.Equal(t, "deepseek-ai/DeepSeek-V3.1", DefaultModels["baseten"])
assert.Equal(t, "Qwen3.5-397B-A17B", DefaultModels["ovhcloud"])
assert.Equal(t, "llama-3.3-70b-versatile", DefaultModels["groq"])
assert.Equal(t, "accounts/fireworks/models/kimi-k2-instruct", DefaultModels["fireworks"])
assert.Equal(t, "deepseek-chat", DefaultModels["deepseek"])
assert.Equal(t, "gpt-oss-120b", DefaultModels["cerebras"])
assert.Equal(t, "global.anthropic.claude-sonnet-4-5-20250929-v1:0", DefaultModels["amazon-bedrock"])
Expand All @@ -410,7 +427,7 @@ func TestAutoModelConfig_IntegrationWithDefaultModels(t *testing.T) {
t.Parallel()

// Verify that AutoModelConfig always returns a model from DefaultModels
providers := []string{"openai", "anthropic", "google", "mistral", "openrouter", "baseten", "ovhcloud", "groq", "deepseek", "cerebras", "opencode-zen"}
providers := []string{"openai", "anthropic", "google", "mistral", "openrouter", "baseten", "ovhcloud", "groq", "fireworks", "deepseek", "cerebras", "opencode-zen"}

for _, provider := range providers {
t.Run(provider, func(t *testing.T) {
Expand All @@ -436,6 +453,8 @@ func TestAutoModelConfig_IntegrationWithDefaultModels(t *testing.T) {
envVars["OVH_AI_ENDPOINTS_ACCESS_TOKEN"] = "test-token"
case "groq":
envVars["GROQ_API_KEY"] = "test-key"
case "fireworks":
envVars["FIREWORKS_API_KEY"] = "test-key"
case "deepseek":
envVars["DEEPSEEK_API_KEY"] = "test-key"
case "cerebras":
Expand Down Expand Up @@ -561,14 +580,22 @@ func TestAvailableProviders_PrecedenceOrder(t *testing.T) {
providers = AvailableProviders(t.Context(), "", env)
assert.Equal(t, "ovhcloud", providers[0])

// groq wins over deepseek
// groq wins over fireworks
env = environment.NewMapEnvProvider(map[string]string{
"GROQ_API_KEY": "test-key",
"DEEPSEEK_API_KEY": "test-key",
"GROQ_API_KEY": "test-key",
"FIREWORKS_API_KEY": "test-key",
})
providers = AvailableProviders(t.Context(), "", env)
assert.Equal(t, "groq", providers[0])

// fireworks wins over deepseek
env = environment.NewMapEnvProvider(map[string]string{
"FIREWORKS_API_KEY": "test-key",
"DEEPSEEK_API_KEY": "test-key",
})
providers = AvailableProviders(t.Context(), "", env)
assert.Equal(t, "fireworks", providers[0])

// deepseek wins over cerebras
env = environment.NewMapEnvProvider(map[string]string{
"DEEPSEEK_API_KEY": "test-key",
Expand Down
1 change: 1 addition & 0 deletions pkg/config/examples_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ var modelsDevAbsentProviders = map[string]bool{
"dmr": true, // Docker Model Runner (local, not in catalog)
"opencode-zen": true, // not yet registered in models.dev
"ovhcloud": true, // OVHcloud AI Endpoints (not yet in models.dev)
"fireworks": true, // models.dev catalogs Fireworks under the "fireworks-ai" id, not "fireworks"
}

func collectExamples(t *testing.T) []string {
Expand Down
5 changes: 5 additions & 0 deletions pkg/model/provider/aliases.go
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,11 @@ var Aliases = map[string]Alias{
BaseURL: "https://api.groq.com/openai/v1",
TokenEnvVar: "GROQ_API_KEY",
},
"fireworks": {
APIType: "openai",
BaseURL: "https://api.fireworks.ai/inference/v1",
TokenEnvVar: "FIREWORKS_API_KEY",
},
"deepseek": {
APIType: "openai",
BaseURL: "https://api.deepseek.com/v1",
Expand Down
14 changes: 14 additions & 0 deletions pkg/model/provider/aliases_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,20 @@ func TestGroqAlias(t *testing.T) {
assert.True(t, IsCatalogProvider("groq"))
}

func TestFireworksAlias(t *testing.T) {
t.Parallel()

alias, ok := LookupAlias("fireworks")
require.True(t, ok)
assert.Equal(t, Alias{
APIType: "openai",
BaseURL: "https://api.fireworks.ai/inference/v1",
TokenEnvVar: "FIREWORKS_API_KEY",
}, alias)
assert.True(t, IsKnownProvider("fireworks"))
assert.True(t, IsCatalogProvider("fireworks"))
}

func TestDeepSeekAlias(t *testing.T) {
t.Parallel()

Expand Down
Loading
Loading