client

GitHub
5.8k 679 简单 1 次阅读 2天前MIT开发框架数据工具插件语言模型
AI 解读 由 AI 自动生成,仅供参考

OpenAI PHP 是一个由社区维护的高性能 PHP 客户端,旨在帮助开发者轻松对接 OpenAI API。它解决了在 PHP 项目中直接调用人工智能服务时面临的接口复杂、配置繁琐等痛点,将原本复杂的 HTTP 请求封装为简洁、直观的代码方法,让集成过程变得高效顺畅。

这款工具主要面向使用 PHP 进行开发的工程师和技术团队,无论是构建智能聊天机器人、实现文本生成与分析,还是处理图像、音频及向量存储等高级功能,都能通过它快速落地。其独特的技术亮点在于“超级加速”的设计理念和完善的资源覆盖,不仅支持最新的对话、微调及实时交互接口,还兼容 Azure 等服务环境,同时明确标记了已弃用的旧版接口,帮助开发者规避技术债务。

作为连接 PHP 生态与前沿 AI 能力的桥梁,OpenAI PHP 要求运行环境为 PHP 8.2 及以上版本,并通过 Composer 即可一键安装。它让开发者无需深究底层通信细节,只需关注业务逻辑,即可在应用中灵活调用强大的大模型能力,是 PHP 开发者探索人工智能应用的得力助手。

使用场景

一家电商公司的 PHP 开发团队需要在其后台系统中集成 AI 功能,用于自动生成商品描述并检测用户评论中的违规内容。

没有 client 时

  • 开发人员必须手动查阅 OpenAI 官方文档,逐行编写复杂的 cURL 请求代码来处理 HTTP 认证、头信息构造及错误重试逻辑。
  • 每次 API 接口更新或新增功能(如新的模型参数),团队都需要花费大量时间修改底层请求代码,维护成本极高且容易出错。
  • 缺乏统一的类型提示和对象封装,导致处理 JSON 响应时需要频繁进行数组键值检查,代码可读性差且调试困难。
  • 实现文件上传、流式响应或音频处理等高级功能时,需要重复造轮子,严重拖慢了项目迭代速度。

使用 client 后

  • 通过 Composer 一键安装即可调用封装好的方法,开发者只需关注业务逻辑,无需关心底层的 HTTP 细节和鉴权流程。
  • 社区持续同步 OpenAI 最新 API 特性,团队可直接使用现成的 chat()moderations() 等资源类,零成本适配新功能。
  • 返回数据被自动转换为强类型的 PHP 对象,享受完整的 IDE 智能提示,大幅减少了运行时错误并提升了编码效率。
  • 内置支持文件流、批量任务及向量存储等复杂场景,原本需要数天开发的功能现在几行代码即可稳定运行。

client 将繁琐的 API 交互转化为简洁优雅的 PHP 代码,让开发团队能专注于构建核心业务价值而非底层通信细节。

运行环境要求

依赖
notes这是一个 PHP 库而非 Python 工具,因此不需要 GPU、特定内存或 Python 环境。运行需安装 PHP 8.2 及以上版本,并通过 Composer 包管理器安装。项目依赖 PSR-18 标准的 HTTP 客户端(如 Guzzle),若项目中未集成需手动安装。
PHP >= 8.2
composer
php-http/discovery
PSR-18 HTTP Client (e.g., guzzlehttp/guzzle)
client hero image

快速开始

OpenAI PHP

GitHub 工作流状态(main 分支) 总下载量 最新版本 许可证


OpenAI PHP 是一个由社区维护的 PHP API 客户端,使您能够与 Open AI API 进行交互。

如果您或您的企业依赖此软件包,支持那些投入时间和精力来创建和维护这一宝贵工具的开发者非常重要:

目录

快速入门

需要 PHP 8.2+

首先,通过 Composer 包管理器安装 OpenAI:

composer require openai-php/client

确保允许 php-http/discovery Composer 插件运行,或者如果您的项目尚未集成 PSR-18 客户端,则手动安装一个客户端。

composer require guzzlehttp/guzzle

然后,即可与 OpenAI 的 API 进行交互:

$yourApiKey = getenv('YOUR_API_KEY');
$client = OpenAI::client($yourApiKey);

$response = $client->responses()->create([
    'model' => 'gpt-4o',
    'input' => 'Hello!',
]);

echo $response->outputText; // Hello! How can I assist you today?

如有必要,也可以配置并创建一个单独的客户端。

$yourApiKey = getenv('YOUR_API_KEY');

$client = OpenAI::factory()
    ->withApiKey($yourApiKey)
    ->withOrganization('your-organization') // 默认:null
    ->withProject('Your Project') // 默认:null
    ->withBaseUri('openai.example.com/v1') // 默认:api.openai.com/v1
    ->withHttpClient($httpClient = new \GuzzleHttp\Client([])) // 默认:使用 PSR-18 HTTP 客户端发现找到的 HTTP 客户端
    ->withHttpHeader('X-My-Header', 'foo')
    ->withQueryParam('my-param', 'bar')
    ->withStreamHandler(fn (RequestInterface $request): ResponseInterface => $httpClient->send($request, [
        'stream' => true // 允许为 HTTP 客户端提供自定义的流处理程序。
    ]))
    ->make();

使用方法

Models 资源

list

列出当前可用的模型,并提供每个模型的基本信息,例如所有者和可用性。

$response = $client->models()->list();

$response->object; // 'list'

foreach ($response->data as $result) {
    $result->id; // 'gpt-3.5-turbo-instruct'
    $result->object; // 'model'
    // ...
}

$response->toArray(); // ['object' => 'list', 'data' => [...]]

retrieve

检索某个模型实例,提供该模型的基本信息,如所有者和权限设置。

$response = $client->models()->retrieve('gpt-3.5-turbo-instruct');

$response->id; // 'gpt-3.5-turbo-instruct'
$response->object; // 'model'
$response->created; // 1642018370
$response->ownedBy; // 'openai'

$response->toArray(); // ['id' => 'gpt-3.5-turbo-instruct', ...]

delete

删除一个经过微调的模型。

$response = $client->models()->delete('curie:ft-acmeco-2021-03-03-21-44-20');

$response->id; // 'curie:ft-acmeco-2021-03-03-21-44-20'
$response->object; // 'model'
$response->deleted; // true

$response->toArray(); // ['id' => 'curie:ft-acmeco-2021-03-03-21-44-20', ...]

Responses 资源

create

创建一个模型响应。提供文本或图像输入以生成文本或 JSON 输出。让模型调用您自己的自定义代码,或使用内置工具(如网络搜索或文件搜索)来将您自己的数据作为模型响应的输入。

$response = $client->responses()->create([
    'model' => 'gpt-4o-mini',
    'tools' => [
        [
            'type' => 'web_search_preview'
        ]
    ],
    'input' => "今天有什么积极的新闻吗?",
    'temperature' => 0.7,
    'max_output_tokens' => 150,
    'tool_choice' => 'auto',
    'parallel_tool_calls' => true,
    'store' => true,
    'metadata' => [
        'user_id' => '123',
        'session_id' => 'abc456'
    ]
]);

$response->id; // 'resp_67ccd2bed1ec8190b14f964abc054267'
$response->object; // 'response'
$response->createdAt; // 1741476542
$response->status; // 'completed'
$response->model; // 'gpt-4o-mini'
$response->outputText; // '任何 `output_text` 内容的合并响应文本。'

foreach ($response->output as $output) {
    $output->type; // 'message'
    $output->id; // 'msg_67ccd2bf17f0819081ff3bb2cf6508e6'
    $output->status; // 'completed'
    $output->role; // 'assistant'
    
    foreach ($output->content as $content) {
        $content->type; // 'output_text'
        $content->text; // 响应文本
        $content->annotations; // 响应中的任何注释
    }
}

$response->usage->inputTokens; // 36
$response->usage->outputTokens; // 87
$response->usage->totalTokens; // 123

$response->toArray(); // ['id' => 'resp_67ccd2bed1ec8190b14f964abc054267', ...]

使用函数工具创建一个模型响应。

$response = $client->responses()->create([
    'model' => 'gpt-4o-mini',
    'tools' => [
        [
            'type' => 'function',
            'name' => 'get_temperature',
            'description' => '获取给定位置的当前温度',
            'parameters' => [
                'type' => 'object',
                'properties' => [
                    'location' => [
                        'type' => 'string',
                        'description' => '城市和州,例如旧金山,加州',
                    ],
                    'unit' => [
                        'type' => 'string',
                        'enum' => ['摄氏度', '华氏度'],
                    ],
                ],
                'required' => ['location'],
            ],
        ]
    ],
    'input' => "巴西北里奥格兰德州的温度是多少?",
]);

foreach ($response->output as $item) {
    if ($item->type === 'function_call') {
        $name = $item->name ?? null;
        $args = json_decode($item->arguments ?? '{}', true) ?: [];

        if ($name === 'get_temperature') {
            // ✅ 在这里使用提取的参数调用您的自定义函数
            // 示例:
            // $temperature = get_temperature($args['location'], $args['unit'] ?? '摄氏度');
            // 然后,如果需要,将结果发送回模型。
        }
    }
}

create streamed

当您将 stream 设置为 true 来创建响应时,服务器会在生成响应的过程中向客户端发出服务器发送事件。所有事件及其有效载荷都可以在 OpenAI 文档 中找到。

$stream = $client->responses()->createStreamed([
    'model' => 'gpt-4o-mini',
    'tools' => [
        [
            'type' => 'web_search_preview'
        ]
    ],
    'input' => "今天有什么积极的新闻吗?",
]);

foreach ($stream as $response) {
    $response->event; // 'response.created'
}

retrieve

根据给定的 ID 检索一个模型响应。

$response = $client->responses()->retrieve('resp_67ccd2bed1ec8190b14f964abc054267');

$response->id; // 'resp_67ccd2bed1ec8190b14f964abc054267'
$response->object; // 'response'
$response->createdAt; // 1741476542
$response->status; // 'completed'
$response->error; // null
$response->incompleteDetails; // null
$response->instructions; // null
$response->maxOutputTokens; // null
$response->model; // 'gpt-4o-mini-2024-07-18"'
$response->parallelToolCalls; // true
$response->previousResponseId; // null
$response->store; // true
$response->temperature; // 1.0
$response->toolChoice; // 'auto'
$response->topP; // 1.0
$response->truncation; // 'disabled'

$response->toArray(); // ['id' => 'resp_67ccd2bed1ec8190b14f964abc054267', ...]

retrieve streamed

当您将 stream 设置为 true 来检索响应时,服务器会在生成响应的过程中向客户端发出服务器发送事件。所有事件及其有效载荷都可以在 OpenAI 文档 中找到。

$stream = $client->responses()->retrieveStreamed('resp_67ccd2bed1ec8190b14f964abc054267', [
    'starting_after' => '2',
]);

foreach ($stream as $response) {
    $response->event; // 'response.created'
}

cancel

取消具有给定 ID 的模型响应(后台请求)。

$response = $client->responses()->cancel('resp_67ccd2bed1ec8190b14f964abc054267');

$response->id; // 'resp_67ccd2bed1ec8190b14f964abc054267'
$response->status; // '已取消'

$response->toArray(); // ['id' => 'resp_67ccd2bed1ec8190b14f964abc054267', 'status' => '已取消', ...]

delete

删除具有给定 ID 的模型响应。

$response = $client->responses()->delete('resp_67ccd2bed1ec8190b14f964abc054267');

$response->id; // 'resp_67ccd2bed1ec8190b14f964abc054267'
$response->object; // 'response'
$response->deleted; // true

$response->toArray(); // ['id' => 'resp_67ccd2bed1ec8190b14f964abc054267', 'deleted' => true, ...]

list

列出具有给定 ID 的响应的输入项。所有事件及其有效载荷都可以在 OpenAI 文档 中找到。

$response = $client->responses()->list('resp_67ccd2bed1ec8190b14f964abc054267', [
    'limit' => 10,
    'order' => 'desc'
]);

$response->object; // 'list'

foreach ($response->data as $item) {
    $item->type; // 'message'
    $item->id; // 'msg_680bf4e8c1948192b64abf0bad54b30806e0834f49400fc3'
    $item->status; // '已完成'
    $item->role; // '用户'
}

