examples/query-router-host-hooks.mjs
Rama master · réplica de lectura del repositorio original.
#!/usr/bin/env node
// Example: QueryRouter with host-injected graph/rerank/research hooks
//
// Usage:
// export OPENAI_API_KEY="sk-..." # Required (used for embeddings + LLM)
// node examples/query-router-host-hooks.mjs
//
// Note: If OPENROUTER_API_KEY is also set, it may be auto-detected first.
// OpenRouter doesn't support embeddings, so unset it or ensure OPENAI_API_KEY is set.
import { QueryRouter } from '../dist/index.js';
async function main() {
const router = new QueryRouter({
knowledgeCorpus: ['./docs', './packages/agentos/docs'],
availableTools: ['web_search', 'deep_research'],
graphEnabled: true,
deepResearchEnabled: true,
graphExpand: async (seedChunks) => {
return [
...seedChunks,
{
id: 'host-graph-1',
heading: 'Graph-related context',
content: 'This chunk was added by a host-provided graph expansion hook.',
sourcePath: '/virtual/graph-hook',
relevanceScore: 0.73,
matchType: 'graph',
},
];
},
rerank: async (_query, chunks, topN) => {
return [...chunks]
.sort((left, right) => right.relevanceScore - left.relevanceScore)
.slice(0, topN);
},
deepResearch: async (query, sources) => {
return {
synthesis: `Host-provided deep research synthesis for "${query}" using ${sources.join(', ')}.`,
sources: [
{
id: 'host-research-1',
heading: 'External research synthesis',
content: 'This source came from a host-provided deep research hook.',
sourcePath: '/virtual/deep-research-hook',
relevanceScore: 0.84,
matchType: 'research',
},
],
};
},
});
await router.init();
console.log('\n=== corpus stats ===\n');
console.log(router.getCorpusStats());
const result = await router.route(
'Compare AgentOS memory architecture to more basic retrieval-only assistants.'
);
console.log('\n=== answer ===\n');
console.log(result.answer);
console.log('\n=== routing metadata ===\n');
console.log('classified tier:', result.classification.tier);
console.log('tiers used:', result.tiersUsed);
console.log('fallbacks used:', result.fallbacksUsed);
console.log('\n=== sources ===\n');
for (const source of result.sources) {
console.log(`- ${source.heading} (${source.path})`);
}
await router.close();
}
main().catch((error) => {
console.error(error);
process.exitCode = 1;
});