1 个不稳定版本
0.1.0 | 2024 年 8 月 13 日 |
---|
#309 in Web 编程
174 每月下载次数
135KB
3K SLoC
genai - Rust 多 AI 提供商库。
目前原生支持: Ollama,OpenAI,Anthropic,groq,Gemini,Cohere(更多即将到来)
# 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
示例
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(())
}
更多示例
- examples/c00-readme.rs - 多个提供者和流式处理的快速概述代码。
- examples/c01-conv.rs - 展示如何构建会话流程。
- examples/c02-auth.rs - 展示如何为每种适配器类型提供自定义的
AuthResolver
来提供认证数据(例如,用于 api_key)。 - examples/c03-kind.rs - 展示如何提供自定义的
AdapterKindResolver
来自定义“模型名称”到“适配器类型”的映射。 - examples/c04-chat-options.rs - 展示如何在客户端级别(对所有请求)和请求级别设置聊天生成选项,如
temperature
和max_tokens
。 - examples/c05-model-names.rs - 展示如何按 AdapterKind 获取模型名称。
视频
感谢
- 感谢 @stargazing-dino 对 PR #2 的贡献 - 实现 groq 补全
库重点
-
专注于标准化主要人工智能服务的聊天完成 API。
-
本地实现,意味着没有针对每个服务的 SDK。
- 原因:虽然所有各种 API 之间有一些差异,但它们都遵循相同的模式和高级流程以及结构。在较低层管理这些差异实际上比进行 SDK 锻炼更简单、更累积。
-
优先考虑人体工程学和共性,深度是次要的。(如果您需要完整的客户端 API,请考虑使用 async-openai 和 ollama-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
属性 | OpenAIusage. |
Ollamausage. |
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上添加更多数据,特别是关于使用情况的元数据。
- 为聊天消息和响应添加视觉/图像支持。
- 为聊天消息和响应添加功能调用支持。
- 添加
embbed
和embbed_batch
- 添加AWS Bedrock变体(例如,Mistral和Anthropic)。大部分工作将集中在“有趣的”令牌签名方案上(无需拖动大型SDK,可能是以下功能)。
- 添加Google VertexAI变体。
- (可能)添加Azure OpenAI变体(尚未确定)。
链接
- crates.io:crates.io/crates/genai
- GitHub:github.com/jeremychone/rust-genai
- 由BriteSnow(Jeremy Chones的咨询公司)赞助
依赖关系
~7–19MB
~274K SLoC