diff --git a/app/api/generate-query/route.ts b/app/api/generate-query/route.ts index 51f289fd..740ff680 100644 --- a/app/api/generate-query/route.ts +++ b/app/api/generate-query/route.ts @@ -1,19 +1,17 @@ import { getDatabaseSchema } from '~/lib/schema'; import { NextRequest, NextResponse } from 'next/server'; -import { generateSqlQueries, detectDatabaseTypeFromPrompt, type Table } from '~/lib/.server/llm/database-source'; +import { generateSqlQueries } from '~/lib/.server/llm/database-source'; import { createScopedLogger } from '~/utils/logger'; import { z } from 'zod'; import { prisma } from '~/lib/prisma'; import { requireUserId } from '~/auth/session'; -import { getConnectionProtocol } from '@liblab/data-access/utils/connection'; -import { DataAccessor } from '@liblab/data-access/dataAccessor'; const logger = createScopedLogger('generate-sql'); const requestSchema = z.object({ prompt: z.string(), existingQuery: z.string().optional(), - dataSourceId: z.string().optional(), + dataSourceId: z.string(), suggestedDatabaseType: z.string().optional(), }); @@ -22,54 +20,19 @@ export async function POST(request: NextRequest) { try { const body = await request.json(); - const { prompt, existingQuery, dataSourceId, suggestedDatabaseType } = requestSchema.parse(body); + const { prompt, existingQuery, dataSourceId } = requestSchema.parse(body); const existingQueries = existingQuery ? [existingQuery] : []; - let schema: Table[]; - let type: string; + const schema = await getDatabaseSchema(dataSourceId, userId); - // If dataSourceId is provided, use the existing data source - if (dataSourceId) { - schema = await getDatabaseSchema(dataSourceId, userId); - - const dataSource = await prisma.dataSource.findUniqueOrThrow({ - where: { id: dataSourceId, createdById: userId }, - }); - - type = getConnectionProtocol(dataSource.connectionString); - } else { - // Use AI to determine database type from prompt - const availableTypes = DataAccessor.getAvailableDatabaseTypes(); - const detectedType = suggestedDatabaseType || (await detectDatabaseTypeFromPrompt(prompt, availableTypes)); - - if (!detectedType) { - return NextResponse.json( - { error: 'Could not determine database type from prompt. Please specify a data source.' }, - { status: 400 }, - ); - } - - type = detectedType; - - logger.warn( - `â ī¸ WARNING: No dataSourceId provided. Using sample schema for ${type}. Create a data source to query real data.`, - ); - - // For demonstration purposes, create a sample schema based on common patterns - // In a real implementation, you might want to ask the user to specify their schema - const sampleSchema = DataAccessor.getSampleSchema(type); - - if (!sampleSchema) { - return NextResponse.json({ error: 'Unsupported database type' }, { status: 400 }); - } - - schema = sampleSchema; - } + const dataSource = await prisma.dataSource.findUniqueOrThrow({ + where: { id: dataSourceId, createdById: userId }, + }); const queries = await generateSqlQueries({ schema, userPrompt: prompt, - databaseType: type, + connectionString: dataSource.connectionString, existingQueries, }); diff --git a/app/components/@settings/tabs/data/forms/AddDataSourceForm.tsx b/app/components/@settings/tabs/data/forms/AddDataSourceForm.tsx index 9234c4cc..d1e25d4e 100644 --- a/app/components/@settings/tabs/data/forms/AddDataSourceForm.tsx +++ b/app/components/@settings/tabs/data/forms/AddDataSourceForm.tsx @@ -1,7 +1,7 @@ import { classNames } from '~/utils/classNames'; import { useState } from 'react'; import { toast } from 'sonner'; -import { XCircle, CheckCircle, Loader2, Plug, Save } from 'lucide-react'; +import { CheckCircle, Loader2, Plug, Save, XCircle } from 'lucide-react'; import type { TestConnectionResponse } from '~/components/@settings/tabs/data/DataTab'; import { z } from 'zod'; import { BaseSelect } from '~/components/ui/Select'; @@ -181,6 +181,7 @@ export default function AddDataSourceForm({ isSubmitting, setIsSubmitting, onSuc