Skip to content

Add support for Responses API #541

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 66 commits into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from 51 commits
Commits
Show all changes
66 commits
Select commit Hold shift + click to select a range
d9f8bbb
Add support for Responses API
momostafa Mar 22, 2025
3cea3dc
Updated miss placed files that occurred during first upload
momostafa Mar 25, 2025
99a3ed5
Heavy refactoring to match codebase pattern, added testing files
momostafa Mar 27, 2025
8ea527a
fixed some phpstan errors
momostafa Mar 31, 2025
412f35c
fixing minor bugs after live testing now all models work during live …
momostafa Mar 31, 2025
2c4c3fb
Merge branch 'openai-php:main' into dev
momostafa Apr 1, 2025
29436e8
Fixed lint errors
momostafa Apr 4, 2025
63c8c7c
Merge branch 'dev' of github.com:momostafa/openai-client into dev
momostafa Apr 4, 2025
dd263ac
Fixed all PHPStan Errors and all other tests Pass 100%
momostafa Apr 6, 2025
5585119
Completed missing Tests, Created ClientFakeResponses, Modified Fakeable
momostafa Apr 11, 2025
caf4413
Updated Test files, Fixed Lint errors, all tests pass except test:unit
momostafa Apr 13, 2025
a8d5ac9
chore: remove log file
iBotPeaches Apr 13, 2025
780ce1a
chore: pint
iBotPeaches Apr 13, 2025
fa48f22
chore: inline Responses doc to readme
iBotPeaches Apr 13, 2025
f41bec2
Merge remote-tracking branch 'upstream/main' into dev
iBotPeaches Apr 13, 2025
b1f5217
chore: align client contract to pattern
iBotPeaches Apr 13, 2025
dc444b8
docs: re-order chat/completion
iBotPeaches Apr 14, 2025
69c7a13
fix: use longer replacement to not clobber Responses/*
iBotPeaches Apr 14, 2025
1f68d23
fix: parse metadata (optionally)
iBotPeaches Apr 15, 2025
5c28547
test: don't assert on plain arrays
iBotPeaches Apr 15, 2025
3bc814b
test: assert stream properly on responses
iBotPeaches Apr 15, 2025
d533727
chore: add missing docblock property
iBotPeaches Apr 15, 2025
b982826
fix: add metadata into Responses payload
iBotPeaches Apr 15, 2025
779446e
test: fix double nesting on delete attrs
iBotPeaches Apr 15, 2025
56dd359
test: correct bad assertions on tests
iBotPeaches Apr 15, 2025
bec19fb
fix: remove ResponseObject
iBotPeaches Apr 15, 2025
18bf40e
feat: split out usage into classes
iBotPeaches Apr 15, 2025
e9d3d95
feat: split out error into classes
iBotPeaches Apr 15, 2025
b21aca2
Merge remote-tracking branch 'origin/main' into dev
iBotPeaches Apr 15, 2025
d06d33b
feat: split out incomplete_details into classes
iBotPeaches Apr 15, 2025
5792dea
chore(wip): introduction of 'output' typing
iBotPeaches Apr 15, 2025
7fff62e
fix: correct OutputMessageContentOutputText + child classes
iBotPeaches Apr 16, 2025
d8ce1a6
OutputMessage
iBotPeaches Apr 16, 2025
b9db0a1
chore: continued work on output message
iBotPeaches Apr 16, 2025
26990e2
chore: start of ComputerToolActions
iBotPeaches Apr 16, 2025
4dda791
feat: complete "computer tool call"
iBotPeaches Apr 16, 2025
c9c5a56
fix: add response contract to existing classes
iBotPeaches Apr 16, 2025
501d61f
fix: more fixes to typing on CreateResponse
iBotPeaches Apr 16, 2025
314e189
feat: add 'reasoning' prop for response
iBotPeaches Apr 16, 2025
63f6c10
feat: add 'text' (format) to create
iBotPeaches Apr 17, 2025
788752b
feat: add 'tool_choice'
iBotPeaches Apr 17, 2025
8798fbf
fix: add 'truncation'
iBotPeaches Apr 17, 2025
5181077
feat: add tool: FileSearch response
iBotPeaches Apr 17, 2025
219c6b8
feat: add tool: FunctionTool response
iBotPeaches Apr 17, 2025
0701c15
feat: add tool 'ComputerUse'
iBotPeaches Apr 17, 2025
e56f9e9
fix: wire up 'tools' to CreateResponse
iBotPeaches Apr 17, 2025
e811af7
Added InputMessage types, refactored ListInputItems
momostafa Apr 20, 2025
2c7f014
Merge branch 'dev' of github.com:momostafa/openai-client into dev
momostafa Apr 20, 2025
323b5a4
Merge branch 'openai-php:main' into dev
momostafa Apr 20, 2025
2952a02
Merge branch 'dev' of github.com:momostafa/openai-client into dev
momostafa Apr 20, 2025
efeb8d7
Corrected some properties to use camelCase
momostafa Apr 20, 2025
1d20ee8
fix: cleanup docblock on CreateResponse
iBotPeaches Apr 21, 2025
96c7fa0
chore: remove unused test response object
iBotPeaches Apr 21, 2025
f8c94d1
chore: remove extra newline
iBotPeaches Apr 21, 2025
7a61c8b
fix: 'role' is always 'assistant'
iBotPeaches Apr 21, 2025
697145a
test: augment tests with single click
iBotPeaches Apr 21, 2025
30ef112
chore: add missing int for computer single click
iBotPeaches Apr 21, 2025
ac7868d
test: progression towards 100% coverage on create response
iBotPeaches Apr 21, 2025
274498a
test: assertion on OutputFileSearchToolCall
iBotPeaches Apr 21, 2025
d4170aa
chore: ints for x/y on click event
iBotPeaches Apr 21, 2025
e14b07c
fix: further cleanup on CreateResponse
iBotPeaches Apr 21, 2025
130f74b
feat: add computer tool call output
iBotPeaches Apr 21, 2025
84cbb39
feat: add function tool call output
iBotPeaches Apr 21, 2025
60bcce4
fix: city, region and timezone can return null
iBotPeaches Apr 22, 2025
09d00e5
fix: json_schema description can be missing
iBotPeaches Apr 22, 2025
cc27c28
Lint Test Pass, Fixed Array map at ListInputItems
momostafa Apr 22, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
210 changes: 210 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ If you or your business relies on this package, it's important to support the de
- [Get Started](#get-started)
- [Usage](#usage)
- [Models Resource](#models-resource)
- [Responses Resource](#responses-resource)
- [Chat Resource](#chat-resource)
- [Completions Resource](#completions-resource)
- [Audio Resource](#audio-resource)
Expand Down Expand Up @@ -154,6 +155,215 @@ $response->deleted; // true
$response->toArray(); // ['id' => 'curie:ft-acmeco-2021-03-03-21-44-20', ...]
```

### `Responses` Resource

#### `create`

Creates 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.

```php
$response = $client->responses()->create([
'model' => 'gpt-4o-mini',
'tools' => [
[
'type' => 'web_search_preview'
]
],
'input' => "what was a positive news story from today?",
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We should document both the array and string based input

'temperature' => 0.7,
'max_output_tokens' => 150,
'tool_choice' => 'auto',
'parallel_tool_calls' => true,
'store' => true,
'metadata' => [
'user_id' => '123',
'session_id' => 'abc456'
]
]);

$response->id; // 'resp_67ccd2bed1ec8190b14f964abc054267'
$response->object; // 'response'
$response->createdAt; // 1741476542
$response->status; // 'completed'
$response->model; // 'gpt-4o-mini'

// Access output content
foreach ($response->output as $output) {
$output->type; // 'message'
$output->id; // 'msg_67ccd2bf17f0819081ff3bb2cf6508e6'
$output->status; // 'completed'
$output->role; // 'assistant'

foreach ($output->content as $content) {
$content->type; // 'output_text'
$content->text; // The response text
$content->annotations; // Any annotations in the response
}
}

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

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

#### `create streamed`

When you create a Response with stream set to true, the server will emit server-sent events to the client as the Response is generated.

```php
$stream = $client->responses()->createStreamed([
'model' => 'gpt-4o-mini',
'tools' => [
[
'type' => 'web_search_preview'
]
],
'input' => "what was a positive news story from today?",
'stream' => true
]);

foreach ($stream as $response) {
$response->id; // 'resp_67ccd2bed1ec8190b14f964abc054267'
$response->object; // 'response'
$response->createdAt; // 1741476542

foreach ($response->output as $output) {
// Process streaming output
echo $output->content[0]->text;
}
}
```

### `retrieve`

Retrieves a model response with the given ID.

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

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

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

### `delete`

Deletes a model response with the given ID.

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

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

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

### `list`

Lists input items for a response with the given ID.

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

$response->object; // 'list'

foreach ($response->data as $item) {
$item->type; // 'message'
$item->id; // Response item ID
$item->status; // 'completed'
$item->role; // 'user' or 'assistant'

foreach ($item->content as $content) {
$content->type; // Content type
$content->text; // Content text
$content->annotations; // Content annotations
}
}

$response->firstId; // First item ID in the list
$response->lastId; // Last item ID in the list
$response->hasMore; // Whether there are more items to fetch

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

### `Completions` Resource

#### `create`

Creates a completion for the provided prompt and parameters.

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

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

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

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

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

#### `create streamed`

Creates a streamed completion for the provided prompt and parameters.

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

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

### `Chat` Resource

#### `create`
Expand Down
11 changes: 11 additions & 0 deletions src/Client.php
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
use OpenAI\Resources\Images;
use OpenAI\Resources\Models;
use OpenAI\Resources\Moderations;
use OpenAI\Resources\Responses;
use OpenAI\Resources\Threads;
use OpenAI\Resources\VectorStores;

Expand All @@ -34,6 +35,16 @@ public function __construct(private readonly TransporterContract $transporter)
// ..
}

/**
* Manage responses to assist models with tasks.
*
* @see https://platform.openai.com/docs/api-reference/responses
*/
public function responses(): Responses
{
return new Responses($this->transporter);
}

