Repository files navigation

genai, Multi-AI Providers Library for Rust

Currently natively supports: OpenAI, Anthropic, Gemini, xAI, Ollama, Groq, DeepSeek, Cohere, Together, Fireworks, Nebius, Mimo, Zai (Zhipu AI), BigModel, Kimi (Moonshot AI), Bedrock (AWS), Cerebras, OpenRouter.

Also supports a custom URL with ServiceTargetResolver (see examples/c06-target-resolver.rs).

Static BadgeStatic Badge

Provides a single, ergonomic API for many generative AI providers, such as Anthropic, OpenAI, Gemini, xAI, Ollama, Groq, and more.

NOTE: This is the Terraphim fork synced to upstream v0.6.0-beta.8, adding Kimi (Moonshot AI), AWS Bedrock, Cerebras, and OpenRouter adapters, plus SSE streaming improvements.

Docs for LLMs | CHANGELOG | BIG THANKS

v0.6.0-beta.8-fork (Terraphim)

  • What's new:
    • Upstream sync: Merged upstream v0.6.0-beta.8 breaking changes (Adapter trait, AuthData::None, StopReason, ChatMessage::tool_response, ReasoningContent).
    • New Adapter: Kimi (Moonshot AI): Full chat and streaming support via kimi:: namespace.
    • New Adapter: Bedrock (AWS): SigV4-signed requests for AWS Bedrock models.
    • New Adapter: Cerebras: Fast inference provider support.
    • New Adapter: OpenRouter: Multi-provider routing via openrouter:: namespace.
    • Zai URL fix: Resolved trailing slash issues in Zai adapter endpoint construction.
    • SSE streaming improvements: Adapter-specific SSE parsing for Kimi and Zai streaming responses.
    • Bearer token auth: Added BearerToken variant to AuthData for providers requiring it.
  • What's still awesome:
    • Normalized and ergonomic Chat API across all major providers.
    • Native protocol support for Gemini and Anthropic protocols (Reasoning/Thinking controls).
    • PDF, image, and embedding support.
    • Custom auth, endpoint, and header overrides.

See CHANGELOG

Usage examples

  • Check out AIPACK, which wraps this genai library into an agentic runtime to run, build, and share AI Agent Packs. See pro@coder for a simple example of how I use AI PACK/genai for production coding.

Note: Feel free to send me a short description and a link to your application or library that uses genai.

Key Features

Examples | Thanks | Library Focus | Changelog | Provider Mapping: ChatOptions | Usage

Examples

examples/c00-readme.rs

//! Base examples demonstrating the core capabilities of genaiuse genai::chat::printer::{print_chat_stream,PrintChatStreamOptions};use genai::chat::{ChatMessage,ChatRequest};use genai::Client;constMODEL_OPENAI:&str = "gpt-4o-mini";// o1-mini, gpt-4o-miniconstMODEL_ANTHROPIC:&str = "claude-3-haiku-20240307";// or namespaced with simple name "fireworks::qwen3-30b-a3b", or "fireworks::accounts/fireworks/models/qwen3-30b-a3b"constMODEL_FIREWORKS:&str = "accounts/fireworks/models/qwen3-30b-a3b";constMODEL_TOGETHER:&str = "together::openai/gpt-oss-20b";constMODEL_GEMINI:&str = "gemini-2.0-flash";constMODEL_GROQ:&str = "llama-3.1-8b-instant";constMODEL_OLLAMA:&str = "gemma:2b";// sh: `ollama pull gemma:2b`constMODEL_XAI:&str = "grok-3-mini";constMODEL_DEEPSEEK:&str = "deepseek-chat";constMODEL_ZAI:&str = "glm-4-plus";constMODEL_COHERE:&str = "command-r7b-12-2024";// NOTE: These are the default environment keys for each AI Adapter Type.// They can be customized; see `examples/c02-auth.rs`constMODEL_AND_KEY_ENV_NAME_LIST:&[(&str,&str)] = &[// -- De/activate models/providers(MODEL_OPENAI,"OPENAI_API_KEY"),(MODEL_ANTHROPIC,"ANTHROPIC_API_KEY"),(MODEL_GEMINI,"GEMINI_API_KEY"),(MODEL_FIREWORKS,"FIREWORKS_API_KEY"),(MODEL_TOGETHER,"TOGETHER_API_KEY"),(MODEL_GROQ,"GROQ_API_KEY"),(MODEL_XAI,"XAI_API_KEY"),(MODEL_DEEPSEEK,"DEEPSEEK_API_KEY"),(MODEL_OLLAMA,""),(MODEL_ZAI,"ZAI_API_KEY"),(MODEL_COHERE,"COHERE_API_KEY"),];// NOTE: Model to AdapterKind (AI Provider) type mapping rule// - starts_with "gpt" -> OpenAI// - starts_with "claude" -> Anthropic// - starts_with "command" -> Cohere// - starts_with "gemini" -> Gemini// - model in Groq models -> Groq// - starts_with "glm" -> ZAI// - For anything else -> Ollama//// This can be customized; see `examples/c03-mapper.rs`#[tokio::main]asyncfnmain() -> Result<(),Box<dyn std::error::Error>>{let question = "Why is the sky red?";let chat_req = ChatRequest::new(vec![// -- Messages (de/activate to see the differences)ChatMessage::system("Answer in one sentence"),ChatMessage::user(question),]);let client = Client::default();let print_options = PrintChatStreamOptions::from_print_events(false);for(model, env_name)inMODEL_AND_KEY_ENV_NAME_LIST{// Skip if the environment name is not setif !env_name.is_empty() && std::env::var(env_name).is_err(){println!("===== Skipping model: {model} (env var not set: {env_name})");continue;}let adapter_kind = client.resolve_service_target(model).await?.model.adapter_kind;println!("\n===== MODEL: {model} ({adapter_kind}) =====");println!("\n--- Question:\n{question}");println!("\n--- Answer:");let chat_res = client.exec_chat(model, chat_req.clone(),None).await?;println!("{}", chat_res.first_text().unwrap_or("NO ANSWER"));println!("\n--- Answer: (streaming)");let chat_res = client.exec_chat_stream(model, chat_req.clone(),None).await?;print_chat_stream(chat_res,Some(&print_options)).await?;println!();}Ok(())}

More Examples


Static Badge

Library Focus:

  • Focuses on standardizing chat completion APIs across major AI services.

  • Native implementation, meaning no per-service SDKs.

    • Reason: While there are some variations across the various APIs, they all follow the same pattern and high-level flow and constructs. Managing the differences at a lower layer is actually simpler and more cumulative across services than doing SDK gymnastics.
  • Prioritizes ergonomics and commonality, with depth being secondary. (If you require a complete client API, consider using async-openai and ollama-rs; they are both excellent and easy to use.)

  • Initially, this library will mostly focus on text chat APIs, with images and function calling coming later.

ChatOptions

  • (1) - OpenAI-compatible notes
    • Models: OpenAI, DeepSeek, Groq, Ollama, xAI, Mimo, Together, Fireworks, Nebius, Zai, Together, Fireworks, Nebius, Zai
PropertyOpenAI Compatibles (*1)AnthropicGemini generationConfig.Cohere
temperaturetemperaturetemperaturetemperaturetemperature
max_tokensmax_tokensmax_tokens (default 1024)maxOutputTokensmax_tokens
top_ptop_ptop_ptopPp

Usage

PropertyOpenAI Compatibles (1)Anthropic usage.Gemini usageMetadata.Cohere meta.tokens.
prompt_tokensprompt_tokensinput_tokens (added)promptTokenCount (2)input_tokens
completion_tokenscompletion_tokensoutput_tokens (added)candidatesTokenCount (2)output_tokens
total_tokenstotal_tokens(computed)totalTokenCount (2)(computed)
prompt_tokens_detailsprompt_tokens_detailscached/cache_creationN/A for nowN/A for now
completion_tokens_detailscompletion_tokens_detailsN/A for nowN/A for nowN/A for now
  • (1) - OpenAI-compatible notes

  • (2): Gemini tokens

    • Right now, with the Gemini Stream API, it's not clear whether usage for each event is cumulative or must be summed. It appears to be cumulative, meaning the last message shows the total number of input, output, and total tokens, so that is the current assumption. See possible tweet answer for more info.

Notes on Possible Direction

  • Will add more data to ChatResponse and ChatStream, especially usage metadata.
  • Add vision/image support to chat messages and responses.
  • Add function calling support to chat messages and responses.
  • Add embed and embed_batch.
  • Add the AWS Bedrock variants (e.g., Mistral and Anthropic). Most of the work will be on the "interesting" token signature scheme. To avoid bringing in large SDKs, this might be a lower-priority feature.
  • Add the Google Vertex AI variants.
  • May add the Azure OpenAI variant (not sure yet).

Links

About

Rust multiprovider generative AI client (Ollama, OpenAi, Anthropic, Gemini, DeepSeek, xAI/Grok, Groq,Cohere, ...)

