Stream a chat response from OpenAI.
(
self,
messages: list[Message],
tools: Optional[list[Tool]] = None,
system_prompt: Optional[str] = None,
max_tokens: int = 4096,
temperature: float = 0.0,
**kwargs
)
| 598 | ) |
| 599 | |
| 600 | def chat_stream( |
| 601 | self, |
| 602 | messages: list[Message], |
| 603 | tools: Optional[list[Tool]] = None, |
| 604 | system_prompt: Optional[str] = None, |
| 605 | max_tokens: int = 4096, |
| 606 | temperature: float = 0.0, |
| 607 | **kwargs |
| 608 | ) -> Generator[Union[str, LLMResponse], None, None]: |
| 609 | """Stream a chat response from OpenAI.""" |
| 610 | if self._use_responses_api: |
| 611 | payload = self._build_responses_payload( |
| 612 | messages, tools, system_prompt, max_tokens |
| 613 | ) |
| 614 | payload['stream'] = True |
| 615 | try: |
| 616 | yield from self._process_stream(payload) |
| 617 | except LLMClientError: |
| 618 | raise |
| 619 | except Exception as e: |
| 620 | raise LLMClientError(LLMError( |
| 621 | message=f"Streaming request failed: {e!s}", |
| 622 | provider=self.provider_name |
| 623 | )) from e |
| 624 | return |
| 625 | |
| 626 | # Try Chat Completions API first |
| 627 | payload = self._build_chat_payload( |
| 628 | messages, tools, system_prompt, max_tokens |
| 629 | ) |
| 630 | payload['stream'] = True |
| 631 | payload['stream_options'] = {'include_usage': True} |
| 632 | |
| 633 | try: |
| 634 | yield from self._process_stream(payload) |
| 635 | except LLMClientError as e: |
| 636 | if self._should_use_responses_api(e): |
| 637 | self._use_responses_api = True |
| 638 | payload = self._build_responses_payload( |
| 639 | messages, tools, system_prompt, max_tokens |
| 640 | ) |
| 641 | payload['stream'] = True |
| 642 | yield from self._process_stream(payload) |
| 643 | else: |
| 644 | raise |
| 645 | except Exception as e: |
| 646 | raise LLMClientError(LLMError( |
| 647 | message=f"Streaming request failed: {e!s}", |
| 648 | provider=self.provider_name |
| 649 | )) from e |
| 650 | |
| 651 | def _process_stream( |
| 652 | self, payload: dict |
nothing calls this directly
no test coverage detected