$response->firstId; // 'msg_680bf4e8c1948192b64abf0bad54b30806e0834f49400fc3'
$response->lastId; // 'msg_680bf4e8c1948192b64abf0bad54b30806e0834f49400fc3'
$response->hasMore; // false

$response->toArray(); // ['object' => 'list', 'data' => [...], ...]

Conversations 资源

create

创建一次对话。

$response = $client->conversations()->create([
    'metadata' => ['topic' => 'demo'],
    'items' => [
        [
            'type' => 'message',
            'role' => 'user',
            'content' => 'Hello!'
        ],
    ],
]);

$response->id; // 'conv_123'
$response->object; // 'conversation'
$response->createdAt; // 1741900000
$response->metadata; // ['topic' => 'demo']

$response->toArray(); // ['id' => 'conv_123', 'object' => 'conversation', ...]

retrieve

通过 ID 检索一次对话。

$response = $client->conversations()->retrieve('conv_123');

$response->id; // 'conv_123'
$response->object; // 'conversation'
$response->createdAt; // 1741900000

$response->toArray(); // ['id' => 'conv_123', 'object' => 'conversation', ...]

update

通过 ID 更新一次对话。

$response = $client->conversations()->update('conv_123', [
    'metadata' => ['foo' => 'bar'],
]);

$response->id; // 'conv_123'
$response->metadata; // ['foo' => 'bar']

delete

通过 ID 删除一次对话。

$response = $client->conversations()->delete('conv_123');

$response->id; // 'conv_123'
$response->object; // 'conversation.deleted'
$response->deleted; // true

$response->toArray(); // ['id' => 'conv_123', 'object' => 'conversation.deleted', 'deleted' => true]

Conversations Items 资源

create

为一次对话创建条目。

$response = $client->conversations()->items()->create('conv_123', [
    'items' => [
        [
            'role' => 'system',
            'content' => 'Refer to me as PHPBot.',
        ],
    ],
]);

foreach ($response->data as $listItem) {
    $listItem->item; // 创建的条目(例如,消息)
}

$response->firstId; // 'msg_abc'
$response->lastId; // 'msg_abc'
$response->hasMore; // false

$response->toArray(); // ['object' => 'list', 'data' => [...], ...]

list

列出一次对话的所有条目。

$response = $client->conversations()->items()->list('conv_123', [
    'limit' => 10,
]);

$response->object; // 'list'

retrieve

从一次对话中检索特定条目。

$response = $client->conversations()->items()->retrieve('conv_123', 'msg_abc', [
    'include' => ['step_details'],
]);

$response->id; // 'msg_abc'
$response->type; // 'message'
$response->status; // 'completed'

delete

删除一次对话中的特定条目。返回更新后的对话。

$response = $client->conversations()->items()->delete('conv_123', 'msg_abc');

$response->id; // 'conv_123'
$response->object; // 'conversation'

Containers 资源

create

创建一个用于代码解释器工具的容器。

$response = $client->containers()->create([
    'name' => 'My Container',
    'expires_after' => [
        'anchor' => 'last_active_at',
        'minutes' => 60,
    ],
]);

$response->id; // 'container_abc123'
$response->object; // 'container'
$response->createdAt; // 1690000000
$response->status; // 'active'
$response->expiresAfter->anchor; // 'last_active_at'
$response->expiresAfter->minutes; // 60
$response->lastActiveAt; // 1690001000
$response->name; // 'My Container'

$response->toArray(); // ['id' => 'container_abc123', 'object' => 'container', ...]

list

返回容器列表。

$response = $client->containers()->list([
    'limit' => 10,
    'order' => 'desc',
]);

$response->object; // 'list'

foreach ($response->data as $container) {
    $container->id; // 'container_abc123'
    $container->object; // 'container'
    $container->createdAt; // 1690000000
    $container->status; // 'active'
    $container->expiresAfter->anchor; // 'last_active_at'
    $container->expiresAfter->minutes; // 60
    $container->lastActiveAt; // 1690001000
    $container->name; // 'Test Container'
}

$response->firstId; // 'container_abc123'
$response->lastId; // 'container_def456'
$response->hasMore; // false

$response->toArray(); // ['object' => 'list', 'data' => [...], ...]

retrieve

检索具有给定 ID 的容器。

$response = $client->containers()->retrieve('container_abc123');

$response->id; // 'container_abc123'
$response->object; // 'container'
$response->createdAt; // 1690000000
$response->status; // 'active'
$response->expiresAfter->anchor; // 'last_active_at'
$response->expiresAfter->minutes; // 60
$response->lastActiveAt; // 1690001000
$response->name; // 'Test Container'

$response->toArray(); // ['id' => 'container_abc123', 'object' => 'container', ...]

delete

删除具有给定 ID 的容器。

$response = $client->containers()->delete('container_abc123');

$response->id; // 'container_abc123'
$response->object; // 'container'
$response->deleted; // true

$response->toArray(); // ['id' => 'container_abc123', 'object' => 'container', 'deleted' => true]

Containers Files 资源

create

在容器中创建或上传文件。

$response = $client->containers()->files()->create('container_abc123', [
    'file' => fopen('path/to/local-file.txt', 'r'),
]);
$response = $client->containers()->files()->create('container_abc123', [
    'file_id' => 'file_XjGxS3KTG0uNmNOK362iJua3',
]);

$response->id; // 'cfile_682e0e8a43c88191a7978f477a09bdf5'
$response->object; // 'container.file'
$response->createdAt; // 1747848842
$response->bytes; // 880
$response->containerId; // 'container_abc123'
$response->path; // '/mnt/data/local-file.txt'
$response->source; // 'user'

$response->toArray(); // ['id' => 'cfile_...', 'object' => 'container.file', ...]

[!NOTE] 必须提供 filefile_id,但不能同时提供两者。

list

返回容器中的文件列表。

$response = $client->containers()->files()->list('container_abc123', [
    'limit' => 10,
    'order' => 'desc',
]);

$response->object; // 'list'

foreach ($response->data as $file) {
    $file->id; // 'cfile_682e0e8a43c88191a7978f477a09bdf5'
    $file->object; // 'container.file'
    $file->createdAt; // 1747848842
    $file->bytes; // 880
    $file->containerId; // 'container_abc123'
    $file->path; // '/mnt/data/...' 
    $file->source; // 'user'
}

$response->firstId; // 'cfile_...'
$response->lastId; // 'cfile_...'
$response->hasMore; // false

$response->toArray(); // ['object' => 'list', 'data' => [...], ...]

retrieve

获取容器文件的信息。

$response = $client->containers()->files()->retrieve('container_abc123', 'cfile_682e0e8a43c88191a7978f477a09bdf5');

$response->id; // 'cfile_682e0e8a43c88191a7978f477a09bdf5'
$response->object; // 'container.file'
$response->createdAt; // 1747848842
$response->bytes; // 880
$response->containerId; // 'container_abc123'
$response->path; // '/mnt/data/...'
$response->source; // 'user'

$response->toArray(); // ['id' => 'cfile_...', 'object' => 'container.file', ...]

retrieve content

返回指定容器文件的原始内容。

$content = $client->containers()->files()->content('container_abc123', 'cfile_682e0e8a43c88191a7978f477a09bdf5');
// $content => string

delete

删除容器文件。

$response = $client->containers()->files()->delete('container_abc123', 'cfile_682e0e8a43c88191a7978f477a09bdf5');

$response->id; // 'cfile_682e0e8a43c88191a7978f477a09bdf5'
$response->object; // 'container.file.deleted'
$response->deleted; // true

$response->toArray(); // ['id' => 'cfile_...', 'object' => 'container.file.deleted', 'deleted' => true]

Chat 资源

create

为聊天消息生成完成内容。

$response = $client->chat()->create([
    'model' => 'gpt-3.5-turbo',
    'messages' => [
        ['role' => 'user', 'content' => 'Hello!'],
    ],
]);

$response->id; // 'chatcmpl-6pMyfj1HF4QXnfvjtfzvufZSQq6Eq'
$response->object; // 'chat.completion'
$response->created; // 1677701073
$response->model; // 'gpt-3.5-turbo-0301'

foreach ($response->choices as $choice) {
    $choice->index; // 0
    $choice->message->role; // 'assistant'
    $choice->message->content; // '\n\nHello there! How can I assist you today?'
    $choice->logprobs; // null
    $choice->finishReason; // 'stop'
}

$response->usage->promptTokens; // 9,
$response->usage->completionTokens; // 12,
$response->usage->totalTokens; // 21

$response->toArray(); // ['id' => 'chatcmpl-6pMyfj1HF4QXnfvjtfzvufZSQq6Eq', ...]

通过工具调用为聊天消息生成完成内容。

$response = $client->chat()->create([
    'model' => 'gpt-3.5-turbo-0613',
    'messages' => [
        ['role' => 'user', 'content' => 'What\'s the weather like in Boston?'],
    ],
    'tools' => [
        [
            'type' => 'function',
            'function' => [
                'name' => 'get_current_weather',
                'description' => 'Get the current weather in a given location',
                'parameters' => [
                    'type' => 'object',
                    'properties' => [
                        'location' => [
                            'type' => 'string',
                            'description' => 'The city and state, e.g. San Francisco, CA',
                        ],
                        'unit' => [
                            'type' => 'string',
                            'enum' => ['celsius', 'fahrenheit']
                        ],
                    ],
                    'required' => ['location'],
                ],
            ],
        ]
    ]
]);

$response->id; // 'chatcmpl-6pMyfj1HF4QXnfvjtfzvufZSQq6Eq'
$response->object; // 'chat.completion'
$response->created; // 1677701073
$response->model; // 'gpt-3.5-turbo-0613'

foreach ($response->choices as $choice) {
    $choice->index; // 0
    $choice->message->role; // 'assistant'
    $choice->message->content; // null
    $choice->message->toolCalls[0]->id; // 'call_123'
    $choice->message->toolCalls[0]->type; // 'function'
    $choice->message->toolCalls[0]->function->name; // 'get_current_weather'
    $choice->message->toolCalls[0]->function->arguments; // "{\n  \"location\": \"Boston, MA\"\n}"
    $choice->finishReason; // 'tool_calls'
}

$response->usage->promptTokens; // 82,
$response->usage->completionTokens; // 18,
$response->usage->totalTokens; // 100

通过函数调用为聊天消息生成完成内容。

$response = $client->chat()->create([
    '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' => [
                'type' => 'object',
                'properties' => [
                    'location' => [
                        'type' => 'string',
                        'description' => 'The city and state, e.g. San Francisco, CA',
                    ],
                    'unit' => [
                        'type' => 'string',
                        'enum' => ['celsius', 'fahrenheit']
                    ],
                ],
                'required' => ['location'],
            ],
        ]
    ]
]);

$response->id; // 'chatcmpl-6pMyfj1HF4QXnfvjtfzvufZSQq6Eq'
$response->object; // 'chat.completion'
$response->created; // 1677701073
$response->model; // 'gpt-3.5-turbo-0613'

foreach ($response->choices as $choice) {
    $choice->index; // 0
    $choice->message->role; // 'assistant'
    $choice->message->content; // null
    $choice->message->functionCall->name; // 'get_current_weather'
    $choice->message->functionCall->arguments; // "{\n  \"location\": \"Boston, MA\"\n}"
    $choice->finishReason; // 'function_call'
}

$response->usage->promptTokens; // 82,
$response->usage->completionTokens; // 18,
$response->usage->totalTokens; // 100

通过 image_url 输入图像来创建聊天完成内容。
这对于描述和分析视觉内容非常有用。

$response = $client->chat()->create([
    'model' => 'gpt-4o',
    'messages' => [
        [
            'role' => 'user',
            'content' => [
                ['type' => 'text', 'text' => 'What is in this image?'],
                // 替换为真实的可访问图像
                ['type' => 'image_url', 'image_url' => ['url' => 'https://example.com/image.jpg']], 
            ]
        ]
    ]
]);

create streamed

为聊天消息生成流式完成内容。

$stream = $client->chat()->createStreamed([
    'model' => 'gpt-4o',
    'messages' => [
        ['role' => 'user', 'content' => 'Hello!'],
    ],
]);

