Skip to main content

Chat components

Add streaming chat without writing an event reducer.

At a glance

TypeScript
React and core client
Python
Async, terminal, Streamlit
Approval
In page

Install​

Create an API key. Install the SDK for your application.

Terminal, TypeScript
npm install @alethi/pantheon-chat react@18 react-dom@18
Terminal, Python
pip install pantheon-chat

React​

Render the component with an agent slug and application tool handlers.

App.tsx
import { PantheonChat } from "@alethi/pantheon-chat/react";


export default function App() {
  return (
    <PantheonChat
      baseUrl="PANTHEON_BASE_URL"
      apiKey="PANTHEON_API_KEY"
      agentSlug="todo-assistant"
      userId={signedInUserId}
      tools={{
        echo_tool: async (input) => ({ echoed: input.message }),
        todo_ops: {
          requireApproval: true,
          execute: async (input) => ({ applied: true, operations: input.operations }),
        },
      }}
    />
  );
}

requireApproval shows an in-page Approve or Decline card.

Node client​

Use the core client with Node 18 or later.

app.mjs
import { PantheonClient } from "@alethi/pantheon-chat";


const baseUrl = process.env.PANTHEON_BASE_URL;
const apiKey = process.env.PANTHEON_API_KEY;
const client = new PantheonClient({ baseUrl, apiKey });
const session = await client.createSession({
  agentSlug: "todo-assistant",
  userId: signedInUserId,
});
const run = await client.startRun(session.id, "Hello");
for await (const event of client.streamEvents(session.id)) {
  if (event.type === "message.delta") process.stdout.write(event.delta.text || "");
  if (event.type === "run.completed") break;
}

Identify the person chatting​

Pass the id of the tenant user this conversation belongs to. The agent keeps long-lived notes about whoever it is talking to, and this is what tells Pantheon who that is.

With it, those notes follow the person across their sessions. Without it, they stay inside the single session, so nothing the agent learns from one visitor can reach another. Read Agent memory before deciding.

Props​

PropUse
baseUrlPantheon API base URL.
apiKeyBearer API key.
agentSlugAgent for a new session.
deploymentIdExplicit deployment instead of a slug.
userIdWhich of your end users is chatting. It decides whose agent memory the conversation reads. Omit it and memory stays inside this one session. See Agent memory.
toolsApplication tool handlers and approval rules.
themelight, dark, or auto.
titleSession title.

Python​

Use the async client directly.

app.py
import asyncio
import os
from pantheon_chat import PantheonClient


async def main():
    async with PantheonClient(
        os.environ["PANTHEON_BASE_URL"],
        os.environ["PANTHEON_API_KEY"],
    ) as client:
        session = await client.create_session(
            agent_slug="todo-assistant",
            user_id=signed_in_user_id,
        )
        run = await client.start_run(session.id, "What is 15 + 15?")
        async for event in client.stream_events(session.id, run_id=run.run_id, stop_on_terminal=True):
            print(event.type, event.content or event.data)


asyncio.run(main())

Terminal chat​

Terminal
export PANTHEON_BASE_URL="https://pantheon-todo.alethiconsulting.com/pantheon-api"
export PANTHEON_API_KEY="PANTHEON_API_KEY"
export PANTHEON_AGENT_SLUG="todo-assistant"
python -m pantheon_chat

Application tools ask for approval. Pass --auto-approve only for trusted tools.

Streamlit​

Terminal
pip install "pantheon-chat[streamlit]"
export PANTHEON_BASE_URL="https://pantheon-todo.alethiconsulting.com/pantheon-api"
export PANTHEON_API_KEY="PANTHEON_API_KEY"
export PANTHEON_AGENT_SLUG="todo-assistant"
pantheon-chat-streamlit

Pitfalls​

  • Queued text can wait behind approval: Resolve the approval before expecting the queued message to run.
  • A network reconnect repeats output: Persist only durable SSE ids. Never use an ephemeral delta's JSON id as the cursor.
  • A Stop request fails: Keep the run active and show the error until cancel returns HTTP 202.

Search docs

Esc

Ask Bami

Bami answers inside your signed-in dashboard. Write your question here, then paste it into Bami with Cmd/Ctrl+/.