UNPKG

@adonis-agora/agent

Version:

Governed, durable-backed AI agent (chat + tool-calling + governance) for AdonisJS — part of the Agora ecosystem.

39 lines • 1.88 kB
import { embedCountingUsage } from '../spi/embedding-provider.js'; /** * Bridges an {@link EmbeddingProvider} + {@link VectorStore} into the {@link Retriever} SPI: embed the * query, then vector-search. This is what you wire as the agent's `retriever` (via the `retrievers` * factory namespace) for inject-mode retrieval. Mirrors the reference `EmbeddingRetriever` exactly. */ export class EmbeddingRetriever { embedder; store; constructor(embedder, store) { this.embedder = embedder; this.store = store; } async retrieve(query, options = {}) { return (await this.retrieveWithUsage(query, options)).passages; } /** * O caminho real; `retrieve` é o mesmo sem a conta. Os dois existem porque o `Retriever` SPI * promete `retrieve`, e quebrar essa promessa obrigaria todo retriever de terceiro a mudar por * uma capacidade que nem todo retriever tem. */ async retrieveWithUsage(query, options = {}) { const { vectors, usage } = await embedCountingUsage(this.embedder, [query]); const [embedding] = vectors; // A consulta foi embedada mesmo sem casar passagem nenhuma, então o consumo vai junto do // resultado vazio. Devolver `{ passages: [] }` puro faria a busca que não achou nada parecer // a busca que não custou nada. if (embedding === undefined) { return { passages: [], ...(usage !== undefined ? { usage } : {}) }; } const passages = await this.store.search(embedding, { topK: options.topK ?? 5, ...(options.filter !== undefined ? { filter: options.filter } : {}), ...(options.minScore !== undefined ? { minScore: options.minScore } : {}), }); return { passages, ...(usage !== undefined ? { usage } : {}) }; } } //# sourceMappingURL=embedding-retriever.js.map