Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
68 changes: 68 additions & 0 deletions src/Actions/Responses/ItemObjects.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
<?php

declare(strict_types=1);

namespace OpenAI\Actions\Responses;

use OpenAI\Responses\Responses\Input\ComputerToolCallOutput;
use OpenAI\Responses\Responses\Input\FunctionToolCallOutput;
use OpenAI\Responses\Responses\Input\InputMessage;
use OpenAI\Responses\Responses\Output\OutputCodeInterpreterToolCall;
use OpenAI\Responses\Responses\Output\OutputComputerToolCall;
use OpenAI\Responses\Responses\Output\OutputFileSearchToolCall;
use OpenAI\Responses\Responses\Output\OutputFunctionToolCall;
use OpenAI\Responses\Responses\Output\OutputImageGenerationToolCall;
use OpenAI\Responses\Responses\Output\OutputMcpApprovalRequest;
use OpenAI\Responses\Responses\Output\OutputMcpCall;
use OpenAI\Responses\Responses\Output\OutputMcpListTools;
use OpenAI\Responses\Responses\Output\OutputMessage;
use OpenAI\Responses\Responses\Output\OutputReasoning;
use OpenAI\Responses\Responses\Output\OutputWebSearchToolCall;

/**
* @phpstan-import-type InputMessageType from InputMessage
* @phpstan-import-type ComputerToolCallOutputType from ComputerToolCallOutput
* @phpstan-import-type FunctionToolCallOutputType from FunctionToolCallOutput
* @phpstan-import-type OutputComputerToolCallType from OutputComputerToolCall
* @phpstan-import-type OutputFileSearchToolCallType from OutputFileSearchToolCall
* @phpstan-import-type OutputFunctionToolCallType from OutputFunctionToolCall
* @phpstan-import-type OutputMessageType from OutputMessage
* @phpstan-import-type OutputReasoningType from OutputReasoning
* @phpstan-import-type OutputWebSearchToolCallType from OutputWebSearchToolCall
* @phpstan-import-type OutputMcpListToolsType from OutputMcpListTools
* @phpstan-import-type OutputMcpApprovalRequestType from OutputMcpApprovalRequest
* @phpstan-import-type OutputMcpCallType from OutputMcpCall
* @phpstan-import-type OutputImageGenerationToolCallType from OutputImageGenerationToolCall
* @phpstan-import-type OutputCodeInterpreterToolCallType from OutputCodeInterpreterToolCall
*
* @phpstan-type ResponseItemObjectTypes array<int, InputMessageType|ComputerToolCallOutputType|FunctionToolCallOutputType|OutputComputerToolCallType|OutputFileSearchToolCallType|OutputFunctionToolCallType|OutputMessageType|OutputReasoningType|OutputWebSearchToolCallType|OutputMcpListToolsType|OutputMcpApprovalRequestType|OutputMcpCallType|OutputImageGenerationToolCallType|OutputCodeInterpreterToolCallType>
* @phpstan-type ResponseItemObjectReturnType array<int, InputMessage|ComputerToolCallOutput|FunctionToolCallOutput|OutputMessage|OutputComputerToolCall|OutputFileSearchToolCall|OutputWebSearchToolCall|OutputFunctionToolCall|OutputReasoning|OutputMcpListTools|OutputMcpApprovalRequest|OutputMcpCall|OutputImageGenerationToolCall|OutputCodeInterpreterToolCall>
*/
final class ItemObjects
{
/**
* @param ResponseItemObjectTypes $outputItems
* @return ResponseItemObjectReturnType
*/
public static function parse(array $outputItems): array
{
return array_map(
fn (array $item): InputMessage|ComputerToolCallOutput|FunctionToolCallOutput|OutputMessage|OutputComputerToolCall|OutputFileSearchToolCall|OutputWebSearchToolCall|OutputFunctionToolCall|OutputReasoning|OutputMcpListTools|OutputMcpApprovalRequest|OutputMcpCall|OutputImageGenerationToolCall|OutputCodeInterpreterToolCall => match ($item['type']) {
'message' => $item['role'] === 'assistant' ? OutputMessage::from($item) : InputMessage::from($item),
'file_search_call' => OutputFileSearchToolCall::from($item),
'function_call' => OutputFunctionToolCall::from($item),
'function_call_output' => FunctionToolCallOutput::from($item),
'web_search_call' => OutputWebSearchToolCall::from($item),
'computer_call' => OutputComputerToolCall::from($item),
'computer_call_output' => ComputerToolCallOutput::from($item),
'reasoning' => OutputReasoning::from($item),
'mcp_list_tools' => OutputMcpListTools::from($item),
'mcp_approval_request' => OutputMcpApprovalRequest::from($item),
'mcp_call' => OutputMcpCall::from($item),
'image_generation_call' => OutputImageGenerationToolCall::from($item),
'code_interpreter_call' => OutputCodeInterpreterToolCall::from($item),
},
$outputItems,
);
}
}
60 changes: 60 additions & 0 deletions src/Actions/Responses/OutputObjects.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
<?php

