feat: add agent search config and system assistant defaults

Adds a config jsonb column to agents for per-agent search settings
(enabled, rerank, maxResults). Types systemAssistants with rename and
rerank sub-objects. Backfills missing systemAssistants keys on settings
fetch. Includes generated drizzle migrations.
This commit is contained in:
Zoe
2026-04-27 12:05:27 -05:00
parent 1ed2bd8b16
commit 90d5698e76
10 changed files with 5565 additions and 19 deletions
+17 -11
View File
@@ -15,6 +15,13 @@ export default defineEventHandler(async (event) => {
systemPrompt: z.string().nullable().optional(),
imageUrl: z.string().optional(),
defaultModelId: z.string().optional(),
config: z.object({
search: z.object({
enabled: z.boolean(),
rerank: z.boolean(),
maxResults: z.number().min(1).max(50),
}).optional(),
}).optional(),
})
.safeParse(body),
);
@@ -28,15 +35,17 @@ export default defineEventHandler(async (event) => {
const agentId = getRouterParam(event, 'id')!;
const { name, systemPrompt, imageUrl, defaultModelId } = result.data;
const { name, systemPrompt, imageUrl, defaultModelId, config } = result.data;
const updateData: Record<string, any> = {};
if (name !== undefined) updateData.name = name;
if (systemPrompt !== undefined) updateData.systemPrompt = systemPrompt;
if (imageUrl !== undefined) updateData.imageUrl = imageUrl;
if (defaultModelId !== undefined) updateData.defaultModelId = defaultModelId;
if (config !== undefined) updateData.config = config;
const res = await db.update(agents)
.set({
name,
systemPrompt,
imageUrl,
defaultModelId,
})
.set(updateData)
.where(
and(
eq(agents.id, agentId),
@@ -55,10 +64,7 @@ export default defineEventHandler(async (event) => {
op: 'update',
payload: {
id: agentId,
name,
systemPrompt,
imageUrl,
defaultModelId,
...updateData,
},
});
+36 -3
View File
@@ -1,4 +1,4 @@
import { and, eq } from 'drizzle-orm';
import { eq } from 'drizzle-orm';
import { settings } from '~~/drizzle/schema';
import { db } from '~~/server/lib/db';
@@ -14,18 +14,51 @@ export default defineEventHandler(async (event) => {
await protectRoute(event);
const userId = event.context.user!.id as string;
const existing = await db.query.settings.findFirst({
let existing = await db.query.settings.findFirst({
where: { userId },
});
const defaultSystemAssistants = {
rename: {
enabled: false,
modelId: null,
},
rerank: {
enabled: false,
modelId: null,
}
};
if (existing) {
const missingSystemAssistants = Object.keys(defaultSystemAssistants).filter(key => !(key in existing!.systemAssistants));
if (missingSystemAssistants.length > 0) {
const [updated] = await db.update(settings)
.set({
systemAssistants: {
...defaultSystemAssistants,
...existing.systemAssistants,
},
})
.where(eq(settings.id, existing.id)).returning();
if (!updated) {
throw createError({
statusCode: 500,
statusMessage: 'Failed to update settings',
message: 'Failed to update settings',
});
}
existing = updated;
}
return existing;
}
const [created] = await db.insert(settings)
.values({
userId,
systemAssistants: {},
systemAssistants: defaultSystemAssistants,
appearance: defaultAppearance,
})
.returning();
+1
View File
@@ -74,6 +74,7 @@ export default defineEventHandler(async (event) => {
await db.update(settings)
.set({
appearance: newAppearance,
// @ts-ignore - I dont have the energy to type this correctly right now
systemAssistants: newSystemAssistants,
})
.where(and(eq(settings.id, existingId)));