@directus/api
Version:
Directus is a real-time API and App dashboard for managing SQL database content
81 lines (80 loc) • 2.6 kB
JavaScript
import {} from 'ai';
import { z } from 'zod';
import { parseJsonSchema7 } from '../utils/parse-json-schema-7.js';
import { ProviderAnthropic, ProviderGoogle, ProviderOpenAi, ProviderOpenAiCompatible } from './providers.js';
export const ChatRequestTool = z.union([
z.string(),
z.object({
name: z.string(),
description: z.string(),
inputSchema: z.custom((schema) => {
try {
parseJsonSchema7(schema);
return true;
}
catch {
return false;
}
}, { message: 'Invalid JSON schema' }),
}),
]);
export const ToolApprovalMode = z.enum(['always', 'ask', 'disabled']);
const ItemContextData = z.object({
collection: z.string(),
key: z.union([z.string(), z.number()]),
});
const VisualElementContextData = z.object({
key: z.string(),
collection: z.string(),
item: z.union([z.string(), z.number()]),
fields: z.array(z.string()).optional(),
rect: z
.object({
top: z.number(),
left: z.number(),
width: z.number(),
height: z.number(),
})
.optional(),
});
const PromptContextData = z.object({
text: z.string(),
prompt: z.record(z.string(), z.unknown()),
values: z.record(z.string(), z.string()),
});
export const ContextAttachment = z.discriminatedUnion('type', [
z.object({
type: z.literal('item'),
display: z.string(),
data: ItemContextData,
snapshot: z.record(z.string(), z.unknown()),
}),
z.object({
type: z.literal('visual-element'),
display: z.string(),
data: VisualElementContextData,
snapshot: z.record(z.string(), z.unknown()),
}),
z.object({
type: z.literal('prompt'),
display: z.string(),
data: PromptContextData,
snapshot: z.record(z.string(), z.unknown()),
}),
]);
export const PageContext = z.object({
path: z.string(),
collection: z.string().optional(),
item: z.union([z.string(), z.number()]).optional(),
module: z.string().optional(),
});
export const ChatContext = z.object({
attachments: z.array(ContextAttachment).max(10).optional(),
page: PageContext.optional(),
});
export const ChatRequest = z.intersection(z.discriminatedUnion('provider', [ProviderOpenAi, ProviderAnthropic, ProviderGoogle, ProviderOpenAiCompatible]), z.object({
tools: z.array(ChatRequestTool),
messages: z.array(z.looseObject({})),
toolApprovals: z.record(z.string(), ToolApprovalMode).optional(),
context: ChatContext.optional(),
}));