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 セマンティックコンベンションのトレーシングが追加されます。

仕組み

  1. クライアント作成 – let client = Client::new()?; (現在は失敗可能で、Result を返します)。
  2. モデル解決 – ライブラリはモデルのプレフィックス (gpt‑* → OpenAI、claude‑* → Anthropic など) から AdapterKind を推測します。namespace::model でオーバーライドできます。アダプターは、正しい HTTP エンドポイント、認証ヘッダー、リクエスト形式を認識しています。
  3. チャットリクエスト – 一連の ChatMessage (システム、ユーザー、アシスタント) を含む ChatRequest を構築します。オプションの ChatOptions を使用すると、温度、最大トークン数、ツールの選択、追加の本文フィールドなどを設定できます。
  4. 実行 – 単一の応答には client.exec_chat(model, request, None).await? を、ストリーミング応答には exec_chat_stream を呼び出します。
  5. 結果の処理 – 返された 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) と、破壊的な変更が導入される可能性があります。アップグレード時は移行ガイドを参照してください。

はじめに

  1. Cargo.toml に追加:
    genai = "0.6"
    
  2. 使用する予定のプロバイダーの適切な環境変数を設定します (例: OPENAI_API_KEY、ANTHROPIC_API_KEY)。
  3. バンドルされている例のいずれかを実行します (例: cargo run --example c00-readme)。

コミュニティとコントリビューション

  • Crates.io – crates.io version badge
  • 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 モデルまで、数十のモデルのいずれかに向けて実行すると、各サービスの独自の機能を利用しながら、一貫した応答を得られます。

関連

  • プロジェクト
  • プロジェクト
  • プロジェクト
  • プロジェクト
  • プロジェクト