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 编程
1,838 每月下载量
在 ait 中使用
135KB
3K SLoC
genai - Rust 的多 AI 提供商库。
目前原生支持:Ollama,OpenAI,Anthropic,groq,Gemini,Cohere(更多即将到来)
# 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
示例
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(())
}
更多示例
- 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补全
库重点
-
重点关注标准化主要 AI 服务的聊天补全 API。
-
原生实现,意味着无需每个服务的 SDK。
- 原因:尽管所有各种 API 之间有一些差异,但它们都遵循相同的模式和高层次流程和结构。在较低层管理这些差异实际上比做 sdks 翻跟头要简单且更累积。
-
优先考虑人体工程学和共性,深度次之。(如果您需要完整的客户端 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