Files
OmniRoute/open-sse/services/usage/firecrawl.ts
Alan Vb 6bdfd540ba feat(providers): live monthly credit quota for Firecrawl (#8759)
* feat(providers): live monthly credit quota for Firecrawl

Wire Firecrawl team credits into Provider Limits / preflight via
GET /v2/team/credit-usage (Bearer API key)

- firecrawlQuotaFetcher + usage/firecrawl leaf
- USAGE_FETCHER_PROVIDERS + USAGE_SUPPORTED_PROVIDERS + apikey allowlist
- register via quotaTrackersBatch
- unit tests for fetcher + usage dispatch

* chore(changelog) - add changelog on live monthly credit quota for Firecrawl

* fix(providers): satisfy provider limits file-size gate

---------

Co-authored-by: allanvb <allanvb@users.noreply.github.com>
2026-07-27 17:25:47 -03:00

61 lines
1.7 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, 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) {
if (!connectionId) {
return { message: "Firecrawl: connection id unavailable." };
}
try {
const live = await fetchFirecrawlQuota(connectionId, { apiKey });
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}` };
}
}