Resources

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

genai, Multi-AI Providers Library for Rust

Currently natively supports: OpenAI, Anthropic, Gemini, xAI, Ollama, Groq, DeepSeek, Cohere, Together, Fireworks, Nebius, Mimo, Zai (Zhipu AI), BigModel, Kimi (Moonshot AI), Bedrock (AWS), Cerebras, OpenRouter.

Also supports a custom URL with ServiceTargetResolver (see examples/c06-target-resolver.rs).

Static BadgeStatic Badge

Provides a single, ergonomic API for many generative AI providers, such as Anthropic, OpenAI, Gemini, xAI, Ollama, Groq, and more.

NOTE: This is the Terraphim fork synced to upstream v0.6.0-beta.8, adding Kimi (Moonshot AI), AWS Bedrock, Cerebras, and OpenRouter adapters, plus SSE streaming improvements.

Docs for LLMs | CHANGELOG | BIG THANKS

v0.6.0-beta.8-fork (Terraphim)

  • What's new:
    • Upstream sync: Merged upstream v0.6.0-beta.8 breaking changes (Adapter trait, AuthData::None, StopReason, ChatMessage::tool_response, ReasoningContent).
    • New Adapter: Kimi (Moonshot AI): Full chat and streaming support via kimi:: namespace.
    • New Adapter: Bedrock (AWS): SigV4-signed requests for AWS Bedrock models.
    • New Adapter: Cerebras: Fast inference provider support.
    • New Adapter: OpenRouter: Multi-provider routing via openrouter:: namespace.
    • Zai URL fix: Resolved trailing slash issues in Zai adapter endpoint construction.
    • SSE streaming improvements: Adapter-specific SSE parsing for Kimi and Zai streaming responses.
    • Bearer token auth: Added BearerToken variant to AuthData for providers requiring it.
  • What's still awesome:
    • Normalized and ergonomic Chat API across all major providers.
    • Native protocol support for Gemini and Anthropic protocols (Reasoning/Thinking controls).
    • PDF, image, and embedding support.
    • Custom auth, endpoint, and header overrides.

See CHANGELOG

Usage examples

  • Check out AIPACK, which wraps this genai library into an agentic runtime to run, build, and share AI Agent Packs. See pro@coder for a simple example of how I use AI PACK/genai for production coding.

Note: Feel free to send me a short description and a link to your application or library that uses genai.

Key Features

Examples | Thanks | Library Focus | Changelog | Provider Mapping: ChatOptions | Usage

Examples

examples/c00-readme.rs

//! Base examples demonstrating the core capabilities of genaiuse genai::chat::printer::{print_chat_stream,PrintChatStreamOptions};use genai::chat::{ChatMessage,ChatRequest};use genai::Client;constMODEL_OPENAI:&str = "gpt-4o-mini";// o1-mini, gpt-4o-miniconstMODEL_ANTHROPIC:&str = "claude-3-haiku-20240307";// or namespaced with simple name "fireworks::qwen3-30b-a3b", or "fireworks::accounts/fireworks/models/qwen3-30b-a3b"constMODEL_FIREWORKS:&str = "accounts/fireworks/models/qwen3-30b-a3b";constMODEL_TOGETHER:&str = "together::openai/gpt-oss-20b";constMODEL_GEMINI:&str = "gemini-2.0-flash";constMODEL_GROQ:&str = "llama-3.1-8b-instant";constMODEL_OLLAMA:&str = "gemma:2b";// sh: `ollama pull gemma:2b`constMODEL_XAI:&str = "grok-3-mini";constMODEL_DEEPSEEK:&str = "deepseek-chat";constMODEL_ZAI:&str = "glm-4-plus";constMODEL_COHERE:&str = "command-r7b-12-2024";// NOTE: These are the default environment keys for each AI Adapter Type.// They can be customized; see `examples/c02-auth.rs`constMODEL_AND_KEY_ENV_NAME_LIST:&[(&str,&str)] = &[// -- De/activate models/providers(MODEL_OPENAI,"OPENAI_API_KEY"),(MODEL_ANTHROPIC,"ANTHROPIC_API_KEY"),(MODEL_GEMINI,"GEMINI_API_KEY"),(MODEL_FIREWORKS,"FIREWORKS_API_KEY"),(MODEL_TOGETHER,"TOGETHER_API_KEY"),(MODEL_GROQ,"GROQ_API_KEY"),(MODEL_XAI,"XAI_API_KEY"),(MODEL_DEEPSEEK,"DEEPSEEK_API_KEY"),(MODEL_OLLAMA,""),(MODEL_ZAI,"ZAI_API_KEY"),(MODEL_COHERE,"COHERE_API_KEY"),];// NOTE: Model to AdapterKind (AI Provider) type mapping rule// - starts_with "gpt" -> OpenAI// - starts_with "claude" -> Anthropic// - starts_with "command" -> Cohere// - starts_with "gemini" -> Gemini// - model in Groq models -> Groq// - starts_with "glm" -> ZAI// - For anything else -> Ollama//// This can be customized; see `examples/c03-mapper.rs`#[tokio::main]asyncfnmain() -> Result<(),Box<dyn std::error::Error>>{let question = "Why is the sky red?";let chat_req = ChatRequest::new(vec![// -- Messages (de/activate to see the differences)ChatMessage::system("Answer in one sentence"),ChatMessage::user(question),]);let client = Client::default();let print_options = PrintChatStreamOptions::from_print_events(false);for(model, env_name)inMODEL_AND_KEY_ENV_NAME_LIST{// Skip if the environment name is not setif !env_name.is_empty() && std::env::var(env_name).is_err(){println!("===== Skipping model: {model} (env var not set: {env_name})");continue;}let adapter_kind = client.resolve_service_target(model).await?.model.adapter_kind;println!("\n===== MODEL: {model} ({adapter_kind}) =====");println!("\n--- Question:\n{question}");println!("\n--- Answer:");let chat_res = client.exec_chat(model, chat_req.clone(),None).await?;println!("{}", chat_res.first_text().unwrap_or("NO ANSWER"));println!("\n--- Answer: (streaming)");let chat_res = client.exec_chat_stream(model, chat_req.clone(),None).await?;print_chat_stream(chat_res,Some(&print_options)).await?;println!();}Ok(())}

More Examples


Static Badge

Library Focus:

  • Focuses on standardizing chat completion APIs across major AI services.

  • Native implementation, meaning no per-service SDKs.

    • Reason: While there are some variations across the various APIs, they all follow the same pattern and high-level flow and constructs. Managing the differences at a lower layer is actually simpler and more cumulative across services than doing SDK gymnastics.
  • Prioritizes ergonomics and commonality, with depth being secondary. (If you require a complete client API, consider using async-openai and ollama-rs; they are both excellent and easy to use.)

  • Initially, this library will mostly focus on text chat APIs, with images and function calling coming later.

ChatOptions

  • (1) - OpenAI-compatible notes
    • Models: OpenAI, DeepSeek, Groq, Ollama, xAI, Mimo, Together, Fireworks, Nebius, Zai, Together, Fireworks, Nebius, Zai
PropertyOpenAI Compatibles (*1)AnthropicGemini generationConfig.Cohere
temperaturetemperaturetemperaturetemperaturetemperature
max_tokensmax_tokensmax_tokens (default 1024)maxOutputTokensmax_tokens
top_ptop_ptop_ptopPp

Usage

PropertyOpenAI Compatibles (1)Anthropic usage.Gemini usageMetadata.Cohere meta.tokens.
prompt_tokensprompt_tokensinput_tokens (added)promptTokenCount (2)input_tokens
completion_tokenscompletion_tokensoutput_tokens (added)candidatesTokenCount (2)output_tokens
total_tokenstotal_tokens(computed)totalTokenCount (2)(computed)
prompt_tokens_detailsprompt_tokens_detailscached/cache_creationN/A for nowN/A for now
completion_tokens_detailscompletion_tokens_detailsN/A for nowN/A for nowN/A for now
  • (1) - OpenAI-compatible notes

  • (2): Gemini tokens

    • Right now, with the Gemini Stream API, it's not clear whether usage for each event is cumulative or must be summed. It appears to be cumulative, meaning the last message shows the total number of input, output, and total tokens, so that is the current assumption. See possible tweet answer for more info.

Notes on Possible Direction

  • Will add more data to ChatResponse and ChatStream, especially usage metadata.
  • Add vision/image support to chat messages and responses.
  • Add function calling support to chat messages and responses.
  • Add embed and embed_batch.
  • Add the AWS Bedrock variants (e.g., Mistral and Anthropic). Most of the work will be on the "interesting" token signature scheme. To avoid bringing in large SDKs, this might be a lower-priority feature.
  • Add the Google Vertex AI variants.
  • May add the Azure OpenAI variant (not sure yet).

Links

About

Rust multiprovider generative AI client (Ollama, OpenAi, Anthropic, Gemini, DeepSeek, xAI/Grok, Groq,Cohere, ...)

