import { Document } from "@langchain/core/documents";
import { RemoteRetriever, } from "./remote/base.js";
/**
 * Class responsible for retrieving data from Vespa. It extends the
 * `RemoteRetriever` class and includes methods for creating the JSON body
 * for a query and processing the JSON response from Vespa.
 * @example
 * ```typescript
 * const retriever = new VespaRetriever({
 *   url: "https:
 *   auth: false,
 *   query_body: {
 *     yql: "select content from paragraph where userQuery()",
 *     hits: 5,
 *     ranking: "documentation",
 *     locale: "en-us",
 *   },
 *   content_field: "content",
 * });
 * const result = await retriever.getRelevantDocuments("what is vespa?");
 * ```
 */
export class VespaRetriever extends RemoteRetriever {
    static lc_name() {
        return "VespaRetriever";
    }
    constructor(fields) {
        super(fields);
        Object.defineProperty(this, "lc_namespace", {
            enumerable: true,
            configurable: true,
            writable: true,
            value: ["langchain", "retrievers", "vespa"]
        });
        Object.defineProperty(this, "query_body", {
            enumerable: true,
            configurable: true,
            writable: true,
            value: void 0
        });
        Object.defineProperty(this, "content_field", {
            enumerable: true,
            configurable: true,
            writable: true,
            value: void 0
        });
        this.query_body = fields.query_body;
        this.content_field = fields.content_field;
        this.url = `${this.url}/search/?`;
    }
    /**
     * Method that takes a query string as input and returns a JSON object
     * that includes the query and the original `query_body`.
     * @param query The query string to be sent to Vespa.
     * @returns A JSON object that includes the query and the original `query_body`.
     */
    createJsonBody(query) {
        return {
            ...this.query_body,
            query,
        };
    }
    /**
     * Method that processes the JSON response from Vespa into an array of
     * `Document` instances. Each `Document` instance includes the content
     * from the specified `content_field` and the document's ID.
     * @param json The JSON response from Vespa.
     * @returns An array of `Document` instances.
     */
    processJsonResponse(json) {
        return json.root.children.map((doc) => new Document({
            pageContent: doc.fields[this.content_field],
            metadata: { id: doc.id },
        }));
    }
}
