@djangocfg/llm 2.1.164

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.
Files changed (45) hide show
  1. package/README.md +181 -0
  2. package/dist/index.cjs +1164 -0
  3. package/dist/index.cjs.map +1 -0
  4. package/dist/index.d.cts +164 -0
  5. package/dist/index.d.ts +164 -0
  6. package/dist/index.mjs +1128 -0
  7. package/dist/index.mjs.map +1 -0
  8. package/dist/providers/index.cjs +317 -0
  9. package/dist/providers/index.cjs.map +1 -0
  10. package/dist/providers/index.d.cts +30 -0
  11. package/dist/providers/index.d.ts +30 -0
  12. package/dist/providers/index.mjs +304 -0
  13. package/dist/providers/index.mjs.map +1 -0
  14. package/dist/sdkrouter-D8GMBmTi.d.ts +171 -0
  15. package/dist/sdkrouter-hlQlVd0v.d.cts +171 -0
  16. package/dist/text-utils-DoYqMIr6.d.ts +289 -0
  17. package/dist/text-utils-VXWN-8Oq.d.cts +289 -0
  18. package/dist/translator/index.cjs +794 -0
  19. package/dist/translator/index.cjs.map +1 -0
  20. package/dist/translator/index.d.cts +24 -0
  21. package/dist/translator/index.d.ts +24 -0
  22. package/dist/translator/index.mjs +769 -0
  23. package/dist/translator/index.mjs.map +1 -0
  24. package/dist/types-D6lazgm1.d.cts +59 -0
  25. package/dist/types-D6lazgm1.d.ts +59 -0
  26. package/package.json +82 -0
  27. package/src/client.ts +119 -0
  28. package/src/index.ts +70 -0
  29. package/src/providers/anthropic.ts +98 -0
  30. package/src/providers/base.ts +90 -0
  31. package/src/providers/index.ts +15 -0
  32. package/src/providers/openai.ts +73 -0
  33. package/src/providers/sdkrouter.ts +279 -0
  34. package/src/translator/cache.ts +237 -0
  35. package/src/translator/index.ts +55 -0
  36. package/src/translator/json-translator.ts +408 -0
  37. package/src/translator/prompts.ts +90 -0
  38. package/src/translator/text-utils.ts +148 -0
  39. package/src/translator/types.ts +112 -0
  40. package/src/translator/validator.ts +181 -0
  41. package/src/types.ts +85 -0
  42. package/src/utils/env.ts +67 -0
  43. package/src/utils/index.ts +2 -0
  44. package/src/utils/json.ts +44 -0
  45. package/src/utils/schema.ts +153 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/translator/text-utils.ts","../src/translator/validator.ts","../src/utils/json.ts","../src/providers/base.ts","../src/providers/openai.ts","../src/providers/anthropic.ts","../src/providers/sdkrouter.ts","../src/utils/env.ts","../src/client.ts","../src/translator/types.ts","../src/translator/prompts.ts","../src/translator/cache.ts","../src/translator/json-translator.ts","../src/utils/schema.ts"],"names":["OpenAI","crypto"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Text utilities for translation\n */\n\n/**\n * Check if text is technical content that shouldn't be translated\n */\nexport function isTechnicalContent(text: string): boolean {\n const trimmed = text.trim();\n\n // Empty or whitespace only\n if (!trimmed) return true;\n\n // URLs\n if (/^(https?:\\/\\/|\\/\\/|www\\.)/i.test(trimmed)) return true;\n\n // Email addresses\n if (/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(trimmed)) return true;\n\n // File paths (starts with / or contains common extensions)\n if (/^\\/[a-zA-Z]/.test(trimmed)) return true;\n if (/\\.(js|ts|tsx|jsx|json|css|scss|html|md|py|go|rs)$/i.test(trimmed)) return true;\n\n // Numbers only (including decimals and percentages)\n if (/^[\\d.,]+%?$/.test(trimmed)) return true;\n\n // Technical identifiers (SCREAMING_SNAKE_CASE)\n if (/^[A-Z][A-Z0-9_]*$/.test(trimmed)) return true;\n\n // Placeholders like {name}, {{var}}, %s, $1\n if (/^(\\{[^}]+\\}|\\{\\{[^}]+\\}\\}|%[sd]|\\$\\d+)$/.test(trimmed)) return true;\n\n // Single special characters\n if (/^[!@#$%^&*()_+\\-=\\[\\]{};':\"\\\\|,.<>\\/?]+$/.test(trimmed)) return true;\n\n return false;\n}\n\n/**\n * Check if text contains CJK characters (Chinese, Japanese, Korean)\n */\nexport function containsCJK(text: string): boolean {\n // CJK Unified Ideographs, Hiragana, Katakana, Hangul\n return /[\\u4e00-\\u9fff\\u3040-\\u309f\\u30a0-\\u30ff\\uac00-\\ud7af]/.test(text);\n}\n\n/**\n * Check if text contains Cyrillic characters\n */\nexport function containsCyrillic(text: string): boolean {\n return /[\\u0400-\\u04ff]/.test(text);\n}\n\n/**\n * Check if text contains Arabic characters\n */\nexport function containsArabic(text: string): boolean {\n return /[\\u0600-\\u06ff]/.test(text);\n}\n\n/**\n * Detect script/language from text\n */\nexport function detectScript(\n text: string\n): 'cjk' | 'cyrillic' | 'arabic' | 'latin' | 'unknown' {\n if (containsCJK(text)) return 'cjk';\n if (containsCyrillic(text)) return 'cyrillic';\n if (containsArabic(text)) return 'arabic';\n if (/[a-zA-Z]/.test(text)) return 'latin';\n return 'unknown';\n}\n\n/**\n * Extract placeholders from text\n */\nexport function extractPlaceholders(text: string): string[] {\n const patterns = [\n /\\{[^}]+\\}/g, // {name}\n /\\{\\{[^}]+\\}\\}/g, // {{name}}\n /%[sd]/g, // %s, %d\n /\\$\\d+/g, // $1, $2\n ];\n\n const placeholders: string[] = [];\n for (const pattern of patterns) {\n const matches = text.match(pattern);\n if (matches) {\n placeholders.push(...matches);\n }\n }\n\n return [...new Set(placeholders)];\n}\n\n/**\n * Check if all placeholders are preserved in translation\n */\nexport function validatePlaceholders(\n original: string,\n translated: string\n): { valid: boolean; missing: string[]; extra: string[] } {\n const originalPlaceholders = extractPlaceholders(original);\n const translatedPlaceholders = extractPlaceholders(translated);\n\n const missing = originalPlaceholders.filter(\n (p) => !translatedPlaceholders.includes(p)\n );\n const extra = translatedPlaceholders.filter(\n (p) => !originalPlaceholders.includes(p)\n );\n\n return {\n valid: missing.length === 0 && extra.length === 0,\n missing,\n extra,\n };\n}\n\n/**\n * Get values that need translation from JSON\n */\nexport function extractTranslatableValues(\n obj: unknown,\n path: string = ''\n): Array<{ path: string; value: string }> {\n const values: Array<{ path: string; value: string }> = [];\n\n if (typeof obj === 'string') {\n if (!isTechnicalContent(obj)) {\n values.push({ path, value: obj });\n }\n } else if (Array.isArray(obj)) {\n obj.forEach((item, index) => {\n values.push(\n ...extractTranslatableValues(item, path ? `${path}[${index}]` : `[${index}]`)\n );\n });\n } else if (obj !== null && typeof obj === 'object') {\n for (const [key, value] of Object.entries(obj)) {\n values.push(\n ...extractTranslatableValues(value, path ? `${path}.${key}` : key)\n );\n }\n }\n\n return values;\n}\n","/**\n * Translation validation\n */\n\nimport { extractPlaceholders } from './text-utils';\n\nexport interface ValidationResult {\n valid: boolean;\n errors: string[];\n}\n\n/**\n * Validate that JSON keys are not translated\n */\nexport function validateJsonKeys(\n original: unknown,\n translated: unknown,\n path: string = ''\n): ValidationResult {\n const errors: string[] = [];\n\n // Type check\n if (typeof original !== typeof translated) {\n errors.push(`Type mismatch at ${path || 'root'}: expected ${typeof original}, got ${typeof translated}`);\n return { valid: false, errors };\n }\n\n // Null check\n if (original === null || translated === null) {\n if (original !== translated) {\n errors.push(`Null mismatch at ${path || 'root'}`);\n }\n return { valid: errors.length === 0, errors };\n }\n\n // Array\n if (Array.isArray(original)) {\n if (!Array.isArray(translated)) {\n errors.push(`Expected array at ${path || 'root'}`);\n return { valid: false, errors };\n }\n\n if (original.length !== translated.length) {\n errors.push(\n `Array length mismatch at ${path || 'root'}: expected ${original.length}, got ${translated.length}`\n );\n }\n\n const minLen = Math.min(original.length, translated.length);\n for (let i = 0; i < minLen; i++) {\n const result = validateJsonKeys(\n original[i],\n translated[i],\n `${path}[${i}]`\n );\n errors.push(...result.errors);\n }\n\n return { valid: errors.length === 0, errors };\n }\n\n // Object\n if (typeof original === 'object') {\n if (typeof translated !== 'object' || Array.isArray(translated)) {\n errors.push(`Expected object at ${path || 'root'}`);\n return { valid: false, errors };\n }\n\n const origKeys = Object.keys(original as Record<string, unknown>);\n const transKeys = Object.keys(translated as Record<string, unknown>);\n\n // Check for missing keys\n for (const key of origKeys) {\n if (!transKeys.includes(key)) {\n errors.push(`Missing key: ${path ? `${path}.${key}` : key}`);\n }\n }\n\n // Check for extra keys (keys that were translated!)\n for (const key of transKeys) {\n if (!origKeys.includes(key)) {\n errors.push(\n `Unexpected key: ${path ? `${path}.${key}` : key} (key was translated?)`\n );\n }\n }\n\n // Recurse into matching keys\n for (const key of origKeys) {\n if (transKeys.includes(key)) {\n const result = validateJsonKeys(\n (original as Record<string, unknown>)[key],\n (translated as Record<string, unknown>)[key],\n path ? `${path}.${key}` : key\n );\n errors.push(...result.errors);\n }\n }\n\n return { valid: errors.length === 0, errors };\n }\n\n // Primitives (string, number, boolean) - no validation needed for structure\n return { valid: true, errors: [] };\n}\n\n/**\n * Validate that placeholders are preserved\n */\nexport function validatePlaceholders(\n original: unknown,\n translated: unknown,\n path: string = ''\n): ValidationResult {\n const errors: string[] = [];\n\n if (typeof original === 'string' && typeof translated === 'string') {\n const origPlaceholders = extractPlaceholders(original);\n const transPlaceholders = extractPlaceholders(translated);\n\n for (const placeholder of origPlaceholders) {\n if (!transPlaceholders.includes(placeholder)) {\n errors.push(\n `Missing placeholder \"${placeholder}\" at ${path || 'root'}`\n );\n }\n }\n\n for (const placeholder of transPlaceholders) {\n if (!origPlaceholders.includes(placeholder)) {\n errors.push(\n `Extra placeholder \"${placeholder}\" at ${path || 'root'}`\n );\n }\n }\n } else if (Array.isArray(original) && Array.isArray(translated)) {\n const minLen = Math.min(original.length, translated.length);\n for (let i = 0; i < minLen; i++) {\n const result = validatePlaceholders(\n original[i],\n translated[i],\n `${path}[${i}]`\n );\n errors.push(...result.errors);\n }\n } else if (\n typeof original === 'object' &&\n original !== null &&\n typeof translated === 'object' &&\n translated !== null\n ) {\n for (const key of Object.keys(original as Record<string, unknown>)) {\n if (key in (translated as Record<string, unknown>)) {\n const result = validatePlaceholders(\n (original as Record<string, unknown>)[key],\n (translated as Record<string, unknown>)[key],\n path ? `${path}.${key}` : key\n );\n errors.push(...result.errors);\n }\n }\n }\n\n return { valid: errors.length === 0, errors };\n}\n\n/**\n * Full validation of translation\n */\nexport function validateTranslation(\n original: unknown,\n translated: unknown\n): ValidationResult {\n const keyResult = validateJsonKeys(original, translated);\n const placeholderResult = validatePlaceholders(original, translated);\n\n return {\n valid: keyResult.valid && placeholderResult.valid,\n errors: [...keyResult.errors, ...placeholderResult.errors],\n };\n}\n","/**\n * JSON parsing utilities\n */\n\n/**\n * Extract JSON from LLM response (handles markdown code blocks)\n */\nexport function extractJson<T = unknown>(text: string): T {\n let jsonStr = text.trim();\n\n // Remove markdown code blocks\n if (jsonStr.startsWith('```json')) {\n jsonStr = jsonStr.slice(7);\n } else if (jsonStr.startsWith('```')) {\n jsonStr = jsonStr.slice(3);\n }\n\n if (jsonStr.endsWith('```')) {\n jsonStr = jsonStr.slice(0, -3);\n }\n\n jsonStr = jsonStr.trim();\n\n // Try to find JSON object or array\n const jsonStart = jsonStr.search(/[\\[{]/);\n const jsonEndBracket = jsonStr.lastIndexOf(']');\n const jsonEndBrace = jsonStr.lastIndexOf('}');\n const jsonEnd = Math.max(jsonEndBracket, jsonEndBrace);\n\n if (jsonStart !== -1 && jsonEnd !== -1) {\n jsonStr = jsonStr.slice(jsonStart, jsonEnd + 1);\n }\n\n try {\n return JSON.parse(jsonStr) as T;\n } catch (error) {\n throw new Error(\n `Failed to parse JSON from LLM response: ${error instanceof Error ? error.message : 'Unknown error'}\\n\\nResponse:\\n${text}`\n );\n }\n}\n\n// Re-export from translator validator for backwards compatibility\nexport { validateJsonKeys } from '../translator/validator';\n","/**\n * Base LLM provider\n */\n\nimport type {\n LLMClient,\n LLMConfig,\n LLMMessage,\n LLMProvider,\n LLMRequestOptions,\n LLMResponse,\n} from '../types';\nimport { extractJson } from '../utils/json';\n\nexport abstract class BaseLLMProvider implements LLMClient {\n abstract provider: LLMProvider;\n\n protected config: Required<\n Pick<LLMConfig, 'model' | 'temperature' | 'maxTokens'>\n > & LLMConfig;\n\n constructor(config: LLMConfig) {\n this.config = {\n model: config.model ?? 'gpt-4o-mini',\n temperature: config.temperature ?? 0.1,\n maxTokens: config.maxTokens ?? 4096,\n ...config,\n };\n }\n\n /**\n * Send chat messages (implemented by provider)\n */\n abstract chatMessages(\n messages: LLMMessage[],\n options?: LLMRequestOptions\n ): Promise<LLMResponse>;\n\n /**\n * Send single chat message\n */\n async chat(prompt: string, options?: LLMRequestOptions): Promise<LLMResponse> {\n const messages: LLMMessage[] = [];\n\n if (options?.system) {\n messages.push({ role: 'system', content: options.system });\n }\n\n messages.push({ role: 'user', content: prompt });\n\n return this.chatMessages(messages, options);\n }\n\n /**\n * Get JSON response\n */\n async json<T = unknown>(\n prompt: string,\n options?: LLMRequestOptions\n ): Promise<T> {\n const systemPrompt = `${options?.system ?? ''}\\n\\nRespond with valid JSON only. No markdown, no explanations.`.trim();\n\n const response = await this.chat(prompt, {\n ...options,\n system: systemPrompt,\n temperature: options?.temperature ?? 0,\n });\n\n return extractJson<T>(response.content);\n }\n\n /**\n * Get JSON response with schema hint\n */\n async jsonSchema<T = unknown>(\n prompt: string,\n schema: string,\n options?: LLMRequestOptions\n ): Promise<T> {\n const systemPrompt = `${options?.system ?? ''}\\n\\nRespond with valid JSON matching this schema:\\n${schema}\\n\\nNo markdown, no explanations.`.trim();\n\n const response = await this.chat(prompt, {\n ...options,\n system: systemPrompt,\n temperature: options?.temperature ?? 0,\n });\n\n return extractJson<T>(response.content);\n }\n}\n","/**\n * OpenAI provider\n */\n\nimport OpenAI from 'openai';\nimport type {\n LLMConfig,\n LLMMessage,\n LLMProvider,\n LLMRequestOptions,\n LLMResponse,\n} from '../types';\nimport { BaseLLMProvider } from './base';\n\nexport class OpenAIProvider extends BaseLLMProvider {\n provider: LLMProvider = 'openai';\n private client: OpenAI;\n\n constructor(config: LLMConfig) {\n super({\n model: config.model ?? 'gpt-4o-mini',\n ...config,\n });\n\n if (!config.apiKey) {\n throw new Error('OpenAI API key is required');\n }\n\n this.client = new OpenAI({\n apiKey: config.apiKey,\n baseURL: config.baseUrl,\n });\n }\n\n async chatMessages(\n messages: LLMMessage[],\n options?: LLMRequestOptions\n ): Promise<LLMResponse> {\n const model = options?.model ?? this.config.model;\n const temperature = options?.temperature ?? this.config.temperature;\n const maxTokens = options?.maxTokens ?? this.config.maxTokens;\n\n // Add system message if provided\n const allMessages = options?.system\n ? [{ role: 'system' as const, content: options.system }, ...messages]\n : messages;\n\n const response = await this.client.chat.completions.create({\n model,\n messages: allMessages.map((m) => ({\n role: m.role,\n content: m.content,\n })),\n temperature,\n max_tokens: maxTokens,\n });\n\n const choice = response.choices[0];\n\n return {\n content: choice.message.content ?? '',\n model: response.model,\n usage: response.usage\n ? {\n promptTokens: response.usage.prompt_tokens,\n completionTokens: response.usage.completion_tokens,\n totalTokens: response.usage.total_tokens,\n }\n : undefined,\n finishReason: choice.finish_reason ?? undefined,\n };\n }\n}\n","/**\n * Anthropic provider\n *\n * Uses OpenAI-compatible API endpoint for simplicity.\n * Anthropic provides OpenAI-compatible endpoint at api.anthropic.com\n */\n\nimport OpenAI from 'openai';\nimport type {\n LLMConfig,\n LLMMessage,\n LLMProvider,\n LLMRequestOptions,\n LLMResponse,\n} from '../types';\nimport { BaseLLMProvider } from './base';\n\nexport class AnthropicProvider extends BaseLLMProvider {\n provider: LLMProvider = 'anthropic';\n private client: OpenAI;\n\n constructor(config: LLMConfig) {\n super({\n model: config.model ?? 'claude-3-5-haiku-latest',\n ...config,\n });\n\n if (!config.apiKey) {\n throw new Error('Anthropic API key is required');\n }\n\n // Use native Anthropic SDK approach via fetch\n this.client = new OpenAI({\n apiKey: config.apiKey,\n baseURL: config.baseUrl ?? 'https://api.anthropic.com/v1',\n defaultHeaders: {\n 'anthropic-version': '2023-06-01',\n 'x-api-key': config.apiKey,\n },\n });\n }\n\n async chatMessages(\n messages: LLMMessage[],\n options?: LLMRequestOptions\n ): Promise<LLMResponse> {\n const model = options?.model ?? this.config.model;\n const temperature = options?.temperature ?? this.config.temperature;\n const maxTokens = options?.maxTokens ?? this.config.maxTokens;\n\n // Anthropic uses system separately\n const systemMessage = options?.system\n ? options.system\n : messages.find((m) => m.role === 'system')?.content;\n\n const userMessages = messages.filter((m) => m.role !== 'system');\n\n // Direct API call for Anthropic\n const response = await fetch('https://api.anthropic.com/v1/messages', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': this.config.apiKey!,\n 'anthropic-version': '2023-06-01',\n },\n body: JSON.stringify({\n model,\n max_tokens: maxTokens,\n temperature,\n system: systemMessage,\n messages: userMessages.map((m) => ({\n role: m.role,\n content: m.content,\n })),\n }),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Anthropic API error: ${response.status} ${error}`);\n }\n\n const data = await response.json();\n\n return {\n content: data.content?.[0]?.text ?? '',\n model: data.model,\n usage: data.usage\n ? {\n promptTokens: data.usage.input_tokens,\n completionTokens: data.usage.output_tokens,\n totalTokens: data.usage.input_tokens + data.usage.output_tokens,\n }\n : undefined,\n finishReason: data.stop_reason ?? undefined,\n };\n }\n}\n","/**\n * SDKRouter provider\n *\n * Uses https://llm.sdkrouter.com - OpenAI-compatible LLM router\n * with smart model aliases like @smart, @cheap, @balanced\n */\n\nimport OpenAI from 'openai';\nimport type {\n LLMConfig,\n LLMMessage,\n LLMProvider,\n LLMRequestOptions,\n LLMResponse,\n} from '../types';\nimport { BaseLLMProvider } from './base';\n\n/** SDKRouter base URL */\nexport const SDKROUTER_BASE_URL = 'https://llm.sdkrouter.com/v1';\n\n/**\n * Model tier presets\n *\n * @example '@cheap', '@smart', '@balanced'\n */\nexport type ModelTier =\n | 'cheap' // Cheapest available\n | 'budget' // Budget-friendly\n | 'standard' // Standard tier\n | 'balanced' // Best quality/price ratio\n | 'smart' // Highest quality\n | 'fast' // Lowest latency\n | 'premium'; // Top-tier\n\n/**\n * Model capabilities (features)\n *\n * @example '@cheap+vision', '@smart+tools+json'\n */\nexport type ModelCapability =\n | 'vision' // Image understanding\n | 'tools' // Function/tool calling\n | 'agents' // Agent tool calling (verified)\n | 'json' // JSON mode\n | 'streaming' // Streaming support\n | 'long' // Long context (128k+)\n | 'image'; // Image generation\n\n/**\n * Model categories (use cases)\n *\n * @example '@balanced+code', '@smart+reasoning'\n */\nexport type ModelCategory =\n | 'code' // Code generation\n | 'vision' // Vision & images\n | 'reasoning' // Reasoning & math\n | 'agents' // Tool use & agents\n | 'creative' // Creative writing\n | 'chat' // Conversational\n | 'analysis'; // Analysis & extraction\n\n/**\n * Model alias builder options\n */\nexport interface ModelOptions {\n // Capabilities\n vision?: boolean;\n tools?: boolean;\n agents?: boolean;\n json?: boolean;\n streaming?: boolean;\n long?: boolean;\n image?: boolean;\n // Categories\n code?: boolean;\n reasoning?: boolean;\n creative?: boolean;\n chat?: boolean;\n analysis?: boolean;\n}\n\n/**\n * Build model alias string\n *\n * @example\n * ```ts\n * buildModelAlias('smart') // '@smart'\n * buildModelAlias('cheap', { vision: true }) // '@cheap+vision'\n * buildModelAlias('balanced', { code: true, tools: true }) // '@balanced+code+tools'\n * ```\n */\nexport function buildModelAlias(tier: ModelTier, options?: ModelOptions): string {\n const parts: string[] = [tier];\n\n if (options) {\n // Capabilities (order matters for consistency)\n if (options.vision) parts.push('vision');\n if (options.tools) parts.push('tools');\n if (options.agents) parts.push('agents');\n if (options.json) parts.push('json');\n if (options.streaming) parts.push('streaming');\n if (options.long) parts.push('long');\n if (options.image) parts.push('image');\n // Categories\n if (options.code) parts.push('code');\n if (options.reasoning) parts.push('reasoning');\n if (options.creative) parts.push('creative');\n if (options.chat) parts.push('chat');\n if (options.analysis) parts.push('analysis');\n }\n\n return '@' + parts.join('+');\n}\n\n/**\n * Model alias builder with IDE autocomplete\n *\n * @example\n * ```ts\n * import { Model } from '@djangocfg/llm'\n *\n * Model.smart() // '@smart'\n * Model.cheap({ vision: true }) // '@cheap+vision'\n * Model.balanced({ code: true }) // '@balanced+code'\n * Model.fast({ tools: true, json: true }) // '@fast+tools+json'\n * ```\n */\nexport const Model = {\n /** Cheapest available model */\n cheap: (options?: ModelOptions): string => buildModelAlias('cheap', options),\n\n /** Budget-friendly with decent quality */\n budget: (options?: ModelOptions): string => buildModelAlias('budget', options),\n\n /** Standard tier */\n standard: (options?: ModelOptions): string => buildModelAlias('standard', options),\n\n /** Best quality/price ratio (recommended) */\n balanced: (options?: ModelOptions): string => buildModelAlias('balanced', options),\n\n /** Highest quality model */\n smart: (options?: ModelOptions): string => buildModelAlias('smart', options),\n\n /** Lowest latency model */\n fast: (options?: ModelOptions): string => buildModelAlias('fast', options),\n\n /** Top-tier premium model */\n premium: (options?: ModelOptions): string => buildModelAlias('premium', options),\n\n /**\n * Build alias from raw strings (escape hatch)\n *\n * @example Model.alias('cheap', 'vision', 'code') // '@cheap+vision+code'\n */\n alias: (tier: string, ...modifiers: string[]): string =>\n '@' + [tier, ...modifiers].join('+'),\n} as const;\n\n/**\n * Pre-built model aliases for common use cases\n */\nexport const ModelPresets = {\n /** Translation: cheap + json mode */\n translation: Model.cheap({ json: true }),\n\n /** Code generation: balanced + code */\n code: Model.balanced({ code: true }),\n\n /** Code with tools: balanced + code + tools */\n codeWithTools: Model.balanced({ code: true, tools: true }),\n\n /** Vision: balanced + vision */\n vision: Model.balanced({ vision: true }),\n\n /** Reasoning: smart + reasoning */\n reasoning: Model.smart({ reasoning: true }),\n\n /** Creative writing: balanced + creative */\n creative: Model.balanced({ creative: true }),\n\n /** Fast chat: fast + chat */\n fastChat: Model.fast({ chat: true }),\n\n /** Analysis: balanced + analysis */\n analysis: Model.balanced({ analysis: true }),\n\n /** Agents: smart + agents + tools */\n agents: Model.smart({ agents: true, tools: true }),\n} as const;\n\n/**\n * SDKRouter provider config\n */\nexport interface SDKRouterConfig extends LLMConfig {\n /** Model tier (shortcut for building alias) */\n tier?: ModelTier;\n /** Model options for alias building */\n modelOptions?: ModelOptions;\n}\n\n/**\n * SDKRouter LLM provider\n *\n * Uses OpenAI-compatible API at https://llm.sdkrouter.com\n *\n * @example\n * ```ts\n * const llm = new SDKRouterProvider({\n * apiKey: process.env.SDKROUTER_API_KEY,\n * model: Model.balanced({ code: true })\n * })\n * ```\n */\nexport class SDKRouterProvider extends BaseLLMProvider {\n provider: LLMProvider = 'sdkrouter';\n private client: OpenAI;\n\n constructor(config: SDKRouterConfig) {\n // Build model alias if tier provided\n const model =\n config.model ??\n (config.tier\n ? buildModelAlias(config.tier, config.modelOptions)\n : '@balanced');\n\n super({\n model,\n ...config,\n });\n\n if (!config.apiKey) {\n throw new Error('SDKRouter API key is required (SDKROUTER_API_KEY)');\n }\n\n this.client = new OpenAI({\n apiKey: config.apiKey,\n baseURL: config.baseUrl ?? SDKROUTER_BASE_URL,\n });\n }\n\n async chatMessages(\n messages: LLMMessage[],\n options?: LLMRequestOptions\n ): Promise<LLMResponse> {\n const model = options?.model ?? this.config.model;\n const temperature = options?.temperature ?? this.config.temperature;\n const maxTokens = options?.maxTokens ?? this.config.maxTokens;\n\n const allMessages = options?.system\n ? [{ role: 'system' as const, content: options.system }, ...messages]\n : messages;\n\n const response = await this.client.chat.completions.create({\n model,\n messages: allMessages.map((m) => ({\n role: m.role,\n content: m.content,\n })),\n temperature,\n max_tokens: maxTokens,\n });\n\n const choice = response.choices[0];\n\n return {\n content: choice.message.content ?? '',\n model: response.model,\n usage: response.usage\n ? {\n promptTokens: response.usage.prompt_tokens,\n completionTokens: response.usage.completion_tokens,\n totalTokens: response.usage.total_tokens,\n }\n : undefined,\n finishReason: choice.finish_reason ?? undefined,\n };\n }\n}\n","/**\n * Environment utilities\n */\n\nimport type { LLMProvider } from '../types';\n\n/**\n * Get API key from environment\n */\nexport function getApiKey(provider?: LLMProvider): string | undefined {\n if (provider === 'sdkrouter') {\n return process.env.SDKROUTER_API_KEY;\n }\n if (provider === 'openai') {\n return process.env.OPENAI_API_KEY;\n }\n if (provider === 'anthropic') {\n return process.env.ANTHROPIC_API_KEY;\n }\n\n // Auto-detect (sdkrouter first as preferred)\n return (\n process.env.SDKROUTER_API_KEY ||\n process.env.OPENAI_API_KEY ||\n process.env.ANTHROPIC_API_KEY\n );\n}\n\n/**\n * Detect provider from environment\n */\nexport function detectProvider(): LLMProvider | undefined {\n // Explicit provider\n const explicit = process.env.LLM_PROVIDER?.toLowerCase();\n if (explicit === 'sdkrouter' || explicit === 'openai' || explicit === 'anthropic') {\n return explicit;\n }\n\n // Auto-detect from API keys (sdkrouter preferred)\n if (process.env.SDKROUTER_API_KEY) {\n return 'sdkrouter';\n }\n if (process.env.OPENAI_API_KEY) {\n return 'openai';\n }\n if (process.env.ANTHROPIC_API_KEY) {\n return 'anthropic';\n }\n\n return undefined;\n}\n\n/**\n * Get default model for provider\n */\nexport function getDefaultModel(provider: LLMProvider): string {\n if (provider === 'sdkrouter') {\n return process.env.SDKROUTER_MODEL || '@balanced';\n }\n if (provider === 'openai') {\n return process.env.OPENAI_MODEL || 'gpt-4o-mini';\n }\n if (provider === 'anthropic') {\n return process.env.ANTHROPIC_MODEL || 'claude-3-5-haiku-latest';\n }\n return '@balanced';\n}\n","/**\n * LLM Client factory\n */\n\nimport type { LLMClient, LLMConfig, LLMProvider } from './types';\nimport { OpenAIProvider } from './providers/openai';\nimport { AnthropicProvider } from './providers/anthropic';\nimport { SDKRouterProvider } from './providers/sdkrouter';\nimport { detectProvider, getApiKey, getDefaultModel } from './utils/env';\n\nexport class LLMError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'LLMError';\n }\n}\n\n/**\n * Create LLM client with auto-detection\n *\n * Priority: SDKROUTER_API_KEY > OPENAI_API_KEY > ANTHROPIC_API_KEY\n *\n * @example\n * ```ts\n * // Auto-detect from env (sdkrouter preferred)\n * const llm = createLLMClient()\n *\n * // With model alias\n * const llm = createLLMClient({ model: '@smart+code' })\n *\n * // Explicit provider\n * const llm = createLLMClient({\n * provider: 'openai',\n * apiKey: 'sk-...',\n * model: 'gpt-4o-mini'\n * })\n * ```\n */\nexport function createLLMClient(config?: LLMConfig): LLMClient {\n const provider = config?.provider ?? detectProvider();\n\n if (!provider) {\n throw new LLMError(\n 'No LLM provider configured. Set SDKROUTER_API_KEY, OPENAI_API_KEY, or ANTHROPIC_API_KEY environment variable.'\n );\n }\n\n const apiKey = config?.apiKey ?? getApiKey(provider);\n\n if (!apiKey) {\n const envVar =\n provider === 'sdkrouter'\n ? 'SDKROUTER_API_KEY'\n : provider === 'openai'\n ? 'OPENAI_API_KEY'\n : 'ANTHROPIC_API_KEY';\n throw new LLMError(\n `No API key found for ${provider}. Set ${envVar} environment variable.`\n );\n }\n\n const model = config?.model ?? getDefaultModel(provider);\n\n const fullConfig: LLMConfig = {\n ...config,\n provider,\n apiKey,\n model,\n };\n\n if (provider === 'sdkrouter') {\n return new SDKRouterProvider(fullConfig);\n }\n\n if (provider === 'openai') {\n return new OpenAIProvider(fullConfig);\n }\n\n if (provider === 'anthropic') {\n return new AnthropicProvider(fullConfig);\n }\n\n throw new LLMError(`Unknown provider: ${provider}`);\n}\n\n/**\n * Create SDKRouter client (recommended)\n */\nexport function createSDKRouterClient(config?: Omit<LLMConfig, 'provider'>): LLMClient {\n return createLLMClient({ ...config, provider: 'sdkrouter' });\n}\n\n/**\n * Create OpenAI client\n */\nexport function createOpenAIClient(config?: Omit<LLMConfig, 'provider'>): LLMClient {\n return createLLMClient({ ...config, provider: 'openai' });\n}\n\n/**\n * Create Anthropic client\n */\nexport function createAnthropicClient(config?: Omit<LLMConfig, 'provider'>): LLMClient {\n return createLLMClient({ ...config, provider: 'anthropic' });\n}\n\n/**\n * Check if LLM is configured\n */\nexport function isLLMConfigured(): boolean {\n return detectProvider() !== undefined;\n}\n\n/**\n * Get configured provider\n */\nexport function getConfiguredProvider(): LLMProvider | undefined {\n return detectProvider();\n}\n","/**\n * Translator types\n */\n\nimport type { LLMRequestOptions } from '../types';\n\n/**\n * Language code\n */\nexport type LanguageCode =\n | 'en'\n | 'ru'\n | 'ko'\n | 'ja'\n | 'zh'\n | 'de'\n | 'fr'\n | 'es'\n | 'it'\n | 'pt'\n | 'pt-BR'\n | 'ar'\n | 'nl'\n | 'tr'\n | 'pl'\n | 'sv'\n | 'no'\n | 'da'\n | 'uk'\n | 'hi'\n | string;\n\n/**\n * Language names map\n */\nexport const LANGUAGE_NAMES: Record<string, string> = {\n en: 'English',\n ru: 'Russian',\n ko: 'Korean',\n ja: 'Japanese',\n zh: 'Chinese',\n de: 'German',\n fr: 'French',\n es: 'Spanish',\n it: 'Italian',\n pt: 'Portuguese',\n 'pt-BR': 'Brazilian Portuguese',\n ar: 'Arabic',\n nl: 'Dutch',\n tr: 'Turkish',\n pl: 'Polish',\n sv: 'Swedish',\n no: 'Norwegian',\n da: 'Danish',\n uk: 'Ukrainian',\n hi: 'Hindi',\n};\n\n/**\n * Translation options\n */\nexport interface TranslateOptions extends LLMRequestOptions {\n /** Source language (default: 'en') */\n sourceLanguage?: LanguageCode;\n /** Max retries on validation failure */\n maxRetries?: number;\n /** Preserve placeholders like {name}, {{var}} */\n preservePlaceholders?: boolean;\n}\n\n/**\n * Translation result\n */\nexport interface TranslateResult<T> {\n /** Translated data */\n data: T;\n /** Whether translation is valid (keys preserved) */\n valid: boolean;\n /** Validation errors if any */\n errors: string[];\n /** Number of retries used */\n retries: number;\n /** Source language */\n sourceLanguage: string;\n /** Target language */\n targetLanguage: string;\n}\n\n/**\n * Batch translation item\n */\nexport interface BatchTranslateItem<T> {\n /** Data to translate */\n data: T;\n /** Target language */\n targetLanguage: LanguageCode;\n /** Options override */\n options?: TranslateOptions;\n}\n\n/**\n * Cache stats\n */\nexport interface CacheStats {\n memorySize: number;\n hits: number;\n misses: number;\n languagePairs: Array<{\n pair: string;\n translations: number;\n }>;\n}\n","/**\n * Translation prompts\n */\n\nimport { LANGUAGE_NAMES } from './types';\n\n/**\n * Get language name from code\n */\nexport function getLanguageName(code: string): string {\n return LANGUAGE_NAMES[code] ?? code;\n}\n\n/**\n * Build JSON translation prompt\n */\nexport function buildJsonTranslationPrompt(\n json: string,\n sourceLanguage: string,\n targetLanguage: string\n): string {\n const sourceName = getLanguageName(sourceLanguage);\n const targetName = getLanguageName(targetLanguage);\n\n return `Translate all string VALUES in this JSON from ${sourceName} to ${targetName}.\n\nRules:\n- Translate ALL string values to ${targetName}\n- Keep JSON keys unchanged (English)\n- Skip: URLs, emails, numbers, \"SKIP\"\n- Keep placeholders: {name}, {{var}}, %s\n\n${json}\n\nReturn ONLY the JSON with all values translated to ${targetName}:`;\n}\n\n/**\n * Build text translation prompt\n */\nexport function buildTextTranslationPrompt(\n text: string,\n sourceLanguage: string,\n targetLanguage: string\n): string {\n const sourceName = getLanguageName(sourceLanguage);\n const targetName = getLanguageName(targetLanguage);\n\n return `Translate from ${sourceName} to ${targetName}.\n\nRULES:\n1. Translate ONLY the text provided\n2. Preserve formatting, numbers, URLs\n3. Keep placeholders like {name}, {{var}} unchanged\n4. Return ONLY the translation, no explanations\n\nText: ${text}\n\nTranslation:`;\n}\n\n/**\n * Build retry prompt with errors\n */\nexport function buildRetryPrompt(\n originalJson: string,\n wrongJson: string,\n errors: string[],\n targetLanguage: string\n): string {\n const targetName = getLanguageName(targetLanguage);\n\n return `Your previous translation had errors. Fix them.\n\nERRORS FOUND:\n${errors.map((e) => `- ${e}`).join('\\n')}\n\nORIGINAL JSON:\n${originalJson}\n\nYOUR WRONG TRANSLATION:\n${wrongJson}\n\nFIX THE ERRORS. Remember:\n- JSON keys must stay in English\n- Only translate string values\n- Preserve all placeholders\n\nReturn ONLY the corrected JSON translated to ${targetName}:`;\n}\n","/**\n * Translation Cache Manager\n *\n * Two-level caching: memory + localStorage/file\n * Organized by language pairs for efficient lookup\n */\n\nimport crypto from 'crypto';\n\nexport interface CacheStats {\n memorySize: number;\n hits: number;\n misses: number;\n languagePairs: Array<{\n pair: string;\n translations: number;\n }>;\n}\n\n/**\n * Translation cache with memory + persistent storage\n */\nexport class TranslationCache {\n private memoryCache = new Map<string, string>();\n private cacheOrder: string[] = [];\n private hits = 0;\n private misses = 0;\n\n constructor(\n private maxMemorySize: number = 1000,\n private storage?: Storage // localStorage in browser, undefined in Node\n ) {}\n\n /**\n * Generate hash for text\n */\n private getTextHash(text: string): string {\n return crypto.createHash('md5').update(text).digest('hex');\n }\n\n /**\n * Get storage key for language pair\n */\n private getStorageKey(sourceLang: string, targetLang: string): string {\n return `translator:${sourceLang}-${targetLang}`;\n }\n\n /**\n * Load from persistent storage\n */\n private loadFromStorage(sourceLang: string, targetLang: string): Record<string, string> {\n if (!this.storage) return {};\n\n try {\n const key = this.getStorageKey(sourceLang, targetLang);\n const data = this.storage.getItem(key);\n return data ? JSON.parse(data) : {};\n } catch {\n return {};\n }\n }\n\n /**\n * Save to persistent storage\n */\n private saveToStorage(\n sourceLang: string,\n targetLang: string,\n cache: Record<string, string>\n ): void {\n if (!this.storage) return;\n\n try {\n const key = this.getStorageKey(sourceLang, targetLang);\n this.storage.setItem(key, JSON.stringify(cache));\n } catch {\n // Storage full or unavailable\n }\n }\n\n /**\n * Evict oldest entries if memory is full\n */\n private evictIfNeeded(): void {\n while (this.memoryCache.size >= this.maxMemorySize && this.cacheOrder.length > 0) {\n const oldestKey = this.cacheOrder.shift()!;\n this.memoryCache.delete(oldestKey);\n }\n }\n\n /**\n * Get translation from cache\n */\n get(text: string, sourceLang: string, targetLang: string): string | undefined {\n const textHash = this.getTextHash(text);\n const cacheKey = `${sourceLang}-${targetLang}:${textHash}`;\n\n // Check memory cache first\n if (this.memoryCache.has(cacheKey)) {\n this.hits++;\n return this.memoryCache.get(cacheKey);\n }\n\n // Check persistent storage\n const fileCache = this.loadFromStorage(sourceLang, targetLang);\n if (textHash in fileCache) {\n const translation = fileCache[textHash];\n // Store in memory cache\n this.evictIfNeeded();\n this.memoryCache.set(cacheKey, translation);\n this.cacheOrder.push(cacheKey);\n this.hits++;\n return translation;\n }\n\n this.misses++;\n return undefined;\n }\n\n /**\n * Store translation in cache\n */\n set(text: string, sourceLang: string, targetLang: string, translation: string): void {\n const textHash = this.getTextHash(text);\n const cacheKey = `${sourceLang}-${targetLang}:${textHash}`;\n\n // Store in memory cache\n this.evictIfNeeded();\n this.memoryCache.set(cacheKey, translation);\n if (!this.cacheOrder.includes(cacheKey)) {\n this.cacheOrder.push(cacheKey);\n }\n\n // Store in persistent storage\n const fileCache = this.loadFromStorage(sourceLang, targetLang);\n fileCache[textHash] = translation;\n this.saveToStorage(sourceLang, targetLang, fileCache);\n }\n\n /**\n * Get multiple translations at once\n */\n getMany(\n texts: string[],\n sourceLang: string,\n targetLang: string\n ): { cached: Map<string, string>; uncached: string[] } {\n const cached = new Map<string, string>();\n const uncached: string[] = [];\n\n for (const text of texts) {\n const translation = this.get(text, sourceLang, targetLang);\n if (translation !== undefined) {\n cached.set(text, translation);\n } else {\n uncached.push(text);\n }\n }\n\n return { cached, uncached };\n }\n\n /**\n * Store multiple translations at once\n */\n setMany(\n translations: Map<string, string>,\n sourceLang: string,\n targetLang: string\n ): void {\n for (const [text, translation] of translations) {\n this.set(text, sourceLang, targetLang, translation);\n }\n }\n\n /**\n * Clear cache\n */\n clear(sourceLang?: string, targetLang?: string): void {\n if (sourceLang && targetLang) {\n // Clear specific language pair\n const prefix = `${sourceLang}-${targetLang}:`;\n for (const key of [...this.memoryCache.keys()]) {\n if (key.startsWith(prefix)) {\n this.memoryCache.delete(key);\n const idx = this.cacheOrder.indexOf(key);\n if (idx !== -1) this.cacheOrder.splice(idx, 1);\n }\n }\n\n if (this.storage) {\n this.storage.removeItem(this.getStorageKey(sourceLang, targetLang));\n }\n } else {\n // Clear all\n this.memoryCache.clear();\n this.cacheOrder = [];\n this.hits = 0;\n this.misses = 0;\n }\n }\n\n /**\n * Get cache statistics\n */\n getStats(): CacheStats {\n const languagePairs: CacheStats['languagePairs'] = [];\n\n // Count by language pair from memory\n const pairCounts = new Map<string, number>();\n for (const key of this.memoryCache.keys()) {\n const pair = key.split(':')[0];\n pairCounts.set(pair, (pairCounts.get(pair) || 0) + 1);\n }\n\n for (const [pair, count] of pairCounts) {\n languagePairs.push({ pair, translations: count });\n }\n\n return {\n memorySize: this.memoryCache.size,\n hits: this.hits,\n misses: this.misses,\n languagePairs,\n };\n }\n}\n\n/**\n * Create translation cache\n */\nexport function createCache(\n maxMemorySize?: number,\n storage?: Storage\n): TranslationCache {\n return new TranslationCache(maxMemorySize, storage);\n}\n","/**\n * JSON Translator using LLM\n *\n * Smart text-level caching for efficiency:\n * 1. Extract all translatable strings from JSON\n * 2. Check cache for each string\n * 3. Send only uncached strings to LLM\n * 4. Cache new translations\n * 5. Apply all translations to original structure\n */\n\nimport type { LLMClient } from '../types';\nimport { extractJson } from '../utils/json';\nimport type { TranslateOptions, TranslateResult, LanguageCode } from './types';\nimport { buildJsonTranslationPrompt } from './prompts';\nimport { isTechnicalContent, detectScript } from './text-utils';\nimport { TranslationCache, createCache } from './cache';\n\n/** Default model for translation - gpt-4o-mini is reliable and cost-effective */\nconst DEFAULT_TRANSLATION_MODEL = 'openai/gpt-4o-mini';\n\n/**\n * JSON Translator class with smart caching\n */\nexport class JsonTranslator {\n private cache: TranslationCache;\n private defaultModel: string;\n\n constructor(\n private client: LLMClient,\n cache?: TranslationCache,\n defaultModel?: string\n ) {\n this.cache = cache ?? createCache();\n this.defaultModel = defaultModel ?? DEFAULT_TRANSLATION_MODEL;\n }\n\n /**\n * Detect language from text\n */\n detectLanguage(text: string): LanguageCode {\n const script = detectScript(text);\n switch (script) {\n case 'cjk':\n // Could be zh, ja, ko - default to zh\n return 'zh';\n case 'cyrillic':\n return 'ru';\n case 'arabic':\n return 'ar';\n default:\n return 'en';\n }\n }\n\n /**\n * Check if text needs translation\n */\n needsTranslation(\n text: string,\n sourceLang: string,\n targetLang: string\n ): boolean {\n if (!text || !text.trim()) return false;\n if (isTechnicalContent(text)) return false;\n if (sourceLang === targetLang) return false;\n return true;\n }\n\n /**\n * Translate single text\n */\n async translateText(\n text: string,\n targetLanguage: LanguageCode,\n options?: TranslateOptions\n ): Promise<string> {\n if (!text || !text.trim()) return text;\n\n const sourceLang = options?.sourceLanguage ?? 'auto';\n const actualSource = sourceLang === 'auto' ? this.detectLanguage(text) : sourceLang;\n\n if (!this.needsTranslation(text, actualSource, targetLanguage)) {\n return text;\n }\n\n // Check cache\n const cached = this.cache.get(text, actualSource, targetLanguage);\n if (cached) return cached;\n\n // Call LLM\n const response = await this.client.chat(\n `Translate this text to ${targetLanguage}. Return ONLY the translation:\\n\\n${text}`,\n {\n ...options,\n model: options?.model ?? this.defaultModel,\n temperature: 0,\n }\n );\n\n const translated = response.content.trim();\n this.cache.set(text, actualSource, targetLanguage, translated);\n\n return translated;\n }\n\n /**\n * Translate JSON object with smart text-level caching\n *\n * @example\n * ```ts\n * const translator = new JsonTranslator(llm)\n * const result = await translator.translate(\n * { title: 'Hello', items: ['World', 'Earth'] },\n * 'ru'\n * )\n * // { data: { title: 'Привет', items: ['Мир', 'Земля'] }, valid: true, ... }\n * ```\n */\n async translate<T extends Record<string, unknown>>(\n data: T,\n targetLanguage: LanguageCode,\n options?: TranslateOptions\n ): Promise<TranslateResult<T>> {\n const sourceLang = options?.sourceLanguage ?? 'auto';\n\n // Extract all translatable texts\n const translatableTexts = this.extractTranslatableTexts(data, sourceLang, targetLanguage);\n\n if (translatableTexts.size === 0) {\n return {\n data,\n valid: true,\n errors: [],\n retries: 0,\n sourceLanguage: sourceLang,\n targetLanguage,\n };\n }\n\n // Detect source language from first text if auto\n let actualSource = sourceLang;\n if (sourceLang === 'auto') {\n const firstText = [...translatableTexts][0];\n actualSource = this.detectLanguage(firstText);\n }\n\n // Check cache for each text\n const { cached, uncached } = this.cache.getMany(\n [...translatableTexts],\n actualSource,\n targetLanguage\n );\n\n // If everything cached, apply and return\n if (uncached.length === 0) {\n return {\n data: this.applyTranslations(data, cached),\n valid: true,\n errors: [],\n retries: 0,\n sourceLanguage: actualSource,\n targetLanguage,\n };\n }\n\n // Create partial JSON with only uncached texts\n const partialJson = this.createPartialJson(data, new Set(uncached));\n const jsonStr = JSON.stringify(partialJson, null, 2);\n\n try {\n // Build prompt and call LLM\n const prompt = buildJsonTranslationPrompt(jsonStr, actualSource, targetLanguage);\n\n const response = await this.client.chat(prompt, {\n ...options,\n model: options?.model ?? this.defaultModel,\n temperature: 0,\n });\n\n // Parse response\n const translatedPartial = extractJson<Record<string, unknown>>(response.content);\n\n // Extract translations by comparison\n const newTranslations = this.extractTranslationsByComparison(\n partialJson,\n translatedPartial,\n uncached\n );\n\n // Cache new translations\n this.cache.setMany(newTranslations, actualSource, targetLanguage);\n\n // Combine all translations\n const allTranslations = new Map([...cached, ...newTranslations]);\n\n return {\n data: this.applyTranslations(data, allTranslations),\n valid: true,\n errors: [],\n retries: 0,\n sourceLanguage: actualSource,\n targetLanguage,\n };\n } catch (error) {\n // On error, return what we have from cache\n const errorMsg = error instanceof Error ? error.message : String(error);\n console.error('Translation failed:', errorMsg);\n\n return {\n data: cached.size > 0 ? this.applyTranslations(data, cached) : data,\n valid: false,\n errors: [errorMsg],\n retries: 0,\n sourceLanguage: actualSource,\n targetLanguage,\n };\n }\n }\n\n /**\n * Translate to multiple languages in parallel\n */\n async translateToMany<T extends Record<string, unknown>>(\n data: T,\n targetLanguages: LanguageCode[],\n options?: TranslateOptions\n ): Promise<Map<LanguageCode, TranslateResult<T>>> {\n const results = new Map<LanguageCode, TranslateResult<T>>();\n\n // Run translations in parallel\n const promises = targetLanguages.map(async (lang) => {\n const result = await this.translate(data, lang, options);\n return { lang, result };\n });\n\n const settled = await Promise.all(promises);\n for (const { lang, result } of settled) {\n results.set(lang, result);\n }\n\n return results;\n }\n\n /**\n * Extract all translatable texts from object\n */\n private extractTranslatableTexts(\n obj: unknown,\n sourceLang: string,\n targetLang: string\n ): Set<string> {\n const texts = new Set<string>();\n\n const extract = (item: unknown): void => {\n if (typeof item === 'string') {\n if (this.needsTranslation(item, sourceLang, targetLang)) {\n texts.add(item);\n }\n } else if (Array.isArray(item)) {\n for (const i of item) extract(i);\n } else if (item !== null && typeof item === 'object') {\n for (const v of Object.values(item)) extract(v);\n }\n };\n\n extract(obj);\n return texts;\n }\n\n /**\n * Apply translations to object\n */\n private applyTranslations<T>(obj: T, translations: Map<string, string>): T {\n const apply = (item: unknown): unknown => {\n if (typeof item === 'string') {\n return translations.get(item) ?? item;\n } else if (Array.isArray(item)) {\n return item.map(apply);\n } else if (item !== null && typeof item === 'object') {\n const result: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(item)) {\n result[k] = apply(v);\n }\n return result;\n }\n return item;\n };\n\n return apply(obj) as T;\n }\n\n /**\n * Create partial JSON with only texts that need translation\n */\n private createPartialJson(data: unknown, textsToInclude: Set<string>): unknown {\n const filter = (obj: unknown): unknown => {\n if (typeof obj === 'string') {\n return textsToInclude.has(obj) ? obj : 'SKIP';\n } else if (Array.isArray(obj)) {\n return obj.map(filter).filter((i) => this.hasTranslatable(i, textsToInclude));\n } else if (obj !== null && typeof obj === 'object') {\n const result: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(obj)) {\n const filtered = filter(v);\n if (this.hasTranslatable(filtered, textsToInclude)) {\n result[k] = filtered;\n }\n }\n return result;\n }\n return obj;\n };\n\n return filter(data);\n }\n\n /**\n * Check if object contains translatable text\n */\n private hasTranslatable(obj: unknown, textsSet: Set<string>): boolean {\n if (typeof obj === 'string') return textsSet.has(obj);\n if (Array.isArray(obj)) return obj.some((i) => this.hasTranslatable(i, textsSet));\n if (obj !== null && typeof obj === 'object') {\n return Object.values(obj).some((v) => this.hasTranslatable(v, textsSet));\n }\n return false;\n }\n\n /**\n * Extract translations by comparing original and translated JSON\n */\n private extractTranslationsByComparison(\n original: unknown,\n translated: unknown,\n uncachedTexts: string[]\n ): Map<string, string> {\n const translations = new Map<string, string>();\n const uncachedSet = new Set(uncachedTexts);\n\n const compare = (orig: unknown, trans: unknown): void => {\n if (typeof orig === 'string' && typeof trans === 'string') {\n // Save translation if original was in uncached list and translation is valid\n if (uncachedSet.has(orig) && trans !== 'SKIP' && trans.trim()) {\n translations.set(orig, trans);\n }\n } else if (Array.isArray(orig) && Array.isArray(trans)) {\n for (let i = 0; i < Math.min(orig.length, trans.length); i++) {\n compare(orig[i], trans[i]);\n }\n } else if (\n orig !== null &&\n typeof orig === 'object' &&\n trans !== null &&\n typeof trans === 'object'\n ) {\n for (const key of Object.keys(orig as Record<string, unknown>)) {\n if (key in (trans as Record<string, unknown>)) {\n compare(\n (orig as Record<string, unknown>)[key],\n (trans as Record<string, unknown>)[key]\n );\n }\n }\n }\n };\n\n compare(original, translated);\n return translations;\n }\n\n /**\n * Get translation statistics\n */\n getStats() {\n return this.cache.getStats();\n }\n\n /**\n * Clear translation cache\n */\n clearCache(sourceLang?: string, targetLang?: string) {\n this.cache.clear(sourceLang, targetLang);\n }\n}\n\n/**\n * Translator options\n */\nexport interface TranslatorConfig {\n cache?: TranslationCache;\n /** Model for translation (default: openai/gpt-4o-mini) */\n model?: string;\n}\n\n/**\n * Create JSON translator\n */\nexport function createTranslator(\n client: LLMClient,\n configOrCache?: TranslationCache | TranslatorConfig\n): JsonTranslator {\n // Support both old and new API\n if (configOrCache instanceof TranslationCache) {\n return new JsonTranslator(client, configOrCache);\n }\n return new JsonTranslator(client, configOrCache?.cache, configOrCache?.model);\n}\n","/**\n * Schema utilities for structured LLM outputs\n *\n * Provides helpers for working with Zod schemas and LLM structured outputs.\n * Zod is optional - only used if installed.\n */\n\nimport type { LLMClient, LLMRequestOptions, LLMResponse } from '../types';\nimport { extractJson } from './json';\n\n/**\n * Minimal Zod-like schema interface\n * Compatible with Zod but doesn't require it\n */\nexport interface ZodLikeSchema<T = unknown> {\n parse(data: unknown): T;\n safeParse(data: unknown): { success: true; data: T } | { success: false; error: unknown };\n}\n\n/**\n * JSON Schema representation for LLM prompts\n */\nexport interface JsonSchemaDefinition {\n type: string;\n properties?: Record<string, JsonSchemaDefinition>;\n items?: JsonSchemaDefinition;\n required?: string[];\n description?: string;\n enum?: unknown[];\n}\n\n/**\n * Generate a simple JSON schema string from a TypeScript type example\n *\n * @example\n * ```ts\n * const schema = generateSchemaFromExample({ name: '', age: 0, active: true })\n * // { type: \"object\", properties: { name: { type: \"string\" }, ... } }\n * ```\n */\nexport function generateSchemaFromExample(example: unknown): JsonSchemaDefinition {\n if (example === null) {\n return { type: 'null' };\n }\n\n if (Array.isArray(example)) {\n const itemSchema =\n example.length > 0 ? generateSchemaFromExample(example[0]) : { type: 'string' };\n return { type: 'array', items: itemSchema };\n }\n\n if (typeof example === 'object') {\n const properties: Record<string, JsonSchemaDefinition> = {};\n const required: string[] = [];\n\n for (const [key, value] of Object.entries(example)) {\n properties[key] = generateSchemaFromExample(value);\n required.push(key);\n }\n\n return { type: 'object', properties, required };\n }\n\n return { type: typeof example };\n}\n\n/**\n * Convert JSON schema to a prompt-friendly string\n */\nexport function schemaToPromptString(schema: JsonSchemaDefinition): string {\n return JSON.stringify(schema, null, 2);\n}\n\n/**\n * Get structured output from LLM with validation\n *\n * @example\n * ```ts\n * import { z } from 'zod'\n *\n * const UserSchema = z.object({\n * name: z.string(),\n * age: z.number(),\n * })\n *\n * const user = await getStructuredOutput(llm, 'Extract user info from: John is 25', UserSchema)\n * // { name: 'John', age: 25 }\n * ```\n */\nexport async function getStructuredOutput<T>(\n client: LLMClient,\n prompt: string,\n schema: ZodLikeSchema<T>,\n options?: LLMRequestOptions\n): Promise<{ data: T; response: LLMResponse } | { error: string; raw: unknown }> {\n const response = await client.chat(prompt, {\n ...options,\n temperature: 0,\n system: options?.system ?? 'Return ONLY valid JSON matching the requested structure.',\n });\n\n try {\n const parsed = extractJson(response.content);\n const result = schema.safeParse(parsed);\n\n if (result.success) {\n return { data: result.data, response };\n }\n\n return {\n error: 'Schema validation failed',\n raw: parsed,\n };\n } catch (error) {\n return {\n error: error instanceof Error ? error.message : 'Failed to parse JSON',\n raw: response.content,\n };\n }\n}\n\n/**\n * Get structured output with retry on validation failure\n */\nexport async function getStructuredOutputWithRetry<T>(\n client: LLMClient,\n prompt: string,\n schema: ZodLikeSchema<T>,\n options?: LLMRequestOptions & { maxRetries?: number }\n): Promise<{ data: T; retries: number } | { error: string; raw: unknown; retries: number }> {\n const maxRetries = options?.maxRetries ?? 2;\n let retries = 0;\n let lastError = '';\n let lastRaw: unknown;\n\n while (retries <= maxRetries) {\n const result = await getStructuredOutput(client, prompt, schema, options);\n\n if ('data' in result) {\n return { data: result.data, retries };\n }\n\n lastError = result.error;\n lastRaw = result.raw;\n retries++;\n\n if (retries <= maxRetries) {\n console.warn(`Structured output validation failed (attempt ${retries}/${maxRetries + 1})`);\n }\n }\n\n return { error: lastError, raw: lastRaw, retries };\n}\n"]}
