OpenAI C++ 库
一个轻量级的仅头文件的现代 C++ 库
OpenAI-C++ 库是一个 社区维护 的库,提供从用 C++ 语言编写的应用程序访问 OpenAI API 的便利。
该库很小,只有两个头文件(如果你已经使用 Nlohmann Json,则只有一个)。
要求
没有特别的要求。你应该已经有以下这些:
OpenAI C++ 当前实现
该库应该实现 OpenAI 参考上的所有请求。如果有任何遗漏(由于更新),请随时打开问题。
API 参考 | 方法 | 示例文件 |
---|---|---|
API 模型 | 列出模型 ✅ | 1-model.cpp |
API 模型 | 检索模型 ✅ | 1-model.cpp |
API 完成 | 创建完成 ✅ | 2-completion.cpp |
API 编辑 | 创建完成 | 3-edit.cpp |
API 图像 | 创建图像 ✅ | 4-image.cpp |
API 图像 | 创建图像编辑 ✅ | 4-image.cpp |
API 图像 | 创建图像变体 ✅ | 4-image.cpp |
API 嵌入 | 创建嵌入 ✅ | 5-embedding.cpp |
API 文件 | 列出文件 ✅ | 6-file.cpp |
API 文件 | 上传文件 ✅ | 6-file.cpp |
API 文件 | 删除文件 ✅ | 6-file.cpp |
API 文件 | 检索文件 ✅ | 6-file.cpp |
API 文件 | 检索文件内容 ✅ | 6-file.cpp |
API 微调 | 创建微调 ✅ | 7-fine-tune.cpp |
API 微调 | 列出微调 ✅ | 7-fine-tune.cpp |
API 微调 | 检索微调 ✅ | 7-fine-tune.cpp |
API 微调 | 取消微调 ✅ | 7-fine-tune.cpp |
API 微调 | 列出微调事件 ✅ | 7-fine-tune.cpp |
API 微调 | 删除微调模型 ✅ | 7-fine-tune.cpp |
API 聊天 | 创建聊天完成 ✅ | 10-chat.cpp |
API 音频 | 创建转录 ✅ | 11-audio.cpp |
API 音频 | 创建翻译 ✅ | 11-audio.cpp |
API 审核 | 创建审核 ✅ | 12-moderation.cpp |
安装
该库包括两个文件:include/openai/openai.hpp 和 include/openai/nlohmann/json.hpp。
只需将 include/openaicpp 文件夹复制到你的项目中,你就可以在代码中使用 #include "openai.hpp"
。就这么简单。
注意:OpenAI-CPP 使用 Nlohmann Json,它在
include/json.hpp
中可用。可以使用自己的副本以加快编译时间。
使用
简单展示
该库需要配置你账号的密钥,你可以在网站上找到它。推荐在使用库之前设置 OPENAI_API_KEY
环境变量(或者你可以直接在代码中设置 API 密钥):
export OPENAI_API_KEY='sk-...'
以下代码可以在 examples/00-showcase.cpp 中找到。
#include "openai.hpp"
#include <iostream>
int main() {
openai::start(); // 将使用由 `OPENAI_API_KEY` 环境变量提供的 API 密钥
// openai::start("your_API_key", "optional_organization"); // 或者你可以自己处理
auto completion = openai::completion().create(R"({
"model": "text-davinci-003",
"prompt": "Say this is a test",
"max_tokens": 7,
"temperature": 0
})"_json); // 使用用户定义的(原始)字符串字面量
std::cout << "响应是:\n" << completion.dump(2) << '\n';
auto image = openai::image().create({
{ "prompt", "A cute koala playing the violin"},
{ "n", 1 },
{ "size", "512x512" }
}); // 使用初始化列表
std::cout << "图像 URL 是: " << image["data"][0]["url"] << '\n';
}
收到的输出如下:
>> 请求:https://api.openai.com/v1/completions {"max_tokens":7,"model":"text-davinci-003","prompt":"说这是一场测试","temperature":0}
响应是:
{
"choices": [
{
"finish_reason": "长度",
"index": 0,
"logprobs": null,
"text": "\n\n这确实是一场测试"
}
],
"created": 1674121840,
"id": "cmpl-6aLr6jPhtxpLyu9rNsJFKDHU3SHpe",
"model": "text-davinci-003",
"object": "text_completion",
"usage": {
"completion_tokens": 7,
"prompt_tokens": 5,
"total_tokens": 12
}
}
>> 请求:https://api.openai.com/v1/images/generations {"n":1,"prompt":"一只可爱的考拉正在拉小提琴","size":"512x512"}
图片URL为:"https://oaidalleapiprodscus.blob.core.windows.net/private/org-WaIMDdGHNwJiXAmjegDHE6AM/user-bCrYDjR21ly46316ZbdgqvKf/img-sysAePXF2c8yu28AIoZLLmEG.png?st=2023-01-19T20%3A35%3A19Z&se=2023-01-19T22%3A35%3A19Z&sp=r&sv=2021-08-06&sr=b&rscd=inline&rsct=image/png&skoid=6aaadede-4fb3-4698-a8f6-684d7786b067&sktid=a48cca56-e6da-484e-a814-9c849652bcb3&skt=2023-01-19T18%3A10%3A41Z&ske=2023-01-20T18%3A10%3A41Z&sks=b&skv=2021-08-06&sig=nWkcGTTCsWigHHocYP%2BsyiV5FJL6izpAe3OVvX1GLuI%3D"
由于Openai::Json
是一个nlohmann::json的类型定义,因此您可以获得后者提供的所有功能(转换、类似STL的访问等)。
构建示例
mkdir build && cd build
cmake .. && make
examples/[whatever]
在您的项目中,如果您希望获得类似运行示例时的详细输出,可以定义#define OPENAI_VERBOSE_OUTPUT
。
高级用法
关于错误处理的一句话
默认情况下,如果curl请求未成功,OpenAI-CPP将抛出运行时错误异常。您可以按照自己的方式处理这些异常。
您可以通过设置setThrowException(false)
来防止抛出异常(请参阅examples/09-instances.cpp中的示例)。如果您这样做,将显示警告。
更多控制
您可以使用openai::post()
或openai::get()
方法来完全控制您发送的内容(例如,当OpenAI API提供的新方法尚未由OpenAI-CPP
提供时,这可能会很有用)。
管理OpenAI-CPP实例
以下是两种保持OpenAI-CPP会话在程序中保持活跃的方法,以便您可以随时随地使用它。
使用默认实例()
这是默认行为。OpenAI-CPP提供免费便捷的功能:openai::start(const std::string& token)
和openai::instance()
。
使用以下命令初始化和配置OpenAI-CPP实例:
auto& openai = openai::start();
当您处于另一个范围并且丢失了openai
引用时,您可以使用:
auto& openai = openai::instance();
这可能不是推荐的方法,但由于我们通常只希望处理一个OpenAI实例(一个令牌),这种方法非常方便。
如果您想管理多个密钥,请按引用传递
另一种方法是按引用传递OpenAI实例,存储它,并在需要时调用相应的方法。
void bar(openai::OpenAI& openai) {
openai.completion.create({
{"model", "text-davinci-003"},
{"prompt", "调用bar()函数"}
});
}
int main() {
openai::OpenAI openai_instance{"your_api_key"};
bar(openai_instance);
}
您可以使用std::reference_wrapper,如examples/09-instances.cpp所示。
如果您需要管理多个具有不同密钥的OpenAI-CPP实例,这种策略非常有用。
疑难解答
Windows上的Libcurl
注意:如果您使用的是WSL,则不受以下情况影响。
自版本1804起,Windows 10捆绑包含curl工具
但是,您在处理libcurl时可能仍会遇到困难,CMake会抛出Could NOT find CURL (missing: CURL_LIBRARY CURL_INCLUDE_DIR)
。
您可以尝试按照Curl在Windows上安装Curl提出的两种方式之一进行操作。
解决此问题的另一种方法是获取适用于Windows的curl版本here,并将include
的内容复制到PATH中可见的适当文件夹下(例如在Git安装中的[...]/Git/mingw64/include/
)。
您还需要从这里获取curl.lib
和libcurl.dll
文件,并将它们复制到适当的文件夹中(例如在Git安装中的[...]/Git/mingw64/lib/
)。
mkdir build && cd build
cmake .. -DCMAKE_GENERATOR_PLATFORM=x64
cmake --build .
cmake --build . --target 00-showcase # 对于特定目标
或者,如果您更喜欢在Windows上使用GNU GCC
cmake -G "MSYS Makefiles" -D CMAKE_CXX_COMPILER=g++ ..
make
许可
致谢
这项工作主要受到slacking和cpr的curl wrapper代码的启发。
赞助商