@copilotkit/runtime
Version:
<img src="https://github.com/user-attachments/assets/0a6b64d9-e193-4940-a3f6-60334ac34084" alt="banner" style="border-radius: 12px; border: 2px solid #d6d4fa;" />
91 lines (72 loc) • 2.88 kB
Markdown
SqliteAgentRunner — file-backed agent runner in `@copilotkit/sqlite-runner`. Uses `better-sqlite3` as a required peer dep.
```bash
pnpm add @copilotkit/sqlite-runner better-sqlite3
```
If `better-sqlite3` is missing, the `import` of `@copilotkit/sqlite-runner` itself fails
at module load (`Cannot find module 'better-sqlite3'`). The runner's constructor has a
friendlier multi-line install hint as a fallback, but you will see the bare resolution
error first — install the peer before the runner import resolves.
## Configure
```typescript
import { CopilotRuntime } from "@copilotkit/runtime/v2";
import { SqliteAgentRunner } from "@copilotkit/sqlite-runner";
const runtime = new CopilotRuntime({
agents: {
/* ... */
} as any,
runner: new SqliteAgentRunner({
dbPath: "./data/threads.db", // REQUIRED — default is ":memory:"
}),
});
```
`dbPath: ":memory:"` is the default if omitted — that reverts to an in-memory store and
loses data at restart. Always set a file path in production.
Three tables are created on first use (`packages/sqlite-runner/src/sqlite-runner.ts:75-109`):
```sql
CREATE TABLE IF NOT EXISTS agent_runs (
id INTEGER PRIMARY KEY AUTOINCREMENT,
thread_id TEXT NOT NULL,
run_id TEXT NOT NULL UNIQUE,
parent_run_id TEXT,
events TEXT NOT NULL, -- JSON-encoded BaseEvent[]
input TEXT NOT NULL, -- JSON-encoded RunAgentInput
created_at INTEGER NOT NULL,
version INTEGER NOT NULL
);
CREATE TABLE IF NOT EXISTS run_state (
thread_id TEXT PRIMARY KEY,
is_running INTEGER DEFAULT 0,
current_run_id TEXT,
updated_at INTEGER NOT NULL
);
CREATE TABLE IF NOT EXISTS schema_version (
version INTEGER PRIMARY KEY,
applied_at INTEGER NOT NULL
);
CREATE INDEX IF NOT EXISTS idx_thread_id ON agent_runs(thread_id);
CREATE INDEX IF NOT EXISTS idx_parent_run_id ON agent_runs(parent_run_id);
```
`agent_runs` is append-only — one row per completed run, full event log in the `events`
column. `run_state` gates concurrent runs (the `"Thread already running"` check).
`schema_version` tracks applied migrations so future releases can upgrade existing
databases in place.
## Retention
There is no automatic retention. If you need bounded history, add a periodic purge:
```typescript
import Database from "better-sqlite3";
const db = new Database("./data/threads.db");
setInterval(
() => {
const cutoff = Date.now() - 30 * 24 * 60 * 60 * 1000; // 30 days
db.prepare("DELETE FROM agent_runs WHERE created_at < ?").run(cutoff);
},
60 * 60 * 1000,
);
```
- Multi-instance deploys without shared storage — each instance would have its own DB file.
Either put the DB on a shared volume (EFS, persistent disk) with a single writer, or
choose Intelligence mode or a custom Redis/Postgres runner.
Source: `packages/sqlite-runner/src/sqlite-runner.ts`.