先给出github的C++的openai开源网址:https://github.com/D7EAD/liboai
一、介绍
liboai
是一个简单的非官方 C++17 库,用于 OpenAI API。它允许开发人员通过一组简单的方法和类访问 OpenAI 端点。该库最有效地被认为是 OpenAI Python 库的精神移植,简称 openai
,由于其类似的结构 - 除了少数例外。
涉及的内容还挺多,
- ChatGPT
- Audio
- Image DALL·E 图像 DALL·E
- Models
- Completions
- Edit
- Embeddings
- Files
- Fine-tunes
- Moderation
- Asynchronous Support 异步支持
二、用法
liboai
和其Python替代方案在风格上有多相似。
Python中的DALL-E生成。
import openai import os openai.api_key = os.getenv("OPENAI_API_KEY") response = openai.Image.create( prompt="A snake in the grass!", n=1, size="256x256" ) print(response["data"][0]["url"])
#include "liboai.h" using namespace liboai; int main() { OpenAI oai; oai.auth.SetKeyEnv("OPENAI_API_KEY"); Response res = oai.Image->create( "A snake in the grass!", 1, "256x256" ); std::cout << res["data"][0]["url"] << std::endl; }
运行以上代码将打印出生成图像的 URL,该图像可能与下面找到的图像相似,也可能不相似。
请记住,上述的C++示例是一个最小的示例,不是一个安全的异常代码片段。请查看文档以获取更详细和安全的异常代码片段。
三、依赖部分
为了使库按照其所做的方式工作,它依赖于两个主要的依赖项。这些依赖项可以在下面列出。
如果使用提供的解决方案构建库,则建议使用vcpkg安装这些依赖项。
四、文档
为了理解如何使用库的每个组件,最好先了解整个库的基本结构。在项目中使用 liboai
时,应该只包含一个头文件 liboai.h
。该头文件提供了与库的所有其他组件的接口,例如 Images
, Completions
等。
Correct | Incorrect |
---|---|
#include "liboai.h" int main() { ... } |
#include "fine_tunes.h" #include "models.h" // etc... int main() { ... } |
一旦我们已经正确地包含了必要的头文件以使用库——并且假设符号已经正确链接——我们可以利用 liboai.h
中的类来开始使用。在我们的源代码中的某个时刻,我们将不得不选择何时定义一个 liboai::OpenAI
对象来访问组件接口。存储在此对象中的每个组件接口都提供与其关联的方法,因此,例如,接口 Image
将具有一个方法 create(...)
以从文本生成图像。每个非异步方法都返回一个包含响应信息的 liboai::Response
,而异步方法则返回一个 liboai::FutureResponse
。但是,在我们开始使用这些方法之前,我们必须首先设置我们的授权信息——否则它将无法工作!
liboai::OpenAI
还包含另一个重要成员,授权成员,用于在调用 API 方法之前设置授权信息(例如 API 密钥和组织 ID)。有关在 liboai::Authorization
中找到的其他成员的更多信息,请参阅github的 authorization 文件夹。
Correct | Incorrect |
---|---|
#include "liboai.h" using namespace liboai; int main() { OpenAI oai; // Set our API key using an environment variable. // This is recommended as hard-coding API keys is // insecure. if (oai.auth.SetKeyEnv("OPENAI_API_KEY")) { Response response = oai.Image->create( "a siamese cat!" ); } ... } |
#include "liboai.h" using namespace liboai; int main() { OpenAI oai; // Failure to set authorization info! // Will fail, exception will be thrown! Response response = oai.Image->create( "a siamese cat!" ); ... } |
Correct, exception-safe ❗ 🔄 |
---|
#include "liboai.h" using namespace liboai; int main() { OpenAI oai; if (oai.auth.SetKeyEnv("OPENAI_API_KEY")) { try { Response response = oai.Image->create( "a siamese cat!" ); } catch (std::exception& e) { std::cout << e.what() << std::endl; } ... } } |
现在,一旦我们使用组件接口进行了调用,我们肯定希望从中获取信息。为了做到这一点,利用我们对API响应格式的了解,我们可以使用JSON索引在 liboai::Response
对象上提取信息,例如生成的图像的URL。请参见下面的示例,其中我们打印生成的图像的URL。
Accessing JSON Response Data 访问JSON响应数据 |
---|
#include "liboai.h" using namespace liboai; int main() { OpenAI oai; if (oai.auth.SetKeyEnv("OPENAI_API_KEY")) { try { Response response = oai.Image->create( "a siamese cat!" ); std::cout << response["data"][0]["url"].get<std::string>() << std::endl; } catch (std::exception& e) { std::cout << e.what() << std::endl; } } } |
如果我们想做的不仅仅是打印图像的URL,而是在完成时立即下载它怎么办?幸运的是, liboai
有一个方便的函数 Network::Download(...)
(和 Network::DownloadAsync(...)
)可以实现这一点。请参见下面的示例,了解如何下载新生成的图像。
Downloading a Generated Image 下载生成的图像。 |
---|
#include "liboai.h" using namespace liboai; int main() { OpenAI oai; if (oai.auth.SetKeyEnv("OPENAI_API_KEY")) { try { Response response = oai.Image->create( "a siamese cat!" ); Network::Download( "C:/some/folder/file.png", // to response["data"][0]["url"].get<std::string>() // from ); } catch (std::exception& e) { std::cout << e.what() << std::endl; } } } |