( sdk: ISdk, provider: MemoryProvider, )
| 67 | } |
| 68 | |
| 69 | export function registerQueryExpansionFunction( |
| 70 | sdk: ISdk, |
| 71 | provider: MemoryProvider, |
| 72 | ): void { |
| 73 | sdk.registerFunction("mem::expand-query", |
| 74 | async (data: { query: string; maxReformulations?: number } | undefined) => { |
| 75 | if (!data || typeof data.query !== "string" || !data.query.trim()) { |
| 76 | logger.warn("Invalid expand-query payload"); |
| 77 | return { success: false, error: "query must be a non-empty string" }; |
| 78 | } |
| 79 | const rawMaxR = Number(data.maxReformulations); |
| 80 | const maxR = Number.isFinite(rawMaxR) |
| 81 | ? Math.max(1, Math.min(10, Math.floor(rawMaxR))) |
| 82 | : 5; |
| 83 | const query = data.query.trim(); |
| 84 | |
| 85 | try { |
| 86 | const response = await provider.compress( |
| 87 | QUERY_EXPANSION_SYSTEM, |
| 88 | `Expand this query for memory retrieval:\n\n"${query}"`, |
| 89 | ); |
| 90 | |
| 91 | const parsed = parseExpansionXml(response); |
| 92 | if (!parsed) { |
| 93 | logger.warn("Failed to parse query expansion"); |
| 94 | return { |
| 95 | success: true, |
| 96 | expansion: { |
| 97 | original: query, |
| 98 | reformulations: [], |
| 99 | temporalConcretizations: [], |
| 100 | entityExtractions: [], |
| 101 | }, |
| 102 | }; |
| 103 | } |
| 104 | |
| 105 | parsed.original = query; |
| 106 | parsed.reformulations = parsed.reformulations.slice(0, maxR); |
| 107 | |
| 108 | logger.info("Query expanded", { |
| 109 | original: query, |
| 110 | reformulations: parsed.reformulations.length, |
| 111 | entities: parsed.entityExtractions.length, |
| 112 | }); |
| 113 | |
| 114 | return { success: true, expansion: parsed }; |
| 115 | } catch (err) { |
| 116 | const msg = err instanceof Error ? err.message : String(err); |
| 117 | logger.error("Query expansion failed", { error: msg }); |
| 118 | return { |
| 119 | success: true, |
| 120 | expansion: { |
| 121 | original: query, |
| 122 | reformulations: [], |
| 123 | temporalConcretizations: [], |
| 124 | entityExtractions: [], |
| 125 | }, |
| 126 | }; |
no test coverage detected