| 174 | @pytest.fixture(scope="session") |
| 175 | def mock_openai_chatcompletion(monkeypatch_session): |
| 176 | class AsyncResponseEventIterator: |
| 177 | def __init__(self, answer: str): |
| 178 | self.events: list = [] |
| 179 | # Split at << to simulate chunked responses |
| 180 | if answer.find("<<") > -1: |
| 181 | parts = answer.split("<<") |
| 182 | self.events.append( |
| 183 | ResponseTextDeltaEvent( |
| 184 | type="response.output_text.delta", |
| 185 | content_index=0, |
| 186 | delta=parts[0] + "<<", |
| 187 | item_id="msg-1", |
| 188 | output_index=0, |
| 189 | logprobs=[], |
| 190 | sequence_number=0, |
| 191 | ) |
| 192 | ) |
| 193 | self.events.append( |
| 194 | ResponseTextDeltaEvent( |
| 195 | type="response.output_text.delta", |
| 196 | content_index=0, |
| 197 | delta=parts[1], |
| 198 | item_id="msg-1", |
| 199 | output_index=0, |
| 200 | logprobs=[], |
| 201 | sequence_number=1, |
| 202 | ) |
| 203 | ) |
| 204 | else: |
| 205 | self.events.append( |
| 206 | ResponseTextDeltaEvent( |
| 207 | type="response.output_text.delta", |
| 208 | content_index=0, |
| 209 | delta=answer, |
| 210 | item_id="msg-1", |
| 211 | output_index=0, |
| 212 | logprobs=[], |
| 213 | sequence_number=0, |
| 214 | ) |
| 215 | ) |
| 216 | # Agents SDK requires a ResponseCompletedEvent to finalize the stream |
| 217 | self.events.append( |
| 218 | ResponseCompletedEvent( |
| 219 | type="response.completed", |
| 220 | sequence_number=len(self.events), |
| 221 | response=Response( |
| 222 | id="resp-test-stream", |
| 223 | created_at=0, |
| 224 | model="gpt-5.4", |
| 225 | object="response", |
| 226 | output=[ |
| 227 | ResponseOutputMessage( |
| 228 | id="msg-1", |
| 229 | type="message", |
| 230 | role="assistant", |
| 231 | status="completed", |
| 232 | content=[ResponseOutputText(type="output_text", text=answer, annotations=[])], |
| 233 | ) |