agentjido/req_llm
Composable Elixir library for LLM interactions built on Req and Finch
ReqLLMとは?
ReqLLMは、単一の整合性のあるAPIを通じて、多くの大規模言語モデル(LLM)プロバイダー(OpenAI、Anthropic、Azure、Google Geminiなど)と対話できるようにするオープンソースのElixirライブラリです。人気の高いReq HTTPクライアントとFinchストリーミングライブラリをベースにしており、各プロバイダー固有の仕様を処理するため、どのモデルを使用しているかにかかわらず、同じElixirコードを書くことができます。
なぜ重要なのか
- プロバイダーに依存しない – 21以上のプロバイダーからなる1,200以上のモデルがライブラリのモデルカタログに登録されています。
"anthropic:claude-haiku-4-5"のような文字列でモデルを選択するだけで、ライブラリがそのプロバイダーに適したHTTPリクエストに変換します。 - 統合された高レベルヘルパー –
generate_text/3、stream_text/3、generate_object/4などの関数はVercel AI SDKのスタイルを模倣しており、同じ呼び出しシグネチャでプレーンテキスト、構造化JSON、さらには画像まで生成できます。 - ストリーミングサポート – Finchを介してプロバイダー間でリアルタイムのトークンストリーミングが機能し、使用量メタデータを収集しながらトークンを生成する
StreamResponseを提供します。 - 構造化出力とツール呼び出し – 期待される結果の形式(オブジェクト、配列、JSONスキーマなど)を定義でき、ライブラリがプロバイダーのレスポンスを検証するため、関数呼び出しのワークフローが容易になります。
- コストと使用量の追跡 – すべてのレスポンスにはトークン数と最善を尽くしたUSDコストの推定値が含まれ、さらにOpenTelemetryやその他の観測スタックに接続できるテレメトリイベントも備わっています。
コアコンセプト(クイックチートシート)
| コンセプト | 内容 | 一般的な用途 |
|---|---|---|
| Model spec | プロバイダーとモデルIDを特定する文字列、タプル、または%LLMDB.Model{}(例: "openai:gpt-4o")。 |
呼び出すモデルの選択。 |
| Context | ReqLLM.Context.*で構築されたシステム/ユーザー/アシスタントメッセージのリスト。 |
マルチターンの会話履歴の提供。 |
| Output descriptor | 期待される形式(テキスト、オブジェクト、配列、JSONスキーマなど)を宣言するReqLLM.Output構造体。 |
モデルに構造化データの返却を要求する。 |
| Response structs | ReqLLM.Response、ReqLLM.StreamResponse、ReqLLM.Usage。 |
生成されたテキスト、画像、埋め込み、使用量、コストの確認。 |
| Provider transports | 内部的にReqがHTTPリクエストを構築し、Finchがストリーミングを処理します。 | ReqやFinchを直接呼び出す必要はありません。 |
| Key management | ReqLLM.Keysが環境変数、.envファイル、またはメモリ内ストレージからAPIキーを取得します。 |
認証情報をコードから分離する。 |
はじめに(最短ルート)
# Igniter経由でライブラリを追加(推奨)
mix igniter.install req_llm
# コード内での使用例
model = "anthropic:claude-haiku-4-5"
# シンプルなワンショットテキスト生成
text = ReqLLM.generate_text!(model, "Hello world")
# => "Hello! How can I assist you today?"
# 構造化オブジェクト生成
schema = [name: [type: :string, required: true], age: [type: :pos_integer]]
person = ReqLLM.generate_object!(model, "Generate a person", schema)
# => %{name: "John Doe", age: 30}
ストリーミングの場合:
{:ok, resp} = ReqLLM.stream_text(model, "Write a short story")
ReqLLM.StreamResponse.tokens(resp) |> Stream.each(&IO.write/1) |> Stream.run()
深掘りする価値のある注目機能
- プロバイダー固有のオプション – 例:
provider_options: [web_search: %{max_uses: 5}]はAnthropicのウェブ検索ツールを有効にします。 - 埋め込み(Embedding)生成 – プロバイダーがサポートしている場合、
Embedding.generate/3が単一またはバッチの埋め込みを返します。 - OpenAIリアルタイムセッション – 新しいリアルタイムモデルのための低レベルWebSocket API (
ReqLLM.OpenAI.Realtime)。 - Telemetry – 組み込みのTelemetryイベント (
[:req_llm, :request, …],[:req_llm, :token_usage]) と、完全なトレーシングのためのオプションのOpenTelemetryアタッチメント。 - 拡張可能なモデルレジストリ – 完全なスペックマップを渡し、
ReqLLM.model!/1で正規化することで、カタログにまだないモデルを呼び出すことができます。
どのような人におすすめか?
- Elixir開発者 – チャットボット、エージェント、またはあらゆるGenAI駆動型サービスを構築しており、数十のプロバイダーSDKを使い分ける代わりに、単一の慣習的なクライアントを求めている方。
- チーム – コストの可視化や構造化出力の検証を、標準機能として必要としているチーム。
- Ops / 観測担当者 – 請求ダッシュボード用に、すぐに使えるTelemetryフックを必要としている方。
詳細はこちら
- Hexパッケージページ – https://hex.pm/packages/req_llm
- フルドキュメント – https://hexdocs.pm/req_llm/
- プロバイダーガイド – リポジトリの
guides/を参照(例:guides/openai.md)。 - Discordコミュニティ – https://jido.run/discord (The Swarm: Elixir AI Collective)。
要約 (TL;DR)
ReqLLMは、単一のElixir APIで数百のLLMモデル(テキスト、埋め込み、画像、音声、OCRなど)を呼び出す手段を提供し、ストリーミング、構造化出力、コスト追跡、Telemetryが組み込まれています。各プロバイダーの癖を抽象化し、プロンプトと必要なデータに集中できるようにします。
関連
- プロジェクト
- プロジェクト
- プロジェクト
- プロジェクト
- プロジェクト