From 0cb5d8bc508ee07931d078df407be43289555599 Mon Sep 17 00:00:00 2001 From: Mark Henderson Date: Mon, 27 Apr 2026 17:37:18 -0700 Subject: [PATCH] Fix AI confusion: clean projects_get output, clarify project vs app in system prompt projects_get was dumping raw JSONB including turborepo scaffold fields (product/website/admin/storybook sub-app configs), which Gemini mistook for live deployed services. Now returns a clean summary with only the fields relevant to the AI. Also updated the system prompt to explicitly distinguish Vibn project records (planning artifacts) from Coolify apps (actual running services), instructing the model to call apps_list when the user asks what's live. Made-with: Cursor --- app/api/chat/route.ts | 11 ++++++++++- app/api/mcp/route.ts | 17 ++++++++++++++++- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/app/api/chat/route.ts b/app/api/chat/route.ts index 80ed9916..34e017ad 100644 --- a/app/api/chat/route.ts +++ b/app/api/chat/route.ts @@ -62,16 +62,25 @@ function buildSystemPrompt(projects: any[], workspace: string): string { return `You are Vibn AI, an expert product and infrastructure assistant embedded in the Vibn platform. You are talking to the owner of the "${workspace}" workspace. +## Architecture (important — read carefully) +Vibn has two separate concepts: +1. **Projects** (in the Vibn DB) — planning/concept records. They store a product vision, status, and metadata. They are NOT running services. +2. **Apps / Services** (in Coolify) — actual live deployments. These are what have domains and real endpoints. Call \`apps_list\` to see what is actually running. + +When a user asks what's live, call \`apps_list\` — not \`projects_get\`. Project records from \`projects_get\` describe what the user *wants* to build, not what is deployed. + ## Current workspace projects ${projectsText} ## Your capabilities You can take real actions by calling tools: -- List/inspect projects and deployed apps +- List/inspect projects and deployed apps (\`apps_list\` shows live services) - Deploy new applications from templates (n8n, WordPress, Twenty CRM, etc.) or Docker images - Register and manage custom domains - View application logs - Search available app templates +- Search GitHub for open-source projects to reference or fork +- Fetch any public URL or file ## Guidelines - Be concise and action-oriented. If the user wants to deploy something, do it — don't just describe how. diff --git a/app/api/mcp/route.ts b/app/api/mcp/route.ts index 7c1be317..15c0c9ec 100644 --- a/app/api/mcp/route.ts +++ b/app/api/mcp/route.ts @@ -380,8 +380,23 @@ async function toolProjectsGet(principal: Principal, params: Record return NextResponse.json({ error: 'Project not found in this workspace' }, { status: 404 }); } const r = rows[0]; + const d = r.data || {}; + // Return a clean summary rather than the raw JSONB, which contains noisy + // internal scaffold fields (product/website/admin/storybook sub-app configs) + // that the AI tends to misread as live deployed services. return NextResponse.json({ - result: { id: r.id, data: r.data, createdAt: r.created_at, updatedAt: r.updated_at }, + result: { + id: r.id, + name: d.productName || d.name || d.title || 'Untitled', + status: d.status || 'defining', + vision: d.productVision || d.vision || null, + domain: d.domain || d.customDomain || null, + coolifyAppUuid: d.coolifyAppUuid || d.coolifyServiceUuid || null, + coolifyDomain: d.coolifyDomain || null, + repositoryUrl: d.repositoryUrl || null, + createdAt: r.created_at, + updatedAt: r.updated_at, + }, }); }