foreach($stream as $response){
    $response->choices[0]->toArray();
}
// 第1次迭代 => ['index' => 0, 'delta' => ['role' => 'assistant'], 'finish_reason' => null]
// 第2次迭代 => ['index' => 0, 'delta' => ['content' => 'Hello'], 'finish_reason' => null]
// 第3次迭代 => ['index' => 0, 'delta' => ['content' => '!'], 'finish_reason' => null]
// ...

在使用流式响应时,可以通过在 stream_options 中设置 include_usage 来获取用量报告。

$stream = $client->chat()->createStreamed([
    'model' => 'gpt-4',
    'messages' => [
        ['role' => 'user', 'content' => 'Hello!'],
    ],
    'stream_options'=>[
        'include_usage' => true,
    ]
]);

foreach($stream as $response){
    if($response->usage !== null){
        $response->usage->promptTokens; // 9,
        $response->usage->completionTokens; // 12,
        $response->usage->totalTokens; // 21
    }
}

usage 始终为 null,直到最后一个数据块才会包含整个请求的 token 使用统计信息。

Audio 资源

speech

根据输入文本生成音频。

$client->audio()->speech([
    'model' => 'tts-1',
    'input' => 'The quick brown fox jumped over the lazy dog.',
    'voice' => 'alloy',
]); // 音频文件内容为字符串

speechStreamed

根据输入文本生成流式传输的音频。

$stream = $client->audio()->speechStreamed([
    'model' => 'tts-1',
    'input' => 'The quick brown fox jumped over the lazy dog.',
    'voice' => 'alloy',
]);

foreach($stream as $chunk){
    $chunk; // 音频文件内容的片段,为字符串
}

transcribe

将音频转录为输入语言。

$response = $client->audio()->transcribe([
    'model' => 'whisper-1',
    'file' => fopen('audio.mp3', 'r'),
    'response_format' => 'verbose_json',
    'timestamp_granularities' => ['segment', 'word']
]);

$response->task; // 'transcribe'
$response->language; // 'english'
$response->duration; // 2.95
$response->text; // 'Hello, how are you?'

foreach ($response->segments as $segment) {
    $segment->index; // 0
    $segment->seek; // 0
    $segment->start; // 0.0
    $segment->end; // 4.0
    $segment->text; // 'Hello, how are you?'
    $segment->tokens; // [50364, 2425, 11, 577, 366, 291, 30, 50564]
    $segment->temperature; // 0.0
    $segment->avgLogprob; // -0.45045216878255206
    $segment->compressionRatio; // 0.7037037037037037
    $segment->noSpeechProb; // 0.1076972484588623
    $segment->transient; // false
}

foreach ($response->words as $word) {
    $word->word; // 'Hello'
    $word->start; // 0.31
    $word->end; // 0.92
}

$response->toArray(); // ['task' => 'transcribe', ...]

transcribe streamed

以流式方式将音频转录为输入语言。

$stream = $client->audio()->transcribeStreamed([
    'model' => 'gpt-4o-transcribe',
    'file' => fopen('audio.mp3', 'r'),
]);

foreach ($stream as $event) {
    echo json_encode($event->toArray()); // {"event":"transcript.text.delta","data":{"delta":"The"}}
}

translate

将音频翻译成英语。

$response = $client->audio()->translate([
    'model' => 'whisper-1',
    'file' => fopen('german.mp3', 'r'),
    'response_format' => 'verbose_json',
]);

$response->task; // 'translate'
$response->language; // 'english'
$response->duration; // 2.95
$response->text; // 'Hello, how are you?'

foreach ($response->segments as $segment) {
    $segment->index; // 0
    $segment->seek; // 0
    $segment->start; // 0.0
    $segment->end; // 4.0
    $segment->text; // 'Hello, how are you?'
    $segment->tokens; // [50364, 2425, 11, 577, 366, 291, 30, 50564]
    $segment->temperature; // 0.0
    $segment->avgLogprob; // -0.45045216878255206
    $segment->compressionRatio; // 0.7037037037037037
    $segment->noSpeechProb; // 0.1076972484588623
    $segment->transient; // false
}

$response->toArray(); // ['task' => 'translate', ...]

Embeddings 资源

create

创建表示输入文本的嵌入向量。

$response = $client->embeddings()->create([
    'model' => 'text-similarity-babbage-001',
    'input' => 'The food was delicious and the waiter...',
]);

$response->object; // 'list'

foreach ($response->embeddings as $embedding) {
    $embedding->object; // 'embedding'
    $embedding->model; // 'text-similarity-babbage-001'
    $embedding->embedding; // [0.018990106880664825, -0.0073809814639389515, ...]
    $embedding->index; // 0
}

$response->usage->promptTokens; // 8,
$response->usage->totalTokens; // 8

$response->toArray(); // ['data' => [...], ...]

Files 资源

list

返回属于用户组织的文件列表。

$response = $client->files()->list();

$response->object; // 'list'

foreach ($response->data as $result) {
    $result->id; // 'file-XjGxS3KTG0uNmNOK362iJua3'
    $result->object; // 'file'
    // ...
}

$response->toArray(); // ['object' => 'list', 'data' => [...]]

delete

删除文件。

$response = $client->files()->delete($file);

$response->id; // 'file-XjGxS3KTG0uNmNOK362iJua3'
$response->object; // 'file'
$response->deleted; // true

$response->toArray(); // ['id' => 'file-XjGxS3KTG0uNmNOK362iJua3', ...]

retrieve

返回特定文件的信息。

$response = $client->files()->retrieve('file-XjGxS3KTG0uNmNOK362iJua3');

$response->id; // 'file-XjGxS3KTG0uNmNOK362iJua3'
$response->object; // 'file'
$response->bytes; // 140
$response->createdAt; // 1613779657
$response->filename; // 'mydata.jsonl'
$response->purpose; // 'fine-tune'
$response->status; // 'succeeded'
$response->status_details; // null

$response->toArray(); // ['id' => 'file-XjGxS3KTG0uNmNOK362iJua3', ...]

upload

上传包含文档的文件,供各种端点/功能使用。

$response = $client->files()->upload([
        'purpose' => 'fine-tune',
        'file' => fopen('my-file.jsonl', 'r'),
    ]);

$response->id; // 'file-XjGxS3KTG0uNmNOK362iJua3'
$response->object; // 'file'
$response->bytes; // 140
$response->createdAt; // 1613779657
$response->filename; // 'mydata.jsonl'
$response->purpose; // 'fine-tune'
$response->status; // 'succeeded'
$response->status_details; // null

$response->toArray(); // ['id' => 'file-XjGxS3KTG0uNmNOK362iJua3', ...]

download

返回指定文件的内容。

$client->files()->download($file); // '{"prompt": "<prompt text>", ...'

FineTuning 资源

create job

创建一个作业,用于从给定数据集微调指定模型。

$response = $client->fineTuning()->createJob([
    'training_file' => 'file-abc123',
    'validation_file' => null,
    'model' => 'gpt-3.5-turbo',
    'hyperparameters' => [
        'n_epochs' => 4,
    ],
    'suffix' => null,
]);

$response->id; // 'ftjob-AF1WoRqd3aJAHsqc9NY7iL8F'
$response->object; // 'fine_tuning.job'
$response->model; // 'gpt-3.5-turbo-0613'
$response->fineTunedModel; // null
// ...

$response->toArray(); // ['id' => 'ftjob-AF1WoRqd3aJAHsqc9NY7iL8F', ...]

list jobs

列出您组织的微调作业。

$response = $client->fineTuning()->listJobs();

$response->object; // 'list'

foreach ($response->data as $result) {
    $result->id; // 'ftjob-AF1WoRqd3aJAHsqc9NY7iL8F'
    $result->object; // 'fine_tuning.job'
    // ...
}

$response->toArray(); // ['object' => 'list', 'data' => [...]]

您可以向 listJobs 方法传递额外参数以缩小结果范围。

$response = $client->fineTuning()->listJobs([
    'limit' => 3, // 要检索的作业数量(默认:20)
    'after' => 'ftjob-AF1WoRqd3aJAHsqc9NY7iL8F', // 上一次分页请求中最后一条作业的标识符。
]);

retrieve job

获取微调作业的相关信息。

$response = $client->fineTuning()->retrieveJob('ftjob-AF1WoRqd3aJAHsqc9NY7iL8F');

$response->id; // 'ftjob-AF1WoRqd3aJAHsqc9NY7iL8F'
$response->object; // 'fine_tuning.job'
$response->model; // 'gpt-3.5-turbo-0613'
$response->createdAt; // 1614807352
$response->finishedAt; // 1692819450
$response->fineTunedModel; // 'ft:gpt-3.5-turbo-0613:jwe-dev::7qnxQ0sQ'
$response->organizationId; // 'org-jwe45798ASN82s'
$response->resultFiles[0]; // 'file-1bl05WrhsKDDEdg8XSP617QF'
$response->status; // 'succeeded'
$response->validationFile; // null
$response->trainingFile; // 'file-abc123'
$response->trainedTokens; // 5049

$response->hyperparameters->nEpochs; // 9

$response->toArray(); // ['id' => 'ftjob-AF1WoRqd3aJAHsqc9NY7iL8F', ...]

cancel job

立即取消一个微调作业。

$response = $client->fineTuning()->cancelJob('ftjob-AF1WoRqd3aJAHsqc9NY7iL8F');

$response->id; // 'ftjob-AF1WoRqd3aJAHsqc9NY7iL8F'
$response->object; // 'fine_tuning.job'
// ...
$response->status; // 'cancelled'
// ...

$response->toArray(); // ['id' => 'ftjob-AF1WoRqd3aJAHsqc9NY7iL8F', ...]

list job events

获取微调作业的状态更新。

$response = $client->fineTuning()->listJobEvents('ftjob-AF1WoRqd3aJAHsqc9NY7iL8F');

$response->object; // 'list'

foreach ($response->data as $result) {
    $result->object; // 'fine_tuning.job.event' 
    $result->createdAt; // 1614807352
    // ...
}

$response->toArray(); // ['object' => 'list', 'data' => [...]]

您可以向 listJobEvents 方法传递额外参数以缩小结果范围。

$response = $client->fineTuning()->listJobEvents('ftjob-AF1WoRqd3aJAHsqc9NY7iL8F', [
    'limit' => 3, // 要检索的事件数量(默认:20)
    'after' => 'ftevent-kLPSMIcsqshEUEJVOVBVcHlP', // 上一次分页请求中最后一条事件的标识符。
]);

Moderations 资源

create

分类文本是否违反 OpenAI 的内容政策。

$response = $client->moderations()->create([
    'model' => 'text-moderation-latest',
    'input' => '我想干掉他们。',
]);

$response->id; // modr-5xOyuS
$response->model; // text-moderation-003

foreach ($response->results as $result) {
    $result->flagged; // true

    foreach ($result->categories as $category) {
        $category->category->value; // 'violence'
        $category->violated; // true
        $category->score; // 0.97431367635727
    }
}

$response->toArray(); // ['id' => 'modr-5xOyuS', ...]

Images 资源

create

根据提示生成一张图片。

$response = $client->images()->create([
    'model' => 'dall-e-3',
    'prompt' => '一只可爱的小海獭',
    'n' => 1,
    'size' => '1024x1024',
    'response_format' => 'url',
]);

$response->created; // 1589478378

foreach ($response->data as $data) {
    $data->url; // 'https://oaidalleapiprodscus.blob.core.windows.net/private/...'
    $data->b64_json; // null
}

$response->toArray(); // ['created' => 1589478378, data => ['url' => 'https://oaidalleapiprodscus...', ...]]

create streamed

当您将 stream 设置为 true 来创建图片时,服务器会在图片生成过程中向客户端发送服务器发送事件。所有事件及其负载都可以在 OpenAI 文档 中找到。

$stream = $client->images()->createStreamed([
    'model' => 'gpt-image-1',
    'prompt' => '一只可爱的小海獭',
    'n' => 1,
    'size' => '1024x1024',
    'response_format' => 'url',
]);

foreach ($stream as $image) {
    $image->type; // 'image_generation.partial_image'
}

edit

根据原始图片和提示生成编辑或扩展后的图片。

