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 – 이슈, 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 모델까지 수십 개의 모델 중 하나에 연결하면 각 서비스의 고유한 기능을 활용하면서 일관된 응답을 얻을 수 있습니다.

관련

  • 프로젝트
  • 프로젝트
  • 프로젝트
  • 프로젝트
  • 프로젝트