53 个版本 (5 个破坏性更新)
0.6.0 | 2024 年 8 月 15 日 |
---|---|
0.5.5 | 2024 年 7 月 25 日 |
0.4.5 | 2024 年 2 月 12 日 |
0.3.7 | 2023 年 12 月 22 日 |
0.1.8 | 2023 年 3 月 31 日 |
#17 在 机器学习 中排名
每月下载 1,467 次
265KB
4.5K SLoC
OpenAI Dive
OpenAI Dive 是一个非官方的异步 Rust 库,允许您与 OpenAI API 交互。
在 https://platform.openai.com/overview 上注册账户以获取您的 API 密钥。
[dependencies]
openai_dive = "0.6"
开始使用
use openai_dive::v1::api::Client;
let api_key = std::env::var("OPENAI_API_KEY").expect("$OPENAI_API_KEY is not set");
let client = Client::new(api_key); // or Client::new_from_env()
let result = client
.models()
.list()
.await?;
端点
聊天
给定一个包含对话的消息列表,模型将返回一个响应。
创建聊天完成
为给定的聊天对话创建模型响应。
let parameters = ChatCompletionParametersBuilder::default()
.model(Gpt4Engine::Gpt4O.to_string())
.messages(vec![
ChatMessage::User {
content: ChatMessageContent::Text("Hello!".to_string()),
name: None,
},
ChatMessage::User {
content: ChatMessageContent::Text("What is the capital of Vietnam?".to_string()),
name: None,
},
])
.response_format(ChatCompletionResponseFormat::Text)
.build()?;
let result = client
.chat()
.create(parameters)
.await?;
更多信息: 创建聊天完成
视觉
了解如何使用视觉功能来理解图像。
let parameters = ChatCompletionParametersBuilder::default()
.model(Gpt4Engine::Gpt4O.to_string())
.messages(vec![
ChatMessage::User {
content: ChatMessageContent::Text("What is in this image?".to_string()),
name: None,
},
ChatMessage::User {
content: ChatMessageContent::ImageUrl(vec![ImageUrl {
r#type: "image_url".to_string(),
text: None,
image_url: ImageUrlType {
url: "https://images.unsplash.com/photo-1526682847805-721837c3f83b?w=640"
.to_string(),
detail: None,
},
}]),
name: None,
},
])
.max_tokens(50u32)
.build()?;
let result = client
.chat()
.create(parameters)
.await?;
更多信息: 视觉
函数调用
在 API 调用中,您可以描述函数,并让模型智能地选择输出一个包含调用一个或多个函数的参数的 JSON 对象。Chat Completions API 不会调用函数;相反,模型生成您可以在代码中调用的 JSON。
let messages = vec![ChatMessage::User {
content: ChatMessageContent::Text(
"Give me a random number higher than 100 but less than 2*150?".to_string(),
),
name: None,
}];
let parameters = ChatCompletionParametersBuilder::default()
.model(Gpt4Engine::Gpt4O.to_string())
.messages(messages)
.tools(vec![ChatCompletionTool {
r#type: ChatCompletionToolType::Function,
function: ChatCompletionFunction {
name: "get_random_number".to_string(),
description: Some("Get a random number between two values".to_string()),
parameters: json!({
"type": "object",
"properties": {
"min": {"type": "integer", "description": "Minimum value of the random number."},
"max": {"type": "integer", "description": "Maximum value of the random number."},
},
"required": ["min", "max"],
}),
},
}])
.build()?;
let result = client
.chat()
.create(parameters)
.await?;
let message = result.choices[0].message.clone();
if let ChatMessage::Assistant {
tool_calls: Some(tool_calls),
..
} = message
{
for tool_call in tool_calls {
let name = tool_call.function.name;
let arguments = tool_call.function.arguments;
if name == "get_random_number" {
let random_numbers: RandomNumber = serde_json::from_str(&arguments).unwrap();
println!("Min: {:?}", &random_numbers.min);
println!("Max: {:?}", &random_numbers.max);
let random_number_result = get_random_number(random_numbers);
println!(
"Random number between those numbers: {:?}",
random_number_result.clone()
);
}
}
}
#[derive(Serialize, Deserialize)]
pub struct RandomNumber {
min: u32,
max: u32,
}
fn get_random_number(params: RandomNumber) -> Value {
let random_number = rand::thread_rng().gen_range(params.min..params.max);
random_number.into()
}
更多信息: 函数调用
结构化输出
结构化输出是一个功能,保证模型始终生成遵循您提供的 JSON Schema 的响应,因此您无需担心模型省略必需键或产生无效枚举值。
let parameters = ChatCompletionParametersBuilder::default()
.model("gpt-4o-2024-08-06")
.messages(vec![
ChatMessage::System {
content: ChatMessageContent::Text(
"You are a helpful math tutor. Guide the user through the solution step by step."
.to_string(),
),
name: None,
},
ChatMessage::User {
content: ChatMessageContent::Text(
"How can I solve 8x + 7 = -23"
.to_string(),
),
name: None,
},
])
.response_format(ChatCompletionResponseFormat::JsonSchema(JsonSchemaBuilder::default()
.name("math_reasoning")
.schema(serde_json::json!({
"type": "object",
"properties": {
"steps": {
"type": "array",
"items": {
"type": "object",
"properties": {
"explanation": { "type": "string" },
"output": { "type": "string" }
},
"required": ["explanation", "output"],
"additionalProperties": false
}
},
"final_answer": { "type": "string" }
},
"required": ["steps", "final_answer"],
"additionalProperties": false
}))
.strict(true)
.build()?
))
.build()?;
let result = client.chat().create(parameters).await?;
更多信息: 结构化输出
图像
给定一个提示和/或输入图像,模型将生成一个新的图像。
创建图像
根据提示创建图像。
let parameters = CreateImageParametersBuilder::default()
.prompt("A cute dog in the park")
.model(DallEEngine::DallE3.to_string())
.n(1u32)
.quality(ImageQuality::Standard)
.response_format(ResponseFormat::Url)
.size(ImageSize::Size1024X1024)
.style(ImageStyle::Natural)
.build()?;
let result = client
.images()
.create(parameters)
.await?;
let paths = result
.save("./images")
.await?;
更多信息: 创建图像
创建图像编辑
根据原始图像和提示创建编辑或扩展的图像。
let parameters = EditImageParametersBuilder::default()
.image(FileUpload::File(
"./images/image_edit_original.png".to_string(),
))
.prompt("A cute baby sea otter")
.mask(FileUpload::File("./images/image_edit_mask.png".to_string()))
.n(1u32)
.size(ImageSize::Size512X512)
.build()?;
let result = client
.images()
.edit(parameters)
.await?;
更多信息: 创建图像编辑
创建图像变体
创建给定图像的变体。
let parameters = CreateImageVariationParametersBuilder::default()
.image(FileUpload::File(
"./images/image_edit_original.png".to_string(),
))
.n(1u32)
.size(ImageSize::Size256X256)
.build()?;
let result = client
.images()
.variation(parameters)
.await?;
更多信息: 创建图像变体
音频
学习如何将音频转换为文本或将文本转换为音频。
创建语音
从输入文本生成音频。
let parameters = AudioSpeechParametersBuilder::default()
.model(TTSEngine::Tts1.to_string())
.input("Hallo, this is a test from OpenAI Dive.")
.voice(AudioVoice::Alloy)
.response_format(AudioSpeechResponseFormat::Mp3)
.build()?;
let response = client
.audio()
.create_speech(parameters)
.await?;
response
.save("files/example.mp3")
.await?;
更多信息: 创建语音
创建转录
将音频转录为输入语言。
let parameters = AudioTranscriptionParametersBuilder::default()
.file(FileUpload::File("./audio/micro-machines.mp3".to_string()))
.model(WhisperEngine::Whisper1.to_string())
.response_format(AudioOutputFormat::VerboseJson)
.build()?;
let result = client
.audio()
.create_transcription(parameters)
.await?;
更多信息: 创建转录
创建翻译
将音频翻译成英语。
let parameters = AudioTranslationParametersBuilder::default()
.file(FileUpload::File("./audio/multilingual.mp3".to_string()))
.model(WhisperEngine::Whisper1.to_string())
.response_format(AudioOutputFormat::Srt)
.build()?;
let result = client
.audio()
.create_translation(parameters)
.await?;
更多信息: 创建翻译
模型
列出并描述API中可用的各种模型。
更多详细信息,请参阅examples/models目录中的示例。
- 列出模型
- 检索模型
- 删除微调模型
更多信息 模型
文件
文件用于上传可由助手、微调和批量API等特性使用的文档。
更多详细信息,请参阅examples/files目录中的示例。
- 列出文件
- 上传文件
- 删除文件
- 检索文件
- 检索文件内容
更多信息 文件
嵌入
获取给定输入的向量表示,这些表示可以轻松被机器学习模型和算法消费。
更多详细信息,请参阅examples/embeddings目录中的示例。
- 创建嵌入
更多信息: 嵌入
审查
给定一些输入文本,输出模型是否将其归类为多个类别中的潜在有害内容。
更多详细信息,请参阅examples/moderation目录中的示例。
- 创建内容审查
更多信息 内容审查
上传
创建一个中间的Upload对象,你可以向其中添加部分。目前,Upload最多可以接受总共8 GB的数据,创建后一小时后过期。
一旦你完成上传,我们将创建一个包含你上传的所有部分的File对象。这个File可以作为普通File对象在我们平台的其他部分使用。
更多详细信息,请参阅examples/uploads目录中的示例。
- 创建上传
- 添加上传部分
- 完成上传
- 取消上传
更多信息 上传
微调
管理微调作业以调整模型以适应你的特定训练数据。
更多详细信息,请参阅examples/fine_tuning目录中的示例。
- 创建微调作业
- 列出微调作业
- 检索微调作业
- 取消微调作业
- 列出微调事件
- 列出微调检查点
更多信息 微调
批次
创建大量API请求的批处理,以便进行异步处理。批量API在24小时内返回完成,并获得50%的折扣。
更多信息请参阅examples/batches目录中的示例。
- 创建批次
- 列出批次
- 检索批次
- 取消批次
更多信息请参阅批次
助手
构建可以调用模型并使用工具执行任务的助手。
更多信息请参阅examples/assistants目录中的示例。
- 助手
- 线程
- 消息
- 运行
- 运行步骤
更多信息请参阅助手
管理
通过编程方式管理您的组织。
更多信息请参阅examples/administration目录中的示例。
- 用户
- 邀请
- 项目
- 项目用户
- 项目服务账户
- 项目API密钥
配置
设置 API 密钥
将OpenAI API密钥添加到您的环境变量中。
# Windows PowerShell
$Env:OPENAI_API_KEY='sk-...'
# Windows cmd
set OPENAI_API_KEY=sk-...
# Linux/macOS
export OPENAI_API_KEY='sk-...'
设置组织/项目ID
您可以在OpenAI平台上创建多个组织和项目。这允许您对文件、微调模型和其他资源进行分组。
您可以通过调用set_organization
和set_project
方法在客户端上设置组织ID和/或项目ID。如果您未设置组织ID和/或项目ID,客户端将使用默认组织和默认项目。
let mut client = Client::new(api_key);
client
.set_organization("org-XXX")
.set_project("proj_XXX");
添加代理
此crate使用reqwest
作为HTTP客户端。Reqwest默认启用代理。您可以通过系统环境变量或覆盖默认客户端来设置代理。
示例:设置系统环境变量
您可以在系统环境变量中设置代理(https://docs.rs/reqwest/latest/reqwest/#proxies)。
export HTTPS_PROXY=socks5://127.0.0.1:1086
示例:覆盖默认客户端
use openai_dive::v1::api::Client;
let http_client = reqwest::Client::builder()
.proxy(reqwest::Proxy::https("socks5://127.0.0.1:1086")?)
.build()?;
let api_key = std::env::var("OPENAI_API_KEY").expect("$OPENAI_API_KEY is not set");
let client = Client {
http_client,
base_url: "https://api.openai.com/v1".to_string(),
api_key,
headers: None,
organization: None,
project: None,
};
可用模型
您可以使用这些预定义常量在参数中设置模型,或使用任何字符串表示形式(例如,用于您的自定义模型)。
- Gpt4Engine
- Gpt4O
gpt-4o
(别名) - Gpt4OMini
gpt-4o-mini
(别名) - Gpt4
gpt-4
(别名) - Gpt4Turbo
gpt-4-turbo
(别名) - Gpt4TurboPreview
gpt-4-turbo-preview
(别名)
- Gpt4O
- Gpt35Engine
- Gpt35Turbo
gpt-3.5-turbo
(别名) - Gpt35Turbo1106
gpt-3.5-turbo-1106
- Gpt35Turbo
- DallEEngine
- DallE3
dall-e-2
- DallE2
dall-e-3
- DallE3
- TTSEngine
- Tts1
tts-1
- Tts1HD
tts-1-hd
- Tts1
- WhisperEngine
- Whisper1
whisper-1
- Whisper1
- EmbeddingsEngine
- TextEmbedding3Small
text-embedding-3-small
- TextEmbedding3Large
text-embedding-3-large
- TextEmbeddingAda002
text-embedding-ada-002
- TextEmbedding3Small
- ModerationsEngine
- TextModerationLatest
text-moderation-latest
(别名) - TextModerationStable
text-moderation-stable
(别名) - TextModeration007
text-moderation-007
- TextModerationLatest
更多信息:模型
依赖项
~7-20MB
~313K SLoC