OpenAI stream adapter -- converts raw OpenAI SSE to StreamEvent.
openai_adapter
async
openai_adapter(
raw_stream: AsyncIterator[Any],
) -> AsyncIterator[StreamEvent]
Convert raw OpenAI stream chunks to StreamEvent.
Source code in src/symfonic/core/streaming/adapters/openai_adapter.py
| async def openai_adapter(
raw_stream: AsyncIterator[Any],
) -> AsyncIterator[StreamEvent]:
"""Convert raw OpenAI stream chunks to StreamEvent."""
async for chunk in raw_stream:
choices = _get(chunk, "choices", [])
if not choices:
for evt in _handle_no_choices(chunk):
yield evt
continue
choice = choices[0] if isinstance(choices, list) else choices
delta = _get(choice, "delta", {})
finish = _get(choice, "finish_reason")
if finish:
yield MessageEndEvent(message_id="", stop_reason=finish)
continue
yielded = False
content = _get(delta, "content")
if content:
yield TextDeltaEvent(text=content)
yielded = True
tool_calls = _get(delta, "tool_calls")
if tool_calls:
for tc in tool_calls:
for evt in _handle_tool_call(tc):
yield evt
yielded = True
if not yielded and delta:
yield make_extension_event("openai.delta", delta)
|