Resources

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

genai, Multi-AI Providers Library for Rust

Currently natively supports: OpenAI, Anthropic, Gemini, xAI, Ollama, Groq, DeepSeek, Cohere, Together, Fireworks, Nebius, Mimo, Zai (Zhipu AI), BigModel, Kimi (Moonshot AI), Bedrock (AWS), Cerebras, OpenRouter.

Also supports a custom URL with ServiceTargetResolver (see examples/c06-target-resolver.rs).

Static BadgeStatic Badge

Provides a single, ergonomic API for many generative AI providers, such as Anthropic, OpenAI, Gemini, xAI, Ollama, Groq, and more.

NOTE: This is the Terraphim fork synced to upstream v0.6.0-beta.8, adding Kimi (Moonshot AI), AWS Bedrock, Cerebras, and OpenRouter adapters, plus SSE streaming improvements.

Docs for LLMs | CHANGELOG | BIG THANKS

v0.6.0-beta.8-fork (Terraphim)

  • What's new:
    • Upstream sync: Merged upstream v0.6.0-beta.8 breaking changes (Adapter trait, AuthData::None, StopReason, ChatMessage::tool_response, ReasoningContent).
    • New Adapter: Kimi (Moonshot AI): Full chat and streaming support via kimi:: namespace.
    • New Adapter: Bedrock (AWS): SigV4-signed requests for AWS Bedrock models.
    • New Adapter: Cerebras: Fast inference provider support.
    • New Adapter: OpenRouter: Multi-provider routing via openrouter:: namespace.
    • Zai URL fix: Resolved trailing slash issues in Zai adapter endpoint construction.
    • SSE streaming improvements: Adapter-specific SSE parsing for Kimi and Zai streaming responses.
    • Bearer token auth: Added BearerToken variant to AuthData for providers requiring it.
  • What's still awesome:
    • Normalized and ergonomic Chat API across all major providers.
    • Native protocol support for Gemini and Anthropic protocols (Reasoning/Thinking controls).
    • PDF, image, and embedding support.
    • Custom auth, endpoint, and header overrides.

See CHANGELOG

Usage examples

  • Check out AIPACK, which wraps this genai library into an agentic runtime to run, build, and share AI Agent Packs. See pro@coder for a simple example of how I use AI PACK/genai for production coding.

Note: Feel free to send me a short description and a link to your application or library that uses genai.

Key Features

Examples | Thanks | Library Focus | Changelog | Provider Mapping: ChatOptions | Usage

Examples

examples/c00-readme.rs

//! Base examples demonstrating the core capabilities of genaiuse genai::chat::printer::{print_chat_stream,PrintChatStreamOptions};use genai::chat::{ChatMessage,ChatRequest};use genai::Client;constMODEL_OPENAI:&str = "gpt-4o-mini";// o1-mini, gpt-4o-miniconstMODEL_ANTHROPIC:&str = "claude-3-haiku-20240307";// or namespaced with simple name "fireworks::qwen3-30b-a3b", or "fireworks::accounts/fireworks/models/qwen3-30b-a3b"constMODEL_FIREWORKS:&str = "accounts/fireworks/models/qwen3-30b-a3b";constMODEL_TOGETHER:&str = "together::openai/gpt-oss-20b";constMODEL_GEMINI:&str = "gemini-2.0-flash";constMODEL_GROQ:&str = "llama-3.1-8b-instant";constMODEL_OLLAMA:&str = "gemma:2b";// sh: `ollama pull gemma:2b`constMODEL_XAI:&str = "grok-3-mini";constMODEL_DEEPSEEK:&str = "deepseek-chat";constMODEL_ZAI:&str = "glm-4-plus";constMODEL_COHERE:&str = "command-r7b-12-2024";// NOTE: These are the default environment keys for each AI Adapter Type.// They can be customized; see `examples/c02-auth.rs`constMODEL_AND_KEY_ENV_NAME_LIST:&[(&str,&str)] = &[// -- De/activate models/providers(MODEL_OPENAI,"OPENAI_API_KEY"),(MODEL_ANTHROPIC,"ANTHROPIC_API_KEY"),(MODEL_GEMINI,"GEMINI_API_KEY"),(MODEL_FIREWORKS,"FIREWORKS_API_KEY"),(MODEL_TOGETHER,"TOGETHER_API_KEY"),(MODEL_GROQ,"GROQ_API_KEY"),(MODEL_XAI,"XAI_API_KEY"),(MODEL_DEEPSEEK,"DEEPSEEK_API_KEY"),(MODEL_OLLAMA,""),(MODEL_ZAI,"ZAI_API_KEY"),(MODEL_COHERE,"COHERE_API_KEY"),];// NOTE: Model to AdapterKind (AI Provider) type mapping rule// - starts_with "gpt" -> OpenAI// - starts_with "claude" -> Anthropic// - starts_with "command" -> Cohere// - starts_with "gemini" -> Gemini// - model in Groq models -> Groq// - starts_with "glm" -> ZAI// - For anything else -> Ollama//// This can be customized; see `examples/c03-mapper.rs`#[tokio::main]asyncfnmain() -> Result<(),Box<dyn std::error::Error>>{let question = "Why is the sky red?";let chat_req = ChatRequest::new(vec![// -- Messages (de/activate to see the differences)ChatMessage::system("Answer in one sentence"),ChatMessage::user(question),]);let client = Client::default();let print_options = PrintChatStreamOptions::from_print_events(false);for(model, env_name)inMODEL_AND_KEY_ENV_NAME_LIST{// Skip if the environment name is not setif !env_name.is_empty() && std::env::var(env_name).is_err(){println!("===== Skipping model: {model} (env var not set: {env_name})");continue;}let adapter_kind = client.resolve_service_target(model).await?.model.adapter_kind;println!("\n===== MODEL: {model} ({adapter_kind}) =====");println!("\n--- Question:\n{question}");println!("\n--- Answer:");let chat_res = client.exec_chat(model, chat_req.clone(),None).await?;println!("{}", chat_res.first_text().unwrap_or("NO ANSWER"));println!("\n--- Answer: (streaming)");let chat_res = client.exec_chat_stream(model, chat_req.clone(),None).await?;print_chat_stream(chat_res,Some(&print_options)).await?;println!();}Ok(())}

More Examples


Static Badge

Library Focus:

  • Focuses on standardizing chat completion APIs across major AI services.

  • Native implementation, meaning no per-service SDKs.

    • Reason: While there are some variations across the various APIs, they all follow the same pattern and high-level flow and constructs. Managing the differences at a lower layer is actually simpler and more cumulative across services than doing SDK gymnastics.
  • Prioritizes ergonomics and commonality, with depth being secondary. (If you require a complete client API, consider using async-openai and ollama-rs; they are both excellent and easy to use.)

  • Initially, this library will mostly focus on text chat APIs, with images and function calling coming later.

ChatOptions

  • (1) - OpenAI-compatible notes
    • Models: OpenAI, DeepSeek, Groq, Ollama, xAI, Mimo, Together, Fireworks, Nebius, Zai, Together, Fireworks, Nebius, Zai
PropertyOpenAI Compatibles (*1)AnthropicGemini generationConfig.Cohere
temperaturetemperaturetemperaturetemperaturetemperature
max_tokensmax_tokensmax_tokens (default 1024)maxOutputTokensmax_tokens
top_ptop_ptop_ptopPp

Usage

PropertyOpenAI Compatibles (1)Anthropic usage.Gemini usageMetadata.Cohere meta.tokens.
prompt_tokensprompt_tokensinput_tokens (added)promptTokenCount (2)input_tokens
completion_tokenscompletion_tokensoutput_tokens (added)candidatesTokenCount (2)output_tokens
total_tokenstotal_tokens(computed)totalTokenCount (2)(computed)
prompt_tokens_detailsprompt_tokens_detailscached/cache_creationN/A for nowN/A for now
completion_tokens_detailscompletion_tokens_detailsN/A for nowN/A for nowN/A for now
  • (1) - OpenAI-compatible notes

  • (2): Gemini tokens

    • Right now, with the Gemini Stream API, it's not clear whether usage for each event is cumulative or must be summed. It appears to be cumulative, meaning the last message shows the total number of input, output, and total tokens, so that is the current assumption. See possible tweet answer for more info.

Notes on Possible Direction

  • Will add more data to ChatResponse and ChatStream, especially usage metadata.
  • Add vision/image support to chat messages and responses.
  • Add function calling support to chat messages and responses.
  • Add embed and embed_batch.
  • Add the AWS Bedrock variants (e.g., Mistral and Anthropic). Most of the work will be on the "interesting" token signature scheme. To avoid bringing in large SDKs, this might be a lower-priority feature.
  • Add the Google Vertex AI variants.
  • May add the Azure OpenAI variant (not sure yet).

Links

About

Rust multiprovider generative AI client (Ollama, OpenAi, Anthropic, Gemini, DeepSeek, xAI/Grok, Groq,Cohere, ...)

