Spaces:
Sleeping
Sleeping
| import { z } from 'zod'; | |
| import { TokenTracker } from "../utils/token-tracker"; | |
| import { SearchAction } from '../types'; | |
| import {ObjectGeneratorSafe} from "../utils/safe-generator"; | |
| const responseSchema = z.object({ | |
| think: z.string().describe('Strategic reasoning about query complexity and search approach'), | |
| queries: z.array(z.string().describe('Search query, must be less than 30 characters')) | |
| .min(1) | |
| .max(3) | |
| .describe('Array of search queries, orthogonal to each other') | |
| }); | |
| function getPrompt(action: SearchAction): string { | |
| return `You are an expert Information Retrieval query optimizer. Optimize user queries into precise keyword combinations with strategic reasoning and appropriate search operators. | |
| <rules> | |
| 1. Generate search queries that directly include appropriate operators | |
| 2. Keep base keywords minimal: 2-3 words preferred | |
| 3. Use exact match quotes for specific phrases that must stay together | |
| 4. Split queries only when necessary for distinctly different aspects | |
| 5. Preserve crucial qualifiers while removing fluff words | |
| 6. Make the query resistant to SEO manipulation | |
| 7. When necessary, append <query-operators> at the end only when must needed | |
| <query-operators> | |
| A query can't only have operators; and operators can't be at the start a query; | |
| - "phrase" : exact match for phrases | |
| - +term : must include term; for critical terms that must appear | |
| - -term : exclude term; exclude irrelevant or ambiguous terms | |
| - filetype:pdf/doc : specific file type | |
| - site:example.com : limit to specific site | |
| - lang:xx : language filter (ISO 639-1 code) | |
| - loc:xx : location filter (ISO 3166-1 code) | |
| - intitle:term : term must be in title | |
| - inbody:term : term must be in body text | |
| </query-operators> | |
| </rules> | |
| <examples> | |
| Input Query: What's the difference between ReactJS and Vue.js for building web applications? | |
| <think> | |
| This is a comparison query. User is likely looking for technical evaluation and objective feature comparisons, possibly for framework selection decisions. We'll split this into separate queries to capture both high-level differences and specific technical aspects. | |
| </think> | |
| Queries: [ | |
| "react performance", | |
| "vue performance", | |
| "react vue comparison", | |
| ] | |
| Input Query: How to fix a leaking kitchen faucet? | |
| <think> | |
| This is a how-to query seeking practical solutions. User likely wants step-by-step guidance and visual demonstrations for DIY repair. We'll target both video tutorials and written guides. | |
| </think> | |
| Output Queries: [ | |
| "kitchen faucet leak repair", | |
| "faucet drip fix site:youtube.com", | |
| "how to repair faucet " | |
| ] | |
| Input Query: What are healthy breakfast options for type 2 diabetes? | |
| <think> | |
| This is a health-specific informational query. User needs authoritative medical advice combined with practical meal suggestions. Splitting into medical guidelines and recipes will provide comprehensive coverage. | |
| </think> | |
| Output Queries: [ | |
| "what to eat for type 2 diabetes", | |
| "type 2 diabetes breakfast guidelines", | |
| "diabetic breakfast recipes" | |
| ] | |
| Input Query: Latest AWS Lambda features for serverless applications | |
| <think> | |
| This is a product research query focused on recent updates. User wants current information about specific technology features, likely for implementation purposes. We'll target official docs and community insights. | |
| </think> | |
| Output Queries: [ | |
| "aws lambda features site:aws.amazon.com intitle:2025", | |
| "new features lambda serverless" | |
| ] | |
| </examples> | |
| Now, process this query: | |
| Input Query: ${action.searchQuery} | |
| Intention: ${action.think} | |
| `; | |
| } | |
| const TOOL_NAME = 'queryRewriter'; | |
| export async function rewriteQuery(action: SearchAction, tracker?: TokenTracker): Promise<{ queries: string[] }> { | |
| try { | |
| const generator = new ObjectGeneratorSafe(tracker); | |
| const prompt = getPrompt(action); | |
| const result = await generator.generateObject({ | |
| model: TOOL_NAME, | |
| schema: responseSchema, | |
| prompt, | |
| }); | |
| console.log(TOOL_NAME, result.object.queries); | |
| return { queries: result.object.queries }; | |
| } catch (error) { | |
| console.error(`Error in ${TOOL_NAME}`, error); | |
| throw error; | |
| } | |
| } |