技术石openai

此包已被放弃,不再维护。未建议替代包。

一个支持ChatGPT、GPT-4、GPT-3.5、GPT-3、Codex、DALL·E、Whisper、Embeddings、Fine-Tuning和Moderation模型的OpenAI REST API客户端。包括所有请求和响应的完全类型的数据传输对象(DTOs)以及IDE自动完成支持。

v1.6.0 2023-09-06 02:15 UTC

This package is auto-updated.

Last update: 2023-10-23 03:18:19 UTC


README

此包不再受支持或维护。

介绍

技术石OpenAI REST API客户端是一个包,它提供了从您的PHP应用程序中方便且直接地与OpenAI API交互的方法。

支持ChatGPTGPT-4GPT-3.5GPT-3CodexDALL·EWhisperFine-TuningEmbeddingsModeration模型,提供所有请求和响应的完全类型的数据传输对象(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.5GPT-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-003text-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-002code-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

了解更多关于语音到文本,包括50+种支持的语言

语音到文本音频翻译(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

了解更多关于语音到文本,包括50+种支持的语言

安装

需要帮助开始?请参阅我们的指南:[如何使用 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\AbstractModelTectalic\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规范匹配。
  • 验证包的其他部分的行为,例如ClientManager类。

可以使用以下命令运行单元测试,需要从此包的根目录运行。

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文件。