Skip to content

Commit 49646d4

Browse files
committed
Merge branch 'next' of github.com:devforth/adminforth into next
2 parents 649abb4 + 1177cbc commit 49646d4

4 files changed

Lines changed: 101 additions & 7 deletions

File tree

dev-demo/custom/TurnDebugShow.vue

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -84,21 +84,21 @@
8484

8585
<div class="mt-4 grid gap-3 md:grid-cols-5">
8686
<div class="rounded-lg bg-slate-50 p-3 dark:bg-slate-800/70">
87-
<div class="text-xs uppercase tracking-wide text-slate-500 dark:text-slate-400">Prompt</div>
87+
<div class="text-xs uppercase tracking-wide text-slate-500 dark:text-slate-400">Prompt Tokens</div>
8888
<div class="mt-1 text-sm font-semibold text-slate-900 dark:text-white">
89-
{{ sequence.prompt ? `${sequence.prompt.length} chars` : 'Empty' }}
89+
{{ sequence.prompt ? `${formatNumber(sequence.promptTokens)} tokens` : 'Empty' }}
9090
</div>
9191
</div>
9292
<div class="rounded-lg bg-slate-50 p-3 dark:bg-slate-800/70">
93-
<div class="text-xs uppercase tracking-wide text-slate-500 dark:text-slate-400">Reasoning</div>
93+
<div class="text-xs uppercase tracking-wide text-slate-500 dark:text-slate-400">Reasoning Tokens</div>
9494
<div class="mt-1 text-sm font-semibold text-slate-900 dark:text-white">
95-
{{ sequence.reasoning ? `${sequence.reasoning.length} chars` : 'Empty' }}
95+
{{ sequence.reasoning ? `${formatNumber(sequence.reasoningTokens)} tokens` : 'Empty' }}
9696
</div>
9797
</div>
9898
<div class="rounded-lg bg-slate-50 p-3 dark:bg-slate-800/70">
99-
<div class="text-xs uppercase tracking-wide text-slate-500 dark:text-slate-400">Text</div>
99+
<div class="text-xs uppercase tracking-wide text-slate-500 dark:text-slate-400">Text Tokens</div>
100100
<div class="mt-1 text-sm font-semibold text-slate-900 dark:text-white">
101-
{{ sequence.text ? `${sequence.text.length} chars` : 'Empty' }}
101+
{{ sequence.text ? `${formatNumber(sequence.textTokens)} tokens` : 'Empty' }}
102102
</div>
103103
</div>
104104
<div class="rounded-lg bg-slate-50 p-3 dark:bg-slate-800/70">
@@ -278,8 +278,11 @@ type DebugSequence = {
278278
sequenceId: number;
279279
startedAt: string;
280280
prompt: string;
281+
promptTokens: number;
281282
reasoning: string;
283+
reasoningTokens: number;
282284
text: string;
285+
textTokens: number;
283286
cachedTokens: number;
284287
responseId: string | null;
285288
toolCalls: DebugToolCall[];

dev-demo/resources/agent_resources/sessions.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import AdminForth, { AdminForthDataTypes } from 'adminforth';
22
import type { AdminForthResourceInput, AdminUser } from 'adminforth';
33
import { randomUUID } from 'crypto';
4+
import ForeignInlineListPlugin from '../../../plugins/adminforth-foreign-inline-list/index.js';
45

56
export default {
67
dataSource: 'sqlite',
@@ -42,6 +43,11 @@ export default {
4243
edit: false,
4344
create: false,
4445
}
45-
}
46+
},
47+
],
48+
plugins: [
49+
new ForeignInlineListPlugin({
50+
foreignResourceId: 'turns',
51+
}),
4652
],
4753
} as AdminForthResourceInput;

dev-demo/resources/agent_resources/turns.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,10 @@ export default {
2121
{
2222
name: 'session_id',
2323
type: AdminForthDataTypes.STRING,
24+
foreignResource: {
25+
resourceId: 'sessions',
26+
labelField: 'id'
27+
}
2428
},
2529
{
2630
name: 'created_at',
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
import { mkdtemp, mkdir, rm, writeFile } from "fs/promises";
2+
import os from "os";
3+
import path from "path";
4+
import {
5+
listProjectSkillManifests,
6+
loadSkillMarkdown,
7+
} from "../../plugins/adminforth-agent/agent/skills/registry.js";
8+
9+
const SKILL_MARKDOWN = (name: string, description: string, body: string) => `name: ${name}
10+
description: ${description}
11+
---
12+
13+
${body}
14+
`;
15+
16+
describe("adminforth-agent skills registry", () => {
17+
let customComponentsDir: string;
18+
19+
beforeEach(async () => {
20+
customComponentsDir = await mkdtemp(
21+
path.join(os.tmpdir(), "adminforth-agent-skills-"),
22+
);
23+
});
24+
25+
afterEach(async () => {
26+
await rm(customComponentsDir, { recursive: true, force: true });
27+
});
28+
29+
it("collects skills from both user custom skill directories", async () => {
30+
const rootSkillDir = path.join(customComponentsDir, "skills", "root-skill");
31+
const pluginSkillDir = path.join(
32+
customComponentsDir,
33+
"plugins",
34+
"adminforth-agent",
35+
"skills",
36+
"plugin-skill",
37+
);
38+
39+
await mkdir(rootSkillDir, { recursive: true });
40+
await mkdir(pluginSkillDir, { recursive: true });
41+
42+
await writeFile(
43+
path.join(rootSkillDir, "SKILL.md"),
44+
SKILL_MARKDOWN("root-skill", "Root custom skill", "Root body"),
45+
"utf8",
46+
);
47+
await writeFile(
48+
path.join(pluginSkillDir, "SKILL.md"),
49+
SKILL_MARKDOWN("plugin-skill", "Plugin custom skill", "Plugin body"),
50+
"utf8",
51+
);
52+
53+
const skills = await listProjectSkillManifests(customComponentsDir);
54+
55+
expect(skills.map((skill) => skill.name)).toEqual([
56+
"root-skill",
57+
"plugin-skill",
58+
]);
59+
});
60+
61+
it("loads markdown from the plugin-scoped user custom directory", async () => {
62+
const pluginSkillDir = path.join(
63+
customComponentsDir,
64+
"plugins",
65+
"adminforth-agent",
66+
"skills",
67+
"plugin-skill",
68+
);
69+
70+
await mkdir(pluginSkillDir, { recursive: true });
71+
await writeFile(
72+
path.join(pluginSkillDir, "SKILL.md"),
73+
SKILL_MARKDOWN("plugin-skill", "Plugin custom skill", "Plugin body"),
74+
"utf8",
75+
);
76+
77+
await expect(loadSkillMarkdown("plugin-skill", customComponentsDir)).resolves.toContain(
78+
"Plugin body",
79+
);
80+
});
81+
});

0 commit comments

Comments
 (0)