import { streamObject } from "ai"; import { customModelProvider } from "lib/ai/models"; import { buildAgentGenerationPrompt } from "lib/ai/prompts"; import globalLogger from "logger"; import { ChatModel } from "app-types/chat"; import { getSession } from "auth/server"; import { colorize } from "consola/utils"; import { AgentGenerateSchema } from "app-types/agent"; import { z } from "zod"; import { loadAppDefaultTools } from "../../chat/shared.chat"; import { workflowRepository } from "lib/db/repository"; import { safe } from "ts-safe"; import { objectFlow } from "lib/utils"; import { mcpClientsManager } from "lib/ai/mcp/mcp-manager"; const logger = globalLogger.withDefaults({ message: colorize("blackBright", `Agent Generate API: `), }); export async function POST(request: Request) { try { const json = await request.json(); const { chatModel, message = "hello" } = json as { chatModel?: ChatModel; message: string; }; logger.info(`chatModel: ${chatModel?.provider}/${chatModel?.model}`); const session = await getSession(); if (!session) { return new Response("Unauthorized", { status: 401 }); } const toolNames = new Set(); await safe(loadAppDefaultTools) .ifOk((appTools) => { objectFlow(appTools).forEach((_, toolName) => { toolNames.add(toolName); }); }) .unwrap(); await safe(mcpClientsManager.tools()) .ifOk((tools) => { objectFlow(tools).forEach((mcp) => { toolNames.add(mcp._originToolName); }); }) .unwrap(); await safe(workflowRepository.selectExecuteAbility(session.user.id)) .ifOk((tools) => { tools.forEach((tool) => { toolNames.add(tool.name); }); }) .unwrap(); const dynamicAgentTable = AgentGenerateSchema.extend({ tools: z .array( z.enum( Array.from(toolNames).length > 0 ? ([ Array.from(toolNames)[0], ...Array.from(toolNames).slice(1), ] as [string, ...string[]]) : ([""] as [string]), ), ) .describe("Agent allowed tools name") .nullable() .default([]), }); const system = buildAgentGenerationPrompt(Array.from(toolNames)); const result = streamObject({ model: customModelProvider.getModel(chatModel), system, prompt: message, schema: dynamicAgentTable, }); return result.toTextStreamResponse(); } catch (error) { logger.error(error); } }