Skip to content

Commit 12ba79f

Browse files
authored
feat(llm): add Google Gemini, AWS Bedrock, io.net, Mistral, Yandex, and Cloudflare WS AI providers (#676)
* feat(llm): add Google Gemini and AWS Bedrock providers * feat(llm): add io.net, Mistral, Yandex, and Cloudflare WS AI providers
1 parent d3cf637 commit 12ba79f

4 files changed

Lines changed: 176 additions & 14 deletions

File tree

FEATURE_PARITY.md

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -215,9 +215,13 @@ This document tracks feature parity between IronClaw (Rust implementation) and O
215215
| NEAR AI ||| - | Primary provider |
216216
| Anthropic (Claude) || 🚧 | - | Via NEAR AI proxy; Opus 4.5, Sonnet 4, Sonnet 4.6 |
217217
| OpenAI || 🚧 | - | Via NEAR AI proxy |
218-
| AWS Bedrock ||| P3 | |
219-
| Google Gemini ||| P3 | |
220-
| NVIDIA API ||| P3 | New provider |
218+
| AWS Bedrock ||| P3 | Via `openai_compatible` adapter (e.g. LiteLLM) |
219+
| Google Gemini ||| P3 | Via `gemini` adapter |
220+
| io.net ||| P3 | Via `ionet` adapter |
221+
| Mistral ||| P3 | Via `mistral` adapter |
222+
| Yandex AI Studio ||| P3 | Via `yandex` adapter |
223+
| Cloudflare Workers AI ||| P3 | Via `cloudflare` adapter |
224+
| NVIDIA API ||| P3 | Via `nvidia` adapter and `providers.json` |
221225
| OpenRouter ||| - | Via OpenAI-compatible provider (RigAdapter) |
222226
| Tinfoil ||| - | Private inference provider (IronClaw-only) |
223227
| OpenAI-compatible ||| - | Generic OpenAI-compatible endpoint (RigAdapter) |

docs/LLM_PROVIDERS.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,12 @@ configurations.
1111
| NEAR AI | `nearai` | OAuth (browser) | Default; multi-model |
1212
| Anthropic | `anthropic` | `ANTHROPIC_API_KEY` | Claude models |
1313
| OpenAI | `openai` | `OPENAI_API_KEY` | GPT models |
14+
| Google Gemini | `gemini` | `GEMINI_API_KEY` | Gemini models |
15+
| AWS Bedrock | `bedrock` | `BEDROCK_ACCESS_KEY` | Requires OpenAI proxy (e.g. LiteLLM) |
16+
| io.net | `ionet` | `IONET_API_KEY` | Intelligence API |
17+
| Mistral | `mistral` | `MISTRAL_API_KEY` | Mistral models |
18+
| Yandex AI Studio | `yandex` | `YANDEX_API_KEY` | YandexGPT models |
19+
| Cloudflare Workers AI | `cloudflare` | `CLOUDFLARE_API_KEY` | Access to Workers AI |
1420
| Ollama | `ollama` | No | Local inference |
1521
| OpenRouter | `openai_compatible` | `LLM_API_KEY` | 300+ models |
1622
| Together AI | `openai_compatible` | `LLM_API_KEY` | Fast inference |

providers.json

Lines changed: 161 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
[
22
{
33
"id": "openai",
4-
"aliases": ["open_ai"],
4+
"aliases": [
5+
"open_ai"
6+
],
57
"protocol": "open_ai_completions",
68
"api_key_env": "OPENAI_API_KEY",
79
"api_key_required": true,
@@ -19,7 +21,9 @@
1921
},
2022
{
2123
"id": "anthropic",
22-
"aliases": ["claude"],
24+
"aliases": [
25+
"claude"
26+
],
2327
"protocol": "anthropic",
2428
"api_key_env": "ANTHROPIC_API_KEY",
2529
"api_key_required": true,
@@ -52,7 +56,10 @@
5256
},
5357
{
5458
"id": "openai_compatible",
55-
"aliases": ["openai-compatible", "compatible"],
59+
"aliases": [
60+
"openai-compatible",
61+
"compatible"
62+
],
5663
"protocol": "open_ai_completions",
5764
"base_url_env": "LLM_BASE_URL",
5865
"base_url_required": true,
@@ -89,7 +96,9 @@
8996
},
9097
{
9198
"id": "openrouter",
92-
"aliases": ["open_router"],
99+
"aliases": [
100+
"open_router"
101+
],
93102
"protocol": "open_ai_completions",
94103
"default_base_url": "https://openrouter.ai/api/v1",
95104
"api_key_env": "OPENROUTER_API_KEY",
@@ -126,7 +135,10 @@
126135
},
127136
{
128137
"id": "nvidia",
129-
"aliases": ["nvidia_nim", "nim"],
138+
"aliases": [
139+
"nvidia_nim",
140+
"nim"
141+
],
130142
"protocol": "open_ai_completions",
131143
"default_base_url": "https://integrate.api.nvidia.com/v1",
132144
"api_key_env": "NVIDIA_API_KEY",
@@ -144,7 +156,10 @@
144156
},
145157
{
146158
"id": "venice",
147-
"aliases": ["venice_ai", "veniceai"],
159+
"aliases": [
160+
"venice_ai",
161+
"veniceai"
162+
],
148163
"protocol": "open_ai_completions",
149164
"default_base_url": "https://api.venice.ai/api/v1",
150165
"api_key_env": "VENICE_API_KEY",
@@ -162,7 +177,10 @@
162177
},
163178
{
164179
"id": "together",
165-
"aliases": ["together_ai", "togetherai"],
180+
"aliases": [
181+
"together_ai",
182+
"togetherai"
183+
],
166184
"protocol": "open_ai_completions",
167185
"default_base_url": "https://api.together.xyz/v1",
168186
"api_key_env": "TOGETHER_API_KEY",
@@ -180,7 +198,9 @@
180198
},
181199
{
182200
"id": "fireworks",
183-
"aliases": ["fireworks_ai"],
201+
"aliases": [
202+
"fireworks_ai"
203+
],
184204
"protocol": "open_ai_completions",
185205
"default_base_url": "https://api.fireworks.ai/inference/v1",
186206
"api_key_env": "FIREWORKS_API_KEY",
@@ -198,7 +218,9 @@
198218
},
199219
{
200220
"id": "deepseek",
201-
"aliases": ["deep_seek"],
221+
"aliases": [
222+
"deep_seek"
223+
],
202224
"protocol": "open_ai_completions",
203225
"default_base_url": "https://api.deepseek.com/v1",
204226
"api_key_env": "DEEPSEEK_API_KEY",
@@ -234,7 +256,9 @@
234256
},
235257
{
236258
"id": "sambanova",
237-
"aliases": ["samba_nova"],
259+
"aliases": [
260+
"samba_nova"
261+
],
238262
"protocol": "open_ai_completions",
239263
"default_base_url": "https://api.sambanova.ai/v1",
240264
"api_key_env": "SAMBANOVA_API_KEY",
@@ -249,5 +273,131 @@
249273
"display_name": "SambaNova",
250274
"can_list_models": false
251275
}
276+
},
277+
{
278+
"id": "gemini",
279+
"aliases": [
280+
"google_gemini",
281+
"google"
282+
],
283+
"protocol": "open_ai_completions",
284+
"default_base_url": "https://generativelanguage.googleapis.com/v1beta/openai",
285+
"api_key_env": "GEMINI_API_KEY",
286+
"api_key_required": true,
287+
"model_env": "GEMINI_MODEL",
288+
"default_model": "gemini-2.5-flash",
289+
"description": "Google Gemini (via OpenAI-compatible endpoint)",
290+
"setup": {
291+
"kind": "api_key",
292+
"secret_name": "llm_gemini_api_key",
293+
"key_url": "https://aistudio.google.com/app/apikey",
294+
"display_name": "Google Gemini",
295+
"can_list_models": true
296+
}
297+
},
298+
{
299+
"id": "bedrock",
300+
"aliases": [
301+
"aws_bedrock",
302+
"aws"
303+
],
304+
"protocol": "open_ai_completions",
305+
"api_key_env": "BEDROCK_ACCESS_KEY",
306+
"api_key_required": false,
307+
"base_url_env": "BEDROCK_BASE_URL",
308+
"model_env": "BEDROCK_MODEL",
309+
"default_model": "anthropic.claude-3-5-sonnet-20241022-v2:0",
310+
"description": "AWS Bedrock (requires LiteLLM or OpenAI-compatible proxy)",
311+
"setup": {
312+
"kind": "open_ai_compatible",
313+
"secret_name": "llm_bedrock_api_key",
314+
"display_name": "AWS Bedrock",
315+
"can_list_models": false
316+
}
317+
},
318+
{
319+
"id": "ionet",
320+
"aliases": [
321+
"io_net",
322+
"io.net"
323+
],
324+
"protocol": "open_ai_completions",
325+
"default_base_url": "https://api.intelligence.io.solutions/api/v1",
326+
"api_key_env": "IONET_API_KEY",
327+
"api_key_required": true,
328+
"model_env": "IONET_MODEL",
329+
"default_model": "deepseek-coder-v2-instruct",
330+
"description": "io.net Intelligence API",
331+
"setup": {
332+
"kind": "api_key",
333+
"secret_name": "llm_ionet_api_key",
334+
"key_url": "https://cloud.io.net/intelligence",
335+
"display_name": "io.net",
336+
"can_list_models": true
337+
}
338+
},
339+
{
340+
"id": "mistral",
341+
"aliases": [
342+
"mistral_ai",
343+
"mistralai"
344+
],
345+
"protocol": "open_ai_completions",
346+
"default_base_url": "https://api.mistral.ai/v1",
347+
"api_key_env": "MISTRAL_API_KEY",
348+
"api_key_required": true,
349+
"model_env": "MISTRAL_MODEL",
350+
"default_model": "mistral-large-latest",
351+
"description": "Mistral AI API",
352+
"setup": {
353+
"kind": "api_key",
354+
"secret_name": "llm_mistral_api_key",
355+
"key_url": "https://console.mistral.ai/api-keys",
356+
"display_name": "Mistral",
357+
"can_list_models": true
358+
}
359+
},
360+
{
361+
"id": "yandex",
362+
"aliases": [
363+
"yandex_ai_studio",
364+
"yandexgpt",
365+
"yandex_gpt"
366+
],
367+
"protocol": "open_ai_completions",
368+
"default_base_url": "https://ai.api.cloud.yandex.net/v1",
369+
"api_key_env": "YANDEX_API_KEY",
370+
"api_key_required": true,
371+
"model_env": "YANDEX_MODEL",
372+
"extra_headers_env": "YANDEX_EXTRA_HEADERS",
373+
"default_model": "yandexgpt-lite",
374+
"description": "Yandex AI Studio (YandexGPT)",
375+
"setup": {
376+
"kind": "api_key",
377+
"secret_name": "llm_yandex_api_key",
378+
"key_url": "https://aistudio.yandex.ru/platform/folders/",
379+
"display_name": "Yandex AI Studio",
380+
"can_list_models": true
381+
}
382+
},
383+
{
384+
"id": "cloudflare",
385+
"aliases": [
386+
"cloudflare_ai",
387+
"cf_ai"
388+
],
389+
"protocol": "open_ai_completions",
390+
"api_key_env": "CLOUDFLARE_API_KEY",
391+
"api_key_required": true,
392+
"base_url_env": "CLOUDFLARE_BASE_URL",
393+
"model_env": "CLOUDFLARE_MODEL",
394+
"default_model": "@cf/meta/llama-3.3-70b-instruct-fp8-fast",
395+
"description": "Cloudflare Workers AI",
396+
"setup": {
397+
"kind": "open_ai_compatible",
398+
"secret_name": "llm_cloudflare_api_key",
399+
"display_name": "Cloudflare Workers AI",
400+
"can_list_models": false
401+
}
252402
}
253-
]
403+
]

src/llm/registry.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -450,6 +450,8 @@ mod tests {
450450
if def.protocol == ProviderProtocol::OpenAiCompletions
451451
&& def.id != "openai"
452452
&& def.id != "openai_compatible"
453+
&& def.id != "bedrock"
454+
&& def.id != "cloudflare"
453455
{
454456
assert!(
455457
def.default_base_url.is_some(),

0 commit comments

Comments
 (0)