$response = $client->images()->edit([
    'image' => fopen('image_edit_original.png', 'r'),
    'mask' => fopen('image_edit_mask.png', 'r'),
    'prompt' => '一个阳光明媚的室内休息区,泳池里有一只火烈鸟',
    'n' => 1,
    'size' => '256x256',
    'response_format' => 'url',
]);

$response->created; // 1589478378

foreach ($response->data as $data) {
    $data->url; // 'https://oaidalleapiprodscus.blob.core.windows.net/private/...'
    $data->b64_json; // null
}

$response->toArray(); // ['created' => 1589478378, data => ['url' => 'https://oaidalleapiprodscus...', ...]]

edit streamed

当您将 stream 设置为 true 来编辑图片时,服务器会在图片生成过程中向客户端发送服务器发送事件。所有事件及其负载都可以在 OpenAI 文档 中找到。

$stream = $client->images()->editStreamed([
    'model' => 'gpt-image-1',
    'prompt' => '一只可爱的小海獭',
    'n' => 1,
    'size' => '1024x1024',
    'response_format' => 'url',
]);

foreach ($stream as $image) {
    $image->type; // 'image_generation.partial_image'
}

variation

根据给定的图片生成变体。

$response = $client->images()->variation([
    'image' => fopen('image_edit_original.png', 'r'),
    'n' => 1,
    'size' => '256x256',
    'response_format' => 'url',
]);

$response->created; // 1589478378

foreach ($response->data as $data) {
    $data->url; // 'https://oaidalleapiprodscus.blob.core.windows.net/private/...'
    $data->b64_json; // null
}

$response->toArray(); // ['created' => 1589478378, data => ['url' => 'https://oaidalleapiprodscus...', ...]]

Batches 资源

create

创建一个批次。

$fileResponse = $client->files()->upload(
     parameters: [
          'purpose' => 'batch',
          'file' => fopen('commands.jsonl', 'r'),
    ]
);

$fileId = $fileResponse->id;

$response = $client->batches()->create(
    parameters: [
        'input_file_id' => $fileId,
        'endpoint' => '/v1/chat/completions',
        'completion_window' => '24h'
    ]
 );

$response->id; // 'batch_abc123'
$response->object; // 'batch'
$response->endpoint; // /v1/chat/completions
$response->errors; // null
$response->completionWindow; // '24h'
$response->status; // 'validating'
$response->outputFileId; // null
$response->errorFileId; // null
$response->createdAt; // 1714508499
$response->inProgressAt; // null
$response->expiresAt; // 1714536634
$response->completedAt; // null
$response->failedAt; // null
$response->expiredAt; // null
$response->requestCounts; // null
$response->metadata; // ['name' => 'My batch name']

$response->toArray(); // ['id' => 'batch_abc123', ...]

retrieve

检索一个批次。

$response = $client->batches()->retrieve(id: 'batch_abc123');

$response->id; // 'batch_abc123'
$response->object; // 'batch'
$response->endpoint; // /v1/chat/completions
$response->errors; // null
$response->completionWindow; // '24h'
$response->status; // 'validating'
$response->outputFileId; // null
$response->errorFileId; // null
$response->createdAt; // 1714508499
$response->inProgressAt; // null
$response->expiresAt; // 1714536634
$response->completedAt; // null
$response->failedAt; // null
$response->expiredAt; // null
$response->requestCounts->total; // 100
$response->requestCounts->completed; // 95
$response->requestCounts->failed; // 5
$response->metadata; // ['name' => 'My batch name']

$response->toArray(); // ['id' => 'batch_abc123', ...]

cancel

取消一个批次。

$response = $client->batches()->cancel(id: 'batch_abc123');

$response->id; // 'batch_abc123'
$response->object; // 'batch'
$response->endpoint; // /v1/chat/completions
$response->errors; // null
$response->completionWindow; // '24h'
$response->status; // 'cancelling'
$response->outputFileId; // null
$response->errorFileId; // null
$response->createdAt; // 1711471533
$response->inProgressAt; // 1711471538
$response->expiresAt; // 1711557933
$response->cancellingAt; // 1711475133
$response->cancelledAt; // null
$response->requestCounts->total; // 100
$response->requestCounts->completed; // 23
$response->requestCounts->failed; // 1
$response->metadata; // ['name' => 'My batch name']

$response->toArray(); // ['id' => 'batch_abc123', ...]

list

返回批次列表。

$response = $client->batches()->list(
    parameters: [
        'limit' => 10, 
    ],
);

$response->object; // 'list'
$response->firstId; // 'batch_abc123'
$response->lastId; // 'batch_abc456'
$response->hasMore; // true

foreach ($response->data as $result) {
    $result->id; // 'batch_abc123'
    // ...
}

$response->toArray(); // ['object' => 'list', ...]]

Vector Stores 资源

create

创建一个向量存储。

$response = $client->vectorStores()->create([
    'file_ids' => [
        'file-fUU0hFRuQ1GzhOweTNeJlCXG',
    ],
    'name' => '我的第一个向量存储',
]);

$response->id; // 'vs_vzfQhlTWVUl38QGqQAoQjeDF'
$response->object; // 'vector_store'
$response->createdAt; // 1717703267
$response->name; // '我的第一个向量存储'
$response->usageBytes; // 0
$response->fileCounts->inProgress; // 1
$response->fileCounts->completed; // 0
$response->fileCounts->failed; // 0
$response->fileCounts->cancelled; // 0
$response->fileCounts->total; // 1
$response->status; // 'in_progress'
$response->expiresAfter; // null
$response->expiresAt; // null
$response->lastActiveAt; // 1717703267

$response->toArray(); // ['id' => 'vs_vzfQhlTWVUl38QGqQAoQjeDF', ...]

retrieve

检索一个向量存储。

$response = $client->vectorStores()->retrieve(
    vectorStoreId: 'vs_vzfQhlTWVUl38QGqQAoQjeDF',
);

$response->id; // 'vs_vzfQhlTWVUl38QGqQAoQjeDF'
$response->object; // 'vector_store'
$response->createdAt; // 1717703267
$response->name; // '我的第一个向量存储'
$response->usageBytes; // 0
$response->fileCounts->inProgress; // 1
$response->fileCounts->completed; // 0
$response->fileCounts->failed; // 0
$response->fileCounts->cancelled; // 0
$response->fileCounts->total; // 1
$response->status; // 'in_progress'
$response->expiresAfter; // null
$response->expiresAt; // null
,response->lastActiveAt; // 1717703267

$response->toArray(); // ['id' => 'vs_vzfQhlTWVUl38QGqQAoQjeDF', ...]

modify

修改一个向量存储。

$response = $client->vectorStores()->modify(
    vectorStoreId: 'vs_vzfQhlTWVUl38QGqQAoQjeDF',
    parameters:  [
        'name' => '新名称',
    ],
);

$response->id; // 'vs_vzfQhlTWVUl38QGqQAoQjeDF'
$response->object; // 'vector_store'
,response->createdAt; // 1717703267
,response->name; // '新名称'
,response->usageBytes; // 0
,response->fileCounts->inProgress; // 1
,response->fileCounts->completed; // 0
,response->fileCounts->failed; // 0
,response->fileCounts->cancelled; // 0
,response->fileCounts->total; // 1
,response->status; // 'in_progress'
,response->expiresAfter; // null
,response->expiresAt; // null
,response->lastActiveAt; // 1717703267

,response->toArray(); // ['id' => 'vs_vzfQhlTWVUl38QGqQAoQjeDF', ...]

delete

删除一个向量存储。

$response = $client->vectorStores()->delete(
    vectorStoreId: 'vs_vzfQhlTWVUl38QGqQAoQjeDF',
);

,response->id; // 'vs_vzfQhlTWVUl38QGqQAoQjeDF'
,response->object; // 'vector_store.deleted'
,response->deleted; // true

,response->toArray(); // ['id' => 'vs_vzfQhlTWVUl38QGqQAoQjeDF', ...]

list

返回向量存储列表。

$response = $client->vectorStores()->list(
    parameters: [
        'limit' => 10,
    ],
);

,response->object; // 'list'
,response->firstId; // 'vs_vzfQhlTWVUl38QGqQAoQjeDF'
,response->lastId; // 'vs_D5DPOgBxSoEBTmYBgUESdPpa'
,response->hasMore; // true

foreach ($response->data as $result) {
    $result->id; // 'vs_vzfQhlTWVUl38QGqQAoQjeDF'
    // ...
}

,response->toArray(); // ['object' => 'list', ...]]

向量存储文件 资源

create

通过将文件附加到向量存储来创建向量存储文件。

$response = $client->vectorStores()->files()->create(
    vectorStoreId: 'vs_vzfQhlTWVUl38QGqQAoQjeDF',
    parameters: [
        'file_id' => 'file-fUU0hFRuQ1GzhOweTNeJlCXG',
    ]
);

$response->id; // 'file-fUU0hFRuQ1GzhOweTNeJlCXG'
$response->object; // 'vector_store.file'
$response->usageBytes; // 4553
$response->createdAt; // 1717703267
$response->vectorStoreId; // 'vs_vzfQhlTWVUl38QGqQAoQjeDF'
$response->status; // 'completed'
$response->lastError; // null
$response->chunkingStrategy->type; // 'static'
$response->chunkingStrategy->maxChunkSizeTokens; // 800
$response->chunkingStrategy->chunkOverlapTokens; // 400

$response->toArray(); // ['id' => 'file-fUU0hFRuQ1GzhOweTNeJlCXG', ...]

retrieve

检索一个向量存储文件。

$response = $client->vectorStores()->files()->retrieve(
    vectorStoreId: 'vs_vzfQhlTWVUl38QGqQAoQjeDF',
    fileId: 'file-fUU0hFRuQ1GzhOweTNeJlCXG',
);

$response->id; // 'file-fUU0hFRuQ1GzhOweTNeJlCXG'
$response->object; // 'vector_store.file'
$response->usageBytes; // 4553
$response->createdAt; // 1717703267
$response->vectorStoreId; // 'vs_vzfQhlTWVUl38QGqQAoQjeDF'
$response->status; // 'completed'
$response->lastError; // null
$response->chunkingStrategy->type; // 'static'
$response->chunkingStrategy->maxChunkSizeTokens; // 800
$response->chunkingStrategy->chunkOverlapTokens; // 400

$response->toArray(); // ['id' => 'file-fUU0hFRuQ1GzhOweTNeJlCXG', ...]

delete

删除一个向量存储文件。这会从向量存储中移除该文件,但文件本身不会被删除。要删除文件,请使用删除文件端点。

$response = $client->vectorStores()->files()->delete(
    vectorStoreId: 'vs_vzfQhlTWVUl38QGqQAoQjeDF',
    fileId: 'file-fUU0hFRuQ1GzhOweTNeJlCXG',
);

$response->id; // 'file-fUU0hFRuQ1GzhOweTNeJlCXG'
$response->object; // 'vector_store.file.deleted'
$response->deleted; // true

$response->toArray(); // ['id' => 'file-fUU0hFRuQ1GzhOweTNeJlCXG', ...]

list

返回向量存储文件列表。

$response = $client->vectorStores()->files()->list(
    vectorStoreId: 'vs_vzfQhlTWVUl38QGqQAoQjeDF',
    parameters: [
        'limit' => 10,
    ],
);

$response->object; // 'list'
$response->firstId; // 'file-fUU0hFRuQ1GzhOweTNeJlCXG'
$response->lastId; // 'file-D5DPOgBxSoEBTmYBgUESdPpa'
$response->hasMore; // true

foreach ($response->data as $result) {
    $result->id; // 'file-fUU0hFRuQ1GzhOweTNeJlCXG'
    // ...
}

$response->toArray(); // ['object' => 'list', ...]]

search

根据查询和文件属性筛选器,在向量存储中搜索相关片段。

$response = $client->vectorStores()->search(
    vectorStoreId: 'vs_vzfQhlTWVUl38QGqQAoQjeDF',
    parameters: [
        'query' => '什么是退货政策?',
        'max_num_results' => 5,
        'filters' => [],
        'rewrite_query' => false
    ]
);

