diff --git a/src/Responses/Responses/Output/OutputImageGenerationToolCall.php b/src/Responses/Responses/Output/OutputImageGenerationToolCall.php index c4c1c0c8..7e5abb84 100644 --- a/src/Responses/Responses/Output/OutputImageGenerationToolCall.php +++ b/src/Responses/Responses/Output/OutputImageGenerationToolCall.php @@ -9,7 +9,7 @@ use OpenAI\Testing\Responses\Concerns\Fakeable; /** - * @phpstan-type OutputImageGenerationToolCallType array{id: string, result?: string|null, status: string, type: 'image_generation_call'} + * @phpstan-type OutputImageGenerationToolCallType array{id: string, result?: string|null, status: string, type: 'image_generation_call', action?: string|null, background?: string|null, output_format?: string|null, quality?: string|null, revised_prompt?: string|null, size?: string|null} * * @implements ResponseContract */ @@ -30,6 +30,12 @@ private function __construct( public readonly ?string $result, public readonly string $status, public readonly string $type, + public readonly ?string $action, + public readonly ?string $background, + public readonly ?string $outputFormat, + public readonly ?string $quality, + public readonly ?string $revisedPrompt, + public readonly ?string $size, ) {} /** @@ -42,6 +48,12 @@ public static function from(array $attributes): self result: $attributes['result'] ?? null, status: $attributes['status'], type: $attributes['type'], + action: $attributes['action'] ?? null, + background: $attributes['background'] ?? null, + outputFormat: $attributes['output_format'] ?? null, + quality: $attributes['quality'] ?? null, + revisedPrompt: $attributes['revised_prompt'] ?? null, + size: $attributes['size'] ?? null, ); } @@ -55,6 +67,12 @@ public function toArray(): array 'result' => $this->result, 'status' => $this->status, 'type' => $this->type, + 'action' => $this->action, + 'background' => $this->background, + 'output_format' => $this->outputFormat, + 'quality' => $this->quality, + 'revised_prompt' => $this->revisedPrompt, + 'size' => $this->size, ]; } } diff --git a/tests/Fixtures/Responses.php b/tests/Fixtures/Responses.php index 452e1cdf..7d2438f2 100644 --- a/tests/Fixtures/Responses.php +++ b/tests/Fixtures/Responses.php @@ -702,6 +702,25 @@ function outputCustomToolCall(): array ]; } +/** + * @return array + */ +function outputImageGenerationToolCall(): array +{ + return [ + 'id' => 'ig_67ccf18f64008190a39b619f4c8455ef087bb177ab789d5c', + 'result' => 'iVBORw0KGgoAAAAN...', + 'status' => 'completed', + 'type' => 'image_generation_call', + 'action' => 'generate', + 'background' => 'opaque', + 'output_format' => 'webp', + 'quality' => 'high', + 'revised_prompt' => 'This is a revised prompt.', + 'size' => '1536x1024', + ]; +} + /** * @return array */ diff --git a/tests/Fixtures/Streams/ResponseImageGenerationCreate.txt b/tests/Fixtures/Streams/ResponseImageGenerationCreate.txt index 7d00cf7e..ae3bca15 100644 --- a/tests/Fixtures/Streams/ResponseImageGenerationCreate.txt +++ b/tests/Fixtures/Streams/ResponseImageGenerationCreate.txt @@ -1,35 +1,50 @@ -data: {"type":"response.created","sequence_number":0,"response":{"id":"resp_684eb11908b881a180caf1a8d0aadaed0c3243c98c3d50bb","object":"response","created_at":1749987609,"status":"in_progress","background":false,"error":null,"incomplete_details":null,"instructions":null,"max_output_tokens":null,"model":"gpt-4.1-mini-2025-04-14","output":[],"parallel_tool_calls":true,"previous_response_id":null,"reasoning":{"effort":null,"summary":null},"service_tier":"auto","store":true,"temperature":1.0,"text":{"format":{"type":"text"}},"tool_choice":"auto","tools":[{"type":"image_generation","background":"auto","moderation":"auto","n":1,"output_compression":100,"output_format":"png","quality":"low","size":"1024x1024"}],"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}}} -data: {"type":"response.in_progress","sequence_number":1,"response":{"id":"resp_684eb11908b881a180caf1a8d0aadaed0c3243c98c3d50bb","object":"response","created_at":1749987609,"status":"in_progress","background":false,"error":null,"incomplete_details":null,"instructions":null,"max_output_tokens":null,"model":"gpt-4.1-mini-2025-04-14","output":[],"parallel_tool_calls":true,"previous_response_id":null,"reasoning":{"effort":null,"summary":null},"service_tier":"auto","store":true,"temperature":1.0,"text":{"format":{"type":"text"}},"tool_choice":"auto","tools":[{"type":"image_generation","background":"auto","moderation":"auto","n":1,"output_compression":100,"output_format":"png","quality":"low","size":"1024x1024"}],"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}}} -data: {"type":"response.output_item.added","sequence_number":2,"output_index":0,"item":{"id":"ig_684eb119786c81a19939e1cb5384033f0c3243c98c3d50bb","type":"image_generation_call","status":"in_progress"}} -data: {"type":"response.image_generation_call.in_progress","sequence_number":3,"output_index":0,"item_id":"ig_684eb119786c81a19939e1cb5384033f0c3243c98c3d50bb"} -data: {"type":"response.image_generation_call.generating","sequence_number":4,"output_index":0,"item_id":"ig_684eb119786c81a19939e1cb5384033f0c3243c98c3d50bb"} -data: {"type":"response.image_generation_call.partial_image","sequence_number":5,"output_index":0,"item_id":"ig_684eb119786c81a19939e1cb5384033f0c3243c98c3d50bb","partial_image_index":0,"partial_image_b64":"R0lGODlhAQABAAAAACw=","size":"1024x1024","quality":"low","background":"opaque","output_format":"png"} -data: {"type":"response.image_generation_call.partial_image","sequence_number":6,"output_index":0,"item_id":"ig_684eb119786c81a19939e1cb5384033f0c3243c98c3d50bb","partial_image_index":1,"partial_image_b64":"iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNk+A8AAQUBAScY42YAAAAASUVORK5CYII=","size":"1024x1024","quality":"low","background":"opaque","output_format":"png"} -data: {"type":"response.image_generation_call.completed","sequence_number":7,"output_index":0,"item_id":"ig_684eb119786c81a19939e1cb5384033f0c3243c98c3d50bb"} -data: {"type":"response.output_item.done","sequence_number":8,"output_index":0,"item":{"id":"ig_684eb119786c81a19939e1cb5384033f0c3243c98c3d50bb","type":"image_generation_call","status":"completed","background":"opaque","output_format":"png","quality":"low","result":"","revised_prompt":"A single black line forming a perfect circle on a white background","size":"1024x1024"}} -data: {"type":"response.output_item.added","sequence_number":9,"output_index":1,"item":{"id":"msg_684eb127559081a197c4584b23ba6b6a0c3243c98c3d50bb","type":"message","status":"in_progress","content":[],"role":"assistant"}} -data: {"type":"response.content_part.added","sequence_number":10,"item_id":"msg_684eb127559081a197c4584b23ba6b6a0c3243c98c3d50bb","output_index":1,"content_index":0,"part":{"type":"output_text","annotations":[],"text":""}} -data: {"type":"response.output_text.delta","sequence_number":11,"item_id":"msg_684eb127559081a197c4584b23ba6b6a0c3243c98c3d50bb","output_index":1,"content_index":0,"delta":"Here"} -data: {"type":"response.output_text.delta","sequence_number":12,"item_id":"msg_684eb127559081a197c4584b23ba6b6a0c3243c98c3d50bb","output_index":1,"content_index":0,"delta":" is"} -data: {"type":"response.output_text.delta","sequence_number":13,"item_id":"msg_684eb127559081a197c4584b23ba6b6a0c3243c98c3d50bb","output_index":1,"content_index":0,"delta":" a"} -data: {"type":"response.output_text.delta","sequence_number":14,"item_id":"msg_684eb127559081a197c4584b23ba6b6a0c3243c98c3d50bb","output_index":1,"content_index":0,"delta":" single"} -data: {"type":"response.output_text.delta","sequence_number":15,"item_id":"msg_684eb127559081a197c4584b23ba6b6a0c3243c98c3d50bb","output_index":1,"content_index":0,"delta":" black"} -data: {"type":"response.output_text.delta","sequence_number":16,"item_id":"msg_684eb127559081a197c4584b23ba6b6a0c3243c98c3d50bb","output_index":1,"content_index":0,"delta":" line"} -data: {"type":"response.output_text.delta","sequence_number":17,"item_id":"msg_684eb127559081a197c4584b23ba6b6a0c3243c98c3d50bb","output_index":1,"content_index":0,"delta":" in"} -data: {"type":"response.output_text.delta","sequence_number":18,"item_id":"msg_684eb127559081a197c4584b23ba6b6a0c3243c98c3d50bb","output_index":1,"content_index":0,"delta":" a"} -data: {"type":"response.output_text.delta","sequence_number":19,"item_id":"msg_684eb127559081a197c4584b23ba6b6a0c3243c98c3d50bb","output_index":1,"content_index":0,"delta":" perfect"} -data: {"type":"response.output_text.delta","sequence_number":20,"item_id":"msg_684eb127559081a197c4584b23ba6b6a0c3243c98c3d50bb","output_index":1,"content_index":0,"delta":" circle"} -data: {"type":"response.output_text.delta","sequence_number":21,"item_id":"msg_684eb127559081a197c4584b23ba6b6a0c3243c98c3d50bb","output_index":1,"content_index":0,"delta":"."} -data: {"type":"response.output_text.delta","sequence_number":22,"item_id":"msg_684eb127559081a197c4584b23ba6b6a0c3243c98c3d50bb","output_index":1,"content_index":0,"delta":" Let"} -data: {"type":"response.output_text.delta","sequence_number":23,"item_id":"msg_684eb127559081a197c4584b23ba6b6a0c3243c98c3d50bb","output_index":1,"content_index":0,"delta":" me"} -data: {"type":"response.output_text.delta","sequence_number":24,"item_id":"msg_684eb127559081a197c4584b23ba6b6a0c3243c98c3d50bb","output_index":1,"content_index":0,"delta":" know"} -data: {"type":"response.output_text.delta","sequence_number":25,"item_id":"msg_684eb127559081a197c4584b23ba6b6a0c3243c98c3d50bb","output_index":1,"content_index":0,"delta":" if"} -data: {"type":"response.output_text.delta","sequence_number":26,"item_id":"msg_684eb127559081a197c4584b23ba6b6a0c3243c98c3d50bb","output_index":1,"content_index":0,"delta":" you"} -data: {"type":"response.output_text.delta","sequence_number":27,"item_id":"msg_684eb127559081a197c4584b23ba6b6a0c3243c98c3d50bb","output_index":1,"content_index":0,"delta":" need"} -data: {"type":"response.output_text.delta","sequence_number":28,"item_id":"msg_684eb127559081a197c4584b23ba6b6a0c3243c98c3d50bb","output_index":1,"content_index":0,"delta":" any"} -data: {"type":"response.output_text.delta","sequence_number":29,"item_id":"msg_684eb127559081a197c4584b23ba6b6a0c3243c98c3d50bb","output_index":1,"content_index":0,"delta":" modifications"} -data: {"type":"response.output_text.delta","sequence_number":30,"item_id":"msg_684eb127559081a197c4584b23ba6b6a0c3243c98c3d50bb","output_index":1,"content_index":0,"delta":"."} -data: {"type":"response.output_text.done","sequence_number":31,"item_id":"msg_684eb127559081a197c4584b23ba6b6a0c3243c98c3d50bb","output_index":1,"content_index":0,"text":"Here is a single black line in a perfect circle. Let me know if you need any modifications."} -data: {"type":"response.content_part.done","sequence_number":32,"item_id":"msg_684eb127559081a197c4584b23ba6b6a0c3243c98c3d50bb","output_index":1,"content_index":0,"part":{"type":"output_text","annotations":[],"text":"Here is a single black line in a perfect circle. Let me know if you need any modifications."}} -data: {"type":"response.output_item.done","sequence_number":33,"output_index":1,"item":{"id":"msg_684eb127559081a197c4584b23ba6b6a0c3243c98c3d50bb","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"text":"Here is a single black line in a perfect circle. Let me know if you need any modifications."}],"role":"assistant"}} -data: {"type":"response.completed","sequence_number":34,"response":{"id":"resp_684eb11908b881a180caf1a8d0aadaed0c3243c98c3d50bb","object":"response","created_at":1749987609,"status":"completed","background":false,"error":null,"incomplete_details":null,"instructions":null,"max_output_tokens":null,"model":"gpt-4.1-mini-2025-04-14","output":[{"id":"ig_684eb119786c81a19939e1cb5384033f0c3243c98c3d50bb","type":"image_generation_call","status":"completed","background":"opaque","output_format":"png","quality":"low","result":"iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNk+A8AAQUBAScY42YAAAAASUVORK5CYII=","revised_prompt":"A single black line forming a perfect circle on a white background","size":"1024x1024"},{"id":"msg_684eb127559081a197c4584b23ba6b6a0c3243c98c3d50bb","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"text":"Here is a single black line in a perfect circle. Let me know if you need any modifications."}],"role":"assistant"}],"parallel_tool_calls":true,"previous_response_id":null,"reasoning":{"effort":null,"summary":null},"service_tier":"default","store":true,"temperature":1.0,"text":{"format":{"type":"text"}},"tool_choice":"auto","tools":[{"type":"image_generation","background":"auto","moderation":"auto","n":1,"output_compression":100,"output_format":"png","quality":"low","size":"1024x1024"}],"top_p":1.0,"truncation":"disabled","usage":{"input_tokens":3902,"input_tokens_details":{"cached_tokens":0},"output_tokens":46,"output_tokens_details":{"reasoning_tokens":0},"total_tokens":3948},"user":null,"metadata":{}}} +event: response.created +data: {"type":"response.created","response":{"id":"resp_67ccf18ef5fc8190b16dbee19bc54e5f087bb177ab789d5c","object":"response","created_at":1741484430,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":null,"max_tool_calls":null,"model":"gpt-5-nano-2025-08-07","output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":"medium","summary":null},"safety_identifier":null,"service_tier":"auto","store":true,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"image_generation","background":"auto","model":"gpt-image-1","moderation":"auto","n":1,"output_compression":100,"output_format":"png","quality":"auto","size":"auto"}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":0} + +event: response.in_progress +data: {"type":"response.in_progress","response":{"id":"resp_67ccf18ef5fc8190b16dbee19bc54e5f087bb177ab789d5c","object":"response","created_at":1741484430,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":null,"max_tool_calls":null,"model":"gpt-5-nano-2025-08-07","output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":"medium","summary":null},"safety_identifier":null,"service_tier":"auto","store":true,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"image_generation","background":"auto","model":"gpt-image-1","moderation":"auto","n":1,"output_compression":100,"output_format":"png","quality":"auto","size":"auto"}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":1} + +event: response.output_item.added +data: {"type":"response.output_item.added","item":{"id":"rs_67ccf18ef5fc8190b16dbee19bc54e5f087bb177ab789d5c","type":"reasoning","summary":[]},"output_index":0,"sequence_number":2} + +event: response.output_item.done +data: {"type":"response.output_item.done","item":{"id":"rs_67ccf18ef5fc8190b16dbee19bc54e5f087bb177ab789d5c","type":"reasoning","summary":[]},"output_index":0,"sequence_number":3} + +event: response.output_item.added +data: {"type":"response.output_item.added","item":{"id":"ig_67ccf18ef5fc8190b16dbee19bc54e5f087bb177ab789d5c","type":"image_generation_call","status":"in_progress"},"output_index":1,"sequence_number":4} + +event: response.image_generation_call.in_progress +data: {"type":"response.image_generation_call.in_progress","item_id":"ig_67ccf18ef5fc8190b16dbee19bc54e5f087bb177ab789d5c","output_index":1,"sequence_number":5} + +event: response.image_generation_call.generating +data: {"type":"response.image_generation_call.generating","item_id":"ig_67ccf18ef5fc8190b16dbee19bc54e5f087bb177ab789d5c","output_index":1,"sequence_number":6} + +event: response.image_generation_call.partial_image +data: {"type":"response.image_generation_call.partial_image","background":"opaque","item_id":"ig_67ccf18ef5fc8190b16dbee19bc54e5f087bb177ab789d5c","output_format":"png","output_index":1,"partial_image_b64":"iVBORw0KGgoAAAAN...","partial_image_index":0,"quality":"high","sequence_number":7,"size":"1536x1024"} + +event: response.output_item.done +data: {"type":"response.output_item.done","item":{"id":"ig_67ccf18ef5fc8190b16dbee19bc54e5f087bb177ab789d5c","type":"image_generation_call","status":"generating","action":"generate","background":"opaque","output_format":"png","quality":"high","result":"iVBORw0KGgoAAAAN...","revised_prompt":"This is a revised prompt.","size":"1536x1024"},"output_index":1,"sequence_number":8} + +event: response.output_item.added +data: {"type":"response.output_item.added","item":{"id":"rs_67ccf18ef5fc8190b16dbee19bc54e5f087bb177ab789d5c","type":"reasoning","summary":[]},"output_index":2,"sequence_number":9} + +event: response.output_item.done +data: {"type":"response.output_item.done","item":{"id":"rs_67ccf18ef5fc8190b16dbee19bc54e5f087bb177ab789d5c","type":"reasoning","summary":[]},"output_index":2,"sequence_number":10} + +event: response.output_item.added +data: {"type":"response.output_item.added","item":{"id":"msg_67ccf18ef5fc8190b16dbee19bc54e5f087bb177ab789d5c","type":"message","status":"in_progress","content":[],"role":"assistant"},"output_index":3,"sequence_number":11} + +event: response.content_part.added +data: {"type":"response.content_part.added","content_index":0,"item_id":"msg_67ccf18ef5fc8190b16dbee19bc54e5f087bb177ab789d5c","output_index":3,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":""},"sequence_number":12} + +event: response.output_text.done +data: {"type":"response.output_text.done","content_index":0,"item_id":"msg_67ccf18ef5fc8190b16dbee19bc54e5f087bb177ab789d5c","logprobs":[],"output_index":3,"sequence_number":13,"text":""} + +event: response.content_part.done +data: {"type":"response.content_part.done","content_index":0,"item_id":"msg_67ccf18ef5fc8190b16dbee19bc54e5f087bb177ab789d5c","output_index":3,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":""},"sequence_number":14} + +event: response.output_item.done +data: {"type":"response.output_item.done","item":{"id":"msg_67ccf18ef5fc8190b16dbee19bc54e5f087bb177ab789d5c","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":""}],"role":"assistant"},"output_index":3,"sequence_number":15} + +event: response.completed +data: {"type":"response.completed","response":{"id":"resp_67ccf18ef5fc8190b16dbee19bc54e5f087bb177ab789d5c","object":"response","created_at":1741484430,"status":"completed","background":false,"completed_at":1741484430,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":null,"max_tool_calls":null,"model":"gpt-5-nano-2025-08-07","output":[{"id":"rs_67ccf18ef5fc8190b16dbee19bc54e5f087bb177ab789d5c","type":"reasoning","summary":[]},{"id":"ig_67ccf18ef5fc8190b16dbee19bc54e5f087bb177ab789d5c","type":"image_generation_call","status":"generating","action":"generate","background":"opaque","output_format":"png","quality":"high","result":"iVBORw0KGgoAAAAN...","revised_prompt":"This is a revised prompt.","size":"1536x1024"},{"id":"rs_67ccf18ef5fc8190b16dbee19bc54e5f087bb177ab789d5c","type":"reasoning","summary":[]},{"id":"msg_67ccf18ef5fc8190b16dbee19bc54e5f087bb177ab789d5c","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":""}],"role":"assistant"}],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":{"effort":"medium","summary":null},"safety_identifier":null,"service_tier":"default","store":true,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tools":[{"type":"image_generation","background":"auto","model":"gpt-image-1","moderation":"auto","n":1,"output_compression":100,"output_format":"png","quality":"auto","size":"auto"}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":{"input_tokens":2048,"input_tokens_details":{"cached_tokens":0},"output_tokens":2048,"output_tokens_details":{"reasoning_tokens":2048},"total_tokens":4096},"user":null,"metadata":{}},"sequence_number":16} diff --git a/tests/Responses/Responses/Output/OutputCodeInterpreterToolCall.php b/tests/Responses/Responses/Output/OutputCodeInterpreterToolCall.php index a58e1c14..9a392563 100644 --- a/tests/Responses/Responses/Output/OutputCodeInterpreterToolCall.php +++ b/tests/Responses/Responses/Output/OutputCodeInterpreterToolCall.php @@ -27,5 +27,5 @@ expect($response->toArray()) ->toBeArray() - ->toBe(OutputCodeInterpreterToolCall()); + ->toBe(outputCodeInterpreterToolCall()); }); diff --git a/tests/Responses/Responses/Output/OutputImageGenerationToolCall.php b/tests/Responses/Responses/Output/OutputImageGenerationToolCall.php new file mode 100644 index 00000000..9b0d8a77 --- /dev/null +++ b/tests/Responses/Responses/Output/OutputImageGenerationToolCall.php @@ -0,0 +1,43 @@ +toBeInstanceOf(OutputImageGenerationToolCall::class) + ->id->toBe('ig_67ccf18f64008190a39b619f4c8455ef087bb177ab789d5c') + ->result->toBe('iVBORw0KGgoAAAAN...') + ->status->toBe('completed') + ->type->toBe('image_generation_call') + ->action->toBe('generate') + ->background->toBe('opaque') + ->outputFormat->toBe('webp') + ->quality->toBe('high') + ->revisedPrompt->toBe('This is a revised prompt.') + ->size->toBe('1536x1024'); +}); + +test('as array accessible', function () { + $response = OutputImageGenerationToolCall::from(outputImageGenerationToolCall()); + + expect($response['id'])->toBe('ig_67ccf18f64008190a39b619f4c8455ef087bb177ab789d5c') + ->and($response['result'])->toBe('iVBORw0KGgoAAAAN...') + ->and($response['status'])->toBe('completed') + ->and($response['type'])->toBe('image_generation_call') + ->and($response['action'])->toBe('generate') + ->and($response['background'])->toBe('opaque') + ->and($response['output_format'])->toBe('webp') + ->and($response['quality'])->toBe('high') + ->and($response['revised_prompt'])->toBe('This is a revised prompt.') + ->and($response['size'])->toBe('1536x1024'); +}); + +test('to array', function () { + $response = OutputImageGenerationToolCall::from(outputImageGenerationToolCall()); + + expect($response->toArray()) + ->toBeArray() + ->toBe(outputImageGenerationToolCall()); +});