import { BaseExecutor } from "./base.ts"; import { PROVIDERS } from "../config/constants.ts"; /** * PuterExecutor — OpenAI-compatible proxy for Puter AI. * * Puter exposes 500+ models (GPT, Claude, Gemini, Grok, DeepSeek, Qwen, Mistral...) * through a single OpenAI-compatible REST endpoint. * * Endpoint: https://api.puter.com/puterai/openai/v1/chat/completions * Auth: Bearer (from puter.com/dashboard → Copy Auth Token) * Docs: https://docs.puter.com/AI/ * * Model ID examples: * OpenAI: "gpt-4o-mini", "gpt-4o", "gpt-4.1" * Claude: "claude-sonnet-4-5", "claude-opus-4", "claude-haiku-4-5" * Gemini: "google/gemini-2.0-flash", "google/gemini-2.5-pro" * DeepSeek: "deepseek/deepseek-chat", "deepseek/deepseek-r1" * Grok: "x-ai/grok-3", "x-ai/grok-4" * Mistral: "mistralai/mistral-small-3.2" * Meta: "meta-llama/llama-3.3-70b-instruct" * * Note: Image generation, TTS, STT, and video are puter.js SDK-only features. * Only text chat completions (with streaming SSE) are available via REST. */ export class PuterExecutor extends BaseExecutor { constructor() { super("puter", PROVIDERS["puter"] || { format: "openai" }); } buildUrl(_model: string, _stream: boolean, _urlIndex = 0, _credentials = null): string { return "https://api.puter.com/puterai/openai/v1/chat/completions"; } buildHeaders(credentials: any, stream = true): Record { const headers: Record = { "Content-Type": "application/json", }; 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 { // Puter accepts model IDs directly from its catalog. // No transformation required — model string is passed as-is. return body; } } export default PuterExecutor;