$response->object; // 'vector_store.search_results.page'
$response->searchQuery; // '什么是退货政策?'
$response->hasMore; // false
$response->nextPage; // null
foreach ($response->data as $file) {
    $result->fileId; // 'file-fUU0hFRuQ1GzhOweTNeJlCXG'
    $result->filename; // 'return_policy.pdf'
    $result->score; // 0.95
    $result->attributes; // ['category' => 'customer_service']

    foreach ($result->content as $content) {
        $content->type; // 'text'
        $content->text; // '我们的退货政策允许客户在30天内退货...'
    }
}

$response->toArray(); // ['object' => 'vector_store.search_results.page', ...]

向量存储文件批次 资源

create

创建一个向量存储文件批次。

$response = $client->vectorStores()->batches()->create(
    vectorStoreId: 'vs_vzfQhlTWVUl38QGqQAoQjeDF',
    parameters: [
        'file_ids' => [
            'file-fUU0hFRuQ1GzhOweTNeJlCXG',
        ],
    ]
);

$response->id; // 'vsfb_123'
$response->object; // 'vector_store.files_batch'
$response->createdAt; // 1698107661
$response->vectorStoreId; // 'vs_vzfQhlTWVUl38QGqQAoQjeDF'
$response->status; // 'completed'
$response->fileCounts->inProgress; // 1
$response->fileCounts->completed; // 0
$response->fileCounts->failed; // 0
$response->fileCounts->cancelled; // 0
$response->fileCounts->total; // 1

$response->toArray(); // ['id' => 'vsfb_123', ...]

retrieve

检索一个向量存储文件批次。

$response = $client->vectorStores()->batches()->retrieve(
    vectorStoreId: 'vs_vzfQhlTWVUl38QGqQAoQjeDF',
    fileBatchId: 'vsfb_123',
);

$response->id; // 'vsfb_123'
$response->object; // 'vector_store.files_batch'
$response->createdAt; // 1698107661
$response->vectorStoreId; // 'vs_vzfQhlTWVUl38QGqQAoQjeDF'
$response->status; // 'completed'
$response->fileCounts->inProgress; // 1
$response->fileCounts->completed; // 0
,response->fileCounts->failed; // 0
,response->fileCounts->cancelled; // 0
,response->fileCounts->total; // 1

,response->toArray(); // ['id' => 'vsfb_123', ...]

cancel

取消一个向量存储文件批次。这会尽快尝试取消该批次中文件的处理。

$response = $client->vectorStores()->batches()->cancel(
    vectorStoreId: 'vs_vzfQhlTWVUl38QGqQAoQjeDF',
    fileBatchId: 'vsfb_123',
);

,response->id; // 'vsfb_123'
,response->object; // 'vector_store.files_batch'
,response->createdAt; // 1698107661
,response->vectorStoreId; // 'vs_vzfQhlTWVUl38QGqQAoQjeDF'
,response->status; // 'cancelling'
,response->fileCounts->inProgress; // 1
,response->fileCounts->completed; // 0
,response->fileCounts->failed; // 0
,response->fileCounts->cancelled; // 0
,response->fileCounts->total; // 1

,response->toArray(); // ['id' => 'vsfb_123', ...]

list

返回向量存储文件列表。

$response = $client->vectorStores()->batches()->listFiles(
    vectorStoreId: 'vs_vzfQhlTWVUl38QGqQAoQjeDF',
    fileBatchId: 'vsfb_123',
    parameters: [
        'limit' => 10,
    ],
);

,response->object; // 'list'
,response->firstId; // 'file-fUU0hFRuQ1GzhOweTNeJlCXG'
,response->lastId; // 'file-D5DPOgBxSoEBTmYBgUESdPpa'
,response->hasMore; // true

foreach ($response->data as $result) {
    $result->id; // 'file-fUU0hFRuQ1GzhOweTNeJlCXG'
    // ...
}

,response->toArray(); // ['object' => 'list', ...]]

实时临时密钥

token

为实时会话创建一个临时 API 密钥。

$response = $client->realtime()->token();

,response->clientSecret->value // 'ek-1234567890abcdefg'
,response->clientSecret->expiresAt // 1717703267

transcribeToken

为实时转录会话创建一个临时 API 密钥。

,response = $client->realtime()->transcribeToken();

,response->clientSecret->value // 'et-1234567890abcdefg'
,response->clientSecret->expiresAt // 1717703267

Completions 资源(旧版)

[!WARNING]
OpenAI 于 2023 年 7 月将 Completions 资源标记为“旧版”。请改用 Chat 资源。

完成 API 信息

create

根据提供的提示和参数创建完成结果。

$response = $client->completions()->create([
    'model' => 'gpt-3.5-turbo-instruct',
    'prompt' => 'Say this is a test',
    'max_tokens' => 6,
    'temperature' => 0
]);

$response->id; // 'cmpl-uqkvlQyYK7bGYrRHQ0eXlWi7'
$response->object; // 'text_completion'
$response->created; // 1589478378
$response->model; // 'gpt-3.5-turbo-instruct'

foreach ($response->choices as $choice) {
    $choice->text; // '\n\nThis is a test'
    $choice->index; // 0
    $choice->logprobs; // null
    $choice->finishReason; // 'length' 或 null
}

$response->usage->promptTokens; // 5,
$response->usage->completionTokens; // 6,
$response->usage->totalTokens; // 11

$response->toArray(); // ['id' => 'cmpl-uqkvlQyYK7bGYrRHQ0eXlWi7', ...]

create streamed

根据提供的提示和参数创建流式完成结果。

$stream = $client->completions()->createStreamed([
        'model' => 'gpt-3.5-turbo-instruct',
        'prompt' => 'Hi',
        'max_tokens' => 10,
    ]);

foreach($stream as $response){
    $response->choices[0]->text;
}
// 第1次迭代 => 'I'
// 第2次迭代 => ' am'
// 第3次迭代 => ' very'
// 第4次迭代 => ' excited'
// ...

Assistants 资源(已弃用)

[!WARNING] OpenAI 已弃用 Assistants API,并将于 2026 年 8 月 26 日停止支持。https://platform.openai.com/docs/guides/migrate-to-responses#assistants-api

助手 API 信息

注意 - 如果您从工厂手动创建客户端,请确保提供必要的头部信息:

$factory->withHttpHeader('OpenAI-Beta', 'assistants=v2')

create

使用模型和指令创建助手。

$response = $client->assistants()->create([
    'instructions' => '你是一位私人数学家教。当被问到问题时,编写并运行 Python 代码来回答问题。',
    'name' => '数学家教',
    'tools' => [
        [
            'type' => 'code_interpreter',
        ],
    ],
    'model' => 'gpt-4o',
]);

$response->id; // 'asst_gxzBkD1wkKEloYqZ410pT5pd'
$response->object; // 'assistant'
$response->createdAt; // 1623936000
$response->name; // '数学家教'
$response->instructions; // '你是一位私人数学家教。当被问到问题时,编写并运行 Python 代码来回答问题。'
$response->model; // 'gpt-4o'
$response->description; // null
$response->tools[0]->type; // 'code_interpreter'
$response->toolResources; // []
$response->metadata; // []
$response->temperature: // null
$response->topP: // null
$response->format: // 'auto'

$response->toArray(); // ['id' => 'asst_gxzBkD1wkKEloYqZ410pT5pd', ...]

retrieve

检索助手。

$response = $client->assistants()->retrieve('asst_gxzBkD1wkKEloYqZ410pT5pd');

$response->id; // 'asst_gxzBkD1wkKEloYqZ410pT5pd'
$response->object; // 'assistant'
$response->createdAt; // 1623936000
$response->name; // '数学家教'
$response->instructions; // '你是一位私人数学家教。当被问到问题时,编写并运行 Python 代码来回答问题。'
$response->model; // 'gpt-4o'
$response->description; // null
$response->tools[0]->type; // 'code_interpreter'
$response->toolResources; // []
$response->metadata; // []
$response->temperature: // null
$response->topP: // null
$response->format: // 'auto'

$response->toArray(); // ['id' => 'asst_gxzBkD1wkKEloYqZ410pT5pd', ...]

modify

修改助手。

$response = $client->assistants()->modify('asst_gxzBkD1wkKEloYqZ410pT5pd', [
        'name' => '新数学家教',
    ]);

$response->id; // 'asst_gxzBkD1wkKEloYqZ410pT5pd'
$response->object; // 'assistant'
$response->createdAt; // 1623936000
$response->name; // '新数学家教'
$response->instructions; // '你是一位私人数学家教。当被问到问题时,编写并运行 Python 代码来回答问题。'
$response->model; // 'gpt-4o'
$response->description; // null
$response->tools[0]->type; // 'code_interpreter'
$response->toolResources; // []
$response->metadata; // []
$response->temperature: // null
$response->topP: // null
$response->format: // 'auto'

$response->toArray(); // ['id' => 'asst_gxzBkD1wkKEloYqZ410pT5pd', ...]

delete

删除助手。

$response = $client->assistants()->delete('asst_gxzBkD1wkKEloYqZ410pT5pd');

$response->id; // 'asst_gxzBkD1wkKEloYqZ410pT5pd'
$response->object; // 'assistant.deleted'
$response->deleted; // true

$response->toArray(); // ['id' => 'asst_gxzBkD1wkKEloYqZ410pT5pd', ...]

list

返回助手列表。

$response = $client->assistants()->list([
    'limit' => 10,
]);

$response->object; // 'list'
$response->firstId; // 'asst_gxzBkD1wkKEloYqZ410pT5pd'
$response->lastId; // 'asst_reHHtAM0jKLDIxanM6gP6DaR'
$response->hasMore; // true

foreach ($response->data as $result) {
    $result->id; // 'asst_gxzBkD1wkKEloYqZ410pT5pd'
    // ...
}

$response->toArray(); // ['object' => 'list', ...]]

Threads 资源(已弃用)

[!WARNING] OpenAI 已弃用 Assistants API,并将于 2026 年 8 月 26 日停止支持。https://platform.openai.com/docs/guides/migrate-to-responses#assistants-api

Threads API 信息

create

创建一个 thread。

$response = $client->threads()->create([]);

$response->id; // 'thread_tKFLqzRN9n7MnyKKvc1Q7868'
$response->object; // 'thread'
$response->createdAt; // 1623936000
$response->toolResources; // null
$response->metadata; // []

$response->toArray(); // ['id' => 'thread_tKFLqzRN9n7MnyKKvc1Q7868', ...]

createAndRun

在一个请求中创建并运行一个 thread。

$response = $client->threads()->createAndRun(
    [
        'assistant_id' => 'asst_gxzBkD1wkKEloYqZ410pT5pd',
        'thread' => [
            'messages' =>
                [
                    [
                        'role' => 'user',
                        'content' => '向 5 岁的孩子解释深度学习。',
                    ],
                ],
        ],
    ],
);

$response->id; // 'run_4RCYyYzX9m41WQicoJtUQAb8'
$response->object; // 'thread.run'
$response->createdAt; // 1623936000
$response->assistantId; // 'asst_gxzBkD1wkKEloYqZ410pT5pd'
$response->threadId; // 'thread_tKFLqzRN9n7MnyKKvc1Q7868'
$response->status; // 'queued'
$response->requiredAction; // null
$response->lastError; // null
$response->startedAt; // null
$response->expiresAt; // 1699622335
$response->cancelledAt; // null
$response->failedAt; // null
$response->completedAt; // null
$response->incompleteDetails; // null
$response->model; // 'gpt-4o'
$response->instructions; // null
$response->tools; // []
$response->metadata; // []
$response->usage->total_tokens; // 579
$response->temperature; // null
$response->topP; // null
$response->maxPromptTokens; // 1000
$response->maxCompletionTokens; // 1000
$response->truncationStrategy->type; // 'auto'
$response->responseFormat; // 'auto'
$response->toolChoice; // 'auto'

$response->toArray(); // ['id' => 'run_4RCYyYzX9m41WQicoJtUQAb8', ...]

retrieve

检索一个 thread。

$response = $client->threads()->retrieve('thread_tKFLqzRN9n7MnyKKvc1Q7868');

$response->id; // 'thread_tKFLqzRN9n7MnyKKvc1Q7868'
$response->object; // 'thread'
$response->createdAt; // 1623936000
$response->toolResources; // null
$response->metadata; // []

$response->toArray(); // ['id' => 'thread_tKFLqzRN9n7MnyKKvc1Q7868', ...]

modify

修改一个 thread。