Resources

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

genai, Multi-AI Providers Library for Rust

Currently natively supports: OpenAI, Anthropic, Gemini, xAI, Ollama, Groq, DeepSeek, Cohere, Together, Fireworks, Nebius, Mimo, Zai (Zhipu AI), BigModel, Kimi (Moonshot AI), Bedrock (AWS), Cerebras, OpenRouter.

Also supports a custom URL with ServiceTargetResolver (see examples/c06-target-resolver.rs).

Static BadgeStatic Badge

Provides a single, ergonomic API for many generative AI providers, such as Anthropic, OpenAI, Gemini, xAI, Ollama, Groq, and more.

NOTE: This is the Terraphim fork synced to upstream v0.6.0-beta.8, adding Kimi (Moonshot AI), AWS Bedrock, Cerebras, and OpenRouter adapters, plus SSE streaming improvements.

Docs for LLMs | CHANGELOG | BIG THANKS

v0.6.0-beta.8-fork (Terraphim)

  • What's new:
    • Upstream sync: Merged upstream v0.6.0-beta.8 breaking changes (Adapter trait, AuthData::None, StopReason, ChatMessage::tool_response, ReasoningContent).
    • New Adapter: Kimi (Moonshot AI): Full chat and streaming support via kimi:: namespace.
    • New Adapter: Bedrock (AWS): SigV4-signed requests for AWS Bedrock models.
    • New Adapter: Cerebras: Fast inference provider support.
    • New Adapter: OpenRouter: Multi-provider routing via openrouter:: namespace.
    • Zai URL fix: Resolved trailing slash issues in Zai adapter endpoint construction.
    • SSE streaming improvements: Adapter-specific SSE parsing for Kimi and Zai streaming responses.
    • Bearer token auth: Added BearerToken variant to AuthData for providers requiring it.
  • What's still awesome:
    • Normalized and ergonomic Chat API across all major providers.
    • Native protocol support for Gemini and Anthropic protocols (Reasoning/Thinking controls).
    • PDF, image, and embedding support.
    • Custom auth, endpoint, and header overrides.

See CHANGELOG

Usage examples

  • Check out AIPACK, which wraps this genai library into an agentic runtime to run, build, and share AI Agent Packs. See pro@coder for a simple example of how I use AI PACK/genai for production coding.

Note: Feel free to send me a short description and a link to your application or library that uses genai.

Key Features

Examples | Thanks | Library Focus | Changelog | Provider Mapping: ChatOptions | Usage

Examples

examples/c00-readme.rs

//! Base examples demonstrating the core capabilities of genaiuse genai::chat::printer::{print_chat_stream,PrintChatStreamOptions};use genai::chat::{ChatMessage,ChatRequest};use genai::Client;constMODEL_OPENAI:&str = "gpt-4o-mini";// o1-mini, gpt-4o-miniconstMODEL_ANTHROPIC:&str = "claude-3-haiku-20240307";// or namespaced with simple name "fireworks::qwen3-30b-a3b", or "fireworks::accounts/fireworks/models/qwen3-30b-a3b"constMODEL_FIREWORKS:&str = "accounts/fireworks/models/qwen3-30b-a3b";constMODEL_TOGETHER:&str = "together::openai/gpt-oss-20b";constMODEL_GEMINI:&str = "gemini-2.0-flash";constMODEL_GROQ:&str = "llama-3.1-8b-instant";constMODEL_OLLAMA:&str = "gemma:2b";// sh: `ollama pull gemma:2b`constMODEL_XAI:&str = "grok-3-mini";constMODEL_DEEPSEEK:&str = "deepseek-chat";constMODEL_ZAI:&str = "glm-4-plus";constMODEL_COHERE:&str = "command-r7b-12-2024";// NOTE: These are the default environment keys for each AI Adapter Type.// They can be customized; see `examples/c02-auth.rs`constMODEL_AND_KEY_ENV_NAME_LIST:&[(&str,&str)] = &[// -- De/activate models/providers(MODEL_OPENAI,"OPENAI_API_KEY"),(MODEL_ANTHROPIC,"ANTHROPIC_API_KEY"),(MODEL_GEMINI,"GEMINI_API_KEY"),(MODEL_FIREWORKS,"FIREWORKS_API_KEY"),(MODEL_TOGETHER,"TOGETHER_API_KEY"),(MODEL_GROQ,"GROQ_API_KEY"),(MODEL_XAI,"XAI_API_KEY"),(MODEL_DEEPSEEK,"DEEPSEEK_API_KEY"),(MODEL_OLLAMA,""),(MODEL_ZAI,"ZAI_API_KEY"),(MODEL_COHERE,"COHERE_API_KEY"),];// NOTE: Model to AdapterKind (AI Provider) type mapping rule// - starts_with "gpt" -> OpenAI// - starts_with "claude" -> Anthropic// - starts_with "command" -> Cohere// - starts_with "gemini" -> Gemini// - model in Groq models -> Groq// - starts_with "glm" -> ZAI// - For anything else -> Ollama//// This can be customized; see `examples/c03-mapper.rs`#[tokio::main]asyncfnmain() -> Result<(),Box<dyn std::error::Error>>{let question = "Why is the sky red?";let chat_req = ChatRequest::new(vec![// -- Messages (de/activate to see the differences)ChatMessage::system("Answer in one sentence"),ChatMessage::user(question),]);let client = Client::default();let print_options = PrintChatStreamOptions::from_print_events(false);for(model, env_name)inMODEL_AND_KEY_ENV_NAME_LIST{// Skip if the environment name is not setif !env_name.is_empty() && std::env::var(env_name).is_err(){println!("===== Skipping model: {model} (env var not set: {env_name})");continue;}let adapter_kind = client.resolve_service_target(model).await?.model.adapter_kind;println!("\n===== MODEL: {model} ({adapter_kind}) =====");println!("\n--- Question:\n{question}");println!("\n--- Answer:");let chat_res = client.exec_chat(model, chat_req.clone(),None).await?;println!("{}", chat_res.first_text().unwrap_or("NO ANSWER"));println!("\n--- Answer: (streaming)");let chat_res = client.exec_chat_stream(model, chat_req.clone(),None).await?;print_chat_stream(chat_res,Some(&print_options)).await?;println!();}Ok(())}

More Examples


Static Badge

Library Focus:

  • Focuses on standardizing chat completion APIs across major AI services.

  • Native implementation, meaning no per-service SDKs.

    • Reason: While there are some variations across the various APIs, they all follow the same pattern and high-level flow and constructs. Managing the differences at a lower layer is actually simpler and more cumulative across services than doing SDK gymnastics.
  • Prioritizes ergonomics and commonality, with depth being secondary. (If you require a complete client API, consider using async-openai and ollama-rs; they are both excellent and easy to use.)

  • Initially, this library will mostly focus on text chat APIs, with images and function calling coming later.

ChatOptions

  • (1) - OpenAI-compatible notes
    • Models: OpenAI, DeepSeek, Groq, Ollama, xAI, Mimo, Together, Fireworks, Nebius, Zai, Together, Fireworks, Nebius, Zai
PropertyOpenAI Compatibles (*1)AnthropicGemini generationConfig.Cohere
temperaturetemperaturetemperaturetemperaturetemperature
max_tokensmax_tokensmax_tokens (default 1024)maxOutputTokensmax_tokens
top_ptop_ptop_ptopPp

Usage

PropertyOpenAI Compatibles (1)Anthropic usage.Gemini usageMetadata.Cohere meta.tokens.
prompt_tokensprompt_tokensinput_tokens (added)promptTokenCount (2)input_tokens
completion_tokenscompletion_tokensoutput_tokens (added)candidatesTokenCount (2)output_tokens
total_tokenstotal_tokens(computed)totalTokenCount (2)(computed)
prompt_tokens_detailsprompt_tokens_detailscached/cache_creationN/A for nowN/A for now
completion_tokens_detailscompletion_tokens_detailsN/A for nowN/A for nowN/A for now
  • (1) - OpenAI-compatible notes

  • (2): Gemini tokens

    • Right now, with the Gemini Stream API, it's not clear whether usage for each event is cumulative or must be summed. It appears to be cumulative, meaning the last message shows the total number of input, output, and total tokens, so that is the current assumption. See possible tweet answer for more info.

Notes on Possible Direction

  • Will add more data to ChatResponse and ChatStream, especially usage metadata.
  • Add vision/image support to chat messages and responses.
  • Add function calling support to chat messages and responses.
  • Add embed and embed_batch.
  • Add the AWS Bedrock variants (e.g., Mistral and Anthropic). Most of the work will be on the "interesting" token signature scheme. To avoid bringing in large SDKs, this might be a lower-priority feature.
  • Add the Google Vertex AI variants.
  • May add the Azure OpenAI variant (not sure yet).

Links

About

Rust multiprovider generative AI client (Ollama, OpenAi, Anthropic, Gemini, DeepSeek, xAI/Grok, Groq,Cohere, ...)

