Skip to content

Commit 1d178e8

Browse files
committed
feat: add reasoning_content field to chat completions response
Add support for the reasoning_content field in chat completions API responses. This field is added at the same level as content in both streaming and non-streaming requests. The field is marked as optional to handle cases where it's not present in the API response.
1 parent 17d1a23 commit 1d178e8

6 files changed

+23
-14
lines changed

src/Responses/Chat/CreateResponse.php

+3-3
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,12 @@
1212
use OpenAI\Testing\Responses\Concerns\Fakeable;
1313

1414
/**
15-
* @implements ResponseContract<array{id: string, object: string, created: int, model: string, system_fingerprint?: string, choices: array<int, array{index: int, message: array{role: string, content: string|null, function_call?: array{name: string, arguments: string}, tool_calls?: array<int, array{id: string, type: string, function: array{name: string, arguments: string}}>}, finish_reason: string|null}>, usage: array{prompt_tokens: int, completion_tokens: int|null, total_tokens: int}}>
15+
* @implements ResponseContract<array{id: string, object: string, created: int, model: string, system_fingerprint?: string, choices: array<int, array{index: int, message: array{role: string, content: string|null, reasoning_content?: string|null, function_call?: array{name: string, arguments: string}, tool_calls?: array<int, array{id: string, type: string, function: array{name: string, arguments: string}}>}, finish_reason: string|null}>, usage: array{prompt_tokens: int, completion_tokens: int|null, total_tokens: int}}>
1616
*/
1717
final class CreateResponse implements ResponseContract, ResponseHasMetaInformationContract
1818
{
1919
/**
20-
* @use ArrayAccessible<array{id: string, object: string, created: int, model: string, system_fingerprint?: string, choices: array<int, array{index: int, message: array{role: string, content: string|null, function_call?: array{name: string, arguments: string}, tool_calls?: array<int, array{id: string, type: string, function: array{name: string, arguments: string}}>}, finish_reason: string|null}>, usage: array{prompt_tokens: int, completion_tokens: int|null, total_tokens: int}}>
20+
* @use ArrayAccessible<array{id: string, object: string, created: int, model: string, system_fingerprint?: string, choices: array<int, array{index: int, message: array{role: string, content: string|null, reasoning_content?: string|null, function_call?: array{name: string, arguments: string}, tool_calls?: array<int, array{id: string, type: string, function: array{name: string, arguments: string}}>}, finish_reason: string|null}>, usage: array{prompt_tokens: int, completion_tokens: int|null, total_tokens: int}}>
2121
*/
2222
use ArrayAccessible;
2323

@@ -41,7 +41,7 @@ private function __construct(
4141
/**
4242
* Acts as static factory, and returns a new Response instance.
4343
*
44-
* @param array{id: string, object: string, created: int, model: string, system_fingerprint?: string, choices: array<int, array{index: int, message: array{role: string, content: ?string, function_call: ?array{name: string, arguments: string}, tool_calls: ?array<int, array{id: string, type: string, function: array{name: string, arguments: string}}>}, finish_reason: string|null}>, usage: array{prompt_tokens: int, completion_tokens: int|null, total_tokens: int, prompt_tokens_details?:array{cached_tokens:int}, completion_tokens_details?:array{audio_tokens?:int, reasoning_tokens:int, accepted_prediction_tokens:int, rejected_prediction_tokens:int}}} $attributes
44+
* @param array{id: string, object: string, created: int, model: string, system_fingerprint?: string, choices: array<int, array{index: int, message: array{role: string, content: ?string, reasoning_content?: ?string, function_call: ?array{name: string, arguments: string}, tool_calls: ?array<int, array{id: string, type: string, function: array{name: string, arguments: string}}>}, finish_reason: string|null}>, usage: array{prompt_tokens: int, completion_tokens: int|null, total_tokens: int, prompt_tokens_details?:array{cached_tokens:int}, completion_tokens_details?:array{audio_tokens?:int, reasoning_tokens:int, accepted_prediction_tokens:int, rejected_prediction_tokens:int}}} $attributes
4545
*/
4646
public static function from(array $attributes, MetaInformation $meta): self
4747
{

src/Responses/Chat/CreateResponseChoice.php

+2-2
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ private function __construct(
1313
) {}
1414

1515
/**
16-
* @param array{index: int, message: array{role: string, content: ?string, function_call: ?array{name: string, arguments: string}, tool_calls: ?array<int, array{id: string, type: string, function: array{name: string, arguments: string}}>}, finish_reason: string|null} $attributes
16+
* @param array{index: int, message: array{role: string, content: ?string, reasoning_content?: ?string, function_call: ?array{name: string, arguments: string}, tool_calls: ?array<int, array{id: string, type: string, function: array{name: string, arguments: string}}>}, finish_reason: string|null} $attributes
1717
*/
1818
public static function from(array $attributes): self
1919
{
@@ -25,7 +25,7 @@ public static function from(array $attributes): self
2525
}
2626

2727
/**
28-
* @return array{index: int, message: array{role: string, content: string|null, function_call?: array{name: string, arguments: string}, tool_calls?: array<int, array{id: string, type: string, function: array{name: string, arguments: string}}>}, finish_reason: string|null}
28+
* @return array{index: int, message: array{role: string, content: string|null, reasoning_content?: string|null, function_call?: array{name: string, arguments: string}, tool_calls?: array<int, array{id: string, type: string, function: array{name: string, arguments: string}}>}, finish_reason: string|null}
2929
*/
3030
public function toArray(): array
3131
{

src/Responses/Chat/CreateResponseMessage.php

+8-2
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,12 @@ private function __construct(
1313
public readonly string $role,
1414
public readonly ?string $content,
1515
public readonly array $toolCalls,
16+
public readonly ?string $reasoningContent,
1617
public readonly ?CreateResponseFunctionCall $functionCall,
1718
) {}
1819

1920
/**
20-
* @param array{role: string, content: ?string, function_call: ?array{name: string, arguments: string}, tool_calls: ?array<int, array{id: string, type: string, function: array{name: string, arguments: string}}>} $attributes
21+
* @param array{role: string, content: ?string, reasoning_content?: ?string, function_call: ?array{name: string, arguments: string}, tool_calls: ?array<int, array{id: string, type: string, function: array{name: string, arguments: string}}>} $attributes
2122
*/
2223
public static function from(array $attributes): self
2324
{
@@ -29,12 +30,13 @@ public static function from(array $attributes): self
2930
$attributes['role'],
3031
$attributes['content'] ?? null,
3132
$toolCalls,
33+
$attributes['reasoning_content'] ?? null,
3234
isset($attributes['function_call']) ? CreateResponseFunctionCall::from($attributes['function_call']) : null,
3335
);
3436
}
3537

3638
/**
37-
* @return array{role: string, content: string|null, function_call?: array{name: string, arguments: string}, tool_calls?: array<int, array{id: string, type: string, function: array{name: string, arguments: string}}>}
39+
* @return array{role: string, content: string|null, reasoning_content?: string|null, function_call?: array{name: string, arguments: string}, tool_calls?: array<int, array{id: string, type: string, function: array{name: string, arguments: string}}>}
3840
*/
3941
public function toArray(): array
4042
{
@@ -43,6 +45,10 @@ public function toArray(): array
4345
'content' => $this->content,
4446
];
4547

48+
if ($this->reasoningContent !== null) {
49+
$data['reasoning_content'] = $this->reasoningContent;
50+
}
51+
4652
if ($this->functionCall instanceof CreateResponseFunctionCall) {
4753
$data['function_call'] = $this->functionCall->toArray();
4854
}

src/Responses/Chat/CreateStreamedResponse.php

+3-3
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,12 @@
99
use OpenAI\Testing\Responses\Concerns\FakeableForStreamedResponse;
1010

1111
/**
12-
* @implements ResponseContract<array{id: string, object: string, created: int, model: string, choices: array<int, array{index: int, delta: array{role?: string, content?: string}|array{role?: string, content: null, function_call: array{name?: string, arguments?: string}}, finish_reason: string|null}>, usage?: array{prompt_tokens: int, completion_tokens: int|null, total_tokens: int}}>
12+
* @implements ResponseContract<array{id: string, object: string, created: int, model: string, choices: array<int, array{index: int, delta: array{role?: string, content?: string, reasoning_content?: string}|array{role?: string, content: null, reasoning_content?: string, function_call: array{name?: string, arguments?: string}}, finish_reason: string|null}>, usage?: array{prompt_tokens: int, completion_tokens: int|null, total_tokens: int}}>
1313
*/
1414
final class CreateStreamedResponse implements ResponseContract
1515
{
1616
/**
17-
* @use ArrayAccessible<array{id: string, object: string, created: int, model: string, choices: array<int, array{index: int, delta: array{role?: string, content?: string}|array{role?: string, content: null, function_call: array{name?: string, arguments?: string}}, finish_reason: string|null}>, usage?: array{prompt_tokens: int, completion_tokens: int|null, total_tokens: int}}>
17+
* @use ArrayAccessible<array{id: string, object: string, created: int, model: string, choices: array<int, array{index: int, delta: array{role?: string, content?: string, reasoning_content?: string}|array{role?: string, content: null, reasoning_content?: string, function_call: array{name?: string, arguments?: string}}, finish_reason: string|null}>, usage?: array{prompt_tokens: int, completion_tokens: int|null, total_tokens: int}}>
1818
*/
1919
use ArrayAccessible;
2020

@@ -35,7 +35,7 @@ private function __construct(
3535
/**
3636
* Acts as static factory, and returns a new Response instance.
3737
*
38-
* @param array{id: string, object: string, created: int, model: string, choices: array<int, array{index: int, delta: array{role?: string, content?: string}, finish_reason: string|null}>, usage?: array{prompt_tokens: int, completion_tokens: int|null, total_tokens: int}} $attributes
38+
* @param array{id: string, object: string, created: int, model: string, choices: array<int, array{index: int, delta: array{role?: string, content?: string, reasoning_content?: string}, finish_reason: string|null}>, usage?: array{prompt_tokens: int, completion_tokens: int|null, total_tokens: int}} $attributes
3939
*/
4040
public static function from(array $attributes): self
4141
{

src/Responses/Chat/CreateStreamedResponseChoice.php

+2-2
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ private function __construct(
1313
) {}
1414

1515
/**
16-
* @param array{index: int, delta?: array{role?: string, content?: string}, finish_reason: string|null} $attributes
16+
* @param array{index: int, delta?: array{role?: string, content?: string, reasoning_content?: string}, finish_reason: string|null} $attributes
1717
*/
1818
public static function from(array $attributes): self
1919
{
@@ -25,7 +25,7 @@ public static function from(array $attributes): self
2525
}
2626

2727
/**
28-
* @return array{index: int, delta: array{role?: string, content?: string}|array{role?: string, content: null, function_call: array{name?: string, arguments?: string}}, finish_reason: string|null}
28+
* @return array{index: int, delta: array{role?: string, content?: string, reasoning_content?: string}|array{role?: string, content: null, reasoning_content?: string, function_call: array{name?: string, arguments?: string}}, finish_reason: string|null}
2929
*/
3030
public function toArray(): array
3131
{

src/Responses/Chat/CreateStreamedResponseDelta.php

+5-2
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,12 @@ private function __construct(
1313
public readonly ?string $role,
1414
public readonly ?string $content,
1515
public readonly array $toolCalls,
16+
public readonly ?string $reasoningContent,
1617
public readonly ?CreateStreamedResponseFunctionCall $functionCall,
1718
) {}
1819

1920
/**
20-
* @param array{role?: string, content?: string, function_call?: array{name?: ?string, arguments?: ?string}, tool_calls?: array<int, array{id?: string, type?: string, function: array{name?: string, arguments: string}}>} $attributes
21+
* @param array{role?: string, content?: string, reasoning_content?: string, function_call?: array{name?: ?string, arguments?: ?string}, tool_calls?: array<int, array{id?: string, type?: string, function: array{name?: string, arguments: string}}>} $attributes
2122
*/
2223
public static function from(array $attributes): self
2324
{
@@ -29,18 +30,20 @@ public static function from(array $attributes): self
2930
$attributes['role'] ?? null,
3031
$attributes['content'] ?? null,
3132
$toolCalls,
33+
$attributes['reasoning_content'] ?? null,
3234
isset($attributes['function_call']) ? CreateStreamedResponseFunctionCall::from($attributes['function_call']) : null,
3335
);
3436
}
3537

3638
/**
37-
* @return array{role?: string, content?: string}|array{role?: string, content: null, function_call: array{name?: string, arguments?: string}}
39+
* @return array{role?: string, content?: string, reasoning_content?: string}|array{role?: string, content: null, reasoning_content?: string, function_call: array{name?: string, arguments?: string}}
3840
*/
3941
public function toArray(): array
4042
{
4143
$data = array_filter([
4244
'role' => $this->role,
4345
'content' => $this->content,
46+
'reasoning_content' => $this->reasoningContent,
4447
], fn (?string $value): bool => ! is_null($value));
4548

4649
if ($this->functionCall instanceof CreateStreamedResponseFunctionCall) {

0 commit comments

Comments
 (0)