declare(strict_types=1);

namespace OpenAI\Actions\Responses;

use OpenAI\Responses\Responses\Output\OutputCodeInterpreterToolCall;
use OpenAI\Responses\Responses\Output\OutputComputerToolCall;
use OpenAI\Responses\Responses\Output\OutputFileSearchToolCall;
use OpenAI\Responses\Responses\Output\OutputFunctionToolCall;
use OpenAI\Responses\Responses\Output\OutputImageGenerationToolCall;
use OpenAI\Responses\Responses\Output\OutputMcpApprovalRequest;
use OpenAI\Responses\Responses\Output\OutputMcpCall;
use OpenAI\Responses\Responses\Output\OutputMcpListTools;
use OpenAI\Responses\Responses\Output\OutputMessage;
use OpenAI\Responses\Responses\Output\OutputReasoning;
use OpenAI\Responses\Responses\Output\OutputWebSearchToolCall;

/**
* @phpstan-import-type OutputComputerToolCallType from OutputComputerToolCall
* @phpstan-import-type OutputFileSearchToolCallType from OutputFileSearchToolCall
* @phpstan-import-type OutputFunctionToolCallType from OutputFunctionToolCall
* @phpstan-import-type OutputMessageType from OutputMessage
* @phpstan-import-type OutputReasoningType from OutputReasoning
* @phpstan-import-type OutputWebSearchToolCallType from OutputWebSearchToolCall
* @phpstan-import-type OutputMcpListToolsType from OutputMcpListTools
* @phpstan-import-type OutputMcpApprovalRequestType from OutputMcpApprovalRequest
* @phpstan-import-type OutputMcpCallType from OutputMcpCall
* @phpstan-import-type OutputImageGenerationToolCallType from OutputImageGenerationToolCall
* @phpstan-import-type OutputCodeInterpreterToolCallType from OutputCodeInterpreterToolCall
*
* @phpstan-type ResponseOutputObjectTypes array<int, OutputComputerToolCallType|OutputFileSearchToolCallType|OutputFunctionToolCallType|OutputMessageType|OutputReasoningType|OutputWebSearchToolCallType|OutputMcpListToolsType|OutputMcpApprovalRequestType|OutputMcpCallType|OutputImageGenerationToolCallType|OutputCodeInterpreterToolCallType>
* @phpstan-type ResponseOutputObjectReturnType array<int, OutputMessage|OutputComputerToolCall|OutputFileSearchToolCall|OutputWebSearchToolCall|OutputFunctionToolCall|OutputReasoning|OutputMcpListTools|OutputMcpApprovalRequest|OutputMcpCall|OutputImageGenerationToolCall|OutputCodeInterpreterToolCall>
*/
final class OutputObjects
{
/**
* @param ResponseOutputObjectTypes $outputItems
* @return ResponseOutputObjectReturnType
*/
public static function parse(array $outputItems): array
{
return array_map(
fn (array $item): OutputMessage|OutputComputerToolCall|OutputFileSearchToolCall|OutputWebSearchToolCall|OutputFunctionToolCall|OutputReasoning|OutputMcpListTools|OutputMcpApprovalRequest|OutputMcpCall|OutputImageGenerationToolCall|OutputCodeInterpreterToolCall => match ($item['type']) {
'message' => OutputMessage::from($item),
'file_search_call' => OutputFileSearchToolCall::from($item),
'function_call' => OutputFunctionToolCall::from($item),
'web_search_call' => OutputWebSearchToolCall::from($item),
'computer_call' => OutputComputerToolCall::from($item),
'reasoning' => OutputReasoning::from($item),
'mcp_list_tools' => OutputMcpListTools::from($item),
'mcp_approval_request' => OutputMcpApprovalRequest::from($item),
'mcp_call' => OutputMcpCall::from($item),
'image_generation_call' => OutputImageGenerationToolCall::from($item),
'code_interpreter_call' => OutputCodeInterpreterToolCall::from($item),
},
$outputItems,
);
}
}
35 changes: 35 additions & 0 deletions src/Actions/Responses/OutputText.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
<?php

declare(strict_types=1);

namespace OpenAI\Actions\Responses;

