ai-python-ui-adapter

$npx mdskill add vercel-labs/seal/ai-python-ui-adapter

Connects AI SDK for Python streams to UI useChat clients via adapter

  • Solves integration challenges between Python and UI chat components.
  • Depends on AI SDK for message parsing and stream handling.
  • Decides based on messages, approvals, and AI SDK events.
  • Delivers responses through HTTP routes with authentication and storage.

SKILL.md

.github/skills/ai-python-ui-adapterView on GitHub ↗
---
name: ai-python-ui-adapter
description: Use when connecting AI SDK for Python streams to AI SDK UI useChat clients.
metadata:
  sdk-version: "0.2.1"
---

# ai-python-ui-adapter

Frontend:

```tsx
const chat = useChat({
  transport: new DefaultChatTransport({ api: "/api/chat" }),
  sendAutomaticallyWhen: lastAssistantMessageIsCompleteWithApprovalResponses,
});
```

Use `chat.sendMessage(...)` to send user input. Use
`chat.addToolApprovalResponse(...)` from approval buttons.

Backend request:

```python
class ChatRequest(pydantic.BaseModel):
    messages: list[ai.agents.ui.ai_sdk.UIMessage]

messages, approvals = ai.agents.ui.ai_sdk.to_messages(request.messages)
ai.agents.ui.ai_sdk.apply_approvals(approvals)
```

Backend stream:

```python
async def body():
    async with agent.run(model, messages) as stream:
        async def events():
            async for event in stream:
                if (
                    isinstance(event, ai.events.HookEvent)
                    and event.hook.status == "pending"
                ):
                    ai.defer_hook(event.hook)
                yield event

        async for chunk in ai.agents.ui.ai_sdk.to_sse(events()):
            yield chunk

return StreamingResponse(
    body(),
    headers=ai.agents.ui.ai_sdk.UI_MESSAGE_STREAM_HEADERS,
)
```

The adapter handles `UIMessage` parsing, message IDs, tool state, approvals,
subagent `MessageBundle` values, and AI SDK UI stream events.

You handle the HTTP route, auth, storage, session lookup, frontend rendering,
and when to defer hooks.

For saved UI history, use:

```python
ui_messages = ai.agents.ui.ai_sdk.to_ui_messages(messages)
```

More from vercel-labs/seal