mirror of
https://github.com/diegosouzapw/OmniRoute.git
synced 2026-07-31 12:22:14 +03:00
New free providers: - LongCat AI (lc/): 50M tokens/day free during public beta - Pollinations AI (pol/): no API key needed, GPT-5/Claude/DeepSeek/Llama free - Cloudflare Workers AI (cf/): 10K Neurons/day, ~150 LLM responses, Whisper free - Scaleway AI (scw/): 1M free tokens for new accounts (EU/GDPR, Paris) - AI/ML API (aiml/): $0.025/day credits, 200+ models via single endpoint Provider metadata updates: - Together AI: hasFree=true + 3 permanently free model IDs (Llama 70B, Vision, DeepSeek) - Gemini: hasFree=true + freeNote (1,500 req/day free, no credit card) - NVIDIA NIM: already had hasFree=true, confirmed correct New executors: - open-sse/executors/pollinations.ts: optional auth (no key support) - open-sse/executors/cloudflare-ai.ts: dynamic URL with accountId credential Documentation: - README.md: 11-provider Ultimate Free Stack, 4 new pricing table rows - README.md: LongCat/Pollinations/Cloudflare AI/Scaleway provider detail sections - docs/i18n/pt-BR/README.md: updated pricing table + 4 new free provider sections - docs/i18n/cs/README.md: combo stack updated Tests: 821/821 pass (no regressions)
47 lines
1.5 KiB
TypeScript
47 lines
1.5 KiB
TypeScript
import { BaseExecutor } from "./base.ts";
|
|
import { PROVIDERS } from "../config/constants.ts";
|
|
|
|
/**
|
|
* PollinationsExecutor — handles optional API key auth.
|
|
* Pollinations AI works WITHOUT any API key for basic use (1 req/15s).
|
|
* If an API key is provided, higher rate limits apply.
|
|
*
|
|
* Endpoint: https://text.pollinations.ai/openai/chat/completions
|
|
* Docs: https://pollinations.ai/docs
|
|
*/
|
|
export class PollinationsExecutor extends BaseExecutor {
|
|
constructor() {
|
|
super("pollinations", PROVIDERS["pollinations"] || { format: "openai" });
|
|
}
|
|
|
|
buildUrl(_model: string, _stream: boolean, _urlIndex = 0, _credentials = null): string {
|
|
return "https://text.pollinations.ai/openai/chat/completions";
|
|
}
|
|
|
|
buildHeaders(credentials: any, stream = true): Record<string, string> {
|
|
const headers: Record<string, string> = {
|
|
"Content-Type": "application/json",
|
|
};
|
|
|
|
// API key is OPTIONAL — skip Authorization header if no key provided
|
|
const key = credentials?.apiKey || credentials?.accessToken;
|
|
if (key) {
|
|
headers["Authorization"] = `Bearer ${key}`;
|
|
}
|
|
|
|
if (stream) {
|
|
headers["Accept"] = "text/event-stream";
|
|
}
|
|
|
|
return headers;
|
|
}
|
|
|
|
transformRequest(model: string, body: any, _stream: boolean, _credentials: any): any {
|
|
// Pollinations uses model names directly like "openai", "claude", "deepseek", etc.
|
|
// No transformation needed — the model name is already the Pollinations alias.
|
|
return body;
|
|
}
|
|
}
|
|
|
|
export default PollinationsExecutor;
|