#openai #ollama #gemini #generative-ai #ChatGPT #openai-api #api-client

genai-custom

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

1 个不稳定版本

0.1.0 2024 年 8 月 13 日

#309 in Web 编程

Download history 174/week @ 2024-08-12

174 每月下载次数

MIT/Apache

135KB
3K SLoC

genai - Rust 多 AI 提供商库。

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

Static Badge Static Badge

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

此库的目的是为许多生成式 AI 提供商,如 OpenAI,Anthropic,Cohere,Ollama,提供一个通用且易用的单 API。

  • 重要提示 1 0.1.x 仍将在补丁中包含一些破坏性更改,因此请确保 锁定 您的版本,例如,genai = "=0.1.6"。简而言之,0.1.x 可以被视为“测试版”。版本 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_info(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部分)模块、错误、构造函数/构建器
    • ..即将推出..

感谢

库重点

  • 专注于标准化主要人工智能服务的聊天完成 API。

  • 本地实现,意味着没有针对每个服务的 SDK。

    • 原因:虽然所有各种 API 之间有一些差异,但它们都遵循相同的模式和高级流程以及结构。在较低层管理这些差异实际上比进行 SDK 锻炼更简单、更累积。
  • 优先考虑人体工程学和共性,深度是次要的。(如果您需要完整的客户端 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