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 – 이슈, PR 및 기여자
BIG-THANKS.md목록. - 비디오 튜토리얼 – YouTube 재생 목록에서 설정, 모델 매핑 및 새 공급자 추가를 안내합니다.
- 기능 플래그 – TLS 백엔드(
native-tls,rustls-tls,openssl-tls) 및 선택적 OpenTelemetry(otel)를 선택합니다.
TL;DR
genai는 LLM 채팅 API를 위한 Rust 우선, 공급자에 구애받지 않는 래퍼입니다. Rust 코드 하나를 작성하여 OpenAI의 GPT‑4o부터 로컬에서 실행되는 Ollama 모델까지 수십 개의 모델 중 하나에 연결하면 각 서비스의 고유한 기능을 활용하면서 일관된 응답을 얻을 수 있습니다.
관련
- 프로젝트
- 프로젝트
- 프로젝트
- 프로젝트
- 프로젝트