72 lines
2.0 KiB
TypeScript
72 lines
2.0 KiB
TypeScript
import { openai } from "@ai-sdk/openai";
|
|
import { generateText, type LanguageModel } from "ai";
|
|
import { env } from "~/env.server";
|
|
|
|
/**
|
|
* Result type for title generation
|
|
*/
|
|
export type AIQueryTitleResult =
|
|
| { success: true; title: string }
|
|
| { success: false; error: string };
|
|
|
|
/**
|
|
* Service for generating concise titles for SQL queries using AI
|
|
*/
|
|
export class AIQueryTitleService {
|
|
constructor(private readonly model: LanguageModel = openai("gpt-4o-mini")) {}
|
|
|
|
/**
|
|
* Generate a concise title for a SQL query
|
|
*/
|
|
async generateTitle(query: string): Promise<AIQueryTitleResult> {
|
|
if (!env.OPENAI_API_KEY) {
|
|
return { success: false, error: "OpenAI API key is not configured" };
|
|
}
|
|
|
|
try {
|
|
const result = await generateText({
|
|
model: this.model,
|
|
system: `You are a helpful assistant that generates concise titles for SQL queries.
|
|
|
|
Your task is to create a short, descriptive title (5-10 words) that summarizes what the query does.
|
|
|
|
Guidelines:
|
|
- Focus on the main purpose/intent of the query
|
|
- Use plain language, not technical SQL terms
|
|
- Start with an action verb when appropriate (e.g., "Count", "List", "Show", "Find")
|
|
- Be specific about what data is being retrieved
|
|
- Do not include quotes around the title
|
|
- Do not include punctuation at the end
|
|
|
|
Examples:
|
|
- "Failed runs by hour over 7 days"
|
|
- "Top 50 most expensive task runs"
|
|
- "Run counts grouped by status"
|
|
- "Average execution time by task"
|
|
- "Recent runs with errors"`,
|
|
prompt: `Generate a concise title for this SQL query:\n\n${query}`,
|
|
maxOutputTokens: 50,
|
|
experimental_telemetry: {
|
|
isEnabled: true,
|
|
metadata: {
|
|
feature: "ai-query-title",
|
|
},
|
|
},
|
|
});
|
|
|
|
const title = result.text.trim();
|
|
|
|
if (!title) {
|
|
return { success: false, error: "No title generated" };
|
|
}
|
|
|
|
return { success: true, title };
|
|
} catch (error) {
|
|
return {
|
|
success: false,
|
|
error: error instanceof Error ? error.message : "Failed to generate title",
|
|
};
|
|
}
|
|
}
|
|
}
|