# AI Python UI Adapter

> Use when connecting AI SDK for Python streams to AI SDK UI useChat clients.

- Skill: `vercel-labs/ai-python-ui-adapter` (Agent Skill)
- Install (CLI): `npx skillmds@latest add vercel-labs/ai-python-ui-adapter`
- Raw SKILL.md: https://api.skillmd.com/api/skills/vercel-labs/ai-python-ui-adapter/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: Vercel Labs (https://skillmd.com/u/vercel-labs)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/vercel-labs/ai-python-ui-adapter

---


# 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)
```