Resources

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

genai, Multi-AI Providers Library for Rust

Currently natively supports: OpenAI, Anthropic, Gemini, xAI, Ollama, Groq, DeepSeek, Cohere, Together, Fireworks, Nebius, Mimo, Zai (Zhipu AI), BigModel, Kimi (Moonshot AI), Bedrock (AWS), Cerebras, OpenRouter.

Also supports a custom URL with ServiceTargetResolver (see examples/c06-target-resolver.rs).

Static BadgeStatic Badge

Provides a single, ergonomic API for many generative AI providers, such as Anthropic, OpenAI, Gemini, xAI, Ollama, Groq, and more.

NOTE: This is the Terraphim fork synced to upstream v0.6.0-beta.8, adding Kimi (Moonshot AI), AWS Bedrock, Cerebras, and OpenRouter adapters, plus SSE streaming improvements.

Docs for LLMs | CHANGELOG | BIG THANKS

v0.6.0-beta.8-fork (Terraphim)

  • What's new:
    • Upstream sync: Merged upstream v0.6.0-beta.8 breaking changes (Adapter trait, AuthData::None, StopReason, ChatMessage::tool_response, ReasoningContent).
    • New Adapter: Kimi (Moonshot AI): Full chat and streaming support via kimi:: namespace.
    • New Adapter: Bedrock (AWS): SigV4-signed requests for AWS Bedrock models.
    • New Adapter: Cerebras: Fast inference provider support.
    • New Adapter: OpenRouter: Multi-provider routing via openrouter:: namespace.
    • Zai URL fix: Resolved trailing slash issues in Zai adapter endpoint construction.
    • SSE streaming improvements: Adapter-specific SSE parsing for Kimi and Zai streaming responses.
    • Bearer token auth: Added BearerToken variant to AuthData for providers requiring it.
  • What's still awesome:
    • Normalized and ergonomic Chat API across all major providers.
    • Native protocol support for Gemini and Anthropic protocols (Reasoning/Thinking controls).
    • PDF, image, and embedding support.
    • Custom auth, endpoint, and header overrides.

See CHANGELOG

Usage examples

  • Check out AIPACK, which wraps this genai library into an agentic runtime to run, build, and share AI Agent Packs. See pro@coder for a simple example of how I use AI PACK/genai for production coding.

Note: Feel free to send me a short description and a link to your application or library that uses genai.

Key Features

Examples | Thanks | Library Focus | Changelog | Provider Mapping: ChatOptions | Usage

Examples

examples/c00-readme.rs

//! Base examples demonstrating the core capabilities of genaiuse genai::chat::printer::{print_chat_stream,PrintChatStreamOptions};use genai::chat::{ChatMessage,ChatRequest};use genai::Client;constMODEL_OPENAI:&str = "gpt-4o-mini";// o1-mini, gpt-4o-miniconstMODEL_ANTHROPIC:&str = "claude-3-haiku-20240307";// or namespaced with simple name "fireworks::qwen3-30b-a3b", or "fireworks::accounts/fireworks/models/qwen3-30b-a3b"constMODEL_FIREWORKS:&str = "accounts/fireworks/models/qwen3-30b-a3b";constMODEL_TOGETHER:&str = "together::openai/gpt-oss-20b";constMODEL_GEMINI:&str = "gemini-2.0-flash";constMODEL_GROQ:&str = "llama-3.1-8b-instant";constMODEL_OLLAMA:&str = "gemma:2b";// sh: `ollama pull gemma:2b`constMODEL_XAI:&str = "grok-3-mini";constMODEL_DEEPSEEK:&str = "deepseek-chat";constMODEL_ZAI:&str = "glm-4-plus";constMODEL_COHERE:&str = "command-r7b-12-2024";// NOTE: These are the default environment keys for each AI Adapter Type.// They can be customized; see `examples/c02-auth.rs`constMODEL_AND_KEY_ENV_NAME_LIST:&[(&str,&str)] = &[// -- De/activate models/providers(MODEL_OPENAI,"OPENAI_API_KEY"),(MODEL_ANTHROPIC,"ANTHROPIC_API_KEY"),(MODEL_GEMINI,"GEMINI_API_KEY"),(MODEL_FIREWORKS,"FIREWORKS_API_KEY"),(MODEL_TOGETHER,"TOGETHER_API_KEY"),(MODEL_GROQ,"GROQ_API_KEY"),(MODEL_XAI,"XAI_API_KEY"),(MODEL_DEEPSEEK,"DEEPSEEK_API_KEY"),(MODEL_OLLAMA,""),(MODEL_ZAI,"ZAI_API_KEY"),(MODEL_COHERE,"COHERE_API_KEY"),];// NOTE: Model to AdapterKind (AI Provider) type mapping rule// - starts_with "gpt" -> OpenAI// - starts_with "claude" -> Anthropic// - starts_with "command" -> Cohere// - starts_with "gemini" -> Gemini// - model in Groq models -> Groq// - starts_with "glm" -> ZAI// - For anything else -> Ollama//// This can be customized; see `examples/c03-mapper.rs`#[tokio::main]asyncfnmain() -> Result<(),Box<dyn std::error::Error>>{let question = "Why is the sky red?";let chat_req = ChatRequest::new(vec![// -- Messages (de/activate to see the differences)ChatMessage::system("Answer in one sentence"),ChatMessage::user(question),]);let client = Client::default();let print_options = PrintChatStreamOptions::from_print_events(false);for(model, env_name)inMODEL_AND_KEY_ENV_NAME_LIST{// Skip if the environment name is not setif !env_name.is_empty() && std::env::var(env_name).is_err(){println!("===== Skipping model: {model} (env var not set: {env_name})");continue;}let adapter_kind = client.resolve_service_target(model).await?.model.adapter_kind;println!("\n===== MODEL: {model} ({adapter_kind}) =====");println!("\n--- Question:\n{question}");println!("\n--- Answer:");let chat_res = client.exec_chat(model, chat_req.clone(),None).await?;println!("{}", chat_res.first_text().unwrap_or("NO ANSWER"));println!("\n--- Answer: (streaming)");let chat_res = client.exec_chat_stream(model, chat_req.clone(),None).await?;print_chat_stream(chat_res,Some(&print_options)).await?;println!();}Ok(())}

More Examples


Static Badge

Library Focus:

  • Focuses on standardizing chat completion APIs across major AI services.

  • Native implementation, meaning no per-service SDKs.

    • Reason: While there are some variations across the various APIs, they all follow the same pattern and high-level flow and constructs. Managing the differences at a lower layer is actually simpler and more cumulative across services than doing SDK gymnastics.
  • Prioritizes ergonomics and commonality, with depth being secondary. (If you require a complete client API, consider using async-openai and ollama-rs; they are both excellent and easy to use.)

  • Initially, this library will mostly focus on text chat APIs, with images and function calling coming later.

ChatOptions

  • (1) - OpenAI-compatible notes
    • Models: OpenAI, DeepSeek, Groq, Ollama, xAI, Mimo, Together, Fireworks, Nebius, Zai, Together, Fireworks, Nebius, Zai
PropertyOpenAI Compatibles (*1)AnthropicGemini generationConfig.Cohere
temperaturetemperaturetemperaturetemperaturetemperature
max_tokensmax_tokensmax_tokens (default 1024)maxOutputTokensmax_tokens
top_ptop_ptop_ptopPp

Usage

PropertyOpenAI Compatibles (1)Anthropic usage.Gemini usageMetadata.Cohere meta.tokens.
prompt_tokensprompt_tokensinput_tokens (added)promptTokenCount (2)input_tokens
completion_tokenscompletion_tokensoutput_tokens (added)candidatesTokenCount (2)output_tokens
total_tokenstotal_tokens(computed)totalTokenCount (2)(computed)
prompt_tokens_detailsprompt_tokens_detailscached/cache_creationN/A for nowN/A for now
completion_tokens_detailscompletion_tokens_detailsN/A for nowN/A for nowN/A for now
  • (1) - OpenAI-compatible notes

  • (2): Gemini tokens

    • Right now, with the Gemini Stream API, it's not clear whether usage for each event is cumulative or must be summed. It appears to be cumulative, meaning the last message shows the total number of input, output, and total tokens, so that is the current assumption. See possible tweet answer for more info.

Notes on Possible Direction

  • Will add more data to ChatResponse and ChatStream, especially usage metadata.
  • Add vision/image support to chat messages and responses.
  • Add function calling support to chat messages and responses.
  • Add embed and embed_batch.
  • Add the AWS Bedrock variants (e.g., Mistral and Anthropic). Most of the work will be on the "interesting" token signature scheme. To avoid bringing in large SDKs, this might be a lower-priority feature.
  • Add the Google Vertex AI variants.
  • May add the Azure OpenAI variant (not sure yet).

Links

About

Rust multiprovider generative AI client (Ollama, OpenAi, Anthropic, Gemini, DeepSeek, xAI/Grok, Groq,Cohere, ...)

Resources

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

