UNPKG

@directus/api

Version:

Directus is a real-time API and App dashboard for managing SQL database content

81 lines (80 loc) 2.6 kB
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(), }));