"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.BlackForestLabsTextToImageTask = void 0;
/**
 * See the registered mapping of HF model ID => Black Forest Labs model ID here:
 *
 * https://huggingface.co/api/partners/blackforestlabs/models
 *
 * This is a publicly available mapping.
 *
 * If you want to try to run inference for a new model locally before it's registered on huggingface.co,
 * you can add it to the dictionary "HARDCODED_MODEL_ID_MAPPING" in consts.ts, for dev purposes.
 *
 * - If you work at Black Forest Labs and want to update this mapping, please use the model mapping API we provide on huggingface.co
 * - If you're a community member and want to add a new supported HF model to Black Forest Labs, please open an issue on the present repo
 * and we will tag Black Forest Labs team members.
 *
 * Thanks!
 */
const errors_js_1 = require("../errors.js");
const logger_js_1 = require("../lib/logger.js");
const delay_js_1 = require("../utils/delay.js");
const omit_js_1 = require("../utils/omit.js");
const providerHelper_js_1 = require("./providerHelper.js");
const BLACK_FOREST_LABS_AI_API_BASE_URL = "https://api.us1.bfl.ai";
class BlackForestLabsTextToImageTask extends providerHelper_js_1.TaskProviderHelper {
    constructor() {
        super("black-forest-labs", BLACK_FOREST_LABS_AI_API_BASE_URL);
    }
    preparePayload(params) {
        return {
            ...(0, omit_js_1.omit)(params.args, ["inputs", "parameters"]),
            ...params.args.parameters,
            prompt: params.args.inputs,
        };
    }
    prepareHeaders(params, binary) {
        const headers = {
            Authorization: params.authMethod !== "provider-key" ? `Bearer ${params.accessToken}` : `X-Key ${params.accessToken}`,
        };
        if (!binary) {
            headers["Content-Type"] = "application/json";
        }
        return headers;
    }
    makeRoute(params) {
        if (!params) {
            throw new errors_js_1.InferenceClientInputError("Params are required");
        }
        return `/v1/${params.model}`;
    }
    async getResponse(response, url, headers, outputType) {
        const logger = (0, logger_js_1.getLogger)();
        const urlObj = new URL(response.polling_url);
        for (let step = 0; step < 5; step++) {
            await (0, delay_js_1.delay)(1000);
            logger.debug(`Polling Black Forest Labs API for the result... ${step + 1}/5`);
            urlObj.searchParams.set("attempt", step.toString(10));
            const resp = await fetch(urlObj, { headers: { "Content-Type": "application/json" } });
            if (!resp.ok) {
                throw new errors_js_1.InferenceClientProviderApiError("Failed to fetch result from black forest labs API", { url: urlObj.toString(), method: "GET", headers: { "Content-Type": "application/json" } }, { requestId: resp.headers.get("x-request-id") ?? "", status: resp.status, body: await resp.text() });
            }
            const payload = await resp.json();
            if (typeof payload === "object" &&
                payload &&
                "status" in payload &&
                typeof payload.status === "string" &&
                payload.status === "Ready" &&
                "result" in payload &&
                typeof payload.result === "object" &&
                payload.result &&
                "sample" in payload.result &&
                typeof payload.result.sample === "string") {
                if (outputType === "json") {
                    return payload.result;
                }
                if (outputType === "url") {
                    return payload.result.sample;
                }
                const image = await fetch(payload.result.sample);
                return await image.blob();
            }
        }
        throw new errors_js_1.InferenceClientProviderOutputError(`Timed out while waiting for the result from black forest labs API - aborting after 5 attempts`);
    }
}
exports.BlackForestLabsTextToImageTask = BlackForestLabsTextToImageTask;