@@ -0,0 +1,164 @@
1
+ import { L as LLMConfig, a as LLMClient, b as LLMProvider, c as LLMRequestOptions, d as LLMResponse } from './types-D6lazgm1.cjs';
2
+ export { A as AnthropicModel, f as LLMMessage, e as LLMModel, O as OpenAIModel } from './types-D6lazgm1.cjs';
3
+ export { M as Model, d as ModelCapability, e as ModelCategory, f as ModelOptions, a as ModelPresets, c as ModelTier, S as SDKROUTER_BASE_URL, b as buildModelAlias } from './sdkrouter-hlQlVd0v.cjs';
4
+ export { C as CacheStats, J as JsonTranslator, L as LANGUAGE_NAMES, h as LanguageCode, f as TranslateOptions, g as TranslateResult, T as TranslationCache, V as ValidationResult, a as createCache, c as createTranslator, d as detectScript, e as extractPlaceholders, i as isTechnicalContent, b as validateJsonKeys, v as validateTranslation, b as validateTranslationKeys } from './text-utils-VXWN-8Oq.cjs';
5
+
6
+ /**
7
+ * LLM Client factory
8
+ */
9
+
10
+ declare class LLMError extends Error {
11
+ constructor(message: string);
12
+ }
13
+ /**
14
+ * Create LLM client with auto-detection
15
+ *
16
+ * Priority: SDKROUTER_API_KEY > OPENAI_API_KEY > ANTHROPIC_API_KEY
17
+ *
18
+ * @example
19
+ * ```ts
20
+ * // Auto-detect from env (sdkrouter preferred)
21
+ * const llm = createLLMClient()
22
+ *
23
+ * // With model alias
24
+ * const llm = createLLMClient({ model: '@smart+code' })
25
+ *
26
+ * // Explicit provider
27
+ * const llm = createLLMClient({
28
+ * provider: 'openai',
29
+ * apiKey: 'sk-...',
30
+ * model: 'gpt-4o-mini'
31
+ * })
32
+ * ```
33
+ */
34
+ declare function createLLMClient(config?: LLMConfig): LLMClient;
35
+ /**
36
+ * Create SDKRouter client (recommended)
37
+ */
38
+ declare function createSDKRouterClient(config?: Omit<LLMConfig, 'provider'>): LLMClient;
39
+ /**
40
+ * Create OpenAI client
41
+ */
42
+ declare function createOpenAIClient(config?: Omit<LLMConfig, 'provider'>): LLMClient;
43
+ /**
44
+ * Create Anthropic client
45
+ */
46
+ declare function createAnthropicClient(config?: Omit<LLMConfig, 'provider'>): LLMClient;
47
+ /**
48
+ * Check if LLM is configured
49
+ */
50
+ declare function isLLMConfigured(): boolean;
51
+ /**
52
+ * Get configured provider
53
+ */
54
+ declare function getConfiguredProvider(): LLMProvider | undefined;
55
+
56
+ /**
57
+ * JSON parsing utilities
58
+ */
59
+ /**
60
+ * Extract JSON from LLM response (handles markdown code blocks)
61
+ */
62
+ declare function extractJson<T = unknown>(text: string): T;
63
+
64
+ /**
65
+ * Environment utilities
66
+ */
67
+
68
+ /**
69
+ * Get API key from environment
70
+ */
71
+ declare function getApiKey(provider?: LLMProvider): string | undefined;
72
+ /**
73
+ * Detect provider from environment
74
+ */
75
+ declare function detectProvider(): LLMProvider | undefined;
76
+ /**
77
+ * Get default model for provider
78
+ */
79
+ declare function getDefaultModel(provider: LLMProvider): string;
80
+
81
+ /**
82
+ * Schema utilities for structured LLM outputs
83
+ *
84
+ * Provides helpers for working with Zod schemas and LLM structured outputs.
85
+ * Zod is optional - only used if installed.
86
+ */
87
+
88
+ /**
89
+ * Minimal Zod-like schema interface
90
+ * Compatible with Zod but doesn't require it
91
+ */
92
+ interface ZodLikeSchema<T = unknown> {
93
+ parse(data: unknown): T;
94
+ safeParse(data: unknown): {
95
+ success: true;
96
+ data: T;
97
+ } | {
98
+ success: false;
99
+ error: unknown;
100
+ };
101
+ }
102
+ /**
103
+ * JSON Schema representation for LLM prompts
104
+ */
105
+ interface JsonSchemaDefinition {
106
+ type: string;
107
+ properties?: Record<string, JsonSchemaDefinition>;
108
+ items?: JsonSchemaDefinition;
109
+ required?: string[];
110
+ description?: string;
111
+ enum?: unknown[];
112
+ }
113
+ /**
114
+ * Generate a simple JSON schema string from a TypeScript type example
115
+ *
116
+ * @example
117
+ * ```ts
118
+ * const schema = generateSchemaFromExample({ name: '', age: 0, active: true })
119
+ * // { type: "object", properties: { name: { type: "string" }, ... } }
120
+ * ```
121
+ */
122
+ declare function generateSchemaFromExample(example: unknown): JsonSchemaDefinition;
123
+ /**
124
+ * Convert JSON schema to a prompt-friendly string
125
+ */
126
+ declare function schemaToPromptString(schema: JsonSchemaDefinition): string;
127
+ /**
128
+ * Get structured output from LLM with validation
129
+ *
130
+ * @example
131
+ * ```ts
132
+ * import { z } from 'zod'
133
+ *
134
+ * const UserSchema = z.object({
135
+ * name: z.string(),
136
+ * age: z.number(),
137
+ * })
138
+ *
139
+ * const user = await getStructuredOutput(llm, 'Extract user info from: John is 25', UserSchema)
140
+ * // { name: 'John', age: 25 }
141
+ * ```
142
+ */
143
+ declare function getStructuredOutput<T>(client: LLMClient, prompt: string, schema: ZodLikeSchema<T>, options?: LLMRequestOptions): Promise<{
144
+ data: T;
145
+ response: LLMResponse;
146
+ } | {
147
+ error: string;
148
+ raw: unknown;
149
+ }>;
150
+ /**
151
+ * Get structured output with retry on validation failure
152
+ */
153
+ declare function getStructuredOutputWithRetry<T>(client: LLMClient, prompt: string, schema: ZodLikeSchema<T>, options?: LLMRequestOptions & {
154
+ maxRetries?: number;
155
+ }): Promise<{
156
+ data: T;
157
+ retries: number;
158
+ } | {
159
+ error: string;
160
+ raw: unknown;
161
+ retries: number;
162
+ }>;
163
+
164
+ export { type JsonSchemaDefinition, LLMClient, LLMConfig, LLMError, LLMProvider, LLMRequestOptions, LLMResponse, type ZodLikeSchema, createAnthropicClient, createLLMClient, createOpenAIClient, createSDKRouterClient, detectProvider, extractJson, generateSchemaFromExample, getApiKey, getConfiguredProvider, getDefaultModel, getStructuredOutput, getStructuredOutputWithRetry, isLLMConfigured, schemaToPromptString };
@@ -0,0 +1,164 @@
1
+ import { L as LLMConfig, a as LLMClient, b as LLMProvider, c as LLMRequestOptions, d as LLMResponse } from './types-D6lazgm1.js';
2
+ export { A as AnthropicModel, f as LLMMessage, e as LLMModel, O as OpenAIModel } from './types-D6lazgm1.js';
3
+ export { M as Model, d as ModelCapability, e as ModelCategory, f as ModelOptions, a as ModelPresets, c as ModelTier, S as SDKROUTER_BASE_URL, b as buildModelAlias } from './sdkrouter-D8GMBmTi.js';
4
+ export { C as CacheStats, J as JsonTranslator, L as LANGUAGE_NAMES, h as LanguageCode, f as TranslateOptions, g as TranslateResult, T as TranslationCache, V as ValidationResult, a as createCache, c as createTranslator, d as detectScript, e as extractPlaceholders, i as isTechnicalContent, b as validateJsonKeys, v as validateTranslation, b as validateTranslationKeys } from './text-utils-DoYqMIr6.js';
5
+
6
+ /**
7
+ * LLM Client factory
8
+ */
9
+
10
+ declare class LLMError extends Error {
11
+ constructor(message: string);
12
+ }
13
+ /**
14
+ * Create LLM client with auto-detection
15
+ *
16
+ * Priority: SDKROUTER_API_KEY > OPENAI_API_KEY > ANTHROPIC_API_KEY
17
+ *
18
+ * @example
19
+ * ```ts
20
+ * // Auto-detect from env (sdkrouter preferred)
21
+ * const llm = createLLMClient()
22
+ *
23
+ * // With model alias
24
+ * const llm = createLLMClient({ model: '@smart+code' })
25
+ *
26
+ * // Explicit provider
27
+ * const llm = createLLMClient({
28
+ * provider: 'openai',
29
+ * apiKey: 'sk-...',
30
+ * model: 'gpt-4o-mini'
31
+ * })
32
+ * ```
33
+ */
34
+ declare function createLLMClient(config?: LLMConfig): LLMClient;
35
+ /**
36
+ * Create SDKRouter client (recommended)
37
+ */
38
+ declare function createSDKRouterClient(config?: Omit<LLMConfig, 'provider'>): LLMClient;
39
+ /**
40
+ * Create OpenAI client
41
+ */
42
+ declare function createOpenAIClient(config?: Omit<LLMConfig, 'provider'>): LLMClient;
43
+ /**
44
+ * Create Anthropic client
45
+ */
46
+ declare function createAnthropicClient(config?: Omit<LLMConfig, 'provider'>): LLMClient;
47
+ /**
48
+ * Check if LLM is configured
49
+ */
50
+ declare function isLLMConfigured(): boolean;
51
+ /**
52
+ * Get configured provider
53
+ */
54
+ declare function getConfiguredProvider(): LLMProvider | undefined;
55
+
56
+ /**
57
+ * JSON parsing utilities
58
+ */
59
+ /**
60
+ * Extract JSON from LLM response (handles markdown code blocks)
61
+ */
62
+ declare function extractJson<T = unknown>(text: string): T;
63
+
64
+ /**
65
+ * Environment utilities
66
+ */
67
+
68
+ /**
69
+ * Get API key from environment
70
+ */
71
+ declare function getApiKey(provider?: LLMProvider): string | undefined;
72
+ /**
73
+ * Detect provider from environment
74
+ */
75
+ declare function detectProvider(): LLMProvider | undefined;
76
+ /**
77
+ * Get default model for provider
78
+ */
79
+ declare function getDefaultModel(provider: LLMProvider): string;
80
+
81
+ /**
82
+ * Schema utilities for structured LLM outputs
83
+ *
84
+ * Provides helpers for working with Zod schemas and LLM structured outputs.
85
+ * Zod is optional - only used if installed.
86
+ */
87
+
88
+ /**
89
+ * Minimal Zod-like schema interface
90
+ * Compatible with Zod but doesn't require it
91
+ */
92
+ interface ZodLikeSchema<T = unknown> {
93
+ parse(data: unknown): T;
94
+ safeParse(data: unknown): {
95
+ success: true;
96
+ data: T;
97
+ } | {
98
+ success: false;
99
+ error: unknown;
100
+ };
101
+ }
102
+ /**
103
+ * JSON Schema representation for LLM prompts
104
+ */
105
+ interface JsonSchemaDefinition {
106
+ type: string;
107
+ properties?: Record<string, JsonSchemaDefinition>;
108
+ items?: JsonSchemaDefinition;
109
+ required?: string[];
110
+ description?: string;
111
+ enum?: unknown[];
112
+ }
113
+ /**
114
+ * Generate a simple JSON schema string from a TypeScript type example
115
+ *
116
+ * @example
117
+ * ```ts
118
+ * const schema = generateSchemaFromExample({ name: '', age: 0, active: true })
119
+ * // { type: "object", properties: { name: { type: "string" }, ... } }
120
+ * ```
121
+ */
122
+ declare function generateSchemaFromExample(example: unknown): JsonSchemaDefinition;
123
+ /**
124
+ * Convert JSON schema to a prompt-friendly string
125
+ */
126
+ declare function schemaToPromptString(schema: JsonSchemaDefinition): string;
127
+ /**
128
+ * Get structured output from LLM with validation
129
+ *
130
+ * @example
131
+ * ```ts
132
+ * import { z } from 'zod'
133
+ *
134
+ * const UserSchema = z.object({
135
+ * name: z.string(),
136
+ * age: z.number(),
137
+ * })
138
+ *
139
+ * const user = await getStructuredOutput(llm, 'Extract user info from: John is 25', UserSchema)
140
+ * // { name: 'John', age: 25 }
141
+ * ```
142
+ */
143
+ declare function getStructuredOutput<T>(client: LLMClient, prompt: string, schema: ZodLikeSchema<T>, options?: LLMRequestOptions): Promise<{
144
+ data: T;
145
+ response: LLMResponse;
146
+ } | {
147
+ error: string;
148
+ raw: unknown;
149
+ }>;
150
+ /**
151
+ * Get structured output with retry on validation failure
152
+ */
153
+ declare function getStructuredOutputWithRetry<T>(client: LLMClient, prompt: string, schema: ZodLikeSchema<T>, options?: LLMRequestOptions & {
154
+ maxRetries?: number;
155
+ }): Promise<{
156
+ data: T;
157
+ retries: number;
158
+ } | {
159
+ error: string;
160
+ raw: unknown;
161
+ retries: number;
162
+ }>;
163
+
164
+ export { type JsonSchemaDefinition, LLMClient, LLMConfig, LLMError, LLMProvider, LLMRequestOptions, LLMResponse, type ZodLikeSchema, createAnthropicClient, createLLMClient, createOpenAIClient, createSDKRouterClient, detectProvider, extractJson, generateSchemaFromExample, getApiKey, getConfiguredProvider, getDefaultModel, getStructuredOutput, getStructuredOutputWithRetry, isLLMConfigured, schemaToPromptString };