#生成式 AI #OpenAI #ollama #gemini #openai-api #ChatGPT #api-client

genai

Rust 的多 AI 提供商库。 (Ollama, OpenAI, Anthropic, Groq, Gemini, ...)

22 个版本

0.1.7 2024 年 8 月 15 日
0.1.6 2024 年 7 月 27 日
0.1.1 2024 年 6 月 13 日
0.0.14 2024 年 6 月 10 日

#120 in Web 编程

Download history 658/week @ 2024-05-31 1146/week @ 2024-06-07 148/week @ 2024-06-14 37/week @ 2024-06-21 23/week @ 2024-06-28 241/week @ 2024-07-05 105/week @ 2024-07-12 455/week @ 2024-07-19 342/week @ 2024-07-26 143/week @ 2024-08-02 650/week @ 2024-08-09 675/week @ 2024-08-16

1,838 每月下载量
ait 中使用

MIT/Apache

135KB
3K SLoC

genai - Rust 的多 AI 提供商库。

目前原生支持:OllamaOpenAIAnthropicgroqGeminiCohere(更多即将到来)

Static Badge Static Badge

# cargo.toml
genai = "=0.1.7" # Version lock for `0.1.x`

该库的目的是为许多生成式 AI 提供商提供通用的、易于使用的单个 API,例如 OpenAI、Anthropic、Cohere、Ollama。

  • 重要提示 1 0.1.x 版本仍可能在补丁中包含一些重大更改,因此请确保锁定您的版本,例如,genai = "=0.1.7"。简而言之,0.1.x 可以被认为是“beta 版本”。版本 0.2.x 将更严格地遵循 semver。

  • 重要提示 2 genai 专注于标准化跨 AI 提供商的聊天完成 API,并不旨在全面代表任何特定的 AI 提供商。对于此,有如 async-openai(用于 OpenAI)和 ollama-rs(用于 Ollama)等优秀的库。

示例 | 感谢 | 库焦点 | 变更日志 | 提供商映射:ChatOptions | MetaUsage

示例

examples/c00-readme.rs

use genai::chat::{ChatMessage, ChatRequest};
use genai::chat::printer::{print_chat_stream, PrintChatStreamOptions};
use genai::Client;

const MODEL_OPENAI: &str = "gpt-4o-mini";
const MODEL_ANTHROPIC: &str = "claude-3-haiku-20240307";
const MODEL_COHERE: &str = "command-light";
const MODEL_GEMINI: &str = "gemini-1.5-flash-latest";
const MODEL_GROQ: &str = "gemma-7b-it";
const MODEL_OLLAMA: &str = "gemma:2b"; // sh: `ollama pull gemma:2b`

// NOTE: Those are the default environment keys for each AI Adapter Type.
//       Can be customized, see `examples/c02-auth.rs`
const MODEL_AND_KEY_ENV_NAME_LIST: &[(&str, &str)] = &[
    // -- de/activate models/providers
    (MODEL_OPENAI, "OPENAI_API_KEY"),
    (MODEL_ANTHROPIC, "ANTHROPIC_API_KEY"),
    (MODEL_COHERE, "COHERE_API_KEY"),
    (MODEL_GEMINI, "GEMINI_API_KEY"),
    (MODEL_GROQ, "GROQ_API_KEY"),
    (MODEL_OLLAMA, ""),
];

