Files
OmniRoute/open-sse/services/usage/firecrawl.ts
Alexey Gusev 91bb6aa619 feat(providers): add comprehensive support for self-hosted Firecrawl via FIRECRAWL_BASE_URL and custom base URLs (#9052)
Validated in post-merge-train sweep (boards clean on release/v3.8.50 tip)
2026-08-06 11:07:42 -03:00

70 lines
2.0 KiB
TypeScript

/**
* usage/firecrawl.ts — Firecrawl team credit usage for Provider Limits.
*
* GET /v2/team/credit-usage via firecrawlQuotaFetcher; shapes remaining/plan
* credits into the standard `{ plan, quotas }` response.
*/
import { fetchFirecrawlQuota, getFirecrawlBaseUrl, type FirecrawlQuota } from "../firecrawlQuotaFetcher.ts";
import { createQuotaFromUsage, parseResetTime } from "./quota.ts";
function createFirecrawlPlanQuota(q: FirecrawlQuota) {
if (q.overPlan) {
return {
used: 0,
total: q.planCredits,
remaining: q.remainingCredits,
remainingPercentage: q.planCredits > 0 ? (q.remainingCredits / q.planCredits) * 100 : 100,
resetAt: parseResetTime(q.resetAt),
unlimited: false,
extraCreditsInferred: q.extraCreditsInferred,
overPlan: true,
};
}
return {
...createQuotaFromUsage(q.used, q.total, q.resetAt),
extraCreditsInferred: 0,
overPlan: false,
};
}
export async function getFirecrawlUsage(connectionId: string, apiKey?: string, connection?: Record<string, unknown>) {
if (!connectionId) {
return { message: "Firecrawl: connection id unavailable." };
}
const customBase = getFirecrawlBaseUrl(connection);
if (customBase) {
return {
plan: "Firecrawl · Self-Hosted Local",
quotas: {},
message: `Connected to self-hosted Firecrawl instance (${customBase})`,
};
}
try {
const live = await fetchFirecrawlQuota(connectionId, connection);
if (!live) {
return { message: "Firecrawl API key not available or credit usage unavailable." };
}
const q = live as FirecrawlQuota;
const monthly = createFirecrawlPlanQuota(q);
return {
plan: "Firecrawl · Monthly credits",
quotas: {
monthly,
},
remainingCredits: q.remainingCredits,
planCredits: q.planCredits,
extraCreditsInferred: q.extraCreditsInferred,
overPlan: q.overPlan,
limitReached: q.limitReached,
};
} catch (error) {
return { message: `Firecrawl usage error: ${(error as Error).message}` };
}
}