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
20 changes: 19 additions & 1 deletion src/Responses/Responses/Output/OutputImageGenerationToolCall.php
Original file line number Diff line number Diff line change
Expand Up @@ -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<OutputImageGenerationToolCallType>
*/
Expand All @@ -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,
) {}

/**
Expand All @@ -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,
);
}

Expand All @@ -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,
];
}
}
19 changes: 19 additions & 0 deletions tests/Fixtures/Responses.php
Original file line number Diff line number Diff line change
Expand Up @@ -702,6 +702,25 @@ function outputCustomToolCall(): array
];
}

/**
* @return array<string, mixed>
*/
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<string, mixed>
*/
Expand Down
85 changes: 50 additions & 35 deletions tests/Fixtures/Streams/ResponseImageGenerationCreate.txt
Original file line number Diff line number Diff line change
@@ -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}
Loading