Skip to content

Commit 156ac55

Browse files
committed
feat: add agent checkpoints resource and database schema in live-demo
1 parent 2e726c2 commit 156ac55

13 files changed

Lines changed: 211 additions & 32 deletions

File tree

live-demo/app/index.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
1-
import betterSqlite3 from 'better-sqlite3';
21
import express from 'express';
3-
import AdminForth, { AdminForthDataTypes, Filters, AdminForthResource, AdminForthResourceColumn } from 'adminforth';
2+
import AdminForth, { Filters } from 'adminforth';
3+
import type { AdminUser } from 'adminforth';
44
import fs from 'fs';
55
import usersResource from "./resources/users";
66
import apartmentsResource from "./resources/apartments";
77
import auditLogsResource from "./resources/auditLogs"
88
import translations from "./resources/translations";
99
import sessionsResource from './resources/agent_resources/sessions';
1010
import turnsResource from './resources/agent_resources/turns';
11+
import checkpointsResource from './resources/agent_resources/checkpoints';
1112
import jobs_resource from './resources/jobs';
1213
import { randomUUID } from 'crypto';
1314
try { fs.mkdirSync('db') } catch (e) {}
@@ -66,6 +67,7 @@ new AdminForth({
6667
translations,
6768
sessionsResource,
6869
turnsResource,
70+
checkpointsResource,
6971
jobs_resource,
7072
],
7173
menu: [
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
-- CreateTable
2+
CREATE TABLE "agent_checkpoints" (
3+
"id" TEXT NOT NULL PRIMARY KEY,
4+
"thread_id" TEXT NOT NULL,
5+
"checkpoint_namespace" TEXT NOT NULL,
6+
"checkpoint_id" TEXT NOT NULL,
7+
"parent_checkpoint_id" TEXT,
8+
"row_kind" TEXT NOT NULL,
9+
"task_id" TEXT,
10+
"sequence" INTEGER NOT NULL,
11+
"created_at" DATETIME NOT NULL,
12+
"checkpoint_payload" TEXT,
13+
"metadata_payload" TEXT,
14+
"writes_payload" TEXT,
15+
"schema_version" INTEGER NOT NULL
16+
);
17+
18+
-- CreateIndex
19+
CREATE INDEX "agent_checkpoints_thread_id_checkpoint_namespace_checkpoint_id_idx" ON "agent_checkpoints"("thread_id", "checkpoint_namespace", "checkpoint_id");
20+
21+
-- CreateIndex
22+
CREATE INDEX "agent_checkpoints_created_at_idx" ON "agent_checkpoints"("created_at");

live-demo/app/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
"dependencies": {
1919
"@adminforth/agent": "^1.39.1",
2020
"@adminforth/audio-adapter-openai": "^1.2.0",
21+
"@adminforth/auto-remove": "^1.0.0",
2122
"@adminforth/audit-log": "^1.9.18",
2223
"@adminforth/background-jobs": "^1.11.4",
2324
"@adminforth/bulk-ai-flow": "^1.24.3",

live-demo/app/pnpm-lock.yaml

Lines changed: 12 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
import { AdminForthDataTypes } from 'adminforth';
2+
import type { AdminForthResourceInput, AdminUser } from 'adminforth';
3+
import AutoRemovePlugin from '@adminforth/auto-remove';
4+
5+
async function allowedForSuperAdmins({ adminUser }: { adminUser: AdminUser }): Promise<boolean> {
6+
return adminUser.dbUser.role === 'superadmin';
7+
}
8+
9+
const checkpointsResource: AdminForthResourceInput = {
10+
dataSource: 'maindb',
11+
table: 'agent_checkpoints',
12+
resourceId: 'agent_checkpoints',
13+
label: 'Agent Checkpoints',
14+
columns: [
15+
{
16+
name: 'id',
17+
primaryKey: true,
18+
type: AdminForthDataTypes.STRING,
19+
showIn: {
20+
edit: false,
21+
create: false,
22+
},
23+
},
24+
{
25+
name: 'thread_id',
26+
type: AdminForthDataTypes.STRING,
27+
},
28+
{
29+
name: 'checkpoint_namespace',
30+
type: AdminForthDataTypes.STRING,
31+
},
32+
{
33+
name: 'checkpoint_id',
34+
type: AdminForthDataTypes.STRING,
35+
},
36+
{
37+
name: 'parent_checkpoint_id',
38+
type: AdminForthDataTypes.STRING,
39+
},
40+
{
41+
name: 'row_kind',
42+
type: AdminForthDataTypes.STRING,
43+
},
44+
{
45+
name: 'task_id',
46+
type: AdminForthDataTypes.STRING,
47+
},
48+
{
49+
name: 'sequence',
50+
type: AdminForthDataTypes.INTEGER,
51+
},
52+
{
53+
name: 'created_at',
54+
type: AdminForthDataTypes.DATETIME,
55+
showIn: {
56+
edit: false,
57+
create: false,
58+
},
59+
},
60+
{
61+
name: 'checkpoint_payload',
62+
type: AdminForthDataTypes.TEXT,
63+
},
64+
{
65+
name: 'metadata_payload',
66+
type: AdminForthDataTypes.TEXT,
67+
},
68+
{
69+
name: 'writes_payload',
70+
type: AdminForthDataTypes.TEXT,
71+
},
72+
{
73+
name: 'schema_version',
74+
type: AdminForthDataTypes.INTEGER,
75+
},
76+
],
77+
plugins: [
78+
new AutoRemovePlugin({
79+
createdAtField: 'created_at',
80+
mode: 'time-based',
81+
deleteOlderThan: '3d',
82+
interval: '1d',
83+
}),
84+
],
85+
options: {
86+
allowedActions: {
87+
list: allowedForSuperAdmins,
88+
show: allowedForSuperAdmins,
89+
create: false,
90+
edit: false,
91+
delete: false,
92+
},
93+
},
94+
};
95+
96+
export default checkpointsResource;

live-demo/app/resources/agent_resources/sessions.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ async function allowedForSuperAdmins({ adminUser }: { adminUser: AdminUser }): P
66
return adminUser.dbUser.role === 'superadmin';
77
}
88

9-
export default {
9+
const sessionsResource: AdminForthResourceInput = {
1010
dataSource: 'maindb',
1111
table: 'sessions',
1212
resourceId: 'sessions',
@@ -53,4 +53,6 @@ export default {
5353
delete: false,
5454
},
5555
},
56-
} as AdminForthResourceInput;
56+
};
57+
58+
export default sessionsResource;

live-demo/app/resources/agent_resources/turns.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ async function allowedForSuperAdmins({ adminUser }: { adminUser: AdminUser }): P
66
return adminUser.dbUser.role === 'superadmin';
77
}
88