genai, Multi-AI Providers Library for Rust

Currently natively supports: OpenAI, Anthropic, Gemini, xAI, Ollama, Groq, DeepSeek, Cohere, Together, Fireworks, Nebius, Mimo, Zai (Zhipu AI), BigModel, Kimi (Moonshot AI), Bedrock (AWS), Cerebras, OpenRouter.

Also supports a custom URL with ServiceTargetResolver (see examples/c06-target-resolver.rs).

Static BadgeStatic Badge

Provides a single, ergonomic API for many generative AI providers, such as Anthropic, OpenAI, Gemini, xAI, Ollama, Groq, and more.

NOTE: This is the Terraphim fork synced to upstream v0.6.0-beta.8, adding Kimi (Moonshot AI), AWS Bedrock, Cerebras, and OpenRouter adapters, plus SSE streaming improvements.

Docs for LLMs | CHANGELOG | BIG THANKS

v0.6.0-beta.8-fork (Terraphim)

  • What's new:
    • Upstream sync: Merged upstream v0.6.0-beta.8 breaking changes (Adapter trait, AuthData::None, StopReason, ChatMessage::tool_response, ReasoningContent).
    • New Adapter: Kimi (Moonshot AI): Full chat and streaming support via kimi:: namespace.
    • New Adapter: Bedrock (AWS): SigV4-signed requests for AWS Bedrock models.
    • New Adapter: Cerebras: Fast inference provider support.
    • New Adapter: OpenRouter: Multi-provider routing via openrouter:: namespace.
    • Zai URL fix: Resolved trailing slash issues in Zai adapter endpoint construction.
    • SSE streaming improvements: Adapter-specific SSE parsing for Kimi and Zai streaming responses.
    • Bearer token auth: Added BearerToken variant to AuthData for providers requiring it.
  • What's still awesome:
    • Normalized and ergonomic Chat API across all major providers.
    • Native protocol support for Gemini and Anthropic protocols (Reasoning/Thinking controls).
    • PDF, image, and embedding support.
    • Custom auth, endpoint, and header overrides.

See CHANGELOG

Usage examples

  • Check out AIPACK, which wraps this genai library into an agentic runtime to run, build, and share AI Agent Packs. See pro@coder for a simple example of how I use AI PACK/genai for production coding.

Note: Feel free to send me a short description and a link to your application or library that uses genai.

Key Features

Examples | Thanks | Library Focus | Changelog | Provider Mapping: ChatOptions | Usage

Examples

examples/c00-readme.rs

//! Base examples demonstrating the core capabilities of genaiuse genai::chat::printer::{print_chat_stream,PrintChatStreamOptions};use genai::chat::{ChatMessage,ChatRequest};use genai::Client;constMODEL_OPENAI:&str = "gpt-4o-mini";// o1-mini, gpt-4o-miniconstMODEL_ANTHROPIC:&str = "claude-3-haiku-20240307";// or namespaced with simple name "fireworks::qwen3-30b-a3b", or "fireworks::accounts/fireworks/models/qwen3-30b-a3b"constMODEL_FIREWORKS:&str = "accounts/fireworks/models/qwen3-30b-a3b";constMODEL_TOGETHER:&str = "together::openai/gpt-oss-20b";constMODEL_GEMINI:&str = "gemini-2.0-flash";constMODEL_GROQ:&str = "llama-3.1-8b-instant";constMODEL_OLLAMA:&str = "gemma:2b";// sh: `ollama pull gemma:2b`constMODEL_XAI:&str = "grok-3-mini";constMODEL_DEEPSEEK:&str = "deepseek-chat";constMODEL_ZAI:&str = "glm-4-plus";constMODEL_COHERE:&str = "command-r7b-12-2024";// NOTE: These are the default environment keys for each AI Adapter Type.// They can be customized; see `examples/c02-auth.rs`constMODEL_AND_KEY_ENV_NAME_LIST:&[(&str,&str)] = &[// -- De/activate models/providers(MODEL_OPENAI,"OPENAI_API_KEY"),(MODEL_ANTHROPIC,"ANTHROPIC_API_KEY"),(MODEL_GEMINI,"GEMINI_API_KEY"),(MODEL_FIREWORKS,"FIREWORKS_API_KEY"),(MODEL_TOGETHER,"TOGETHER_API_KEY"),(MODEL_GROQ,"GROQ_API_KEY"),(MODEL_XAI,"XAI_API_KEY"),(MODEL_DEEPSEEK,"DEEPSEEK_API_KEY"),(MODEL_OLLAMA,""),(MODEL_ZAI,"ZAI_API_KEY"),(MODEL_COHERE,"COHERE_API_KEY"),];// NOTE: Model to AdapterKind (AI Provider) type mapping rule// - starts_with "gpt" -> OpenAI// - starts_with "claude" -> Anthropic// - starts_with "command" -> Cohere// - starts_with "gemini" -> Gemini// - model in Groq models -> Groq// - starts_with "glm" -> ZAI// - For anything else -> Ollama//// This can be customized; see `examples/c03-mapper.rs`#[tokio::main]asyncfnmain() -> Result<(),Box<dyn std::error::Error>>{let question = "Why is the sky red?";let chat_req = ChatRequest::new(vec![// -- Messages (de/activate to see the differences)ChatMessage::system("Answer in one sentence"),ChatMessage::user(question),]);let client = Client::default();let print_options = PrintChatStreamOptions::from_print_events(false);for(model, env_name)inMODEL_AND_KEY_ENV_NAME_LIST{// Skip if the environment name is not setif !env_name.is_empty() && std::env::var(env_name).is_err(){println!("===== Skipping model: {model} (env var not set: {env_name})");continue;}let adapter_kind = client.resolve_service_target(model).await?.model.adapter_kind;println!("\n===== MODEL: {model} ({adapter_kind}) =====");println!("\n--- Question:\n{question}");println!("\n--- Answer:");let chat_res = client.exec_chat(model, chat_req.clone(),None).await?;println!("{}", chat_res.first_text().unwrap_or("NO ANSWER"));println!("\n--- Answer: (streaming)");let chat_res = client.exec_chat_stream(model, chat_req.clone(),None).await?;print_chat_stream(chat_res,Some(&print_options)).await?;println!();}Ok(())}

More Examples


Static Badge

Library Focus:

  • Focuses on standardizing chat completion APIs across major AI services.

  • Native implementation, meaning no per-service SDKs.

    • Reason: While there are some variations across the various APIs, they all follow the same pattern and high-level flow and constructs. Managing the differences at a lower layer is actually simpler and more cumulative across services than doing SDK gymnastics.
  • Prioritizes ergonomics and commonality, with depth being secondary. (If you require a complete client API, consider using async-openai and ollama-rs; they are both excellent and easy to use.)

  • Initially, this library will mostly focus on text chat APIs, with images and function calling coming later.

ChatOptions

  • (1) - OpenAI-compatible notes
    • Models: OpenAI, DeepSeek, Groq, Ollama, xAI, Mimo, Together, Fireworks, Nebius, Zai, Together, Fireworks, Nebius, Zai
PropertyOpenAI Compatibles (*1)AnthropicGemini generationConfig.Cohere
temperaturetemperaturetemperaturetemperaturetemperature
max_tokensmax_tokensmax_tokens (default 1024)maxOutputTokensmax_tokens
top_ptop_ptop_ptopPp

Usage

PropertyOpenAI Compatibles (1)Anthropic usage.Gemini usageMetadata.Cohere meta.tokens.
prompt_tokensprompt_tokensinput_tokens (added)promptTokenCount (2)input_tokens
completion_tokenscompletion_tokensoutput_tokens (added)candidatesTokenCount (2)output_tokens
total_tokenstotal_tokens(computed)totalTokenCount (2)(computed)
prompt_tokens_detailsprompt_tokens_detailscached/cache_creationN/A for nowN/A for now
completion_tokens_detailscompletion_tokens_detailsN/A for nowN/A for nowN/A for now
  • (1) - OpenAI-compatible notes

  • (2): Gemini tokens

    • Right now, with the Gemini Stream API, it's not clear whether usage for each event is cumulative or must be summed. It appears to be cumulative, meaning the last message shows the total number of input, output, and total tokens, so that is the current assumption. See possible tweet answer for more info.

Notes on Possible Direction

  • Will add more data to ChatResponse and ChatStream, especially usage metadata.
  • Add vision/image support to chat messages and responses.
  • Add function calling support to chat messages and responses.
  • Add embed and embed_batch.
  • Add the AWS Bedrock variants (e.g., Mistral and Anthropic). Most of the work will be on the "interesting" token signature scheme. To avoid bringing in large SDKs, this might be a lower-priority feature.
  • Add the Google Vertex AI variants.
  • May add the Azure OpenAI variant (not sure yet).

Links

About

Rust multiprovider generative AI client (Ollama, OpenAi, Anthropic, Gemini, DeepSeek, xAI/Grok, Groq,Cohere, ...)

Resources

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