// NOTE: Model to AdapterKind (AI Provider) type mapping rule
//  - starts_with "gpt"      -> OpenAI
//  - starts_with "claude"   -> Anthropic
//  - starts_with "command"  -> Cohere
//  - starts_with "gemini"   -> Gemini
//  - model in Groq models   -> Groq
//  - For anything else      -> Ollama
//
// Can be customized, see `examples/c03-kind.rs`

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let question = "Why is the sky red?";

    let chat_req = ChatRequest::new(vec![
        // -- Messages (de/activate to see the differences)
        ChatMessage::system("Answer in one sentence"),
        ChatMessage::user(question),
    ]);

    let client = Client::default();

    let print_options = PrintChatStreamOptions::from_print_events(false);

    for (model, env_name) in MODEL_AND_KEY_ENV_NAME_LIST {
        // Skip if does not have the environment name set
        if !env_name.is_empty() && std::env::var(env_name).is_err() {
            println!("===== Skipping model: {model} (env var not set: {env_name})");
            continue;
        }

        let adapter_kind = client.resolve_model_iden(model)?.adapter_kind;

        println!("\n===== MODEL: {model} ({adapter_kind}) =====");

        println!("\n--- Question:\n{question}");

        println!("\n--- Answer:");
        let chat_res = client.exec_chat(model, chat_req.clone(), None).await?;
        println!("{}", chat_res.content_text_as_str().unwrap_or("NO ANSWER"));

        println!("\n--- Answer: (streaming)");
        let chat_res = client.exec_chat_stream(model, chat_req.clone(), None).await?;
        print_chat_stream(chat_res, Some(&print_options)).await?;

        println!();
    }

    Ok(())
}

更多示例

视频

  • Static Badge - genai 简介(v0.1.0)]

  • genai 代码设计

    • Static Badge(第 1/3 部分)模块、错误、构造器/构建器
    • ..即将推出..

感谢

库重点

  • 重点关注标准化主要 AI 服务的聊天补全 API。

  • 原生实现,意味着无需每个服务的 SDK。

    • 原因:尽管所有各种 API 之间有一些差异,但它们都遵循相同的模式和高层次流程和结构。在较低层管理这些差异实际上比做 sdks 翻跟头要简单且更累积。
  • 优先考虑人体工程学和共性,深度次之。(如果您需要完整的客户端 API,请考虑使用 async-openaiollama-rs;它们都是优秀且易于使用的。)

  • 最初,这个库将主要关注文本聊天 API(图像或甚至在第一阶段中的功能调用)。

  • 0.1.x 版本将工作,但 API 将在补丁版本中更改,而不是严格遵循 semver。

  • 0.2.x 版本将更严格地遵循 semver。

ChatOptions

属性 OpenAI Anthropic Ollama Groq Gemini generationConfig. Cohere
temperature temperature temperature temperature temperature temperature temperature
max_tokens max_tokens max_tokens(默认 1024) max_tokens max_tokens maxOutputTokens max_tokens
top_p top_p top_p top_p top_p topP p

MetaUsage

属性 OpenAI
usage.
Ollama
usage.
Groq x_groq.usage. Anthropic usage. Gemini usageMetadata. Cohere meta.tokens.
input_tokens prompt_tokens prompt_tokens (1) prompt_tokens input_tokens(新增) promptTokenCount (2) input_tokens
output_tokens completion_tokens completion_tokens (1) completion_tokens output_tokens(新增) candidatesTokenCount (2) output_tokens
total_tokens total_tokens total_tokens (1) completion_tokens (计算得出) totalTokenCount (2) (计算得出)

注意(1):在此阶段,由于Ollama与OpenAI兼容层的限制,Ollama在流式传输时不会发出输入/输出令牌。(参见 ollama #4448 - 通过OpenAI API进行流式传输聊天完成应支持流选项以包含使用情况

注意(2):目前,使用Gemini Stream API,每个事件的用法是否累积或需要添加并不清楚。目前,它似乎是可以累积的(即,最后一条消息包含总输入、输出和总令牌数),所以我们将以此为假设。有关更多信息,请参见可能的推文回答

关于可能方向的说明

  • 将在ChatResponse和ChatStream上添加更多数据,特别是关于使用情况的元数据。
  • 将支持将视觉/图像添加到聊天消息和响应中。
  • 将支持在聊天消息和响应中调用功能。
  • 将添加embbedembbed_batch
  • 将添加AWS Bedrock变体(例如,Mistral和Anthropic)。大部分工作将集中在“有趣的”令牌签名方案上(无需拖动大型SDK,可能是以下功能)。
  • 将添加Google VertexAI变体。
  • (可能)添加Azure OpenAI变体(尚未确定)。

依赖关系

~7–19MB
~274K SLoC