$response = $client->threads()->modify('thread_tKFLqzRN9n7MnyKKvc1Q7868', [
        'metadata' => [
            'name' => '我的新 thread 名称',
        ],
    ]);

$response->id; // 'thread_tKFLqzRN9n7MnyKKvc1Q7868'
$response->object; // 'thread'
$response->createdAt; // 1623936000
$response->toolResources; // null
$response->metadata; // ['name' => '我的新 thread 名称']

$response->toArray(); // ['id' => 'thread_tKFLqzRN9n7MnyKKvc1Q7868', ...]

delete

删除一个 thread。

$response = $client->threads()->delete('thread_tKFLqzRN9n7MnyKKvc1Q7868');

$response->id; // 'thread_tKFLqzRN9n7MnyKKvc1Q7868'
$response->object; // 'thread.deleted'
$response->deleted; // true

$response->toArray(); // ['id' => 'thread_tKFLqzRN9n7MnyKKvc1Q7868', ...]

线程消息 资源(已弃用)

[!警告] OpenAI 已弃用 Assistants API,并将于 2026 年 8 月 26 日停止支持。https://platform.openai.com/docs/guides/migrate-to-responses#assistants-api

线程消息 API 信息

create

创建一条消息。

$response = $client->threads()->messages()->create('thread_tKFLqzRN9n7MnyKKvc1Q7868', [
    'role' => 'user',
    'content' => '5 和 7 的和是多少?',
]);

$response->id; // 'msg_SKYwvF3zcigxthfn6F4hnpdU'
$response->object; // 'thread.message'
$response->createdAt; // 1623936000
$response->threadId; // 'thread_tKFLqzRN9n7MnyKKvc1Q7868'
$response->status; // 'in_progress'
$response->incompleteDetails; // null
$response->completedAt; // null
$response->incompleteAt; // null
$response->role; // 'user'
$response->content[0]->type; // 'text'
$response->content[0]->text->value; // '5 和 7 的和是多少?'
$response->content[0]->text->annotations; // []
$response->assistantId; // null
$response->runId; // null
$response->attachments; // []
$response->metadata; // []

$response->toArray(); // ['id' => 'msg_SKYwvF3zcigxthfn6F4hnpdU', ...]

retrieve

检索一条消息。

$response = $client->threads()->messages()->retrieve(
    threadId: 'thread_tKFLqzRN9n7MnyKKvc1Q7868',
    messageId: 'msg_SKYwvF3zcigxthfn6F4hnpdU',
);

$response->id; // 'msg_SKYwvF3zcigxthfn6F4hnpdU'
$response->object; // 'thread.message'
$response->createdAt; // 1623936000
$response->threadId; // 'thread_tKFLqzRN9n7MnyKKvc1Q7868'
$response->status; // 'in_progress'
$response->incompleteDetails; // null
$response->completedAt; // null
$response->incompleteAt; // null
$response->role; // 'user'
$response->content[0]->type; // 'text'
$response->content[0]->text->value; // '5 和 7 的和是多少?'
$response->content[0]->text->annotations; // []
$response->assistantId; // null
$response->runId; // null
$response->attachments; // []
$response->metadata; // []

$response->toArray(); // ['id' => 'msg_SKYwvF3zcigxthfn6F4hnpdU', ...]

modify

修改一条消息。

$response = $client->threads()->messages()->modify(
    threadId: 'thread_tKFLqzRN9n7MnyKKvc1Q7868',
    messageId: 'msg_SKYwvF3zcigxthfn6F4hnpdU',
    parameters:  [
        'metadata' => [
            'name' => '我的新消息名称',
        ],
    ],
);

$response->id; // 'msg_SKYwvF3zcigxthfn6F4hnpdU'
$response->object; // 'thread.message'
$response->createdAt; // 1623936000
$response->threadId; // 'thread_tKFLqzRN9n7MnyKKvc1Q7868'
$response->status; // 'in_progress'
$response->incompleteDetails; // null
$response->completedAt; // null
$response->incompleteAt; // null
$response->role; // 'user'
$response->content[0]->type; // 'text'
$response->content[0]->text->value; // '5 和 7 的和是多少?'
$response->content[0]->text->annotations; // []
$response->assistantId; // null
$response->runId; // null
$response->attachments; // []
$response->metadata; // {'name': '我的新消息名称'}

$response->toArray(); // ['id' => 'msg_SKYwvF3zcigxthfn6F4hnpdU', ...]

delete

删除一条消息。

$response = $client->threads()->messages()->delete(
    threadId: 'thread_tKFLqzRN9n7MnyKKvc1Q7868',
    messageId: 'msg_SKYwvF3zcigxthfn6F4hnpdU'
);

$response->id; // 'msg_SKYwvF3zcigxthfn6F4hnpdU'
$response->object; // 'thread.message.deleted'
$response->deleted; // true

$response->toArray(); // ['id' => 'msg_SKYwvF3zcigxthfn6F4hnpdU', ...]

list

返回给定线程的消息列表。

$response = $client->threads()->messages()->list('thread_tKFLqzRN9n7MnyKKvc1Q7868', [
    'limit' => 10,
]);

$response->object; // 'list'
$response->firstId; // 'msg_SKYwvF3zcigxthfn6F4hnpdU'
$response->lastId; // 'msg_SKYwvF3zcigxthfn6F4hnpdU'
$response->hasMore; // false

foreach ($response->data as $result) {
    $result->id; // 'msg_SKYwvF3zcigxthfn6F4hnpdU'
    // ...
}

$response->toArray(); // ['object' => 'list', ...]

线程运行 资源(已弃用)

[!警告] OpenAI 已弃用 Assistants API,并将于 2026 年 8 月 26 日停止支持。https://platform.openai.com/docs/guides/migrate-to-responses#assistants-api

线程运行 API 信息

create

创建一个运行。

$response = $client->threads()->runs()->create(
    threadId: 'thread_tKFLqzRN9n7MnyKKvc1Q7868', 
    parameters: [
        'assistant_id' => 'asst_gxzBkD1wkKEloYqZ410pT5pd',
    ],
);

$response->id; // 'run_4RCYyYzX9m41WQicoJtUQAb8'
$response->object; // 'thread.run'
$response->createdAt; // 1623936000
$response->assistantId; // 'asst_gxzBkD1wkKEloYqZ410pT5pd'
$response->threadId; // 'thread_tKFLqzRN9n7MnyKKvc1Q7868'
$response->status; // 'queued'
$response->startedAt; // null
$response->expiresAt; // 1699622335
$response->cancelledAt; // null
$response->failedAt; // null
$response->completedAt; // null
$response->incompleteDetails; // null
$response->lastError; // null
$response->model; // 'gpt-4o'
$response->instructions; // null
$response->tools; // []
$response->metadata; // []
$response->usage->total_tokens; // 579
$response->temperature; // null
$response->topP; // null
$response->maxPromptTokens; // 1000
$response->maxCompletionTokens; // 1000
$response->truncationStrategy->type; // 'auto'
$response->toolChoice; // 'auto'
$response->responseFormat; // 'auto'

$response->toArray(); // ['id' => 'run_4RCYyYzX9m41WQicoJtUQAb8', ...]

create streamed

创建一个流式运行。

OpenAI 助手事件

$stream = $client->threads()->runs()->createStreamed(
    threadId: 'thread_tKFLqzRN9n7MnyKKvc1Q7868',
    parameters: [
        'assistant_id' => 'asst_gxzBkD1wkKEloYqZ410pT5pd',
    ],
);

foreach($stream as $response){
    $response->event // 'thread.run.created' | 'thread.run.in_progress' | .....
    $response->response // ThreadResponse | ThreadRunResponse | ThreadRunStepResponse | ThreadRunStepDeltaResponse | ThreadMessageResponse | ThreadMessageDeltaResponse
}

// ...

create streamed with function calls

创建一个带有函数调用的流式运行。

OpenAI 助手事件

$stream = $client->threads()->runs()->createStreamed(
    threadId: 'thread_tKFLqzRN9n7MnyKKvc1Q7868',
    parameters: [
        'assistant_id' => 'asst_gxzBkD1wkKEloYqZ410pT5pd',
    ],
);


do{
    foreach($stream as $response){
        $response->event // 'thread.run.created' | 'thread.run.in_progress' | .....
        $response->response // ThreadResponse | ThreadRunResponse | ThreadRunStepResponse | ThreadRunStepDeltaResponse | ThreadMessageResponse | ThreadMessageDeltaResponse

switch($response->event){
            case 'thread.run.created':
            case 'thread.run.queued':
            case 'thread.run.completed':
            case 'thread.run.cancelling':
                $run = $response->response;
                break;
            case 'thread.run.expired':
            case 'thread.run.cancelled':
            case 'thread.run.failed':
                $run = $response->response;
                break 3;
            case 'thread.run.requires_action':
                // 使用提交工具输出后启动的新流覆盖现有流
                $stream = $client->threads()->runs()->submitToolOutputsStreamed(
                    threadId: $run->threadId,
                    runId: $run->id,
                    parameters: [
                        'tool_outputs' => [
                            [
                                'tool_call_id' => 'call_KSg14X7kZF2WDzlPhpQ168Mj',
                                'output' => '12',
                            ]
                        ],
                    ]
                );
                break;
        }
    }
}
while ($run->status != "completed")

// ...

retrieve

获取某个运行的详细信息。

$response = $client->threads()->runs()->retrieve(
    threadId: 'thread_tKFLqzRN9n7MnyKKvc1Q7868',
    runId: 'run_4RCYyYzX9m41WQicoJtUQAb8',
);

$response->id; // 'run_4RCYyYzX9m41WQicoJtUQAb8'
$response->object; // 'thread.run'
$response->createdAt; // 1623936000
$response->assistantId; // 'asst_gxzBkD1wkKEloYqZ410pT5pd'
$response->threadId; // 'thread_tKFLqzRN9n7MnyKKvc1Q7868'
$response->status; // 'queued'
$response->startedAt; // null
$response->expiresAt; // 1699622335
$response->cancelledAt; // null
$response->failedAt; // null
$response->completedAt; // null
$response->incompleteDetails; // null
$response->lastError; // null
$response->model; // 'gpt-4o'
$response->instructions; // null
$response->tools; // []
$response->usage->promptTokens; // 25,
$response->usage->completionTokens; // 32,
$response->usage->totalTokens; // 57
$response->temperature; // null
$response->topP; // null
$response->maxPromptTokens; // 1000
$response->maxCompletionTokens; // 1000
$response->truncationStrategy->type; // 'auto'
$response->toolChoice; // 'auto'
$response->responseFormat; // 'auto'

$response->toArray(); // ['id' => 'run_4RCYyYzX9m41WQicoJtUQAb8', ...]

modify

修改某个运行的属性。

$response = $client->threads()->runs()->modify(
    threadId: 'thread_tKFLqzRN9n7MnyKKvc1Q7868',
    runId: 'run_4RCYyYzX9m41WQicoJtUQAb8',
    parameters:  [
        'metadata' => [
            'name' => '我的新运行名称',
        ],
    ],
);

$response->id; // 'run_4RCYyYzX9m41WQicoJtUQAb8'
$response->object; // 'thread.run'
$response->createdAt; // 1623936000
$response->assistantId; // 'asst_gxzBkD1wkKEloYqZ410pT5pd'
$response->threadId; // 'thread_tKFLqzRN9n7MnyKKvc1Q7868'
$response->status; // 'queued'
$response->startedAt; // null
$response->expiresAt; // 1699622335
$response->cancelledAt; // null
$response->failedAt; // null
$response->completedAt; // null
$response->incompleteDetails; // null
$response->lastError; // null
$response->model; // 'gpt-4o'
$response->instructions; // null
$response->tools; // []
$response->usage->total_tokens; // 579
$response->temperature; // null
$response->topP; // null
$response->maxPromptTokens; // 1000
$response->maxCompletionTokens; // 1000
$response->truncationStrategy->type; // 'auto'
$response->toolChoice; // 'auto'
$response->responseFormat; // 'auto'
$response->metadata; // {'name': '我的新运行名称'}

$response->toArray(); // ['id' => 'run_4RCYyYzX9m41WQicoJtUQAb8', ...]

cancel

取消一个正在执行中的运行。

