Install
npm install @polpo-ai/sdk @polpo-ai/react
Setup
import { PolpoProvider } from "@polpo-ai/react";
const root = createRoot(document.getElementById("root")!);
root.render(
<PolpoProvider
baseUrl={import.meta.env.VITE_POLPO_URL}
apiKey={import.meta.env.VITE_POLPO_API_KEY}
>
<App />
</PolpoProvider>
);
Chat with an agent
The useChat hook handles streaming, session management, tool call tracking, and abort in a single hook:
import { useState } from "react";
import { useChat } from "@polpo-ai/react";
export function Chat() {
const [input, setInput] = useState("");
const { messages, sendMessage, isStreaming, abort, newSession } = useChat({
agent: "assistant",
});
const send = () => {
if (!input.trim()) return;
sendMessage(input);
setInput("");
};
return (
<div>
{messages.map((m, i) => (
<div key={i} className={m.role}>{m.content}</div>
))}
<input value={input} onChange={e => setInput(e.target.value)} onKeyDown={e => e.key === "Enter" && send()} />
<button onClick={send} disabled={isStreaming}>Send</button>
<button onClick={abort} disabled={!isStreaming}>Stop</button>
<button onClick={newSession}>New chat</button>
</div>
);
}
Live task dashboard
import { useTasks, useStats } from "@polpo-ai/react";
export function Dashboard() {
const { tasks, isLoading } = useTasks();
const { stats } = useStats();
if (isLoading) return <div>Loading...</div>;
return (
<div>
<div>
<span>{stats?.pending ?? 0} pending</span>
<span>{stats?.inProgress ?? 0} running</span>
<span>{stats?.done ?? 0} done</span>
</div>
<ul>
{tasks.map(t => (
<li key={t.id}>{t.title} — {t.status}</li>
))}
</ul>
</div>
);
}
Environment variables
# .env
VITE_POLPO_URL=https://{project}.polpo.cloud
VITE_POLPO_API_KEY=sk_live_...
Never expose API keys in client-side code in production. Use a backend proxy or session-based auth to inject the key server-side.
Templates
Get started faster with pre-built templates. Browse all available templates at ui.polpo.sh/examples — these are also available in the polpo create wizard.