openai-czh 0.1.0

A simple OpenAI compatible API client library with streaming support
Documentation

openai-czh

一个简洁的 OpenAI 兼容 API 客户端库,使用 Rust + reqwest + tokio 实现。

特性

  • OpenAI 兼容 - 支持自定义 base_url,兼容 DeepSeek、通义千问、Ollama 等
  • 流式输出 - 支持 SSE 流式响应
  • 多模态 - 支持图片理解(Vision)
  • 思考过程 - 支持 reasoning_content 输出模型推理过程
  • Builder 模式 - 链式构建请求,简洁易用
  • 持续对话 - 支持追加消息,实现多轮对话

安装

[dependencies]
openai-czh = "0.1.0"

快速开始

环境配置

export OPEN_AI_KEY=your_api_key
export OPEN_AI_BASE_URL=https://api.openai.com/v1  # 可选,默认 OpenAI

基础用法

use openai_czh::openai::{ChatCompletionRequest, OpenAIClient};

#[tokio::main]
async fn main() {
    // 从环境变量创建客户端
    let client = OpenAIClient::from_env().expect("Failed to create client");

    // 构建请求
    let request = ChatCompletionRequest::builder()
        .model("gpt-4o")
        .system_message("You are a helpful assistant.")
        .user_message("Hello!")
        .build()
        .expect("Failed to build request");

    // 发送请求
    let response = client.chat(&request).await.expect("Request failed");

    for choice in response.choices {
        if let openai_czh::openai::MessageContent::Text(content) = choice.message.content {
            println!("Assistant: {}", content);
        }
    }
}

流式输出

use futures::StreamExt;

let request = ChatCompletionRequest::builder()
    .model("gpt-4o")
    .user_message("Tell me a story")
    .stream(true)  // 启用流式
    .build()?;

let mut stream = client.chat_stream(&request).await?;

while let Some(result) = stream.next().await {
    match result {
        Ok(chunk) => {
            for choice in &chunk.choices {
                if let Some(content) = &choice.delta.content {
                    print!("{}", content);
                }
            }
        }
        Err(e) => eprintln!("Error: {}", e),
    }
}

持续对话

let mut request = ChatCompletionRequest::builder()
    .model("gpt-4o")
    .system_message("You are a helpful assistant.")
    .stream(true)
    .build()?;

// 第一轮对话
request.add_user_message("What is 2 + 2?");
// ... 发送请求并获取回复
request.add_assistant_message("2 + 2 equals 4.");

// 第二轮对话
request.add_user_message("What about 3 + 3?");
// ... 继续对话

多模态(图片理解)

use openai_czh::openai::{ContentPart, Message};

let messages = vec![
    Message::user_multimodal(vec![
        ContentPart::text("What's in this image?"),
        ContentPart::image_url("https://example.com/image.jpg"),
        // 或使用 base64
        // ContentPart::image_url("data:image/jpeg;base64,..."),
    ]),
];

let request = ChatCompletionRequest::builder()
    .model("gpt-4o")  // 需要支持视觉的模型
    .messages(messages)
    .stream(true)
    .build()?;

自定义 API 服务

// DeepSeek
let client = OpenAIClient::builder(api_key)
    .base_url("https://api.deepseek.com/v1")
    .build();

// 通义千问
let client = OpenAIClient::builder(api_key)
    .base_url("https://dashscope.aliyuncs.com/compatible-mode/v1")
    .build();

// Ollama 本地
let client = OpenAIClient::builder("ollama")
    .base_url("http://localhost:11434/v1")
    .build();

示例

运行示例:

# CLI 对话
cargo run --example chat_cli

# 图片理解
cargo run --example vision_stream

API 参考

OpenAIClient

方法 说明
from_env() 从环境变量创建客户端
new(api_key) 使用 API key 创建客户端
builder(api_key) 创建客户端构建器
chat(&request) 发送普通请求
chat_stream(&request) 发送流式请求

ChatCompletionRequestBuilder

方法 说明
model(model) 设置模型
messages(messages) 设置消息列表
system_message(content) 添加系统消息
user_message(content) 添加用户消息
assistant_message(content) 添加助手消息
stream(bool) 设置是否流式
temperature(f32) 设置温度
max_tokens(u32) 设置最大 token
build() 构建请求

ChatCompletionRequest

方法 说明
add_user_message(&mut self, content) 追加用户消息
add_assistant_message(&mut self, content) 追加助手消息
add_system_message(&mut self, content) 追加系统消息

License

MIT