[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"similar-openai-php--client":3,"tool-openai-php--client":64},[4,17,27,35,43,56],{"id":5,"name":6,"github_repo":7,"description_zh":8,"stars":9,"difficulty_score":10,"last_commit_at":11,"category_tags":12,"status":16},3808,"stable-diffusion-webui","AUTOMATIC1111\u002Fstable-diffusion-webui","stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面，旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点，将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。\n\n无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师，还是想要深入探索模型潜力的开发者与研究人员，都能从中获益。其核心亮点在于极高的功能丰富度：不仅支持文生图、图生图、局部重绘（Inpainting）和外绘（Outpainting）等基础模式，还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外，它内置了 GFPGAN 和 CodeFormer 等人脸修复工具，支持多种神经网络放大算法，并允许用户通过插件系统无限扩展能力。即使是显存有限的设备，stable-diffusion-webui 也提供了相应的优化选项，让高质量的 AI 艺术创作变得触手可及。",162132,3,"2026-04-05T11:01:52",[13,14,15],"开发框架","图像","Agent","ready",{"id":18,"name":19,"github_repo":20,"description_zh":21,"stars":22,"difficulty_score":23,"last_commit_at":24,"category_tags":25,"status":16},1381,"everything-claude-code","affaan-m\u002Feverything-claude-code","everything-claude-code 是一套专为 AI 编程助手（如 Claude Code、Codex、Cursor 等）打造的高性能优化系统。它不仅仅是一组配置文件，而是一个经过长期实战打磨的完整框架，旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。\n\n通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能，everything-claude-code 能显著提升 AI 在复杂任务中的表现，帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略，使得模型响应更快、成本更低，同时有效防御潜在的攻击向量。\n\n这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库，还是需要 AI 协助进行安全审计与自动化测试，everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目，它融合了多语言支持与丰富的实战钩子（hooks），让 AI 真正成长为懂上",138956,2,"2026-04-05T11:33:21",[13,15,26],"语言模型",{"id":28,"name":29,"github_repo":30,"description_zh":31,"stars":32,"difficulty_score":23,"last_commit_at":33,"category_tags":34,"status":16},2271,"ComfyUI","Comfy-Org\u002FComfyUI","ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎，专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式，采用直观的节点式流程图界面，让用户通过连接不同的功能模块即可构建个性化的生成管线。\n\n这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景，也能自由组合模型、调整参数并实时预览效果，轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性，不仅支持 Windows、macOS 和 Linux 全平台，还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构，并率先支持 SDXL、Flux、SD3 等前沿模型。\n\n无论是希望深入探索算法潜力的研究人员和开发者，还是追求极致创作自由度的设计师与资深 AI 绘画爱好者，ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能，使其成为当前最灵活、生态最丰富的开源扩散模型工具之一，帮助用户将创意高效转化为现实。",107662,"2026-04-03T11:11:01",[13,14,15],{"id":36,"name":37,"github_repo":38,"description_zh":39,"stars":40,"difficulty_score":23,"last_commit_at":41,"category_tags":42,"status":16},3704,"NextChat","ChatGPTNextWeb\u002FNextChat","NextChat 是一款轻量且极速的 AI 助手，旨在为用户提供流畅、跨平台的大模型交互体验。它完美解决了用户在多设备间切换时难以保持对话连续性，以及面对众多 AI 模型不知如何统一管理的痛点。无论是日常办公、学习辅助还是创意激发，NextChat 都能让用户随时随地通过网页、iOS、Android、Windows、MacOS 或 Linux 端无缝接入智能服务。\n\n这款工具非常适合普通用户、学生、职场人士以及需要私有化部署的企业团队使用。对于开发者而言，它也提供了便捷的自托管方案，支持一键部署到 Vercel 或 Zeabur 等平台。\n\nNextChat 的核心亮点在于其广泛的模型兼容性，原生支持 Claude、DeepSeek、GPT-4 及 Gemini Pro 等主流大模型，让用户在一个界面即可自由切换不同 AI 能力。此外，它还率先支持 MCP（Model Context Protocol）协议，增强了上下文处理能力。针对企业用户，NextChat 提供专业版解决方案，具备品牌定制、细粒度权限控制、内部知识库整合及安全审计等功能，满足公司对数据隐私和个性化管理的高标准要求。",87618,"2026-04-05T07:20:52",[13,26],{"id":44,"name":45,"github_repo":46,"description_zh":47,"stars":48,"difficulty_score":23,"last_commit_at":49,"category_tags":50,"status":16},2268,"ML-For-Beginners","microsoft\u002FML-For-Beginners","ML-For-Beginners 是由微软推出的一套系统化机器学习入门课程，旨在帮助零基础用户轻松掌握经典机器学习知识。这套课程将学习路径规划为 12 周，包含 26 节精炼课程和 52 道配套测验，内容涵盖从基础概念到实际应用的完整流程，有效解决了初学者面对庞大知识体系时无从下手、缺乏结构化指导的痛点。\n\n无论是希望转型的开发者、需要补充算法背景的研究人员，还是对人工智能充满好奇的普通爱好者，都能从中受益。课程不仅提供了清晰的理论讲解，还强调动手实践，让用户在循序渐进中建立扎实的技能基础。其独特的亮点在于强大的多语言支持，通过自动化机制提供了包括简体中文在内的 50 多种语言版本，极大地降低了全球不同背景用户的学习门槛。此外，项目采用开源协作模式，社区活跃且内容持续更新，确保学习者能获取前沿且准确的技术资讯。如果你正寻找一条清晰、友好且专业的机器学习入门之路，ML-For-Beginners 将是理想的起点。",84991,"2026-04-05T10:45:23",[14,51,52,53,15,54,26,13,55],"数据工具","视频","插件","其他","音频",{"id":57,"name":58,"github_repo":59,"description_zh":60,"stars":61,"difficulty_score":10,"last_commit_at":62,"category_tags":63,"status":16},3128,"ragflow","infiniflow\u002Fragflow","RAGFlow 是一款领先的开源检索增强生成（RAG）引擎，旨在为大语言模型构建更精准、可靠的上下文层。它巧妙地将前沿的 RAG 技术与智能体（Agent）能力相结合，不仅支持从各类文档中高效提取知识，还能让模型基于这些知识进行逻辑推理和任务执行。\n\n在大模型应用中，幻觉问题和知识滞后是常见痛点。RAGFlow 通过深度解析复杂文档结构（如表格、图表及混合排版），显著提升了信息检索的准确度，从而有效减少模型“胡编乱造”的现象，确保回答既有据可依又具备时效性。其内置的智能体机制更进一步，使系统不仅能回答问题，还能自主规划步骤解决复杂问题。\n\n这款工具特别适合开发者、企业技术团队以及 AI 研究人员使用。无论是希望快速搭建私有知识库问答系统，还是致力于探索大模型在垂直领域落地的创新者，都能从中受益。RAGFlow 提供了可视化的工作流编排界面和灵活的 API 接口，既降低了非算法背景用户的上手门槛，也满足了专业开发者对系统深度定制的需求。作为基于 Apache 2.0 协议开源的项目，它正成为连接通用大模型与行业专有知识之间的重要桥梁。",77062,"2026-04-04T04:44:48",[15,14,13,26,54],{"id":65,"github_repo":66,"name":67,"description_en":68,"description_zh":69,"ai_summary_zh":69,"readme_en":70,"readme_zh":71,"quickstart_zh":72,"use_case_zh":73,"hero_image_url":74,"owner_login":75,"owner_name":76,"owner_avatar_url":77,"owner_bio":78,"owner_company":79,"owner_location":79,"owner_email":80,"owner_twitter":81,"owner_website":82,"owner_url":83,"languages":84,"stars":89,"forks":90,"last_commit_at":91,"license":92,"difficulty_score":23,"env_os":93,"env_gpu":93,"env_ram":93,"env_deps":94,"category_tags":101,"github_topics":102,"view_count":23,"oss_zip_url":79,"oss_zip_packed_at":79,"status":16,"created_at":114,"updated_at":115,"faqs":116,"releases":147},3133,"openai-php\u002Fclient","client","⚡️ OpenAI PHP is a supercharged community-maintained PHP API client that allows you to interact with OpenAI API.","OpenAI PHP 是一个由社区维护的高性能 PHP 客户端，旨在帮助开发者轻松对接 OpenAI API。它解决了在 PHP 项目中直接调用人工智能服务时面临的接口复杂、配置繁琐等痛点，将原本复杂的 HTTP 请求封装为简洁、直观的代码方法，让集成过程变得高效顺畅。\n\n这款工具主要面向使用 PHP 进行开发的工程师和技术团队，无论是构建智能聊天机器人、实现文本生成与分析，还是处理图像、音频及向量存储等高级功能，都能通过它快速落地。其独特的技术亮点在于“超级加速”的设计理念和完善的资源覆盖，不仅支持最新的对话、微调及实时交互接口，还兼容 Azure 等服务环境，同时明确标记了已弃用的旧版接口，帮助开发者规避技术债务。\n\n作为连接 PHP 生态与前沿 AI 能力的桥梁，OpenAI PHP 要求运行环境为 PHP 8.2 及以上版本，并通过 Composer 即可一键安装。它让开发者无需深究底层通信细节，只需关注业务逻辑，即可在应用中灵活调用强大的大模型能力，是 PHP 开发者探索人工智能应用的得力助手。","\u003Cp align=\"center\">\n    \u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fopenai-php_client_readme_52f417981e92.png\" width=\"600\" alt=\"OpenAI PHP\">\n    \u003Cp align=\"center\">\n        \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Factions\">\u003Cimg alt=\"GitHub Workflow Status (main)\" src=\"https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Factions\u002Fworkflow\u002Fstatus\u002Fopenai-php\u002Fclient\u002Ftests.yml?branch=main&label=tests&style=round-square\">\u003C\u002Fa>\n        \u003Ca href=\"https:\u002F\u002Fpackagist.org\u002Fpackages\u002Fopenai-php\u002Fclient\">\u003Cimg alt=\"Total Downloads\" src=\"https:\u002F\u002Fimg.shields.io\u002Fpackagist\u002Fdt\u002Fopenai-php\u002Fclient\">\u003C\u002Fa>\n        \u003Ca href=\"https:\u002F\u002Fpackagist.org\u002Fpackages\u002Fopenai-php\u002Fclient\">\u003Cimg alt=\"Latest Version\" src=\"https:\u002F\u002Fimg.shields.io\u002Fpackagist\u002Fv\u002Fopenai-php\u002Fclient\">\u003C\u002Fa>\n        \u003Ca href=\"https:\u002F\u002Fpackagist.org\u002Fpackages\u002Fopenai-php\u002Fclient\">\u003Cimg alt=\"License\" src=\"https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Flicense\u002Fopenai-php\u002Fclient\">\u003C\u002Fa>\n    \u003C\u002Fp>\n\u003C\u002Fp>\n\n------\n**OpenAI PHP** is a community-maintained PHP API client that allows you to interact with the [Open AI API](https:\u002F\u002Fplatform.openai.com\u002Fdocs\u002Fapi-reference\u002Fintroduction).\n\n- Follow the creator Nuno Maduro:\n    - YouTube: **[youtube.com\u002F@nunomaduro](https:\u002F\u002Fwww.youtube.com\u002F@nunomaduro)** — Videos every weekday\n    - Twitch: **[twitch.tv\u002Fenunomaduro](https:\u002F\u002Fwww.twitch.tv\u002Fenunomaduro)** — Streams (almost) every weekday\n    - Twitter \u002F X: **[x.com\u002Fenunomaduro](https:\u002F\u002Fx.com\u002Fenunomaduro)**\n    - LinkedIn: **[linkedin.com\u002Fin\u002Fnunomaduro](https:\u002F\u002Fwww.linkedin.com\u002Fin\u002Fnunomaduro)**\n    - Instagram: **[instagram.com\u002Fenunomaduro](https:\u002F\u002Fwww.instagram.com\u002Fenunomaduro)**\n    - Tiktok: **[tiktok.com\u002F@enunomaduro](https:\u002F\u002Fwww.tiktok.com\u002F@enunomaduro)**\n\nIf you or your business relies on this package, it's important to support the developers who have contributed their time and effort to create and maintain this valuable tool:\n\n- Nuno Maduro: **[github.com\u002Fsponsors\u002Fnunomaduro](https:\u002F\u002Fgithub.com\u002Fsponsors\u002Fnunomaduro)**\n- Sandro Gehri: **[github.com\u002Fsponsors\u002Fgehrisandro](https:\u002F\u002Fgithub.com\u002Fsponsors\u002Fgehrisandro)**\n- Connor Tumbleson: **[github.com\u002Fsponsors\u002FiBotPeaches](https:\u002F\u002Fgithub.com\u002Fsponsors\u002FiBotPeaches)**\n\n## Table of Contents\n- [Get Started](#get-started)\n- [Usage](#usage)\n  - [Models Resource](#models-resource)\n  - [Responses Resource](#responses-resource)\n  - [Conversations Resource](#conversations-resource)\n  - [Conversations Items Resource](#conversations-items-resource)\n  - [Containers Resource](#containers-resource)\n  - [Containers Files Resource](#containers-files-resource)\n  - [Chat Resource](#chat-resource)\n  - [Audio Resource](#audio-resource)\n  - [Embeddings Resource](#embeddings-resource)\n  - [Files Resource](#files-resource)\n  - [FineTuning Resource](#finetuning-resource)\n  - [Moderations Resource](#moderations-resource)\n  - [Images Resource](#images-resource)\n  - [Vector Stores Resource](#vector-stores-resource)\n  - [Vector Stores Files Resource](#vector-store-files-resource)\n  - [Vector Stores File Batches Resource](#vector-store-file-batches-resource)\n  - [Batches Resource](#batches-resource)\n  - [Realtime Ephemeral Keys](#realtime-ephemeral-keys)\n  - [Completions Resource (legacy)](#completions-resource-legacy)\n  - [Assistants Resource (deprecated)](#assistants-resource-deprecated)\n  - [Thread Resource (deprecated)](#threads-resource-deprecated)\n  - [Thread Messages Resource (deprecated)](#thread-messages-resource-deprecated)\n  - [Thread Runs Resource (deprecated)](#thread-runs-resource-deprecated)\n  - [Thread Runs Steps Resource (deprecated)](#thread-run-steps-resource-deprecated)\n  - [FineTunes Resource (deprecated)](#finetunes-resource-deprecated)\n  - [Edits Resource (deprecated)](#edits-resource-deprecated)\n- [Meta Information](#meta-information)\n- [Troubleshooting](#troubleshooting)\n- [Testing](#testing)\n- [Webhooks][#webhooks]\n- [Services](#services)\n  - [Azure](#azure)\n\n## Get Started\n\n> **Requires [PHP 8.2+](https:\u002F\u002Fwww.php.net\u002Freleases\u002F)**\n\nFirst, install OpenAI via the [Composer](https:\u002F\u002Fgetcomposer.org\u002F) package manager:\n\n```bash\ncomposer require openai-php\u002Fclient\n```\n\nEnsure that the `php-http\u002Fdiscovery` composer plugin is allowed to run or install a client manually if your project does not already have a PSR-18 client integrated.\n```bash\ncomposer require guzzlehttp\u002Fguzzle\n```\n\nThen, interact with OpenAI's API:\n\n```php\n$yourApiKey = getenv('YOUR_API_KEY');\n$client = OpenAI::client($yourApiKey);\n\n$response = $client->responses()->create([\n    'model' => 'gpt-4o',\n    'input' => 'Hello!',\n]);\n\necho $response->outputText; \u002F\u002F Hello! How can I assist you today?\n```\n\nIf necessary, it is possible to configure and create a separate client.\n\n```php\n$yourApiKey = getenv('YOUR_API_KEY');\n\n$client = OpenAI::factory()\n    ->withApiKey($yourApiKey)\n    ->withOrganization('your-organization') \u002F\u002F default: null\n    ->withProject('Your Project') \u002F\u002F default: null\n    ->withBaseUri('openai.example.com\u002Fv1') \u002F\u002F default: api.openai.com\u002Fv1\n    ->withHttpClient($httpClient = new \\GuzzleHttp\\Client([])) \u002F\u002F default: HTTP client found using PSR-18 HTTP Client Discovery\n    ->withHttpHeader('X-My-Header', 'foo')\n    ->withQueryParam('my-param', 'bar')\n    ->withStreamHandler(fn (RequestInterface $request): ResponseInterface => $httpClient->send($request, [\n        'stream' => true \u002F\u002F Allows to provide a custom stream handler for the http client.\n    ]))\n    ->make();\n```\n\n## Usage\n\n### `Models` Resource\n\n#### `list`\n\nLists the currently available models, and provides basic information about each one such as the owner and availability.\n\n```php\n$response = $client->models()->list();\n\n$response->object; \u002F\u002F 'list'\n\nforeach ($response->data as $result) {\n    $result->id; \u002F\u002F 'gpt-3.5-turbo-instruct'\n    $result->object; \u002F\u002F 'model'\n    \u002F\u002F ...\n}\n\n$response->toArray(); \u002F\u002F ['object' => 'list', 'data' => [...]]\n```\n\n#### `retrieve`\n\nRetrieves a model instance, providing basic information about the model such as the owner and permissioning.\n\n```php\n$response = $client->models()->retrieve('gpt-3.5-turbo-instruct');\n\n$response->id; \u002F\u002F 'gpt-3.5-turbo-instruct'\n$response->object; \u002F\u002F 'model'\n$response->created; \u002F\u002F 1642018370\n$response->ownedBy; \u002F\u002F 'openai'\n\n$response->toArray(); \u002F\u002F ['id' => 'gpt-3.5-turbo-instruct', ...]\n```\n\n#### `delete`\n\nDelete a fine-tuned model.\n\n```php\n$response = $client->models()->delete('curie:ft-acmeco-2021-03-03-21-44-20');\n\n$response->id; \u002F\u002F 'curie:ft-acmeco-2021-03-03-21-44-20'\n$response->object; \u002F\u002F 'model'\n$response->deleted; \u002F\u002F true\n\n$response->toArray(); \u002F\u002F ['id' => 'curie:ft-acmeco-2021-03-03-21-44-20', ...]\n```\n\n### `Responses` Resource\n\n#### `create`\n\nCreates a model response. Provide text or image inputs to generate text or JSON outputs. Have the model call your own custom code or use built-in tools like web search or file search to use your own data as input for the model's response.\n\n```php\n$response = $client->responses()->create([\n    'model' => 'gpt-4o-mini',\n    'tools' => [\n        [\n            'type' => 'web_search_preview'\n        ]\n    ],\n    'input' => \"what was a positive news story from today?\",\n    'temperature' => 0.7,\n    'max_output_tokens' => 150,\n    'tool_choice' => 'auto',\n    'parallel_tool_calls' => true,\n    'store' => true,\n    'metadata' => [\n        'user_id' => '123',\n        'session_id' => 'abc456'\n    ]\n]);\n\n$response->id; \u002F\u002F 'resp_67ccd2bed1ec8190b14f964abc054267'\n$response->object; \u002F\u002F 'response'\n$response->createdAt; \u002F\u002F 1741476542\n$response->status; \u002F\u002F 'completed'\n$response->model; \u002F\u002F 'gpt-4o-mini'\n$response->outputText; \u002F\u002F 'The combined response text of any `output_text` content.'\n\nforeach ($response->output as $output) {\n    $output->type; \u002F\u002F 'message'\n    $output->id; \u002F\u002F 'msg_67ccd2bf17f0819081ff3bb2cf6508e6'\n    $output->status; \u002F\u002F 'completed'\n    $output->role; \u002F\u002F 'assistant'\n    \n    foreach ($output->content as $content) {\n        $content->type; \u002F\u002F 'output_text'\n        $content->text; \u002F\u002F The response text\n        $content->annotations; \u002F\u002F Any annotations in the response\n    }\n}\n\n$response->usage->inputTokens; \u002F\u002F 36\n$response->usage->outputTokens; \u002F\u002F 87\n$response->usage->totalTokens; \u002F\u002F 123\n\n$response->toArray(); \u002F\u002F ['id' => 'resp_67ccd2bed1ec8190b14f964abc054267', ...]\n```\n\nCreate a model response with a function tool.\n\n```php\n$response = $client->responses()->create([\n    'model' => 'gpt-4o-mini',\n    'tools' => [\n        [\n            'type' => 'function',\n            'name' => 'get_temperature',\n            'description' => 'Get the current temperature in a given location',\n            'parameters' => [\n                'type' => 'object',\n                'properties' => [\n                    'location' => [\n                        'type' => 'string',\n                        'description' => 'The city and state, e.g. San Francisco, CA',\n                    ],\n                    'unit' => [\n                        'type' => 'string',\n                        'enum' => ['celsius', 'fahrenheit'],\n                    ],\n                ],\n                'required' => ['location'],\n            ],\n        ]\n    ],\n    'input' => \"What is the temperature in Rio Grande do Norte, Brazil?\",\n]);\n\nforeach ($response->output as $item) {\n    if ($item->type === 'function_call') {\n        $name = $item->name ?? null;\n        $args = json_decode($item->arguments ?? '{}', true) ?: [];\n\n        if ($name === 'get_temperature') {\n            \u002F\u002F ✅ Call your custom function here with the extracted arguments\n            \u002F\u002F Example:\n            \u002F\u002F $temperature = get_temperature($args['location'], $args['unit'] ?? 'celsius');\n            \u002F\u002F Then, send the result back to the model if needed.\n        }\n    }\n}\n```\n\n#### `create streamed`\n\nWhen you create a Response with stream set to true, the server will emit server-sent events to the client as the Response is generated. All events and their payloads can be found in [OpenAI docs](https:\u002F\u002Fplatform.openai.com\u002Fdocs\u002Fapi-reference\u002Fresponses-streaming).\n\n```php\n$stream = $client->responses()->createStreamed([\n    'model' => 'gpt-4o-mini',\n    'tools' => [\n        [\n            'type' => 'web_search_preview'\n        ]\n    ],\n    'input' => \"what was a positive news story from today?\",\n]);\n\nforeach ($stream as $response) {\n    $response->event; \u002F\u002F 'response.created'\n}\n```\n\n#### `retrieve`\n\nRetrieves a model response with the given ID.\n\n```php\n$response = $client->responses()->retrieve('resp_67ccd2bed1ec8190b14f964abc054267');\n\n$response->id; \u002F\u002F 'resp_67ccd2bed1ec8190b14f964abc054267'\n$response->object; \u002F\u002F 'response'\n$response->createdAt; \u002F\u002F 1741476542\n$response->status; \u002F\u002F 'completed'\n$response->error; \u002F\u002F null\n$response->incompleteDetails; \u002F\u002F null\n$response->instructions; \u002F\u002F null\n$response->maxOutputTokens; \u002F\u002F null\n$response->model; \u002F\u002F 'gpt-4o-mini-2024-07-18\"'\n$response->parallelToolCalls; \u002F\u002F true\n$response->previousResponseId; \u002F\u002F null\n$response->store; \u002F\u002F true\n$response->temperature; \u002F\u002F 1.0\n$response->toolChoice; \u002F\u002F 'auto'\n$response->topP; \u002F\u002F 1.0\n$response->truncation; \u002F\u002F 'disabled'\n\n$response->toArray(); \u002F\u002F ['id' => 'resp_67ccd2bed1ec8190b14f964abc054267', ...]\n```\n\n#### `retrieve streamed`\n\nWhen you retrieve a Response with stream set to true, the server will emit server-sent events to the client as the Response is generated. All events and their payloads can be found in [OpenAI docs](https:\u002F\u002Fplatform.openai.com\u002Fdocs\u002Fapi-reference\u002Fresponses-streaming).\n\n```php\n$stream = $client->responses()->retrieveStreamed('resp_67ccd2bed1ec8190b14f964abc054267', [\n    'starting_after' => '2',\n]);\n\nforeach ($stream as $response) {\n    $response->event; \u002F\u002F 'response.created'\n}\n```\n\n#### `cancel`\n\nCancel a model response (background request) with the given ID.\n\n```php\n$response = $client->responses()->cancel('resp_67ccd2bed1ec8190b14f964abc054267');\n\n$response->id; \u002F\u002F 'resp_67ccd2bed1ec8190b14f964abc054267'\n$response->status; \u002F\u002F 'canceled'\n\n$response->toArray(); \u002F\u002F ['id' => 'resp_67ccd2bed1ec8190b14f964abc054267', 'status' => 'canceled', ...]\n```\n\n#### `delete`\n\nDeletes a model response with the given ID.\n\n```php\n$response = $client->responses()->delete('resp_67ccd2bed1ec8190b14f964abc054267');\n\n$response->id; \u002F\u002F 'resp_67ccd2bed1ec8190b14f964abc054267'\n$response->object; \u002F\u002F 'response'\n$response->deleted; \u002F\u002F true\n\n$response->toArray(); \u002F\u002F ['id' => 'resp_67ccd2bed1ec8190b14f964abc054267', 'deleted' => true, ...]\n```\n\n#### `list`\n\nLists input items for a response with the given ID. All events and their payloads can be found in [OpenAI docs](https:\u002F\u002Fplatform.openai.com\u002Fdocs\u002Fapi-reference\u002Fresponses\u002Flist).\n\n```php\n$response = $client->responses()->list('resp_67ccd2bed1ec8190b14f964abc054267', [\n    'limit' => 10,\n    'order' => 'desc'\n]);\n\n$response->object; \u002F\u002F 'list'\n\nforeach ($response->data as $item) {\n    $item->type; \u002F\u002F 'message'\n    $item->id; \u002F\u002F 'msg_680bf4e8c1948192b64abf0bad54b30806e0834f49400fc3'\n    $item->status; \u002F\u002F 'completed'\n    $item->role; \u002F\u002F 'user'\n}\n\n$response->firstId; \u002F\u002F 'msg_680bf4e8c1948192b64abf0bad54b30806e0834f49400fc3'\n$response->lastId; \u002F\u002F 'msg_680bf4e8c1948192b64abf0bad54b30806e0834f49400fc3'\n$response->hasMore; \u002F\u002F false\n\n$response->toArray(); \u002F\u002F ['object' => 'list', 'data' => [...], ...]\n```\n\n### `Conversations` Resource\n\n#### `create`\n\nCreate a conversation.\n\n```php\n$response = $client->conversations()->create([\n    'metadata' => ['topic' => 'demo'],\n    'items' => [\n        [\n            'type' => 'message',\n            'role' => 'user',\n            'content' => 'Hello!'\n        ],\n    ],\n]);\n\n$response->id; \u002F\u002F 'conv_123'\n$response->object; \u002F\u002F 'conversation'\n$response->createdAt; \u002F\u002F 1741900000\n$response->metadata; \u002F\u002F ['topic' => 'demo']\n\n$response->toArray(); \u002F\u002F ['id' => 'conv_123', 'object' => 'conversation', ...]\n```\n\n#### `retrieve`\n\nRetrieve a conversation by ID.\n\n```php\n$response = $client->conversations()->retrieve('conv_123');\n\n$response->id; \u002F\u002F 'conv_123'\n$response->object; \u002F\u002F 'conversation'\n$response->createdAt; \u002F\u002F 1741900000\n\n$response->toArray(); \u002F\u002F ['id' => 'conv_123', 'object' => 'conversation', ...]\n```\n\n#### `update`\n\nUpdate a conversation by ID.\n\n```php\n$response = $client->conversations()->update('conv_123', [\n    'metadata' => ['foo' => 'bar'],\n]);\n\n$response->id; \u002F\u002F 'conv_123'\n$response->metadata; \u002F\u002F ['foo' => 'bar']\n```\n\n#### `delete`\n\nDelete a conversation by ID.\n\n```php\n$response = $client->conversations()->delete('conv_123');\n\n$response->id; \u002F\u002F 'conv_123'\n$response->object; \u002F\u002F 'conversation.deleted'\n$response->deleted; \u002F\u002F true\n\n$response->toArray(); \u002F\u002F ['id' => 'conv_123', 'object' => 'conversation.deleted', 'deleted' => true]\n```\n\n### `Conversations Items` Resource\n\n#### `create`\n\nCreate items for a conversation.\n\n```php\n$response = $client->conversations()->items()->create('conv_123', [\n    'items' => [\n        [\n            'role' => 'system',\n            'content' => 'Refer to me as PHPBot.',\n        ],\n    ],\n]);\n\nforeach ($response->data as $listItem) {\n    $listItem->item; \u002F\u002F The created item (e.g., message)\n}\n\n$response->firstId; \u002F\u002F 'msg_abc'\n$response->lastId; \u002F\u002F 'msg_abc'\n$response->hasMore; \u002F\u002F false\n\n$response->toArray(); \u002F\u002F ['object' => 'list', 'data' => [...], ...]\n```\n\n#### `list`\n\nList items for a conversation.\n\n```php\n$response = $client->conversations()->items()->list('conv_123', [\n    'limit' => 10,\n]);\n\n$response->object; \u002F\u002F 'list'\n```\n\n#### `retrieve`\n\nRetrieve a specific item from a conversation.\n\n```php\n$response = $client->conversations()->items()->retrieve('conv_123', 'msg_abc', [\n    'include' => ['step_details'],\n]);\n\n$response->id; \u002F\u002F 'msg_abc'\n$response->type; \u002F\u002F 'message'\n$response->status; \u002F\u002F 'completed'\n```\n\n#### `delete`\n\nDelete a specific item from a conversation. Returns the updated conversation.\n\n```php\n$response = $client->conversations()->items()->delete('conv_123', 'msg_abc');\n\n$response->id; \u002F\u002F 'conv_123'\n$response->object; \u002F\u002F 'conversation'\n```\n\n### `Containers` Resource\n\n#### `create`\n\nCreates a container for use with the Code Interpreter tool.\n\n```php\n$response = $client->containers()->create([\n    'name' => 'My Container',\n    'expires_after' => [\n        'anchor' => 'last_active_at',\n        'minutes' => 60,\n    ],\n]);\n\n$response->id; \u002F\u002F 'container_abc123'\n$response->object; \u002F\u002F 'container'\n$response->createdAt; \u002F\u002F 1690000000\n$response->status; \u002F\u002F 'active'\n$response->expiresAfter->anchor; \u002F\u002F 'last_active_at'\n$response->expiresAfter->minutes; \u002F\u002F 60\n$response->lastActiveAt; \u002F\u002F 1690001000\n$response->name; \u002F\u002F 'My Container'\n\n$response->toArray(); \u002F\u002F ['id' => 'container_abc123', 'object' => 'container', ...]\n```\n\n#### `list`\n\nReturns a list of containers.\n\n```php\n$response = $client->containers()->list([\n    'limit' => 10,\n    'order' => 'desc',\n]);\n\n$response->object; \u002F\u002F 'list'\n\nforeach ($response->data as $container) {\n    $container->id; \u002F\u002F 'container_abc123'\n    $container->object; \u002F\u002F 'container'\n    $container->createdAt; \u002F\u002F 1690000000\n    $container->status; \u002F\u002F 'active'\n    $container->expiresAfter->anchor; \u002F\u002F 'last_active_at'\n    $container->expiresAfter->minutes; \u002F\u002F 60\n    $container->lastActiveAt; \u002F\u002F 1690001000\n    $container->name; \u002F\u002F 'Test Container'\n}\n\n$response->firstId; \u002F\u002F 'container_abc123'\n$response->lastId; \u002F\u002F 'container_def456'\n$response->hasMore; \u002F\u002F false\n\n$response->toArray(); \u002F\u002F ['object' => 'list', 'data' => [...], ...]\n```\n\n#### `retrieve`\n\nRetrieves a container with the given ID.\n\n```php\n$response = $client->containers()->retrieve('container_abc123');\n\n$response->id; \u002F\u002F 'container_abc123'\n$response->object; \u002F\u002F 'container'\n$response->createdAt; \u002F\u002F 1690000000\n$response->status; \u002F\u002F 'active'\n$response->expiresAfter->anchor; \u002F\u002F 'last_active_at'\n$response->expiresAfter->minutes; \u002F\u002F 60\n$response->lastActiveAt; \u002F\u002F 1690001000\n$response->name; \u002F\u002F 'Test Container'\n\n$response->toArray(); \u002F\u002F ['id' => 'container_abc123', 'object' => 'container', ...]\n```\n\n#### `delete`\n\nDelete a container with the given ID.\n\n```php\n$response = $client->containers()->delete('container_abc123');\n\n$response->id; \u002F\u002F 'container_abc123'\n$response->object; \u002F\u002F 'container'\n$response->deleted; \u002F\u002F true\n\n$response->toArray(); \u002F\u002F ['id' => 'container_abc123', 'object' => 'container', 'deleted' => true]\n```\n\n### `Containers Files` Resource\n\n#### `create`\n\nCreate or upload a file into a container.\n\n```php\n$response = $client->containers()->files()->create('container_abc123', [\n    'file' => fopen('path\u002Fto\u002Flocal-file.txt', 'r'),\n]);\n$response = $client->containers()->files()->create('container_abc123', [\n    'file_id' => 'file_XjGxS3KTG0uNmNOK362iJua3',\n]);\n\n$response->id; \u002F\u002F 'cfile_682e0e8a43c88191a7978f477a09bdf5'\n$response->object; \u002F\u002F 'container.file'\n$response->createdAt; \u002F\u002F 1747848842\n$response->bytes; \u002F\u002F 880\n$response->containerId; \u002F\u002F 'container_abc123'\n$response->path; \u002F\u002F '\u002Fmnt\u002Fdata\u002Flocal-file.txt'\n$response->source; \u002F\u002F 'user'\n\n$response->toArray(); \u002F\u002F ['id' => 'cfile_...', 'object' => 'container.file', ...]\n```\n\n> [!NOTE]\n> You must provide either `file` or `file_id`, but not both.\n\n#### `list`\n\nReturns a list of files in the container.\n\n```php\n$response = $client->containers()->files()->list('container_abc123', [\n    'limit' => 10,\n    'order' => 'desc',\n]);\n\n$response->object; \u002F\u002F 'list'\n\nforeach ($response->data as $file) {\n    $file->id; \u002F\u002F 'cfile_682e0e8a43c88191a7978f477a09bdf5'\n    $file->object; \u002F\u002F 'container.file'\n    $file->createdAt; \u002F\u002F 1747848842\n    $file->bytes; \u002F\u002F 880\n    $file->containerId; \u002F\u002F 'container_abc123'\n    $file->path; \u002F\u002F '\u002Fmnt\u002Fdata\u002F...' \n    $file->source; \u002F\u002F 'user'\n}\n\n$response->firstId; \u002F\u002F 'cfile_...'\n$response->lastId; \u002F\u002F 'cfile_...'\n$response->hasMore; \u002F\u002F false\n\n$response->toArray(); \u002F\u002F ['object' => 'list', 'data' => [...], ...]\n```\n\n#### `retrieve`\n\nRetrieve information about a container file.\n\n```php\n$response = $client->containers()->files()->retrieve('container_abc123', 'cfile_682e0e8a43c88191a7978f477a09bdf5');\n\n$response->id; \u002F\u002F 'cfile_682e0e8a43c88191a7978f477a09bdf5'\n$response->object; \u002F\u002F 'container.file'\n$response->createdAt; \u002F\u002F 1747848842\n$response->bytes; \u002F\u002F 880\n$response->containerId; \u002F\u002F 'container_abc123'\n$response->path; \u002F\u002F '\u002Fmnt\u002Fdata\u002F...'\n$response->source; \u002F\u002F 'user'\n\n$response->toArray(); \u002F\u002F ['id' => 'cfile_...', 'object' => 'container.file', ...]\n```\n\n#### `retrieve content`\n\nReturns the raw content of the specified container file.\n\n```php\n$content = $client->containers()->files()->content('container_abc123', 'cfile_682e0e8a43c88191a7978f477a09bdf5');\n\u002F\u002F $content => string\n```\n\n#### `delete`\n\nDelete a container file.\n\n```php\n$response = $client->containers()->files()->delete('container_abc123', 'cfile_682e0e8a43c88191a7978f477a09bdf5');\n\n$response->id; \u002F\u002F 'cfile_682e0e8a43c88191a7978f477a09bdf5'\n$response->object; \u002F\u002F 'container.file.deleted'\n$response->deleted; \u002F\u002F true\n\n$response->toArray(); \u002F\u002F ['id' => 'cfile_...', 'object' => 'container.file.deleted', 'deleted' => true]\n```\n\n### `Chat` Resource\n\n#### `create`\n\nCreates a completion for the chat message.\n\n```php\n$response = $client->chat()->create([\n    'model' => 'gpt-3.5-turbo',\n    'messages' => [\n        ['role' => 'user', 'content' => 'Hello!'],\n    ],\n]);\n\n$response->id; \u002F\u002F 'chatcmpl-6pMyfj1HF4QXnfvjtfzvufZSQq6Eq'\n$response->object; \u002F\u002F 'chat.completion'\n$response->created; \u002F\u002F 1677701073\n$response->model; \u002F\u002F 'gpt-3.5-turbo-0301'\n\nforeach ($response->choices as $choice) {\n    $choice->index; \u002F\u002F 0\n    $choice->message->role; \u002F\u002F 'assistant'\n    $choice->message->content; \u002F\u002F '\\n\\nHello there! How can I assist you today?'\n    $choice->logprobs; \u002F\u002F null\n    $choice->finishReason; \u002F\u002F 'stop'\n}\n\n$response->usage->promptTokens; \u002F\u002F 9,\n$response->usage->completionTokens; \u002F\u002F 12,\n$response->usage->totalTokens; \u002F\u002F 21\n\n$response->toArray(); \u002F\u002F ['id' => 'chatcmpl-6pMyfj1HF4QXnfvjtfzvufZSQq6Eq', ...]\n```\n\nCreates a completion for the chat message with a tool call.\n\n```php\n$response = $client->chat()->create([\n    'model' => 'gpt-3.5-turbo-0613',\n    'messages' => [\n        ['role' => 'user', 'content' => 'What\\'s the weather like in Boston?'],\n    ],\n    'tools' => [\n        [\n            'type' => 'function',\n            'function' => [\n                'name' => 'get_current_weather',\n                'description' => 'Get the current weather in a given location',\n                'parameters' => [\n                    'type' => 'object',\n                    'properties' => [\n                        'location' => [\n                            'type' => 'string',\n                            'description' => 'The city and state, e.g. San Francisco, CA',\n                        ],\n                        'unit' => [\n                            'type' => 'string',\n                            'enum' => ['celsius', 'fahrenheit']\n                        ],\n                    ],\n                    'required' => ['location'],\n                ],\n            ],\n        ]\n    ]\n]);\n\n$response->id; \u002F\u002F 'chatcmpl-6pMyfj1HF4QXnfvjtfzvufZSQq6Eq'\n$response->object; \u002F\u002F 'chat.completion'\n$response->created; \u002F\u002F 1677701073\n$response->model; \u002F\u002F 'gpt-3.5-turbo-0613'\n\nforeach ($response->choices as $choice) {\n    $choice->index; \u002F\u002F 0\n    $choice->message->role; \u002F\u002F 'assistant'\n    $choice->message->content; \u002F\u002F null\n    $choice->message->toolCalls[0]->id; \u002F\u002F 'call_123'\n    $choice->message->toolCalls[0]->type; \u002F\u002F 'function'\n    $choice->message->toolCalls[0]->function->name; \u002F\u002F 'get_current_weather'\n    $choice->message->toolCalls[0]->function->arguments; \u002F\u002F \"{\\n  \\\"location\\\": \\\"Boston, MA\\\"\\n}\"\n    $choice->finishReason; \u002F\u002F 'tool_calls'\n}\n\n$response->usage->promptTokens; \u002F\u002F 82,\n$response->usage->completionTokens; \u002F\u002F 18,\n$response->usage->totalTokens; \u002F\u002F 100\n```\n\nCreates a completion for the chat message with a function call.\n\n```php\n$response = $client->chat()->create([\n    'model' => 'gpt-3.5-turbo-0613',\n    'messages' => [\n        ['role' => 'user', 'content' => 'What\\'s the weather like in Boston?'],\n    ],\n    'functions' => [\n        [\n            'name' => 'get_current_weather',\n            'description' => 'Get the current weather in a given location',\n            'parameters' => [\n                'type' => 'object',\n                'properties' => [\n                    'location' => [\n                        'type' => 'string',\n                        'description' => 'The city and state, e.g. San Francisco, CA',\n                    ],\n                    'unit' => [\n                        'type' => 'string',\n                        'enum' => ['celsius', 'fahrenheit']\n                    ],\n                ],\n                'required' => ['location'],\n            ],\n        ]\n    ]\n]);\n\n$response->id; \u002F\u002F 'chatcmpl-6pMyfj1HF4QXnfvjtfzvufZSQq6Eq'\n$response->object; \u002F\u002F 'chat.completion'\n$response->created; \u002F\u002F 1677701073\n$response->model; \u002F\u002F 'gpt-3.5-turbo-0613'\n\nforeach ($response->choices as $choice) {\n    $choice->index; \u002F\u002F 0\n    $choice->message->role; \u002F\u002F 'assistant'\n    $choice->message->content; \u002F\u002F null\n    $choice->message->functionCall->name; \u002F\u002F 'get_current_weather'\n    $choice->message->functionCall->arguments; \u002F\u002F \"{\\n  \\\"location\\\": \\\"Boston, MA\\\"\\n}\"\n    $choice->finishReason; \u002F\u002F 'function_call'\n}\n\n$response->usage->promptTokens; \u002F\u002F 82,\n$response->usage->completionTokens; \u002F\u002F 18,\n$response->usage->totalTokens; \u002F\u002F 100\n```\n\nCreates a chat completion with image input via `image_url`.  \nUseful for describing and analyzing visual content.\n\n```php\n$response = $client->chat()->create([\n    'model' => 'gpt-4o',\n    'messages' => [\n        [\n            'role' => 'user',\n            'content' => [\n                ['type' => 'text', 'text' => 'What is in this image?'],\n                \u002F\u002F Replace with a real, accessible image\n                ['type' => 'image_url', 'image_url' => ['url' => 'https:\u002F\u002Fexample.com\u002Fimage.jpg']], \n            ]\n        ]\n    ]\n]);\n```\n\n#### `create streamed`\n\nCreates a streamed completion for the chat message.\n\n```php\n$stream = $client->chat()->createStreamed([\n    'model' => 'gpt-4o',\n    'messages' => [\n        ['role' => 'user', 'content' => 'Hello!'],\n    ],\n]);\n\nforeach($stream as $response){\n    $response->choices[0]->toArray();\n}\n\u002F\u002F 1. iteration => ['index' => 0, 'delta' => ['role' => 'assistant'], 'finish_reason' => null]\n\u002F\u002F 2. iteration => ['index' => 0, 'delta' => ['content' => 'Hello'], 'finish_reason' => null]\n\u002F\u002F 3. iteration => ['index' => 0, 'delta' => ['content' => '!'], 'finish_reason' => null]\n\u002F\u002F ...\n```\n\nTo get usage report when using stream you can use `include_usage` in `stream_options` .\n\n```php\n$stream = $client->chat()->createStreamed([\n    'model' => 'gpt-4',\n    'messages' => [\n        ['role' => 'user', 'content' => 'Hello!'],\n    ],\n    'stream_options'=>[\n        'include_usage' => true,\n    ]\n]);\n\nforeach($stream as $response){\n    if($response->usage !== null){\n        $response->usage->promptTokens; \u002F\u002F 9,\n        $response->usage->completionTokens; \u002F\u002F 12,\n        $response->usage->totalTokens; \u002F\u002F 21\n    }\n}\n```\n\n`usage` is always `null` except for the last chunk which contains the token usage statistics for the entire request.\n\n### `Audio` Resource\n\n#### `speech`\n\nGenerates audio from the input text.\n\n```php\n$client->audio()->speech([\n    'model' => 'tts-1',\n    'input' => 'The quick brown fox jumped over the lazy dog.',\n    'voice' => 'alloy',\n]); \u002F\u002F audio file content as string\n```\n\n#### `speechStreamed`\n\nGenerates streamed audio from the input text.\n\n```php\n$stream = $client->audio()->speechStreamed([\n    'model' => 'tts-1',\n    'input' => 'The quick brown fox jumped over the lazy dog.',\n    'voice' => 'alloy',\n]);\n\nforeach($stream as $chunk){\n    $chunk; \u002F\u002F chunk of audio file content as string\n}\n```\n\n#### `transcribe`\n\nTranscribes audio into the input language.\n\n```php\n$response = $client->audio()->transcribe([\n    'model' => 'whisper-1',\n    'file' => fopen('audio.mp3', 'r'),\n    'response_format' => 'verbose_json',\n    'timestamp_granularities' => ['segment', 'word']\n]);\n\n$response->task; \u002F\u002F 'transcribe'\n$response->language; \u002F\u002F 'english'\n$response->duration; \u002F\u002F 2.95\n$response->text; \u002F\u002F 'Hello, how are you?'\n\nforeach ($response->segments as $segment) {\n    $segment->index; \u002F\u002F 0\n    $segment->seek; \u002F\u002F 0\n    $segment->start; \u002F\u002F 0.0\n    $segment->end; \u002F\u002F 4.0\n    $segment->text; \u002F\u002F 'Hello, how are you?'\n    $segment->tokens; \u002F\u002F [50364, 2425, 11, 577, 366, 291, 30, 50564]\n    $segment->temperature; \u002F\u002F 0.0\n    $segment->avgLogprob; \u002F\u002F -0.45045216878255206\n    $segment->compressionRatio; \u002F\u002F 0.7037037037037037\n    $segment->noSpeechProb; \u002F\u002F 0.1076972484588623\n    $segment->transient; \u002F\u002F false\n}\n\nforeach ($response->words as $word) {\n    $word->word; \u002F\u002F 'Hello'\n    $word->start; \u002F\u002F 0.31\n    $word->end; \u002F\u002F 0.92\n}\n\n$response->toArray(); \u002F\u002F ['task' => 'transcribe', ...]\n```\n\n#### `transcribe streamed`\n\nTranscribes audio into the input language with streaming.\n\n```php\n$stream = $client->audio()->transcribeStreamed([\n    'model' => 'gpt-4o-transcribe',\n    'file' => fopen('audio.mp3', 'r'),\n]);\n\nforeach ($stream as $event) {\n    echo json_encode($event->toArray()); \u002F\u002F {\"event\":\"transcript.text.delta\",\"data\":{\"delta\":\"The\"}}\n}\n```\n\n#### `translate`\n\nTranslates audio into English.\n\n```php\n$response = $client->audio()->translate([\n    'model' => 'whisper-1',\n    'file' => fopen('german.mp3', 'r'),\n    'response_format' => 'verbose_json',\n]);\n\n$response->task; \u002F\u002F 'translate'\n$response->language; \u002F\u002F 'english'\n$response->duration; \u002F\u002F 2.95\n$response->text; \u002F\u002F 'Hello, how are you?'\n\nforeach ($response->segments as $segment) {\n    $segment->index; \u002F\u002F 0\n    $segment->seek; \u002F\u002F 0\n    $segment->start; \u002F\u002F 0.0\n    $segment->end; \u002F\u002F 4.0\n    $segment->text; \u002F\u002F 'Hello, how are you?'\n    $segment->tokens; \u002F\u002F [50364, 2425, 11, 577, 366, 291, 30, 50564]\n    $segment->temperature; \u002F\u002F 0.0\n    $segment->avgLogprob; \u002F\u002F -0.45045216878255206\n    $segment->compressionRatio; \u002F\u002F 0.7037037037037037\n    $segment->noSpeechProb; \u002F\u002F 0.1076972484588623\n    $segment->transient; \u002F\u002F false\n}\n\n$response->toArray(); \u002F\u002F ['task' => 'translate', ...]\n```\n\n### `Embeddings` Resource\n\n#### `create`\n\nCreates an embedding vector representing the input text.\n\n```php\n$response = $client->embeddings()->create([\n    'model' => 'text-similarity-babbage-001',\n    'input' => 'The food was delicious and the waiter...',\n]);\n\n$response->object; \u002F\u002F 'list'\n\nforeach ($response->embeddings as $embedding) {\n    $embedding->object; \u002F\u002F 'embedding'\n    $embedding->model; \u002F\u002F 'text-similarity-babbage-001'\n    $embedding->embedding; \u002F\u002F [0.018990106880664825, -0.0073809814639389515, ...]\n    $embedding->index; \u002F\u002F 0\n}\n\n$response->usage->promptTokens; \u002F\u002F 8,\n$response->usage->totalTokens; \u002F\u002F 8\n\n$response->toArray(); \u002F\u002F ['data' => [...], ...]\n```\n\n### `Files` Resource\n\n#### `list`\n\nReturns a list of files that belong to the user's organization.\n\n```php\n$response = $client->files()->list();\n\n$response->object; \u002F\u002F 'list'\n\nforeach ($response->data as $result) {\n    $result->id; \u002F\u002F 'file-XjGxS3KTG0uNmNOK362iJua3'\n    $result->object; \u002F\u002F 'file'\n    \u002F\u002F ...\n}\n\n$response->toArray(); \u002F\u002F ['object' => 'list', 'data' => [...]]\n```\n\n#### `delete`\n\nDelete a file.\n\n```php\n$response = $client->files()->delete($file);\n\n$response->id; \u002F\u002F 'file-XjGxS3KTG0uNmNOK362iJua3'\n$response->object; \u002F\u002F 'file'\n$response->deleted; \u002F\u002F true\n\n$response->toArray(); \u002F\u002F ['id' => 'file-XjGxS3KTG0uNmNOK362iJua3', ...]\n```\n\n#### `retrieve`\n\nReturns information about a specific file.\n\n```php\n$response = $client->files()->retrieve('file-XjGxS3KTG0uNmNOK362iJua3');\n\n$response->id; \u002F\u002F 'file-XjGxS3KTG0uNmNOK362iJua3'\n$response->object; \u002F\u002F 'file'\n$response->bytes; \u002F\u002F 140\n$response->createdAt; \u002F\u002F 1613779657\n$response->filename; \u002F\u002F 'mydata.jsonl'\n$response->purpose; \u002F\u002F 'fine-tune'\n$response->status; \u002F\u002F 'succeeded'\n$response->status_details; \u002F\u002F null\n\n$response->toArray(); \u002F\u002F ['id' => 'file-XjGxS3KTG0uNmNOK362iJua3', ...]\n```\n\n#### `upload`\n\nUpload a file that contains document(s) to be used across various endpoints\u002Ffeatures.\n\n```php\n$response = $client->files()->upload([\n        'purpose' => 'fine-tune',\n        'file' => fopen('my-file.jsonl', 'r'),\n    ]);\n\n$response->id; \u002F\u002F 'file-XjGxS3KTG0uNmNOK362iJua3'\n$response->object; \u002F\u002F 'file'\n$response->bytes; \u002F\u002F 140\n$response->createdAt; \u002F\u002F 1613779657\n$response->filename; \u002F\u002F 'mydata.jsonl'\n$response->purpose; \u002F\u002F 'fine-tune'\n$response->status; \u002F\u002F 'succeeded'\n$response->status_details; \u002F\u002F null\n\n$response->toArray(); \u002F\u002F ['id' => 'file-XjGxS3KTG0uNmNOK362iJua3', ...]\n```\n\n#### `download`\n\nReturns the contents of the specified file.\n\n```php\n$client->files()->download($file); \u002F\u002F '{\"prompt\": \"\u003Cprompt text>\", ...'\n```\n\n### `FineTuning` Resource\n\n#### `create job`\n\nCreates a job that fine-tunes a specified model from a given dataset.\n\n```php\n$response = $client->fineTuning()->createJob([\n    'training_file' => 'file-abc123',\n    'validation_file' => null,\n    'model' => 'gpt-3.5-turbo',\n    'hyperparameters' => [\n        'n_epochs' => 4,\n    ],\n    'suffix' => null,\n]);\n\n$response->id; \u002F\u002F 'ftjob-AF1WoRqd3aJAHsqc9NY7iL8F'\n$response->object; \u002F\u002F 'fine_tuning.job'\n$response->model; \u002F\u002F 'gpt-3.5-turbo-0613'\n$response->fineTunedModel; \u002F\u002F null\n\u002F\u002F ...\n\n$response->toArray(); \u002F\u002F ['id' => 'ftjob-AF1WoRqd3aJAHsqc9NY7iL8F', ...]\n```\n\n#### `list jobs`\n\nList your organization's fine-tuning jobs.\n\n```php\n$response = $client->fineTuning()->listJobs();\n\n$response->object; \u002F\u002F 'list'\n\nforeach ($response->data as $result) {\n    $result->id; \u002F\u002F 'ftjob-AF1WoRqd3aJAHsqc9NY7iL8F'\n    $result->object; \u002F\u002F 'fine_tuning.job'\n    \u002F\u002F ...\n}\n\n$response->toArray(); \u002F\u002F ['object' => 'list', 'data' => [...]]\n```\n\nYou can pass additional parameters to the `listJobs` method to narrow down the results.\n\n```php\n$response = $client->fineTuning()->listJobs([\n    'limit' => 3, \u002F\u002F Number of jobs to retrieve (Default: 20)\n    'after' => 'ftjob-AF1WoRqd3aJAHsqc9NY7iL8F', \u002F\u002F Identifier for the last job from the previous pagination request.\n]);\n```\n\n#### `retrieve job`\n\nGet info about a fine-tuning job.\n\n```php\n$response = $client->fineTuning()->retrieveJob('ftjob-AF1WoRqd3aJAHsqc9NY7iL8F');\n\n$response->id; \u002F\u002F 'ftjob-AF1WoRqd3aJAHsqc9NY7iL8F'\n$response->object; \u002F\u002F 'fine_tuning.job'\n$response->model; \u002F\u002F 'gpt-3.5-turbo-0613'\n$response->createdAt; \u002F\u002F 1614807352\n$response->finishedAt; \u002F\u002F 1692819450\n$response->fineTunedModel; \u002F\u002F 'ft:gpt-3.5-turbo-0613:jwe-dev::7qnxQ0sQ'\n$response->organizationId; \u002F\u002F 'org-jwe45798ASN82s'\n$response->resultFiles[0]; \u002F\u002F 'file-1bl05WrhsKDDEdg8XSP617QF'\n$response->status; \u002F\u002F 'succeeded'\n$response->validationFile; \u002F\u002F null\n$response->trainingFile; \u002F\u002F 'file-abc123'\n$response->trainedTokens; \u002F\u002F 5049\n\n$response->hyperparameters->nEpochs; \u002F\u002F 9\n\n$response->toArray(); \u002F\u002F ['id' => 'ftjob-AF1WoRqd3aJAHsqc9NY7iL8F', ...]\n```\n\n#### `cancel job`\n\nImmediately cancel a fine-tune job.\n\n```php\n$response = $client->fineTuning()->cancelJob('ftjob-AF1WoRqd3aJAHsqc9NY7iL8F');\n\n$response->id; \u002F\u002F 'ftjob-AF1WoRqd3aJAHsqc9NY7iL8F'\n$response->object; \u002F\u002F 'fine_tuning.job'\n\u002F\u002F ...\n$response->status; \u002F\u002F 'cancelled'\n\u002F\u002F ...\n\n$response->toArray(); \u002F\u002F ['id' => 'ftjob-AF1WoRqd3aJAHsqc9NY7iL8F', ...]\n```\n\n#### `list job events`\n\nGet status updates for a fine-tuning job.\n\n```php\n$response = $client->fineTuning()->listJobEvents('ftjob-AF1WoRqd3aJAHsqc9NY7iL8F');\n\n$response->object; \u002F\u002F 'list'\n\nforeach ($response->data as $result) {\n    $result->object; \u002F\u002F 'fine_tuning.job.event' \n    $result->createdAt; \u002F\u002F 1614807352\n    \u002F\u002F ...\n}\n\n$response->toArray(); \u002F\u002F ['object' => 'list', 'data' => [...]]\n```\n\nYou can pass additional parameters to the `listJobEvents` method to narrow down the results.\n\n```php\n$response = $client->fineTuning()->listJobEvents('ftjob-AF1WoRqd3aJAHsqc9NY7iL8F', [\n    'limit' => 3, \u002F\u002F Number of events to retrieve (Default: 20)\n    'after' => 'ftevent-kLPSMIcsqshEUEJVOVBVcHlP', \u002F\u002F Identifier for the last event from the previous pagination request.\n]);\n```\n\n### `Moderations` Resource\n\n#### `create`\n\nClassifies if text violates OpenAI's Content Policy.\n\n```php\n\n$response = $client->moderations()->create([\n    'model' => 'text-moderation-latest',\n    'input' => 'I want to k*** them.',\n]);\n\n$response->id; \u002F\u002F modr-5xOyuS\n$response->model; \u002F\u002F text-moderation-003\n\nforeach ($response->results as $result) {\n    $result->flagged; \u002F\u002F true\n\n    foreach ($result->categories as $category) {\n        $category->category->value; \u002F\u002F 'violence'\n        $category->violated; \u002F\u002F true\n        $category->score; \u002F\u002F 0.97431367635727\n    }\n}\n\n$response->toArray(); \u002F\u002F ['id' => 'modr-5xOyuS', ...]\n```\n\n### `Images` Resource\n\n#### `create`\n\nCreates an image given a prompt.\n\n```php\n$response = $client->images()->create([\n    'model' => 'dall-e-3',\n    'prompt' => 'A cute baby sea otter',\n    'n' => 1,\n    'size' => '1024x1024',\n    'response_format' => 'url',\n]);\n\n$response->created; \u002F\u002F 1589478378\n\nforeach ($response->data as $data) {\n    $data->url; \u002F\u002F 'https:\u002F\u002Foaidalleapiprodscus.blob.core.windows.net\u002Fprivate\u002F...'\n    $data->b64_json; \u002F\u002F null\n}\n\n$response->toArray(); \u002F\u002F ['created' => 1589478378, data => ['url' => 'https:\u002F\u002Foaidalleapiprodscus...', ...]]\n```\n\n#### `create streamed`\n\nWhen you create an image with stream set to true, the server will emit server-sent events to the client as the image is generated. All events and their payloads can be found in [OpenAI docs](https:\u002F\u002Fplatform.openai.com\u002Fdocs\u002Fapi-reference\u002Fimages-streaming).\n\n```php\n$stream = $client->images()->createStreamed([\n    'model' => 'gpt-image-1',\n    'prompt' => 'A cute baby sea otter',\n    'n' => 1,\n    'size' => '1024x1024',\n    'response_format' => 'url',\n]);\n\nforeach ($stream as $image) {\n    $image->type; \u002F\u002F 'image_generation.partial_image'\n}\n```\n\n#### `edit`\n\nCreates an edited or extended image given an original image and a prompt.\n\n```php\n$response = $client->images()->edit([\n    'image' => fopen('image_edit_original.png', 'r'),\n    'mask' => fopen('image_edit_mask.png', 'r'),\n    'prompt' => 'A sunlit indoor lounge area with a pool containing a flamingo',\n    'n' => 1,\n    'size' => '256x256',\n    'response_format' => 'url',\n]);\n\n$response->created; \u002F\u002F 1589478378\n\nforeach ($response->data as $data) {\n    $data->url; \u002F\u002F 'https:\u002F\u002Foaidalleapiprodscus.blob.core.windows.net\u002Fprivate\u002F...'\n    $data->b64_json; \u002F\u002F null\n}\n\n$response->toArray(); \u002F\u002F ['created' => 1589478378, data => ['url' => 'https:\u002F\u002Foaidalleapiprodscus...', ...]]\n```\n\n#### `edit streamed`\n\nWhen you edit an image with stream set to true, the server will emit server-sent events to the client as the image is generated. All events and their payloads can be found in [OpenAI docs](https:\u002F\u002Fplatform.openai.com\u002Fdocs\u002Fapi-reference\u002Fimages-streaming).\n\n```php\n$stream = $client->images()->editStreamed([\n    'model' => 'gpt-image-1',\n    'prompt' => 'A cute baby sea otter',\n    'n' => 1,\n    'size' => '1024x1024',\n    'response_format' => 'url',\n]);\n\nforeach ($stream as $image) {\n    $image->type; \u002F\u002F 'image_generation.partial_image'\n}\n```\n\n#### `variation`\n\nCreates a variation of a given image.\n\n```php\n$response = $client->images()->variation([\n    'image' => fopen('image_edit_original.png', 'r'),\n    'n' => 1,\n    'size' => '256x256',\n    'response_format' => 'url',\n]);\n\n$response->created; \u002F\u002F 1589478378\n\nforeach ($response->data as $data) {\n    $data->url; \u002F\u002F 'https:\u002F\u002Foaidalleapiprodscus.blob.core.windows.net\u002Fprivate\u002F...'\n    $data->b64_json; \u002F\u002F null\n}\n\n$response->toArray(); \u002F\u002F ['created' => 1589478378, data => ['url' => 'https:\u002F\u002Foaidalleapiprodscus...', ...]]\n```\n\n### `Batches` Resource\n\n#### `create`\n\nCreates a batch.\n\n```php\n\n$fileResponse = $client->files()->upload(\n     parameters: [\n          'purpose' => 'batch',\n          'file' => fopen('commands.jsonl', 'r'),\n    ]\n);\n\n$fileId = $fileResponse->id;\n\n$response = $client->batches()->create(\n    parameters: [\n        'input_file_id' => $fileId,\n        'endpoint' => '\u002Fv1\u002Fchat\u002Fcompletions',\n        'completion_window' => '24h'\n    ]\n );\n\n$response->id; \u002F\u002F 'batch_abc123'\n$response->object; \u002F\u002F 'batch'\n$response->endpoint; \u002F\u002F \u002Fv1\u002Fchat\u002Fcompletions\n$response->errors; \u002F\u002F null\n$response->completionWindow; \u002F\u002F '24h'\n$response->status; \u002F\u002F 'validating'\n$response->outputFileId; \u002F\u002F null\n$response->errorFileId; \u002F\u002F null\n$response->createdAt; \u002F\u002F 1714508499\n$response->inProgressAt; \u002F\u002F null\n$response->expiresAt; \u002F\u002F 1714536634\n$response->completedAt; \u002F\u002F null\n$response->failedAt; \u002F\u002F null\n$response->expiredAt; \u002F\u002F null\n$response->requestCounts; \u002F\u002F null\n$response->metadata; \u002F\u002F ['name' => 'My batch name']\n\n$response->toArray(); \u002F\u002F ['id' => 'batch_abc123', ...]\n```\n\n#### `retrieve`\n\nRetrieves a batch.\n\n```php\n$response = $client->batches()->retrieve(id: 'batch_abc123');\n\n$response->id; \u002F\u002F 'batch_abc123'\n$response->object; \u002F\u002F 'batch'\n$response->endpoint; \u002F\u002F \u002Fv1\u002Fchat\u002Fcompletions\n$response->errors; \u002F\u002F null\n$response->completionWindow; \u002F\u002F '24h'\n$response->status; \u002F\u002F 'validating'\n$response->outputFileId; \u002F\u002F null\n$response->errorFileId; \u002F\u002F null\n$response->createdAt; \u002F\u002F 1714508499\n$response->inProgressAt; \u002F\u002F null\n$response->expiresAt; \u002F\u002F 1714536634\n$response->completedAt; \u002F\u002F null\n$response->failedAt; \u002F\u002F null\n$response->expiredAt; \u002F\u002F null\n$response->requestCounts->total; \u002F\u002F 100\n$response->requestCounts->completed; \u002F\u002F 95\n$response->requestCounts->failed; \u002F\u002F 5\n$response->metadata; \u002F\u002F ['name' => 'My batch name']\n\n$response->toArray(); \u002F\u002F ['id' => 'batch_abc123', ...]\n```\n\n#### `cancel`\n\nCancels a batch.\n\n```php\n$response = $client->batches()->cancel(id: 'batch_abc123');\n\n$response->id; \u002F\u002F 'batch_abc123'\n$response->object; \u002F\u002F 'batch'\n$response->endpoint; \u002F\u002F \u002Fv1\u002Fchat\u002Fcompletions\n$response->errors; \u002F\u002F null\n$response->completionWindow; \u002F\u002F '24h'\n$response->status; \u002F\u002F 'cancelling'\n$response->outputFileId; \u002F\u002F null\n$response->errorFileId; \u002F\u002F null\n$response->createdAt; \u002F\u002F 1711471533\n$response->inProgressAt; \u002F\u002F 1711471538\n$response->expiresAt; \u002F\u002F 1711557933\n$response->cancellingAt; \u002F\u002F 1711475133\n$response->cancelledAt; \u002F\u002F null\n$response->requestCounts->total; \u002F\u002F 100\n$response->requestCounts->completed; \u002F\u002F 23\n$response->requestCounts->failed; \u002F\u002F 1\n$response->metadata; \u002F\u002F ['name' => 'My batch name']\n\n$response->toArray(); \u002F\u002F ['id' => 'batch_abc123', ...]\n```\n\n#### `list`\n\nReturns a list of batches.\n\n```php\n$response = $client->batches()->list(\n    parameters: [\n        'limit' => 10, \n    ],\n);\n\n$response->object; \u002F\u002F 'list'\n$response->firstId; \u002F\u002F 'batch_abc123'\n$response->lastId; \u002F\u002F 'batch_abc456'\n$response->hasMore; \u002F\u002F true\n\nforeach ($response->data as $result) {\n    $result->id; \u002F\u002F 'batch_abc123'\n    \u002F\u002F ...\n}\n\n$response->toArray(); \u002F\u002F ['object' => 'list', ...]]\n```\n\n### `Vector Stores` Resource\n\n#### `create`\n\nCreate a vector store.\n\n```php\n$response = $client->vectorStores()->create([\n    'file_ids' => [\n        'file-fUU0hFRuQ1GzhOweTNeJlCXG',\n    ],\n    'name' => 'My first Vector Store',\n]);\n\n$response->id; \u002F\u002F 'vs_vzfQhlTWVUl38QGqQAoQjeDF'\n$response->object; \u002F\u002F 'vector_store'\n$response->createdAt; \u002F\u002F 1717703267\n$response->name; \u002F\u002F 'My first Vector Store'\n$response->usageBytes; \u002F\u002F 0\n$response->fileCounts->inProgress; \u002F\u002F 1\n$response->fileCounts->completed; \u002F\u002F 0\n$response->fileCounts->failed; \u002F\u002F 0\n$response->fileCounts->cancelled; \u002F\u002F 0\n$response->fileCounts->total; \u002F\u002F 1\n$response->status; \u002F\u002F 'in_progress'\n$response->expiresAfter; \u002F\u002F null\n$response->expiresAt; \u002F\u002F null\n$response->lastActiveAt; \u002F\u002F 1717703267\n\n$response->toArray(); \u002F\u002F ['id' => 'vs_vzfQhlTWVUl38QGqQAoQjeDF', ...]\n```\n\n#### `retrieve`\n\nRetrieves a vector store.\n\n```php\n$response = $client->vectorStores()->retrieve(\n    vectorStoreId: 'vs_vzfQhlTWVUl38QGqQAoQjeDF',\n);\n\n$response->id; \u002F\u002F 'vs_vzfQhlTWVUl38QGqQAoQjeDF'\n$response->object; \u002F\u002F 'vector_store'\n$response->createdAt; \u002F\u002F 1717703267\n$response->name; \u002F\u002F 'My first Vector Store'\n$response->usageBytes; \u002F\u002F 0\n$response->fileCounts->inProgress; \u002F\u002F 1\n$response->fileCounts->completed; \u002F\u002F 0\n$response->fileCounts->failed; \u002F\u002F 0\n$response->fileCounts->cancelled; \u002F\u002F 0\n$response->fileCounts->total; \u002F\u002F 1\n$response->status; \u002F\u002F 'in_progress'\n$response->expiresAfter; \u002F\u002F null\n$response->expiresAt; \u002F\u002F null\n$response->lastActiveAt; \u002F\u002F 1717703267\n\n$response->toArray(); \u002F\u002F ['id' => 'vs_vzfQhlTWVUl38QGqQAoQjeDF', ...]\n```\n\n#### `modify`\n\nModifies a vector store.\n\n```php\n$response = $client->vectorStores()->modify(\n    vectorStoreId: 'vs_vzfQhlTWVUl38QGqQAoQjeDF',\n    parameters:  [\n        'name' => 'New name',\n    ],\n);\n\n$response->id; \u002F\u002F 'vs_vzfQhlTWVUl38QGqQAoQjeDF'\n$response->object; \u002F\u002F 'vector_store'\n$response->createdAt; \u002F\u002F 1717703267\n$response->name; \u002F\u002F 'New name'\n$response->usageBytes; \u002F\u002F 0\n$response->fileCounts->inProgress; \u002F\u002F 1\n$response->fileCounts->completed; \u002F\u002F 0\n$response->fileCounts->failed; \u002F\u002F 0\n$response->fileCounts->cancelled; \u002F\u002F 0\n$response->fileCounts->total; \u002F\u002F 1\n$response->status; \u002F\u002F 'in_progress'\n$response->expiresAfter; \u002F\u002F null\n$response->expiresAt; \u002F\u002F null\n$response->lastActiveAt; \u002F\u002F 1717703267\n\n$response->toArray(); \u002F\u002F ['id' => 'vs_vzfQhlTWVUl38QGqQAoQjeDF', ...]\n```\n\n#### `delete`\n\nDelete a vector store.\n\n```php\n$response = $client->vectorStores()->delete(\n    vectorStoreId: 'vs_vzfQhlTWVUl38QGqQAoQjeDF',\n);\n\n$response->id; \u002F\u002F 'vs_vzfQhlTWVUl38QGqQAoQjeDF'\n$response->object; \u002F\u002F 'vector_store.deleted'\n$response->deleted; \u002F\u002F true\n\n$response->toArray(); \u002F\u002F ['id' => 'vs_vzfQhlTWVUl38QGqQAoQjeDF', ...]\n```\n\n#### `list`\n\nReturns a list of vector stores.\n\n```php\n$response = $client->vectorStores()->list(\n    parameters: [\n        'limit' => 10,\n    ],\n);\n\n$response->object; \u002F\u002F 'list'\n$response->firstId; \u002F\u002F 'vs_vzfQhlTWVUl38QGqQAoQjeDF'\n$response->lastId; \u002F\u002F 'vs_D5DPOgBxSoEBTmYBgUESdPpa'\n$response->hasMore; \u002F\u002F true\n\nforeach ($response->data as $result) {\n    $result->id; \u002F\u002F 'vs_vzfQhlTWVUl38QGqQAoQjeDF'\n    \u002F\u002F ...\n}\n\n$response->toArray(); \u002F\u002F ['object' => 'list', ...]]\n```\n\n### `Vector Store Files` Resource\n\n#### `create`\n\nCreate a vector store file by attaching a File to a vector store.\n\n```php\n$response = $client->vectorStores()->files()->create(\n    vectorStoreId: 'vs_vzfQhlTWVUl38QGqQAoQjeDF',\n    parameters: [\n        'file_id' => 'file-fUU0hFRuQ1GzhOweTNeJlCXG',\n    ]\n);\n\n$response->id; \u002F\u002F 'file-fUU0hFRuQ1GzhOweTNeJlCXG'\n$response->object; \u002F\u002F 'vector_store.file'\n$response->usageBytes; \u002F\u002F 4553\n$response->createdAt; \u002F\u002F 1717703267\n$response->vectorStoreId; \u002F\u002F 'vs_vzfQhlTWVUl38QGqQAoQjeDF'\n$response->status; \u002F\u002F 'completed'\n$response->lastError; \u002F\u002F null\n$response->chunkingStrategy->type; \u002F\u002F 'static'\n$response->chunkingStrategy->maxChunkSizeTokens; \u002F\u002F 800\n$response->chunkingStrategy->chunkOverlapTokens; \u002F\u002F 400\n\n$response->toArray(); \u002F\u002F ['id' => 'file-fUU0hFRuQ1GzhOweTNeJlCXG', ...]\n```\n\n#### `retrieve`\n\nRetrieves a vector store file.\n\n```php\n$response = $client->vectorStores()->files()->retrieve(\n    vectorStoreId: 'vs_vzfQhlTWVUl38QGqQAoQjeDF',\n    fileId: 'file-fUU0hFRuQ1GzhOweTNeJlCXG',\n);\n\n$response->id; \u002F\u002F 'file-fUU0hFRuQ1GzhOweTNeJlCXG'\n$response->object; \u002F\u002F 'vector_store.file'\n$response->usageBytes; \u002F\u002F 4553\n$response->createdAt; \u002F\u002F 1717703267\n$response->vectorStoreId; \u002F\u002F 'vs_vzfQhlTWVUl38QGqQAoQjeDF'\n$response->status; \u002F\u002F 'completed'\n$response->lastError; \u002F\u002F null\n$response->chunkingStrategy->type; \u002F\u002F 'static'\n$response->chunkingStrategy->maxChunkSizeTokens; \u002F\u002F 800\n$response->chunkingStrategy->chunkOverlapTokens; \u002F\u002F 400\n\n$response->toArray(); \u002F\u002F ['id' => 'file-fUU0hFRuQ1GzhOweTNeJlCXG', ...]\n```\n\n#### `delete`\n\nDelete a vector store file. This will remove the file from the vector store but the file itself will not be deleted. To delete the file, use the delete file endpoint.\n\n```php\n$response = $client->vectorStores()->files()->delete(\n    vectorStoreId: 'vs_vzfQhlTWVUl38QGqQAoQjeDF',\n    fileId: 'file-fUU0hFRuQ1GzhOweTNeJlCXG',\n);\n\n$response->id; \u002F\u002F 'file-fUU0hFRuQ1GzhOweTNeJlCXG'\n$response->object; \u002F\u002F 'vector_store.file.deleted'\n$response->deleted; \u002F\u002F true\n\n$response->toArray(); \u002F\u002F ['id' => 'file-fUU0hFRuQ1GzhOweTNeJlCXG', ...]\n```\n\n#### `list`\n\nReturns a list of vector store files.\n\n```php\n$response = $client->vectorStores()->files()->list(\n    vectorStoreId: 'vs_vzfQhlTWVUl38QGqQAoQjeDF',\n    parameters: [\n        'limit' => 10,\n    ],\n);\n\n$response->object; \u002F\u002F 'list'\n$response->firstId; \u002F\u002F 'file-fUU0hFRuQ1GzhOweTNeJlCXG'\n$response->lastId; \u002F\u002F 'file-D5DPOgBxSoEBTmYBgUESdPpa'\n$response->hasMore; \u002F\u002F true\n\nforeach ($response->data as $result) {\n    $result->id; \u002F\u002F 'file-fUU0hFRuQ1GzhOweTNeJlCXG'\n    \u002F\u002F ...\n}\n\n$response->toArray(); \u002F\u002F ['object' => 'list', ...]]\n```\n\n#### `search`\n\nSearch a vector store for relevant chunks based on a query and file attributes filter.\n\n```php\n$response = $client->vectorStores()->search(\n    vectorStoreId: 'vs_vzfQhlTWVUl38QGqQAoQjeDF',\n    parameters: [\n        'query' => 'What is the return policy?',\n        'max_num_results' => 5,\n        'filters' => [],\n        'rewrite_query' => false\n    ]\n);\n\n$response->object; \u002F\u002F 'vector_store.search_results.page'\n$response->searchQuery; \u002F\u002F 'What is the return policy?'\n$response->hasMore; \u002F\u002F false\n$response->nextPage; \u002F\u002F null\nforeach ($response->data as $file) {\n    $result->fileId; \u002F\u002F 'file-fUU0hFRuQ1GzhOweTNeJlCXG'\n    $result->filename; \u002F\u002F 'return_policy.pdf'\n    $result->score; \u002F\u002F 0.95\n    $result->attributes; \u002F\u002F ['category' => 'customer_service']\n\n    foreach ($result->content as $content) {\n        $content->type; \u002F\u002F 'text'\n        $content->text; \u002F\u002F 'Our return policy allows customers to return items within 30 days...'\n    }\n}\n\n$response->toArray(); \u002F\u002F ['object' => 'vector_store.search_results.page', ...]\n```\n\n### `Vector Store File Batches` Resource\n\n#### `create`\n\nCreate a vector store file batch.\n\n```php\n$response = $client->vectorStores()->batches()->create(\n    vectorStoreId: 'vs_vzfQhlTWVUl38QGqQAoQjeDF',\n    parameters: [\n        'file_ids' => [\n            'file-fUU0hFRuQ1GzhOweTNeJlCXG',\n        ],\n    ]\n);\n\n$response->id; \u002F\u002F 'vsfb_123'\n$response->object; \u002F\u002F 'vector_store.files_batch'\n$response->createdAt; \u002F\u002F 1698107661\n$response->vectorStoreId; \u002F\u002F 'vs_vzfQhlTWVUl38QGqQAoQjeDF'\n$response->status; \u002F\u002F 'completed'\n$response->fileCounts->inProgress; \u002F\u002F 1\n$response->fileCounts->completed; \u002F\u002F 0\n$response->fileCounts->failed; \u002F\u002F 0\n$response->fileCounts->cancelled; \u002F\u002F 0\n$response->fileCounts->total; \u002F\u002F 1\n\n$response->toArray(); \u002F\u002F ['id' => 'vsfb_123', ...]\n```\n\n#### `retrieve`\n\nRetrieves a vector store file batch.\n\n```php\n$response = $client->vectorStores()->batches()->retrieve(\n    vectorStoreId: 'vs_vzfQhlTWVUl38QGqQAoQjeDF',\n    fileBatchId: 'vsfb_123',\n);\n\n$response->id; \u002F\u002F 'vsfb_123'\n$response->object; \u002F\u002F 'vector_store.files_batch'\n$response->createdAt; \u002F\u002F 1698107661\n$response->vectorStoreId; \u002F\u002F 'vs_vzfQhlTWVUl38QGqQAoQjeDF'\n$response->status; \u002F\u002F 'completed'\n$response->fileCounts->inProgress; \u002F\u002F 1\n$response->fileCounts->completed; \u002F\u002F 0\n$response->fileCounts->failed; \u002F\u002F 0\n$response->fileCounts->cancelled; \u002F\u002F 0\n$response->fileCounts->total; \u002F\u002F 1\n\n$response->toArray(); \u002F\u002F ['id' => 'vsfb_123', ...]\n```\n\n#### `cancel`\n\nCancel a vector store file batch. This attempts to cancel the processing of files in this batch as soon as possible.\n\n```php\n$response = $client->vectorStores()->batches()->cancel(\n    vectorStoreId: 'vs_vzfQhlTWVUl38QGqQAoQjeDF',\n    fileBatchId: 'vsfb_123',\n);\n\n$response->id; \u002F\u002F 'vsfb_123'\n$response->object; \u002F\u002F 'vector_store.files_batch'\n$response->createdAt; \u002F\u002F 1698107661\n$response->vectorStoreId; \u002F\u002F 'vs_vzfQhlTWVUl38QGqQAoQjeDF'\n$response->status; \u002F\u002F 'cancelling'\n$response->fileCounts->inProgress; \u002F\u002F 1\n$response->fileCounts->completed; \u002F\u002F 0\n$response->fileCounts->failed; \u002F\u002F 0\n$response->fileCounts->cancelled; \u002F\u002F 0\n$response->fileCounts->total; \u002F\u002F 1\n\n$response->toArray(); \u002F\u002F ['id' => 'vsfb_123', ...]\n```\n\n#### `list`\n\nReturns a list of vector store files.\n\n```php\n$response = $client->vectorStores()->batches()->listFiles(\n    vectorStoreId: 'vs_vzfQhlTWVUl38QGqQAoQjeDF',\n    fileBatchId: 'vsfb_123',\n    parameters: [\n        'limit' => 10,\n    ],\n);\n\n$response->object; \u002F\u002F 'list'\n$response->firstId; \u002F\u002F 'file-fUU0hFRuQ1GzhOweTNeJlCXG'\n$response->lastId; \u002F\u002F 'file-D5DPOgBxSoEBTmYBgUESdPpa'\n$response->hasMore; \u002F\u002F true\n\nforeach ($response->data as $result) {\n    $result->id; \u002F\u002F 'file-fUU0hFRuQ1GzhOweTNeJlCXG'\n    \u002F\u002F ...\n}\n\n$response->toArray(); \u002F\u002F ['object' => 'list', ...]]\n```\n\n### Realtime Ephemeral Keys\n\n#### `token`\n\nCreate an ephemeral API token for real time sessions.\n\n```php\n$response = $client->realtime()->token();\n\n$response->clientSecret->value \u002F\u002F 'ek-1234567890abcdefg'\n$response->clientSecret->expiresAt \u002F\u002F 1717703267\n```\n\n#### `transcribeToken`\n\nCreate an ephemeral API token for real time transcription sessions.\n\n```php\n$response = $client->realtime()->transcribeToken();\n\n$response->clientSecret->value \u002F\u002F 'et-1234567890abcdefg'\n$response->clientSecret->expiresAt \u002F\u002F 1717703267\n```\n\n### `Completions` Resource (legacy)\n\n> [!WARNING]  \n> The `Completions` resource was marked \"Legacy\" by OpenAI in July 2023. Please use the `Chat` resource instead.\n\n\u003Cdetails>\n\u003Csummary>Completion API Information\u003C\u002Fsummary>\n\n#### `create`\n\nCreates a completion for the provided prompt and parameters.\n\n```php\n$response = $client->completions()->create([\n    'model' => 'gpt-3.5-turbo-instruct',\n    'prompt' => 'Say this is a test',\n    'max_tokens' => 6,\n    'temperature' => 0\n]);\n\n$response->id; \u002F\u002F 'cmpl-uqkvlQyYK7bGYrRHQ0eXlWi7'\n$response->object; \u002F\u002F 'text_completion'\n$response->created; \u002F\u002F 1589478378\n$response->model; \u002F\u002F 'gpt-3.5-turbo-instruct'\n\nforeach ($response->choices as $choice) {\n    $choice->text; \u002F\u002F '\\n\\nThis is a test'\n    $choice->index; \u002F\u002F 0\n    $choice->logprobs; \u002F\u002F null\n    $choice->finishReason; \u002F\u002F 'length' or null\n}\n\n$response->usage->promptTokens; \u002F\u002F 5,\n$response->usage->completionTokens; \u002F\u002F 6,\n$response->usage->totalTokens; \u002F\u002F 11\n\n$response->toArray(); \u002F\u002F ['id' => 'cmpl-uqkvlQyYK7bGYrRHQ0eXlWi7', ...]\n```\n\n#### `create streamed`\n\nCreates a streamed completion for the provided prompt and parameters.\n\n```php\n$stream = $client->completions()->createStreamed([\n        'model' => 'gpt-3.5-turbo-instruct',\n        'prompt' => 'Hi',\n        'max_tokens' => 10,\n    ]);\n\nforeach($stream as $response){\n    $response->choices[0]->text;\n}\n\u002F\u002F 1. iteration => 'I'\n\u002F\u002F 2. iteration => ' am'\n\u002F\u002F 3. iteration => ' very'\n\u002F\u002F 4. iteration => ' excited'\n\u002F\u002F ...\n```\n\n\u003C\u002Fdetails>\n\n### `Assistants` Resource (deprecated)\n\n> [!WARNING]\n> OpenAI has deprecated the Assistants API and will stop working by August 26, 2026. https:\u002F\u002Fplatform.openai.com\u002Fdocs\u002Fguides\u002Fmigrate-to-responses#assistants-api\n\n\u003Cdetails>\n\u003Csummary>Assistants API Information\u003C\u002Fsummary>\n\n> **Note** - If you are creating the client manually from the factory. Make sure you provide the necessary header:\n> ```php\n> $factory->withHttpHeader('OpenAI-Beta', 'assistants=v2')\n> ```\n\n#### `create`\n\nCreate an assistant with a model and instructions.\n\n```php\n$response = $client->assistants()->create([\n    'instructions' => 'You are a personal math tutor. When asked a question, write and run Python code to answer the question.',\n    'name' => 'Math Tutor',\n    'tools' => [\n        [\n            'type' => 'code_interpreter',\n        ],\n    ],\n    'model' => 'gpt-4o',\n]);\n\n$response->id; \u002F\u002F 'asst_gxzBkD1wkKEloYqZ410pT5pd'\n$response->object; \u002F\u002F 'assistant'\n$response->createdAt; \u002F\u002F 1623936000\n$response->name; \u002F\u002F 'Math Tutor'\n$response->instructions; \u002F\u002F 'You are a personal math tutor. When asked a question, write and run Python code to answer the question.'\n$response->model; \u002F\u002F 'gpt-4o'\n$response->description; \u002F\u002F null\n$response->tools[0]->type; \u002F\u002F 'code_interpreter'\n$response->toolResources; \u002F\u002F []\n$response->metadata; \u002F\u002F []\n$response->temperature: \u002F\u002F null\n$response->topP: \u002F\u002F null\n$response->format: \u002F\u002F 'auto'\n\n$response->toArray(); \u002F\u002F ['id' => 'asst_gxzBkD1wkKEloYqZ410pT5pd', ...]\n```\n\n#### `retrieve`\n\nRetrieves an assistant.\n\n```php\n$response = $client->assistants()->retrieve('asst_gxzBkD1wkKEloYqZ410pT5pd');\n\n$response->id; \u002F\u002F 'asst_gxzBkD1wkKEloYqZ410pT5pd'\n$response->object; \u002F\u002F 'assistant'\n$response->createdAt; \u002F\u002F 1623936000\n$response->name; \u002F\u002F 'Math Tutor'\n$response->instructions; \u002F\u002F 'You are a personal math tutor. When asked a question, write and run Python code to answer the question.'\n$response->model; \u002F\u002F 'gpt-4o'\n$response->description; \u002F\u002F null\n$response->tools[0]->type; \u002F\u002F 'code_interpreter'\n$response->toolResources; \u002F\u002F []\n$response->metadata; \u002F\u002F []\n$response->temperature: \u002F\u002F null\n$response->topP: \u002F\u002F null\n$response->format: \u002F\u002F 'auto'\n\n$response->toArray(); \u002F\u002F ['id' => 'asst_gxzBkD1wkKEloYqZ410pT5pd', ...]\n```\n\n#### `modify`\n\nModifies an assistant.\n\n```php\n$response = $client->assistants()->modify('asst_gxzBkD1wkKEloYqZ410pT5pd', [\n        'name' => 'New Math Tutor',\n    ]);\n\n$response->id; \u002F\u002F 'asst_gxzBkD1wkKEloYqZ410pT5pd'\n$response->object; \u002F\u002F 'assistant'\n$response->createdAt; \u002F\u002F 1623936000\n$response->name; \u002F\u002F 'New Math Tutor'\n$response->instructions; \u002F\u002F 'You are a personal math tutor. When asked a question, write and run Python code to answer the question.'\n$response->model; \u002F\u002F 'gpt-4o'\n$response->description; \u002F\u002F null\n$response->tools[0]->type; \u002F\u002F 'code_interpreter'\n$response->toolResources; \u002F\u002F []\n$response->metadata; \u002F\u002F []\n$response->temperature: \u002F\u002F null\n$response->topP: \u002F\u002F null\n$response->format: \u002F\u002F 'auto'\n\n$response->toArray(); \u002F\u002F ['id' => 'asst_gxzBkD1wkKEloYqZ410pT5pd', ...]\n```\n\n#### `delete`\n\nDelete an assistant.\n\n```php\n$response = $client->assistants()->delete('asst_gxzBkD1wkKEloYqZ410pT5pd');\n\n$response->id; \u002F\u002F 'asst_gxzBkD1wkKEloYqZ410pT5pd'\n$response->object; \u002F\u002F 'assistant.deleted'\n$response->deleted; \u002F\u002F true\n\n$response->toArray(); \u002F\u002F ['id' => 'asst_gxzBkD1wkKEloYqZ410pT5pd', ...]\n```\n\n#### `list`\n\nReturns a list of assistants.\n\n```php\n$response = $client->assistants()->list([\n    'limit' => 10,\n]);\n\n$response->object; \u002F\u002F 'list'\n$response->firstId; \u002F\u002F 'asst_gxzBkD1wkKEloYqZ410pT5pd'\n$response->lastId; \u002F\u002F 'asst_reHHtAM0jKLDIxanM6gP6DaR'\n$response->hasMore; \u002F\u002F true\n\nforeach ($response->data as $result) {\n    $result->id; \u002F\u002F 'asst_gxzBkD1wkKEloYqZ410pT5pd'\n    \u002F\u002F ...\n}\n\n$response->toArray(); \u002F\u002F ['object' => 'list', ...]]\n```\n\n\u003C\u002Fdetails>\n\n### `Threads` Resource (deprecated)\n\n> [!WARNING]\n> OpenAI has deprecated the Assistants API and will stop working by August 26, 2026. https:\u002F\u002Fplatform.openai.com\u002Fdocs\u002Fguides\u002Fmigrate-to-responses#assistants-api\n\n\u003Cdetails>\n\u003Csummary>Threads API Information\u003C\u002Fsummary>\n\n#### `create`\n\nCreate a thread.\n\n```php\n$response = $client->threads()->create([]);\n\n$response->id; \u002F\u002F 'thread_tKFLqzRN9n7MnyKKvc1Q7868'\n$response->object; \u002F\u002F 'thread'\n$response->createdAt; \u002F\u002F 1623936000\n$response->toolResources; \u002F\u002F null\n$response->metadata; \u002F\u002F []\n\n$response->toArray(); \u002F\u002F ['id' => 'thread_tKFLqzRN9n7MnyKKvc1Q7868', ...]\n```\n\n#### `createAndRun`\n\nCreate a thread and run it in one request.\n\n```php\n$response = $client->threads()->createAndRun(\n    [\n        'assistant_id' => 'asst_gxzBkD1wkKEloYqZ410pT5pd',\n        'thread' => [\n            'messages' =>\n                [\n                    [\n                        'role' => 'user',\n                        'content' => 'Explain deep learning to a 5 year old.',\n                    ],\n                ],\n        ],\n    ],\n);\n\n$response->id; \u002F\u002F 'run_4RCYyYzX9m41WQicoJtUQAb8'\n$response->object; \u002F\u002F 'thread.run'\n$response->createdAt; \u002F\u002F 1623936000\n$response->assistantId; \u002F\u002F 'asst_gxzBkD1wkKEloYqZ410pT5pd'\n$response->threadId; \u002F\u002F 'thread_tKFLqzRN9n7MnyKKvc1Q7868'\n$response->status; \u002F\u002F 'queued'\n$response->requiredAction; \u002F\u002F null\n$response->lastError; \u002F\u002F null\n$response->startedAt; \u002F\u002F null\n$response->expiresAt; \u002F\u002F 1699622335\n$response->cancelledAt; \u002F\u002F null\n$response->failedAt; \u002F\u002F null\n$response->completedAt; \u002F\u002F null\n$response->incompleteDetails; \u002F\u002F null\n$response->lastError; \u002F\u002F null\n$response->model; \u002F\u002F 'gpt-4o'\n$response->instructions; \u002F\u002F null\n$response->tools; \u002F\u002F []\n$response->metadata; \u002F\u002F []\n$response->usage->total_tokens; \u002F\u002F 579\n$response->temperature; \u002F\u002F null\n$response->topP; \u002F\u002F null\n$response->maxPromptTokens; \u002F\u002F 1000\n$response->maxCompletionTokens; \u002F\u002F 1000\n$response->truncationStrategy->type; \u002F\u002F 'auto'\n$response->responseFormat; \u002F\u002F 'auto'\n$response->toolChoice; \u002F\u002F 'auto'\n\n$response->toArray(); \u002F\u002F ['id' => 'run_4RCYyYzX9m41WQicoJtUQAb8', ...]\n```\n\n#### `retrieve`\n\nRetrieves a thread.\n\n```php\n$response = $client->threads()->retrieve('thread_tKFLqzRN9n7MnyKKvc1Q7868');\n\n$response->id; \u002F\u002F 'thread_tKFLqzRN9n7MnyKKvc1Q7868'\n$response->object; \u002F\u002F 'thread'\n$response->createdAt; \u002F\u002F 1623936000\n$response->toolResources; \u002F\u002F null\n$response->metadata; \u002F\u002F []\n\n$response->toArray(); \u002F\u002F ['id' => 'thread_tKFLqzRN9n7MnyKKvc1Q7868', ...]\n```\n\n#### `modify`\n\nModifies a thread.\n\n```php\n$response = $client->threads()->modify('thread_tKFLqzRN9n7MnyKKvc1Q7868', [\n        'metadata' => [\n            'name' => 'My new thread name',\n        ],\n    ]);\n\n$response->id; \u002F\u002F 'thread_tKFLqzRN9n7MnyKKvc1Q7868'\n$response->object; \u002F\u002F 'thread'\n$response->createdAt; \u002F\u002F 1623936000\n$response->toolResources; \u002F\u002F null\n$response->metadata; \u002F\u002F ['name' => 'My new thread name']\n\n$response->toArray(); \u002F\u002F ['id' => 'thread_tKFLqzRN9n7MnyKKvc1Q7868', ...]\n```\n\n#### `delete`\n\nDelete a thread.\n\n```php\n$response = $client->threads()->delete('thread_tKFLqzRN9n7MnyKKvc1Q7868');\n\n$response->id; \u002F\u002F 'thread_tKFLqzRN9n7MnyKKvc1Q7868'\n$response->object; \u002F\u002F 'thread.deleted'\n$response->deleted; \u002F\u002F true\n\n$response->toArray(); \u002F\u002F ['id' => 'thread_tKFLqzRN9n7MnyKKvc1Q7868', ...]\n```\n\n\u003C\u002Fdetails>\n\n### `Thread Messages` Resource (deprecated)\n\n> [!WARNING]\n> OpenAI has deprecated the Assistants API and will stop working by August 26, 2026. https:\u002F\u002Fplatform.openai.com\u002Fdocs\u002Fguides\u002Fmigrate-to-responses#assistants-api\n\n\u003Cdetails>\n\u003Csummary>Thread Messages API Information\u003C\u002Fsummary>\n\n#### `create`\n\nCreate a message.\n\n```php\n$response = $client->threads()->messages()->create('thread_tKFLqzRN9n7MnyKKvc1Q7868', [\n    'role' => 'user',\n    'content' => 'What is the sum of 5 and 7?',\n]);\n\n$response->id; \u002F\u002F 'msg_SKYwvF3zcigxthfn6F4hnpdU'\n$response->object; \u002F\u002F 'thread.message'\n$response->createdAt; \u002F\u002F 1623936000\n$response->threadId; \u002F\u002F 'thread_tKFLqzRN9n7MnyKKvc1Q7868'\n$response->status; \u002F\u002F 'in_progress\n$response->incompleteDetails; \u002F\u002F null\n$response->completedAt; \u002F\u002F null\n$response->incompleteAt; \u002F\u002F null\n$response->role; \u002F\u002F 'user'\n$response->content[0]->type; \u002F\u002F 'text'\n$response->content[0]->text->value; \u002F\u002F 'What is the sum of 5 and 7?'\n$response->content[0]->text->annotations; \u002F\u002F []\n$response->assistantId; \u002F\u002F null\n$response->runId; \u002F\u002F null\n$response->attachments; \u002F\u002F []\n$response->metadata; \u002F\u002F []\n\n$response->toArray(); \u002F\u002F ['id' => 'msg_SKYwvF3zcigxthfn6F4hnpdU', ...]\n```\n\n#### `retrieve`\n\nRetrieve a message.\n\n```php\n$response = $client->threads()->messages()->retrieve(\n    threadId: 'thread_tKFLqzRN9n7MnyKKvc1Q7868',\n    messageId: 'msg_SKYwvF3zcigxthfn6F4hnpdU',\n);\n\n$response->id; \u002F\u002F 'msg_SKYwvF3zcigxthfn6F4hnpdU'\n$response->object; \u002F\u002F 'thread.message'\n$response->createdAt; \u002F\u002F 1623936000\n$response->threadId; \u002F\u002F 'thread_tKFLqzRN9n7MnyKKvc1Q7868'\n$response->status; \u002F\u002F 'in_progress\n$response->incompleteDetails; \u002F\u002F null\n$response->completedAt; \u002F\u002F null\n$response->incompleteAt; \u002F\u002F null\n$response->role; \u002F\u002F 'user'\n$response->content[0]->type; \u002F\u002F 'text'\n$response->content[0]->text->value; \u002F\u002F 'What is the sum of 5 and 7?'\n$response->content[0]->text->annotations; \u002F\u002F []\n$response->assistantId; \u002F\u002F null\n$response->runId; \u002F\u002F null\n$response->attachments; \u002F\u002F []\n$response->metadata; \u002F\u002F []\n\n$response->toArray(); \u002F\u002F ['id' => 'msg_SKYwvF3zcigxthfn6F4hnpdU', ...]\n```\n\n#### `modify`\n\nModifies a message.\n\n```php\n$response = $client->threads()->messages()->modify(\n    threadId: 'thread_tKFLqzRN9n7MnyKKvc1Q7868',\n    messageId: 'msg_SKYwvF3zcigxthfn6F4hnpdU',\n    parameters:  [\n        'metadata' => [\n            'name' => 'My new message name',\n        ],\n    ],\n);\n\n$response->id; \u002F\u002F 'msg_SKYwvF3zcigxthfn6F4hnpdU'\n$response->object; \u002F\u002F 'thread.message'\n$response->createdAt; \u002F\u002F 1623936000\n$response->threadId; \u002F\u002F 'thread_tKFLqzRN9n7MnyKKvc1Q7868'\n$response->status; \u002F\u002F 'in_progress\n$response->incompleteDetails; \u002F\u002F null\n$response->completedAt; \u002F\u002F null\n$response->incompleteAt; \u002F\u002F null\n$response->role; \u002F\u002F 'user'\n$response->content[0]->type; \u002F\u002F 'text'\n$response->content[0]->text->value; \u002F\u002F 'What is the sum of 5 and 7?'\n$response->content[0]->text->annotations; \u002F\u002F []\n$response->assistantId; \u002F\u002F null\n$response->runId; \u002F\u002F null\n$response->attachments; \u002F\u002F []\n$response->metadata; \u002F\u002F ['name' => 'My new message name']\n\n$response->toArray(); \u002F\u002F ['id' => 'msg_SKYwvF3zcigxthfn6F4hnpdU', ...]\n```\n\n#### `delete`\n\nDeletes a message.\n\n```php\n$response = $client->threads()->messages()->delete(\n    threadId: 'thread_tKFLqzRN9n7MnyKKvc1Q7868',\n    messageId: 'msg_SKYwvF3zcigxthfn6F4hnpdU'\n);\n\n$response->id; \u002F\u002F 'msg_SKYwvF3zcigxthfn6F4hnpdU'\n$response->object; \u002F\u002F 'thread.message.deleted'\n$response->deleted; \u002F\u002F true\n\n$response->toArray(); \u002F\u002F ['id' => 'msg_SKYwvF3zcigxthfn6F4hnpdU', ...]\n```\n\n#### `list`\n\nReturns a list of messages for a given thread.\n\n```php\n$response = $client->threads()->messages()->list('thread_tKFLqzRN9n7MnyKKvc1Q7868', [\n    'limit' => 10,\n]);\n\n$response->object; \u002F\u002F 'list'\n$response->firstId; \u002F\u002F 'msg_SKYwvF3zcigxthfn6F4hnpdU'\n$response->lastId; \u002F\u002F 'msg_SKYwvF3zcigxthfn6F4hnpdU'\n$response->hasMore; \u002F\u002F false\n\nforeach ($response->data as $result) {\n    $result->id; \u002F\u002F 'msg_SKYwvF3zcigxthfn6F4hnpdU'\n    \u002F\u002F ...\n}\n\n$response->toArray(); \u002F\u002F ['object' => 'list', ...]]\n```\n\n\u003C\u002Fdetails>\n\n### `Thread Runs` Resource (deprecated)\n\n> [!WARNING]\n> OpenAI has deprecated the Assistants API and will stop working by August 26, 2026. https:\u002F\u002Fplatform.openai.com\u002Fdocs\u002Fguides\u002Fmigrate-to-responses#assistants-api\n\n\u003Cdetails>\n\u003Csummary>Thread Runs API Information\u003C\u002Fsummary>\n\n#### `create`\n\nCreate a run.\n\n```php\n$response = $client->threads()->runs()->create(\n    threadId: 'thread_tKFLqzRN9n7MnyKKvc1Q7868', \n    parameters: [\n        'assistant_id' => 'asst_gxzBkD1wkKEloYqZ410pT5pd',\n    ],\n);\n\n$response->id; \u002F\u002F 'run_4RCYyYzX9m41WQicoJtUQAb8'\n$response->object; \u002F\u002F 'thread.run'\n$response->createdAt; \u002F\u002F 1623936000\n$response->assistantId; \u002F\u002F 'asst_gxzBkD1wkKEloYqZ410pT5pd'\n$response->threadId; \u002F\u002F 'thread_tKFLqzRN9n7MnyKKvc1Q7868'\n$response->status; \u002F\u002F 'queued'\n$response->startedAt; \u002F\u002F null\n$response->expiresAt; \u002F\u002F 1699622335\n$response->cancelledAt; \u002F\u002F null\n$response->failedAt; \u002F\u002F null\n$response->completedAt; \u002F\u002F null\n$response->incompleteDetails; \u002F\u002F null\n$response->lastError; \u002F\u002F null\n$response->model; \u002F\u002F 'gpt-4o'\n$response->instructions; \u002F\u002F null\n$response->tools; \u002F\u002F []\n$response->metadata; \u002F\u002F []\n$response->usage->total_tokens; \u002F\u002F 579\n$response->temperature; \u002F\u002F null\n$response->topP; \u002F\u002F null\n$response->maxPromptTokens; \u002F\u002F 1000\n$response->maxCompletionTokens; \u002F\u002F 1000\n$response->truncationStrategy->type; \u002F\u002F 'auto'\n$response->toolChoice; \u002F\u002F 'auto'\n$response->responseFormat; \u002F\u002F 'auto'\n\n$response->toArray(); \u002F\u002F ['id' => 'run_4RCYyYzX9m41WQicoJtUQAb8', ...]\n```\n\n#### `create streamed`\n\nCreates a streamed run.\n\n[OpenAI Assistant Events](https:\u002F\u002Fplatform.openai.com\u002Fdocs\u002Fapi-reference\u002Fassistants-streaming\u002Fevents)\n\n```php\n$stream = $client->threads()->runs()->createStreamed(\n    threadId: 'thread_tKFLqzRN9n7MnyKKvc1Q7868',\n    parameters: [\n        'assistant_id' => 'asst_gxzBkD1wkKEloYqZ410pT5pd',\n    ],\n);\n\nforeach($stream as $response){\n    $response->event \u002F\u002F 'thread.run.created' | 'thread.run.in_progress' | .....\n    $response->response \u002F\u002F ThreadResponse | ThreadRunResponse | ThreadRunStepResponse | ThreadRunStepDeltaResponse | ThreadMessageResponse | ThreadMessageDeltaResponse\n}\n\n\u002F\u002F ...\n```\n\n#### `create streamed with function calls`\n\nCreates a streamed run with function calls\n\n[OpenAI Assistant Events](https:\u002F\u002Fplatform.openai.com\u002Fdocs\u002Fapi-reference\u002Fassistants-streaming\u002Fevents)\n\n```php\n$stream = $client->threads()->runs()->createStreamed(\n    threadId: 'thread_tKFLqzRN9n7MnyKKvc1Q7868',\n    parameters: [\n        'assistant_id' => 'asst_gxzBkD1wkKEloYqZ410pT5pd',\n    ],\n);\n\n\ndo{\n    foreach($stream as $response){\n        $response->event \u002F\u002F 'thread.run.created' | 'thread.run.in_progress' | .....\n        $response->response \u002F\u002F ThreadResponse | ThreadRunResponse | ThreadRunStepResponse | ThreadRunStepDeltaResponse | ThreadMessageResponse | ThreadMessageDeltaResponse\n\n        switch($response->event){\n            case 'thread.run.created':\n            case 'thread.run.queued':\n            case 'thread.run.completed':\n            case 'thread.run.cancelling':\n                $run = $response->response;\n                break;\n            case 'thread.run.expired':\n            case 'thread.run.cancelled':\n            case 'thread.run.failed':\n                $run = $response->response;\n                break 3;\n            case 'thread.run.requires_action':\n                \u002F\u002F Overwrite the stream with the new stream started by submitting the tool outputs\n                $stream = $client->threads()->runs()->submitToolOutputsStreamed(\n                    threadId: $run->threadId,\n                    runId: $run->id,\n                    parameters: [\n                        'tool_outputs' => [\n                            [\n                                'tool_call_id' => 'call_KSg14X7kZF2WDzlPhpQ168Mj',\n                                'output' => '12',\n                            ]\n                        ],\n                    ]\n                );\n                break;\n        }\n    }\n} while ($run->status != \"completed\")\n\n\u002F\u002F ...\n```\n\n#### `retrieve`\n\nRetrieves a run.\n\n```php\n$response = $client->threads()->runs()->retrieve(\n    threadId: 'thread_tKFLqzRN9n7MnyKKvc1Q7868',\n    runId: 'run_4RCYyYzX9m41WQicoJtUQAb8',\n);\n\n$response->id; \u002F\u002F 'run_4RCYyYzX9m41WQicoJtUQAb8'\n$response->object; \u002F\u002F 'thread.run'\n$response->createdAt; \u002F\u002F 1623936000\n$response->assistantId; \u002F\u002F 'asst_gxzBkD1wkKEloYqZ410pT5pd'\n$response->threadId; \u002F\u002F 'thread_tKFLqzRN9n7MnyKKvc1Q7868'\n$response->status; \u002F\u002F 'queued'\n$response->startedAt; \u002F\u002F null\n$response->expiresAt; \u002F\u002F 1699622335\n$response->cancelledAt; \u002F\u002F null\n$response->failedAt; \u002F\u002F null\n$response->completedAt; \u002F\u002F null\n$response->incompleteDetails; \u002F\u002F null\n$response->lastError; \u002F\u002F null\n$response->model; \u002F\u002F 'gpt-4o'\n$response->instructions; \u002F\u002F null\n$response->tools; \u002F\u002F []\n$response->metadata; \u002F\u002F []\n$response->usage->promptTokens; \u002F\u002F 25,\n$response->usage->completionTokens; \u002F\u002F 32,\n$response->usage->totalTokens; \u002F\u002F 57\n$response->temperature; \u002F\u002F null\n$response->topP; \u002F\u002F null\n$response->maxPromptTokens; \u002F\u002F 1000\n$response->maxCompletionTokens; \u002F\u002F 1000\n$response->truncationStrategy->type; \u002F\u002F 'auto'\n$response->toolChoice; \u002F\u002F 'auto'\n$response->responseFormat; \u002F\u002F 'auto'\n\n$response->toArray(); \u002F\u002F ['id' => 'run_4RCYyYzX9m41WQicoJtUQAb8', ...]\n```\n\n#### `modify`\n\nModifies a run.\n\n```php\n$response = $client->threads()->runs()->modify(\n    threadId: 'thread_tKFLqzRN9n7MnyKKvc1Q7868',\n    runId: 'run_4RCYyYzX9m41WQicoJtUQAb8',\n    parameters:  [\n        'metadata' => [\n            'name' => 'My new run name',\n        ],\n    ],\n);\n\n$response->id; \u002F\u002F 'run_4RCYyYzX9m41WQicoJtUQAb8'\n$response->object; \u002F\u002F 'thread.run'\n$response->createdAt; \u002F\u002F 1623936000\n$response->assistantId; \u002F\u002F 'asst_gxzBkD1wkKEloYqZ410pT5pd'\n$response->threadId; \u002F\u002F 'thread_tKFLqzRN9n7MnyKKvc1Q7868'\n$response->status; \u002F\u002F 'queued'\n$response->startedAt; \u002F\u002F null\n$response->expiresAt; \u002F\u002F 1699622335\n$response->cancelledAt; \u002F\u002F null\n$response->failedAt; \u002F\u002F null\n$response->completedAt; \u002F\u002F null\n$response->incompleteDetails; \u002F\u002F null\n$response->lastError; \u002F\u002F null\n$response->model; \u002F\u002F 'gpt-4o'\n$response->instructions; \u002F\u002F null\n$response->tools; \u002F\u002F []\n$response->usage->total_tokens; \u002F\u002F 579\n$response->temperature; \u002F\u002F null\n$response->topP; \u002F\u002F null\n$response->maxPromptTokens; \u002F\u002F 1000\n$response->maxCompletionTokens; \u002F\u002F 1000\n$response->truncationStrategy->type; \u002F\u002F 'auto'\n$response->toolChoice; \u002F\u002F 'auto'\n$response->responseFormat; \u002F\u002F 'auto'\n$response->metadata; \u002F\u002F ['name' => 'My new run name']\n\n$response->toArray(); \u002F\u002F ['id' => 'run_4RCYyYzX9m41WQicoJtUQAb8', ...]\n```\n\n#### `cancel`\n\nCancels a run that is `in_progress`.\n\n```php\n$response = $client->threads()->runs()->cancel(\n    threadId: 'thread_tKFLqzRN9n7MnyKKvc1Q7868',\n    runId: 'run_4RCYyYzX9m41WQicoJtUQAb8',\n);\n\n$response->id; \u002F\u002F 'run_4RCYyYzX9m41WQicoJtUQAb8'\n$response->object; \u002F\u002F 'thread.run'\n$response->createdAt; \u002F\u002F 1623936000\n$response->assistantId; \u002F\u002F 'asst_gxzBkD1wkKEloYqZ410pT5pd'\n$response->threadId; \u002F\u002F 'thread_tKFLqzRN9n7MnyKKvc1Q7868'\n$response->status; \u002F\u002F 'cancelling'\n$response->startedAt; \u002F\u002F null\n$response->expiresAt; \u002F\u002F 1699622335\n$response->cancelledAt; \u002F\u002F null\n$response->failedAt; \u002F\u002F null\n$response->completedAt; \u002F\u002F null\n$response->incompleteDetails; \u002F\u002F null\n$response->lastError; \u002F\u002F null\n$response->model; \u002F\u002F 'gpt-4o'\n$response->instructions; \u002F\u002F null\n$response->tools; \u002F\u002F []\n$response->usage?->total_tokens; \u002F\u002F 579\n$response->temperature; \u002F\u002F null\n$response->topP; \u002F\u002F null\n$response->maxPromptTokens; \u002F\u002F 1000\n$response->maxCompletionTokens; \u002F\u002F 1000\n$response->truncationStrategy->type; \u002F\u002F 'auto'\n$response->toolChoice; \u002F\u002F 'auto'\n$response->responseFormat; \u002F\u002F 'auto'\n$response->metadata; \u002F\u002F []\n\n$response->toArray(); \u002F\u002F ['id' => 'run_4RCYyYzX9m41WQicoJtUQAb8', ...]\n```\n\n#### `submitToolOutputs`\n\nWhen a run has the status: `requires_action` and `required_action.type` is `submit_tool_outputs`, this endpoint can be used to submit the outputs from the tool calls once they're all completed. All outputs must be submitted in a single request.\n\n```php\n$response = $client->threads()->runs()->submitToolOutputs(\n    threadId: 'thread_tKFLqzRN9n7MnyKKvc1Q7868',\n    runId: 'run_4RCYyYzX9m41WQicoJtUQAb8',\n    parameters: [\n        'tool_outputs' => [\n            [\n                'tool_call_id' => 'call_KSg14X7kZF2WDzlPhpQ168Mj',\n                'output' => '12',\n            ],\n        ],\n    ]\n);\n\n$response->id; \u002F\u002F 'run_4RCYyYzX9m41WQicoJtUQAb8'\n$response->object; \u002F\u002F 'thread.run'\n$response->createdAt; \u002F\u002F 1623936000\n$response->assistantId; \u002F\u002F 'asst_gxzBkD1wkKEloYqZ410pT5pd'\n$response->threadId; \u002F\u002F 'thread_tKFLqzRN9n7MnyKKvc1Q7868'\n$response->status; \u002F\u002F 'in_progress'\n$response->startedAt; \u002F\u002F null\n$response->expiresAt; \u002F\u002F 1699622335\n$response->cancelledAt; \u002F\u002F null\n$response->failedAt; \u002F\u002F null\n$response->completedAt; \u002F\u002F null\n$response->incompleteDetails; \u002F\u002F null\n$response->lastError; \u002F\u002F null\n$response->model; \u002F\u002F 'gpt-4o'\n$response->instructions; \u002F\u002F null\n$response->usage->total_tokens; \u002F\u002F 579\n$response->temperature; \u002F\u002F null\n$response->topP; \u002F\u002F null\n$response->maxPromptTokens; \u002F\u002F 1000\n$response->maxCompletionTokens; \u002F\u002F 1000\n$response->truncationStrategy->type; \u002F\u002F 'auto'\n$response->responseFormat; \u002F\u002F 'auto'\n$response->tools[0]->type; \u002F\u002F 'function'\n$response->toolChoice; \u002F\u002F 'auto'\n$response->metadata; \u002F\u002F []\n\n$response->toArray(); \u002F\u002F ['id' => 'run_4RCYyYzX9m41WQicoJtUQAb8', ...]\n```\n\n#### `list`\n\nReturns a list of runs belonging to a thread.\n\n```php\n$response = $client->threads()->runs()->list(\n    threadId: 'thread_tKFLqzRN9n7MnyKKvc1Q7868',\n    parameters: [\n        'limit' => 10,\n    ],\n);\n\n$response->object; \u002F\u002F 'list'\n$response->firstId; \u002F\u002F 'run_4RCYyYzX9m41WQicoJtUQAb8'\n$response->lastId; \u002F\u002F 'run_4RCYyYzX9m41WQicoJtUQAb8'\n$response->hasMore; \u002F\u002F false\n\nforeach ($response->data as $result) {\n    $result->id; \u002F\u002F 'run_4RCYyYzX9m41WQicoJtUQAb8'\n    \u002F\u002F ...\n}\n\n$response->toArray(); \u002F\u002F ['object' => 'list', ...]]\n```\n\n\u003C\u002Fdetails>\n\n### `Thread Run Steps` Resource (deprecated)\n\n> [!WARNING]\n> OpenAI has deprecated the Assistants API and will stop working by August 26, 2026. https:\u002F\u002Fplatform.openai.com\u002Fdocs\u002Fguides\u002Fmigrate-to-responses#assistants-api\n\n\u003Cdetails>\n\u003Csummary>Thread Run Steps API Information\u003C\u002Fsummary>\n\n#### `retrieve`\n\nRetrieves a run step.\n\n```php\n$response = $client->threads()->runs()->steps()->retrieve(\n    threadId: 'thread_tKFLqzRN9n7MnyKKvc1Q7868',\n    runId: 'run_4RCYyYzX9m41WQicoJtUQAb8',\n    stepId: 'step_1spQXgbAabXFm1YXrwiGIMUz',\n);\n\n$response->id; \u002F\u002F 'step_1spQXgbAabXFm1YXrwiGIMUz'\n$response->object; \u002F\u002F 'thread.run.step'\n$response->createdAt; \u002F\u002F 1699564106\n$response->runId; \u002F\u002F 'run_4RCYyYzX9m41WQicoJtUQAb8'\n$response->assistantId; \u002F\u002F 'asst_gxzBkD1wkKEloYqZ410pT5pd'\n$response->threadId; \u002F\u002F 'thread_tKFLqzRN9n7MnyKKvc1Q7868'\n$response->type; \u002F\u002F 'message_creation'\n$response->status; \u002F\u002F 'completed'\n$response->cancelledAt; \u002F\u002F null\n$response->completedAt; \u002F\u002F 1699564119\n$response->expiresAt; \u002F\u002F null\n$response->failedAt; \u002F\u002F null\n$response->lastError; \u002F\u002F null\n$response->stepDetails->type; \u002F\u002F 'message_creation'\n$response->stepDetails->messageCreation->messageId; \u002F\u002F 'msg_i404PxKbB92d0JAmdOIcX7vA'\n\n$response->toArray(); \u002F\u002F ['id' => 'step_1spQXgbAabXFm1YXrwiGIMUz', ...]\n```\n\n#### `list`\n\nReturns a list of run steps belonging to a run.\n\n```php\n$response = $client->threads()->runs()->steps()->list(\n    threadId: 'thread_tKFLqzRN9n7MnyKKvc1Q7868',\n    runId: 'run_4RCYyYzX9m41WQicoJtUQAb8',\n    parameters: [\n        'limit' => 10,\n    ],\n);\n\n$response->object; \u002F\u002F 'list'\n$response->firstId; \u002F\u002F 'step_1spQXgbAabXFm1YXrwiGIMUz'\n$response->lastId; \u002F\u002F 'step_1spQXgbAabXFm1YXrwiGIMUz'\n$response->hasMore; \u002F\u002F false\n\nforeach ($response->data as $result) {\n    $result->id; \u002F\u002F 'step_1spQXgbAabXFm1YXrwiGIMUz'\n    \u002F\u002F ...\n}\n\n$response->toArray(); \u002F\u002F ['object' => 'list', ...]]\n```\n\n\u003C\u002Fdetails>\n\n### `Edits` Resource (deprecated)\n\n> [!WARNING]\n> OpenAI has deprecated the Edits API and will stop working by January 4, 2024. https:\u002F\u002Fopenai.com\u002Fblog\u002Fgpt-4-api-general-availability#deprecation-of-the-edits-api\n\n\u003Cdetails>\n\u003Csummary>Edits API Information\u003C\u002Fsummary>\n\n#### `create`\n\nCreates a new edit for the provided input, instruction, and parameters.\n\n```php\n$response = $client->edits()->create([\n    'model' => 'text-davinci-edit-001',\n    'input' => 'What day of the wek is it?',\n    'instruction' => 'Fix the spelling mistakes',\n]);\n\n$response->object; \u002F\u002F 'edit'\n$response->created; \u002F\u002F 1589478378\n\nforeach ($response->choices as $choice) {\n    $choice->text; \u002F\u002F 'What day of the week is it?'\n    $choice->index; \u002F\u002F 0\n}\n\n$response->usage->promptTokens; \u002F\u002F 25,\n$response->usage->completionTokens; \u002F\u002F 32,\n$response->usage->totalTokens; \u002F\u002F 57\n\n$response->toArray(); \u002F\u002F ['object' => 'edit', ...]\n```\n\n\u003C\u002Fdetails>\n\n### `FineTunes` Resource (deprecated)\n\n> [!WARNING]\n> OpenAI has deprecated the FineTunes API and will stop working by January 4, 2024 https:\u002F\u002Fplatform.openai.com\u002Fdocs\u002Fdeprecations#2023-08-22-fine-tunes-endpoint\n\n\u003Cdetails>\n\u003Csummary>FineTunes API Information\u003C\u002Fsummary>\n\n#### `create`\n\nCreates a job that fine-tunes a specified model from a given dataset.\n\n```php\n$response = $client->fineTunes()->create([\n    'training_file' => 'file-ajSREls59WBbvgSzJSVWxMCB',\n    'validation_file' => 'file-XjSREls59WBbvgSzJSVWxMCa',\n    'model' => 'curie',\n    'n_epochs' => 4,\n    'batch_size' => null,\n    'learning_rate_multiplier' => null,\n    'prompt_loss_weight' => 0.01,\n    'compute_classification_metrics' => false,\n    'classification_n_classes' => null,\n    'classification_positive_class' => null,\n    'classification_betas' => [],\n    'suffix' => null,\n]);\n\n$response->id; \u002F\u002F 'ft-AF1WoRqd3aJAHsqc9NY7iL8F'\n$response->object; \u002F\u002F 'fine-tune'\n\u002F\u002F ...\n\n$response->toArray(); \u002F\u002F ['id' => 'ft-AF1WoRqd3aJAHsqc9NY7iL8F', ...]\n```\n\n#### `list`\n\nList your organization's fine-tuning jobs.\n\n```php\n$response = $client->fineTunes()->list();\n\n$response->object; \u002F\u002F 'list'\n\nforeach ($response->data as $result) {\n    $result->id; \u002F\u002F 'ft-AF1WoRqd3aJAHsqc9NY7iL8F'\n    $result->object; \u002F\u002F 'fine-tune'\n    \u002F\u002F ...\n}\n\n$response->toArray(); \u002F\u002F ['object' => 'list', 'data' => [...]]\n```\n\n#### `retrieve`\n\nGets info about the fine-tune job.\n\n```php\n$response = $client->fineTunes()->retrieve('ft-AF1WoRqd3aJAHsqc9NY7iL8F');\n\n$response->id; \u002F\u002F 'ft-AF1WoRqd3aJAHsqc9NY7iL8F'\n$response->object; \u002F\u002F 'fine-tune'\n$response->model; \u002F\u002F 'curie'\n$response->createdAt; \u002F\u002F 1614807352\n$response->fineTunedModel; \u002F\u002F 'curie => ft-acmeco-2021-03-03-21-44-20'\n$response->organizationId; \u002F\u002F 'org-jwe45798ASN82s'\n$response->resultFiles; \u002F\u002F [\n$response->status; \u002F\u002F 'succeeded'\n$response->validationFiles; \u002F\u002F [\n$response->trainingFiles; \u002F\u002F [\n$response->updatedAt; \u002F\u002F 1614807865\n\nforeach ($response->events as $result) {\n    $result->object; \u002F\u002F 'fine-tune-event' \n    $result->createdAt; \u002F\u002F 1614807352\n    $result->level; \u002F\u002F 'info'\n    $result->message; \u002F\u002F 'Job enqueued. Waiting for jobs ahead to complete. Queue number =>  0.'\n}\n\n$response->hyperparams->batchSize; \u002F\u002F 4 \n$response->hyperparams->learningRateMultiplier; \u002F\u002F 0.1 \n$response->hyperparams->nEpochs; \u002F\u002F 4 \n$response->hyperparams->promptLossWeight; \u002F\u002F 0.1\n\nforeach ($response->resultFiles as $result) {\n    $result->id; \u002F\u002F 'file-XjGxS3KTG0uNmNOK362iJua3'\n    $result->object; \u002F\u002F 'file'\n    $result->bytes; \u002F\u002F 140\n    $result->createdAt; \u002F\u002F 1613779657\n    $result->filename; \u002F\u002F 'mydata.jsonl'\n    $result->purpose; \u002F\u002F 'fine-tune'\n    $result->status; \u002F\u002F 'succeeded'\n    $result->status_details; \u002F\u002F null\n}\n\nforeach ($response->validationFiles as $result) {\n    $result->id; \u002F\u002F 'file-XjGxS3KTG0uNmNOK362iJua3'\n    \u002F\u002F ...\n}\n\nforeach ($response->trainingFiles as $result) {\n    $result->id; \u002F\u002F 'file-XjGxS3KTG0uNmNOK362iJua3'\n    \u002F\u002F ...\n}\n\n$response->toArray(); \u002F\u002F ['id' => 'ft-AF1WoRqd3aJAHsqc9NY7iL8F', ...]\n```\n\n#### `cancel`\n\nImmediately cancel a fine-tune job.\n\n```php\n$response = $client->fineTunes()->cancel('ft-AF1WoRqd3aJAHsqc9NY7iL8F');\n\n$response->id; \u002F\u002F 'ft-AF1WoRqd3aJAHsqc9NY7iL8F'\n$response->object; \u002F\u002F 'fine-tune'\n\u002F\u002F ...\n$response->status; \u002F\u002F 'cancelled'\n\u002F\u002F ...\n\n$response->toArray(); \u002F\u002F ['id' => 'ft-AF1WoRqd3aJAHsqc9NY7iL8F', ...]\n```\n\n#### `list events`\n\nGet fine-grained status updates for a fine-tune job.\n\n```php\n$response = $client->fineTunes()->listEvents('ft-AF1WoRqd3aJAHsqc9NY7iL8F');\n\n$response->object; \u002F\u002F 'list'\n\nforeach ($response->data as $result) {\n    $result->object; \u002F\u002F 'fine-tune-event' \n    $result->createdAt; \u002F\u002F 1614807352\n    \u002F\u002F ...\n}\n\n$response->toArray(); \u002F\u002F ['object' => 'list', 'data' => [...]]\n```\n\n#### `list events streamed`\n\nGet streamed fine-grained status updates for a fine-tune job.\n\n```php\n$stream = $client->fineTunes()->listEventsStreamed('ft-y3OpNlc8B5qBVGCCVsLZsDST');\n\nforeach($stream as $response){\n    $response->message;\n}\n\u002F\u002F 1. iteration => 'Created fine-tune: ft-y3OpNlc8B5qBVGCCVsLZsDST'\n\u002F\u002F 2. iteration => 'Fine-tune costs $0.00'\n\u002F\u002F ...\n\u002F\u002F xx. iteration => 'Uploaded result file: file-ajLKUCMsFPrT633zqwr0eI4l'\n\u002F\u002F xx. iteration => 'Fine-tune succeeded'\n```\n\n\u003C\u002Fdetails>\n\n## Meta Information\n\nOn all response objects you can access the meta information returned by the API via the `meta()` method.\n\n```php\n$response = $client->completions()->create([\n    'model' => 'gpt-3.5-turbo-instruct',\n    'prompt' => 'Say this is a test',\n]);\n\n$meta = $response->meta();\n\n$meta->requestId; \u002F\u002F '574a03e2faaf4e9fd703958e4ddc66f5'\n\n$meta->openai->model; \u002F\u002F 'gpt-3.5-turbo-instruct'\n$meta->openai->organization; \u002F\u002F 'org-jwe45798ASN82s'\n$meta->openai->version; \u002F\u002F '2020-10-01'\n$meta->openai->processingMs; \u002F\u002F 425\n\n$meta->requestLimit->limit; \u002F\u002F 3000\n$meta->requestLimit->remaining; \u002F\u002F 2999\n$meta->requestLimit->reset; \u002F\u002F '20ms'\n\n$meta->tokenLimit->limit; \u002F\u002F 250000\n$meta->tokenLimit->remaining; \u002F\u002F 249984\n$meta->tokenLimit->reset; \u002F\u002F '3ms'\n```\n\nThe `toArray()` method returns the meta information in the form originally returned by the API.\n\n```php\n$meta->toArray();\n\n\u002F\u002F [ \n\u002F\u002F   'x-request-id' => '574a03e2faaf4e9fd703958e4ddc66f5',\n\u002F\u002F   'openai-model' => 'gpt-3.5-turbo-instruct',\n\u002F\u002F   'openai-organization' => 'org-jwe45798ASN82s',\n\u002F\u002F   'openai-processing-ms' => 402,\n\u002F\u002F   'openai-version' => '2020-10-01',\n\u002F\u002F   'x-ratelimit-limit-requests' => 3000,\n\u002F\u002F   'x-ratelimit-remaining-requests' => 2999,\n\u002F\u002F   'x-ratelimit-reset-requests' => '20ms',\n\u002F\u002F   'x-ratelimit-limit-tokens' => 250000,\n\u002F\u002F   'x-ratelimit-remaining-tokens' => 249983,\n\u002F\u002F   'x-ratelimit-reset-tokens' => '3ms',\n\u002F\u002F ]\n```\n\nOn streaming responses you can access the meta information on the reponse stream object.\n\n```php\n$stream = $client->completions()->createStreamed([\n    'model' => 'gpt-3.5-turbo-instruct',\n    'prompt' => 'Say this is a test',\n]);\n    \n$stream->meta(); \n```\n\nFor further details about the rates limits and what to do if you hit them visit the [OpenAI documentation](https:\u002F\u002Fplatform.openai.com\u002Fdocs\u002Fguides\u002Frate-limits\u002Frate-limits).\n\n## Troubleshooting\n\n### Timeout\n\nYou may run into a timeout when sending requests to the API. The default timeout depends on the HTTP client used.\n\nYou can increase the timeout by configuring the HTTP client and passing in to the factory.\n\nThis example illustrates how to increase the timeout using Guzzle.\n```php\nOpenAI::factory()\n    ->withApiKey($apiKey)\n    ->withOrganization($organization)\n    ->withHttpClient(new \\GuzzleHttp\\Client(['timeout' => $timeout]))\n    ->make();\n```\n\n## Testing\n\nThe package provides a fake implementation of the `OpenAI\\Client` class that allows you to fake the API responses.\n\nTo test your code ensure you swap the `OpenAI\\Client` class with the `OpenAI\\Testing\\ClientFake` class in your test case.\n\nThe fake responses are returned in the order they are provided while creating the fake client.\n\nAll responses are having a `fake()` method that allows you to easily create a response object by only providing the parameters relevant for your test case.\n\n```php\nuse OpenAI\\Testing\\ClientFake;\nuse OpenAI\\Responses\\Completions\\CreateResponse;\n\n$client = new ClientFake([\n    CreateResponse::fake([\n        'choices' => [\n            [\n                'text' => 'awesome!',\n            ],\n        ],\n    ]),\n]);\n\n$completion = $client->completions()->create([\n    'model' => 'gpt-3.5-turbo-instruct',\n    'prompt' => 'PHP is ',\n]);\n\nexpect($completion['choices'][0]['text'])->toBe('awesome!');\n```\n\nIn case of a streamed response you can optionally provide a resource holding the fake response data.\n\n```php\nuse OpenAI\\Testing\\ClientFake;\nuse OpenAI\\Responses\\Chat\\CreateStreamedResponse;\n\n$client = new ClientFake([\n    CreateStreamedResponse::fake(fopen('file.txt', 'r'))\n]);\n\n$completion = $client->chat()->createStreamed([\n    'model' => 'gpt-3.5-turbo',\n    'messages' => [\n        ['role' => 'user', 'content' => 'Hello!'],\n    ],\n]);\n\nexpect($response->getIterator()->current())\n    ->id->toBe('chatcmpl-6yo21W6LVo8Tw2yBf7aGf2g17IeIl');\n```\n\nAfter the requests have been sent there are various methods to ensure that the expected requests were sent:\n\n```php\n\u002F\u002F assert completion create request was sent\n$client->assertSent(Completions::class, function (string $method, array $parameters): bool {\n    return $method === 'create' &&\n        $parameters['model'] === 'gpt-3.5-turbo-instruct' &&\n        $parameters['prompt'] === 'PHP is ';\n});\n\u002F\u002F or\n$client->completions()->assertSent(function (string $method, array $parameters): bool {\n    \u002F\u002F ...\n});\n\n\u002F\u002F assert 2 completion create requests were sent\n$client->assertSent(Completions::class, 2);\n\n\u002F\u002F assert no completion create requests were sent\n$client->assertNotSent(Completions::class);\n\u002F\u002F or\n$client->completions()->assertNotSent();\n\n\u002F\u002F assert no requests were sent\n$client->assertNothingSent();\n```\n\nTo write tests expecting the API request to fail you can provide a `Throwable` object as the response.\n\n```php\n$client = new ClientFake([\n    new \\OpenAI\\Exceptions\\ErrorException([\n        'message' => 'The model `gpt-1` does not exist',\n        'type' => 'invalid_request_error',\n        'code' => null,\n    ], 404)\n]);\n\n\u002F\u002F the `ErrorException` will be thrown\n$completion = $client->completions()->create([\n    'model' => 'gpt-3.5-turbo-instruct',\n    'prompt' => 'PHP is ',\n]);\n```\n\n## Webhooks\n\nThe package includes a signature verifier for OpenAI webhooks. To verify the signature of incoming webhook requests, you can use the `OpenAI\\Webhooks\\SignatureVerifier` class.\n\n```php\nuse OpenAI\\Webhooks\\SignatureVerifier;\nuse OpenAI\\Exceptions\\WebhookVerificationException;\n\n$verifier = new SignatureVerifier('whsec_{your-webhook-signing-secret}');\n\ntry {\n    $verifier->verify($incomingRequest);\n    \n    \u002F\u002F The request is verified\n} catch (WebhookVerificationException $exception) {\n    \u002F\u002F The request could not be verified\n}\n```\n\n## Services\n\n### Azure\n\nIn order to use the Azure OpenAI Service, it is necessary to construct the client manually using the factory.\n\n```php\n$client = OpenAI::factory()\n    ->withBaseUri('{your-resource-name}.openai.azure.com\u002Fopenai\u002Fdeployments\u002F{deployment-id}')\n    ->withHttpHeader('api-key', '{your-api-key}')\n    ->withQueryParam('api-version', '{version}')\n    ->make();\n```\n\nTo use Azure, you must deploy a model, identified by the {deployment-id}, which is already incorporated into the API calls. As a result, you do not have to provide the model during the calls since it is included in the `BaseUri`.\n\nTherefore, a basic sample completion call would be:\n\n```php\n$result = $client->completions()->create([\n    'prompt' => 'PHP is'\n]);\n``` \n\n---\n\nOpenAI PHP is an open-sourced software licensed under the **[MIT license](https:\u002F\u002Fopensource.org\u002Flicenses\u002FMIT)**.\n","\u003Cp align=\"center\">\n    \u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fopenai-php_client_readme_52f417981e92.png\" width=\"600\" alt=\"OpenAI PHP\">\n    \u003Cp align=\"center\">\n        \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Factions\">\u003Cimg alt=\"GitHub 工作流状态（main 分支）\" src=\"https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Factions\u002Fworkflow\u002Fstatus\u002Fopenai-php\u002Fclient\u002Ftests.yml?branch=main&label=tests&style=round-square\">\u003C\u002Fa>\n        \u003Ca href=\"https:\u002F\u002Fpackagist.org\u002Fpackages\u002Fopenai-php\u002Fclient\">\u003Cimg alt=\"总下载量\" src=\"https:\u002F\u002Fimg.shields.io\u002Fpackagist\u002Fdt\u002Fopenai-php\u002Fclient\">\u003C\u002Fa>\n        \u003Ca href=\"https:\u002F\u002Fpackagist.org\u002Fpackages\u002Fopenai-php\u002Fclient\">\u003Cimg alt=\"最新版本\" src=\"https:\u002F\u002Fimg.shields.io\u002Fpackagist\u002Fv\u002Fopenai-php\u002Fclient\">\u003C\u002Fa>\n        \u003Ca href=\"https:\u002F\u002Fpackagist.org\u002Fpackages\u002Fopenai-php\u002Fclient\">\u003Cimg alt=\"许可证\" src=\"https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Flicense\u002Fopenai-php\u002Fclient\">\u003C\u002Fa>\n    \u003C\u002Fp>\n\u003C\u002Fp>\n\n------\n**OpenAI PHP** 是一个由社区维护的 PHP API 客户端，使您能够与 [Open AI API](https:\u002F\u002Fplatform.openai.com\u002Fdocs\u002Fapi-reference\u002Fintroduction) 进行交互。\n\n- 关注开发者 Nuno Maduro：\n    - YouTube：**[youtube.com\u002F@nunomaduro](https:\u002F\u002Fwww.youtube.com\u002F@nunomaduro)** — 每工作日发布视频\n    - Twitch：**[twitch.tv\u002Fenunomaduro](https:\u002F\u002Fwww.twitch.tv\u002Fenunomaduro)** — （几乎）每工作日直播\n    - Twitter \u002F X：**[x.com\u002Fenunomaduro](https:\u002F\u002Fx.com\u002Fenunomaduro)**\n    - LinkedIn：**[linkedin.com\u002Fin\u002Fnunomaduro](https:\u002F\u002Fwww.linkedin.com\u002Fin\u002Fnunomaduro)**\n    - Instagram：**[instagram.com\u002Fenunomaduro](https:\u002F\u002Fwww.instagram.com\u002Fenunomaduro)**\n    - TikTok：**[tiktok.com\u002F@enunomaduro](https:\u002F\u002Fwww.tiktok.com\u002F@enunomaduro)**\n\n如果您或您的企业依赖此软件包，支持那些投入时间和精力来创建和维护这一宝贵工具的开发者非常重要：\n\n- Nuno Maduro：**[github.com\u002Fsponsors\u002Fnunomaduro](https:\u002F\u002Fgithub.com\u002Fsponsors\u002Fnunomaduro)**\n- Sandro Gehri：**[github.com\u002Fsponsors\u002Fgehrisandro](https:\u002F\u002Fgithub.com\u002Fsponsors\u002Fgehrisandro)**\n- Connor Tumbleson：**[github.com\u002Fsponsors\u002FiBotPeaches](https:\u002F\u002Fgithub.com\u002Fsponsors\u002FiBotPeaches)**\n\n## 目录\n- [快速入门](#get-started)\n- [使用方法](#usage)\n  - [模型资源](#models-resource)\n  - [响应资源](#responses-resource)\n  - [对话资源](#conversations-resource)\n  - [对话项资源](#conversations-items-resource)\n  - [容器资源](#containers-resource)\n  - [容器文件资源](#containers-files-resource)\n  - [聊天资源](#chat-resource)\n  - [音频资源](#audio-resource)\n  - [嵌入资源](#embeddings-resource)\n  - [文件资源](#files-resource)\n  - [微调资源](#finetuning-resource)\n  - [内容审核资源](#moderations-resource)\n  - [图像资源](#images-resource)\n  - [向量存储资源](#vector-stores-resource)\n  - [向量存储文件资源](#vector-store-files-resource)\n  - [向量存储文件批次资源](#vector-store-file-batches-resource)\n  - [批次资源](#batches-resource)\n  - [实时临时密钥](#realtime-ephemeral-keys)\n  - [补全资源（旧版）](#completions-resource-legacy)\n  - [助手资源（已弃用）](#assistants-resource-deprecated)\n  - [线程资源（已弃用）](#threads-resource-deprecated)\n  - [线程消息资源（已弃用）](#thread-messages-resource-deprecated)\n  - [线程运行资源（已弃用）](#thread-runs-resource-deprecated)\n  - [线程运行步骤资源（已弃用）](#thread-run-steps-resource-deprecated)\n  - [微调资源（已弃用）](#finetunes-resource-deprecated)\n  - [编辑资源（已弃用）](#edits-resource-deprecated)\n- [元信息](#meta-information)\n- [故障排除](#troubleshooting)\n- [测试](#testing)\n- [Webhook][#webhooks]\n- [服务](#services)\n  - [Azure](#azure)\n\n## 快速入门\n\n> **需要 [PHP 8.2+](https:\u002F\u002Fwww.php.net\u002Freleases\u002F)**\n\n首先，通过 [Composer](https:\u002F\u002Fgetcomposer.org\u002F) 包管理器安装 OpenAI：\n\n```bash\ncomposer require openai-php\u002Fclient\n```\n\n确保允许 `php-http\u002Fdiscovery` Composer 插件运行，或者如果您的项目尚未集成 PSR-18 客户端，则手动安装一个客户端。\n```bash\ncomposer require guzzlehttp\u002Fguzzle\n```\n\n然后，即可与 OpenAI 的 API 进行交互：\n\n```php\n$yourApiKey = getenv('YOUR_API_KEY');\n$client = OpenAI::client($yourApiKey);\n\n$response = $client->responses()->create([\n    'model' => 'gpt-4o',\n    'input' => 'Hello!',\n]);\n\necho $response->outputText; \u002F\u002F Hello! How can I assist you today?\n```\n\n如有必要，也可以配置并创建一个单独的客户端。\n\n```php\n$yourApiKey = getenv('YOUR_API_KEY');\n\n$client = OpenAI::factory()\n    ->withApiKey($yourApiKey)\n    ->withOrganization('your-organization') \u002F\u002F 默认：null\n    ->withProject('Your Project') \u002F\u002F 默认：null\n    ->withBaseUri('openai.example.com\u002Fv1') \u002F\u002F 默认：api.openai.com\u002Fv1\n    ->withHttpClient($httpClient = new \\GuzzleHttp\\Client([])) \u002F\u002F 默认：使用 PSR-18 HTTP 客户端发现找到的 HTTP 客户端\n    ->withHttpHeader('X-My-Header', 'foo')\n    ->withQueryParam('my-param', 'bar')\n    ->withStreamHandler(fn (RequestInterface $request): ResponseInterface => $httpClient->send($request, [\n        'stream' => true \u002F\u002F 允许为 HTTP 客户端提供自定义的流处理程序。\n    ]))\n    ->make();\n```\n\n## 使用方法\n\n### `Models` 资源\n\n#### `list`\n\n列出当前可用的模型，并提供每个模型的基本信息，例如所有者和可用性。\n\n```php\n$response = $client->models()->list();\n\n$response->object; \u002F\u002F 'list'\n\nforeach ($response->data as $result) {\n    $result->id; \u002F\u002F 'gpt-3.5-turbo-instruct'\n    $result->object; \u002F\u002F 'model'\n    \u002F\u002F ...\n}\n\n$response->toArray(); \u002F\u002F ['object' => 'list', 'data' => [...]]\n```\n\n#### `retrieve`\n\n检索某个模型实例，提供该模型的基本信息，如所有者和权限设置。\n\n```php\n$response = $client->models()->retrieve('gpt-3.5-turbo-instruct');\n\n$response->id; \u002F\u002F 'gpt-3.5-turbo-instruct'\n$response->object; \u002F\u002F 'model'\n$response->created; \u002F\u002F 1642018370\n$response->ownedBy; \u002F\u002F 'openai'\n\n$response->toArray(); \u002F\u002F ['id' => 'gpt-3.5-turbo-instruct', ...]\n```\n\n#### `delete`\n\n删除一个经过微调的模型。\n\n```php\n$response = $client->models()->delete('curie:ft-acmeco-2021-03-03-21-44-20');\n\n$response->id; \u002F\u002F 'curie:ft-acmeco-2021-03-03-21-44-20'\n$response->object; \u002F\u002F 'model'\n$response->deleted; \u002F\u002F true\n\n$response->toArray(); \u002F\u002F ['id' => 'curie:ft-acmeco-2021-03-03-21-44-20', ...]\n```\n\n### `Responses` 资源\n\n#### `create`\n\n创建一个模型响应。提供文本或图像输入以生成文本或 JSON 输出。让模型调用您自己的自定义代码，或使用内置工具（如网络搜索或文件搜索）来将您自己的数据作为模型响应的输入。\n\n```php\n$response = $client->responses()->create([\n    'model' => 'gpt-4o-mini',\n    'tools' => [\n        [\n            'type' => 'web_search_preview'\n        ]\n    ],\n    'input' => \"今天有什么积极的新闻吗？\",\n    'temperature' => 0.7,\n    'max_output_tokens' => 150,\n    'tool_choice' => 'auto',\n    'parallel_tool_calls' => true,\n    'store' => true,\n    'metadata' => [\n        'user_id' => '123',\n        'session_id' => 'abc456'\n    ]\n]);\n\n$response->id; \u002F\u002F 'resp_67ccd2bed1ec8190b14f964abc054267'\n$response->object; \u002F\u002F 'response'\n$response->createdAt; \u002F\u002F 1741476542\n$response->status; \u002F\u002F 'completed'\n$response->model; \u002F\u002F 'gpt-4o-mini'\n$response->outputText; \u002F\u002F '任何 `output_text` 内容的合并响应文本。'\n\nforeach ($response->output as $output) {\n    $output->type; \u002F\u002F 'message'\n    $output->id; \u002F\u002F 'msg_67ccd2bf17f0819081ff3bb2cf6508e6'\n    $output->status; \u002F\u002F 'completed'\n    $output->role; \u002F\u002F 'assistant'\n    \n    foreach ($output->content as $content) {\n        $content->type; \u002F\u002F 'output_text'\n        $content->text; \u002F\u002F 响应文本\n        $content->annotations; \u002F\u002F 响应中的任何注释\n    }\n}\n\n$response->usage->inputTokens; \u002F\u002F 36\n$response->usage->outputTokens; \u002F\u002F 87\n$response->usage->totalTokens; \u002F\u002F 123\n\n$response->toArray(); \u002F\u002F ['id' => 'resp_67ccd2bed1ec8190b14f964abc054267', ...]\n```\n\n使用函数工具创建一个模型响应。\n\n```php\n$response = $client->responses()->create([\n    'model' => 'gpt-4o-mini',\n    'tools' => [\n        [\n            'type' => 'function',\n            'name' => 'get_temperature',\n            'description' => '获取给定位置的当前温度',\n            'parameters' => [\n                'type' => 'object',\n                'properties' => [\n                    'location' => [\n                        'type' => 'string',\n                        'description' => '城市和州，例如旧金山，加州',\n                    ],\n                    'unit' => [\n                        'type' => 'string',\n                        'enum' => ['摄氏度', '华氏度'],\n                    ],\n                ],\n                'required' => ['location'],\n            ],\n        ]\n    ],\n    'input' => \"巴西北里奥格兰德州的温度是多少？\",\n]);\n\nforeach ($response->output as $item) {\n    if ($item->type === 'function_call') {\n        $name = $item->name ?? null;\n        $args = json_decode($item->arguments ?? '{}', true) ?: [];\n\n        if ($name === 'get_temperature') {\n            \u002F\u002F ✅ 在这里使用提取的参数调用您的自定义函数\n            \u002F\u002F 示例：\n            \u002F\u002F $temperature = get_temperature($args['location'], $args['unit'] ?? '摄氏度');\n            \u002F\u002F 然后，如果需要，将结果发送回模型。\n        }\n    }\n}\n```\n\n#### `create streamed`\n\n当您将 `stream` 设置为 `true` 来创建响应时，服务器会在生成响应的过程中向客户端发出服务器发送事件。所有事件及其有效载荷都可以在 [OpenAI 文档](https:\u002F\u002Fplatform.openai.com\u002Fdocs\u002Fapi-reference\u002Fresponses-streaming) 中找到。\n\n```php\n$stream = $client->responses()->createStreamed([\n    'model' => 'gpt-4o-mini',\n    'tools' => [\n        [\n            'type' => 'web_search_preview'\n        ]\n    ],\n    'input' => \"今天有什么积极的新闻吗？\",\n]);\n\nforeach ($stream as $response) {\n    $response->event; \u002F\u002F 'response.created'\n}\n```\n\n#### `retrieve`\n\n根据给定的 ID 检索一个模型响应。\n\n```php\n$response = $client->responses()->retrieve('resp_67ccd2bed1ec8190b14f964abc054267');\n\n$response->id; \u002F\u002F 'resp_67ccd2bed1ec8190b14f964abc054267'\n$response->object; \u002F\u002F 'response'\n$response->createdAt; \u002F\u002F 1741476542\n$response->status; \u002F\u002F 'completed'\n$response->error; \u002F\u002F null\n$response->incompleteDetails; \u002F\u002F null\n$response->instructions; \u002F\u002F null\n$response->maxOutputTokens; \u002F\u002F null\n$response->model; \u002F\u002F 'gpt-4o-mini-2024-07-18\"'\n$response->parallelToolCalls; \u002F\u002F true\n$response->previousResponseId; \u002F\u002F null\n$response->store; \u002F\u002F true\n$response->temperature; \u002F\u002F 1.0\n$response->toolChoice; \u002F\u002F 'auto'\n$response->topP; \u002F\u002F 1.0\n$response->truncation; \u002F\u002F 'disabled'\n\n$response->toArray(); \u002F\u002F ['id' => 'resp_67ccd2bed1ec8190b14f964abc054267', ...]\n```\n\n#### `retrieve streamed`\n\n当您将 `stream` 设置为 `true` 来检索响应时，服务器会在生成响应的过程中向客户端发出服务器发送事件。所有事件及其有效载荷都可以在 [OpenAI 文档](https:\u002F\u002Fplatform.openai.com\u002Fdocs\u002Fapi-reference\u002Fresponses-streaming) 中找到。\n\n```php\n$stream = $client->responses()->retrieveStreamed('resp_67ccd2bed1ec8190b14f964abc054267', [\n    'starting_after' => '2',\n]);\n\nforeach ($stream as $response) {\n    $response->event; \u002F\u002F 'response.created'\n}\n```\n\n#### `cancel`\n\n取消具有给定 ID 的模型响应（后台请求）。\n\n```php\n$response = $client->responses()->cancel('resp_67ccd2bed1ec8190b14f964abc054267');\n\n$response->id; \u002F\u002F 'resp_67ccd2bed1ec8190b14f964abc054267'\n$response->status; \u002F\u002F '已取消'\n\n$response->toArray(); \u002F\u002F ['id' => 'resp_67ccd2bed1ec8190b14f964abc054267', 'status' => '已取消', ...]\n```\n\n#### `delete`\n\n删除具有给定 ID 的模型响应。\n\n```php\n$response = $client->responses()->delete('resp_67ccd2bed1ec8190b14f964abc054267');\n\n$response->id; \u002F\u002F 'resp_67ccd2bed1ec8190b14f964abc054267'\n$response->object; \u002F\u002F 'response'\n$response->deleted; \u002F\u002F true\n\n$response->toArray(); \u002F\u002F ['id' => 'resp_67ccd2bed1ec8190b14f964abc054267', 'deleted' => true, ...]\n```\n\n#### `list`\n\n列出具有给定 ID 的响应的输入项。所有事件及其有效载荷都可以在 [OpenAI 文档](https:\u002F\u002Fplatform.openai.com\u002Fdocs\u002Fapi-reference\u002Fresponses\u002Flist) 中找到。\n\n```php\n$response = $client->responses()->list('resp_67ccd2bed1ec8190b14f964abc054267', [\n    'limit' => 10,\n    'order' => 'desc'\n]);\n\n$response->object; \u002F\u002F 'list'\n\nforeach ($response->data as $item) {\n    $item->type; \u002F\u002F 'message'\n    $item->id; \u002F\u002F 'msg_680bf4e8c1948192b64abf0bad54b30806e0834f49400fc3'\n    $item->status; \u002F\u002F '已完成'\n    $item->role; \u002F\u002F '用户'\n}\n\n$response->firstId; \u002F\u002F 'msg_680bf4e8c1948192b64abf0bad54b30806e0834f49400fc3'\n$response->lastId; \u002F\u002F 'msg_680bf4e8c1948192b64abf0bad54b30806e0834f49400fc3'\n$response->hasMore; \u002F\u002F false\n\n$response->toArray(); \u002F\u002F ['object' => 'list', 'data' => [...], ...]\n```\n\n### `Conversations` 资源\n\n#### `create`\n\n创建一次对话。\n\n```php\n$response = $client->conversations()->create([\n    'metadata' => ['topic' => 'demo'],\n    'items' => [\n        [\n            'type' => 'message',\n            'role' => 'user',\n            'content' => 'Hello!'\n        ],\n    ],\n]);\n\n$response->id; \u002F\u002F 'conv_123'\n$response->object; \u002F\u002F 'conversation'\n$response->createdAt; \u002F\u002F 1741900000\n$response->metadata; \u002F\u002F ['topic' => 'demo']\n\n$response->toArray(); \u002F\u002F ['id' => 'conv_123', 'object' => 'conversation', ...]\n```\n\n#### `retrieve`\n\n通过 ID 检索一次对话。\n\n```php\n$response = $client->conversations()->retrieve('conv_123');\n\n$response->id; \u002F\u002F 'conv_123'\n$response->object; \u002F\u002F 'conversation'\n$response->createdAt; \u002F\u002F 1741900000\n\n$response->toArray(); \u002F\u002F ['id' => 'conv_123', 'object' => 'conversation', ...]\n```\n\n#### `update`\n\n通过 ID 更新一次对话。\n\n```php\n$response = $client->conversations()->update('conv_123', [\n    'metadata' => ['foo' => 'bar'],\n]);\n\n$response->id; \u002F\u002F 'conv_123'\n$response->metadata; \u002F\u002F ['foo' => 'bar']\n```\n\n#### `delete`\n\n通过 ID 删除一次对话。\n\n```php\n$response = $client->conversations()->delete('conv_123');\n\n$response->id; \u002F\u002F 'conv_123'\n$response->object; \u002F\u002F 'conversation.deleted'\n$response->deleted; \u002F\u002F true\n\n$response->toArray(); \u002F\u002F ['id' => 'conv_123', 'object' => 'conversation.deleted', 'deleted' => true]\n```\n\n### `Conversations Items` 资源\n\n#### `create`\n\n为一次对话创建条目。\n\n```php\n$response = $client->conversations()->items()->create('conv_123', [\n    'items' => [\n        [\n            'role' => 'system',\n            'content' => 'Refer to me as PHPBot.',\n        ],\n    ],\n]);\n\nforeach ($response->data as $listItem) {\n    $listItem->item; \u002F\u002F 创建的条目（例如，消息）\n}\n\n$response->firstId; \u002F\u002F 'msg_abc'\n$response->lastId; \u002F\u002F 'msg_abc'\n$response->hasMore; \u002F\u002F false\n\n$response->toArray(); \u002F\u002F ['object' => 'list', 'data' => [...], ...]\n```\n\n#### `list`\n\n列出一次对话的所有条目。\n\n```php\n$response = $client->conversations()->items()->list('conv_123', [\n    'limit' => 10,\n]);\n\n$response->object; \u002F\u002F 'list'\n```\n\n#### `retrieve`\n\n从一次对话中检索特定条目。\n\n```php\n$response = $client->conversations()->items()->retrieve('conv_123', 'msg_abc', [\n    'include' => ['step_details'],\n]);\n\n$response->id; \u002F\u002F 'msg_abc'\n$response->type; \u002F\u002F 'message'\n$response->status; \u002F\u002F 'completed'\n```\n\n#### `delete`\n\n删除一次对话中的特定条目。返回更新后的对话。\n\n```php\n$response = $client->conversations()->items()->delete('conv_123', 'msg_abc');\n\n$response->id; \u002F\u002F 'conv_123'\n$response->object; \u002F\u002F 'conversation'\n```\n\n### `Containers` 资源\n\n#### `create`\n\n创建一个用于代码解释器工具的容器。\n\n```php\n$response = $client->containers()->create([\n    'name' => 'My Container',\n    'expires_after' => [\n        'anchor' => 'last_active_at',\n        'minutes' => 60,\n    ],\n]);\n\n$response->id; \u002F\u002F 'container_abc123'\n$response->object; \u002F\u002F 'container'\n$response->createdAt; \u002F\u002F 1690000000\n$response->status; \u002F\u002F 'active'\n$response->expiresAfter->anchor; \u002F\u002F 'last_active_at'\n$response->expiresAfter->minutes; \u002F\u002F 60\n$response->lastActiveAt; \u002F\u002F 1690001000\n$response->name; \u002F\u002F 'My Container'\n\n$response->toArray(); \u002F\u002F ['id' => 'container_abc123', 'object' => 'container', ...]\n```\n\n#### `list`\n\n返回容器列表。\n\n```php\n$response = $client->containers()->list([\n    'limit' => 10,\n    'order' => 'desc',\n]);\n\n$response->object; \u002F\u002F 'list'\n\nforeach ($response->data as $container) {\n    $container->id; \u002F\u002F 'container_abc123'\n    $container->object; \u002F\u002F 'container'\n    $container->createdAt; \u002F\u002F 1690000000\n    $container->status; \u002F\u002F 'active'\n    $container->expiresAfter->anchor; \u002F\u002F 'last_active_at'\n    $container->expiresAfter->minutes; \u002F\u002F 60\n    $container->lastActiveAt; \u002F\u002F 1690001000\n    $container->name; \u002F\u002F 'Test Container'\n}\n\n$response->firstId; \u002F\u002F 'container_abc123'\n$response->lastId; \u002F\u002F 'container_def456'\n$response->hasMore; \u002F\u002F false\n\n$response->toArray(); \u002F\u002F ['object' => 'list', 'data' => [...], ...]\n```\n\n#### `retrieve`\n\n检索具有给定 ID 的容器。\n\n```php\n$response = $client->containers()->retrieve('container_abc123');\n\n$response->id; \u002F\u002F 'container_abc123'\n$response->object; \u002F\u002F 'container'\n$response->createdAt; \u002F\u002F 1690000000\n$response->status; \u002F\u002F 'active'\n$response->expiresAfter->anchor; \u002F\u002F 'last_active_at'\n$response->expiresAfter->minutes; \u002F\u002F 60\n$response->lastActiveAt; \u002F\u002F 1690001000\n$response->name; \u002F\u002F 'Test Container'\n\n$response->toArray(); \u002F\u002F ['id' => 'container_abc123', 'object' => 'container', ...]\n```\n\n#### `delete`\n\n删除具有给定 ID 的容器。\n\n```php\n$response = $client->containers()->delete('container_abc123');\n\n$response->id; \u002F\u002F 'container_abc123'\n$response->object; \u002F\u002F 'container'\n$response->deleted; \u002F\u002F true\n\n$response->toArray(); \u002F\u002F ['id' => 'container_abc123', 'object' => 'container', 'deleted' => true]\n```\n\n### `Containers Files` 资源\n\n#### `create`\n\n在容器中创建或上传文件。\n\n```php\n$response = $client->containers()->files()->create('container_abc123', [\n    'file' => fopen('path\u002Fto\u002Flocal-file.txt', 'r'),\n]);\n$response = $client->containers()->files()->create('container_abc123', [\n    'file_id' => 'file_XjGxS3KTG0uNmNOK362iJua3',\n]);\n\n$response->id; \u002F\u002F 'cfile_682e0e8a43c88191a7978f477a09bdf5'\n$response->object; \u002F\u002F 'container.file'\n$response->createdAt; \u002F\u002F 1747848842\n$response->bytes; \u002F\u002F 880\n$response->containerId; \u002F\u002F 'container_abc123'\n$response->path; \u002F\u002F '\u002Fmnt\u002Fdata\u002Flocal-file.txt'\n$response->source; \u002F\u002F 'user'\n\n$response->toArray(); \u002F\u002F ['id' => 'cfile_...', 'object' => 'container.file', ...]\n```\n\n> [!NOTE]\n> 必须提供 `file` 或 `file_id`，但不能同时提供两者。\n\n#### `list`\n\n返回容器中的文件列表。\n\n```php\n$response = $client->containers()->files()->list('container_abc123', [\n    'limit' => 10,\n    'order' => 'desc',\n]);\n\n$response->object; \u002F\u002F 'list'\n\nforeach ($response->data as $file) {\n    $file->id; \u002F\u002F 'cfile_682e0e8a43c88191a7978f477a09bdf5'\n    $file->object; \u002F\u002F 'container.file'\n    $file->createdAt; \u002F\u002F 1747848842\n    $file->bytes; \u002F\u002F 880\n    $file->containerId; \u002F\u002F 'container_abc123'\n    $file->path; \u002F\u002F '\u002Fmnt\u002Fdata\u002F...' \n    $file->source; \u002F\u002F 'user'\n}\n\n$response->firstId; \u002F\u002F 'cfile_...'\n$response->lastId; \u002F\u002F 'cfile_...'\n$response->hasMore; \u002F\u002F false\n\n$response->toArray(); \u002F\u002F ['object' => 'list', 'data' => [...], ...]\n```\n\n#### `retrieve`\n\n获取容器文件的信息。\n\n```php\n$response = $client->containers()->files()->retrieve('container_abc123', 'cfile_682e0e8a43c88191a7978f477a09bdf5');\n\n$response->id; \u002F\u002F 'cfile_682e0e8a43c88191a7978f477a09bdf5'\n$response->object; \u002F\u002F 'container.file'\n$response->createdAt; \u002F\u002F 1747848842\n$response->bytes; \u002F\u002F 880\n$response->containerId; \u002F\u002F 'container_abc123'\n$response->path; \u002F\u002F '\u002Fmnt\u002Fdata\u002F...'\n$response->source; \u002F\u002F 'user'\n\n$response->toArray(); \u002F\u002F ['id' => 'cfile_...', 'object' => 'container.file', ...]\n```\n\n#### `retrieve content`\n\n返回指定容器文件的原始内容。\n\n```php\n$content = $client->containers()->files()->content('container_abc123', 'cfile_682e0e8a43c88191a7978f477a09bdf5');\n\u002F\u002F $content => string\n```\n\n#### `delete`\n\n删除容器文件。\n\n```php\n$response = $client->containers()->files()->delete('container_abc123', 'cfile_682e0e8a43c88191a7978f477a09bdf5');\n\n$response->id; \u002F\u002F 'cfile_682e0e8a43c88191a7978f477a09bdf5'\n$response->object; \u002F\u002F 'container.file.deleted'\n$response->deleted; \u002F\u002F true\n\n$response->toArray(); \u002F\u002F ['id' => 'cfile_...', 'object' => 'container.file.deleted', 'deleted' => true]\n```\n\n### `Chat` 资源\n\n#### `create`\n\n为聊天消息生成完成内容。\n\n```php\n$response = $client->chat()->create([\n    'model' => 'gpt-3.5-turbo',\n    'messages' => [\n        ['role' => 'user', 'content' => 'Hello!'],\n    ],\n]);\n\n$response->id; \u002F\u002F 'chatcmpl-6pMyfj1HF4QXnfvjtfzvufZSQq6Eq'\n$response->object; \u002F\u002F 'chat.completion'\n$response->created; \u002F\u002F 1677701073\n$response->model; \u002F\u002F 'gpt-3.5-turbo-0301'\n\nforeach ($response->choices as $choice) {\n    $choice->index; \u002F\u002F 0\n    $choice->message->role; \u002F\u002F 'assistant'\n    $choice->message->content; \u002F\u002F '\\n\\nHello there! How can I assist you today?'\n    $choice->logprobs; \u002F\u002F null\n    $choice->finishReason; \u002F\u002F 'stop'\n}\n\n$response->usage->promptTokens; \u002F\u002F 9,\n$response->usage->completionTokens; \u002F\u002F 12,\n$response->usage->totalTokens; \u002F\u002F 21\n\n$response->toArray(); \u002F\u002F ['id' => 'chatcmpl-6pMyfj1HF4QXnfvjtfzvufZSQq6Eq', ...]\n```\n\n通过工具调用为聊天消息生成完成内容。\n\n```php\n$response = $client->chat()->create([\n    'model' => 'gpt-3.5-turbo-0613',\n    'messages' => [\n        ['role' => 'user', 'content' => 'What\\'s the weather like in Boston?'],\n    ],\n    'tools' => [\n        [\n            'type' => 'function',\n            'function' => [\n                'name' => 'get_current_weather',\n                'description' => 'Get the current weather in a given location',\n                'parameters' => [\n                    'type' => 'object',\n                    'properties' => [\n                        'location' => [\n                            'type' => 'string',\n                            'description' => 'The city and state, e.g. San Francisco, CA',\n                        ],\n                        'unit' => [\n                            'type' => 'string',\n                            'enum' => ['celsius', 'fahrenheit']\n                        ],\n                    ],\n                    'required' => ['location'],\n                ],\n            ],\n        ]\n    ]\n]);\n\n$response->id; \u002F\u002F 'chatcmpl-6pMyfj1HF4QXnfvjtfzvufZSQq6Eq'\n$response->object; \u002F\u002F 'chat.completion'\n$response->created; \u002F\u002F 1677701073\n$response->model; \u002F\u002F 'gpt-3.5-turbo-0613'\n\nforeach ($response->choices as $choice) {\n    $choice->index; \u002F\u002F 0\n    $choice->message->role; \u002F\u002F 'assistant'\n    $choice->message->content; \u002F\u002F null\n    $choice->message->toolCalls[0]->id; \u002F\u002F 'call_123'\n    $choice->message->toolCalls[0]->type; \u002F\u002F 'function'\n    $choice->message->toolCalls[0]->function->name; \u002F\u002F 'get_current_weather'\n    $choice->message->toolCalls[0]->function->arguments; \u002F\u002F \"{\\n  \\\"location\\\": \\\"Boston, MA\\\"\\n}\"\n    $choice->finishReason; \u002F\u002F 'tool_calls'\n}\n\n$response->usage->promptTokens; \u002F\u002F 82,\n$response->usage->completionTokens; \u002F\u002F 18,\n$response->usage->totalTokens; \u002F\u002F 100\n```\n\n通过函数调用为聊天消息生成完成内容。\n\n```php\n$response = $client->chat()->create([\n    'model' => 'gpt-3.5-turbo-0613',\n    'messages' => [\n        ['role' => 'user', 'content' => 'What\\'s the weather like in Boston?'],\n    ],\n    'functions' => [\n        [\n            'name' => 'get_current_weather',\n            'description' => 'Get the current weather in a given location',\n            'parameters' => [\n                'type' => 'object',\n                'properties' => [\n                    'location' => [\n                        'type' => 'string',\n                        'description' => 'The city and state, e.g. San Francisco, CA',\n                    ],\n                    'unit' => [\n                        'type' => 'string',\n                        'enum' => ['celsius', 'fahrenheit']\n                    ],\n                ],\n                'required' => ['location'],\n            ],\n        ]\n    ]\n]);\n\n$response->id; \u002F\u002F 'chatcmpl-6pMyfj1HF4QXnfvjtfzvufZSQq6Eq'\n$response->object; \u002F\u002F 'chat.completion'\n$response->created; \u002F\u002F 1677701073\n$response->model; \u002F\u002F 'gpt-3.5-turbo-0613'\n\nforeach ($response->choices as $choice) {\n    $choice->index; \u002F\u002F 0\n    $choice->message->role; \u002F\u002F 'assistant'\n    $choice->message->content; \u002F\u002F null\n    $choice->message->functionCall->name; \u002F\u002F 'get_current_weather'\n    $choice->message->functionCall->arguments; \u002F\u002F \"{\\n  \\\"location\\\": \\\"Boston, MA\\\"\\n}\"\n    $choice->finishReason; \u002F\u002F 'function_call'\n}\n\n$response->usage->promptTokens; \u002F\u002F 82,\n$response->usage->completionTokens; \u002F\u002F 18,\n$response->usage->totalTokens; \u002F\u002F 100\n```\n\n通过 `image_url` 输入图像来创建聊天完成内容。  \n这对于描述和分析视觉内容非常有用。\n\n```php\n$response = $client->chat()->create([\n    'model' => 'gpt-4o',\n    'messages' => [\n        [\n            'role' => 'user',\n            'content' => [\n                ['type' => 'text', 'text' => 'What is in this image?'],\n                \u002F\u002F 替换为真实的可访问图像\n                ['type' => 'image_url', 'image_url' => ['url' => 'https:\u002F\u002Fexample.com\u002Fimage.jpg']], \n            ]\n        ]\n    ]\n]);\n```\n\n#### `create streamed`\n\n为聊天消息生成流式完成内容。\n\n```php\n$stream = $client->chat()->createStreamed([\n    'model' => 'gpt-4o',\n    'messages' => [\n        ['role' => 'user', 'content' => 'Hello!'],\n    ],\n]);\n\nforeach($stream as $response){\n    $response->choices[0]->toArray();\n}\n\u002F\u002F 第1次迭代 => ['index' => 0, 'delta' => ['role' => 'assistant'], 'finish_reason' => null]\n\u002F\u002F 第2次迭代 => ['index' => 0, 'delta' => ['content' => 'Hello'], 'finish_reason' => null]\n\u002F\u002F 第3次迭代 => ['index' => 0, 'delta' => ['content' => '!'], 'finish_reason' => null]\n\u002F\u002F ...\n```\n\n在使用流式响应时，可以通过在 `stream_options` 中设置 `include_usage` 来获取用量报告。\n\n```php\n$stream = $client->chat()->createStreamed([\n    'model' => 'gpt-4',\n    'messages' => [\n        ['role' => 'user', 'content' => 'Hello!'],\n    ],\n    'stream_options'=>[\n        'include_usage' => true,\n    ]\n]);\n\nforeach($stream as $response){\n    if($response->usage !== null){\n        $response->usage->promptTokens; \u002F\u002F 9,\n        $response->usage->completionTokens; \u002F\u002F 12,\n        $response->usage->totalTokens; \u002F\u002F 21\n    }\n}\n```\n\n`usage` 始终为 `null`，直到最后一个数据块才会包含整个请求的 token 使用统计信息。\n\n### `Audio` 资源\n\n#### `speech`\n\n根据输入文本生成音频。\n\n```php\n$client->audio()->speech([\n    'model' => 'tts-1',\n    'input' => 'The quick brown fox jumped over the lazy dog.',\n    'voice' => 'alloy',\n]); \u002F\u002F 音频文件内容为字符串\n```\n\n#### `speechStreamed`\n\n根据输入文本生成流式传输的音频。\n\n```php\n$stream = $client->audio()->speechStreamed([\n    'model' => 'tts-1',\n    'input' => 'The quick brown fox jumped over the lazy dog.',\n    'voice' => 'alloy',\n]);\n\nforeach($stream as $chunk){\n    $chunk; \u002F\u002F 音频文件内容的片段，为字符串\n}\n```\n\n#### `transcribe`\n\n将音频转录为输入语言。\n\n```php\n$response = $client->audio()->transcribe([\n    'model' => 'whisper-1',\n    'file' => fopen('audio.mp3', 'r'),\n    'response_format' => 'verbose_json',\n    'timestamp_granularities' => ['segment', 'word']\n]);\n\n$response->task; \u002F\u002F 'transcribe'\n$response->language; \u002F\u002F 'english'\n$response->duration; \u002F\u002F 2.95\n$response->text; \u002F\u002F 'Hello, how are you?'\n\nforeach ($response->segments as $segment) {\n    $segment->index; \u002F\u002F 0\n    $segment->seek; \u002F\u002F 0\n    $segment->start; \u002F\u002F 0.0\n    $segment->end; \u002F\u002F 4.0\n    $segment->text; \u002F\u002F 'Hello, how are you?'\n    $segment->tokens; \u002F\u002F [50364, 2425, 11, 577, 366, 291, 30, 50564]\n    $segment->temperature; \u002F\u002F 0.0\n    $segment->avgLogprob; \u002F\u002F -0.45045216878255206\n    $segment->compressionRatio; \u002F\u002F 0.7037037037037037\n    $segment->noSpeechProb; \u002F\u002F 0.1076972484588623\n    $segment->transient; \u002F\u002F false\n}\n\nforeach ($response->words as $word) {\n    $word->word; \u002F\u002F 'Hello'\n    $word->start; \u002F\u002F 0.31\n    $word->end; \u002F\u002F 0.92\n}\n\n$response->toArray(); \u002F\u002F ['task' => 'transcribe', ...]\n```\n\n#### `transcribe streamed`\n\n以流式方式将音频转录为输入语言。\n\n```php\n$stream = $client->audio()->transcribeStreamed([\n    'model' => 'gpt-4o-transcribe',\n    'file' => fopen('audio.mp3', 'r'),\n]);\n\nforeach ($stream as $event) {\n    echo json_encode($event->toArray()); \u002F\u002F {\"event\":\"transcript.text.delta\",\"data\":{\"delta\":\"The\"}}\n}\n```\n\n#### `translate`\n\n将音频翻译成英语。\n\n```php\n$response = $client->audio()->translate([\n    'model' => 'whisper-1',\n    'file' => fopen('german.mp3', 'r'),\n    'response_format' => 'verbose_json',\n]);\n\n$response->task; \u002F\u002F 'translate'\n$response->language; \u002F\u002F 'english'\n$response->duration; \u002F\u002F 2.95\n$response->text; \u002F\u002F 'Hello, how are you?'\n\nforeach ($response->segments as $segment) {\n    $segment->index; \u002F\u002F 0\n    $segment->seek; \u002F\u002F 0\n    $segment->start; \u002F\u002F 0.0\n    $segment->end; \u002F\u002F 4.0\n    $segment->text; \u002F\u002F 'Hello, how are you?'\n    $segment->tokens; \u002F\u002F [50364, 2425, 11, 577, 366, 291, 30, 50564]\n    $segment->temperature; \u002F\u002F 0.0\n    $segment->avgLogprob; \u002F\u002F -0.45045216878255206\n    $segment->compressionRatio; \u002F\u002F 0.7037037037037037\n    $segment->noSpeechProb; \u002F\u002F 0.1076972484588623\n    $segment->transient; \u002F\u002F false\n}\n\n$response->toArray(); \u002F\u002F ['task' => 'translate', ...]\n```\n\n### `Embeddings` 资源\n\n#### `create`\n\n创建表示输入文本的嵌入向量。\n\n```php\n$response = $client->embeddings()->create([\n    'model' => 'text-similarity-babbage-001',\n    'input' => 'The food was delicious and the waiter...',\n]);\n\n$response->object; \u002F\u002F 'list'\n\nforeach ($response->embeddings as $embedding) {\n    $embedding->object; \u002F\u002F 'embedding'\n    $embedding->model; \u002F\u002F 'text-similarity-babbage-001'\n    $embedding->embedding; \u002F\u002F [0.018990106880664825, -0.0073809814639389515, ...]\n    $embedding->index; \u002F\u002F 0\n}\n\n$response->usage->promptTokens; \u002F\u002F 8,\n$response->usage->totalTokens; \u002F\u002F 8\n\n$response->toArray(); \u002F\u002F ['data' => [...], ...]\n```\n\n### `Files` 资源\n\n#### `list`\n\n返回属于用户组织的文件列表。\n\n```php\n$response = $client->files()->list();\n\n$response->object; \u002F\u002F 'list'\n\nforeach ($response->data as $result) {\n    $result->id; \u002F\u002F 'file-XjGxS3KTG0uNmNOK362iJua3'\n    $result->object; \u002F\u002F 'file'\n    \u002F\u002F ...\n}\n\n$response->toArray(); \u002F\u002F ['object' => 'list', 'data' => [...]]\n```\n\n#### `delete`\n\n删除文件。\n\n```php\n$response = $client->files()->delete($file);\n\n$response->id; \u002F\u002F 'file-XjGxS3KTG0uNmNOK362iJua3'\n$response->object; \u002F\u002F 'file'\n$response->deleted; \u002F\u002F true\n\n$response->toArray(); \u002F\u002F ['id' => 'file-XjGxS3KTG0uNmNOK362iJua3', ...]\n```\n\n#### `retrieve`\n\n返回特定文件的信息。\n\n```php\n$response = $client->files()->retrieve('file-XjGxS3KTG0uNmNOK362iJua3');\n\n$response->id; \u002F\u002F 'file-XjGxS3KTG0uNmNOK362iJua3'\n$response->object; \u002F\u002F 'file'\n$response->bytes; \u002F\u002F 140\n$response->createdAt; \u002F\u002F 1613779657\n$response->filename; \u002F\u002F 'mydata.jsonl'\n$response->purpose; \u002F\u002F 'fine-tune'\n$response->status; \u002F\u002F 'succeeded'\n$response->status_details; \u002F\u002F null\n\n$response->toArray(); \u002F\u002F ['id' => 'file-XjGxS3KTG0uNmNOK362iJua3', ...]\n```\n\n#### `upload`\n\n上传包含文档的文件，供各种端点\u002F功能使用。\n\n```php\n$response = $client->files()->upload([\n        'purpose' => 'fine-tune',\n        'file' => fopen('my-file.jsonl', 'r'),\n    ]);\n\n$response->id; \u002F\u002F 'file-XjGxS3KTG0uNmNOK362iJua3'\n$response->object; \u002F\u002F 'file'\n$response->bytes; \u002F\u002F 140\n$response->createdAt; \u002F\u002F 1613779657\n$response->filename; \u002F\u002F 'mydata.jsonl'\n$response->purpose; \u002F\u002F 'fine-tune'\n$response->status; \u002F\u002F 'succeeded'\n$response->status_details; \u002F\u002F null\n\n$response->toArray(); \u002F\u002F ['id' => 'file-XjGxS3KTG0uNmNOK362iJua3', ...]\n```\n\n#### `download`\n\n返回指定文件的内容。\n\n```php\n$client->files()->download($file); \u002F\u002F '{\"prompt\": \"\u003Cprompt text>\", ...'\n```\n\n### `FineTuning` 资源\n\n#### `create job`\n\n创建一个作业，用于从给定数据集微调指定模型。\n\n```php\n$response = $client->fineTuning()->createJob([\n    'training_file' => 'file-abc123',\n    'validation_file' => null,\n    'model' => 'gpt-3.5-turbo',\n    'hyperparameters' => [\n        'n_epochs' => 4,\n    ],\n    'suffix' => null,\n]);\n\n$response->id; \u002F\u002F 'ftjob-AF1WoRqd3aJAHsqc9NY7iL8F'\n$response->object; \u002F\u002F 'fine_tuning.job'\n$response->model; \u002F\u002F 'gpt-3.5-turbo-0613'\n$response->fineTunedModel; \u002F\u002F null\n\u002F\u002F ...\n\n$response->toArray(); \u002F\u002F ['id' => 'ftjob-AF1WoRqd3aJAHsqc9NY7iL8F', ...]\n```\n\n#### `list jobs`\n\n列出您组织的微调作业。\n\n```php\n$response = $client->fineTuning()->listJobs();\n\n$response->object; \u002F\u002F 'list'\n\nforeach ($response->data as $result) {\n    $result->id; \u002F\u002F 'ftjob-AF1WoRqd3aJAHsqc9NY7iL8F'\n    $result->object; \u002F\u002F 'fine_tuning.job'\n    \u002F\u002F ...\n}\n\n$response->toArray(); \u002F\u002F ['object' => 'list', 'data' => [...]]\n```\n\n您可以向 `listJobs` 方法传递额外参数以缩小结果范围。\n\n```php\n$response = $client->fineTuning()->listJobs([\n    'limit' => 3, \u002F\u002F 要检索的作业数量（默认：20）\n    'after' => 'ftjob-AF1WoRqd3aJAHsqc9NY7iL8F', \u002F\u002F 上一次分页请求中最后一条作业的标识符。\n]);\n```\n\n#### `retrieve job`\n\n获取微调作业的相关信息。\n\n```php\n$response = $client->fineTuning()->retrieveJob('ftjob-AF1WoRqd3aJAHsqc9NY7iL8F');\n\n$response->id; \u002F\u002F 'ftjob-AF1WoRqd3aJAHsqc9NY7iL8F'\n$response->object; \u002F\u002F 'fine_tuning.job'\n$response->model; \u002F\u002F 'gpt-3.5-turbo-0613'\n$response->createdAt; \u002F\u002F 1614807352\n$response->finishedAt; \u002F\u002F 1692819450\n$response->fineTunedModel; \u002F\u002F 'ft:gpt-3.5-turbo-0613:jwe-dev::7qnxQ0sQ'\n$response->organizationId; \u002F\u002F 'org-jwe45798ASN82s'\n$response->resultFiles[0]; \u002F\u002F 'file-1bl05WrhsKDDEdg8XSP617QF'\n$response->status; \u002F\u002F 'succeeded'\n$response->validationFile; \u002F\u002F null\n$response->trainingFile; \u002F\u002F 'file-abc123'\n$response->trainedTokens; \u002F\u002F 5049\n\n$response->hyperparameters->nEpochs; \u002F\u002F 9\n\n$response->toArray(); \u002F\u002F ['id' => 'ftjob-AF1WoRqd3aJAHsqc9NY7iL8F', ...]\n```\n\n#### `cancel job`\n\n立即取消一个微调作业。\n\n```php\n$response = $client->fineTuning()->cancelJob('ftjob-AF1WoRqd3aJAHsqc9NY7iL8F');\n\n$response->id; \u002F\u002F 'ftjob-AF1WoRqd3aJAHsqc9NY7iL8F'\n$response->object; \u002F\u002F 'fine_tuning.job'\n\u002F\u002F ...\n$response->status; \u002F\u002F 'cancelled'\n\u002F\u002F ...\n\n$response->toArray(); \u002F\u002F ['id' => 'ftjob-AF1WoRqd3aJAHsqc9NY7iL8F', ...]\n```\n\n#### `list job events`\n\n获取微调作业的状态更新。\n\n```php\n$response = $client->fineTuning()->listJobEvents('ftjob-AF1WoRqd3aJAHsqc9NY7iL8F');\n\n$response->object; \u002F\u002F 'list'\n\nforeach ($response->data as $result) {\n    $result->object; \u002F\u002F 'fine_tuning.job.event' \n    $result->createdAt; \u002F\u002F 1614807352\n    \u002F\u002F ...\n}\n\n$response->toArray(); \u002F\u002F ['object' => 'list', 'data' => [...]]\n```\n\n您可以向 `listJobEvents` 方法传递额外参数以缩小结果范围。\n\n```php\n$response = $client->fineTuning()->listJobEvents('ftjob-AF1WoRqd3aJAHsqc9NY7iL8F', [\n    'limit' => 3, \u002F\u002F 要检索的事件数量（默认：20）\n    'after' => 'ftevent-kLPSMIcsqshEUEJVOVBVcHlP', \u002F\u002F 上一次分页请求中最后一条事件的标识符。\n]);\n```\n\n### `Moderations` 资源\n\n#### `create`\n\n分类文本是否违反 OpenAI 的内容政策。\n\n```php\n$response = $client->moderations()->create([\n    'model' => 'text-moderation-latest',\n    'input' => '我想干掉他们。',\n]);\n\n$response->id; \u002F\u002F modr-5xOyuS\n$response->model; \u002F\u002F text-moderation-003\n\nforeach ($response->results as $result) {\n    $result->flagged; \u002F\u002F true\n\n    foreach ($result->categories as $category) {\n        $category->category->value; \u002F\u002F 'violence'\n        $category->violated; \u002F\u002F true\n        $category->score; \u002F\u002F 0.97431367635727\n    }\n}\n\n$response->toArray(); \u002F\u002F ['id' => 'modr-5xOyuS', ...]\n```\n\n### `Images` 资源\n\n#### `create`\n\n根据提示生成一张图片。\n\n```php\n$response = $client->images()->create([\n    'model' => 'dall-e-3',\n    'prompt' => '一只可爱的小海獭',\n    'n' => 1,\n    'size' => '1024x1024',\n    'response_format' => 'url',\n]);\n\n$response->created; \u002F\u002F 1589478378\n\nforeach ($response->data as $data) {\n    $data->url; \u002F\u002F 'https:\u002F\u002Foaidalleapiprodscus.blob.core.windows.net\u002Fprivate\u002F...'\n    $data->b64_json; \u002F\u002F null\n}\n\n$response->toArray(); \u002F\u002F ['created' => 1589478378, data => ['url' => 'https:\u002F\u002Foaidalleapiprodscus...', ...]]\n```\n\n#### `create streamed`\n\n当您将 `stream` 设置为 `true` 来创建图片时，服务器会在图片生成过程中向客户端发送服务器发送事件。所有事件及其负载都可以在 [OpenAI 文档](https:\u002F\u002Fplatform.openai.com\u002Fdocs\u002Fapi-reference\u002Fimages-streaming) 中找到。\n\n```php\n$stream = $client->images()->createStreamed([\n    'model' => 'gpt-image-1',\n    'prompt' => '一只可爱的小海獭',\n    'n' => 1,\n    'size' => '1024x1024',\n    'response_format' => 'url',\n]);\n\nforeach ($stream as $image) {\n    $image->type; \u002F\u002F 'image_generation.partial_image'\n}\n```\n\n#### `edit`\n\n根据原始图片和提示生成编辑或扩展后的图片。\n\n```php\n$response = $client->images()->edit([\n    'image' => fopen('image_edit_original.png', 'r'),\n    'mask' => fopen('image_edit_mask.png', 'r'),\n    'prompt' => '一个阳光明媚的室内休息区，泳池里有一只火烈鸟',\n    'n' => 1,\n    'size' => '256x256',\n    'response_format' => 'url',\n]);\n\n$response->created; \u002F\u002F 1589478378\n\nforeach ($response->data as $data) {\n    $data->url; \u002F\u002F 'https:\u002F\u002Foaidalleapiprodscus.blob.core.windows.net\u002Fprivate\u002F...'\n    $data->b64_json; \u002F\u002F null\n}\n\n$response->toArray(); \u002F\u002F ['created' => 1589478378, data => ['url' => 'https:\u002F\u002Foaidalleapiprodscus...', ...]]\n```\n\n#### `edit streamed`\n\n当您将 `stream` 设置为 `true` 来编辑图片时，服务器会在图片生成过程中向客户端发送服务器发送事件。所有事件及其负载都可以在 [OpenAI 文档](https:\u002F\u002Fplatform.openai.com\u002Fdocs\u002Fapi-reference\u002Fimages-streaming) 中找到。\n\n```php\n$stream = $client->images()->editStreamed([\n    'model' => 'gpt-image-1',\n    'prompt' => '一只可爱的小海獭',\n    'n' => 1,\n    'size' => '1024x1024',\n    'response_format' => 'url',\n]);\n\nforeach ($stream as $image) {\n    $image->type; \u002F\u002F 'image_generation.partial_image'\n}\n```\n\n#### `variation`\n\n根据给定的图片生成变体。\n\n```php\n$response = $client->images()->variation([\n    'image' => fopen('image_edit_original.png', 'r'),\n    'n' => 1,\n    'size' => '256x256',\n    'response_format' => 'url',\n]);\n\n$response->created; \u002F\u002F 1589478378\n\nforeach ($response->data as $data) {\n    $data->url; \u002F\u002F 'https:\u002F\u002Foaidalleapiprodscus.blob.core.windows.net\u002Fprivate\u002F...'\n    $data->b64_json; \u002F\u002F null\n}\n\n$response->toArray(); \u002F\u002F ['created' => 1589478378, data => ['url' => 'https:\u002F\u002Foaidalleapiprodscus...', ...]]\n```\n\n### `Batches` 资源\n\n#### `create`\n\n创建一个批次。\n\n```php\n$fileResponse = $client->files()->upload(\n     parameters: [\n          'purpose' => 'batch',\n          'file' => fopen('commands.jsonl', 'r'),\n    ]\n);\n\n$fileId = $fileResponse->id;\n\n$response = $client->batches()->create(\n    parameters: [\n        'input_file_id' => $fileId,\n        'endpoint' => '\u002Fv1\u002Fchat\u002Fcompletions',\n        'completion_window' => '24h'\n    ]\n );\n\n$response->id; \u002F\u002F 'batch_abc123'\n$response->object; \u002F\u002F 'batch'\n$response->endpoint; \u002F\u002F \u002Fv1\u002Fchat\u002Fcompletions\n$response->errors; \u002F\u002F null\n$response->completionWindow; \u002F\u002F '24h'\n$response->status; \u002F\u002F 'validating'\n$response->outputFileId; \u002F\u002F null\n$response->errorFileId; \u002F\u002F null\n$response->createdAt; \u002F\u002F 1714508499\n$response->inProgressAt; \u002F\u002F null\n$response->expiresAt; \u002F\u002F 1714536634\n$response->completedAt; \u002F\u002F null\n$response->failedAt; \u002F\u002F null\n$response->expiredAt; \u002F\u002F null\n$response->requestCounts; \u002F\u002F null\n$response->metadata; \u002F\u002F ['name' => 'My batch name']\n\n$response->toArray(); \u002F\u002F ['id' => 'batch_abc123', ...]\n```\n\n#### `retrieve`\n\n检索一个批次。\n\n```php\n$response = $client->batches()->retrieve(id: 'batch_abc123');\n\n$response->id; \u002F\u002F 'batch_abc123'\n$response->object; \u002F\u002F 'batch'\n$response->endpoint; \u002F\u002F \u002Fv1\u002Fchat\u002Fcompletions\n$response->errors; \u002F\u002F null\n$response->completionWindow; \u002F\u002F '24h'\n$response->status; \u002F\u002F 'validating'\n$response->outputFileId; \u002F\u002F null\n$response->errorFileId; \u002F\u002F null\n$response->createdAt; \u002F\u002F 1714508499\n$response->inProgressAt; \u002F\u002F null\n$response->expiresAt; \u002F\u002F 1714536634\n$response->completedAt; \u002F\u002F null\n$response->failedAt; \u002F\u002F null\n$response->expiredAt; \u002F\u002F null\n$response->requestCounts->total; \u002F\u002F 100\n$response->requestCounts->completed; \u002F\u002F 95\n$response->requestCounts->failed; \u002F\u002F 5\n$response->metadata; \u002F\u002F ['name' => 'My batch name']\n\n$response->toArray(); \u002F\u002F ['id' => 'batch_abc123', ...]\n```\n\n#### `cancel`\n\n取消一个批次。\n\n```php\n$response = $client->batches()->cancel(id: 'batch_abc123');\n\n$response->id; \u002F\u002F 'batch_abc123'\n$response->object; \u002F\u002F 'batch'\n$response->endpoint; \u002F\u002F \u002Fv1\u002Fchat\u002Fcompletions\n$response->errors; \u002F\u002F null\n$response->completionWindow; \u002F\u002F '24h'\n$response->status; \u002F\u002F 'cancelling'\n$response->outputFileId; \u002F\u002F null\n$response->errorFileId; \u002F\u002F null\n$response->createdAt; \u002F\u002F 1711471533\n$response->inProgressAt; \u002F\u002F 1711471538\n$response->expiresAt; \u002F\u002F 1711557933\n$response->cancellingAt; \u002F\u002F 1711475133\n$response->cancelledAt; \u002F\u002F null\n$response->requestCounts->total; \u002F\u002F 100\n$response->requestCounts->completed; \u002F\u002F 23\n$response->requestCounts->failed; \u002F\u002F 1\n$response->metadata; \u002F\u002F ['name' => 'My batch name']\n\n$response->toArray(); \u002F\u002F ['id' => 'batch_abc123', ...]\n```\n\n#### `list`\n\n返回批次列表。\n\n```php\n$response = $client->batches()->list(\n    parameters: [\n        'limit' => 10, \n    ],\n);\n\n$response->object; \u002F\u002F 'list'\n$response->firstId; \u002F\u002F 'batch_abc123'\n$response->lastId; \u002F\u002F 'batch_abc456'\n$response->hasMore; \u002F\u002F true\n\nforeach ($response->data as $result) {\n    $result->id; \u002F\u002F 'batch_abc123'\n    \u002F\u002F ...\n}\n\n$response->toArray(); \u002F\u002F ['object' => 'list', ...]]\n```\n\n### `Vector Stores` 资源\n\n#### `create`\n\n创建一个向量存储。\n\n```php\n$response = $client->vectorStores()->create([\n    'file_ids' => [\n        'file-fUU0hFRuQ1GzhOweTNeJlCXG',\n    ],\n    'name' => '我的第一个向量存储',\n]);\n\n$response->id; \u002F\u002F 'vs_vzfQhlTWVUl38QGqQAoQjeDF'\n$response->object; \u002F\u002F 'vector_store'\n$response->createdAt; \u002F\u002F 1717703267\n$response->name; \u002F\u002F '我的第一个向量存储'\n$response->usageBytes; \u002F\u002F 0\n$response->fileCounts->inProgress; \u002F\u002F 1\n$response->fileCounts->completed; \u002F\u002F 0\n$response->fileCounts->failed; \u002F\u002F 0\n$response->fileCounts->cancelled; \u002F\u002F 0\n$response->fileCounts->total; \u002F\u002F 1\n$response->status; \u002F\u002F 'in_progress'\n$response->expiresAfter; \u002F\u002F null\n$response->expiresAt; \u002F\u002F null\n$response->lastActiveAt; \u002F\u002F 1717703267\n\n$response->toArray(); \u002F\u002F ['id' => 'vs_vzfQhlTWVUl38QGqQAoQjeDF', ...]\n```\n\n#### `retrieve`\n\n检索一个向量存储。\n\n```php\n$response = $client->vectorStores()->retrieve(\n    vectorStoreId: 'vs_vzfQhlTWVUl38QGqQAoQjeDF',\n);\n\n$response->id; \u002F\u002F 'vs_vzfQhlTWVUl38QGqQAoQjeDF'\n$response->object; \u002F\u002F 'vector_store'\n$response->createdAt; \u002F\u002F 1717703267\n$response->name; \u002F\u002F '我的第一个向量存储'\n$response->usageBytes; \u002F\u002F 0\n$response->fileCounts->inProgress; \u002F\u002F 1\n$response->fileCounts->completed; \u002F\u002F 0\n$response->fileCounts->failed; \u002F\u002F 0\n$response->fileCounts->cancelled; \u002F\u002F 0\n$response->fileCounts->total; \u002F\u002F 1\n$response->status; \u002F\u002F 'in_progress'\n$response->expiresAfter; \u002F\u002F null\n$response->expiresAt; \u002F\u002F null\n,response->lastActiveAt; \u002F\u002F 1717703267\n\n$response->toArray(); \u002F\u002F ['id' => 'vs_vzfQhlTWVUl38QGqQAoQjeDF', ...]\n```\n\n#### `modify`\n\n修改一个向量存储。\n\n```php\n$response = $client->vectorStores()->modify(\n    vectorStoreId: 'vs_vzfQhlTWVUl38QGqQAoQjeDF',\n    parameters:  [\n        'name' => '新名称',\n    ],\n);\n\n$response->id; \u002F\u002F 'vs_vzfQhlTWVUl38QGqQAoQjeDF'\n$response->object; \u002F\u002F 'vector_store'\n,response->createdAt; \u002F\u002F 1717703267\n,response->name; \u002F\u002F '新名称'\n,response->usageBytes; \u002F\u002F 0\n,response->fileCounts->inProgress; \u002F\u002F 1\n,response->fileCounts->completed; \u002F\u002F 0\n,response->fileCounts->failed; \u002F\u002F 0\n,response->fileCounts->cancelled; \u002F\u002F 0\n,response->fileCounts->total; \u002F\u002F 1\n,response->status; \u002F\u002F 'in_progress'\n,response->expiresAfter; \u002F\u002F null\n,response->expiresAt; \u002F\u002F null\n,response->lastActiveAt; \u002F\u002F 1717703267\n\n,response->toArray(); \u002F\u002F ['id' => 'vs_vzfQhlTWVUl38QGqQAoQjeDF', ...]\n```\n\n#### `delete`\n\n删除一个向量存储。\n\n```php\n$response = $client->vectorStores()->delete(\n    vectorStoreId: 'vs_vzfQhlTWVUl38QGqQAoQjeDF',\n);\n\n,response->id; \u002F\u002F 'vs_vzfQhlTWVUl38QGqQAoQjeDF'\n,response->object; \u002F\u002F 'vector_store.deleted'\n,response->deleted; \u002F\u002F true\n\n,response->toArray(); \u002F\u002F ['id' => 'vs_vzfQhlTWVUl38QGqQAoQjeDF', ...]\n```\n\n#### `list`\n\n返回向量存储列表。\n\n```php\n$response = $client->vectorStores()->list(\n    parameters: [\n        'limit' => 10,\n    ],\n);\n\n,response->object; \u002F\u002F 'list'\n,response->firstId; \u002F\u002F 'vs_vzfQhlTWVUl38QGqQAoQjeDF'\n,response->lastId; \u002F\u002F 'vs_D5DPOgBxSoEBTmYBgUESdPpa'\n,response->hasMore; \u002F\u002F true\n\nforeach ($response->data as $result) {\n    $result->id; \u002F\u002F 'vs_vzfQhlTWVUl38QGqQAoQjeDF'\n    \u002F\u002F ...\n}\n\n,response->toArray(); \u002F\u002F ['object' => 'list', ...]]\n```\n\n### `向量存储文件` 资源\n\n#### `create`\n\n通过将文件附加到向量存储来创建向量存储文件。\n\n```php\n$response = $client->vectorStores()->files()->create(\n    vectorStoreId: 'vs_vzfQhlTWVUl38QGqQAoQjeDF',\n    parameters: [\n        'file_id' => 'file-fUU0hFRuQ1GzhOweTNeJlCXG',\n    ]\n);\n\n$response->id; \u002F\u002F 'file-fUU0hFRuQ1GzhOweTNeJlCXG'\n$response->object; \u002F\u002F 'vector_store.file'\n$response->usageBytes; \u002F\u002F 4553\n$response->createdAt; \u002F\u002F 1717703267\n$response->vectorStoreId; \u002F\u002F 'vs_vzfQhlTWVUl38QGqQAoQjeDF'\n$response->status; \u002F\u002F 'completed'\n$response->lastError; \u002F\u002F null\n$response->chunkingStrategy->type; \u002F\u002F 'static'\n$response->chunkingStrategy->maxChunkSizeTokens; \u002F\u002F 800\n$response->chunkingStrategy->chunkOverlapTokens; \u002F\u002F 400\n\n$response->toArray(); \u002F\u002F ['id' => 'file-fUU0hFRuQ1GzhOweTNeJlCXG', ...]\n```\n\n#### `retrieve`\n\n检索一个向量存储文件。\n\n```php\n$response = $client->vectorStores()->files()->retrieve(\n    vectorStoreId: 'vs_vzfQhlTWVUl38QGqQAoQjeDF',\n    fileId: 'file-fUU0hFRuQ1GzhOweTNeJlCXG',\n);\n\n$response->id; \u002F\u002F 'file-fUU0hFRuQ1GzhOweTNeJlCXG'\n$response->object; \u002F\u002F 'vector_store.file'\n$response->usageBytes; \u002F\u002F 4553\n$response->createdAt; \u002F\u002F 1717703267\n$response->vectorStoreId; \u002F\u002F 'vs_vzfQhlTWVUl38QGqQAoQjeDF'\n$response->status; \u002F\u002F 'completed'\n$response->lastError; \u002F\u002F null\n$response->chunkingStrategy->type; \u002F\u002F 'static'\n$response->chunkingStrategy->maxChunkSizeTokens; \u002F\u002F 800\n$response->chunkingStrategy->chunkOverlapTokens; \u002F\u002F 400\n\n$response->toArray(); \u002F\u002F ['id' => 'file-fUU0hFRuQ1GzhOweTNeJlCXG', ...]\n```\n\n#### `delete`\n\n删除一个向量存储文件。这会从向量存储中移除该文件，但文件本身不会被删除。要删除文件，请使用删除文件端点。\n\n```php\n$response = $client->vectorStores()->files()->delete(\n    vectorStoreId: 'vs_vzfQhlTWVUl38QGqQAoQjeDF',\n    fileId: 'file-fUU0hFRuQ1GzhOweTNeJlCXG',\n);\n\n$response->id; \u002F\u002F 'file-fUU0hFRuQ1GzhOweTNeJlCXG'\n$response->object; \u002F\u002F 'vector_store.file.deleted'\n$response->deleted; \u002F\u002F true\n\n$response->toArray(); \u002F\u002F ['id' => 'file-fUU0hFRuQ1GzhOweTNeJlCXG', ...]\n```\n\n#### `list`\n\n返回向量存储文件列表。\n\n```php\n$response = $client->vectorStores()->files()->list(\n    vectorStoreId: 'vs_vzfQhlTWVUl38QGqQAoQjeDF',\n    parameters: [\n        'limit' => 10,\n    ],\n);\n\n$response->object; \u002F\u002F 'list'\n$response->firstId; \u002F\u002F 'file-fUU0hFRuQ1GzhOweTNeJlCXG'\n$response->lastId; \u002F\u002F 'file-D5DPOgBxSoEBTmYBgUESdPpa'\n$response->hasMore; \u002F\u002F true\n\nforeach ($response->data as $result) {\n    $result->id; \u002F\u002F 'file-fUU0hFRuQ1GzhOweTNeJlCXG'\n    \u002F\u002F ...\n}\n\n$response->toArray(); \u002F\u002F ['object' => 'list', ...]]\n```\n\n#### `search`\n\n根据查询和文件属性筛选器，在向量存储中搜索相关片段。\n\n```php\n$response = $client->vectorStores()->search(\n    vectorStoreId: 'vs_vzfQhlTWVUl38QGqQAoQjeDF',\n    parameters: [\n        'query' => '什么是退货政策？',\n        'max_num_results' => 5,\n        'filters' => [],\n        'rewrite_query' => false\n    ]\n);\n\n$response->object; \u002F\u002F 'vector_store.search_results.page'\n$response->searchQuery; \u002F\u002F '什么是退货政策？'\n$response->hasMore; \u002F\u002F false\n$response->nextPage; \u002F\u002F null\nforeach ($response->data as $file) {\n    $result->fileId; \u002F\u002F 'file-fUU0hFRuQ1GzhOweTNeJlCXG'\n    $result->filename; \u002F\u002F 'return_policy.pdf'\n    $result->score; \u002F\u002F 0.95\n    $result->attributes; \u002F\u002F ['category' => 'customer_service']\n\n    foreach ($result->content as $content) {\n        $content->type; \u002F\u002F 'text'\n        $content->text; \u002F\u002F '我们的退货政策允许客户在30天内退货...'\n    }\n}\n\n$response->toArray(); \u002F\u002F ['object' => 'vector_store.search_results.page', ...]\n```\n\n### `向量存储文件批次` 资源\n\n#### `create`\n\n创建一个向量存储文件批次。\n\n```php\n$response = $client->vectorStores()->batches()->create(\n    vectorStoreId: 'vs_vzfQhlTWVUl38QGqQAoQjeDF',\n    parameters: [\n        'file_ids' => [\n            'file-fUU0hFRuQ1GzhOweTNeJlCXG',\n        ],\n    ]\n);\n\n$response->id; \u002F\u002F 'vsfb_123'\n$response->object; \u002F\u002F 'vector_store.files_batch'\n$response->createdAt; \u002F\u002F 1698107661\n$response->vectorStoreId; \u002F\u002F 'vs_vzfQhlTWVUl38QGqQAoQjeDF'\n$response->status; \u002F\u002F 'completed'\n$response->fileCounts->inProgress; \u002F\u002F 1\n$response->fileCounts->completed; \u002F\u002F 0\n$response->fileCounts->failed; \u002F\u002F 0\n$response->fileCounts->cancelled; \u002F\u002F 0\n$response->fileCounts->total; \u002F\u002F 1\n\n$response->toArray(); \u002F\u002F ['id' => 'vsfb_123', ...]\n```\n\n#### `retrieve`\n\n检索一个向量存储文件批次。\n\n```php\n$response = $client->vectorStores()->batches()->retrieve(\n    vectorStoreId: 'vs_vzfQhlTWVUl38QGqQAoQjeDF',\n    fileBatchId: 'vsfb_123',\n);\n\n$response->id; \u002F\u002F 'vsfb_123'\n$response->object; \u002F\u002F 'vector_store.files_batch'\n$response->createdAt; \u002F\u002F 1698107661\n$response->vectorStoreId; \u002F\u002F 'vs_vzfQhlTWVUl38QGqQAoQjeDF'\n$response->status; \u002F\u002F 'completed'\n$response->fileCounts->inProgress; \u002F\u002F 1\n$response->fileCounts->completed; \u002F\u002F 0\n,response->fileCounts->failed; \u002F\u002F 0\n,response->fileCounts->cancelled; \u002F\u002F 0\n,response->fileCounts->total; \u002F\u002F 1\n\n,response->toArray(); \u002F\u002F ['id' => 'vsfb_123', ...]\n```\n\n#### `cancel`\n\n取消一个向量存储文件批次。这会尽快尝试取消该批次中文件的处理。\n\n```php\n$response = $client->vectorStores()->batches()->cancel(\n    vectorStoreId: 'vs_vzfQhlTWVUl38QGqQAoQjeDF',\n    fileBatchId: 'vsfb_123',\n);\n\n,response->id; \u002F\u002F 'vsfb_123'\n,response->object; \u002F\u002F 'vector_store.files_batch'\n,response->createdAt; \u002F\u002F 1698107661\n,response->vectorStoreId; \u002F\u002F 'vs_vzfQhlTWVUl38QGqQAoQjeDF'\n,response->status; \u002F\u002F 'cancelling'\n,response->fileCounts->inProgress; \u002F\u002F 1\n,response->fileCounts->completed; \u002F\u002F 0\n,response->fileCounts->failed; \u002F\u002F 0\n,response->fileCounts->cancelled; \u002F\u002F 0\n,response->fileCounts->total; \u002F\u002F 1\n\n,response->toArray(); \u002F\u002F ['id' => 'vsfb_123', ...]\n```\n\n#### `list`\n\n返回向量存储文件列表。\n\n```php\n$response = $client->vectorStores()->batches()->listFiles(\n    vectorStoreId: 'vs_vzfQhlTWVUl38QGqQAoQjeDF',\n    fileBatchId: 'vsfb_123',\n    parameters: [\n        'limit' => 10,\n    ],\n);\n\n,response->object; \u002F\u002F 'list'\n,response->firstId; \u002F\u002F 'file-fUU0hFRuQ1GzhOweTNeJlCXG'\n,response->lastId; \u002F\u002F 'file-D5DPOgBxSoEBTmYBgUESdPpa'\n,response->hasMore; \u002F\u002F true\n\nforeach ($response->data as $result) {\n    $result->id; \u002F\u002F 'file-fUU0hFRuQ1GzhOweTNeJlCXG'\n    \u002F\u002F ...\n}\n\n,response->toArray(); \u002F\u002F ['object' => 'list', ...]]\n```\n\n### 实时临时密钥\n\n#### `token`\n\n为实时会话创建一个临时 API 密钥。\n\n```php\n$response = $client->realtime()->token();\n\n,response->clientSecret->value \u002F\u002F 'ek-1234567890abcdefg'\n,response->clientSecret->expiresAt \u002F\u002F 1717703267\n```\n\n#### `transcribeToken`\n\n为实时转录会话创建一个临时 API 密钥。\n\n```php\n,response = $client->realtime()->transcribeToken();\n\n,response->clientSecret->value \u002F\u002F 'et-1234567890abcdefg'\n,response->clientSecret->expiresAt \u002F\u002F 1717703267\n```\n\n### `Completions` 资源（旧版）\n\n> [!WARNING]  \n> OpenAI 于 2023 年 7 月将 `Completions` 资源标记为“旧版”。请改用 `Chat` 资源。\n\n\u003Cdetails>\n\u003Csummary>完成 API 信息\u003C\u002Fsummary>\n\n#### `create`\n\n根据提供的提示和参数创建完成结果。\n\n```php\n$response = $client->completions()->create([\n    'model' => 'gpt-3.5-turbo-instruct',\n    'prompt' => 'Say this is a test',\n    'max_tokens' => 6,\n    'temperature' => 0\n]);\n\n$response->id; \u002F\u002F 'cmpl-uqkvlQyYK7bGYrRHQ0eXlWi7'\n$response->object; \u002F\u002F 'text_completion'\n$response->created; \u002F\u002F 1589478378\n$response->model; \u002F\u002F 'gpt-3.5-turbo-instruct'\n\nforeach ($response->choices as $choice) {\n    $choice->text; \u002F\u002F '\\n\\nThis is a test'\n    $choice->index; \u002F\u002F 0\n    $choice->logprobs; \u002F\u002F null\n    $choice->finishReason; \u002F\u002F 'length' 或 null\n}\n\n$response->usage->promptTokens; \u002F\u002F 5,\n$response->usage->completionTokens; \u002F\u002F 6,\n$response->usage->totalTokens; \u002F\u002F 11\n\n$response->toArray(); \u002F\u002F ['id' => 'cmpl-uqkvlQyYK7bGYrRHQ0eXlWi7', ...]\n```\n\n#### `create streamed`\n\n根据提供的提示和参数创建流式完成结果。\n\n```php\n$stream = $client->completions()->createStreamed([\n        'model' => 'gpt-3.5-turbo-instruct',\n        'prompt' => 'Hi',\n        'max_tokens' => 10,\n    ]);\n\nforeach($stream as $response){\n    $response->choices[0]->text;\n}\n\u002F\u002F 第1次迭代 => 'I'\n\u002F\u002F 第2次迭代 => ' am'\n\u002F\u002F 第3次迭代 => ' very'\n\u002F\u002F 第4次迭代 => ' excited'\n\u002F\u002F ...\n```\n\n\u003C\u002Fdetails>\n\n### `Assistants` 资源（已弃用）\n\n> [!WARNING]\n> OpenAI 已弃用 Assistants API，并将于 2026 年 8 月 26 日停止支持。https:\u002F\u002Fplatform.openai.com\u002Fdocs\u002Fguides\u002Fmigrate-to-responses#assistants-api\n\n\u003Cdetails>\n\u003Csummary>助手 API 信息\u003C\u002Fsummary>\n\n> **注意** - 如果您从工厂手动创建客户端，请确保提供必要的头部信息：\n> ```php\n> $factory->withHttpHeader('OpenAI-Beta', 'assistants=v2')\n> ```\n\n#### `create`\n\n使用模型和指令创建助手。\n\n```php\n$response = $client->assistants()->create([\n    'instructions' => '你是一位私人数学家教。当被问到问题时，编写并运行 Python 代码来回答问题。',\n    'name' => '数学家教',\n    'tools' => [\n        [\n            'type' => 'code_interpreter',\n        ],\n    ],\n    'model' => 'gpt-4o',\n]);\n\n$response->id; \u002F\u002F 'asst_gxzBkD1wkKEloYqZ410pT5pd'\n$response->object; \u002F\u002F 'assistant'\n$response->createdAt; \u002F\u002F 1623936000\n$response->name; \u002F\u002F '数学家教'\n$response->instructions; \u002F\u002F '你是一位私人数学家教。当被问到问题时，编写并运行 Python 代码来回答问题。'\n$response->model; \u002F\u002F 'gpt-4o'\n$response->description; \u002F\u002F null\n$response->tools[0]->type; \u002F\u002F 'code_interpreter'\n$response->toolResources; \u002F\u002F []\n$response->metadata; \u002F\u002F []\n$response->temperature: \u002F\u002F null\n$response->topP: \u002F\u002F null\n$response->format: \u002F\u002F 'auto'\n\n$response->toArray(); \u002F\u002F ['id' => 'asst_gxzBkD1wkKEloYqZ410pT5pd', ...]\n```\n\n#### `retrieve`\n\n检索助手。\n\n```php\n$response = $client->assistants()->retrieve('asst_gxzBkD1wkKEloYqZ410pT5pd');\n\n$response->id; \u002F\u002F 'asst_gxzBkD1wkKEloYqZ410pT5pd'\n$response->object; \u002F\u002F 'assistant'\n$response->createdAt; \u002F\u002F 1623936000\n$response->name; \u002F\u002F '数学家教'\n$response->instructions; \u002F\u002F '你是一位私人数学家教。当被问到问题时，编写并运行 Python 代码来回答问题。'\n$response->model; \u002F\u002F 'gpt-4o'\n$response->description; \u002F\u002F null\n$response->tools[0]->type; \u002F\u002F 'code_interpreter'\n$response->toolResources; \u002F\u002F []\n$response->metadata; \u002F\u002F []\n$response->temperature: \u002F\u002F null\n$response->topP: \u002F\u002F null\n$response->format: \u002F\u002F 'auto'\n\n$response->toArray(); \u002F\u002F ['id' => 'asst_gxzBkD1wkKEloYqZ410pT5pd', ...]\n```\n\n#### `modify`\n\n修改助手。\n\n```php\n$response = $client->assistants()->modify('asst_gxzBkD1wkKEloYqZ410pT5pd', [\n        'name' => '新数学家教',\n    ]);\n\n$response->id; \u002F\u002F 'asst_gxzBkD1wkKEloYqZ410pT5pd'\n$response->object; \u002F\u002F 'assistant'\n$response->createdAt; \u002F\u002F 1623936000\n$response->name; \u002F\u002F '新数学家教'\n$response->instructions; \u002F\u002F '你是一位私人数学家教。当被问到问题时，编写并运行 Python 代码来回答问题。'\n$response->model; \u002F\u002F 'gpt-4o'\n$response->description; \u002F\u002F null\n$response->tools[0]->type; \u002F\u002F 'code_interpreter'\n$response->toolResources; \u002F\u002F []\n$response->metadata; \u002F\u002F []\n$response->temperature: \u002F\u002F null\n$response->topP: \u002F\u002F null\n$response->format: \u002F\u002F 'auto'\n\n$response->toArray(); \u002F\u002F ['id' => 'asst_gxzBkD1wkKEloYqZ410pT5pd', ...]\n```\n\n#### `delete`\n\n删除助手。\n\n```php\n$response = $client->assistants()->delete('asst_gxzBkD1wkKEloYqZ410pT5pd');\n\n$response->id; \u002F\u002F 'asst_gxzBkD1wkKEloYqZ410pT5pd'\n$response->object; \u002F\u002F 'assistant.deleted'\n$response->deleted; \u002F\u002F true\n\n$response->toArray(); \u002F\u002F ['id' => 'asst_gxzBkD1wkKEloYqZ410pT5pd', ...]\n```\n\n#### `list`\n\n返回助手列表。\n\n```php\n$response = $client->assistants()->list([\n    'limit' => 10,\n]);\n\n$response->object; \u002F\u002F 'list'\n$response->firstId; \u002F\u002F 'asst_gxzBkD1wkKEloYqZ410pT5pd'\n$response->lastId; \u002F\u002F 'asst_reHHtAM0jKLDIxanM6gP6DaR'\n$response->hasMore; \u002F\u002F true\n\nforeach ($response->data as $result) {\n    $result->id; \u002F\u002F 'asst_gxzBkD1wkKEloYqZ410pT5pd'\n    \u002F\u002F ...\n}\n\n$response->toArray(); \u002F\u002F ['object' => 'list', ...]]\n```\n\n\u003C\u002Fdetails>\n\n### `Threads` 资源（已弃用）\n\n> [!WARNING]\n> OpenAI 已弃用 Assistants API，并将于 2026 年 8 月 26 日停止支持。https:\u002F\u002Fplatform.openai.com\u002Fdocs\u002Fguides\u002Fmigrate-to-responses#assistants-api\n\n\u003Cdetails>\n\u003Csummary>Threads API 信息\u003C\u002Fsummary>\n\n#### `create`\n\n创建一个 thread。\n\n```php\n$response = $client->threads()->create([]);\n\n$response->id; \u002F\u002F 'thread_tKFLqzRN9n7MnyKKvc1Q7868'\n$response->object; \u002F\u002F 'thread'\n$response->createdAt; \u002F\u002F 1623936000\n$response->toolResources; \u002F\u002F null\n$response->metadata; \u002F\u002F []\n\n$response->toArray(); \u002F\u002F ['id' => 'thread_tKFLqzRN9n7MnyKKvc1Q7868', ...]\n```\n\n#### `createAndRun`\n\n在一个请求中创建并运行一个 thread。\n\n```php\n$response = $client->threads()->createAndRun(\n    [\n        'assistant_id' => 'asst_gxzBkD1wkKEloYqZ410pT5pd',\n        'thread' => [\n            'messages' =>\n                [\n                    [\n                        'role' => 'user',\n                        'content' => '向 5 岁的孩子解释深度学习。',\n                    ],\n                ],\n        ],\n    ],\n);\n\n$response->id; \u002F\u002F 'run_4RCYyYzX9m41WQicoJtUQAb8'\n$response->object; \u002F\u002F 'thread.run'\n$response->createdAt; \u002F\u002F 1623936000\n$response->assistantId; \u002F\u002F 'asst_gxzBkD1wkKEloYqZ410pT5pd'\n$response->threadId; \u002F\u002F 'thread_tKFLqzRN9n7MnyKKvc1Q7868'\n$response->status; \u002F\u002F 'queued'\n$response->requiredAction; \u002F\u002F null\n$response->lastError; \u002F\u002F null\n$response->startedAt; \u002F\u002F null\n$response->expiresAt; \u002F\u002F 1699622335\n$response->cancelledAt; \u002F\u002F null\n$response->failedAt; \u002F\u002F null\n$response->completedAt; \u002F\u002F null\n$response->incompleteDetails; \u002F\u002F null\n$response->model; \u002F\u002F 'gpt-4o'\n$response->instructions; \u002F\u002F null\n$response->tools; \u002F\u002F []\n$response->metadata; \u002F\u002F []\n$response->usage->total_tokens; \u002F\u002F 579\n$response->temperature; \u002F\u002F null\n$response->topP; \u002F\u002F null\n$response->maxPromptTokens; \u002F\u002F 1000\n$response->maxCompletionTokens; \u002F\u002F 1000\n$response->truncationStrategy->type; \u002F\u002F 'auto'\n$response->responseFormat; \u002F\u002F 'auto'\n$response->toolChoice; \u002F\u002F 'auto'\n\n$response->toArray(); \u002F\u002F ['id' => 'run_4RCYyYzX9m41WQicoJtUQAb8', ...]\n```\n\n#### `retrieve`\n\n检索一个 thread。\n\n```php\n$response = $client->threads()->retrieve('thread_tKFLqzRN9n7MnyKKvc1Q7868');\n\n$response->id; \u002F\u002F 'thread_tKFLqzRN9n7MnyKKvc1Q7868'\n$response->object; \u002F\u002F 'thread'\n$response->createdAt; \u002F\u002F 1623936000\n$response->toolResources; \u002F\u002F null\n$response->metadata; \u002F\u002F []\n\n$response->toArray(); \u002F\u002F ['id' => 'thread_tKFLqzRN9n7MnyKKvc1Q7868', ...]\n```\n\n#### `modify`\n\n修改一个 thread。\n\n```php\n$response = $client->threads()->modify('thread_tKFLqzRN9n7MnyKKvc1Q7868', [\n        'metadata' => [\n            'name' => '我的新 thread 名称',\n        ],\n    ]);\n\n$response->id; \u002F\u002F 'thread_tKFLqzRN9n7MnyKKvc1Q7868'\n$response->object; \u002F\u002F 'thread'\n$response->createdAt; \u002F\u002F 1623936000\n$response->toolResources; \u002F\u002F null\n$response->metadata; \u002F\u002F ['name' => '我的新 thread 名称']\n\n$response->toArray(); \u002F\u002F ['id' => 'thread_tKFLqzRN9n7MnyKKvc1Q7868', ...]\n```\n\n#### `delete`\n\n删除一个 thread。\n\n```php\n$response = $client->threads()->delete('thread_tKFLqzRN9n7MnyKKvc1Q7868');\n\n$response->id; \u002F\u002F 'thread_tKFLqzRN9n7MnyKKvc1Q7868'\n$response->object; \u002F\u002F 'thread.deleted'\n$response->deleted; \u002F\u002F true\n\n$response->toArray(); \u002F\u002F ['id' => 'thread_tKFLqzRN9n7MnyKKvc1Q7868', ...]\n```\n\n\u003C\u002Fdetails>\n\n### `线程消息` 资源（已弃用）\n\n> [!警告]\n> OpenAI 已弃用 Assistants API，并将于 2026 年 8 月 26 日停止支持。https:\u002F\u002Fplatform.openai.com\u002Fdocs\u002Fguides\u002Fmigrate-to-responses#assistants-api\n\n\u003Cdetails>\n\u003Csummary>线程消息 API 信息\u003C\u002Fsummary>\n\n#### `create`\n\n创建一条消息。\n\n```php\n$response = $client->threads()->messages()->create('thread_tKFLqzRN9n7MnyKKvc1Q7868', [\n    'role' => 'user',\n    'content' => '5 和 7 的和是多少？',\n]);\n\n$response->id; \u002F\u002F 'msg_SKYwvF3zcigxthfn6F4hnpdU'\n$response->object; \u002F\u002F 'thread.message'\n$response->createdAt; \u002F\u002F 1623936000\n$response->threadId; \u002F\u002F 'thread_tKFLqzRN9n7MnyKKvc1Q7868'\n$response->status; \u002F\u002F 'in_progress'\n$response->incompleteDetails; \u002F\u002F null\n$response->completedAt; \u002F\u002F null\n$response->incompleteAt; \u002F\u002F null\n$response->role; \u002F\u002F 'user'\n$response->content[0]->type; \u002F\u002F 'text'\n$response->content[0]->text->value; \u002F\u002F '5 和 7 的和是多少？'\n$response->content[0]->text->annotations; \u002F\u002F []\n$response->assistantId; \u002F\u002F null\n$response->runId; \u002F\u002F null\n$response->attachments; \u002F\u002F []\n$response->metadata; \u002F\u002F []\n\n$response->toArray(); \u002F\u002F ['id' => 'msg_SKYwvF3zcigxthfn6F4hnpdU', ...]\n```\n\n#### `retrieve`\n\n检索一条消息。\n\n```php\n$response = $client->threads()->messages()->retrieve(\n    threadId: 'thread_tKFLqzRN9n7MnyKKvc1Q7868',\n    messageId: 'msg_SKYwvF3zcigxthfn6F4hnpdU',\n);\n\n$response->id; \u002F\u002F 'msg_SKYwvF3zcigxthfn6F4hnpdU'\n$response->object; \u002F\u002F 'thread.message'\n$response->createdAt; \u002F\u002F 1623936000\n$response->threadId; \u002F\u002F 'thread_tKFLqzRN9n7MnyKKvc1Q7868'\n$response->status; \u002F\u002F 'in_progress'\n$response->incompleteDetails; \u002F\u002F null\n$response->completedAt; \u002F\u002F null\n$response->incompleteAt; \u002F\u002F null\n$response->role; \u002F\u002F 'user'\n$response->content[0]->type; \u002F\u002F 'text'\n$response->content[0]->text->value; \u002F\u002F '5 和 7 的和是多少？'\n$response->content[0]->text->annotations; \u002F\u002F []\n$response->assistantId; \u002F\u002F null\n$response->runId; \u002F\u002F null\n$response->attachments; \u002F\u002F []\n$response->metadata; \u002F\u002F []\n\n$response->toArray(); \u002F\u002F ['id' => 'msg_SKYwvF3zcigxthfn6F4hnpdU', ...]\n```\n\n#### `modify`\n\n修改一条消息。\n\n```php\n$response = $client->threads()->messages()->modify(\n    threadId: 'thread_tKFLqzRN9n7MnyKKvc1Q7868',\n    messageId: 'msg_SKYwvF3zcigxthfn6F4hnpdU',\n    parameters:  [\n        'metadata' => [\n            'name' => '我的新消息名称',\n        ],\n    ],\n);\n\n$response->id; \u002F\u002F 'msg_SKYwvF3zcigxthfn6F4hnpdU'\n$response->object; \u002F\u002F 'thread.message'\n$response->createdAt; \u002F\u002F 1623936000\n$response->threadId; \u002F\u002F 'thread_tKFLqzRN9n7MnyKKvc1Q7868'\n$response->status; \u002F\u002F 'in_progress'\n$response->incompleteDetails; \u002F\u002F null\n$response->completedAt; \u002F\u002F null\n$response->incompleteAt; \u002F\u002F null\n$response->role; \u002F\u002F 'user'\n$response->content[0]->type; \u002F\u002F 'text'\n$response->content[0]->text->value; \u002F\u002F '5 和 7 的和是多少？'\n$response->content[0]->text->annotations; \u002F\u002F []\n$response->assistantId; \u002F\u002F null\n$response->runId; \u002F\u002F null\n$response->attachments; \u002F\u002F []\n$response->metadata; \u002F\u002F {'name': '我的新消息名称'}\n\n$response->toArray(); \u002F\u002F ['id' => 'msg_SKYwvF3zcigxthfn6F4hnpdU', ...]\n```\n\n#### `delete`\n\n删除一条消息。\n\n```php\n$response = $client->threads()->messages()->delete(\n    threadId: 'thread_tKFLqzRN9n7MnyKKvc1Q7868',\n    messageId: 'msg_SKYwvF3zcigxthfn6F4hnpdU'\n);\n\n$response->id; \u002F\u002F 'msg_SKYwvF3zcigxthfn6F4hnpdU'\n$response->object; \u002F\u002F 'thread.message.deleted'\n$response->deleted; \u002F\u002F true\n\n$response->toArray(); \u002F\u002F ['id' => 'msg_SKYwvF3zcigxthfn6F4hnpdU', ...]\n```\n\n#### `list`\n\n返回给定线程的消息列表。\n\n```php\n$response = $client->threads()->messages()->list('thread_tKFLqzRN9n7MnyKKvc1Q7868', [\n    'limit' => 10,\n]);\n\n$response->object; \u002F\u002F 'list'\n$response->firstId; \u002F\u002F 'msg_SKYwvF3zcigxthfn6F4hnpdU'\n$response->lastId; \u002F\u002F 'msg_SKYwvF3zcigxthfn6F4hnpdU'\n$response->hasMore; \u002F\u002F false\n\nforeach ($response->data as $result) {\n    $result->id; \u002F\u002F 'msg_SKYwvF3zcigxthfn6F4hnpdU'\n    \u002F\u002F ...\n}\n\n$response->toArray(); \u002F\u002F ['object' => 'list', ...]\n```\n\n\u003C\u002Fdetails>\n\n### `线程运行` 资源（已弃用）\n\n> [!警告]\n> OpenAI 已弃用 Assistants API，并将于 2026 年 8 月 26 日停止支持。https:\u002F\u002Fplatform.openai.com\u002Fdocs\u002Fguides\u002Fmigrate-to-responses#assistants-api\n\n\u003Cdetails>\n\u003Csummary>线程运行 API 信息\u003C\u002Fsummary>\n\n#### `create`\n\n创建一个运行。\n\n```php\n$response = $client->threads()->runs()->create(\n    threadId: 'thread_tKFLqzRN9n7MnyKKvc1Q7868', \n    parameters: [\n        'assistant_id' => 'asst_gxzBkD1wkKEloYqZ410pT5pd',\n    ],\n);\n\n$response->id; \u002F\u002F 'run_4RCYyYzX9m41WQicoJtUQAb8'\n$response->object; \u002F\u002F 'thread.run'\n$response->createdAt; \u002F\u002F 1623936000\n$response->assistantId; \u002F\u002F 'asst_gxzBkD1wkKEloYqZ410pT5pd'\n$response->threadId; \u002F\u002F 'thread_tKFLqzRN9n7MnyKKvc1Q7868'\n$response->status; \u002F\u002F 'queued'\n$response->startedAt; \u002F\u002F null\n$response->expiresAt; \u002F\u002F 1699622335\n$response->cancelledAt; \u002F\u002F null\n$response->failedAt; \u002F\u002F null\n$response->completedAt; \u002F\u002F null\n$response->incompleteDetails; \u002F\u002F null\n$response->lastError; \u002F\u002F null\n$response->model; \u002F\u002F 'gpt-4o'\n$response->instructions; \u002F\u002F null\n$response->tools; \u002F\u002F []\n$response->metadata; \u002F\u002F []\n$response->usage->total_tokens; \u002F\u002F 579\n$response->temperature; \u002F\u002F null\n$response->topP; \u002F\u002F null\n$response->maxPromptTokens; \u002F\u002F 1000\n$response->maxCompletionTokens; \u002F\u002F 1000\n$response->truncationStrategy->type; \u002F\u002F 'auto'\n$response->toolChoice; \u002F\u002F 'auto'\n$response->responseFormat; \u002F\u002F 'auto'\n\n$response->toArray(); \u002F\u002F ['id' => 'run_4RCYyYzX9m41WQicoJtUQAb8', ...]\n```\n\n#### `create streamed`\n\n创建一个流式运行。\n\n[OpenAI 助手事件](https:\u002F\u002Fplatform.openai.com\u002Fdocs\u002Fapi-reference\u002Fassistants-streaming\u002Fevents)\n\n```php\n$stream = $client->threads()->runs()->createStreamed(\n    threadId: 'thread_tKFLqzRN9n7MnyKKvc1Q7868',\n    parameters: [\n        'assistant_id' => 'asst_gxzBkD1wkKEloYqZ410pT5pd',\n    ],\n);\n\nforeach($stream as $response){\n    $response->event \u002F\u002F 'thread.run.created' | 'thread.run.in_progress' | .....\n    $response->response \u002F\u002F ThreadResponse | ThreadRunResponse | ThreadRunStepResponse | ThreadRunStepDeltaResponse | ThreadMessageResponse | ThreadMessageDeltaResponse\n}\n\n\u002F\u002F ...\n```\n\n#### `create streamed with function calls`\n\n创建一个带有函数调用的流式运行。\n\n[OpenAI 助手事件](https:\u002F\u002Fplatform.openai.com\u002Fdocs\u002Fapi-reference\u002Fassistants-streaming\u002Fevents)\n\n```php\n$stream = $client->threads()->runs()->createStreamed(\n    threadId: 'thread_tKFLqzRN9n7MnyKKvc1Q7868',\n    parameters: [\n        'assistant_id' => 'asst_gxzBkD1wkKEloYqZ410pT5pd',\n    ],\n);\n\n\ndo{\n    foreach($stream as $response){\n        $response->event \u002F\u002F 'thread.run.created' | 'thread.run.in_progress' | .....\n        $response->response \u002F\u002F ThreadResponse | ThreadRunResponse | ThreadRunStepResponse | ThreadRunStepDeltaResponse | ThreadMessageResponse | ThreadMessageDeltaResponse\n\nswitch($response->event){\n            case 'thread.run.created':\n            case 'thread.run.queued':\n            case 'thread.run.completed':\n            case 'thread.run.cancelling':\n                $run = $response->response;\n                break;\n            case 'thread.run.expired':\n            case 'thread.run.cancelled':\n            case 'thread.run.failed':\n                $run = $response->response;\n                break 3;\n            case 'thread.run.requires_action':\n                \u002F\u002F 使用提交工具输出后启动的新流覆盖现有流\n                $stream = $client->threads()->runs()->submitToolOutputsStreamed(\n                    threadId: $run->threadId,\n                    runId: $run->id,\n                    parameters: [\n                        'tool_outputs' => [\n                            [\n                                'tool_call_id' => 'call_KSg14X7kZF2WDzlPhpQ168Mj',\n                                'output' => '12',\n                            ]\n                        ],\n                    ]\n                );\n                break;\n        }\n    }\n}\nwhile ($run->status != \"completed\")\n\n\u002F\u002F ...\n```\n\n#### `retrieve`\n\n获取某个运行的详细信息。\n\n```php\n$response = $client->threads()->runs()->retrieve(\n    threadId: 'thread_tKFLqzRN9n7MnyKKvc1Q7868',\n    runId: 'run_4RCYyYzX9m41WQicoJtUQAb8',\n);\n\n$response->id; \u002F\u002F 'run_4RCYyYzX9m41WQicoJtUQAb8'\n$response->object; \u002F\u002F 'thread.run'\n$response->createdAt; \u002F\u002F 1623936000\n$response->assistantId; \u002F\u002F 'asst_gxzBkD1wkKEloYqZ410pT5pd'\n$response->threadId; \u002F\u002F 'thread_tKFLqzRN9n7MnyKKvc1Q7868'\n$response->status; \u002F\u002F 'queued'\n$response->startedAt; \u002F\u002F null\n$response->expiresAt; \u002F\u002F 1699622335\n$response->cancelledAt; \u002F\u002F null\n$response->failedAt; \u002F\u002F null\n$response->completedAt; \u002F\u002F null\n$response->incompleteDetails; \u002F\u002F null\n$response->lastError; \u002F\u002F null\n$response->model; \u002F\u002F 'gpt-4o'\n$response->instructions; \u002F\u002F null\n$response->tools; \u002F\u002F []\n$response->usage->promptTokens; \u002F\u002F 25,\n$response->usage->completionTokens; \u002F\u002F 32,\n$response->usage->totalTokens; \u002F\u002F 57\n$response->temperature; \u002F\u002F null\n$response->topP; \u002F\u002F null\n$response->maxPromptTokens; \u002F\u002F 1000\n$response->maxCompletionTokens; \u002F\u002F 1000\n$response->truncationStrategy->type; \u002F\u002F 'auto'\n$response->toolChoice; \u002F\u002F 'auto'\n$response->responseFormat; \u002F\u002F 'auto'\n\n$response->toArray(); \u002F\u002F ['id' => 'run_4RCYyYzX9m41WQicoJtUQAb8', ...]\n```\n\n#### `modify`\n\n修改某个运行的属性。\n\n```php\n$response = $client->threads()->runs()->modify(\n    threadId: 'thread_tKFLqzRN9n7MnyKKvc1Q7868',\n    runId: 'run_4RCYyYzX9m41WQicoJtUQAb8',\n    parameters:  [\n        'metadata' => [\n            'name' => '我的新运行名称',\n        ],\n    ],\n);\n\n$response->id; \u002F\u002F 'run_4RCYyYzX9m41WQicoJtUQAb8'\n$response->object; \u002F\u002F 'thread.run'\n$response->createdAt; \u002F\u002F 1623936000\n$response->assistantId; \u002F\u002F 'asst_gxzBkD1wkKEloYqZ410pT5pd'\n$response->threadId; \u002F\u002F 'thread_tKFLqzRN9n7MnyKKvc1Q7868'\n$response->status; \u002F\u002F 'queued'\n$response->startedAt; \u002F\u002F null\n$response->expiresAt; \u002F\u002F 1699622335\n$response->cancelledAt; \u002F\u002F null\n$response->failedAt; \u002F\u002F null\n$response->completedAt; \u002F\u002F null\n$response->incompleteDetails; \u002F\u002F null\n$response->lastError; \u002F\u002F null\n$response->model; \u002F\u002F 'gpt-4o'\n$response->instructions; \u002F\u002F null\n$response->tools; \u002F\u002F []\n$response->usage->total_tokens; \u002F\u002F 579\n$response->temperature; \u002F\u002F null\n$response->topP; \u002F\u002F null\n$response->maxPromptTokens; \u002F\u002F 1000\n$response->maxCompletionTokens; \u002F\u002F 1000\n$response->truncationStrategy->type; \u002F\u002F 'auto'\n$response->toolChoice; \u002F\u002F 'auto'\n$response->responseFormat; \u002F\u002F 'auto'\n$response->metadata; \u002F\u002F {'name': '我的新运行名称'}\n\n$response->toArray(); \u002F\u002F ['id' => 'run_4RCYyYzX9m41WQicoJtUQAb8', ...]\n```\n\n#### `cancel`\n\n取消一个正在执行中的运行。\n\n```php\n$response = $client->threads()->runs()->cancel(\n    threadId: 'thread_tKFLqzRN9n7MnyKKvc1Q7868',\n    runId: 'run_4RCYyYzX9m41WQicoJtUQAb8',\n);\n\n$response->id; \u002F\u002F 'run_4RCYyYzX9m41WQicoJtUQAb8'\n$response->object; \u002F\u002F 'thread.run'\n$response->createdAt; \u002F\u002F 1623936000\n$response->assistantId; \u002F\u002F 'asst_gxzBkD1wkKEloYqZ410pT5pd'\n$response->threadId; \u002F\u002F 'thread_tKFLqzRN9n7MnyKKvc1Q7868'\n$response->status; \u002F\u002F 'cancelling'\n$response->startedAt; \u002F\u002F null\n$response->expiresAt; \u002F\u002F 1699622335\n$response->cancelledAt; \u002F\u002F null\n$response->failedAt; \u002F\u002F null\n$response->completedAt; \u002F\u002F null\n$response->incompleteDetails; \u002F\u002F null\n$response->lastError; \u002F\u002F null\n$response->model; \u002F\u002F 'gpt-4o'\n$response->instructions; \u002F\u002F null\n$response->tools; \u002F\u002F []\n$response->usage?->total_tokens; \u002F\u002F 579\n$response->temperature; \u002F\u002F null\n$response->topP; \u002F\u002F null\n$response->maxPromptTokens; \u002F\u002F 1000\n$response->maxCompletionTokens; \u002F\u002F 1000\n$response->truncationStrategy->type; \u002F\u002F 'auto'\n$response->toolChoice; \u002F\u002F 'auto'\n$response->responseFormat; \u002F\u002F 'auto'\n$response->metadata; \u002F\u002F []\n\n$response->toArray(); \u002F\u002F ['id' => 'run_4RCYyYzX9m41WQicoJtUQAb8', ...]\n```\n\n#### `submitToolOutputs`\n\n当运行状态为 `requires_action` 且 `required_action.type` 为 `submit_tool_outputs` 时，可以通过此接口提交所有已完成的工具调用的输出。所有输出必须在一次请求中全部提交。\n\n```php\n$response = $client->threads()->runs()->submitToolOutputs(\n    threadId: 'thread_tKFLqzRN9n7MnyKKvc1Q7868',\n    runId: 'run_4RCYyYzX9m41WQicoJtUQAb8',\n    parameters: [\n        'tool_outputs' => [\n            [\n                'tool_call_id' => 'call_KSg14X7kZF2WDzlPhpQ168Mj',\n                'output' => '12',\n            ],\n        ],\n    ]\n);\n\n$response->id; \u002F\u002F 'run_4RCYyYzX9m41WQicoJtUQAb8'\n$response->object; \u002F\u002F 'thread.run'\n$response->createdAt; \u002F\u002F 1623936000\n$response->assistantId; \u002F\u002F 'asst_gxzBkD1wkKEloYqZ410pT5pd'\n$response->threadId; \u002F\u002F 'thread_tKFLqzRN9n7MnyKKvc1Q7868'\n$response->status; \u002F\u002F 'in_progress'\n$response->startedAt; \u002F\u002F null\n$response->expiresAt; \u002F\u002F 1699622335\n$response->cancelledAt; \u002F\u002F null\n$response->failedAt; \u002F\u002F null\n$response->completedAt; \u002F\u002F null\n$response->incompleteDetails; \u002F\u002F null\n$response->lastError; \u002F\u002F null\n$response->model; \u002F\u002F 'gpt-4o'\n$response->instructions; \u002F\u002F null\n$response->usage->total_tokens; \u002F\u002F 579\n$response->temperature; \u002F\u002F null\n$response->topP; \u002F\u002F null\n$response->maxPromptTokens; \u002F\u002F 1000\n$response->maxCompletionTokens; \u002F\u002F 1000\n$response->truncationStrategy->type; \u002F\u002F 'auto'\n$response->responseFormat; \u002F\u002F 'auto'\n$response->tools[0]->type; \u002F\u002F 'function'\n$response->toolChoice; \u002F\u002F 'auto'\n$response->metadata; \u002F\u002F []\n\n$response->toArray(); \u002F\u002F ['id' => 'run_4RCYyYzX9m41WQicoJtUQAb8', ...]\n```\n\n#### `list`\n\n列出某个线程下的所有运行记录。\n\n```php\n$response = $client->threads()->runs()->list(\n    threadId: 'thread_tKFLqzRN9n7MnyKKvc1Q7868',\n    parameters: [\n        'limit' => 10,\n    ],\n);\n\n$response->object; \u002F\u002F 'list'\n$response->firstId; \u002F\u002F 'run_4RCYyYzX9m41WQicoJtUQAb8'\n$response->lastId; \u002F\u002F 'run_4RCYyYzX9m41WQicoJtUQAb8'\n$response->hasMore; \u002F\u002F false\n\nforeach ($response->data as $result) {\n    $result->id; \u002F\u002F 'run_4RCYyYZ9m41WQicoJtUQAb8'\n    \u002F\u002F ...\n}\n\n$response->toArray(); \u002F\u002F ['object' => 'list', ...]]\n```\n\n\u003C\u002Fdetails>\n\n\n\n### `线程运行步骤` 资源（已弃用）\n\n> [!WARNING]\n> OpenAI 已弃用 Assistants API，并将于 2026 年 8 月 26 日停止服务。https:\u002F\u002Fplatform.openai.com\u002Fdocs\u002Fguides\u002Fmigrate-to-responses#assistants-api\n\n\u003Cdetails>\n\u003Csummary>线程运行步骤 API 信息\u003C\u002Fsummary>\n\n#### `retrieve`\n\n检索一个运行步骤。\n\n```php\n$response = $client->threads()->runs()->steps()->retrieve(\n    threadId: 'thread_tKFLqzRN9n7MnyKKvc1Q7868',\n    runId: 'run_4RCYyYzX9m41WQicoJtUQAb8',\n    stepId: 'step_1spQXgbAabXFm1YXrwiGIMUz',\n);\n\n$response->id; \u002F\u002F 'step_1spQXgbAabXFm1YXrwiGIMUz'\n$response->object; \u002F\u002F 'thread.run.step'\n$response->createdAt; \u002F\u002F 1699564106\n$response->runId; \u002F\u002F 'run_4RCYyYzX9m41WQicoJtUQAb8'\n$response->assistantId; \u002F\u002F 'asst_gxzBkD1wkKEloYqZ410pT5pd'\n$response->threadId; \u002F\u002F 'thread_tKFLqzRN9n7MnyKKvc1Q7868'\n$response->type; \u002F\u002F 'message_creation'\n$response->status; \u002F\u002F 'completed'\n$response->cancelledAt; \u002F\u002F null\n$response->completedAt; \u002F\u002F 1699564119\n$response->expiresAt; \u002F\u002F null\n$response->failedAt; \u002F\u002F null\n$response->lastError; \u002F\u002F null\n$response->stepDetails->type; \u002F\u002F 'message_creation'\n$response->stepDetails->messageCreation->messageId; \u002F\u002F 'msg_i404PxKbB92d0JAmdOIcX7vA'\n\n$response->toArray(); \u002F\u002F ['id' => 'step_1spQXgbAabXFm1YXrwiGIMUz', ...]\n```\n\n#### `list`\n\n返回属于某个运行的所有运行步骤列表。\n\n```php\n$response = $client->threads()->runs()->steps()->list(\n    threadId: 'thread_tKFLqzRN9n7MnyKKvc1Q7868',\n    runId: 'run_4RCYyYzX9m41WQicoJtUQAb8',\n    parameters: [\n        'limit' => 10,\n    ],\n);\n\n$response->object; \u002F\u002F 'list'\n$response->firstId; \u002F\u002F 'step_1spQXgbAabXFm1YXrwiGIMUz'\n$response->lastId; \u002F\u002F 'step_1spQXgbAabXFm1YXrwiGIMUz'\n$response->hasMore; \u002F\u002F false\n\nforeach ($response->data as $result) {\n    $result->id; \u002F\u002F 'step_1spQXgbAabXFm1YXrwiGIMUz'\n    \u002F\u002F ...\n}\n\n$response->toArray(); \u002F\u002F ['object' => 'list', ...]]\n```\n\n\u003C\u002Fdetails>\n\n### `编辑` 资源（已弃用）\n\n> [!WARNING]\n> OpenAI 已弃用 Edits API，并将于 2024 年 1 月 4 日停止服务。https:\u002F\u002Fopenai.com\u002Fblog\u002Fgpt-4-api-general-availability#deprecation-of-the-edits-api\n\n\u003Cdetails>\n\u003Csummary>编辑 API 信息\u003C\u002Fsummary>\n\n#### `create`\n\n根据提供的输入、指令和参数创建一个新的编辑。\n\n```php\n$response = $client->edits()->create([\n    'model' => 'text-davinci-edit-001',\n    'input' => 'What day of the wek is it?',\n    'instruction' => 'Fix the spelling mistakes',\n]);\n\n$response->object; \u002F\u002F 'edit'\n$response->created; \u002F\u002F 1589478378\n\nforeach ($response->choices as $choice) {\n    $choice->text; \u002F\u002F 'What day of the week is it?'\n    $choice->index; \u002F\u002F 0\n}\n\n$response->usage->promptTokens; \u002F\u002F 25,\n$response->usage->completionTokens; \u002F\u002F 32,\n$response->usage->totalTokens; \u002F\u002F 57\n\n$response->toArray(); \u002F\u002F ['object' => 'edit', ...]\n```\n\n\u003C\u002Fdetails>\n\n### `FineTunes` 资源（已弃用）\n\n> [!WARNING]\n> OpenAI 已弃用 FineTunes API，并将于 2024 年 1 月 4 日停止服务 https:\u002F\u002Fplatform.openai.com\u002Fdocs\u002Fdeprecations#2023-08-22-fine-tunes-endpoint\n\n\u003Cdetails>\n\u003Csummary>FineTunes API 信息\u003C\u002Fsummary>\n\n#### `create`\n\n创建一个作业，从给定的数据集微调指定的模型。\n\n```php\n$response = $client->fineTunes()->create([\n    'training_file' => 'file-ajSREls59WBbvgSzJSVWxMCB',\n    'validation_file' => 'file-XjSREls59WBbvgSzJSVWxMCa',\n    'model' => 'curie',\n    'n_epochs' => 4,\n    'batch_size' => null,\n    'learning_rate_multiplier' => null,\n    'prompt_loss_weight' => 0.01,\n    'compute_classification_metrics' => false,\n    'classification_n_classes' => null,\n    'classification_positive_class' => null,\n    'classification_betas' => [],\n    'suffix' => null,\n]);\n\n$response->id; \u002F\u002F 'ft-AF1WoRqd3aJAHsqc9NY7iL8F'\n$response->object; \u002F\u002F 'fine-tune'\n\u002F\u002F ...\n\n$response->toArray(); \u002F\u002F ['id' => 'ft-AF1WoRqd3aJAHsqc9NY7iL8F', ...]\n```\n\n#### `list`\n\n列出您组织的微调作业。\n\n```php\n$response = $client->fineTunes()->list();\n\n$response->object; \u002F\u002F 'list'\n\nforeach ($response->data as $result) {\n    $result->id; \u002F\u002F 'ft-AF1WoRqd3aJAHsqc9NY7iL8F'\n    $result->object; \u002F\u002F 'fine-tune'\n    \u002F\u002F ...\n}\n\n$response->toArray(); \u002F\u002F ['object' => 'list', 'data' => [...]]\n```\n\n#### `retrieve`\n\n获取微调作业的相关信息。\n\n```php\n$response = $client->fineTunes()->retrieve('ft-AF1WoRqd3aJAHsqc9NY7iL8F');\n\n$response->id; \u002F\u002F 'ft-AF1WoRqd3aJAHsqc9NY7iL8F'\n$response->object; \u002F\u002F 'fine-tune'\n$response->model; \u002F\u002F 'curie'\n$response->createdAt; \u002F\u002F 1614807352\n$response->fineTunedModel; \u002F\u002F 'curie => ft-acmeco-2021-03-03-21-44-20'\n$response->organizationId; \u002F\u002F 'org-jwe45798ASN82s'\n$response->resultFiles; \u002F\u002F [\n$response->status; \u002F\u002F 'succeeded'\n$response->validationFiles; \u002F\u002F [\n$response->trainingFiles; \u002F\u002F [\n$response->updatedAt; \u002F\u002F 1614807865\n\nforeach ($response->events as $result) {\n    $result->object; \u002F\u002F 'fine-tune-event' \n    $result->createdAt; \u002F\u002F 1614807352\n    $result->level; \u002F\u002F 'info'\n    $result->message; \u002F\u002F 'Job enqueued. Waiting for jobs ahead to complete. Queue number =>  0.'\n}\n\n$response->hyperparams->batchSize; \u002F\u002F 4 \n$response->hyperparams->learningRateMultiplier; \u002F\u002F 0.1 \n$response->hyperparams->nEpochs; \u002F\u002F 4 \n$response->hyperparams->promptLossWeight; \u002F\u002F 0.1\n\nforeach ($response->resultFiles as $result) {\n    $result->id; \u002F\u002F 'file-XjGxS3KTG0uNmNOK362iJua3'\n    $result->object; \u002F\u002F 'file'\n    $result->bytes; \u002F\u002F 140\n    $result->createdAt; \u002F\u002F 1613779657\n    $result->filename; \u002F\u002F 'mydata.jsonl'\n    $result->purpose; \u002F\u002F 'fine-tune'\n    $result->status; \u002F\u002F 'succeeded'\n    $result->status_details; \u002F\u002F null\n}\n\nforeach ($response->validationFiles as $result) {\n    $result->id; \u002F\u002F 'file-XjGxS3KTG0uNmNOK362iJua3'\n    \u002F\u002F ...\n}\n\nforeach ($response->trainingFiles as $result) {\n    $result->id; \u002F\u002F 'file-XjGxS3KTG0uNmNOK362iJua3'\n    \u002F\u002F ...\n}\n\n$response->toArray(); \u002F\u002F ['id' => 'ft-AF1WoRqd3aJAHsqc9NY7iL8F', ...]\n```\n\n#### `cancel`\n\n立即取消一个微调作业。\n\n```php\n$response = $client->fineTunes()->cancel('ft-AF1WoRqd3aJAHsqc9NY7iL8F');\n\n$response->id; \u002F\u002F 'ft-AF1WoRqd3aJAHsqc9NY7iL8F'\n$response->object; \u002F\u002F 'fine-tune'\n\u002F\u002F ...\n$response->status; \u002F\u002F 'cancelled'\n\u002F\u002F ...\n\n$response->toArray(); \u002F\u002F ['id' => 'ft-AF1WoRqd3aJAHsqc9NY7iL8F', ...]\n```\n\n#### `list events`\n\n获取微调作业的细粒度状态更新。\n\n```php\n$response = $client->fineTunes()->listEvents('ft-AF1WoRqd3aJAHsqc9NY7iL8F');\n\n$response->object; \u002F\u002F 'list'\n\nforeach ($response->data as $result) {\n    $result->object; \u002F\u002F 'fine-tune-event' \n    $result->createdAt; \u002F\u002F 1614807352\n    \u002F\u002F ...\n}\n\n$response->toArray(); \u002F\u002F ['object' => 'list', 'data' => [...]]\n```\n\n#### `list events streamed`\n\n以流式方式获取微调作业的细粒度状态更新。\n\n```php\n$stream = $client->fineTunes()->listEventsStreamed('ft-y3OpNlc8B5qBVGCCVsLZsDST');\n\nforeach($stream as $response){\n    $response->message;\n}\n\u002F\u002F 第1次迭代 => 'Created fine-tune: ft-y3OpNlc8B5qBVGCCVsLZsDST'\n\u002F\u002F 第2次迭代 => 'Fine-tune costs $0.00'\n\u002F\u002F ...\n\u002F\u002F 第xx次迭代 => 'Uploaded result file: file-ajLKUCMsFPrT633zqwr0eI4l'\n\u002F\u002F 第xx次迭代 => 'Fine-tune succeeded'\n```\n\n\u003C\u002Fdetails>\n\n## 元数据信息\n\n在所有响应对象上，您可以通过 `meta()` 方法访问 API 返回的元数据信息。\n\n```php\n$response = $client->completions()->create([\n    'model' => 'gpt-3.5-turbo-instruct',\n    'prompt' => 'Say this is a test',\n]);\n\n$meta = $response->meta();\n\n$meta->requestId; \u002F\u002F '574a03e2faaf4e9fd703958e4ddc66f5'\n\n$meta->openai->model; \u002F\u002F 'gpt-3.5-turbo-instruct'\n$meta->openai->organization; \u002F\u002F 'org-jwe45798ASN82s'\n$meta->openai->version; \u002F\u002F '2020-10-01'\n$meta->openai->processingMs; \u002F\u002F 425\n\n$meta->requestLimit->limit; \u002F\u002F 3000\n$meta->requestLimit->remaining; \u002F\u002F 2999\n$meta->requestLimit->reset; \u002F\u002F '20ms'\n\n$meta->tokenLimit->limit; \u002F\u002F 250000\n$meta->tokenLimit->remaining; \u002F\u002F 249984\n$meta->tokenLimit->reset; \u002F\u002F '3ms'\n```\n\n`toArray()` 方法会以 API 原始返回的形式返回元数据信息。\n\n```php\n$meta->toArray();\n\n\u002F\u002F [ \n\u002F\u002F   'x-request-id' => '574a03e2faaf4e9fd703958e4ddc66f5',\n\u002F\u002F   'openai-model' => 'gpt-3.5-turbo-instruct',\n\u002F\u002F   'openai-organization' => 'org-jwe45798ASN82s',\n\u002F\u002F   'openai-processing-ms' => 402,\n\u002F\u002F   'openai-version' => '2020-10-01',\n\u002F\u002F   'x-ratelimit-limit-requests' => 3000,\n\u002F\u002F   'x-ratelimit-remaining-requests' => 2999,\n\u002F\u002F   'x-ratelimit-reset-requests' => '20ms',\n\u002F\u002F   'x-ratelimit-limit-tokens' => 250000,\n\u002F\u002F   'x-ratelimit-remaining-tokens' => 249983,\n\u002F\u002F   'x-ratelimit-reset-tokens' => '3ms',\n\u002F\u002F ]\n```\n\n对于流式响应，您可以在响应流对象上访问元数据信息。\n\n```php\n$stream = $client->completions()->createStreamed([\n    'model' => 'gpt-3.5-turbo-instruct',\n    'prompt' => 'Say this is a test',\n]);\n    \n$stream->meta(); \n```\n\n有关速率限制及超出限制时的处理方法，请参阅 [OpenAI 文档](https:\u002F\u002Fplatform.openai.com\u002Fdocs\u002Fguides\u002Frate-limits\u002Frate-limits)。\n\n## 故障排除\n\n### 超时\n\n向 API 发送请求时可能会遇到超时问题。默认超时时间取决于所使用的 HTTP 客户端。\n\n您可以通过配置 HTTP 客户端并将其传递给工厂来增加超时时间。\n\n以下示例说明如何使用 Guzzle 增加超时时间：\n```php\nOpenAI::factory()\n    ->withApiKey($apiKey)\n    ->withOrganization($organization)\n    ->withHttpClient(new \\GuzzleHttp\\Client(['timeout' => $timeout]))\n    ->make();\n```\n\n## 测试\n\n该包提供了一个 `OpenAI\\Client` 类的假实现，允许您模拟 API 响应。\n\n为了测试您的代码，请确保在测试用例中将 `OpenAI\\Client` 类替换为 `OpenAI\\Testing\\ClientFake` 类。\n\n假响应会按照创建假客户端时提供的顺序返回。\n\n所有响应都包含一个 `fake()` 方法，只需提供与您的测试用例相关的参数，即可轻松创建响应对象。\n\n```php\nuse OpenAI\\Testing\\ClientFake;\nuse OpenAI\\Responses\\Completions\\CreateResponse;\n\n$client = new ClientFake([\n    CreateResponse::fake([\n        'choices' => [\n            [\n                'text' => 'awesome!',\n            ],\n        ],\n    ]),\n]);\n\n$completion = $client->completions()->create([\n    'model' => 'gpt-3.5-turbo-instruct',\n    'prompt' => 'PHP is ',\n]);\n\nexpect($completion['choices'][0]['text'])->toBe('awesome!');\n```\n\n对于流式响应，您可以选择提供一个包含假响应数据的资源。\n\n```php\nuse OpenAI\\Testing\\ClientFake;\nuse OpenAI\\Responses\\Chat\\CreateStreamedResponse;\n\n$client = new ClientFake([\n    CreateStreamedResponse::fake(fopen('file.txt', 'r'))\n]);\n\n$completion = $client->chat()->createStreamed([\n    'model' => 'gpt-3.5-turbo',\n    'messages' => [\n        ['role' => 'user', 'content' => 'Hello!'],\n    ],\n]);\n\nexpect($response->getIterator()->current())\n    ->id->toBe('chatcmpl-6yo21W6LVo8Tw2yBf7aGf2g17IeIl');\n```\n\n在发送请求之后，您可以使用多种方法来验证是否发送了预期的请求：\n\n```php\n\u002F\u002F 断言已完成创建请求已发送\n$client->assertSent(Completions::class, function (string $method, array $parameters): bool {\n    return $method === 'create' &&\n        $parameters['model'] === 'gpt-3.5-turbo-instruct' &&\n        $parameters['prompt'] === 'PHP is ';\n});\n\u002F\u002F 或者\n$client->completions()->assertSent(function (string $method, array $parameters): bool {\n    \u002F\u002F ...\n});\n\n\u002F\u002F 断言已发送 2 个完成创建请求\n$client->assertSent(Completions::class, 2);\n\n\u002F\u002F 断言未发送任何完成创建请求\n$client->assertNotSent(Completions::class);\n\u002F\u002F 或者\n$client->completions()->assertNotSent();\n\n\u002F\u002F 断言未发送任何请求\n$client->assertNothingSent();\n```\n\n如果要编写期望 API 请求失败的测试，您可以将一个 `Throwable` 对象作为响应提供。\n\n```php\n$client = new ClientFake([\n    new \\OpenAI\\Exceptions\\ErrorException([\n        'message' => '模型 `gpt-1` 不存在',\n        'type' => 'invalid_request_error',\n        'code' => null,\n    ], 404)\n]);\n\n\u002F\u002F 将抛出 `ErrorException`\n$completion = $client->completions()->create([\n    'model' => 'gpt-3.5-turbo-instruct',\n    'prompt' => 'PHP is ',\n]);\n```\n\n## Webhook\n\n该包包含用于验证 OpenAI Webhook 的签名验证器。要验证传入的 Webhook 请求的签名，可以使用 `OpenAI\\Webhooks\\SignatureVerifier` 类。\n\n```php\nuse OpenAI\\Webhooks\\SignatureVerifier;\nuse OpenAI\\Exceptions\\WebhookVerificationException;\n\n$verifier = new SignatureVerifier('whsec_{your-webhook-signing-secret}');\n\ntry {\n    $verifier->verify($incomingRequest);\n    \n    \u002F\u002F 请求已通过验证\n} catch (WebhookVerificationException $exception) {\n    \u002F\u002F 请求无法验证\n}\n```\n\n## 服务\n\n### Azure\n\n要使用 Azure OpenAI 服务，必须使用工厂手动构建客户端。\n\n```php\n$client = OpenAI::factory()\n    ->withBaseUri('{your-resource-name}.openai.azure.com\u002Fopenai\u002Fdeployments\u002F{deployment-id}')\n    ->withHttpHeader('api-key', '{your-api-key}')\n    ->withQueryParam('api-version', '{version}')\n    ->make();\n```\n\n使用 Azure 时，您需要部署一个由 {deployment-id} 标识的模型，该模型已集成到 API 调用中。因此，在调用时无需再指定模型，因为它已包含在 `BaseUri` 中。\n\n因此，一个基本的完成调用示例如下：\n\n```php\n$result = $client->completions()->create([\n    'prompt' => 'PHP is'\n]);\n``` \n\n---\n\nOpenAI PHP 是一款开源软件，采用 **[MIT 许可证](https:\u002F\u002Fopensource.org\u002Flicenses\u002FMIT)** 许可。","# OpenAI PHP Client 快速上手指南\n\n## 环境准备\n\n- **系统要求**：PHP 8.2 或更高版本\n- **前置依赖**：\n  - [Composer](https:\u002F\u002Fgetcomposer.org\u002F)（PHP 包管理工具）\n  - PSR-18 HTTP 客户端（如未内置，需手动安装，推荐 Guzzle）\n\n> 💡 国内开发者建议使用 Composer 中国镜像加速安装：\n> ```bash\n> composer config -g repo.packagist composer https:\u002F\u002Fmirrors.aliyun.com\u002Fcomposer\u002F\n> ```\n\n## 安装步骤\n\n1. 通过 Composer 安装 OpenAI PHP Client：\n   ```bash\n   composer require openai-php\u002Fclient\n   ```\n\n2. 如果项目中尚未集成 PSR-18 HTTP 客户端，请安装 Guzzle：\n   ```bash\n   composer require guzzlehttp\u002Fguzzle\n   ```\n\n## 基本使用\n\n以下是最简单的调用示例，使用 `gpt-4o` 模型生成回复：\n\n```php\n$yourApiKey = getenv('YOUR_API_KEY');\n$client = OpenAI::client($yourApiKey);\n\n$response = $client->responses()->create([\n    'model' => 'gpt-4o',\n    'input' => 'Hello!',\n]);\n\necho $response->outputText; \u002F\u002F 输出：Hello! How can I assist you today?\n```\n\n### 自定义客户端配置（可选）\n\n如需指定组织、项目、基础 URI 或自定义 HTTP 客户端，可使用工厂模式：\n\n```php\n$yourApiKey = getenv('YOUR_API_KEY');\n\n$client = OpenAI::factory()\n    ->withApiKey($yourApiKey)\n    ->withOrganization('your-organization')\n    ->withProject('Your Project')\n    ->withBaseUri('openai.example.com\u002Fv1')\n    ->withHttpClient(new \\GuzzleHttp\\Client([]))\n    ->make();\n```\n\n> ⚠️ 请将 `YOUR_API_KEY` 替换为你的真实 OpenAI API 密钥，并建议通过环境变量管理敏感信息。","一家电商公司的 PHP 开发团队需要在其后台系统中集成 AI 功能，用于自动生成商品描述并检测用户评论中的违规内容。\n\n### 没有 client 时\n- 开发人员必须手动查阅 OpenAI 官方文档，逐行编写复杂的 cURL 请求代码来处理 HTTP 认证、头信息构造及错误重试逻辑。\n- 每次 API 接口更新或新增功能（如新的模型参数），团队都需要花费大量时间修改底层请求代码，维护成本极高且容易出错。\n- 缺乏统一的类型提示和对象封装，导致处理 JSON 响应时需要频繁进行数组键值检查，代码可读性差且调试困难。\n- 实现文件上传、流式响应或音频处理等高级功能时，需要重复造轮子，严重拖慢了项目迭代速度。\n\n### 使用 client 后\n- 通过 Composer 一键安装即可调用封装好的方法，开发者只需关注业务逻辑，无需关心底层的 HTTP 细节和鉴权流程。\n- 社区持续同步 OpenAI 最新 API 特性，团队可直接使用现成的 `chat()`、`moderations()` 等资源类，零成本适配新功能。\n- 返回数据被自动转换为强类型的 PHP 对象，享受完整的 IDE 智能提示，大幅减少了运行时错误并提升了编码效率。\n- 内置支持文件流、批量任务及向量存储等复杂场景，原本需要数天开发的功能现在几行代码即可稳定运行。\n\nclient 将繁琐的 API 交互转化为简洁优雅的 PHP 代码，让开发团队能专注于构建核心业务价值而非底层通信细节。","https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fopenai-php_client_52f41798.png","openai-php","OpenAI PHP","https:\u002F\u002Foss.gittoolsai.com\u002Favatars\u002Fopenai-php_cc7ca408.png","Makes OpenAI development in PHP more productive and enjoyable.",null,"enunomaduro@gmail.com","enunomaduro","https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient?sponsor=1","https:\u002F\u002Fgithub.com\u002Fopenai-php",[85],{"name":86,"color":87,"percentage":88},"PHP","#4F5D95",100,5763,679,"2026-04-04T01:16:25","MIT","",{"notes":95,"python":93,"dependencies":96},"这是一个 PHP 库而非 Python 工具，因此不需要 GPU、特定内存或 Python 环境。运行需安装 PHP 8.2 及以上版本，并通过 Composer 包管理器安装。项目依赖 PSR-18 标准的 HTTP 客户端（如 Guzzle），若项目中未集成需手动安装。",[97,98,99,100],"PHP >= 8.2","composer","php-http\u002Fdiscovery","PSR-18 HTTP Client (e.g., guzzlehttp\u002Fguzzle)",[13,51,53,26],[103,67,104,105,106,107,108,109,110,111,112,113],"api","codex","gpt-3","language","natural","openai","php","processing","sdk","gpt-4","gpt-5","2026-03-27T02:49:30.150509","2026-04-06T05:15:07.099086",[117,122,127,132,137,142],{"id":118,"question_zh":119,"answer_zh":120,"source_url":121},14443,"在使用流式响应（stream mode）时，输出被缓冲导致无法实时显示内容，如何解决？","这通常是由于 Web 服务器（如 Nginx）或 PHP-FPM 的缓冲设置导致的。解决方案如下：\n1. 对于 Nginx，在站点配置文件的 `location ~ \\.php$` 块中添加以下指令以禁用缓冲：\n   fastcgi_buffering off;\n   fastcgi_buffers 16 16k;\n   fastcgi_buffer_size 32k;\n2. 检查并调整 PHP-FPM 的缓存设置。\n这些配置更改后通常能解决流式输出不流畅的问题。","https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fissues\u002F100",{"id":123,"question_zh":124,"answer_zh":125,"source_url":126},14444,"遇到 'Argument #1 ($attributes) must be of type array, string given' 错误，且 data() 间歇性返回 '404 page not found' 怎么办？","这是一个已知问题，通常发生在旧版本客户端中。根本原因是异常报告机制和响应解析逻辑的缺陷。解决方法是升级到最新版本的 openai-php\u002Fclient（例如 v0.16.1 或更高），新版本已经重构了异常处理和响应解析逻辑，修复了该问题。如果升级后问题依旧，需要提供完整的堆栈跟踪以便进一步排查。","https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fissues\u002F478",{"id":128,"question_zh":129,"answer_zh":130,"source_url":131},14445,"如何使用该库实现结构化输出（Structured Outputs \u002F json_schema）？","该库支持通过新的 Responses API 实现结构化输出。你可以使用 `json_schema` 格式定义输出结构。示例代码如下：\n$client->responses()->create([\n    'model' => 'gpt-4o-2024-08-06',\n    'input' => 'how can I solve 8x + 7 = -23',\n    'text' => [\n        'format' => [\n            'type' => 'json_schema',\n            'name' => 'math_response',\n            'schema' => [\n                'type' => 'object',\n                'properties' => [\n                    'steps' => [\n                        'type' => 'array',\n                        'items' => [\n                            'type' => 'object',\n                            'properties' => [\n                                'explanation' => ['type' => 'string'],\n                                'output' => ['type' => 'string']\n                            ]\n                        ]\n                    ]\n                ]\n            ]\n        ]\n    ]\n]);\n此外，可以使用第三方库（如 spiral\u002Fjson-schema-generator）从 DTO 生成 JSON Schema。","https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fissues\u002F464",{"id":133,"question_zh":134,"answer_zh":135,"source_url":136},14446,"当前库是否支持 Assistant API v2 版本及新特性（如 tool_resources）？","早期版本仅支持遗留的 v1 版本。如果遇到无法使用 `tool_resources` 等新字段的问题，请确保你使用的是最新的 Laravel Client (v0.10.0-beta.2 或更高) 或其他客户端的最新版本，维护者已在新版本中修复了请求头仍使用 v1 的问题。由于 OpenAI API 更新频繁，建议始终将库升级到最新版本以获得对新特性的支持。","https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fissues\u002F381",{"id":138,"question_zh":139,"answer_zh":140,"source_url":141},14447,"调用 MCP (Model Context Protocol) 或相关工具时出现 'approvalAttributes must be of type array, null given' 错误？","这是由于处理审批（approvals）属性时的类型检查过于严格导致的。该问题已在后续版本中得到关注和修复。如果遇到此类错误，特别是涉及 `RemoteMcpTool` 时，请尝试升级到最新的开发版或等待下一个稳定版发布。维护者表示相关功能（如 Conversation API）已合并到主分支并趋于稳定，即将发布新版本包含这些修复。","https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fissues\u002F666",{"id":143,"question_zh":144,"answer_zh":145,"source_url":146},14448,"图片生成模型（如 gpt-image-1）的支持情况如何？","该库已确认支持新的图片模型及相关功能。之前存在的关于验证组织、参数错误或图片格式的问题均已修复。如果在生成或编辑图片时遇到问题，请检查是否使用了正确的参数格式，并确保使用的是最新版本的客户端。新的 API 返回的使用量数据（usage data）也已在最近的 PR 中被添加支持。","https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fissues\u002F565",[148,153,158,163,168,173,178,183,188,193,198,203,208,213,218,223,228,233,238,243],{"id":149,"version":150,"summary_zh":151,"released_at":152},81336,"v0.19.1","## 变更内容\n* 修复 README.md 示例代码中的语法错误，由 @simonschaufi 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F741 中完成\n* 修复：为兼容 Mistral，默认将工具调用类型设置为函数，由 @ivanmestre 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F744 中完成\n* 向 `OutputImageGenerationToolCall` 添加缺失字段，由 @Androbin 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F742 中完成\n* 新增功能：修复文件缺少过期时间的问题，由 @madskildegaard 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F746 中完成\n* 修复：向量存储描述，由 @madskildegaard 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F747 中完成\n* 修复：向量存储文件合约中缺少 updateAttributes 函数的问题，由 @madskildegaard 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F748 中完成\n* 杂项：按照现代 Pint 默认格式进行代码格式化，由 @iBotPeaches 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F750 中完成\n* 发布：v0.19.1，由 @iBotPeaches 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F749 中完成\n\n## 新贡献者\n* @simonschaufi 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F741 中完成了首次贡献\n* @ivanmestre 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F744 中完成了首次贡献\n* @Androbin 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F742 中完成了首次贡献\n\n**完整变更日志**：https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fcompare\u002Fv0.19.0...v0.19.1","2026-03-17T20:54:33",{"id":154,"version":155,"summary_zh":156,"released_at":157},81337,"v0.19.0","## 变更内容\n* 功能：由 @madskildegaard 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F711 中实现的响应流式传输类型\n* 添加 `response.queued` 事件到 CreateStreamedResponse，由 @boboldehampsink 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F712 中完成\n* 实现响应的流式获取，由 @boboldehampsink 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F713 中完成\n* 构建（核心）：在 PHP 8.5 上进行测试，由 @iBotPeaches 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F714 中完成\n* 构建（依赖）：将 actions\u002Fcheckout 从版本 5 升级到 6，由 @dependabot[bot] 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F716 中完成\n* 修复：列出对话中的项目时，API 响应中 `file_id` 为 null 且 `file_data` 不存在的问题，由 @romainnorberg 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F715 中修复\n* 添加图像流式支持，由 @boboldehampsink 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F720 中完成\n* 功能：添加 Webhook 签名验证功能，由 @Radiergummi 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F722 中完成\n* 构建（依赖）：将 actions\u002Fcache 从版本 4 升级到 5，由 @dependabot[bot] 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F724 中完成\n* Responses\\CreateResponseType 的可选值未被正确处理，由 @bbrala 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F728 中修复\n* 修复（OpenAI）：为网络搜索结果缺少 `url` 字段的情况添加支持，由 @iBotPeaches 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F733 中完成\n* 修复（OpenAI）：添加对空 `keepalive` 流事件的支持，由 @iBotPeaches 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F734 中完成\n* 修复（OpenAI）：仅在 JSON 解析出错时才提前退出，而非直接针对 text\u002Fplain 类型响应，由 @iBotPeaches 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F736 中完成\n* 功能：在 CreateResponseMessage 中添加 reasoning_content 字段，由 @Kemel91 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F737 中完成\n* 发布：v0.19.0，由 @iBotPeaches 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F740 中发布\n\n## 新贡献者\n* @madskildegaard 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F711 中完成了首次贡献\n* @boboldehampsink 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F712 中完成了首次贡献\n* @romainnorberg 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F715 中完成了首次贡献\n* @Radiergummi 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F722 中完成了首次贡献\n* @bbrala 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F728 中完成了首次贡献\n* @Kemel91 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F737 中完成了首次贡献\n\n**完整变更日志**：https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fcompare\u002Fv0.18.0...v0.19.0","2026-02-10T11:16:48",{"id":159,"version":160,"summary_zh":161,"released_at":162},81338,"v0.18.0","## 变更内容\n* 功能\u002Fnano banana，由 @nmdimas 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F685 中提交\n* 修复：容器文件注解中缺少属性，由 @knash94 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F703 中提交\n* 功能：为客户端添加容器接口，由 @knash94 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F704 中提交\n* 修复：允许 ContainerFileResponse 中的 bytes 属性为 null，由 @knash94 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F705 中提交\n* 修复（OpenAI）：在 TranscriptionResponseSegment 中处理带区分发言人的 JSON 响应，由 @olivier-drieux 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F706 中提交\n* 功能（OpenAI）：为 web_search_call 添加操作支持，由 @iBotPeaches 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F707 中提交\n* 功能：为流式完成结果添加用量信息，由 @math625f 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F708 中提交\n* [发布] v0.18.0，由 @iBotPeaches 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F710 中提交\n\n## 新贡献者\n* @nmdimas 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F685 中完成了首次贡献\n* @olivier-drieux 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F706 中完成了首次贡献\n* @math625f 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F708 中完成了首次贡献\n\n**完整变更日志**：https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fcompare\u002Fv0.17.1...v0.18.0","2025-10-31T19:00:03",{"id":164,"version":165,"summary_zh":166,"released_at":167},81339,"v0.17.1","## 变更内容\n* 在 OutputMessageContentOutputTextAnnotationsF… 中添加 `filename` 属性，由 @qwertyquest 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F696 中完成\n* chore(OpenAI)：统一文件引用对象的类型定义，由 @iBotPeaches 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F698 中完成\n* fix(OpenAI)：将 OpenAI-Beta 标记应用于所有 Assistant 类型资源，由 @iBotPeaches 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F701 中完成\n* release：v0.17.1，由 @iBotPeaches 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F702 中发布\n\n## 新贡献者\n* @qwertyquest 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F696 中完成了首次贡献\n\n**完整变更日志**：https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fcompare\u002Fv0.17.0...v0.17.1","2025-10-09T10:37:01",{"id":169,"version":170,"summary_zh":171,"released_at":172},81340,"v0.17.0","## 变更内容\n* chore(OpenAI)：由 @iBotPeaches 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F679 中正式弃用 Assistants API\n* 将 @iBotPeaches 添加到 README 中的推荐赞助人列表中，由 @ianhawes 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F677 中完成\n* fix(OpenAI)：添加健壮的 ErrorException 来处理对象或字符串形式的错误响应。由 @iBotPeaches 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F682 中完成\n* feat(OpenAI)：添加 Conversation API，由 @iBotPeaches 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F658 中完成\n* fix(Doubao)：提高图像使用类型中的可空性，由 @iBotPeaches 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F684 中完成\n* fix(OpenAI)：为 files.list 方法添加缺失的分页字段，由 @iBotPeaches 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F687 中完成\n* 修复 xAI Responses API 的未定义数组键错误，由 @dnnp2011 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F689 中完成\n* fix(OpenAI)：防止在所有请求上注册头部信息，由 @iBotPeaches 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F688 中完成\n* 更新 README.md，由 @carvemerson 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F691 中完成\n* 发布：v0.17.0，由 @iBotPeaches 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F694 中完成\n\n## 新贡献者\n* @ianhawes 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F677 中完成了首次贡献\n* @dnnp2011 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F689 中完成了首次贡献\n* @carvemerson 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F691 中完成了首次贡献\n\n**完整变更日志**：https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fcompare\u002Fv0.16.1...v0.17.0","2025-10-02T10:30:46",{"id":174,"version":175,"summary_zh":176,"released_at":177},81341,"v0.16.1","## 变更内容\n* 由 @louisbels 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F662 中实现：在 CreateResponse 中处理可选属性\n* 由 @e4se 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F664 中实现：为 `OutputTextDelta` 添加 `sequence_number` 支持\n* 修复（OpenAI）：支持响应 API 中的 mcp 错误对象，由 @iBotPeaches 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F661 中完成\n* 新特性：托管工具选择网络搜索功能，由 @ymktmk 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F665 中实现\n* 修复（OpenAI）：为 ListInputItems 调用添加缺失的属性，由 @iBotPeaches 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F668 中完成\n* 修复（OpenAI）：处理响应 API 中的 null 型 require_approval 字段，由 @iBotPeaches 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F669 中完成\n* 修复（OpenAI）：支持嵌套的文件搜索属性，由 @iBotPeaches 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F670 中完成\n* 重构（meta）：将响应类型统一为 Actions，由 @iBotPeaches 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F671 中完成\n* 添加对推理文本流式事件的支持，由 @louisbels 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F673 中实现\n* 修复测试数据中的拼写错误，并移除 ThreadRunStreamResponseFixture.txt 中 JSON 键的多余空格，由 @ruslan-polutsygan 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F674 中完成\n* 发布：v0.16.1，由 @iBotPeaches 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F676 中完成\n\n## 新贡献者\n* @louisbels 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F662 中完成了首次贡献\n* @e4se 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F664 中完成了首次贡献\n* @ymktmk 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F665 中完成了首次贡献\n* @ruslan-polutsygan 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F674 中完成了首次贡献\n\n**完整变更日志**：https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fcompare\u002Fv0.16.0...v0.16.1","2025-09-04T14:33:16",{"id":179,"version":180,"summary_zh":181,"released_at":182},81342,"v0.16.0","## 变更内容\n* 功能(OpenAI)：@iBotPeaches 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F639 中添加了对 GPT5 的支持\n* 修复(OpenAI)：@iBotPeaches 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F642 中增加了对 reasoning.summary 的支持\n* #581：为 fakeable trait 添加 `OverrideStrategy` 枚举，以支持合并\u002F替换操作，由 @droath 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F646 中完成\n* 杂项(meta)：@iBotPeaches 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F643 中重构了异常处理逻辑\n* 功能(OpenAI)：@iBotPeaches 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F648 中新增了容器文件 API\n* 修复(meta)：@iBotPeaches 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F649 中在 ErrorException 中使用原始响应\n* 杂项(meta)：@iBotPeaches 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F650 中改用 pest 的 throws 方法，取代 PHPunit 内置方法\n* 修复(OpenAI)：@iBotPeaches 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F651 中支持包含失败微调作业的微调功能\n* 修复(meta)：@iBotPeaches 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F652 中优雅地处理 429（速率限制）错误\n* 修复(OpenAI)：@iBotPeaches 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F654 中增强了对 Response API - MCP Connectors 的支持\n* 构建(deps)：@dependabot[bot] 将 actions\u002Fcheckout 从版本 4 升级到 5，详见 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F657\n* 发布：v0.16.0，由 @iBotPeaches 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F659 中完成\n\n## 新贡献者\n* @droath 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F646 中完成了首次贡献\n* @dependabot[bot] 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F657 中完成了首次贡献\n\n**完整变更日志**：https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fcompare\u002Fv0.15.0...v0.16.0","2025-08-26T12:29:24",{"id":184,"version":185,"summary_zh":186,"released_at":187},81343,"v0.15.0","## 变更内容\n* 修复(VLLM)：由 @L3o-pold 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F623 中修复的无参数工具调用流式响应问题\n* 文档：由 @princeaden1 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F625 中添加的使用图片 URL 的视觉示例\n* 功能(OpenAI)：由 @Bombaninha 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F626 中为 VectorStoresFiles 添加的 updateAttributes 方法\n* 修复：由 @aleksandar-mitrev 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F628 中添加 JSON_UNESCAPED_UNICODE 以保留 UTF-8 字符\n* 功能(OpenAI)：由 @iBotPeaches 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F629 中添加的对聊天完成音频模态的支持\n* 更新 README.md：由 @themiladmirza 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F630 中完成\n* 修复(OpenAI)：由 @iBotPeaches 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F632 中实现的在检索响应中支持 'code_interpreter_call' 功能\n* 构建(meta)：由 @iBotPeaches 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F633 中添加并行构建流程\n* 为嵌入的 CreateResponse 添加 model 字段：由 @bemtorres 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F634 中完成\n* 功能(OpenAI)：由 @iBotPeaches 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F636 中添加 Containers API\n* 发布：v0.15.0 版本，由 @iBotPeaches 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F637 中发布\n\n## 新贡献者\n* @L3o-pold 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F623 中完成了首次贡献\n* @princeaden1 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F625 中完成了首次贡献\n* @Bombaninha 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F626 中完成了首次贡献\n* @aleksandar-mitrev 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F628 中完成了首次贡献\n* @themiladmirza 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F630 中完成了首次贡献\n* @bemtorres 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F634 中完成了首次贡献\n\n**完整变更日志**：https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fcompare\u002Fv0.14.0...v0.15.0","2025-08-04T17:55:57",{"id":189,"version":190,"summary_zh":191,"released_at":192},81344,"v0.14.0","## 变更内容\n* 功能（OpenAI）- @iBotPeaches 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F579 中为 Responses API 添加辅助方法 'output_text'\n* 修复（OpenAI）- @clementmas 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F562 中为 CreateStreamedResponseToolCall 添加索引\n* 修复（OpenAI）：@erdiarikan 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F577 中指出，线程的 'create' 方法中 $parameters 数组并非必填项\n* 功能（OpenAI）：@iBotPeaches 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F588 中添加对响应取消的支持\n* 修复（OpenAI）：@iBotPeaches 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F592 中为响应取消功能添加测试\n* 功能（OpenAI）- @iBotPeaches 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F594 中添加对图像生成工具（Responses）的支持\n* 测试（OpenAI）：@iBotPeaches 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F593 中增强了 Responses API 上 fake() 方法的测试\n* 功能（OpenAI）：@iBotPeaches 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F591 中引入实时临时令牌\n* 文档（OpenAI）：@iBotPeaches 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F596 中为 Responses API 使用正确的标题标注\n* 文档（OpenAI）：@iBotPeaches 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F597 中添加实时密钥的相关文档\n* 修复（Azure）：@iBotPeaches 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F599 中支持 Azure 的 model.list 接口\n* 功能（OpenAI）：@iBotPeaches 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F602 中为 ImageGeneration（Responses API）添加流式传输支持\n* 功能（OpenAI）：@trandbert37 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F601 中添加对远程 MCP 工具的支持\n* 功能（OpenAI）：@iBotPeaches 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F603 中为转录功能添加流式传输支持\n* 修复（OpenAI）：@iBotPeaches 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F606 中为 Assistants 添加 reasoningEffort 支持\n* 文档（OpenAI）：@iBotPeaches 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F607 中弃用 Assistants API\n* 文档（OpenAI）：@iBotPeaches 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F608 中将 Completions 标记为旧版\n* 文档（OpenAI）：@iBotPeaches 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F609 中默认收起旧版\u002F已弃用部分\n* 功能（OpenAI）：@iBotPeaches 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F610 中为 Responses 添加 '代码解释器' 支持\n* 杂项（OpenAI）修复：@iBotPeaches 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F615 中为 Response 构造函数使用正确的参数顺序\n* 修复（OpenAI）：@iBotPeaches 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F616 中支持在 Responses 中重复使用提示\u002F指令\n* 发布：v0.14.0 - @iBotPeaches 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F617 中完成\n\n## 新贡献者\n* @clementmas 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F562 中做出了首次贡献\n* @erdiarikan 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F577 中做出了首次贡献\n* @trandbert37 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F601 中做出了首次贡献\n\n**完整变更日志**","2025-06-24T10:50:57",{"id":194,"version":195,"summary_zh":196,"released_at":197},81345,"v0.13.0","## 变更内容\n* 由 @GrahamCampbell 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F575 中修正了 README，以符合当前的 PHP 版本要求。\n* 修复：由 @adrmrn 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F576 中为 ClientFake 的响应注解添加了 Throwable 类型。\n* 增加对 Responses API 的支持，由 @momostafa 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F541 中完成。\n* 文档更新：更新变更日志（v0.11.2 至 v0.13.0），由 @iBotPeaches 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F578 中完成。\n\n## 新贡献者\n* @adrmrn 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F576 中完成了首次贡献。\n* @momostafa 在 https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F541 中完成了首次贡献。\n\n**完整变更日志**：https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fcompare\u002Fv0.12.0...v0.13.0","2025-05-14T21:47:33",{"id":199,"version":200,"summary_zh":201,"released_at":202},81346,"v0.12.0","## What's Changed\r\n* Update README.md by @gauztech in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F505\r\n* Correct GitHub Action deprecations + Opt into Dependabot by @iBotPeaches in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F544\r\n* Fix type definition for responses in ClientFake::addResponses method by @ovitores in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F382\r\n* Fix Content retrieval in HttpTransport with custom HttpClient by @martinhoch42 in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F343\r\n* build: remove prestissimo (unneeded in composer: v2) by @iBotPeaches in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F547\r\n* docs: draw attention away from deprecated completions endpoints by @iBotPeaches in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F548\r\n* Chat Response: Add logprobs by @klmork in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F533\r\n* fix: correct completion endpoint when logprobs missing by @iBotPeaches in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F550\r\n* add ResponseHasMetaInformationContract contract to ThreadRunStepResponse by @gareth-civia in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F523\r\n* feat: support 'attributes' on vector store files by @iBotPeaches in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F551\r\n* feat: add OpenAI compatibility support for Google Gemini by @TyperEJ in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F502\r\n* fix: chat completion choices to allow responses without logprobs field by @TyperEJ in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F554\r\n* Testing - Add test coverage for assistants streaming and ability to u… by @knash94 in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F444\r\n* Update gpt-4 to gpt-4o on readme by @trippo in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F427\r\n* fix: Support streaming of non-OpenAI models that return \"ping\" by @iBotPeaches in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F556\r\n* Add compatibility for aliyun LLM APIs by @ThorbJ in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F530\r\n* Allow arguments to be passed to files list request by @assertchris in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F557\r\n* Search vector store by @lukalocniskar in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F559\r\n* OpenRouter: Fix token usage response by @lukalocniskar in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F560\r\n* Fix gemini list models by @the-fermi-paradox in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F567\r\n* feat(OpenAI): Add Image Response usage by @abikali in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F571\r\n* feat(OpenAI): Add category applied input types to moderation response by @Mcainson in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F572\r\n* feat(OpenAI): Support annotations in Chat response. (Web Search) by @Saraphoo in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F564\r\n\r\n## New Contributors\r\n* @gauztech made their first contribution in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F505\r\n* @ovitores made their first contribution in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F382\r\n* @martinhoch42 made their first contribution in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F343\r\n* @klmork made their first contribution in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F533\r\n* @gareth-civia made their first contribution in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F523\r\n* @ThorbJ made their first contribution in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F530\r\n* @assertchris made their first contribution in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F557\r\n* @lukalocniskar made their first contribution in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F559\r\n* @the-fermi-paradox made their first contribution in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F567\r\n* @abikali made their first contribution in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F571\r\n* @Mcainson made their first contribution in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F572\r\n* @Saraphoo made their first contribution in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F564\r\n\r\n**Full Changelog**: https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fcompare\u002Fv0.10.3...v0.12.0","2025-05-04T13:55:39",{"id":204,"version":205,"summary_zh":206,"released_at":207},81347,"v0.11.0","## What's Changed\r\n* Update README.md by @gauztech in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F505\r\n* Correct GitHub Action deprecations + Opt into Dependabot by @iBotPeaches in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F544\r\n* Fix type definition for responses in ClientFake::addResponses method by @ovitores in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F382\r\n* Fix Content retrieval in HttpTransport with custom HttpClient by @martinhoch42 in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F343\r\n* build: remove prestissimo (unneeded in composer: v2) by @iBotPeaches in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F547\r\n* docs: draw attention away from deprecated completions endpoints by @iBotPeaches in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F548\r\n* Chat Response: Add logprobs by @klmork in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F533\r\n* fix: correct completion endpoint when logprobs missing by @iBotPeaches in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F550\r\n* add ResponseHasMetaInformationContract contract to ThreadRunStepResponse by @gareth-civia in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F523\r\n* feat: support 'attributes' on vector store files by @iBotPeaches in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F551\r\n* feat: add OpenAI compatibility support for Google Gemini by @TyperEJ in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F502\r\n* fix: chat completion choices to allow responses without logprobs field by @TyperEJ in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F554\r\n* Testing - Add test coverage for assistants streaming and ability to u… by @knash94 in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F444\r\n* Update gpt-4 to gpt-4o on readme by @trippo in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F427\r\n* fix: Support streaming of non-OpenAI models that return \"ping\" by @iBotPeaches in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F556\r\n* Add compatibility for aliyun LLM APIs by @ThorbJ in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F530\r\n* Allow arguments to be passed to files list request by @assertchris in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F557\r\n* Search vector store by @lukalocniskar in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F559\r\n* OpenRouter: Fix token usage response by @lukalocniskar in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F560\r\n* Fix gemini list models by @the-fermi-paradox in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F567\r\n* feat(OpenAI): Add Image Response usage by @abikali in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F571\r\n* feat(OpenAI): Add category applied input types to moderation response by @Mcainson in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F572\r\n* feat(OpenAI): Support annotations in Chat response. (Web Search) by @Saraphoo in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F564\r\n\r\n## New Contributors\r\n* @gauztech made their first contribution in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F505\r\n* @ovitores made their first contribution in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F382\r\n* @martinhoch42 made their first contribution in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F343\r\n* @klmork made their first contribution in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F533\r\n* @gareth-civia made their first contribution in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F523\r\n* @ThorbJ made their first contribution in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F530\r\n* @assertchris made their first contribution in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F557\r\n* @lukalocniskar made their first contribution in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F559\r\n* @the-fermi-paradox made their first contribution in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F567\r\n* @abikali made their first contribution in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F571\r\n* @Mcainson made their first contribution in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F572\r\n* @Saraphoo made their first contribution in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F564\r\n\r\n**Full Changelog**: https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fcompare\u002Fv0.10.3...v0.11.0","2025-05-04T13:38:18",{"id":209,"version":210,"summary_zh":211,"released_at":212},81348,"v0.10.3","## What's Changed\r\n* Hotfixing missing array keys by @pc-magas in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F496\r\n* Finetuning job response: error is sometimes present but empty by @gehrisandro in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F499\r\n* Moderation Omni - New Categories (Illicit*) support. by @iBotPeaches in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F495\r\n* fix: add missing properties (specially `cached_usage`) to chat `CreateResponseUsage` by @IsraelOrtuno in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F494\r\n* HTTP status in ErrorException by @GuidoBelluomo in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F487\r\n* Changed type of the description prop to nullable by @smskin in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F484\r\n* Avoid naming confusion of variables by @charescape in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F482\r\n* Fix 'attachments' key exception on thread message modify by @datashaman in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F471\r\n\r\n## New Contributors\r\n* @pc-magas made their first contribution in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F496\r\n* @IsraelOrtuno made their first contribution in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F494\r\n* @GuidoBelluomo made their first contribution in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F487\r\n* @smskin made their first contribution in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F484\r\n* @charescape made their first contribution in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F482\r\n* @datashaman made their first contribution in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F471\r\n\r\n**Full Changelog**: https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fcompare\u002Fv0.10.2...v0.10.3","2024-11-12T21:06:56",{"id":214,"version":215,"summary_zh":216,"released_at":217},81349,"v0.10.2","## What's Changed\r\n* Added thread.run.incomplete into ThreadRunStreamResponse list of responses by @SovjakMartin in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F421\r\n* update: Remove beta tag from readme by @knash94 in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F423\r\n* fix: Update image url content type to use url instead of file id by @knash94 in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F422\r\n* Added `withProject` method to set project for requests by @ManukMinasyan in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F377\r\n* Fixes typos by @ordago in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F448\r\n* Add fake 64_json string to test image response by @JanSuthacheeva in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F462\r\n* Fix TypeError in VectorStoresFilesTestResource and VectorStoresFileBatchesTestResource by @mayconmedeiroz in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F460\r\n* docs: Add stream_options.include_usage property to chat completions documentation by @alirezaImani-f4L3e in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F439\r\n* fix: vector stores file batch cancel payload by @TyperEJ in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F435\r\n* Fixed typo \"refactor\" by @RahulDey12 in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F428\r\n\r\n## New Contributors\r\n* @SovjakMartin made their first contribution in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F421\r\n* @knash94 made their first contribution in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F423\r\n* @ManukMinasyan made their first contribution in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F377\r\n* @JanSuthacheeva made their first contribution in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F462\r\n* @mayconmedeiroz made their first contribution in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F460\r\n* @alirezaImani-f4L3e made their first contribution in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F439\r\n* @TyperEJ made their first contribution in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F435\r\n* @RahulDey12 made their first contribution in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F428\r\n\r\n**Full Changelog**: https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fcompare\u002Fv0.10.1...v0.10.2","2024-10-17T20:30:13",{"id":219,"version":220,"summary_zh":221,"released_at":222},81350,"v0.10.1","## What's Added\r\n* Implement vector store endpoints and add assistants API v2 support by @gehrisandro in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F420\r\n* Add thread messages delete by @gehrisandro in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F418\r\n\r\n## What's Changed\r\n* Remove inaccurate comment by @sebapastore in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F413\r\n* fix: expect delta to not exist by @beliven-daniele-sarnari in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F408\r\n* Fix faking response metadata by @gehrisandro in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F414\r\n\r\n## New Contributors\r\n* @sebapastore made their first contribution in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F413\r\n* @beliven-daniele-sarnari made their first contribution in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F408\r\n\r\n**Full Changelog**: https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fcompare\u002Fv0.9.2...v0.10.1","2024-06-06T20:29:47",{"id":224,"version":225,"summary_zh":226,"released_at":227},81351,"v0.10.0-beta.1","## What's New\r\n* Implement vector store endpoints and add assistants API v2 support by @gehrisandro and @knash94  in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F405\r\n\r\n\r\n## New Contributors\r\n* @knash94 made their first contribution in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F405\r\n\r\n\r\n**Full Changelog**: https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fcompare\u002Fv0.9.2...v0.10.0-beta.1","2024-05-27T19:58:58",{"id":229,"version":230,"summary_zh":231,"released_at":232},81352,"v0.9.2","## What's New\r\n* Add streamed response usage by @punyflash and @gehrisandro in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F398\r\n \r\n## What's Fixed\r\n* Fix missing output parameter on streamed code interpreter outputs by @gehrisandro in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F406\r\n\r\n## New Contributors\r\n* @punyflash made their first contribution in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F398\r\n\r\n**Full Changelog**: https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fcompare\u002Fv0.9.1...v0.9.2","2024-05-27T19:28:54",{"id":234,"version":235,"summary_zh":236,"released_at":237},81353,"v0.9.1","## What's Changed\r\n* Add batches API endpoint by @gehrisandro and @The-LoneWolf in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F403\r\n\r\n\r\n**Full Changelog**: https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fcompare\u002Fv0.9.0...v0.9.1","2024-05-24T21:39:16",{"id":239,"version":240,"summary_zh":241,"released_at":242},81354,"v0.9.0","## What's Changed\r\n* Implement Assistants Streaming by @EthanBarlo and @gehrisandro in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F367\r\n* Fix incorrect response variable for assistant streaming by @robbie-thompson in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F393\r\n* Handle missing attributes for assistant streaming by @robbie-thompson in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F392\r\n\r\n## New Contributors\r\n* @EthanBarlo made their first contribution in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F367\r\n* @robbie-thompson made their first contribution in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F393\r\n\r\n**Full Changelog**: https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fcompare\u002Fv0.8.5...v0.9.0","2024-05-21T18:51:52",{"id":244,"version":245,"summary_zh":246,"released_at":247},81355,"v0.8.5","## What's New\r\n* Audio: add support for timestamp_granularities by @gehrisandro in https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fpull\u002F374\r\n\r\n\r\n**Full Changelog**: https:\u002F\u002Fgithub.com\u002Fopenai-php\u002Fclient\u002Fcompare\u002Fv0.8.4...v0.8.5","2024-04-15T19:13:53"]