invoke_tools runs it, and both results are columns on that row.
Create the tables with pxt schema update app.py my_app, then open them with t = pxt.get_table('my_app.assistant'). Cookbooks on this topic use pxt.create_table() so you can run cells without a project. An app puts the same columns on a TableModel in app.py and creates the tables with pxt schema update.
pxt service list prints the URL. POST /ask with {"message": "..."}. Chat history is another table with an embedding index: Agent memory. MCP tools load with pxt.mcp_udfs(...) and go into the same pxt.tools() list.
A full chat app: uvx pixeltable-new copies the starter kit agent. Pass agent as the last argument to pxt schema update. /ask needs ANTHROPIC_API_KEY.
On Cloud, create an API key in the dashboard, set PIXELTABLE_API_KEY, then run pxt db update, pxt schema update, and pxt service update against pxt://org:mydb.
Search over chunks instead of tools: RAG and live APIs. Coming from LangGraph: Migrate.
Tool calling
Register tools and run
invoke_tools as a column.Agentic patterns
Patterns for agents as tables.
RAG pipeline
Search over chunks instead of tools.
HTTP serving
POST
/ask from the same file.