/**
* Given a prompt, the model will return one or more predicted completions, and can also return the probabilities
* of alternative tokens at each position.
Expand Down
8 changes: 8 additions & 0 deletions src/Contracts/ClientContract.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
use OpenAI\Contracts\Resources\ImagesContract;
use OpenAI\Contracts\Resources\ModelsContract;
use OpenAI\Contracts\Resources\ModerationsContract;
use OpenAI\Contracts\Resources\ResponsesContract;
use OpenAI\Contracts\Resources\ThreadsContract;
use OpenAI\Contracts\Resources\VectorStoresContract;

Expand All @@ -28,6 +29,13 @@ interface ClientContract
*/
public function completions(): CompletionsContract;

/**
* Manage responses to assist models with tasks.
*
* @see https://platform.openai.com/docs/api-reference/responses
*/
public function responses(): ResponsesContract;

/**
* Given a chat conversation, the model will return a chat completion response.
*
Expand Down
60 changes: 60 additions & 0 deletions src/Contracts/Resources/ResponsesContract.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
<?php

declare(strict_types=1);

namespace OpenAI\Contracts\Resources;

use OpenAI\Responses\Responses\CreateResponse;
use OpenAI\Responses\Responses\CreateStreamedResponse;
use OpenAI\Responses\Responses\DeleteResponse;
use OpenAI\Responses\Responses\ListInputItems;
use OpenAI\Responses\Responses\RetrieveResponse;
use OpenAI\Responses\StreamResponse;

interface ResponsesContract
{
/**
* Creates 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.
*
* @see https://platform.openai.com/docs/api-reference/responses/create
*
* @param array<string, mixed> $parameters
*/
public function create(array $parameters): CreateResponse;

/**
* Create a streamed response.
*
* @see https://platform.openai.com/docs/api-reference/responses/create
*
* @param array<string, mixed> $parameters
* @return StreamResponse<CreateStreamedResponse>
*/
public function createStreamed(array $parameters): StreamResponse;

/**
* Retrieves a model response with the given ID.
*
* @see https://platform.openai.com/docs/api-reference/responses/retrieve
*/
public function retrieve(string $id): RetrieveResponse;

/**
* Deletes a model response with the given ID.
*
* @see https://platform.openai.com/docs/api-reference/responses/delete
*/
public function delete(string $id): DeleteResponse;

/**
* Returns a list of input items for a given response.
*
* @see https://platform.openai.com/docs/api-reference/responses/input-items
*
* @param array<string, mixed> $parameters
*/
public function list(string $id, array $parameters = []): ListInputItems;
}
Loading