技术石/ openai
一个支持ChatGPT、GPT-4、GPT-3.5、GPT-3、Codex、DALL·E、Whisper、Embeddings、Fine-Tuning和Moderation模型的OpenAI REST API客户端。包括所有请求和响应的完全类型的数据传输对象(DTOs)以及IDE自动完成支持。
Requires
- php: ^7.2.5 || ^8.0
- ext-json: *
- nyholm/psr7: ^1.4
- php-http/message: ^1.11
- php-http/multipart-stream-builder: ^1.2
- psr/http-client: ^1.0.1
- spatie/data-transfer-object: ^1.14
Requires (Dev)
- league/openapi-psr7-validator: ^0.17.0
- mikey179/vfsstream: ^1.6.10
- php-http/mock-client: ^1.5
- phpstan/phpstan: ^1.4
- phpunit/phpunit: ^8.5.14 || ^9.5 || ^10.0
- squizlabs/php_codesniffer: ^3.6
- symfony/http-client: ^5.3
Suggests
- php-http/mock-client: Simplify testing by using a mock HTTP client
Conflicts
- cebe/php-openapi: <1.7
- riverline/multipart-parser: <2.0.9
- symfony/yaml: <3.4.31 || >4.0 <4.3.4
README
此包不再受支持或维护。
介绍
技术石OpenAI REST API客户端是一个包,它提供了从您的PHP应用程序中方便且直接地与OpenAI API交互的方法。
支持ChatGPT、GPT-4、GPT-3.5、GPT-3、Codex、DALL·E、Whisper、Fine-Tuning、Embeddings和Moderation模型,提供所有请求和响应的完全类型的数据传输对象(DTOs)以及IDE自动完成支持。
更多信息请访问https://tectalic.com/apis/openai。
这是一个非官方包,与OpenAI没有关联。
示例
将OpenAI集成到您的应用程序中现在就像几行代码那么简单。
使用ChatGPT(GPT-3.5 & GPT-4)进行聊天完成
$openaiClient = \Tectalic\OpenAi\Manager::build( new \GuzzleHttp\Client(), new \Tectalic\OpenAi\Authentication(getenv('OPENAI_API_KEY')) ); /** @var \Tectalic\OpenAi\Models\ChatCompletions\CreateResponse $response */ $response = $openaiClient->chatCompletions()->create( new \Tectalic\OpenAi\Models\ChatCompletions\CreateRequest([ 'model' => 'gpt-4', 'messages' => [ [ 'role' => 'user', 'content' => 'Will using a well designed and supported third party package save time?' ], ], ]) )->toModel(); echo $response->choices[0]->message->content; // Yes, using a well-designed and supported third-party package can save time during software development. // It allows you to focus on the core functionality of your application without having to reinvent the wheel or spend resources developing the same functionality from scratch. // A good third-party package can provide reliability, efficiency, and continued support with updates and bug fixes, which in turn facilitates faster development and a more stable final product. // Additionally, using widely adopted packages can also increase the chances of compatibility with other software components and make it easier for other developers to understand and work with your code.
此处理器支持GPT-3.5和GPT-4模型
GPT-3.5
支持的GPT-3.5模型包括gpt-3.5-turbo
等。
GPT-4
支持的GPT-4模型包括gpt-4
等。
注意:GPT-4目前处于有限测试版,仅对已获得访问权限的用户开放。请参阅此处了解详细信息以及如何加入候补名单的说明。
如果您在尝试使用GPT-4时收到404错误,则您的OpenAI账户尚未获得访问权限。
使用ChatGPT(GPT-3.5 & GPT-4)调用聊天完成功能
以下示例使用gpt-3.5-turbo-0613
模型来演示函数调用。
它将自然语言转换为函数调用,然后可以在您的应用程序中执行。
$openaiClient = \Tectalic\OpenAi\Manager::build( new \GuzzleHttp\Client(), new \Tectalic\OpenAi\Authentication(getenv('OPENAI_API_KEY')) ); /** @var \Tectalic\OpenAi\Models\ChatCompletions\CreateResponse $response */ $response = $openaiClient->chatCompletions()->create(new CreateRequest([ 'model' => 'gpt-3.5-turbo-0613', 'messages' => [ ['role' => 'user', 'content' => 'What\'s the weather like in Boston?'] ], 'functions' => [ [ 'name' => 'get_current_weather', 'description' => 'Get the current weather in a given location', 'parameters' => new \Tectalic\OpenAi\Models\ChatCompletions\CreateRequestFunctionsItemParameters( [ 'type' => 'object', 'properties' => [ 'location' => [ 'type' => 'string', 'description' => 'The worldwide city and state, e.g. San Francisco, CA', ], 'format' => [ 'type' => 'string', 'description' => 'The temperature unit to use. Infer this from the users location.', 'enum' => ['celsius', 'farhenheit'], ], 'num_days' => [ 'type' => 'integer', 'description' => 'The number of days to forecast', ], ], 'required' => ['location', 'format', 'num_days'], ] ) ] ], 'function_call' => 'auto', ]))->toModel(); $params = json_decode($response->choices[0]->message->function_call->arguments, true); var_dump($params); // array(3) { // 'location' => // string(6) "Boston" // 'format' => // string(7) "celsius" // 'num_days' => // int(1) //}
文本完成(GPT-3)
$openaiClient = \Tectalic\OpenAi\Manager::build(new \GuzzleHttp\Client(), new \Tectalic\OpenAi\Authentication(getenv('OPENAI_API_KEY'))); /** @var \Tectalic\OpenAi\Models\Completions\CreateResponse $response */ $response = $openaiClient->completions()->create( new \Tectalic\OpenAi\Models\Completions\CreateRequest([ 'model' => 'text-davinci-003', 'prompt' => 'Will using a third party package save time?', ]) )->toModel(); echo $response->choices[0]->text; // Using a third party package can save time because you don't have to write the code yourself.
此处理器支持所有GPT-3模型,包括text-davinci-003
、text-davinci-002
等。
代码完成(Codex)
$openaiClient = \Tectalic\OpenAi\Manager::build(new \GuzzleHttp\Client(), new \Tectalic\OpenAi\Authentication(getenv('OPENAI_API_KEY'))); /** @var \Tectalic\OpenAi\Models\Completions\CreateResponse $response */ $response = $openaiClient->completions()->create( new \Tectalic\OpenAi\Models\Completions\CreateRequest([ 'model' => 'code-davinci-002', 'prompt' => "// PHP 8\n// A variable that saves the current date and time", 'max_tokens' => 256, 'stop' => ";", ]) )->toModel(); echo $response->choices[0]->text; // $now = date("Y-m-d G:i:s")
支持的Codex模型包括code-davinci-002
和code-cushman-001
。
图像生成(DALL·E)
$openaiClient = \Tectalic\OpenAi\Manager::build(new \GuzzleHttp\Client(), new \Tectalic\OpenAi\Authentication(getenv('OPENAI_API_KEY'))); /** @var \Tectalic\OpenAi\Models\ImagesGenerations\CreateResponse $response */ $response = $openaiClient->imagesGenerations()->create( new \Tectalic\OpenAi\Models\ImagesGenerations\CreateRequest([ 'prompt' => 'A cute baby sea otter wearing a hat', 'size' => '256x256', 'n' => 5 ]) )->toModel(); foreach ($response->data as $item) { var_dump($item->url); }
语音到文本音频转录(Whisper)
$openaiClient = \Tectalic\OpenAi\Manager::build(new \GuzzleHttp\Client(), new \Tectalic\OpenAi\Authentication(getenv('OPENAI_API_KEY'))); /** @var \Tectalic\OpenAi\Models\AudioTranscriptions\CreateResponse $response */ $response = $openaiClient->audioTranscriptions()->create( new \Tectalic\OpenAi\Models\AudioTranscriptions\CreateRequest([ 'file' => '/full/path/to/audio/file.mp3', 'model' => 'whisper-1', ]) )->toModel(); echo $response->text; // Your audio transcript in your source language...
支持的Whisper模型包括whisper-1
。
语音到文本音频翻译(Whisper)
$openaiClient = \Tectalic\OpenAi\Manager::build(new \GuzzleHttp\Client(), new \Tectalic\OpenAi\Authentication(getenv('OPENAI_API_KEY'))); /** @var \Tectalic\OpenAi\Models\AudioTranslations\CreateResponse $response */ $response = $openaiClient->audioTranslations()->create( new \Tectalic\OpenAi\Models\AudioTranslations\CreateRequest([ 'file' => '/full/path/to/audio/file.mp3', 'model' => 'whisper-1', ]) )->toModel(); echo $response->text; // Your audio transcript in English...
支持的Whisper模型包括whisper-1
。
安装
需要帮助开始?请参阅我们的指南:[如何使用 OpenAI API 构建应用程序](https://tectalic.com/blog/build-an-app-using-openai-api)。
系统要求
- PHP 版本 7.2.5 或更高版本(包括 PHP 8.0 和 8.1)
- 如果使用 PHP 7.x,则需要安装 PHP JSON 扩展。从 PHP 8.0 开始,此扩展已变为核心 PHP 扩展,因此始终启用。
- 需要兼容 PSR-18 的 HTTP 客户端,例如 'Guzzle' 或 'Symfony HTTP 客户端'。
Composer 安装
将包安装到您的项目中
composer require tectalic/openai
用法
将 Tectalic OpenAI REST API Client 包安装到您的项目中后,请确保您还有兼容 PSR-18 的 HTTP 客户端,例如 'Guzzle' 或 Symfony 'HTTP 客户端'。
您可以使用以下代码示例并根据自己的应用程序进行定制。
// Load your project's composer autoloader (if you aren't already doing so). require_once(__DIR__ . '/vendor/autoload.php');
use Symfony\Component\HttpClient\Psr18Client; use Tectalic\OpenAi\Authentication; use Tectalic\OpenAi\Client; use Tectalic\OpenAi\Manager; // Build a Tectalic OpenAI REST API Client globally. $auth = new Authentication(getenv('OPENAI_API_KEY')); $httpClient = new Psr18Client(); Manager::build($httpClient, $auth); // or // Build a Tectalic OpenAI REST API Client manually. $auth = new Authentication(getenv('OPENAI_API_KEY')); $httpClient = new Psr18Client(); $client = new Client($httpClient, $auth, Manager::BASE_URI);
身份验证
要在调用 Manager::build()
时对 API 请求进行身份验证,您需要提供一个 Authentication
($auth
) 对象。
对 OpenAI API 的身份验证是通过 HTTP Bearer 认证进行的。
请参阅 OpenAI API 文档以获取有关获取您的身份验证凭据的更多详细信息。
在上面的 用法 代码中,将 Authentication
构造函数定制到您的需求。例如,您可能需要将 OPENAI_API_KEY
环境变量添加到系统中。
客户端类
您将与之交互的主要类是 Client
类(《Tectalic\OpenAi\Client》)。
此 Client
类还包含让您快速访问 19 个 API 处理器的辅助方法。
请见下文以获取支持的处理器和方法的完整列表。
支持的 API 处理器和方法
此包支持 28 个 API 方法,它们分为 19 个 API 处理器。
请参阅下表以获取 API 处理器和方法的完整列表。
API 处理器类和名称 | 描述 | API 动词和 URL |
---|---|---|
AudioTranscriptions::create() |
将音频转录为输入语言。 | POST /audio/transcriptions |
AudioTranslations::create() |
将音频翻译成英文。 | POST /audio/translations |
ChatCompletions::create() |
为给定的聊天会话创建模型响应。 | POST /chat/completions |
Completions::create() |
为提供的提示和参数创建完成。 | POST /completions |
Edits::create() |
POST /edits |
|
Embeddings::create() |
创建表示输入文本的嵌入向量。 | POST /embeddings |
Files::list() |
返回属于用户组织的文件列表。 | GET /files |
Files::create() |
上传包含文档的文件,用于跨各种端点/功能。目前,一个组织上传的所有文件的总大小可达到 1 GB。如果您需要提高存储限制,请联系我们。 | POST /files |
Files::retrieve() |
返回有关特定文件的信息。 | GET /files/{file_id} |
Files::delete() |
删除文件。 | DELETE /files/{file_id} |
FilesContent::download() |
返回指定文件的内容。 | GET /files/{file_id}/content |
FineTunes::list() |
GET /fine-tunes |
|
FineTunes::create() |
响应包含已入队的作业的详细信息,包括作业状态和完成后的微调模型名称。 了解更多关于微调的信息 |
POST /fine-tunes |
FineTunes::retrieve() |
了解更多关于微调的信息 |
GET /fine-tunes/{fine_tune_id} |
FineTunesCancel::cancelFineTune() |
POST /fine-tunes/{fine_tune_id}/cancel |
|
FineTunesEvents::listFineTune() |
GET /fine-tunes/{fine_tune_id}/events |
|
FineTuningJobs::listPaginated() |
列出您的组织中的微调作业。 | GET /fine_tuning/jobs |
FineTuningJobs::create() |
创建一个从给定数据集微调指定模型的作业。 响应包含已入队的作业的详细信息,包括作业状态和完成后的微调模型名称。 了解更多关于微调的信息 |
POST /fine_tuning/jobs |
FineTuningJobs::retrieve() |
获取微调作业的信息。 了解更多关于微调的信息 |
GET /fine_tuning/jobs/{fine_tuning_job_id} |
FineTuningJobsCancel::fineTuning() |
立即取消微调作业。 | POST /fine_tuning/jobs/{fine_tuning_job_id}/cancel |
FineTuningJobsEvents::listFineTuning() |
获取微调作业的状态更新。 | GET /fine_tuning/jobs/{fine_tuning_job_id}/events |
ImagesEdits::createImage() |
根据原始图像和提示创建编辑或扩展后的图像。 | POST /images/edits |
ImagesGenerations::create() |
根据提示创建图像。 | POST /images/generations |
ImagesVariations::createImage() |
创建给定图像的变体。 | POST /images/variations |
Models::list() |
列出当前可用的模型,并提供每个模型的基本信息,例如所有者和可用性。 | GET /models |
Models::retrieve() |
检索模型实例,提供有关模型的基本信息,例如所有者和权限。 | GET /models/{model} |
Models::delete() |
删除微调模型。您必须具有组织中的所有者角色才能删除模型。 | DELETE /models/{model} |
Moderations::create() |
判断文本是否违反OpenAI的内容政策。 | POST /moderations |
已弃用的方法以删除线格式列出。请勿使用这些方法,因为它们将在未来的版本中删除。
发送请求
有两种方式可以向指定的API处理程序和API方法发送请求
如果您构建的客户端可全球访问,您可以直接使用相关的API处理程序类
use Tectalic\OpenAi\Handlers\AudioTranscriptions; (new AudioTranscriptions())->create();
或者,您可以通过客户端类访问所有API处理程序
$client->audioTranscriptions()->create();
获取响应
使用上述两种方法之一发送请求后,下一步是访问响应。
您可以通过不同的方式访问响应。请选择您喜欢的。
模型响应
模型响应是数据传输对象(DTO)风格的PHP类,每个API属性都有公共属性。
它们提供了一种结构化地检索API请求响应的方法。
所有响应模型都是Tectalic\OpenAi\Models\AbstractModel
或Tectalic\OpenAi\Models\AbstractModelCollection
的实例。
在执行请求后,使用API方法的->toModel()
流畅方法
use Tectalic\OpenAi\Handlers\AudioTranscriptions; $model = (new AudioTranscriptions())->create()->toModel();
每个API方法的toModel()
调用将返回您刚刚调用的API方法适当的模型类类型。
关联数组响应
执行请求后,使用API方法的->toArray()
流畅方法
use Tectalic\OpenAi\Handlers\AudioTranscriptions; $array = (new AudioTranscriptions())->create()->toArray();
在结果关联数组中,数组键将匹配相关模型类中公共属性的名字。
PSR 7响应对象
如果您需要访问原始响应或检查HTTP标头,请使用API方法的->getResponse()
流畅方法。它将返回一个Psr\Http\Message\ResponseInterface
use Tectalic\OpenAi\Handlers\AudioTranscriptions; $response = (new AudioTranscriptions())->create()->getResponse();
错误
在执行带有Tectalic OpenAI REST API客户端的请求时,特定场景将导致抛出Tectalic\OpenAi\Exception\ClientException
。请参阅以下详细信息。
《Manager》类使用无效
如果多次调用Manager::build()
函数,或者在没有调用Manager::build()
之前调用Manager::access()
,将抛出\LogicException
异常。
失败的HTTP响应码
Tectalic OpenAI REST API客户端依赖于兼容PSR-18的HTTP客户端,并且该HTTP客户端不应在失败的HTTP响应码时抛出异常。
失败的响应码被定义为不在范围200
-299
(包含)内的响应码。失败的响应码示例包括
- 信息性响应(
100
-199
) - 重定向响应(
300
-399
) - 客户端错误响应(
400
-499
) - 服务器错误响应(
500
-599
)
如果发生失败的响应码
- 你的HTTP客户端将不会抛出异常。
- API处理器
toModel()
方法将抛出ClientException
异常。 - API处理器
toArray()
方法将返回响应体而不会抛出ClientException
异常。 - API处理器
getResponse()
方法将返回原始响应而不会抛出ClientException
异常。
以下是如何在执行请求时使用try
/catch
块的一个示例,以便你可以检测和处理意外错误。
use Tectalic\OpenAi\Authentication; use Tectalic\OpenAi\Client; use Tectalic\OpenAi\ClientException; use Tectalic\OpenAi\Manager; // Build a Tectalic OpenAI REST API Client globally. $auth = new Authentication('token'); Manager::build($httpClient, $auth); $handler = new AudioTranscriptions(); // Perform a request try { $model = $handler->create()->toModel(); // Do something with the response model... } catch (ClientException $e) { // Error response received. Retrieve the HTTP response code and response body. $responseBody = $handler->toArray(); $responseCode = $handler->getResponse()->getStatusCode(); // Handle the error... }
HTTP客户端异常
如果你的首选HTTP客户端抛出的异常不是ClientException
,则Tectalic OpenAI REST API客户端的Client
和API处理器类将让这些异常向上冒泡。
有关异常处理的更多详细信息,请参阅HTTP客户端的文档。
测试
Tectalic OpenAI REST API客户端包包含几种类型的自动化PHPUnit测试,以验证正确操作。
- 单元测试
- 集成测试
要运行这些测试,您需要安装带有其开发依赖项的Tectalic OpenAI REST API客户端包(即在运行composer时不要使用--no-dev
标志)。
单元测试
这些PHPUnit测试旨在
- 确认每个API方法构建的请求与OpenAI API OpenAPI规范匹配。
- 验证包的其他部分的行为,例如
Client
和Manager
类。
可以使用以下命令运行单元测试,需要从此包的根目录运行。
composer test:unit
单元测试不会对OpenAI API执行任何实际请求。
单元测试位于tests/Unit
目录。
集成测试
集成测试位于tests/Integration
目录。
这些PHPUnit测试旨在确认每个API方法根据OpenAI API OpenAPI规范解析有效的响应。默认情况下,集成测试设计为与Prism模拟服务器一起工作。
使用Prism作为目标
请确保已安装Prism。有关如何安装Prism的详细信息,请参阅Prism文档。
安装Prism后,您可以在单独的终端窗口中并行运行prism和集成测试,或使用以下命令,需要从此包的根目录运行。
echo "> Starting Prism server" prism mock tests/openapi.yaml >/dev/null 2>&1 & PRISM_PID=$! sleep 2 echo " => Started" composer test:integration kill $PRISM_PID
这些命令将启动Prism模拟服务器,然后运行集成测试,并在测试完成后停止Prism模拟服务器。
在这种情况下,集成测试不会对OpenAI API执行任何实际请求。
使用不同的目标
通过设置OPENAI_CLIENT_TEST_BASE_URI
环境变量,您可以为集成测试设置不同的API端点目标。
例如,您可以使用与Prism不同的模拟/预发布/测试服务器,或者使用OpenAI API的实时端点。
别忘了在OPENAI_CLIENT_TEST_AUTH_USERNAME
OPENAI_CLIENT_TEST_AUTH_PASSWORD
环境变量中设置适当的凭据。
设置完成后,只需运行以下命令。
composer test:integration
我们不推荐对实时OpenAI API端点运行集成测试。这是因为测试会向所有端点发送示例数据,可能会导致新数据创建或现有数据被删除。
编写您自己的测试
如果您正在编写自己的测试,您可能会需要模拟OpenAI API的响应。
实现这一目标的一种方法是将php-http/mock-client
包安装到您的项目中,然后在实例化强泰OpenAI REST API客户端
时使用\Http\Mock\Client
类(而不是真实的PSR-18客户端)。
这允许您模拟OpenAI API的响应,而不是执行真实请求。
有关详细信息,请参阅模拟客户端文档。
支持
如果您有任何问题或反馈,请使用讨论板。
许可
本软件版权所有(c)2022-至今 强泰。
有关版权和许可信息,请查看LICENSE
文件。