$response = $client->threads()->runs()->cancel(
    threadId: 'thread_tKFLqzRN9n7MnyKKvc1Q7868',
    runId: 'run_4RCYyYzX9m41WQicoJtUQAb8',
);

$response->id; // 'run_4RCYyYzX9m41WQicoJtUQAb8'
$response->object; // 'thread.run'
$response->createdAt; // 1623936000
$response->assistantId; // 'asst_gxzBkD1wkKEloYqZ410pT5pd'
$response->threadId; // 'thread_tKFLqzRN9n7MnyKKvc1Q7868'
$response->status; // 'cancelling'
$response->startedAt; // null
$response->expiresAt; // 1699622335
$response->cancelledAt; // null
$response->failedAt; // null
$response->completedAt; // null
$response->incompleteDetails; // null
$response->lastError; // null
$response->model; // 'gpt-4o'
$response->instructions; // null
$response->tools; // []
$response->usage?->total_tokens; // 579
$response->temperature; // null
$response->topP; // null
$response->maxPromptTokens; // 1000
$response->maxCompletionTokens; // 1000
$response->truncationStrategy->type; // 'auto'
$response->toolChoice; // 'auto'
$response->responseFormat; // 'auto'
$response->metadata; // []

$response->toArray(); // ['id' => 'run_4RCYyYzX9m41WQicoJtUQAb8', ...]

submitToolOutputs

当运行状态为 requires_actionrequired_action.typesubmit_tool_outputs 时,可以通过此接口提交所有已完成的工具调用的输出。所有输出必须在一次请求中全部提交。

$response = $client->threads()->runs()->submitToolOutputs(
    threadId: 'thread_tKFLqzRN9n7MnyKKvc1Q7868',
    runId: 'run_4RCYyYzX9m41WQicoJtUQAb8',
    parameters: [
        'tool_outputs' => [
            [
                'tool_call_id' => 'call_KSg14X7kZF2WDzlPhpQ168Mj',
                'output' => '12',
            ],
        ],
    ]
);

$response->id; // 'run_4RCYyYzX9m41WQicoJtUQAb8'
$response->object; // 'thread.run'
$response->createdAt; // 1623936000
$response->assistantId; // 'asst_gxzBkD1wkKEloYqZ410pT5pd'
$response->threadId; // 'thread_tKFLqzRN9n7MnyKKvc1Q7868'
$response->status; // 'in_progress'
$response->startedAt; // null
$response->expiresAt; // 1699622335
$response->cancelledAt; // null
$response->failedAt; // null
$response->completedAt; // null
$response->incompleteDetails; // null
$response->lastError; // null
$response->model; // 'gpt-4o'
$response->instructions; // null
$response->usage->total_tokens; // 579
$response->temperature; // null
$response->topP; // null
$response->maxPromptTokens; // 1000
$response->maxCompletionTokens; // 1000
$response->truncationStrategy->type; // 'auto'
$response->responseFormat; // 'auto'
$response->tools[0]->type; // 'function'
$response->toolChoice; // 'auto'
$response->metadata; // []

$response->toArray(); // ['id' => 'run_4RCYyYzX9m41WQicoJtUQAb8', ...]

list

列出某个线程下的所有运行记录。

$response = $client->threads()->runs()->list(
    threadId: 'thread_tKFLqzRN9n7MnyKKvc1Q7868',
    parameters: [
        'limit' => 10,
    ],
);

$response->object; // 'list'
$response->firstId; // 'run_4RCYyYzX9m41WQicoJtUQAb8'
$response->lastId; // 'run_4RCYyYzX9m41WQicoJtUQAb8'
$response->hasMore; // false

foreach ($response->data as $result) {
    $result->id; // 'run_4RCYyYZ9m41WQicoJtUQAb8'
    // ...
}

$response->toArray(); // ['object' => 'list', ...]]

线程运行步骤 资源(已弃用)

[!WARNING] OpenAI 已弃用 Assistants API,并将于 2026 年 8 月 26 日停止服务。https://platform.openai.com/docs/guides/migrate-to-responses#assistants-api

线程运行步骤 API 信息

retrieve

检索一个运行步骤。

$response = $client->threads()->runs()->steps()->retrieve(
    threadId: 'thread_tKFLqzRN9n7MnyKKvc1Q7868',
    runId: 'run_4RCYyYzX9m41WQicoJtUQAb8',
    stepId: 'step_1spQXgbAabXFm1YXrwiGIMUz',
);

$response->id; // 'step_1spQXgbAabXFm1YXrwiGIMUz'
$response->object; // 'thread.run.step'
$response->createdAt; // 1699564106
$response->runId; // 'run_4RCYyYzX9m41WQicoJtUQAb8'
$response->assistantId; // 'asst_gxzBkD1wkKEloYqZ410pT5pd'
$response->threadId; // 'thread_tKFLqzRN9n7MnyKKvc1Q7868'
$response->type; // 'message_creation'
$response->status; // 'completed'
$response->cancelledAt; // null
$response->completedAt; // 1699564119
$response->expiresAt; // null
$response->failedAt; // null
$response->lastError; // null
$response->stepDetails->type; // 'message_creation'
$response->stepDetails->messageCreation->messageId; // 'msg_i404PxKbB92d0JAmdOIcX7vA'

$response->toArray(); // ['id' => 'step_1spQXgbAabXFm1YXrwiGIMUz', ...]

list

返回属于某个运行的所有运行步骤列表。

$response = $client->threads()->runs()->steps()->list(
    threadId: 'thread_tKFLqzRN9n7MnyKKvc1Q7868',
    runId: 'run_4RCYyYzX9m41WQicoJtUQAb8',
    parameters: [
        'limit' => 10,
    ],
);

$response->object; // 'list'
$response->firstId; // 'step_1spQXgbAabXFm1YXrwiGIMUz'
$response->lastId; // 'step_1spQXgbAabXFm1YXrwiGIMUz'
$response->hasMore; // false

foreach ($response->data as $result) {
    $result->id; // 'step_1spQXgbAabXFm1YXrwiGIMUz'
    // ...
}

$response->toArray(); // ['object' => 'list', ...]]

编辑 资源(已弃用)

[!WARNING] OpenAI 已弃用 Edits API,并将于 2024 年 1 月 4 日停止服务。https://openai.com/blog/gpt-4-api-general-availability#deprecation-of-the-edits-api

编辑 API 信息

create

根据提供的输入、指令和参数创建一个新的编辑。

$response = $client->edits()->create([
    'model' => 'text-davinci-edit-001',
    'input' => 'What day of the wek is it?',
    'instruction' => 'Fix the spelling mistakes',
]);

$response->object; // 'edit'
$response->created; // 1589478378

foreach ($response->choices as $choice) {
    $choice->text; // 'What day of the week is it?'
    $choice->index; // 0
}

$response->usage->promptTokens; // 25,
$response->usage->completionTokens; // 32,
$response->usage->totalTokens; // 57

$response->toArray(); // ['object' => 'edit', ...]

FineTunes 资源(已弃用)

[!WARNING] OpenAI 已弃用 FineTunes API,并将于 2024 年 1 月 4 日停止服务 https://platform.openai.com/docs/deprecations#2023-08-22-fine-tunes-endpoint

FineTunes API 信息

create

创建一个作业,从给定的数据集微调指定的模型。

$response = $client->fineTunes()->create([
    'training_file' => 'file-ajSREls59WBbvgSzJSVWxMCB',
    'validation_file' => 'file-XjSREls59WBbvgSzJSVWxMCa',
    'model' => 'curie',
    'n_epochs' => 4,
    'batch_size' => null,
    'learning_rate_multiplier' => null,
    'prompt_loss_weight' => 0.01,
    'compute_classification_metrics' => false,
    'classification_n_classes' => null,
    'classification_positive_class' => null,
    'classification_betas' => [],
    'suffix' => null,
]);

$response->id; // 'ft-AF1WoRqd3aJAHsqc9NY7iL8F'
$response->object; // 'fine-tune'
// ...

$response->toArray(); // ['id' => 'ft-AF1WoRqd3aJAHsqc9NY7iL8F', ...]

list

列出您组织的微调作业。

$response = $client->fineTunes()->list();

$response->object; // 'list'

foreach ($response->data as $result) {
    $result->id; // 'ft-AF1WoRqd3aJAHsqc9NY7iL8F'
    $result->object; // 'fine-tune'
    // ...
}

$response->toArray(); // ['object' => 'list', 'data' => [...]]

retrieve

获取微调作业的相关信息。

$response = $client->fineTunes()->retrieve('ft-AF1WoRqd3aJAHsqc9NY7iL8F');

$response->id; // 'ft-AF1WoRqd3aJAHsqc9NY7iL8F'
$response->object; // 'fine-tune'
$response->model; // 'curie'
$response->createdAt; // 1614807352
$response->fineTunedModel; // 'curie => ft-acmeco-2021-03-03-21-44-20'
$response->organizationId; // 'org-jwe45798ASN82s'
$response->resultFiles; // [
$response->status; // 'succeeded'
$response->validationFiles; // [
$response->trainingFiles; // [
$response->updatedAt; // 1614807865

foreach ($response->events as $result) {
    $result->object; // 'fine-tune-event' 
    $result->createdAt; // 1614807352
    $result->level; // 'info'
    $result->message; // 'Job enqueued. Waiting for jobs ahead to complete. Queue number =>  0.'
}

$response->hyperparams->batchSize; // 4 
$response->hyperparams->learningRateMultiplier; // 0.1 
$response->hyperparams->nEpochs; // 4 
$response->hyperparams->promptLossWeight; // 0.1

foreach ($response->resultFiles as $result) {
    $result->id; // 'file-XjGxS3KTG0uNmNOK362iJua3'
    $result->object; // 'file'
    $result->bytes; // 140
    $result->createdAt; // 1613779657
    $result->filename; // 'mydata.jsonl'
    $result->purpose; // 'fine-tune'
    $result->status; // 'succeeded'
    $result->status_details; // null
}

foreach ($response->validationFiles as $result) {
    $result->id; // 'file-XjGxS3KTG0uNmNOK362iJua3'
    // ...
}

foreach ($response->trainingFiles as $result) {
    $result->id; // 'file-XjGxS3KTG0uNmNOK362iJua3'
    // ...
}

$response->toArray(); // ['id' => 'ft-AF1WoRqd3aJAHsqc9NY7iL8F', ...]

cancel

立即取消一个微调作业。

$response = $client->fineTunes()->cancel('ft-AF1WoRqd3aJAHsqc9NY7iL8F');

$response->id; // 'ft-AF1WoRqd3aJAHsqc9NY7iL8F'
$response->object; // 'fine-tune'
// ...
$response->status; // 'cancelled'
// ...

$response->toArray(); // ['id' => 'ft-AF1WoRqd3aJAHsqc9NY7iL8F', ...]

list events

获取微调作业的细粒度状态更新。

$response = $client->fineTunes()->listEvents('ft-AF1WoRqd3aJAHsqc9NY7iL8F');

$response->object; // 'list'

foreach ($response->data as $result) {
    $result->object; // 'fine-tune-event' 
    $result->createdAt; // 1614807352
    // ...
}

$response->toArray(); // ['object' => 'list', 'data' => [...]]

list events streamed

以流式方式获取微调作业的细粒度状态更新。

$stream = $client->fineTunes()->listEventsStreamed('ft-y3OpNlc8B5qBVGCCVsLZsDST');

foreach($stream as $response){
    $response->message;
}
// 第1次迭代 => 'Created fine-tune: ft-y3OpNlc8B5qBVGCCVsLZsDST'
// 第2次迭代 => 'Fine-tune costs $0.00'
// ...
// 第xx次迭代 => 'Uploaded result file: file-ajLKUCMsFPrT633zqwr0eI4l'
// 第xx次迭代 => 'Fine-tune succeeded'

元数据信息

在所有响应对象上,您可以通过 meta() 方法访问 API 返回的元数据信息。

$response = $client->completions()->create([
    'model' => 'gpt-3.5-turbo-instruct',
    'prompt' => 'Say this is a test',
]);

$meta = $response->meta();

$meta->requestId; // '574a03e2faaf4e9fd703958e4ddc66f5'

