jeremychone/rust-genai
Rust multiprovider generative AI client (Ollama, OpenAi, Anthropic, Gemini, DeepSeek, ZAI, OpenRouter, FireworksAI, xAI/Grok, Groq,, ...)
概要
genai は、開発者に多くの大規模言語モデル (LLM) プロバイダーと通信するための、単一の人間工学的な API を提供する Rust ライブラリです。プロバイダー (OpenAI、Anthropic、Gemini、Ollama、Bedrock など) 間の違いを抽象化しつつ、各プロバイダーのネイティブプロトコルが存在する場合はそれを使用できます。実際には、Client を作成し、システム/ユーザーメッセージを含む ChatRequest を構築し、gpt-5.6-luna のようなモデル名や、qwen_cloud::qwen3.8-max のような名前空間付きの名前を指定して exec_chat (またはストリーミング版) を呼び出します。
主な機能
| 機能 | あなたにとっての意味 |
|---|---|
| マルチプロバイダー対応 | 27 以上のプロバイダーと 200 以上のモデルが組み込まれています。ライブラリはモデル名から適切なアダプターを選択します。または、namespace::model 構文でアダプターを強制することもできます。 |
| ネイティブプロトコルアダプター | プロバイダーが独自の API (例: Anthropic、Gemini、Bedrock) を提供する場合、genai は直接通信し、推論予算、ツール呼び出しメタデータ、ストリーミングフレームなどの高度なオプションを保持します。 |
| OpenAI 互換フォールバック | OpenAI スタイルのエンドポイントを公開するサービス (Ollama、カスタムのセルフホストサーバー、Groq など) には、genai は汎用の OpenAI 互換アダプターを使用します。 |
| ストリーミングとフレーム検査 | exec_chat_stream は ChatFrame のストリームを返します。ChatFrameSink をアタッチして、デバッグやカスタム処理のために生のフレームを検査できます。 |
| ツール/関数呼び出し | プロバイダーに依存しない ToolChoice と組み込みのツール構造体 (例: WebSearch) により、プロバイダー固有のコードを書くことなく、Anthropic、OpenAI、Gemini などでツール呼び出しを使用できます。 |
| 推論努力の制御 | ReasoningEffort::High などの列挙型は、プロバイダー固有のノブ (例: Anthropic の max_tokens や OpenAI の temperature) にマッピングされます。 |
| 画像解析 | 画像を受け入れるプロバイダー (OpenAI Vision、Gemini Flash‑2、Anthropic) 向けの簡単なヘルパー。 |
| カスタムエンドポイントと認証 | 環境変数 (GENAI_1_ENDPOINT、GENAI_1_API_KEY、OMLX_ENDPOINT など) を設定するか、ServiceTargetResolver を実装して、クライアントを任意の OpenAI 互換サーバーに向けます。 |
| TLS バックエンドの選択 | コンパイル時に native-tls、rustls、または OpenSSL から選択できます。 |
| OpenTelemetry 統合 | オプションの otel 機能により、GenAI セマンティックコンベンションのトレーシングが追加されます。 |
仕組み
- クライアント作成 –
let client = Client::new()?;(現在は失敗可能で、Resultを返します)。 - モデル解決 – ライブラリはモデルのプレフィックス (
gpt‑* → OpenAI、claude‑* → Anthropicなど) からAdapterKindを推測します。namespace::modelでオーバーライドできます。アダプターは、正しい HTTP エンドポイント、認証ヘッダー、リクエスト形式を認識しています。 - チャットリクエスト – 一連の
ChatMessage(システム、ユーザー、アシスタント) を含むChatRequestを構築します。オプションのChatOptionsを使用すると、温度、最大トークン数、ツールの選択、追加の本文フィールドなどを設定できます。 - 実行 – 単一の応答には
client.exec_chat(model, request, None).await?を、ストリーミング応答にはexec_chat_streamを呼び出します。 - 結果の処理 – 返された
ChatResponseから、生成されたテキスト (first_text())、ツール呼び出しデータ、および必要に応じて生のストリーミングフレームを取得できます。
例 (簡略化)
use genai::{Client, chat::{ChatMessage, ChatRequest}};
#[tokio::main]
async fn main() -> anyhow::Result<()> {
// 1️⃣ クライアントを作成 (API キーのために環境変数を読み取る)
let client = Client::new()?;
// 2️⃣ シンプルなチャットリクエストを構築
let req = ChatRequest::new(vec![
ChatMessage::system("You are a concise assistant"),
ChatMessage::user("Why is the sky red?"),
]);
// 3️⃣ 任意のモデルを呼び出す – ここでは OpenAI 互換のモデル
let resp = client.exec_chat("gpt-5.6-luna", req, None).await?;
println!("Answer: {}", resp.first_text().unwrap_or("<none>"));
Ok(())
}
genai を使用すべき場合
- プロバイダーを切り替える必要がある場合 (例: OpenAI、Anthropic、ローカルの Ollama モデルでプロンプトをテストする) に、リクエストコードを書き直す必要がありません。
- プロバイダー固有の SDK を多数取り込む代わりに、単一の Rust クレートが必要な場合。
- プロバイダー固有の機能 (Anthropic の
toolキャッシュ、Gemini の構造化出力、Bedrock の署名付き推論ブロックなど) を重視する場合 – genai は共通の表面を維持しながらそれらを公開します。 - 開発時にはローカル (Ollama) で、本番環境ではクラウド (OpenAI、Bedrock) で実行される可能性のあるサービスまたは CLI を構築している場合。
制限事項 / 留意点
| 側面 | メモ |
|---|---|
| API の深さ | このクレートは、チャット/完了、ストリーミング、およびいくつかのマルチモーダルヘルパーに焦点を当てています。フル機能の SDK (例: async-openai) には、より多くのエンドポイント (埋め込み、ファインチューニング、モデレーション) がある場合があります。 |
| プロバイダー固有の癖 | ほとんどのノブは統一されていますが、いくつかの高度な機能 (例: OpenAI の logprobs、Azure リソース固有のヘッダー) はまだ公開されていません。 |
| 非同期ランタイム | Tokio (または AsyncRead/Write を実装する任意のランタイム) が必要です。 |
| バージョンリズム | リリースが速い (0.6 → 0.7) と、破壊的な変更が導入される可能性があります。アップグレード時は移行ガイドを参照してください。 |
はじめに
Cargo.tomlに追加:genai = "0.6"- 使用する予定のプロバイダーの適切な環境変数を設定します (例:
OPENAI_API_KEY、ANTHROPIC_API_KEY)。 - バンドルされている例のいずれかを実行します (例:
cargo run --example c00-readme)。
コミュニティとコントリビューション
- Crates.io –
- GitHub – Issues、PR、およびコントリビューターの
BIG-THANKS.mdリスト。 - ビデオチュートリアル – YouTube のプレイリストで、セットアップ、モデルマッピング、新しいプロバイダーの追加方法を説明しています。
- 機能フラグ – TLS バックエンド (
native-tls、rustls-tls、openssl-tls) とオプションの OpenTelemetry (otel) を選択します。
TL;DR
genai は、LLM チャット API 用の Rust ファーストでプロバイダーに依存しないラッパーです。Rust コードを 1 つ作成し、OpenAI の GPT‑4o からローカルで実行される Ollama モデルまで、数十のモデルのいずれかに向けて実行すると、各サービスの独自の機能を利用しながら、一貫した応答を得られます。
関連
- プロジェクト
- プロジェクト
- プロジェクト
- プロジェクト
- プロジェクト