runtime
235
总安装量
236
周安装量
#1171
全站排名
安装命令
npx skills add https://github.com/assistant-ui/skills --skill runtime
Agent 安装分布
claude-code
159
codex
151
opencode
140
gemini-cli
136
github-copilot
125
cursor
105
Skill 文档
assistant-ui Runtime
Always consult assistant-ui.com/llms.txt for latest API.
References
- ./references/local-runtime.md — useLocalRuntime deep dive
- ./references/external-store.md — useExternalStoreRuntime deep dive
- ./references/thread-list.md — Thread list management
- ./references/state-hooks.md — State access hooks
- ./references/types.md — Type definitions
Runtime Hierarchy
AssistantRuntime
âââ ThreadListRuntime (thread management)
â âââ ThreadListItemRuntime (per-thread item)
â âââ ...
âââ ThreadRuntime (current thread)
âââ ComposerRuntime (input state)
âââ MessageRuntime[] (per-message)
âââ MessagePartRuntime[] (per-content-part)
State Access (Modern API)
import { useAssistantApi, useAssistantState, useAssistantEvent } from "@assistant-ui/react";
function ChatControls() {
const api = useAssistantApi();
const messages = useAssistantState(s => s.thread.messages);
const isRunning = useAssistantState(s => s.thread.isRunning);
useAssistantEvent("message-added", (e) => {
console.log("New message:", e.message);
});
return (
<div>
<button onClick={() => api.thread().append({
role: "user",
content: [{ type: "text", text: "Hello!" }],
})}>
Send
</button>
{isRunning && (
<button onClick={() => api.thread().cancelRun()}>Cancel</button>
)}
</div>
);
}
Thread Operations
const api = useAssistantApi();
const thread = api.thread();
// Append message
thread.append({ role: "user", content: [{ type: "text", text: "Hello" }] });
// Cancel generation
thread.cancelRun();
// Get current state
const state = thread.getState(); // { messages, isRunning, ... }
Message Operations
const message = api.thread().message(0); // By index
message.edit({ role: "user", content: [{ type: "text", text: "Updated" }] });
message.reload();
Events
useAssistantEvent("thread-started", () => {});
useAssistantEvent("thread-ended", () => {});
useAssistantEvent("message-added", ({ message }) => {});
useAssistantEvent("run-started", () => {});
useAssistantEvent("run-ended", () => {});
Capabilities
const caps = useAssistantState(s => s.thread.capabilities);
// { cancel, edit, reload, copy, speak, attachments }
Quick Reference
// Get messages
const messages = useAssistantState(s => s.thread.messages);
// Check running state
const isRunning = useAssistantState(s => s.thread.isRunning);
// Append message
api.thread().append({ role: "user", content: [{ type: "text", text: "Hi" }] });
// Cancel generation
api.thread().cancelRun();
// Edit message
api.thread().message(index).edit({ ... });
// Reload message
api.thread().message(index).reload();
Common Gotchas
“Cannot read property of undefined”
- Ensure hooks are called inside
AssistantRuntimeProvider
State not updating
- Use selectors with
useAssistantStateto prevent unnecessary re-renders
Messages array empty
- Check runtime is configured
- Verify API response format