$meta->openai->model; // 'gpt-3.5-turbo-instruct'
$meta->openai->organization; // 'org-jwe45798ASN82s'
$meta->openai->version; // '2020-10-01'
$meta->openai->processingMs; // 425

$meta->requestLimit->limit; // 3000
$meta->requestLimit->remaining; // 2999
$meta->requestLimit->reset; // '20ms'

$meta->tokenLimit->limit; // 250000
$meta->tokenLimit->remaining; // 249984
$meta->tokenLimit->reset; // '3ms'

toArray() 方法会以 API 原始返回的形式返回元数据信息。

$meta->toArray();

// [ 
//   'x-request-id' => '574a03e2faaf4e9fd703958e4ddc66f5',
//   'openai-model' => 'gpt-3.5-turbo-instruct',
//   'openai-organization' => 'org-jwe45798ASN82s',
//   'openai-processing-ms' => 402,
//   'openai-version' => '2020-10-01',
//   'x-ratelimit-limit-requests' => 3000,
//   'x-ratelimit-remaining-requests' => 2999,
//   'x-ratelimit-reset-requests' => '20ms',
//   'x-ratelimit-limit-tokens' => 250000,
//   'x-ratelimit-remaining-tokens' => 249983,
//   'x-ratelimit-reset-tokens' => '3ms',
// ]

对于流式响应,您可以在响应流对象上访问元数据信息。

$stream = $client->completions()->createStreamed([
    'model' => 'gpt-3.5-turbo-instruct',
    'prompt' => 'Say this is a test',
]);
    
$stream->meta(); 

有关速率限制及超出限制时的处理方法,请参阅 OpenAI 文档

故障排除

超时

向 API 发送请求时可能会遇到超时问题。默认超时时间取决于所使用的 HTTP 客户端。

您可以通过配置 HTTP 客户端并将其传递给工厂来增加超时时间。

以下示例说明如何使用 Guzzle 增加超时时间:

OpenAI::factory()
    ->withApiKey($apiKey)
    ->withOrganization($organization)
    ->withHttpClient(new \GuzzleHttp\Client(['timeout' => $timeout]))
    ->make();

测试

该包提供了一个 OpenAI\Client 类的假实现,允许您模拟 API 响应。

为了测试您的代码,请确保在测试用例中将 OpenAI\Client 类替换为 OpenAI\Testing\ClientFake 类。

假响应会按照创建假客户端时提供的顺序返回。

所有响应都包含一个 fake() 方法,只需提供与您的测试用例相关的参数,即可轻松创建响应对象。

use OpenAI\Testing\ClientFake;
use OpenAI\Responses\Completions\CreateResponse;

$client = new ClientFake([
    CreateResponse::fake([
        'choices' => [
            [
                'text' => 'awesome!',
            ],
        ],
    ]),
]);

$completion = $client->completions()->create([
    'model' => 'gpt-3.5-turbo-instruct',
    'prompt' => 'PHP is ',
]);

expect($completion['choices'][0]['text'])->toBe('awesome!');

对于流式响应,您可以选择提供一个包含假响应数据的资源。

use OpenAI\Testing\ClientFake;
use OpenAI\Responses\Chat\CreateStreamedResponse;

$client = new ClientFake([
    CreateStreamedResponse::fake(fopen('file.txt', 'r'))
]);

$completion = $client->chat()->createStreamed([
    'model' => 'gpt-3.5-turbo',
    'messages' => [
        ['role' => 'user', 'content' => 'Hello!'],
    ],
]);

expect($response->getIterator()->current())
    ->id->toBe('chatcmpl-6yo21W6LVo8Tw2yBf7aGf2g17IeIl');

在发送请求之后,您可以使用多种方法来验证是否发送了预期的请求:

// 断言已完成创建请求已发送
$client->assertSent(Completions::class, function (string $method, array $parameters): bool {
    return $method === 'create' &&
        $parameters['model'] === 'gpt-3.5-turbo-instruct' &&
        $parameters['prompt'] === 'PHP is ';
});
// 或者
$client->completions()->assertSent(function (string $method, array $parameters): bool {
    // ...
});

// 断言已发送 2 个完成创建请求
$client->assertSent(Completions::class, 2);

// 断言未发送任何完成创建请求
$client->assertNotSent(Completions::class);
// 或者
$client->completions()->assertNotSent();

// 断言未发送任何请求
$client->assertNothingSent();

如果要编写期望 API 请求失败的测试,您可以将一个 Throwable 对象作为响应提供。

$client = new ClientFake([
    new \OpenAI\Exceptions\ErrorException([
        'message' => '模型 `gpt-1` 不存在',
        'type' => 'invalid_request_error',
        'code' => null,
    ], 404)
]);

// 将抛出 `ErrorException`
$completion = $client->completions()->create([
    'model' => 'gpt-3.5-turbo-instruct',
    'prompt' => 'PHP is ',
]);

Webhook

该包包含用于验证 OpenAI Webhook 的签名验证器。要验证传入的 Webhook 请求的签名,可以使用 OpenAI\Webhooks\SignatureVerifier 类。

use OpenAI\Webhooks\SignatureVerifier;
use OpenAI\Exceptions\WebhookVerificationException;

$verifier = new SignatureVerifier('whsec_{your-webhook-signing-secret}');

try {
    $verifier->verify($incomingRequest);
    
    // 请求已通过验证
} catch (WebhookVerificationException $exception) {
    // 请求无法验证
}

服务

Azure

要使用 Azure OpenAI 服务,必须使用工厂手动构建客户端。

$client = OpenAI::factory()
    ->withBaseUri('{your-resource-name}.openai.azure.com/openai/deployments/{deployment-id}')
    ->withHttpHeader('api-key', '{your-api-key}')
    ->withQueryParam('api-version', '{version}')
    ->make();

使用 Azure 时,您需要部署一个由 {deployment-id} 标识的模型,该模型已集成到 API 调用中。因此,在调用时无需再指定模型,因为它已包含在 BaseUri 中。

因此,一个基本的完成调用示例如下:

$result = $client->completions()->create([
    'prompt' => 'PHP is'
]);

OpenAI PHP 是一款开源软件,采用 MIT 许可证 许可。

版本历史

v0.19.12026/03/17
v0.19.02026/02/10
v0.18.02025/10/31
v0.17.12025/10/09
v0.17.02025/10/02
v0.16.12025/09/04
v0.16.02025/08/26
v0.15.02025/08/04
v0.14.02025/06/24
v0.13.02025/05/14
v0.12.02025/05/04
v0.11.02025/05/04
v0.10.32024/11/12
v0.10.22024/10/17
v0.10.12024/06/06
v0.10.0-beta.12024/05/27
v0.9.22024/05/27
v0.9.12024/05/24
v0.9.02024/05/21
v0.8.52024/04/15

常见问题

相似工具推荐

stable-diffusion-webui

stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面,旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点,将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。 无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师,还是想要深入探索模型潜力的开发者与研究人员,都能从中获益。其核心亮点在于极高的功能丰富度:不仅支持文生图、图生图、局部重绘(Inpainting)和外绘(Outpainting)等基础模式,还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外,它内置了 GFPGAN 和 CodeFormer 等人脸修复工具,支持多种神经网络放大算法,并允许用户通过插件系统无限扩展能力。即使是显存有限的设备,stable-diffusion-webui 也提供了相应的优化选项,让高质量的 AI 艺术创作变得触手可及。

162.1k|★★★☆☆|今天
开发框架图像Agent

everything-claude-code

everything-claude-code 是一套专为 AI 编程助手(如 Claude Code、Codex、Cursor 等)打造的高性能优化系统。它不仅仅是一组配置文件,而是一个经过长期实战打磨的完整框架,旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。 通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能,everything-claude-code 能显著提升 AI 在复杂任务中的表现,帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略,使得模型响应更快、成本更低,同时有效防御潜在的攻击向量。 这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库,还是需要 AI 协助进行安全审计与自动化测试,everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目,它融合了多语言支持与丰富的实战钩子(hooks),让 AI 真正成长为懂上

139k|★★☆☆☆|今天
开发框架Agent语言模型

ComfyUI

ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎,专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式,采用直观的节点式流程图界面,让用户通过连接不同的功能模块即可构建个性化的生成管线。 这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景,也能自由组合模型、调整参数并实时预览效果,轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性,不仅支持 Windows、macOS 和 Linux 全平台,还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构,并率先支持 SDXL、Flux、SD3 等前沿模型。 无论是希望深入探索算法潜力的研究人员和开发者,还是追求极致创作自由度的设计师与资深 AI 绘画爱好者,ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能,使其成为当前最灵活、生态最丰富的开源扩散模型工具之一,帮助用户将创意高效转化为现实。

107.7k|★★☆☆☆|2天前
开发框架图像Agent

NextChat

NextChat 是一款轻量且极速的 AI 助手,旨在为用户提供流畅、跨平台的大模型交互体验。它完美解决了用户在多设备间切换时难以保持对话连续性,以及面对众多 AI 模型不知如何统一管理的痛点。无论是日常办公、学习辅助还是创意激发,NextChat 都能让用户随时随地通过网页、iOS、Android、Windows、MacOS 或 Linux 端无缝接入智能服务。 这款工具非常适合普通用户、学生、职场人士以及需要私有化部署的企业团队使用。对于开发者而言,它也提供了便捷的自托管方案,支持一键部署到 Vercel 或 Zeabur 等平台。 NextChat 的核心亮点在于其广泛的模型兼容性,原生支持 Claude、DeepSeek、GPT-4 及 Gemini Pro 等主流大模型,让用户在一个界面即可自由切换不同 AI 能力。此外,它还率先支持 MCP(Model Context Protocol)协议,增强了上下文处理能力。针对企业用户,NextChat 提供专业版解决方案,具备品牌定制、细粒度权限控制、内部知识库整合及安全审计等功能,满足公司对数据隐私和个性化管理的高标准要求。

87.6k|★★☆☆☆|今天
开发框架语言模型

ML-For-Beginners

ML-For-Beginners 是由微软推出的一套系统化机器学习入门课程,旨在帮助零基础用户轻松掌握经典机器学习知识。这套课程将学习路径规划为 12 周,包含 26 节精炼课程和 52 道配套测验,内容涵盖从基础概念到实际应用的完整流程,有效解决了初学者面对庞大知识体系时无从下手、缺乏结构化指导的痛点。 无论是希望转型的开发者、需要补充算法背景的研究人员,还是对人工智能充满好奇的普通爱好者,都能从中受益。课程不仅提供了清晰的理论讲解,还强调动手实践,让用户在循序渐进中建立扎实的技能基础。其独特的亮点在于强大的多语言支持,通过自动化机制提供了包括简体中文在内的 50 多种语言版本,极大地降低了全球不同背景用户的学习门槛。此外,项目采用开源协作模式,社区活跃且内容持续更新,确保学习者能获取前沿且准确的技术资讯。如果你正寻找一条清晰、友好且专业的机器学习入门之路,ML-For-Beginners 将是理想的起点。

85k|★★☆☆☆|今天
图像数据工具视频

ragflow

RAGFlow 是一款领先的开源检索增强生成(RAG)引擎,旨在为大语言模型构建更精准、可靠的上下文层。它巧妙地将前沿的 RAG 技术与智能体(Agent)能力相结合,不仅支持从各类文档中高效提取知识,还能让模型基于这些知识进行逻辑推理和任务执行。 在大模型应用中,幻觉问题和知识滞后是常见痛点。RAGFlow 通过深度解析复杂文档结构(如表格、图表及混合排版),显著提升了信息检索的准确度,从而有效减少模型“胡编乱造”的现象,确保回答既有据可依又具备时效性。其内置的智能体机制更进一步,使系统不仅能回答问题,还能自主规划步骤解决复杂问题。 这款工具特别适合开发者、企业技术团队以及 AI 研究人员使用。无论是希望快速搭建私有知识库问答系统,还是致力于探索大模型在垂直领域落地的创新者,都能从中受益。RAGFlow 提供了可视化的工作流编排界面和灵活的 API 接口,既降低了非算法背景用户的上手门槛,也满足了专业开发者对系统深度定制的需求。作为基于 Apache 2.0 协议开源的项目,它正成为连接通用大模型与行业专有知识之间的重要桥梁。

77.1k|★★★☆☆|昨天
Agent图像开发框架