9-
export default {
9+
const turnsResource: AdminForthResourceInput = {
1010
dataSource: 'maindb',
1111
table: 'turns',
1212
resourceId: 'turns',
@@ -53,4 +53,6 @@ export default {
5353
delete: false,
5454
},
5555
},
56-
} as AdminForthResourceInput;
56+
};
57+
58+
export default turnsResource;

live-demo/app/resources/apartments.ts

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { AdminForthDataTypes } from 'adminforth';
2+
import type { AdminForthResourceInput } from 'adminforth';
23
import importExport from '@adminforth/import-export';
34
import RichEditorPlugin from '@adminforth/rich-editor';
45
import TextCompletePlugin from '@adminforth/text-complete';
@@ -11,14 +12,14 @@ import BulkAiFlowPlugin from '@adminforth/bulk-ai-flow';
1112
import AdminForthImageVisionAdapterOpenAi from '@adminforth/image-vision-adapter-openai';
1213
import CloneRow from "@adminforth/clone-row";
1314

14-
const blockDemoUsers = async ({ record, adminUser, resource }) => {
15+
const blockDemoUsers = async ({ adminUser }: { adminUser: any }) => {
1516
if (adminUser.dbUser && adminUser.dbUser.role !== 'superadmin') {
1617
return { ok: false, error: "You can't do this on demo.adminforth.dev" }
1718
}
1819
return { ok: true };
1920
}
2021

21-
export default {
22+
const apartmentsResource: AdminForthResourceInput = {
2223
dataSource: 'maindb',
2324
table: 'apartments',
2425
resourceId: 'aparts', // resourceId is defaulted to table name but you can redefine it like this e.g.
@@ -142,7 +143,7 @@ export default {
142143
},
143144
{
144145
name: 'description',
145-
type: AdminForthDataTypes.RICHTEXT,
146+
type: AdminForthDataTypes.TEXT,
146147
sortable: false,
147148
showIn: ['show', 'edit', 'create', 'filter'],
148149
components: {
@@ -170,15 +171,10 @@ export default {
170171
adapter: new CompletionAdapterOpenAIResponses({
171172
openAiApiKey: process.env.OPENAI_API_KEY as string,
172173
model: 'gpt-4o', // default "gpt-4o-mini"
173-
expert: {
174-
temperature: 0.7 //Model temperature, default 0.7
174+
extraRequestBodyParameters: {
175+
temperature: 0.7,
175176
}
176177
}),
177-
provider: 'openai-chat-gpt',
178-
params: {
179-
apiKey: process.env.OPENAI_API_KEY as string,
180-
// model: 'gpt-4o', gpt-4o-model is a default (cheapest one)
181-
},
182178
expert: {
183179
debounceTime: 250,
184180
}
@@ -295,4 +291,6 @@ export default {
295291
filter: true,
296292
},
297293
},
298-
}
294+
};
295+
296+
export default apartmentsResource;

live-demo/app/resources/auditLogs.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
import AuditLogPlugin from '@adminforth/audit-log';
22
import { AdminForthDataTypes } from 'adminforth'
3+
import type { AdminForthResourceInput } from 'adminforth';
34
import { randomUUID } from 'crypto';
45
import importExport from '@adminforth/import-export';
56

67

78

8-
export default {
9+
const auditLogsResource: AdminForthResourceInput = {
910
dataSource: 'maindb',
1011
table: 'audit_logs',
1112
columns: [
@@ -43,4 +44,6 @@ export default {
4344
}
4445
}),
4546
],
46-
}
47+
};
48+
49+
export default auditLogsResource;

live-demo/app/resources/jobs.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ async function allowedForSuperAdmin({ adminUser }: { adminUser: AdminUser }): Pr
77
return adminUser.dbUser.role === 'superadmin';
88
}
99

10-
export default {
10+
const jobsResource: AdminForthResourceInput = {
1111
dataSource: 'maindb',
1212
table: 'jobs',
1313
resourceId: 'jobs',
@@ -105,4 +105,6 @@ export default {
105105
jobHandlerField: 'job_handler_name',
106106
})
107107
]
108-
} as AdminForthResourceInput;
108+
};
109+
110+
export default jobsResource;

0 commit comments

Comments
 (0)