@renderify/llm 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/providers/anthropic.ts","../src/providers/shared.ts","../src/providers/google.ts","../src/providers/openai.ts","../src/registry.ts"],"sourcesContent":["import type {\n LLMInterpreter,\n LLMRequest,\n LLMResponse,\n LLMResponseStreamChunk,\n LLMStructuredRequest,\n LLMStructuredResponse,\n} from \"@renderify/core\";\nimport { isRuntimePlan } from \"@renderify/ir\";\nimport {\n consumeSseEvents,\n createTimeoutAbortScope,\n formatContext,\n pickFetch,\n pickPositiveInt,\n pickString,\n readErrorResponse,\n resolveFetch,\n tryParseJson,\n withTimeoutAbortScope,\n} from \"./shared\";\n\nexport interface AnthropicLLMInterpreterOptions {\n apiKey?: string;\n model?: string;\n baseUrl?: string;\n timeoutMs?: number;\n maxTokens?: number;\n version?: string;\n systemPrompt?: string;\n fetchImpl?: typeof fetch;\n}\n\ninterface AnthropicContentPart {\n type?: string;\n text?: string;\n}\n\ninterface AnthropicMessagesPayload {\n id?: string;\n model?: string;\n content?: AnthropicContentPart[];\n usage?: {\n input_tokens?: number;\n output_tokens?: number;\n };\n error?: {\n message?: string;\n };\n}\n\ninterface AnthropicStreamPayload {\n type?: string;\n error?: {\n message?: string;\n };\n message?: {\n id?: string;\n model?: string;\n usage?: {\n input_tokens?: number;\n output_tokens?: number;\n };\n };\n delta?: {\n text?: string;\n stop_reason?: string | null;\n };\n usage?: {\n input_tokens?: number;\n output_tokens?: number;\n };\n}\n\nconst DEFAULT_BASE_URL = \"https://api.anthropic.com/v1\";\nconst DEFAULT_MODEL = \"claude-3-5-sonnet-latest\";\nconst DEFAULT_TIMEOUT_MS = 30000;\nconst DEFAULT_MAX_TOKENS = 2048;\nconst DEFAULT_ANTHROPIC_VERSION = \"2023-06-01\";\n\nexport class AnthropicLLMInterpreter implements LLMInterpreter {\n private readonly templates = new Map<string, string>();\n private options: Required<\n Pick<\n AnthropicLLMInterpreterOptions,\n \"baseUrl\" | \"model\" | \"timeoutMs\" | \"maxTokens\" | \"version\"\n >\n > &\n Omit<\n AnthropicLLMInterpreterOptions,\n \"baseUrl\" | \"model\" | \"timeoutMs\" | \"maxTokens\" | \"version\" | \"fetchImpl\"\n > = {\n baseUrl: DEFAULT_BASE_URL,\n model: DEFAULT_MODEL,\n timeoutMs: DEFAULT_TIMEOUT_MS,\n maxTokens: DEFAULT_MAX_TOKENS,\n version: DEFAULT_ANTHROPIC_VERSION,\n apiKey: undefined,\n systemPrompt: undefined,\n };\n private fetchImpl: typeof fetch | undefined;\n\n constructor(options: AnthropicLLMInterpreterOptions = {}) {\n this.configure({ ...options });\n if (options.fetchImpl) {\n this.fetchImpl = options.fetchImpl;\n }\n }\n\n configure(options: Record<string, unknown>): void {\n const apiKey = pickString(options, \"apiKey\", \"llmApiKey\");\n const model = pickString(options, \"model\", \"llmModel\");\n const baseUrl = pickString(options, \"baseUrl\", \"llmBaseUrl\");\n const systemPrompt = pickString(options, \"systemPrompt\");\n const version = pickString(options, \"version\", \"anthropicVersion\");\n const timeoutMs = pickPositiveInt(\n options,\n \"timeoutMs\",\n \"llmRequestTimeoutMs\",\n );\n const maxTokens = pickPositiveInt(options, \"maxTokens\");\n const fetchImpl = pickFetch(options, \"fetchImpl\");\n\n this.options = {\n ...this.options,\n ...(apiKey !== undefined ? { apiKey } : {}),\n ...(model !== undefined ? { model } : {}),\n ...(baseUrl !== undefined ? { baseUrl } : {}),\n ...(systemPrompt !== undefined ? { systemPrompt } : {}),\n ...(version !== undefined ? { version } : {}),\n ...(timeoutMs !== undefined ? { timeoutMs } : {}),\n ...(maxTokens !== undefined ? { maxTokens } : {}),\n };\n\n if (fetchImpl) {\n this.fetchImpl = fetchImpl;\n }\n }\n\n async generateResponse(req: LLMRequest): Promise<LLMResponse> {\n const payload = await this.requestMessages(\n {\n model: this.options.model,\n max_tokens: this.options.maxTokens,\n system: this.resolveSystemPrompt(req),\n messages: [\n {\n role: \"user\",\n content: this.buildUserPrompt(req),\n },\n ],\n },\n req.signal,\n );\n\n const text = this.extractText(payload);\n\n return {\n text,\n tokensUsed: this.extractTotalTokens(payload),\n model: payload.model ?? this.options.model,\n raw: {\n mode: \"text\",\n responseId: payload.id,\n },\n };\n }\n\n async *generateResponseStream(\n req: LLMRequest,\n ): AsyncIterable<LLMResponseStreamChunk> {\n const fetchImpl = resolveFetch(\n this.fetchImpl,\n \"Global fetch is unavailable. Provide fetchImpl in AnthropicLLMInterpreter options.\",\n );\n const apiKey = this.options.apiKey;\n if (!apiKey || apiKey.trim().length === 0) {\n throw new Error(\n \"Anthropic apiKey is missing. Set RENDERIFY_LLM_API_KEY or configure apiKey.\",\n );\n }\n\n const abortScope = createTimeoutAbortScope(\n this.options.timeoutMs,\n req.signal,\n );\n\n let aggregatedText = \"\";\n let chunkIndex = 0;\n let tokensUsed: number | undefined;\n let inputTokens: number | undefined;\n let outputTokens: number | undefined;\n let model = this.options.model;\n let responseId: string | undefined;\n let doneEmitted = false;\n\n const processEvents = (\n events: Array<{ event?: string; data: string }>,\n ): Array<LLMResponseStreamChunk> => {\n const chunks: LLMResponseStreamChunk[] = [];\n\n for (const event of events) {\n if (event.data === \"[DONE]\" || event.event === \"message_stop\") {\n if (!doneEmitted) {\n chunkIndex += 1;\n doneEmitted = true;\n chunks.push({\n delta: \"\",\n text: aggregatedText,\n done: true,\n index: chunkIndex,\n tokensUsed,\n model,\n raw: {\n mode: \"stream\",\n responseId,\n done: true,\n event: event.event ?? \"done\",\n },\n });\n }\n continue;\n }\n\n let payload: AnthropicStreamPayload;\n try {\n payload = JSON.parse(event.data) as AnthropicStreamPayload;\n } catch (error) {\n throw new Error(\n `Anthropic stream chunk parse failed: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n\n if (payload.error?.message) {\n throw new Error(`Anthropic error: ${payload.error.message}`);\n }\n\n if (typeof payload.message?.id === \"string\") {\n responseId = payload.message.id;\n }\n\n if (\n typeof payload.message?.model === \"string\" &&\n payload.message.model.trim().length > 0\n ) {\n model = payload.message.model;\n }\n\n const usageInput = payload.message?.usage?.input_tokens;\n const usageOutput =\n payload.message?.usage?.output_tokens ?? payload.usage?.output_tokens;\n if (typeof usageInput === \"number\") {\n inputTokens = usageInput;\n }\n if (typeof usageOutput === \"number\") {\n outputTokens = usageOutput;\n }\n if (\n typeof inputTokens === \"number\" ||\n typeof outputTokens === \"number\"\n ) {\n tokensUsed = (inputTokens ?? 0) + (outputTokens ?? 0);\n }\n\n const deltaText =\n payload.type === \"content_block_delta\" &&\n typeof payload.delta?.text === \"string\"\n ? payload.delta.text\n : \"\";\n\n if (deltaText.length === 0) {\n continue;\n }\n\n aggregatedText += deltaText;\n chunkIndex += 1;\n chunks.push({\n delta: deltaText,\n text: aggregatedText,\n done: false,\n index: chunkIndex,\n tokensUsed,\n model,\n raw: {\n mode: \"stream\",\n responseId,\n event: event.event ?? payload.type,\n chunk: payload,\n },\n });\n }\n\n return chunks;\n };\n\n try {\n const response = await fetchImpl(\n `${this.options.baseUrl.replace(/\\/$/, \"\")}/messages`,\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n \"x-api-key\": apiKey,\n \"anthropic-version\": this.options.version,\n },\n body: JSON.stringify({\n model: this.options.model,\n max_tokens: this.options.maxTokens,\n system: this.resolveSystemPrompt(req),\n stream: true,\n messages: [\n {\n role: \"user\",\n content: this.buildUserPrompt(req),\n },\n ],\n }),\n signal: abortScope.signal,\n },\n );\n\n if (!response.ok) {\n const details = await readErrorResponse(response);\n throw new Error(\n `Anthropic request failed (${response.status}): ${details}`,\n );\n }\n\n if (!response.body) {\n throw new Error(\"Anthropic streaming response body is empty\");\n }\n\n const decoder = new TextDecoder();\n const reader = response.body.getReader();\n let buffer = \"\";\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n\n if (value) {\n buffer += decoder.decode(value, { stream: true });\n }\n\n const parsedEvents = consumeSseEvents(buffer);\n buffer = parsedEvents.remaining;\n\n for (const chunk of processEvents(parsedEvents.events)) {\n yield chunk;\n }\n }\n\n buffer += decoder.decode();\n const finalEvents = consumeSseEvents(buffer, true);\n for (const chunk of processEvents(finalEvents.events)) {\n yield chunk;\n }\n\n if (!doneEmitted) {\n chunkIndex += 1;\n doneEmitted = true;\n yield {\n delta: \"\",\n text: aggregatedText,\n done: true,\n index: chunkIndex,\n tokensUsed,\n model,\n raw: {\n mode: \"stream\",\n responseId,\n done: true,\n reason: \"eof\",\n },\n };\n }\n } catch (error) {\n if (error instanceof Error && error.name === \"AbortError\") {\n if (req.signal?.aborted) {\n throw new Error(\"Anthropic request aborted by caller\");\n }\n throw new Error(\n `Anthropic request timed out after ${this.options.timeoutMs}ms`,\n );\n }\n throw error;\n } finally {\n abortScope.release();\n }\n }\n\n async generateStructuredResponse<T = unknown>(\n req: LLMStructuredRequest,\n ): Promise<LLMStructuredResponse<T>> {\n if (req.format !== \"runtime-plan\") {\n return {\n text: \"\",\n valid: false,\n errors: [`Unsupported structured format: ${String(req.format)}`],\n model: this.options.model,\n };\n }\n\n const payload = await this.requestMessages(\n {\n model: this.options.model,\n max_tokens: this.options.maxTokens,\n system: this.resolveStructuredSystemPrompt(req),\n messages: [\n {\n role: \"user\",\n content: this.buildUserPrompt(req),\n },\n ],\n },\n req.signal,\n );\n\n const text = this.extractText(payload);\n\n if (text.trim().length === 0) {\n return {\n text,\n valid: false,\n errors: [\"Structured response content is empty\"],\n tokensUsed: this.extractTotalTokens(payload),\n model: payload.model ?? this.options.model,\n raw: {\n mode: \"structured\",\n responseId: payload.id,\n },\n };\n }\n\n const parsed = tryParseJson(text);\n if (!parsed.ok) {\n return {\n text,\n valid: false,\n errors: [`Structured JSON parse failed: ${parsed.error}`],\n tokensUsed: this.extractTotalTokens(payload),\n model: payload.model ?? this.options.model,\n raw: {\n mode: \"structured\",\n responseId: payload.id,\n },\n };\n }\n\n if (!isRuntimePlan(parsed.value)) {\n return {\n text,\n value: parsed.value as T,\n valid: false,\n errors: [\"Structured payload is not a valid RuntimePlan\"],\n tokensUsed: this.extractTotalTokens(payload),\n model: payload.model ?? this.options.model,\n raw: {\n mode: \"structured\",\n responseId: payload.id,\n },\n };\n }\n\n return {\n text,\n value: parsed.value as T,\n valid: true,\n tokensUsed: this.extractTotalTokens(payload),\n model: payload.model ?? this.options.model,\n raw: {\n mode: \"structured\",\n responseId: payload.id,\n },\n };\n }\n\n setPromptTemplate(templateName: string, templateContent: string): void {\n this.templates.set(templateName, templateContent);\n }\n\n getPromptTemplate(templateName: string): string | undefined {\n return this.templates.get(templateName);\n }\n\n private resolveSystemPrompt(req: LLMRequest): string | undefined {\n const templateSystem = this.templates.get(\"default\");\n const configuredSystem = this.options.systemPrompt;\n const requestSystem = req.systemPrompt;\n\n const candidates = [configuredSystem, templateSystem, requestSystem]\n .filter((entry): entry is string => typeof entry === \"string\")\n .map((entry) => entry.trim())\n .filter((entry) => entry.length > 0);\n\n if (candidates.length === 0) {\n return undefined;\n }\n\n return candidates.join(\"\\n\\n\");\n }\n\n private resolveStructuredSystemPrompt(req: LLMStructuredRequest): string {\n const template = this.templates.get(\"runtime-plan\");\n const strictHint = req.strict === false ? \"false\" : \"true\";\n const defaultPrompt = [\n \"You generate RuntimePlan JSON for Renderify.\",\n \"Return only JSON with no markdown or explanations.\",\n \"Schema priority: id/version/root/capabilities must be valid.\",\n `Strict mode: ${strictHint}.`,\n ].join(\" \");\n\n const combined = [this.resolveSystemPrompt(req), template, defaultPrompt]\n .filter((entry): entry is string => typeof entry === \"string\")\n .map((entry) => entry.trim())\n .filter((entry) => entry.length > 0)\n .join(\"\\n\\n\");\n\n return combined;\n }\n\n private buildUserPrompt(req: LLMRequest): string {\n const contextSnippet = formatContext(req.context);\n if (!contextSnippet) {\n return req.prompt;\n }\n\n return `${req.prompt}\\n\\nContext:\\n${contextSnippet}`;\n }\n\n private async requestMessages(\n body: Record<string, unknown>,\n signal?: AbortSignal,\n ): Promise<AnthropicMessagesPayload> {\n const fetchImpl = resolveFetch(\n this.fetchImpl,\n \"Global fetch is unavailable. Provide fetchImpl in AnthropicLLMInterpreter options.\",\n );\n const apiKey = this.options.apiKey;\n if (!apiKey || apiKey.trim().length === 0) {\n throw new Error(\n \"Anthropic apiKey is missing. Set RENDERIFY_LLM_API_KEY or configure apiKey.\",\n );\n }\n\n try {\n return await withTimeoutAbortScope(\n this.options.timeoutMs,\n signal,\n async (timeoutSignal) => {\n const response = await fetchImpl(\n `${this.options.baseUrl.replace(/\\/$/, \"\")}/messages`,\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n \"x-api-key\": apiKey,\n \"anthropic-version\": this.options.version,\n },\n body: JSON.stringify(body),\n signal: timeoutSignal,\n },\n );\n\n if (!response.ok) {\n const details = await readErrorResponse(response);\n throw new Error(\n `Anthropic request failed (${response.status}): ${details}`,\n );\n }\n\n const parsed = (await response.json()) as AnthropicMessagesPayload;\n if (parsed.error?.message) {\n throw new Error(`Anthropic error: ${parsed.error.message}`);\n }\n\n return parsed;\n },\n );\n } catch (error) {\n if (error instanceof Error && error.name === \"AbortError\") {\n if (signal?.aborted) {\n throw new Error(\"Anthropic request aborted by caller\");\n }\n throw new Error(\n `Anthropic request timed out after ${this.options.timeoutMs}ms`,\n );\n }\n throw error;\n }\n }\n\n private extractText(payload: AnthropicMessagesPayload): string {\n const content = payload.content;\n if (!Array.isArray(content) || content.length === 0) {\n return \"\";\n }\n\n return content\n .map((part) =>\n part.type === \"text\" && typeof part.text === \"string\" ? part.text : \"\",\n )\n .join(\"\")\n .trim();\n }\n\n private extractTotalTokens(\n payload: AnthropicMessagesPayload,\n ): number | undefined {\n const input = payload.usage?.input_tokens;\n const output = payload.usage?.output_tokens;\n\n if (typeof input !== \"number\" && typeof output !== \"number\") {\n return undefined;\n }\n\n return (input ?? 0) + (output ?? 0);\n }\n}\n","export interface JsonParseResult {\n ok: true;\n value: unknown;\n}\n\nexport interface JsonParseError {\n ok: false;\n error: string;\n}\n\nexport interface SseEvent {\n event?: string;\n data: string;\n}\n\nexport interface TimeoutAbortScope {\n signal: AbortSignal;\n release(): void;\n}\n\nexport function pickString(\n source: Record<string, unknown>,\n ...keys: string[]\n): string | undefined {\n for (const key of keys) {\n const value = source[key];\n if (typeof value === \"string\" && value.trim().length > 0) {\n return value.trim();\n }\n }\n\n return undefined;\n}\n\nexport function pickPositiveInt(\n source: Record<string, unknown>,\n ...keys: string[]\n): number | undefined {\n for (const key of keys) {\n const value = source[key];\n if (typeof value === \"number\" && Number.isFinite(value) && value > 0) {\n return Math.floor(value);\n }\n\n if (typeof value === \"string\" && value.trim().length > 0) {\n const parsed = Number(value);\n if (Number.isFinite(parsed) && parsed > 0) {\n return Math.floor(parsed);\n }\n }\n }\n\n return undefined;\n}\n\nexport function pickFetch(\n source: Record<string, unknown>,\n key: string,\n): typeof fetch | undefined {\n const value = source[key];\n if (typeof value === \"function\") {\n return value as typeof fetch;\n }\n\n return undefined;\n}\n\nexport function resolveFetch(\n fetchImpl: typeof fetch | undefined,\n missingMessage: string,\n): typeof fetch {\n if (fetchImpl) {\n return fetchImpl;\n }\n\n if (typeof globalThis.fetch === \"function\") {\n return globalThis.fetch.bind(globalThis);\n }\n\n throw new Error(missingMessage);\n}\n\nexport function createTimeoutAbortScope(\n timeoutMs: number,\n upstreamSignal?: AbortSignal,\n): TimeoutAbortScope {\n const controller = new AbortController();\n const timeout = setTimeout(() => {\n controller.abort();\n }, timeoutMs);\n\n let onAbort: (() => void) | undefined;\n if (upstreamSignal) {\n if (upstreamSignal.aborted) {\n controller.abort();\n } else {\n onAbort = () => {\n controller.abort();\n };\n upstreamSignal.addEventListener(\"abort\", onAbort, { once: true });\n }\n }\n\n return {\n signal: controller.signal,\n release() {\n clearTimeout(timeout);\n if (upstreamSignal && onAbort) {\n upstreamSignal.removeEventListener(\"abort\", onAbort);\n }\n },\n };\n}\n\nexport async function withTimeoutAbortScope<T>(\n timeoutMs: number,\n upstreamSignal: AbortSignal | undefined,\n operation: (signal: AbortSignal) => Promise<T>,\n): Promise<T> {\n const scope = createTimeoutAbortScope(timeoutMs, upstreamSignal);\n try {\n return await operation(scope.signal);\n } finally {\n scope.release();\n }\n}\n\nexport function formatContext(\n context: Record<string, unknown> | undefined,\n): string {\n if (!context || Object.keys(context).length === 0) {\n return \"\";\n }\n\n try {\n return JSON.stringify(context);\n } catch {\n return \"\";\n }\n}\n\nexport function tryParseJson(raw: string): JsonParseResult | JsonParseError {\n const fenced = raw.match(/```(?:json)?\\s*([\\s\\S]*?)\\s*```/i);\n const payload = fenced ? fenced[1] : raw;\n\n try {\n return {\n ok: true,\n value: JSON.parse(payload) as unknown,\n };\n } catch (error) {\n return {\n ok: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\nexport async function readErrorResponse(response: Response): Promise<string> {\n try {\n const body = (await response.json()) as {\n error?: { message?: string };\n };\n if (body.error?.message) {\n return body.error.message;\n }\n return JSON.stringify(body);\n } catch {\n try {\n return await response.text();\n } catch {\n return \"unknown error\";\n }\n }\n}\n\nexport function consumeSseEvents(\n buffer: string,\n flush = false,\n): { events: SseEvent[]; remaining: string } {\n const events: SseEvent[] = [];\n const separator = /\\r?\\n\\r?\\n/g;\n let cursor = 0;\n let match = separator.exec(buffer);\n while (match) {\n const block = buffer.slice(cursor, match.index);\n const parsed = parseSseEventBlock(block);\n if (parsed) {\n events.push(parsed);\n }\n cursor = match.index + match[0].length;\n match = separator.exec(buffer);\n }\n\n let remaining = buffer.slice(cursor);\n if (flush) {\n const tail = parseSseEventBlock(remaining);\n if (tail) {\n events.push(tail);\n }\n remaining = \"\";\n }\n\n return {\n events,\n remaining,\n };\n}\n\nfunction parseSseEventBlock(block: string): SseEvent | undefined {\n const lines = block.split(/\\r?\\n/);\n let eventName: string | undefined;\n const dataLines: string[] = [];\n\n for (const line of lines) {\n if (line.startsWith(\":\")) {\n continue;\n }\n\n if (line.startsWith(\"event:\")) {\n eventName = line.slice(6).trim();\n continue;\n }\n\n if (line.startsWith(\"data:\")) {\n dataLines.push(line.slice(5).trimStart());\n }\n }\n\n if (dataLines.length === 0) {\n return undefined;\n }\n\n const data = dataLines.join(\"\\n\").trim();\n if (data.length === 0) {\n return undefined;\n }\n\n return {\n event: eventName,\n data,\n };\n}\n","import type {\n LLMInterpreter,\n LLMRequest,\n LLMResponse,\n LLMResponseStreamChunk,\n LLMStructuredRequest,\n LLMStructuredResponse,\n} from \"@renderify/core\";\nimport { isRuntimePlan } from \"@renderify/ir\";\nimport {\n consumeSseEvents,\n createTimeoutAbortScope,\n formatContext,\n pickFetch,\n pickPositiveInt,\n pickString,\n readErrorResponse,\n resolveFetch,\n tryParseJson,\n withTimeoutAbortScope,\n} from \"./shared\";\n\nexport interface GoogleLLMInterpreterOptions {\n apiKey?: string;\n model?: string;\n baseUrl?: string;\n timeoutMs?: number;\n systemPrompt?: string;\n fetchImpl?: typeof fetch;\n}\n\ninterface GoogleContentPart {\n text?: string;\n}\n\ninterface GoogleCandidatePayload {\n content?: {\n parts?: GoogleContentPart[];\n };\n finishReason?: string;\n}\n\ninterface GoogleGenerateContentPayload {\n candidates?: GoogleCandidatePayload[];\n usageMetadata?: {\n promptTokenCount?: number;\n candidatesTokenCount?: number;\n totalTokenCount?: number;\n };\n modelVersion?: string;\n promptFeedback?: {\n blockReason?: string;\n blockReasonMessage?: string;\n };\n error?: {\n message?: string;\n };\n}\n\nconst DEFAULT_BASE_URL = \"https://generativelanguage.googleapis.com/v1beta\";\nconst DEFAULT_MODEL = \"gemini-2.0-flash\";\nconst DEFAULT_TIMEOUT_MS = 30000;\n\nexport class GoogleLLMInterpreter implements LLMInterpreter {\n private readonly templates = new Map<string, string>();\n private options: Required<\n Pick<GoogleLLMInterpreterOptions, \"baseUrl\" | \"model\" | \"timeoutMs\">\n > &\n Omit<\n GoogleLLMInterpreterOptions,\n \"baseUrl\" | \"model\" | \"timeoutMs\" | \"fetchImpl\"\n > = {\n baseUrl: DEFAULT_BASE_URL,\n model: DEFAULT_MODEL,\n timeoutMs: DEFAULT_TIMEOUT_MS,\n apiKey: undefined,\n systemPrompt: undefined,\n };\n private fetchImpl: typeof fetch | undefined;\n\n constructor(options: GoogleLLMInterpreterOptions = {}) {\n this.configure({ ...options });\n if (options.fetchImpl) {\n this.fetchImpl = options.fetchImpl;\n }\n }\n\n configure(options: Record<string, unknown>): void {\n const apiKey = pickString(options, \"apiKey\", \"llmApiKey\");\n const model = pickString(options, \"model\", \"llmModel\");\n const baseUrl = pickString(options, \"baseUrl\", \"llmBaseUrl\");\n const systemPrompt = pickString(options, \"systemPrompt\");\n const timeoutMs = pickPositiveInt(\n options,\n \"timeoutMs\",\n \"llmRequestTimeoutMs\",\n );\n const fetchImpl = pickFetch(options, \"fetchImpl\");\n\n this.options = {\n ...this.options,\n ...(apiKey !== undefined ? { apiKey } : {}),\n ...(model !== undefined ? { model } : {}),\n ...(baseUrl !== undefined ? { baseUrl } : {}),\n ...(systemPrompt !== undefined ? { systemPrompt } : {}),\n ...(timeoutMs !== undefined ? { timeoutMs } : {}),\n };\n\n if (fetchImpl) {\n this.fetchImpl = fetchImpl;\n }\n }\n\n async generateResponse(req: LLMRequest): Promise<LLMResponse> {\n const payload = await this.requestGenerateContent(\n this.buildRequest(req),\n req.signal,\n );\n const refusal = this.extractRefusal(payload);\n if (refusal) {\n throw new Error(`Google refused request: ${refusal}`);\n }\n\n return {\n text: this.extractText(payload),\n tokensUsed: this.extractTotalTokens(payload),\n model: payload.modelVersion ?? this.options.model,\n raw: {\n mode: \"text\",\n finishReason: payload.candidates?.[0]?.finishReason,\n },\n };\n }\n\n async *generateResponseStream(\n req: LLMRequest,\n ): AsyncIterable<LLMResponseStreamChunk> {\n const fetchImpl = resolveFetch(\n this.fetchImpl,\n \"Global fetch is unavailable. Provide fetchImpl in GoogleLLMInterpreter options.\",\n );\n const apiKey = this.options.apiKey;\n if (!apiKey || apiKey.trim().length === 0) {\n throw new Error(\n \"Google apiKey is missing. Set RENDERIFY_LLM_API_KEY or configure apiKey.\",\n );\n }\n\n const abortScope = createTimeoutAbortScope(\n this.options.timeoutMs,\n req.signal,\n );\n\n let aggregatedText = \"\";\n let chunkIndex = 0;\n let tokensUsed: number | undefined;\n let model = this.options.model;\n let doneEmitted = false;\n\n const processEvents = (\n events: Array<{ data: string }>,\n ): Array<LLMResponseStreamChunk> => {\n const chunks: LLMResponseStreamChunk[] = [];\n\n for (const event of events) {\n if (event.data === \"[DONE]\") {\n if (!doneEmitted) {\n chunkIndex += 1;\n doneEmitted = true;\n chunks.push({\n delta: \"\",\n text: aggregatedText,\n done: true,\n index: chunkIndex,\n tokensUsed,\n model,\n raw: {\n mode: \"stream\",\n done: true,\n },\n });\n }\n continue;\n }\n\n let payload: GoogleGenerateContentPayload;\n try {\n payload = JSON.parse(event.data) as GoogleGenerateContentPayload;\n } catch (error) {\n throw new Error(\n `Google stream chunk parse failed: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n\n if (payload.error?.message) {\n throw new Error(`Google error: ${payload.error.message}`);\n }\n\n if (\n typeof payload.modelVersion === \"string\" &&\n payload.modelVersion.trim().length > 0\n ) {\n model = payload.modelVersion;\n }\n\n const refusal = this.extractRefusal(payload);\n if (refusal) {\n throw new Error(`Google refused request: ${refusal}`);\n }\n\n const payloadTokens = this.extractTotalTokens(payload);\n if (typeof payloadTokens === \"number\") {\n tokensUsed = payloadTokens;\n }\n\n const deltaText = this.extractTextRaw(payload);\n if (deltaText.length === 0) {\n continue;\n }\n\n aggregatedText += deltaText;\n chunkIndex += 1;\n chunks.push({\n delta: deltaText,\n text: aggregatedText,\n done: false,\n index: chunkIndex,\n tokensUsed,\n model,\n raw: {\n mode: \"stream\",\n chunk: payload,\n },\n });\n }\n\n return chunks;\n };\n\n try {\n const response = await fetchImpl(\n `${this.options.baseUrl.replace(/\\/$/, \"\")}/models/${encodeURIComponent(this.options.model)}:streamGenerateContent?alt=sse`,\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n \"x-goog-api-key\": apiKey,\n },\n body: JSON.stringify(this.buildRequest(req)),\n signal: abortScope.signal,\n },\n );\n\n if (!response.ok) {\n const details = await readErrorResponse(response);\n throw new Error(\n `Google request failed (${response.status}): ${details}`,\n );\n }\n\n if (!response.body) {\n throw new Error(\"Google streaming response body is empty\");\n }\n\n const decoder = new TextDecoder();\n const reader = response.body.getReader();\n let buffer = \"\";\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n\n if (value) {\n buffer += decoder.decode(value, { stream: true });\n }\n\n const parsedEvents = consumeSseEvents(buffer);\n buffer = parsedEvents.remaining;\n\n for (const chunk of processEvents(parsedEvents.events)) {\n yield chunk;\n }\n }\n\n buffer += decoder.decode();\n const finalEvents = consumeSseEvents(buffer, true);\n for (const chunk of processEvents(finalEvents.events)) {\n yield chunk;\n }\n\n if (!doneEmitted) {\n chunkIndex += 1;\n doneEmitted = true;\n yield {\n delta: \"\",\n text: aggregatedText,\n done: true,\n index: chunkIndex,\n tokensUsed,\n model,\n raw: {\n mode: \"stream\",\n done: true,\n reason: \"eof\",\n },\n };\n }\n } catch (error) {\n if (error instanceof Error && error.name === \"AbortError\") {\n if (req.signal?.aborted) {\n throw new Error(\"Google request aborted by caller\");\n }\n throw new Error(\n `Google request timed out after ${this.options.timeoutMs}ms`,\n );\n }\n throw error;\n } finally {\n abortScope.release();\n }\n }\n\n async generateStructuredResponse<T = unknown>(\n req: LLMStructuredRequest,\n ): Promise<LLMStructuredResponse<T>> {\n if (req.format !== \"runtime-plan\") {\n return {\n text: \"\",\n valid: false,\n errors: [`Unsupported structured format: ${String(req.format)}`],\n model: this.options.model,\n };\n }\n\n const payload = await this.requestGenerateContent(\n this.buildStructuredRequest(req),\n req.signal,\n );\n\n const refusal = this.extractRefusal(payload);\n if (refusal) {\n return {\n text: \"\",\n valid: false,\n errors: [`Google refusal: ${refusal}`],\n tokensUsed: this.extractTotalTokens(payload),\n model: payload.modelVersion ?? this.options.model,\n raw: {\n mode: \"structured\",\n finishReason: payload.candidates?.[0]?.finishReason,\n },\n };\n }\n\n const text = this.extractText(payload);\n if (text.trim().length === 0) {\n return {\n text,\n valid: false,\n errors: [\"Structured response content is empty\"],\n tokensUsed: this.extractTotalTokens(payload),\n model: payload.modelVersion ?? this.options.model,\n raw: {\n mode: \"structured\",\n finishReason: payload.candidates?.[0]?.finishReason,\n },\n };\n }\n\n const parsed = tryParseJson(text);\n if (!parsed.ok) {\n return {\n text,\n valid: false,\n errors: [`Structured JSON parse failed: ${parsed.error}`],\n tokensUsed: this.extractTotalTokens(payload),\n model: payload.modelVersion ?? this.options.model,\n raw: {\n mode: \"structured\",\n finishReason: payload.candidates?.[0]?.finishReason,\n },\n };\n }\n\n if (!isRuntimePlan(parsed.value)) {\n return {\n text,\n value: parsed.value as T,\n valid: false,\n errors: [\"Structured payload is not a valid RuntimePlan\"],\n tokensUsed: this.extractTotalTokens(payload),\n model: payload.modelVersion ?? this.options.model,\n raw: {\n mode: \"structured\",\n finishReason: payload.candidates?.[0]?.finishReason,\n },\n };\n }\n\n return {\n text,\n value: parsed.value as T,\n valid: true,\n tokensUsed: this.extractTotalTokens(payload),\n model: payload.modelVersion ?? this.options.model,\n raw: {\n mode: \"structured\",\n finishReason: payload.candidates?.[0]?.finishReason,\n },\n };\n }\n\n setPromptTemplate(templateName: string, templateContent: string): void {\n this.templates.set(templateName, templateContent);\n }\n\n getPromptTemplate(templateName: string): string | undefined {\n return this.templates.get(templateName);\n }\n\n private buildRequest(req: LLMRequest): Record<string, unknown> {\n const system = this.resolveSystemPrompt(req);\n const body: Record<string, unknown> = {\n contents: [\n {\n role: \"user\",\n parts: [\n {\n text: this.buildUserPrompt(req),\n },\n ],\n },\n ],\n generationConfig: {\n responseMimeType: \"text/plain\",\n },\n };\n\n if (system) {\n body.systemInstruction = {\n parts: [\n {\n text: system,\n },\n ],\n };\n }\n\n return body;\n }\n\n private buildStructuredRequest(\n req: LLMStructuredRequest,\n ): Record<string, unknown> {\n const body = this.buildRequest({\n ...req,\n systemPrompt: this.resolveStructuredSystemPrompt(req),\n });\n\n body.generationConfig = {\n responseMimeType: \"application/json\",\n };\n\n return body;\n }\n\n private resolveSystemPrompt(req: LLMRequest): string | undefined {\n const configuredSystem = this.options.systemPrompt;\n const templateSystem = this.templates.get(\"default\");\n const requestSystem = req.systemPrompt;\n\n const candidates = [configuredSystem, templateSystem, requestSystem]\n .filter((entry): entry is string => typeof entry === \"string\")\n .map((entry) => entry.trim())\n .filter((entry) => entry.length > 0);\n\n if (candidates.length === 0) {\n return undefined;\n }\n\n return candidates.join(\"\\n\\n\");\n }\n\n private resolveStructuredSystemPrompt(req: LLMStructuredRequest): string {\n const template = this.templates.get(\"runtime-plan\");\n const strictHint = req.strict === false ? \"false\" : \"true\";\n const defaultPrompt = [\n \"You generate RuntimePlan JSON for Renderify.\",\n \"Return only JSON with no markdown or explanations.\",\n \"Schema priority: id/version/root/capabilities must be valid.\",\n `Strict mode: ${strictHint}.`,\n ].join(\" \");\n\n return [this.resolveSystemPrompt(req), template, defaultPrompt]\n .filter((entry): entry is string => typeof entry === \"string\")\n .map((entry) => entry.trim())\n .filter((entry) => entry.length > 0)\n .join(\"\\n\\n\");\n }\n\n private buildUserPrompt(req: LLMRequest): string {\n const contextSnippet = formatContext(req.context);\n if (!contextSnippet) {\n return req.prompt;\n }\n\n return `${req.prompt}\\n\\nContext:\\n${contextSnippet}`;\n }\n\n private async requestGenerateContent(\n body: Record<string, unknown>,\n signal?: AbortSignal,\n ): Promise<GoogleGenerateContentPayload> {\n const fetchImpl = resolveFetch(\n this.fetchImpl,\n \"Global fetch is unavailable. Provide fetchImpl in GoogleLLMInterpreter options.\",\n );\n const apiKey = this.options.apiKey;\n if (!apiKey || apiKey.trim().length === 0) {\n throw new Error(\n \"Google apiKey is missing. Set RENDERIFY_LLM_API_KEY or configure apiKey.\",\n );\n }\n\n try {\n return await withTimeoutAbortScope(\n this.options.timeoutMs,\n signal,\n async (timeoutSignal) => {\n const response = await fetchImpl(\n `${this.options.baseUrl.replace(/\\/$/, \"\")}/models/${encodeURIComponent(this.options.model)}:generateContent`,\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n \"x-goog-api-key\": apiKey,\n },\n body: JSON.stringify(body),\n signal: timeoutSignal,\n },\n );\n\n if (!response.ok) {\n const details = await readErrorResponse(response);\n throw new Error(\n `Google request failed (${response.status}): ${details}`,\n );\n }\n\n const parsed =\n (await response.json()) as GoogleGenerateContentPayload;\n if (parsed.error?.message) {\n throw new Error(`Google error: ${parsed.error.message}`);\n }\n\n return parsed;\n },\n );\n } catch (error) {\n if (error instanceof Error && error.name === \"AbortError\") {\n if (signal?.aborted) {\n throw new Error(\"Google request aborted by caller\");\n }\n throw new Error(\n `Google request timed out after ${this.options.timeoutMs}ms`,\n );\n }\n throw error;\n }\n }\n\n private extractText(payload: GoogleGenerateContentPayload): string {\n return this.extractTextRaw(payload).trim();\n }\n\n private extractTextRaw(payload: GoogleGenerateContentPayload): string {\n const candidate = payload.candidates?.[0];\n if (!candidate) {\n return \"\";\n }\n\n return (candidate.content?.parts ?? [])\n .map((part) => (typeof part.text === \"string\" ? part.text : \"\"))\n .join(\"\");\n }\n\n private extractRefusal(\n payload: GoogleGenerateContentPayload,\n ): string | undefined {\n const blockReason = payload.promptFeedback?.blockReason;\n if (typeof blockReason === \"string\" && blockReason.trim().length > 0) {\n const details = payload.promptFeedback?.blockReasonMessage;\n if (typeof details === \"string\" && details.trim().length > 0) {\n return `${blockReason.trim()}: ${details.trim()}`;\n }\n\n return blockReason.trim();\n }\n\n const finishReason = payload.candidates?.[0]?.finishReason;\n if (\n finishReason === \"SAFETY\" ||\n finishReason === \"RECITATION\" ||\n finishReason === \"BLOCKLIST\" ||\n finishReason === \"PROHIBITED_CONTENT\" ||\n finishReason === \"SPII\"\n ) {\n return `finishReason=${finishReason}`;\n }\n\n return undefined;\n }\n\n private extractTotalTokens(\n payload: GoogleGenerateContentPayload,\n ): number | undefined {\n const usage = payload.usageMetadata;\n if (!usage) {\n return undefined;\n }\n\n if (typeof usage.totalTokenCount === \"number\") {\n return usage.totalTokenCount;\n }\n\n const prompt = usage.promptTokenCount;\n const candidates = usage.candidatesTokenCount;\n if (typeof prompt !== \"number\" && typeof candidates !== \"number\") {\n return undefined;\n }\n\n return (prompt ?? 0) + (candidates ?? 0);\n }\n}\n","import type {\n LLMInterpreter,\n LLMRequest,\n LLMResponse,\n LLMResponseStreamChunk,\n LLMStructuredRequest,\n LLMStructuredResponse,\n} from \"@renderify/core\";\nimport { isRuntimePlan } from \"@renderify/ir\";\nimport {\n consumeSseEvents,\n createTimeoutAbortScope,\n formatContext,\n pickFetch,\n pickPositiveInt,\n pickString,\n readErrorResponse,\n resolveFetch,\n tryParseJson,\n withTimeoutAbortScope,\n} from \"./shared\";\n\nexport interface OpenAILLMInterpreterOptions {\n apiKey?: string;\n model?: string;\n baseUrl?: string;\n timeoutMs?: number;\n organization?: string;\n project?: string;\n systemPrompt?: string;\n fetchImpl?: typeof fetch;\n}\n\ninterface OpenAIUsagePayload {\n total_tokens?: number;\n}\n\ninterface OpenAIChoicePayload {\n message?: {\n content?: string | Array<{ type?: string; text?: string }>;\n refusal?: string | null;\n };\n}\n\ninterface OpenAIChatCompletionsPayload {\n id?: string;\n model?: string;\n usage?: OpenAIUsagePayload;\n choices?: OpenAIChoicePayload[];\n error?: {\n message?: string;\n };\n}\n\ninterface OpenAIStreamChoicePayload {\n delta?: {\n content?: string | Array<{ type?: string; text?: string }>;\n refusal?: string | null;\n };\n}\n\ninterface OpenAIChatCompletionsStreamPayload {\n id?: string;\n model?: string;\n usage?: OpenAIUsagePayload;\n choices?: OpenAIStreamChoicePayload[];\n error?: {\n message?: string;\n };\n}\n\ninterface OpenAIMessage {\n role: \"system\" | \"user\";\n content: string;\n}\n\ninterface OpenAIExtractedOutput {\n text: string;\n refusal?: string;\n}\n\nconst DEFAULT_BASE_URL = \"https://api.openai.com/v1\";\nconst DEFAULT_MODEL = \"gpt-4.1-mini\";\nconst DEFAULT_TIMEOUT_MS = 30000;\n\nconst RUNTIME_PLAN_JSON_SCHEMA = {\n type: \"object\",\n additionalProperties: true,\n required: [\"id\", \"version\", \"root\", \"capabilities\"],\n properties: {\n specVersion: {\n type: \"string\",\n minLength: 1,\n },\n id: {\n type: \"string\",\n minLength: 1,\n },\n version: {\n type: \"integer\",\n minimum: 1,\n },\n root: {\n type: \"object\",\n additionalProperties: true,\n },\n capabilities: {\n type: \"object\",\n additionalProperties: true,\n },\n imports: {\n type: \"array\",\n items: {\n type: \"string\",\n },\n },\n moduleManifest: {\n type: \"object\",\n additionalProperties: {\n type: \"object\",\n additionalProperties: false,\n required: [\"resolvedUrl\"],\n properties: {\n resolvedUrl: { type: \"string\", minLength: 1 },\n integrity: { type: \"string\", minLength: 1 },\n version: { type: \"string\", minLength: 1 },\n signer: { type: \"string\", minLength: 1 },\n },\n },\n },\n metadata: {\n type: \"object\",\n additionalProperties: true,\n },\n state: {\n type: \"object\",\n additionalProperties: true,\n },\n source: {\n type: \"object\",\n additionalProperties: false,\n required: [\"language\", \"code\"],\n properties: {\n language: {\n type: \"string\",\n enum: [\"js\", \"jsx\", \"ts\", \"tsx\"],\n },\n code: {\n type: \"string\",\n minLength: 1,\n },\n exportName: {\n type: \"string\",\n minLength: 1,\n },\n runtime: {\n type: \"string\",\n enum: [\"renderify\", \"preact\"],\n },\n },\n },\n },\n} as const;\n\nexport class OpenAILLMInterpreter implements LLMInterpreter {\n private readonly templates = new Map<string, string>();\n private options: Required<\n Pick<OpenAILLMInterpreterOptions, \"baseUrl\" | \"model\" | \"timeoutMs\">\n > &\n Omit<\n OpenAILLMInterpreterOptions,\n \"baseUrl\" | \"model\" | \"timeoutMs\" | \"fetchImpl\"\n > = {\n baseUrl: DEFAULT_BASE_URL,\n model: DEFAULT_MODEL,\n timeoutMs: DEFAULT_TIMEOUT_MS,\n apiKey: undefined,\n organization: undefined,\n project: undefined,\n systemPrompt: undefined,\n };\n private fetchImpl: typeof fetch | undefined;\n\n constructor(options: OpenAILLMInterpreterOptions = {}) {\n this.configure({ ...options });\n if (options.fetchImpl) {\n this.fetchImpl = options.fetchImpl;\n }\n }\n\n configure(options: Record<string, unknown>): void {\n const apiKey = pickString(options, \"apiKey\", \"llmApiKey\");\n const model = pickString(options, \"model\", \"llmModel\");\n const baseUrl = pickString(options, \"baseUrl\", \"llmBaseUrl\");\n const organization = pickString(\n options,\n \"organization\",\n \"openaiOrganization\",\n );\n const project = pickString(options, \"project\", \"openaiProject\");\n const systemPrompt = pickString(options, \"systemPrompt\");\n const timeoutMs = pickPositiveInt(\n options,\n \"timeoutMs\",\n \"llmRequestTimeoutMs\",\n );\n const fetchImpl = pickFetch(options, \"fetchImpl\");\n\n this.options = {\n ...this.options,\n ...(apiKey !== undefined ? { apiKey } : {}),\n ...(model !== undefined ? { model } : {}),\n ...(baseUrl !== undefined ? { baseUrl } : {}),\n ...(organization !== undefined ? { organization } : {}),\n ...(project !== undefined ? { project } : {}),\n ...(systemPrompt !== undefined ? { systemPrompt } : {}),\n ...(timeoutMs !== undefined ? { timeoutMs } : {}),\n };\n\n if (fetchImpl) {\n this.fetchImpl = fetchImpl;\n }\n }\n\n async generateResponse(req: LLMRequest): Promise<LLMResponse> {\n const payload = await this.requestChatCompletions(\n {\n model: this.options.model,\n messages: this.buildMessages(req),\n },\n req.signal,\n );\n\n const output = this.extractOutput(payload);\n if (output.refusal) {\n throw new Error(`OpenAI refused request: ${output.refusal}`);\n }\n\n return {\n text: output.text,\n tokensUsed: payload.usage?.total_tokens,\n model: payload.model ?? this.options.model,\n raw: {\n mode: \"text\",\n responseId: payload.id,\n },\n };\n }\n\n async *generateResponseStream(\n req: LLMRequest,\n ): AsyncIterable<LLMResponseStreamChunk> {\n const fetchImpl = resolveFetch(\n this.fetchImpl,\n \"Global fetch is unavailable. Provide fetchImpl in OpenAILLMInterpreter options.\",\n );\n const apiKey = this.options.apiKey;\n\n if (!apiKey || apiKey.trim().length === 0) {\n throw new Error(\n \"OpenAI apiKey is missing. Set RENDERIFY_LLM_API_KEY or configure apiKey.\",\n );\n }\n\n const abortScope = createTimeoutAbortScope(\n this.options.timeoutMs,\n req.signal,\n );\n\n let aggregatedText = \"\";\n let chunkIndex = 0;\n let tokensUsed: number | undefined;\n let model = this.options.model;\n let doneEmitted = false;\n\n const processEvents = (\n events: Array<{ data: string }>,\n ): Array<LLMResponseStreamChunk> => {\n const chunks: LLMResponseStreamChunk[] = [];\n\n for (const event of events) {\n const eventData = event.data;\n if (eventData === \"[DONE]\") {\n if (!doneEmitted) {\n chunkIndex += 1;\n doneEmitted = true;\n chunks.push({\n delta: \"\",\n text: aggregatedText,\n done: true,\n index: chunkIndex,\n tokensUsed,\n model,\n raw: {\n mode: \"stream\",\n done: true,\n },\n });\n }\n continue;\n }\n\n let payload: OpenAIChatCompletionsStreamPayload;\n try {\n payload = JSON.parse(eventData) as OpenAIChatCompletionsStreamPayload;\n } catch (error) {\n throw new Error(\n `OpenAI stream chunk parse failed: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n\n if (payload.error?.message) {\n throw new Error(`OpenAI error: ${payload.error.message}`);\n }\n\n if (\n typeof payload.model === \"string\" &&\n payload.model.trim().length > 0\n ) {\n model = payload.model;\n }\n\n if (\n typeof payload.usage?.total_tokens === \"number\" &&\n Number.isFinite(payload.usage.total_tokens)\n ) {\n tokensUsed = payload.usage.total_tokens;\n }\n\n const output = this.extractStreamDelta(payload);\n if (output.refusal) {\n throw new Error(`OpenAI refused request: ${output.refusal}`);\n }\n\n if (output.text.length === 0) {\n continue;\n }\n\n aggregatedText += output.text;\n chunkIndex += 1;\n chunks.push({\n delta: output.text,\n text: aggregatedText,\n done: false,\n index: chunkIndex,\n tokensUsed,\n model,\n raw: {\n mode: \"stream\",\n chunk: payload,\n },\n });\n }\n\n return chunks;\n };\n\n try {\n const response = await fetchImpl(\n `${this.options.baseUrl.replace(/\\/$/, \"\")}/chat/completions`,\n {\n method: \"POST\",\n headers: this.createHeaders(apiKey),\n body: JSON.stringify({\n model: this.options.model,\n messages: this.buildMessages(req),\n stream: true,\n stream_options: {\n include_usage: true,\n },\n }),\n signal: abortScope.signal,\n },\n );\n\n if (!response.ok) {\n const details = await readErrorResponse(response);\n throw new Error(\n `OpenAI request failed (${response.status}): ${details}`,\n );\n }\n\n if (!response.body) {\n throw new Error(\"OpenAI streaming response body is empty\");\n }\n\n const decoder = new TextDecoder();\n const reader = response.body.getReader();\n let buffer = \"\";\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n\n if (value) {\n buffer += decoder.decode(value, { stream: true });\n }\n\n const parsedEvents = consumeSseEvents(buffer);\n buffer = parsedEvents.remaining;\n\n for (const chunk of processEvents(parsedEvents.events)) {\n yield chunk;\n }\n }\n\n buffer += decoder.decode();\n const finalEvents = consumeSseEvents(buffer, true);\n for (const chunk of processEvents(finalEvents.events)) {\n yield chunk;\n }\n\n if (!doneEmitted) {\n chunkIndex += 1;\n doneEmitted = true;\n yield {\n delta: \"\",\n text: aggregatedText,\n done: true,\n index: chunkIndex,\n tokensUsed,\n model,\n raw: {\n mode: \"stream\",\n done: true,\n reason: \"eof\",\n },\n };\n }\n } catch (error) {\n if (error instanceof Error && error.name === \"AbortError\") {\n if (req.signal?.aborted) {\n throw new Error(\"OpenAI request aborted by caller\");\n }\n throw new Error(\n `OpenAI request timed out after ${this.options.timeoutMs}ms`,\n );\n }\n throw error;\n } finally {\n abortScope.release();\n }\n }\n\n async generateStructuredResponse<T = unknown>(\n req: LLMStructuredRequest,\n ): Promise<LLMStructuredResponse<T>> {\n if (req.format !== \"runtime-plan\") {\n return {\n text: \"\",\n valid: false,\n errors: [`Unsupported structured format: ${String(req.format)}`],\n model: this.options.model,\n };\n }\n\n const payload = await this.requestChatCompletions(\n {\n model: this.options.model,\n messages: this.buildMessages({\n ...req,\n systemPrompt: this.resolveStructuredSystemPrompt(req),\n }),\n response_format: {\n type: \"json_schema\",\n json_schema: {\n name: \"runtime_plan\",\n strict: req.strict !== false,\n schema: RUNTIME_PLAN_JSON_SCHEMA,\n },\n },\n },\n req.signal,\n );\n\n const output = this.extractOutput(payload);\n\n if (output.refusal) {\n return {\n text: \"\",\n valid: false,\n errors: [`OpenAI refusal: ${output.refusal}`],\n tokensUsed: payload.usage?.total_tokens,\n model: payload.model ?? this.options.model,\n raw: {\n mode: \"structured\",\n responseId: payload.id,\n refusal: output.refusal,\n },\n };\n }\n\n if (output.text.trim().length === 0) {\n return {\n text: \"\",\n valid: false,\n errors: [\"Structured response content is empty\"],\n tokensUsed: payload.usage?.total_tokens,\n model: payload.model ?? this.options.model,\n raw: {\n mode: \"structured\",\n responseId: payload.id,\n },\n };\n }\n\n const parsed = tryParseJson(output.text);\n if (!parsed.ok) {\n return {\n text: output.text,\n valid: false,\n errors: [`Structured JSON parse failed: ${parsed.error}`],\n tokensUsed: payload.usage?.total_tokens,\n model: payload.model ?? this.options.model,\n raw: {\n mode: \"structured\",\n responseId: payload.id,\n },\n };\n }\n\n if (!isRuntimePlan(parsed.value)) {\n return {\n text: output.text,\n value: parsed.value as T,\n valid: false,\n errors: [\"Structured payload is not a valid RuntimePlan\"],\n tokensUsed: payload.usage?.total_tokens,\n model: payload.model ?? this.options.model,\n raw: {\n mode: \"structured\",\n responseId: payload.id,\n },\n };\n }\n\n return {\n text: output.text,\n value: parsed.value as T,\n valid: true,\n tokensUsed: payload.usage?.total_tokens,\n model: payload.model ?? this.options.model,\n raw: {\n mode: \"structured\",\n responseId: payload.id,\n },\n };\n }\n\n setPromptTemplate(templateName: string, templateContent: string): void {\n this.templates.set(templateName, templateContent);\n }\n\n getPromptTemplate(templateName: string): string | undefined {\n return this.templates.get(templateName);\n }\n\n private async requestChatCompletions(\n body: Record<string, unknown>,\n signal?: AbortSignal,\n ): Promise<OpenAIChatCompletionsPayload> {\n const fetchImpl = resolveFetch(\n this.fetchImpl,\n \"Global fetch is unavailable. Provide fetchImpl in OpenAILLMInterpreter options.\",\n );\n const apiKey = this.options.apiKey;\n\n if (!apiKey || apiKey.trim().length === 0) {\n throw new Error(\n \"OpenAI apiKey is missing. Set RENDERIFY_LLM_API_KEY or configure apiKey.\",\n );\n }\n\n try {\n return await withTimeoutAbortScope(\n this.options.timeoutMs,\n signal,\n async (timeoutSignal) => {\n const response = await fetchImpl(\n `${this.options.baseUrl.replace(/\\/$/, \"\")}/chat/completions`,\n {\n method: \"POST\",\n headers: this.createHeaders(apiKey),\n body: JSON.stringify(body),\n signal: timeoutSignal,\n },\n );\n\n if (!response.ok) {\n const details = await readErrorResponse(response);\n throw new Error(\n `OpenAI request failed (${response.status}): ${details}`,\n );\n }\n\n const parsed =\n (await response.json()) as OpenAIChatCompletionsPayload;\n if (parsed.error?.message) {\n throw new Error(`OpenAI error: ${parsed.error.message}`);\n }\n\n return parsed;\n },\n );\n } catch (error) {\n if (error instanceof Error && error.name === \"AbortError\") {\n if (signal?.aborted) {\n throw new Error(\"OpenAI request aborted by caller\");\n }\n throw new Error(\n `OpenAI request timed out after ${this.options.timeoutMs}ms`,\n );\n }\n throw error;\n }\n }\n\n private buildMessages(req: LLMRequest): OpenAIMessage[] {\n const messages: OpenAIMessage[] = [];\n const templateSystem = this.templates.get(\"default\");\n const promptSystem = req.systemPrompt;\n const configuredSystem = this.options.systemPrompt;\n\n for (const system of [configuredSystem, templateSystem, promptSystem]) {\n if (typeof system === \"string\" && system.trim().length > 0) {\n messages.push({\n role: \"system\",\n content: system.trim(),\n });\n }\n }\n\n const contextSnippet = formatContext(req.context);\n const prompt = contextSnippet\n ? `${req.prompt}\\n\\nContext:\\n${contextSnippet}`\n : req.prompt;\n\n messages.push({\n role: \"user\",\n content: prompt,\n });\n\n return messages;\n }\n\n private resolveStructuredSystemPrompt(req: LLMStructuredRequest): string {\n const template = this.templates.get(\"runtime-plan\");\n if (template && template.trim().length > 0) {\n return template;\n }\n\n const strictHint = req.strict === false ? \"false\" : \"true\";\n return [\n \"You generate RuntimePlan JSON for Renderify.\",\n \"Return only JSON with no markdown or explanations.\",\n \"Schema priority: id/version/root/capabilities must be valid.\",\n `Strict mode: ${strictHint}.`,\n ].join(\" \");\n }\n\n private createHeaders(apiKey: string): Record<string, string> {\n const headers: Record<string, string> = {\n \"content-type\": \"application/json\",\n authorization: `Bearer ${apiKey}`,\n };\n\n if (this.options.organization) {\n headers[\"OpenAI-Organization\"] = this.options.organization;\n }\n\n if (this.options.project) {\n headers[\"OpenAI-Project\"] = this.options.project;\n }\n\n return headers;\n }\n\n private extractOutput(\n payload: OpenAIChatCompletionsPayload,\n ): OpenAIExtractedOutput {\n const choice = payload.choices?.[0];\n if (!choice || !choice.message) {\n throw new Error(\"OpenAI response missing assistant choice\");\n }\n\n const refusal = choice.message.refusal;\n if (typeof refusal === \"string\" && refusal.trim().length > 0) {\n return {\n text: \"\",\n refusal: refusal.trim(),\n };\n }\n\n const content = choice.message.content;\n if (typeof content === \"string\") {\n return {\n text: content.trim(),\n };\n }\n\n if (Array.isArray(content)) {\n const combined = content\n .map((part) => (typeof part.text === \"string\" ? part.text : \"\"))\n .join(\"\")\n .trim();\n\n return {\n text: combined,\n };\n }\n\n return {\n text: \"\",\n };\n }\n\n private extractStreamDelta(\n payload: OpenAIChatCompletionsStreamPayload,\n ): OpenAIExtractedOutput {\n const choices = payload.choices ?? [];\n let text = \"\";\n\n for (const choice of choices) {\n const refusal = choice.delta?.refusal;\n if (typeof refusal === \"string\" && refusal.trim().length > 0) {\n return {\n text: \"\",\n refusal: refusal.trim(),\n };\n }\n\n const content = choice.delta?.content;\n if (typeof content === \"string\") {\n text += content;\n continue;\n }\n\n if (Array.isArray(content)) {\n text += content\n .map((part) => (typeof part.text === \"string\" ? part.text : \"\"))\n .join(\"\");\n }\n }\n\n return {\n text,\n };\n }\n}\n","import type { LLMInterpreter } from \"@renderify/core\";\nimport {\n AnthropicLLMInterpreter,\n type AnthropicLLMInterpreterOptions,\n} from \"./providers/anthropic\";\nimport {\n GoogleLLMInterpreter,\n type GoogleLLMInterpreterOptions,\n} from \"./providers/google\";\nimport {\n OpenAILLMInterpreter,\n type OpenAILLMInterpreterOptions,\n} from \"./providers/openai\";\n\nexport type LLMProviderName = string;\n\nexport interface LLMProviderDefinition<\n TOptions extends object = Record<string, unknown>,\n> {\n name: LLMProviderName;\n create(options?: TOptions): LLMInterpreter;\n}\n\nexport const openaiLLMProvider: LLMProviderDefinition<OpenAILLMInterpreterOptions> =\n {\n name: \"openai\",\n create: (options) => new OpenAILLMInterpreter(options),\n };\n\nexport const anthropicLLMProvider: LLMProviderDefinition<AnthropicLLMInterpreterOptions> =\n {\n name: \"anthropic\",\n create: (options) => new AnthropicLLMInterpreter(options),\n };\n\nexport const googleLLMProvider: LLMProviderDefinition<GoogleLLMInterpreterOptions> =\n {\n name: \"google\",\n create: (options) => new GoogleLLMInterpreter(options),\n };\n\nexport class LLMProviderRegistry {\n private readonly providers = new Map<string, LLMProviderDefinition>();\n\n register(definition: LLMProviderDefinition): this {\n const key = normalizeProviderName(definition.name);\n this.providers.set(key, definition);\n return this;\n }\n\n unregister(providerName: string): boolean {\n return this.providers.delete(normalizeProviderName(providerName));\n }\n\n has(providerName: string): boolean {\n return this.providers.has(normalizeProviderName(providerName));\n }\n\n list(): string[] {\n return [...this.providers.keys()].sort((a, b) => a.localeCompare(b));\n }\n\n resolve(providerName: string): LLMProviderDefinition | undefined {\n return this.providers.get(normalizeProviderName(providerName));\n }\n\n create(\n providerName: string,\n options?: Record<string, unknown>,\n ): LLMInterpreter {\n const provider = this.resolve(providerName);\n if (!provider) {\n const available = this.list();\n const hint =\n available.length > 0\n ? ` Available providers: ${available.join(\", \")}.`\n : \" No providers registered.\";\n throw new Error(`Unknown LLM provider: ${providerName}.${hint}`);\n }\n\n return provider.create(options);\n }\n}\n\nexport function createDefaultLLMProviderRegistry(): LLMProviderRegistry {\n const registry = new LLMProviderRegistry();\n registry.register(anthropicLLMProvider);\n registry.register(googleLLMProvider);\n registry.register(openaiLLMProvider);\n return registry;\n}\n\nexport const defaultLLMProviderRegistry = createDefaultLLMProviderRegistry();\n\nexport function createLLMInterpreter(options: {\n provider?: string;\n providerOptions?: Record<string, unknown>;\n registry?: LLMProviderRegistry;\n}): LLMInterpreter {\n const provider = normalizeProviderName(options.provider ?? \"openai\");\n const registry = options.registry ?? defaultLLMProviderRegistry;\n\n return registry.create(provider, options.providerOptions);\n}\n\nfunction normalizeProviderName(providerName: string): string {\n const normalized = String(providerName).trim().toLowerCase();\n if (normalized.length === 0) {\n return \"openai\";\n }\n\n return normalized;\n}\n"],"mappings":"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","names":["isRuntimePlan","DEFAULT_BASE_URL","DEFAULT_MODEL","DEFAULT_TIMEOUT_MS","isRuntimePlan","isRuntimePlan","DEFAULT_BASE_URL","DEFAULT_MODEL","DEFAULT_TIMEOUT_MS","isRuntimePlan"]}
package/package.json ADDED
@@ -0,0 +1,59 @@
1
+ {
2
+ "name": "@renderify/llm",
3
+ "version": "0.1.0",
4
+ "description": "LLM providers for Renderify",
5
+ "main": "dist/llm.cjs.js",
6
+ "types": "dist/llm.d.ts",
7
+ "module": "dist/llm.esm.js",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/llm.d.ts",
11
+ "import": "./dist/llm.esm.js",
12
+ "require": "./dist/llm.cjs.js",
13
+ "default": "./dist/llm.esm.js"
14
+ },
15
+ "./package.json": "./package.json"
16
+ },
17
+ "files": [
18
+ "dist"
19
+ ],
20
+ "author": "unadlib",
21
+ "license": "MIT",
22
+ "keywords": [
23
+ "renderify",
24
+ "llm",
25
+ "openai",
26
+ "anthropic",
27
+ "google",
28
+ "llm-provider"
29
+ ],
30
+ "homepage": "https://github.com/webllm/renderify#readme",
31
+ "bugs": {
32
+ "url": "https://github.com/webllm/renderify/issues"
33
+ },
34
+ "repository": {
35
+ "type": "git",
36
+ "url": "https://github.com/webllm/renderify.git",
37
+ "directory": "packages/llm"
38
+ },
39
+ "engines": {
40
+ "node": ">=22.0.0"
41
+ },
42
+ "publishConfig": {
43
+ "access": "public",
44
+ "provenance": true
45
+ },
46
+ "sideEffects": false,
47
+ "dependencies": {
48
+ "@renderify/core": "^0.1.0",
49
+ "@renderify/ir": "^0.1.0"
50
+ },
51
+ "scripts": {
52
+ "test": "echo \"Error: no test specified\" && exit 1",
53
+ "typecheck": "tsc -p tsconfig.json --pretty false --noEmit",
54
+ "lint": "biome lint src",
55
+ "clean": "rm -rf dist dist-types",
56
+ "build:repo": "tsup --config tsup.config.ts",
57
+ "watch:repo": "tsup --config tsup.config.ts --watch"
58
+ }
59
+ }