#openai-api #openai #chat-completion #ChatGPT #ai #async #async-api

openai_dive

OpenAI Dive 是一个非官方的异步 Rust 库,允许您与 OpenAI API 交互。

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机器学习 中排名

Download history 134/week @ 2024-05-05 366/week @ 2024-05-12 271/week @ 2024-05-19 536/week @ 2024-05-26 869/week @ 2024-06-02 707/week @ 2024-06-09 820/week @ 2024-06-16 230/week @ 2024-06-23 273/week @ 2024-06-30 257/week @ 2024-07-07 462/week @ 2024-07-14 722/week @ 2024-07-21 250/week @ 2024-07-28 590/week @ 2024-08-04 376/week @ 2024-08-11 219/week @ 2024-08-18

每月下载 1,467

MIT 许可证

265KB
4.5K SLoC

OpenAI Dive

crates.io cargo build docs.rs crates.io

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_organizationset_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(别名)
  • Gpt35Engine
    • Gpt35Turbo gpt-3.5-turbo(别名)
    • Gpt35Turbo1106 gpt-3.5-turbo-1106
  • DallEEngine
    • DallE3 dall-e-2
    • DallE2 dall-e-3
  • TTSEngine
    • Tts1 tts-1
    • Tts1HD tts-1-hd
  • WhisperEngine
    • Whisper1 whisper-1
  • EmbeddingsEngine
    • TextEmbedding3Small text-embedding-3-small
    • TextEmbedding3Large text-embedding-3-large
    • TextEmbeddingAda002 text-embedding-ada-002
  • ModerationsEngine
    • TextModerationLatest text-moderation-latest(别名)
    • TextModerationStable text-moderation-stable(别名)
    • TextModeration007 text-moderation-007

更多信息:模型

依赖项

~7-20MB
~313K SLoC