use OpenAI\Responses\Responses\Output\OutputMessage;
use OpenAI\Responses\Responses\Output\OutputMessageContentOutputText;

/**
* An SDK-only property (output_text) that concatenates all text content from output messages.
*
* @phpstan-import-type ResponseOutputObjectReturnType from OutputObjects
*/
final class OutputText
{
/**
* @param ResponseOutputObjectReturnType $outputItems
*/
public static function parse(array $outputItems): ?string
{
$texts = [];
foreach ($outputItems as $item) {
if ($item instanceof OutputMessage) {
foreach ($item->content as $content) {
if ($content instanceof OutputMessageContentOutputText) {
$texts[] = $content->text;
}
}
}
}

return empty($texts) ? null : implode(' ', $texts);
}
}
32 changes: 32 additions & 0 deletions src/Actions/Responses/ToolChoiceObjects.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
<?php

declare(strict_types=1);

namespace OpenAI\Actions\Responses;

use OpenAI\Responses\Responses\ToolChoice\FunctionToolChoice;
use OpenAI\Responses\Responses\ToolChoice\HostedToolChoice;

/**
* @phpstan-import-type FunctionToolChoiceType from FunctionToolChoice
* @phpstan-import-type HostedToolChoiceType from HostedToolChoice
*
* @phpstan-type ResponseToolChoiceTypes 'none'|'auto'|'required'|FunctionToolChoiceType|HostedToolChoiceType
* @phpstan-type ResponseToolChoiceReturnType 'none'|'auto'|'required'|FunctionToolChoice|HostedToolChoice
*/
final class ToolChoiceObjects
{
/**
* @param ResponseToolChoiceTypes $toolChoice
* @return ResponseToolChoiceReturnType
*/
public static function parse(array|string $toolChoice): string|FunctionToolChoice|HostedToolChoice
{
return is_array($toolChoice)
? match ($toolChoice['type']) {
'file_search', 'web_search', 'web_search_preview', 'computer_use_preview' => HostedToolChoice::from($toolChoice),
'function' => FunctionToolChoice::from($toolChoice),
}
: $toolChoice;
}
}
48 changes: 48 additions & 0 deletions src/Actions/Responses/ToolObjects.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
<?php

declare(strict_types=1);

namespace OpenAI\Actions\Responses;

use OpenAI\Responses\Responses\Tool\CodeInterpreterTool;
use OpenAI\Responses\Responses\Tool\ComputerUseTool;
use OpenAI\Responses\Responses\Tool\FileSearchTool;
use OpenAI\Responses\Responses\Tool\FunctionTool;
use OpenAI\Responses\Responses\Tool\ImageGenerationTool;
use OpenAI\Responses\Responses\Tool\RemoteMcpTool;
use OpenAI\Responses\Responses\Tool\WebSearchTool;

/**
* @phpstan-import-type ComputerUseToolType from ComputerUseTool
* @phpstan-import-type FileSearchToolType from FileSearchTool
* @phpstan-import-type ImageGenerationToolType from ImageGenerationTool
* @phpstan-import-type RemoteMcpToolType from RemoteMcpTool
* @phpstan-import-type FunctionToolType from FunctionTool
* @phpstan-import-type WebSearchToolType from WebSearchTool
* @phpstan-import-type CodeInterpreterToolType from CodeInterpreterTool
*
* @phpstan-type ResponseToolObjectTypes array<int, ComputerUseToolType|FileSearchToolType|FunctionToolType|WebSearchToolType|ImageGenerationToolType|RemoteMcpToolType|CodeInterpreterToolType>
* @phpstan-type ResponseToolObjectReturnType array<int, ComputerUseTool|FileSearchTool|FunctionTool|WebSearchTool|ImageGenerationTool|RemoteMcpTool|CodeInterpreterTool>
*/
final class ToolObjects
{
/**
* @param ResponseToolObjectTypes $toolItems
* @return ResponseToolObjectReturnType
*/
public static function parse(array $toolItems): array
{
return array_map(
fn (array $tool): ComputerUseTool|FileSearchTool|FunctionTool|WebSearchTool|ImageGenerationTool|RemoteMcpTool|CodeInterpreterTool => match ($tool['type']) {
'file_search' => FileSearchTool::from($tool),
'web_search', 'web_search_preview', 'web_search_preview_2025_03_11' => WebSearchTool::from($tool),
'function' => FunctionTool::from($tool),
'computer_use_preview' => ComputerUseTool::from($tool),
'image_generation' => ImageGenerationTool::from($tool),
'mcp' => RemoteMcpTool::from($tool),
'code_interpreter' => CodeInterpreterTool::from($tool),
},
$toolItems,
);
}
}
Loading