genai, Multi-AI Providers Library for Rust

Currently natively supports: OpenAI, Anthropic, Gemini, xAI, Ollama, Groq, DeepSeek, Cohere, Together, Fireworks, Nebius, Mimo, Zai (Zhipu AI), BigModel, Kimi (Moonshot AI), Bedrock (AWS), Cerebras, OpenRouter.

Also supports a custom URL with ServiceTargetResolver (see examples/c06-target-resolver.rs).

Static BadgeStatic Badge

Provides a single, ergonomic API for many generative AI providers, such as Anthropic, OpenAI, Gemini, xAI, Ollama, Groq, and more.

NOTE: This is the Terraphim fork synced to upstream v0.6.0-beta.8, adding Kimi (Moonshot AI), AWS Bedrock, Cerebras, and OpenRouter adapters, plus SSE streaming improvements.

Docs for LLMs | CHANGELOG | BIG THANKS

v0.6.0-beta.8-fork (Terraphim)

  • What's new:
    • Upstream sync: Merged upstream v0.6.0-beta.8 breaking changes (Adapter trait, AuthData::None, StopReason, ChatMessage::tool_response, ReasoningContent).
    • New Adapter: Kimi (Moonshot AI): Full chat and streaming support via kimi:: namespace.
    • New Adapter: Bedrock (AWS): SigV4-signed requests for AWS Bedrock models.
    • New Adapter: Cerebras: Fast inference provider support.
    • New Adapter: OpenRouter: Multi-provider routing via openrouter:: namespace.
    • Zai URL fix: Resolved trailing slash issues in Zai adapter endpoint construction.
    • SSE streaming improvements: Adapter-specific SSE parsing for Kimi and Zai streaming responses.
    • Bearer token auth: Added BearerToken variant to AuthData for providers requiring it.
  • What's still awesome:
    • Normalized and ergonomic Chat API across all major providers.
    • Native protocol support for Gemini and Anthropic protocols (Reasoning/Thinking controls).
    • PDF, image, and embedding support.
    • Custom auth, endpoint, and header overrides.

See CHANGELOG

Usage examples

  • Check out AIPACK, which wraps this genai library into an agentic runtime to run, build, and share AI Agent Packs. See pro@coder for a simple example of how I use AI PACK/genai for production coding.

Note: Feel free to send me a short description and a link to your application or library that uses genai.

Key Features

Examples | Thanks | Library Focus | Changelog | Provider Mapping: ChatOptions | Usage

Examples

examples/c00-readme.rs

//! Base examples demonstrating the core capabilities of genaiuse genai::chat::printer::{print_chat_stream,PrintChatStreamOptions};use genai::chat::{ChatMessage,ChatRequest};use genai::Client;constMODEL_OPENAI:&str = "gpt-4o-mini";// o1-mini, gpt-4o-miniconstMODEL_ANTHROPIC:&str = "claude-3-haiku-20240307";// or namespaced with simple name "fireworks::qwen3-30b-a3b", or "fireworks::accounts/fireworks/models/qwen3-30b-a3b"constMODEL_FIREWORKS:&str = "accounts/fireworks/models/qwen3-30b-a3b";constMODEL_TOGETHER:&str = "together::openai/gpt-oss-20b";constMODEL_GEMINI:&str = "gemini-2.0-flash";constMODEL_GROQ:&str = "llama-3.1-8b-instant";constMODEL_OLLAMA:&str = "gemma:2b";// sh: `ollama pull gemma:2b`constMODEL_XAI:&str = "grok-3-mini";constMODEL_DEEPSEEK:&str = "deepseek-chat";constMODEL_ZAI:&str = "glm-4-plus";constMODEL_COHERE:&str = "command-r7b-12-2024";// NOTE: These are the default environment keys for each AI Adapter Type.// They can be customized; see `examples/c02-auth.rs`constMODEL_AND_KEY_ENV_NAME_LIST:&[(&str,&str)] = &[// -- De/activate models/providers(MODEL_OPENAI,"OPENAI_API_KEY"),(MODEL_ANTHROPIC,"ANTHROPIC_API_KEY"),(MODEL_GEMINI,"GEMINI_API_KEY"),(MODEL_FIREWORKS,"FIREWORKS_API_KEY"),(MODEL_TOGETHER,"TOGETHER_API_KEY"),(MODEL_GROQ,"GROQ_API_KEY"),(MODEL_XAI,"XAI_API_KEY"),(MODEL_DEEPSEEK,"DEEPSEEK_API_KEY"),(MODEL_OLLAMA,""),(MODEL_ZAI,"ZAI_API_KEY"),(MODEL_COHERE,"COHERE_API_KEY"),];// NOTE: Model to AdapterKind (AI Provider) type mapping rule// - starts_with "gpt" -> OpenAI// - starts_with "claude" -> Anthropic// - starts_with "command" -> Cohere// - starts_with "gemini" -> Gemini// - model in Groq models -> Groq// - starts_with "glm" -> ZAI// - For anything else -> Ollama//// This can be customized; see `examples/c03-mapper.rs`#[tokio::main]asyncfnmain() -> Result<(),Box<dyn std::error::Error>>{let question = "Why is the sky red?";let chat_req = ChatRequest::new(vec![// -- Messages (de/activate to see the differences)ChatMessage::system("Answer in one sentence"),ChatMessage::user(question),]);let client = Client::default();let print_options = PrintChatStreamOptions::from_print_events(false);for(model, env_name)inMODEL_AND_KEY_ENV_NAME_LIST{// Skip if the environment name is not setif !env_name.is_empty() && std::env::var(env_name).is_err(){println!("===== Skipping model: {model} (env var not set: {env_name})");continue;}let adapter_kind = client.resolve_service_target(model).await?.model.adapter_kind;println!("\n===== MODEL: {model} ({adapter_kind}) =====");println!("\n--- Question:\n{question}");println!("\n--- Answer:");let chat_res = client.exec_chat(model, chat_req.clone(),None).await?;println!("{}", chat_res.first_text().unwrap_or("NO ANSWER"));println!("\n--- Answer: (streaming)");let chat_res = client.exec_chat_stream(model, chat_req.clone(),None).await?;print_chat_stream(chat_res,Some(&print_options)).await?;println!();}Ok(())}

More Examples


Static Badge

Library Focus:

  • Focuses on standardizing chat completion APIs across major AI services.

  • Native implementation, meaning no per-service SDKs.

    • Reason: While there are some variations across the various APIs, they all follow the same pattern and high-level flow and constructs. Managing the differences at a lower layer is actually simpler and more cumulative across services than doing SDK gymnastics.
  • Prioritizes ergonomics and commonality, with depth being secondary. (If you require a complete client API, consider using async-openai and ollama-rs; they are both excellent and easy to use.)

  • Initially, this library will mostly focus on text chat APIs, with images and function calling coming later.

ChatOptions

  • (1) - OpenAI-compatible notes
    • Models: OpenAI, DeepSeek, Groq, Ollama, xAI, Mimo, Together, Fireworks, Nebius, Zai, Together, Fireworks, Nebius, Zai
PropertyOpenAI Compatibles (*1)AnthropicGemini generationConfig.Cohere
temperaturetemperaturetemperaturetemperaturetemperature
max_tokensmax_tokensmax_tokens (default 1024)maxOutputTokensmax_tokens
top_ptop_ptop_ptopPp

Usage

PropertyOpenAI Compatibles (1)Anthropic usage.Gemini usageMetadata.Cohere meta.tokens.
prompt_tokensprompt_tokensinput_tokens (added)promptTokenCount (2)input_tokens
completion_tokenscompletion_tokensoutput_tokens (added)candidatesTokenCount (2)output_tokens
total_tokenstotal_tokens(computed)totalTokenCount (2)(computed)
prompt_tokens_detailsprompt_tokens_detailscached/cache_creationN/A for nowN/A for now
completion_tokens_detailscompletion_tokens_detailsN/A for nowN/A for nowN/A for now
  • (1) - OpenAI-compatible notes

  • (2): Gemini tokens

    • Right now, with the Gemini Stream API, it's not clear whether usage for each event is cumulative or must be summed. It appears to be cumulative, meaning the last message shows the total number of input, output, and total tokens, so that is the current assumption. See possible tweet answer for more info.

Notes on Possible Direction

  • Will add more data to ChatResponse and ChatStream, especially usage metadata.
  • Add vision/image support to chat messages and responses.
  • Add function calling support to chat messages and responses.
  • Add embed and embed_batch.
  • Add the AWS Bedrock variants (e.g., Mistral and Anthropic). Most of the work will be on the "interesting" token signature scheme. To avoid bringing in large SDKs, this might be a lower-priority feature.
  • Add the Google Vertex AI variants.
  • May add the Azure OpenAI variant (not sure yet).

Links

About

Rust multiprovider generative AI client (Ollama, OpenAi, Anthropic, Gemini, DeepSeek, xAI/Grok, Groq,Cohere, ...)

Resources

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

