#openai-api #openai #client #api-client #web #api #chat-completion

openai-req

OpenAI API 客户端,使用 reqwest 和 tokio 编写

3 个稳定版本

2.0.1 2023年3月22日
1.0.1 2023年3月22日

#1878 in 网页编程

46 每月下载次数

MIT 许可证

86KB
2K SLoC

openai-req

使用 tokio 和 reqwest 实现的 OpenAI API 客户端。请参考仓库中的测试文件夹或代码注释以获取用法示例。

用法。

  • 导入库

    [dependencies]
    openai-req="2"
    
  • 首先,您需要构建客户端。最小客户端只需要 API 密钥。以下是从 toml 文件中读取密钥的简单示例。

    假设您有一个在 key.toml 文件中的密钥,如下所示

    key = "{YOUR_KEY}"
    

    构造客户端的函数,通过读取 key.toml 将如下所示

       #[derive(Deserialize)]
       struct Config{
           key: String
       }
       
       fn get_client() -> OpenAiClient{
           let key_config=
               fs::read_to_string("key.toml")
                   .expect("failed reading config file");
           let openai:Config =
               toml::from_str(&key_config)
                   .expect("can't parse config file");
       
           return  OpenAiClient::new(&openai.key);
       }
    
  • 接下来,您通常构造 Request 结构,并触发 run 方法,将其传递给客户端引用。以下是一个聊天完成的示例

    async fn chat() -> Result<ChatSuccess,anyhow::Error> {
        let client = get_client();
        let messages  = vec!(Message{
          role: Role::User,
          content: "hello!".to_string(),
        });
        let chat_request = ChatRequest::new(messages);
        Ok(chat_request.run(&client).await?)
     }
    
  • 对于不接受任何参数的 GET 请求,您通常在响应类型上调用静态 get 函数。通常该类型被称为 SomethingListResponse

    async fn models() -> Result<ModelListResponse,anyhow::Error> {
      let client = get_client();
      Ok(ModelListResponse::get(&client).await?)
    }
    
  • 最后,对于下载文件的请求,请求类型将有两个方法

    asyncfn download_to_file(&self, client:&OpenAiClient,target_path:&str) -> Result<()>

    asyncfn download(&self, client:&OpenAiClient) -> Result<Pin<Box<dyn Stream<Item=Result<Bytes,reqwest::Error>>>>>

    第一个接受本地文件系统的路径,并在此处创建下载的文件。第二个只是返回异步数据流,并让您决定如何处理它。

    以下是一个示例

     async fn file_download() -> Result<(),anyhow::Error> {
        let client = get_client();
        let files = FileListResponse::get(&client).await?;
        let info = files.data.first().ok_or(anyhow!("No files available"))?;
        let download_request: FileDownloadRequest = info.clone().into();
        download_request.download_to_file(&client, "fine-tune2.json").await
     }  
    

支持的 API

  1. 模型
    • 列表
    • 检索
  2. 补全
    • 创建
  3. 聊天
    • 创建
  4. 编辑
    • 创建
  5. 图像
    • 创建
    • 创建编辑
    • 创建变体
  6. 嵌入
    • 创建
  7. 音频
    • 创建转录
    • 创建翻译
  8. 文件
    • 列表
    • 上传
    • 删除
    • 检索文件
    • 检索文件内容
  9. 微调
    • 创建微调
    • 列出微调
    • 检索微调
    • 列出微调事件
    • 删除微调模型
  10. 审核
    • 创建审核

依赖项

~8–20MB
~308K SLoC