genai, Multi-AI Providers Library for Rust

Currently natively supports: OpenAI, Anthropic, Gemini, xAI, Ollama, Groq, DeepSeek, Cohere, Together, Fireworks, Nebius, Mimo, Zai (Zhipu AI), BigModel, Kimi (Moonshot AI), Bedrock (AWS), Cerebras, OpenRouter.

Also supports a custom URL with ServiceTargetResolver (see examples/c06-target-resolver.rs).

Static BadgeStatic Badge

Provides a single, ergonomic API for many generative AI providers, such as Anthropic, OpenAI, Gemini, xAI, Ollama, Groq, and more.

NOTE: This is the Terraphim fork synced to upstream v0.6.0-beta.8, adding Kimi (Moonshot AI), AWS Bedrock, Cerebras, and OpenRouter adapters, plus SSE streaming improvements.

Docs for LLMs | CHANGELOG | BIG THANKS

v0.6.0-beta.8-fork (Terraphim)

  • What's new:
    • Upstream sync: Merged upstream v0.6.0-beta.8 breaking changes (Adapter trait, AuthData::None, StopReason, ChatMessage::tool_response, ReasoningContent).
    • New Adapter: Kimi (Moonshot AI): Full chat and streaming support via kimi:: namespace.
    • New Adapter: Bedrock (AWS): SigV4-signed requests for AWS Bedrock models.
    • New Adapter: Cerebras: Fast inference provider support.
    • New Adapter: OpenRouter: Multi-provider routing via openrouter:: namespace.
    • Zai URL fix: Resolved trailing slash issues in Zai adapter endpoint construction.
    • SSE streaming improvements: Adapter-specific SSE parsing for Kimi and Zai streaming responses.
    • Bearer token auth: Added BearerToken variant to AuthData for providers requiring it.
  • What's still awesome:
    • Normalized and ergonomic Chat API across all major providers.
    • Native protocol support for Gemini and Anthropic protocols (Reasoning/Thinking controls).
    • PDF, image, and embedding support.
    • Custom auth, endpoint, and header overrides.

See CHANGELOG

Usage examples

  • Check out AIPACK, which wraps this genai library into an agentic runtime to run, build, and share AI Agent Packs. See pro@coder for a simple example of how I use AI PACK/genai for production coding.

Note: Feel free to send me a short description and a link to your application or library that uses genai.

Key Features

Examples | Thanks | Library Focus | Changelog | Provider Mapping: ChatOptions | Usage

Examples

examples/c00-readme.rs

//! Base examples demonstrating the core capabilities of genaiuse genai::chat::printer::{print_chat_stream,PrintChatStreamOptions};use genai::chat::{ChatMessage,ChatRequest};use genai::Client;constMODEL_OPENAI:&str = "gpt-4o-mini";// o1-mini, gpt-4o-miniconstMODEL_ANTHROPIC:&str = "claude-3-haiku-20240307";// or namespaced with simple name "fireworks::qwen3-30b-a3b", or "fireworks::accounts/fireworks/models/qwen3-30b-a3b"constMODEL_FIREWORKS:&str = "accounts/fireworks/models/qwen3-30b-a3b";constMODEL_TOGETHER:&str = "together::openai/gpt-oss-20b";constMODEL_GEMINI:&str = "gemini-2.0-flash";constMODEL_GROQ:&str = "llama-3.1-8b-instant";constMODEL_OLLAMA:&str = "gemma:2b";// sh: `ollama pull gemma:2b`constMODEL_XAI:&str = "grok-3-mini";constMODEL_DEEPSEEK:&str = "deepseek-chat";constMODEL_ZAI:&str = "glm-4-plus";constMODEL_COHERE:&str = "command-r7b-12-2024";// NOTE: These are the default environment keys for each AI Adapter Type.// They can be customized; see `examples/c02-auth.rs`constMODEL_AND_KEY_ENV_NAME_LIST:&[(&str,&str)] = &[// -- De/activate models/providers(MODEL_OPENAI,"OPENAI_API_KEY"),(MODEL_ANTHROPIC,"ANTHROPIC_API_KEY"),(MODEL_GEMINI,"GEMINI_API_KEY"),(MODEL_FIREWORKS,"FIREWORKS_API_KEY"),(MODEL_TOGETHER,"TOGETHER_API_KEY"),(MODEL_GROQ,"GROQ_API_KEY"),(MODEL_XAI,"XAI_API_KEY"),(MODEL_DEEPSEEK,"DEEPSEEK_API_KEY"),(MODEL_OLLAMA,""),(MODEL_ZAI,"ZAI_API_KEY"),(MODEL_COHERE,"COHERE_API_KEY"),];// NOTE: Model to AdapterKind (AI Provider) type mapping rule// - starts_with "gpt" -> OpenAI// - starts_with "claude" -> Anthropic// - starts_with "command" -> Cohere// - starts_with "gemini" -> Gemini// - model in Groq models -> Groq// - starts_with "glm" -> ZAI// - For anything else -> Ollama//// This can be customized; see `examples/c03-mapper.rs`#[tokio::main]asyncfnmain() -> Result<(),Box<dyn std::error::Error>>{let question = "Why is the sky red?";let chat_req = ChatRequest::new(vec![// -- Messages (de/activate to see the differences)ChatMessage::system("Answer in one sentence"),ChatMessage::user(question),]);let client = Client::default();let print_options = PrintChatStreamOptions::from_print_events(false);for(model, env_name)inMODEL_AND_KEY_ENV_NAME_LIST{// Skip if the environment name is not setif !env_name.is_empty() && std::env::var(env_name).is_err(){println!("===== Skipping model: {model} (env var not set: {env_name})");continue;}let adapter_kind = client.resolve_service_target(model).await?.model.adapter_kind;println!("\n===== MODEL: {model} ({adapter_kind}) =====");println!("\n--- Question:\n{question}");println!("\n--- Answer:");let chat_res = client.exec_chat(model, chat_req.clone(),None).await?;println!("{}", chat_res.first_text().unwrap_or("NO ANSWER"));println!("\n--- Answer: (streaming)");let chat_res = client.exec_chat_stream(model, chat_req.clone(),None).await?;print_chat_stream(chat_res,Some(&print_options)).await?;println!();}Ok(())}

More Examples


Static Badge

Library Focus:

  • Focuses on standardizing chat completion APIs across major AI services.

  • Native implementation, meaning no per-service SDKs.

    • Reason: While there are some variations across the various APIs, they all follow the same pattern and high-level flow and constructs. Managing the differences at a lower layer is actually simpler and more cumulative across services than doing SDK gymnastics.
  • Prioritizes ergonomics and commonality, with depth being secondary. (If you require a complete client API, consider using async-openai and ollama-rs; they are both excellent and easy to use.)

  • Initially, this library will mostly focus on text chat APIs, with images and function calling coming later.

ChatOptions

  • (1) - OpenAI-compatible notes
    • Models: OpenAI, DeepSeek, Groq, Ollama, xAI, Mimo, Together, Fireworks, Nebius, Zai, Together, Fireworks, Nebius, Zai
PropertyOpenAI Compatibles (*1)AnthropicGemini generationConfig.Cohere
temperaturetemperaturetemperaturetemperaturetemperature
max_tokensmax_tokensmax_tokens (default 1024)maxOutputTokensmax_tokens
top_ptop_ptop_ptopPp

Usage

PropertyOpenAI Compatibles (1)Anthropic usage.Gemini usageMetadata.Cohere meta.tokens.
prompt_tokensprompt_tokensinput_tokens (added)promptTokenCount (2)input_tokens
completion_tokenscompletion_tokensoutput_tokens (added)candidatesTokenCount (2)output_tokens
total_tokenstotal_tokens(computed)totalTokenCount (2)(computed)
prompt_tokens_detailsprompt_tokens_detailscached/cache_creationN/A for nowN/A for now
completion_tokens_detailscompletion_tokens_detailsN/A for nowN/A for nowN/A for now
  • (1) - OpenAI-compatible notes

  • (2): Gemini tokens

    • Right now, with the Gemini Stream API, it's not clear whether usage for each event is cumulative or must be summed. It appears to be cumulative, meaning the last message shows the total number of input, output, and total tokens, so that is the current assumption. See possible tweet answer for more info.

Notes on Possible Direction

  • Will add more data to ChatResponse and ChatStream, especially usage metadata.
  • Add vision/image support to chat messages and responses.
  • Add function calling support to chat messages and responses.
  • Add embed and embed_batch.
  • Add the AWS Bedrock variants (e.g., Mistral and Anthropic). Most of the work will be on the "interesting" token signature scheme. To avoid bringing in large SDKs, this might be a lower-priority feature.
  • Add the Google Vertex AI variants.
  • May add the Azure OpenAI variant (not sure yet).

Links

About

Rust multiprovider generative AI client (Ollama, OpenAi, Anthropic, Gemini, DeepSeek, xAI/Grok, Groq,Cohere, ...)

Resources

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages