noosphere 0.4.1 → 0.7.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.
- package/README.md +227 -19
- package/dist/index.cjs +1083 -33
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +149 -4
- package/dist/index.d.ts +149 -4
- package/dist/index.js +1077 -32
- package/dist/index.js.map +1 -1
- package/package.json +1 -2
- package/assets/logos/png/ai21.png +0 -0
- package/assets/logos/png/amazon.png +0 -0
- package/assets/logos/png/anthropic.png +0 -0
- package/assets/logos/png/baidu.png +0 -0
- package/assets/logos/png/bytedance.png +0 -0
- package/assets/logos/png/cerebras.png +0 -0
- package/assets/logos/png/cohere.png +0 -0
- package/assets/logos/png/comfyui.png +0 -0
- package/assets/logos/png/deepseek.png +0 -0
- package/assets/logos/png/fal.png +0 -0
- package/assets/logos/png/fireworks-ai.png +0 -0
- package/assets/logos/png/google.png +0 -0
- package/assets/logos/png/groq.png +0 -0
- package/assets/logos/png/huggingface.png +0 -0
- package/assets/logos/png/ibm.png +0 -0
- package/assets/logos/png/inflection.png +0 -0
- package/assets/logos/png/kokoro.png +0 -0
- package/assets/logos/png/meta.png +0 -0
- package/assets/logos/png/microsoft.png +0 -0
- package/assets/logos/png/minimax.png +0 -0
- package/assets/logos/png/mistral.png +0 -0
- package/assets/logos/png/nebius.png +0 -0
- package/assets/logos/png/novita.png +0 -0
- package/assets/logos/png/nvidia.png +0 -0
- package/assets/logos/png/ollama.png +0 -0
- package/assets/logos/png/openai.png +0 -0
- package/assets/logos/png/openrouter.png +0 -0
- package/assets/logos/png/perplexity.png +0 -0
- package/assets/logos/png/pi-ai.png +0 -0
- package/assets/logos/png/piper.png +0 -0
- package/assets/logos/png/qwen.png +0 -0
- package/assets/logos/png/replicate.png +0 -0
- package/assets/logos/png/sambanova.png +0 -0
- package/assets/logos/png/tencent.png +0 -0
- package/assets/logos/png/together.png +0 -0
- package/assets/logos/png/upstage.png +0 -0
- package/assets/logos/png/xai.png +0 -0
- package/assets/logos/png/xiaomi.png +0 -0
- package/assets/logos/png/zai.png +0 -0
- package/assets/logos/svg/amazon.svg +0 -1
- package/assets/logos/svg/anthropic.svg +0 -1
- package/assets/logos/svg/baidu.svg +0 -1
- package/assets/logos/svg/cerebras.svg +0 -1
- package/assets/logos/svg/cohere.svg +0 -1
- package/assets/logos/svg/deepseek.svg +0 -1
- package/assets/logos/svg/fireworks-ai.svg +0 -9
- package/assets/logos/svg/google.svg +0 -1
- package/assets/logos/svg/groq.svg +0 -1
- package/assets/logos/svg/huggingface.svg +0 -67
- package/assets/logos/svg/meta.svg +0 -1
- package/assets/logos/svg/microsoft.svg +0 -1
- package/assets/logos/svg/mistral.svg +0 -1
- package/assets/logos/svg/nebius.svg +0 -4
- package/assets/logos/svg/novita.svg +0 -11
- package/assets/logos/svg/nvidia.svg +0 -1
- package/assets/logos/svg/ollama.svg +0 -7
- package/assets/logos/svg/openai.svg +0 -1
- package/assets/logos/svg/openrouter.svg +0 -21
- package/assets/logos/svg/perplexity.svg +0 -24
- package/assets/logos/svg/qwen.svg +0 -1
- package/assets/logos/svg/replicate.svg +0 -12
- package/assets/logos/svg/together.svg +0 -1
- package/assets/logos/svg/xai.svg +0 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/errors.ts","../src/config.ts","../src/logos.ts","../src/registry.ts","../src/tracking.ts","../src/providers/pi-ai.ts","../src/providers/fal.ts","../src/providers/comfyui.ts","../src/providers/local-tts.ts","../src/providers/huggingface.ts","../src/noosphere.ts"],"sourcesContent":["// src/index.ts\nexport { Noosphere } from './noosphere.js';\nexport { NoosphereError } from './errors.js';\nexport type {\n NoosphereConfig,\n NoosphereResult,\n NoosphereStream,\n StreamEvent,\n Modality,\n ModelInfo,\n ProviderInfo,\n ChatOptions,\n ImageOptions,\n VideoOptions,\n SpeakOptions,\n BaseOptions,\n UsageEvent,\n UsageQueryOptions,\n UsageSummary,\n SyncResult,\n NoosphereErrorCode,\n LocalServiceConfig,\n ProviderLogo,\n} from './types.js';\nexport type { NoosphereProvider } from './providers/base.js';\nexport { PROVIDER_LOGOS, getProviderLogo, getAllProviderLogos, PROVIDER_IDS } from './logos.js';\n","import type { Modality, NoosphereErrorCode } from './types.js';\n\nconst RETRYABLE_CODES: Set<NoosphereErrorCode> = new Set([\n 'PROVIDER_UNAVAILABLE',\n 'RATE_LIMITED',\n 'TIMEOUT',\n 'GENERATION_FAILED',\n]);\n\nexport class NoosphereError extends Error {\n readonly code: NoosphereErrorCode;\n readonly provider: string;\n readonly modality: Modality;\n readonly model?: string;\n override readonly cause?: Error;\n\n constructor(\n message: string,\n options: {\n code: NoosphereErrorCode;\n provider: string;\n modality: Modality;\n model?: string;\n cause?: Error;\n },\n ) {\n super(message);\n this.name = 'NoosphereError';\n this.code = options.code;\n this.provider = options.provider;\n this.modality = options.modality;\n this.model = options.model;\n this.cause = options.cause;\n }\n\n isRetryable(): boolean {\n return RETRYABLE_CODES.has(this.code);\n }\n}\n","import type { NoosphereConfig, NoosphereErrorCode, LocalServiceConfig } from './types.js';\n\n// Load .env / .env.vault (dotenvx supports both plain and encrypted)\n// Falls back silently if dotenvx isn't installed — env vars from shell still work.\nlet _envLoaded = false;\nfunction loadEnv(): void {\n if (_envLoaded) return;\n _envLoaded = true;\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const dotenvx = require('@dotenvx/dotenvx');\n dotenvx.config({ quiet: true });\n } catch {\n // dotenvx not available — no-op\n }\n}\n\nconst ENV_KEY_MAP: Record<string, string> = {\n openai: 'OPENAI_API_KEY',\n anthropic: 'ANTHROPIC_API_KEY',\n google: 'GEMINI_API_KEY',\n fal: 'FAL_KEY',\n openrouter: 'OPENROUTER_API_KEY',\n huggingface: 'HUGGINGFACE_TOKEN',\n groq: 'GROQ_API_KEY',\n mistral: 'MISTRAL_API_KEY',\n xai: 'XAI_API_KEY',\n};\n\nconst LOCAL_DEFAULTS: Record<string, { host: string; port: number; envHost: string; envPort: string }> = {\n ollama: { host: 'http://localhost', port: 11434, envHost: 'OLLAMA_HOST', envPort: 'OLLAMA_PORT' },\n comfyui: { host: 'http://localhost', port: 8188, envHost: 'COMFYUI_HOST', envPort: 'COMFYUI_PORT' },\n piper: { host: 'http://localhost', port: 5500, envHost: 'PIPER_HOST', envPort: 'PIPER_PORT' },\n kokoro: { host: 'http://localhost', port: 5501, envHost: 'KOKORO_HOST', envPort: 'KOKORO_PORT' },\n};\n\nconst DEFAULT_RETRYABLE: NoosphereErrorCode[] = [\n 'PROVIDER_UNAVAILABLE',\n 'RATE_LIMITED',\n 'TIMEOUT',\n];\n\nexport interface ResolvedConfig {\n keys: Record<string, string | undefined>;\n local: Record<string, { enabled: boolean; host: string; port: number; type?: string }>;\n customLocal: LocalServiceConfig[];\n defaults: NonNullable<NoosphereConfig['defaults']>;\n autoDetectLocal: boolean;\n discoveryCacheTTL: number;\n retry: { maxRetries: number; backoffMs: number; retryableErrors: NoosphereErrorCode[]; failover: boolean };\n timeout: { llm: number; image: number; video: number; tts: number };\n onUsage?: NoosphereConfig['onUsage'];\n}\n\nexport function resolveConfig(input: NoosphereConfig): ResolvedConfig {\n loadEnv();\n\n // Resolve API keys: config > env\n const keys: Record<string, string | undefined> = {};\n for (const [name, envVar] of Object.entries(ENV_KEY_MAP)) {\n keys[name] = input.keys?.[name as keyof NonNullable<NoosphereConfig['keys']>] ?? process.env[envVar];\n }\n\n // Resolve local services: config > env > defaults\n const local: Record<string, { enabled: boolean; host: string; port: number; type?: string }> = {};\n for (const [name, defaults] of Object.entries(LOCAL_DEFAULTS)) {\n const cfgLocal = input.local?.[name as keyof NonNullable<NoosphereConfig['local']>] as LocalServiceConfig | undefined;\n const envPort = process.env[defaults.envPort];\n const envHost = process.env[defaults.envHost];\n\n local[name] = {\n enabled: cfgLocal?.enabled ?? true,\n host: cfgLocal?.host ?? envHost ?? defaults.host,\n port: cfgLocal?.port ?? (envPort ? parseInt(envPort, 10) : defaults.port),\n type: cfgLocal?.type,\n };\n }\n\n const autoDetectEnv = process.env.NOOSPHERE_AUTO_DETECT_LOCAL;\n const cacheTTLEnv = process.env.NOOSPHERE_DISCOVERY_CACHE_TTL;\n\n return {\n keys,\n local,\n customLocal: input.local?.custom ?? [],\n defaults: input.defaults ?? {},\n autoDetectLocal: input.autoDetectLocal ?? (autoDetectEnv !== undefined ? autoDetectEnv !== 'false' : true),\n discoveryCacheTTL: input.discoveryCacheTTL ?? (cacheTTLEnv ? parseInt(cacheTTLEnv, 10) : 60),\n retry: {\n maxRetries: input.retry?.maxRetries ?? 2,\n backoffMs: input.retry?.backoffMs ?? 1000,\n retryableErrors: input.retry?.retryableErrors ?? DEFAULT_RETRYABLE,\n failover: input.retry?.failover ?? true,\n },\n timeout: {\n llm: input.timeout?.llm ?? 30000,\n image: input.timeout?.image ?? 120000,\n video: input.timeout?.video ?? 300000,\n tts: input.timeout?.tts ?? 60000,\n },\n onUsage: input.onUsage,\n };\n}\n","// src/logos.ts\n// Provider logos bundled as local assets (assets/logos/)\n// SVG + PNG (512x512) for each provider — official logos from brand pages.\n\nimport { fileURLToPath } from 'url';\nimport { dirname, join, resolve } from 'path';\nimport { existsSync } from 'fs';\n\nexport interface ProviderLogo {\n svg?: string;\n png?: string;\n}\n\n// Resolve assets dir relative to this file (works in both ESM and CJS)\nlet _assetsDir: string | null = null;\nfunction assetsDir(): string {\n if (_assetsDir) return _assetsDir;\n try {\n // ESM\n const __filename = fileURLToPath(import.meta.url);\n _assetsDir = resolve(dirname(__filename), '..', 'assets', 'logos');\n } catch {\n // CJS fallback\n _assetsDir = resolve(__dirname, '..', 'assets', 'logos');\n }\n return _assetsDir;\n}\n\n/**\n * All known provider IDs with logo assets.\n */\nexport const PROVIDER_IDS = [\n // Cloud LLM\n 'openai', 'anthropic', 'google', 'groq', 'mistral', 'xai',\n 'openrouter', 'cerebras', 'pi-ai',\n // Media\n 'fal', 'huggingface',\n // Local\n 'comfyui', 'piper', 'kokoro', 'ollama',\n // Model orgs (from OpenRouter prefixes)\n 'meta', 'deepseek', 'microsoft', 'nvidia', 'qwen',\n 'cohere', 'perplexity', 'amazon',\n // Additional model orgs\n 'zai', 'minimax', 'baidu', 'bytedance', 'tencent',\n 'xiaomi', 'ibm', 'ai21', 'inflection', 'upstage',\n // HuggingFace inference providers\n 'sambanova', 'together', 'fireworks-ai', 'replicate', 'nebius', 'novita',\n] as const;\n\nexport type ProviderId = (typeof PROVIDER_IDS)[number];\n\n// Cache resolved paths\nconst _cache = new Map<string, ProviderLogo>();\n\n/**\n * Get local file paths to a provider's logo assets.\n * Returns absolute paths to SVG and/or PNG files in assets/logos/.\n */\nexport function getProviderLogo(providerId: string | undefined | null): ProviderLogo | undefined {\n if (!providerId) return undefined;\n\n // Check cache\n const cached = _cache.get(providerId);\n if (cached) return cached;\n\n // Normalize\n const normalized = providerId.toLowerCase().replace(/[-_\\s]/g, '');\n\n // Try exact match first, then fuzzy\n let matchedId: string | null = null;\n for (const id of PROVIDER_IDS) {\n if (id === providerId) { matchedId = id; break; }\n }\n if (!matchedId) {\n for (const id of PROVIDER_IDS) {\n if (id.replace(/[-_\\s]/g, '') === normalized) { matchedId = id; break; }\n }\n }\n\n if (!matchedId) return undefined;\n\n const dir = assetsDir();\n const svgPath = join(dir, 'svg', `${matchedId}.svg`);\n const pngPath = join(dir, 'png', `${matchedId}.png`);\n\n const logo: ProviderLogo = {};\n if (existsSync(svgPath)) logo.svg = svgPath;\n if (existsSync(pngPath)) logo.png = pngPath;\n\n if (!logo.svg && !logo.png) return undefined;\n\n _cache.set(providerId, logo);\n return logo;\n}\n\n/**\n * Get all provider logos as a map.\n */\nexport function getAllProviderLogos(): Record<string, ProviderLogo> {\n const result: Record<string, ProviderLogo> = {};\n for (const id of PROVIDER_IDS) {\n const logo = getProviderLogo(id);\n if (logo) result[id] = logo;\n }\n return result;\n}\n\n// For backwards compat — re-export as PROVIDER_LOGOS (lazy-loaded)\nlet _allLogos: Record<string, ProviderLogo> | null = null;\nexport const PROVIDER_LOGOS: Record<string, ProviderLogo> = new Proxy({} as Record<string, ProviderLogo>, {\n get(_, prop: string) {\n if (!_allLogos) _allLogos = getAllProviderLogos();\n return _allLogos[prop];\n },\n ownKeys() {\n if (!_allLogos) _allLogos = getAllProviderLogos();\n return Object.keys(_allLogos);\n },\n getOwnPropertyDescriptor(_, prop: string) {\n if (!_allLogos) _allLogos = getAllProviderLogos();\n if (prop in _allLogos) {\n return { configurable: true, enumerable: true, value: _allLogos[prop] };\n }\n return undefined;\n },\n has(_, prop: string) {\n if (!_allLogos) _allLogos = getAllProviderLogos();\n return prop in _allLogos;\n },\n});\n","// src/registry.ts\nimport type { Modality, ModelInfo, ProviderInfo, SyncResult } from './types.js';\nimport type { NoosphereProvider } from './providers/base.js';\nimport { getProviderLogo } from './logos.js';\n\ninterface CachedModels {\n models: ModelInfo[];\n syncedAt: number;\n}\n\nexport class Registry {\n private providers = new Map<string, NoosphereProvider>();\n private modelCache = new Map<string, CachedModels>(); // providerId -> cached models\n private cacheTTLMs: number;\n\n constructor(cacheTTLMinutes: number) {\n this.cacheTTLMs = cacheTTLMinutes * 60 * 1000;\n }\n\n addProvider(provider: NoosphereProvider): void {\n this.providers.set(provider.id, provider);\n }\n\n getProvider(id: string): NoosphereProvider | undefined {\n return this.providers.get(id);\n }\n\n getAllProviders(): NoosphereProvider[] {\n return Array.from(this.providers.values());\n }\n\n resolveProvider(modality: Modality, preferredId?: string): NoosphereProvider | null {\n if (preferredId) {\n const p = this.providers.get(preferredId);\n if (p && p.modalities.includes(modality)) return p;\n return null;\n }\n\n // Priority: local first, then cloud\n let bestCloud: NoosphereProvider | null = null;\n for (const p of this.providers.values()) {\n if (!p.modalities.includes(modality)) continue;\n if (p.isLocal) return p;\n if (!bestCloud) bestCloud = p;\n }\n return bestCloud;\n }\n\n resolveModel(\n modelId: string,\n modality: Modality,\n ): { provider: NoosphereProvider; model: ModelInfo } | null {\n for (const [providerId, cached] of this.modelCache) {\n const model = cached.models.find(\n (m) => m.id === modelId && m.modality === modality,\n );\n if (model) {\n const provider = this.providers.get(providerId);\n if (provider) return { provider, model };\n }\n }\n return null;\n }\n\n getModels(modality?: Modality): ModelInfo[] {\n const all: ModelInfo[] = [];\n for (const cached of this.modelCache.values()) {\n for (const model of cached.models) {\n if (!modality || model.modality === modality) {\n all.push(model);\n }\n }\n }\n return all;\n }\n\n getModel(provider: string, modelId: string): ModelInfo | null {\n const cached = this.modelCache.get(provider);\n return cached?.models.find((m) => m.id === modelId) ?? null;\n }\n\n async syncProvider(providerId: string): Promise<number> {\n const provider = this.providers.get(providerId);\n if (!provider) return 0;\n\n const models = await provider.listModels();\n this.modelCache.set(providerId, { models, syncedAt: Date.now() });\n return models.length;\n }\n\n async syncAll(): Promise<SyncResult> {\n const byProvider: Record<string, number> = {};\n const errors: string[] = [];\n let synced = 0;\n\n for (const provider of this.providers.values()) {\n try {\n const count = await this.syncProvider(provider.id);\n byProvider[provider.id] = count;\n synced += count;\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n errors.push(`${provider.id}: ${msg}`);\n byProvider[provider.id] = 0;\n }\n }\n\n return { synced, byProvider, errors };\n }\n\n isCacheStale(providerId: string): boolean {\n const cached = this.modelCache.get(providerId);\n if (!cached) return true;\n return Date.now() - cached.syncedAt > this.cacheTTLMs;\n }\n\n clearCache(): void {\n this.modelCache.clear();\n }\n\n getProviderInfos(modality?: Modality): ProviderInfo[] {\n const infos: ProviderInfo[] = [];\n for (const provider of this.providers.values()) {\n if (modality && !provider.modalities.includes(modality)) continue;\n const cached = this.modelCache.get(provider.id);\n infos.push({\n id: provider.id,\n name: provider.name,\n modalities: provider.modalities,\n local: provider.isLocal,\n status: 'online', // ping-based status is set externally\n modelCount: cached?.models.length ?? 0,\n logo: getProviderLogo(provider.id),\n });\n }\n return infos;\n }\n}\n","import type { UsageEvent, UsageQueryOptions, UsageSummary, Modality } from './types.js';\n\nexport class UsageTracker {\n private events: UsageEvent[] = [];\n private onUsage?: (event: UsageEvent) => void | Promise<void>;\n\n constructor(onUsage?: (event: UsageEvent) => void | Promise<void>) {\n this.onUsage = onUsage;\n }\n\n async record(event: UsageEvent): Promise<void> {\n this.events.push(event);\n if (this.onUsage) {\n await this.onUsage(event);\n }\n }\n\n getSummary(options?: UsageQueryOptions): UsageSummary {\n let filtered = this.events;\n\n if (options?.since) {\n const since = new Date(options.since).getTime();\n filtered = filtered.filter((e) => new Date(e.timestamp).getTime() >= since);\n }\n if (options?.until) {\n const until = new Date(options.until).getTime();\n filtered = filtered.filter((e) => new Date(e.timestamp).getTime() <= until);\n }\n if (options?.provider) {\n filtered = filtered.filter((e) => e.provider === options.provider);\n }\n if (options?.modality) {\n filtered = filtered.filter((e) => e.modality === options.modality);\n }\n\n const byProvider: Record<string, number> = {};\n const byModality: Record<Modality, number> = { llm: 0, image: 0, video: 0, tts: 0 };\n let totalCost = 0;\n\n for (const event of filtered) {\n totalCost += event.cost;\n byProvider[event.provider] = (byProvider[event.provider] ?? 0) + event.cost;\n byModality[event.modality] += event.cost;\n }\n\n return {\n totalCost,\n totalRequests: filtered.length,\n byProvider,\n byModality,\n };\n }\n\n clear(): void {\n this.events = [];\n }\n}\n","// src/providers/pi-ai.ts\nimport { getModels, getProviders, complete, stream, setApiKey } from '@mariozechner/pi-ai';\nimport type { KnownProvider, Model, Api, Context, AssistantMessage } from '@mariozechner/pi-ai';\nimport type { NoosphereProvider } from './base.js';\nimport type {\n Modality, ModelInfo, ChatOptions, NoosphereResult, NoosphereStream, StreamEvent,\n} from '../types.js';\nimport { getProviderLogo } from '../logos.js';\n\nconst KNOWN_PROVIDERS: KnownProvider[] = ['anthropic', 'google', 'openai', 'xai', 'groq', 'cerebras', 'openrouter', 'zai'];\nconst LOCAL_PROVIDERS = new Set(['ollama']);\n\nconst FETCH_TIMEOUT_MS = 8000;\n\n// --- Provider-specific model filtering ---\n\n// OpenAI: only chat/completion models (not embeddings, tts, whisper, dall-e, etc.)\nconst OPENAI_CHAT_PREFIXES = ['gpt-', 'o1', 'o3', 'o4', 'chatgpt-', 'codex-'];\nconst OPENAI_REASONING_PREFIXES = ['o1', 'o3', 'o4'];\n\n// Google: only generative language models\nconst GOOGLE_GENERATIVE_PREFIXES = ['gemini-', 'gemma-'];\n\n// Anthropic: all models are chat models\nconst ANTHROPIC_CHAT_PREFIXES = ['claude-'];\n\n// Provider API endpoint configurations\ninterface ProviderApiConfig {\n url: string;\n headers: (key: string) => Record<string, string>;\n piApiType: Api;\n piBaseUrl: string;\n providerName: string;\n filterChat: (id: string) => boolean;\n isReasoning: (id: string) => boolean;\n extractEntries: (data: any) => Array<{ id: string; name?: string; contextWindow?: number; maxTokens?: number }>;\n}\n\nconst PROVIDER_APIS: Record<string, (key: string) => ProviderApiConfig> = {\n openai: () => ({\n url: 'https://api.openai.com/v1/models',\n headers: (key) => ({ Authorization: `Bearer ${key}` }),\n piApiType: 'openai-responses' as Api,\n piBaseUrl: 'https://api.openai.com/v1',\n providerName: 'openai',\n filterChat: (id) => OPENAI_CHAT_PREFIXES.some((p) => id.startsWith(p)),\n isReasoning: (id) => OPENAI_REASONING_PREFIXES.some((p) => id.startsWith(p)),\n extractEntries: (data) =>\n (data?.data ?? []).map((e: any) => ({ id: e.id, name: e.id })),\n }),\n anthropic: () => ({\n url: 'https://api.anthropic.com/v1/models?limit=100',\n headers: (key) => ({ 'x-api-key': key, 'anthropic-version': '2023-06-01' }),\n piApiType: 'anthropic-messages' as Api,\n piBaseUrl: 'https://api.anthropic.com/v1',\n providerName: 'anthropic',\n filterChat: (id) => ANTHROPIC_CHAT_PREFIXES.some((p) => id.startsWith(p)),\n isReasoning: (id) => id.includes('opus') || id.includes('sonnet'),\n extractEntries: (data) =>\n (data?.data ?? []).map((e: any) => ({ id: e.id, name: e.display_name ?? e.id })),\n }),\n google: (key) => ({\n url: `https://generativelanguage.googleapis.com/v1beta/models?key=${key}`,\n headers: () => ({}),\n piApiType: 'google-generative-ai' as Api,\n piBaseUrl: 'https://generativelanguage.googleapis.com/v1beta',\n providerName: 'google',\n filterChat: (id) => GOOGLE_GENERATIVE_PREFIXES.some((p) => id.startsWith(p)),\n isReasoning: (id) => id.includes('thinking') || id.includes('2.5'),\n extractEntries: (data) =>\n (data?.models ?? [])\n .filter((e: any) => !e.supportedGenerationMethods || e.supportedGenerationMethods.includes('generateContent'))\n .map((e: any) => ({\n id: (e.name as string).replace(/^models\\//, ''),\n name: e.displayName ?? (e.name as string).replace(/^models\\//, ''),\n contextWindow: e.inputTokenLimit,\n maxTokens: e.outputTokenLimit,\n })),\n }),\n groq: () => ({\n url: 'https://api.groq.com/openai/v1/models',\n headers: (key) => ({ Authorization: `Bearer ${key}` }),\n piApiType: 'openai-completions' as Api,\n piBaseUrl: 'https://api.groq.com/openai/v1',\n providerName: 'groq',\n filterChat: () => true, // Groq only serves chat models\n isReasoning: (id) => id.includes('deepseek-r1'),\n extractEntries: (data) =>\n (data?.data ?? []).map((e: any) => ({ id: e.id, name: e.id })),\n }),\n mistral: () => ({\n url: 'https://api.mistral.ai/v1/models',\n headers: (key) => ({ Authorization: `Bearer ${key}` }),\n piApiType: 'openai-completions' as Api,\n piBaseUrl: 'https://api.mistral.ai/v1',\n providerName: 'mistral',\n filterChat: (id) => !id.includes('embed'),\n isReasoning: (id) => id.includes('large') || id.includes('codestral'),\n extractEntries: (data) =>\n (data?.data ?? []).map((e: any) => ({ id: e.id, name: e.id })),\n }),\n xai: () => ({\n url: 'https://api.x.ai/v1/models',\n headers: (key) => ({ Authorization: `Bearer ${key}` }),\n piApiType: 'openai-completions' as Api,\n piBaseUrl: 'https://api.x.ai/v1',\n providerName: 'xai',\n filterChat: (id) => id.startsWith('grok'),\n isReasoning: (id) => id.includes('think'),\n extractEntries: (data) =>\n (data?.data ?? []).map((e: any) => ({ id: e.id, name: e.id })),\n }),\n openrouter: () => ({\n url: 'https://openrouter.ai/api/v1/models',\n headers: (key) => ({ Authorization: `Bearer ${key}` }),\n piApiType: 'openai-completions' as Api,\n piBaseUrl: 'https://openrouter.ai/api/v1',\n providerName: 'openrouter',\n filterChat: () => true, // OpenRouter only lists usable models\n isReasoning: (id) => id.includes('o1') || id.includes('o3') || id.includes('thinking') || id.includes('deepseek-r1'),\n extractEntries: (data) =>\n (data?.data ?? []).map((e: any) => ({\n id: e.id,\n name: e.name ?? e.id,\n contextWindow: e.context_length,\n maxTokens: e.max_completion_tokens ?? e.top_provider?.max_completion_tokens,\n })),\n }),\n cerebras: () => ({\n url: 'https://api.cerebras.ai/v1/models',\n headers: (key) => ({ Authorization: `Bearer ${key}` }),\n piApiType: 'openai-completions' as Api,\n piBaseUrl: 'https://api.cerebras.ai/v1',\n providerName: 'cerebras',\n filterChat: () => true,\n isReasoning: () => false,\n extractEntries: (data) =>\n (data?.data ?? []).map((e: any) => ({ id: e.id, name: e.id })),\n }),\n};\n\nfunction extractText(msg: AssistantMessage): string {\n return msg.content\n .filter((c): c is { type: 'text'; text: string; textSignature?: string } => c.type === 'text')\n .map((c) => c.text)\n .join('');\n}\n\nfunction extractThinking(msg: AssistantMessage): string | undefined {\n const thinking = msg.content\n .filter((c): c is { type: 'thinking'; thinking: string; thinkingSignature?: string } => c.type === 'thinking')\n .map((c) => c.thinking)\n .join('');\n return thinking || undefined;\n}\n\nexport class PiAiProvider implements NoosphereProvider {\n readonly id = 'pi-ai';\n readonly name = 'pi-ai (LLM Gateway)';\n readonly modalities: Modality[] = ['llm'];\n readonly isLocal = false;\n\n private keys: Record<string, string>;\n // Dynamically discovered models not in pi-ai's static catalog\n private dynamicModels = new Map<string, Model<Api>>();\n private dynamicModelsFetched = false;\n\n constructor(keys: Record<string, string | undefined>) {\n this.keys = {};\n for (const [k, v] of Object.entries(keys)) {\n if (v) {\n this.keys[k] = v;\n // Set API key in pi-ai for the known provider\n if (KNOWN_PROVIDERS.includes(k as KnownProvider)) {\n setApiKey(k as KnownProvider, v);\n } else {\n setApiKey(k, v);\n }\n }\n }\n }\n\n async ping(): Promise<boolean> {\n try {\n getProviders();\n return true;\n } catch {\n return false;\n }\n }\n\n async listModels(modality?: Modality): Promise<ModelInfo[]> {\n if (modality && modality !== 'llm') return [];\n\n // 100% dynamic — fetch from ALL provider APIs\n await this.ensureDynamicModels();\n\n const models: ModelInfo[] = [];\n for (const [, m] of this.dynamicModels) {\n const providerName = String(m.provider);\n // For aggregators (openrouter), infer the real provider from model ID prefix\n const logoProvider = this.inferLogoProvider(m.id, providerName);\n models.push({\n id: m.id,\n provider: 'pi-ai',\n name: m.name || m.id,\n modality: 'llm' as const,\n local: false,\n cost: {\n price: m.cost.input ?? 0,\n unit: m.cost.input > 0 ? 'per_1m_tokens' : 'free',\n },\n logo: getProviderLogo(logoProvider),\n capabilities: {\n contextWindow: m.contextWindow,\n maxTokens: m.maxTokens,\n supportsVision: m.input.includes('image'),\n supportsStreaming: true,\n },\n });\n }\n\n return models;\n }\n\n async chat(options: ChatOptions): Promise<NoosphereResult> {\n const start = Date.now();\n\n // Find the model — static catalog first, then dynamic\n await this.ensureDynamicModels();\n const { model, provider } = this.findModel(options.model);\n\n if (!model || !provider) {\n throw new Error(`Model not found: ${options.model ?? 'default'}`);\n }\n\n const context: Context = {\n systemPrompt: options.messages.find((m) => m.role === 'system')?.content,\n messages: options.messages\n .filter((m) => m.role !== 'system')\n .map((m) => ({\n role: m.role as 'user',\n content: m.content,\n timestamp: Date.now(),\n })),\n };\n\n const response = await complete(model, context);\n\n const inputTokens = response.usage?.input ?? 0;\n const outputTokens = response.usage?.output ?? 0;\n\n return {\n content: extractText(response),\n thinking: extractThinking(response),\n provider: 'pi-ai',\n model: response.model ?? options.model ?? 'unknown',\n modality: 'llm',\n latencyMs: Date.now() - start,\n usage: {\n cost: response.usage?.cost?.total ?? 0,\n input: inputTokens,\n output: outputTokens,\n unit: 'tokens',\n },\n };\n }\n\n stream(options: ChatOptions): NoosphereStream {\n const start = Date.now();\n const self = this;\n let innerStream: ReturnType<typeof stream> | undefined;\n let providerModel: { model: Model<Api>; provider: string } | undefined;\n let aborted = false;\n let resolveResult: ((r: NoosphereResult) => void) | null = null;\n let rejectResult: ((e: Error) => void) | null = null;\n const resultPromise = new Promise<NoosphereResult>((resolve, reject) => {\n resolveResult = resolve;\n rejectResult = reject;\n });\n\n const ensureModel = async () => {\n if (!providerModel) {\n await self.ensureDynamicModels();\n const found = self.findModel(options.model);\n if (!found.model || !found.provider) {\n throw new Error(`Model not found: ${options.model ?? 'default'}`);\n }\n providerModel = { model: found.model, provider: found.provider };\n\n const context: Context = {\n systemPrompt: options.messages.find((m) => m.role === 'system')?.content,\n messages: options.messages\n .filter((m) => m.role !== 'system')\n .map((m) => ({\n role: m.role as 'user',\n content: m.content,\n timestamp: Date.now(),\n })),\n };\n\n innerStream = stream(providerModel.model, context);\n }\n };\n\n const asyncIterator: AsyncIterable<StreamEvent> = {\n async *[Symbol.asyncIterator]() {\n try {\n await ensureModel();\n\n for await (const chunk of innerStream!) {\n if (aborted) break;\n if (chunk.type === 'text_delta') {\n yield { type: 'text_delta', delta: chunk.delta };\n } else if (chunk.type === 'thinking_delta') {\n yield { type: 'thinking_delta', delta: chunk.delta };\n }\n }\n\n const final = await innerStream!.result();\n const inputTokens = final.usage?.input ?? 0;\n const outputTokens = final.usage?.output ?? 0;\n const result: NoosphereResult = {\n content: extractText(final),\n thinking: extractThinking(final),\n provider: 'pi-ai',\n model: final.model ?? options.model ?? 'unknown',\n modality: 'llm',\n latencyMs: Date.now() - start,\n usage: {\n cost: final.usage?.cost?.total ?? 0,\n input: inputTokens,\n output: outputTokens,\n unit: 'tokens',\n },\n };\n\n resolveResult?.(result);\n yield { type: 'done', result };\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n rejectResult?.(error);\n yield { type: 'error', error };\n }\n },\n };\n\n return {\n [Symbol.asyncIterator]: () => asyncIterator[Symbol.asyncIterator](),\n result: () => resultPromise,\n abort: () => { aborted = true; },\n };\n }\n\n // --- Dynamic Model Discovery (ALL providers) ---\n\n private async ensureDynamicModels(): Promise<void> {\n if (this.dynamicModelsFetched) return;\n this.dynamicModelsFetched = true;\n\n // 100% dynamic — fetch from ALL provider APIs in parallel\n const fetchPromises: Promise<void>[] = [];\n for (const [providerKey, configFactory] of Object.entries(PROVIDER_APIS)) {\n const apiKey = this.keys[providerKey];\n if (!apiKey) continue;\n fetchPromises.push(this.fetchProviderModels(configFactory(apiKey), apiKey));\n }\n\n await Promise.allSettled(fetchPromises);\n }\n\n private async fetchProviderModels(\n config: ProviderApiConfig,\n apiKey: string,\n ): Promise<void> {\n try {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), FETCH_TIMEOUT_MS);\n\n try {\n const headers = config.headers(apiKey);\n const res = await fetch(config.url, {\n headers: Object.keys(headers).length > 0 ? headers : undefined,\n signal: controller.signal,\n });\n if (!res.ok) return;\n\n const data = await res.json();\n const entries = config.extractEntries(data);\n\n // Try to enrich with static catalog metadata (cost data) if available\n const staticTemplate = this.findStaticTemplate(config.providerName);\n\n for (const entry of entries) {\n const id = entry.id;\n if (!config.filterChat(id)) continue;\n\n // Check if static catalog has this exact model for richer metadata\n const staticMatch = this.findStaticModel(config.providerName, id);\n\n this.dynamicModels.set(id, {\n id,\n name: entry.name ?? id,\n api: config.piApiType,\n provider: config.providerName,\n baseUrl: config.piBaseUrl,\n reasoning: config.isReasoning(id),\n input: staticMatch?.input ?? ['text', 'image'],\n cost: staticMatch?.cost ?? staticTemplate?.cost ?? { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },\n contextWindow: entry.contextWindow ?? staticMatch?.contextWindow ?? staticTemplate?.contextWindow ?? 128000,\n maxTokens: entry.maxTokens ?? staticMatch?.maxTokens ?? staticTemplate?.maxTokens ?? 16384,\n } as Model<Api>);\n }\n } finally {\n clearTimeout(timer);\n }\n } catch {\n // Network failure — silently skip\n }\n }\n\n private findStaticTemplate(providerName: string): Model<Api> | null {\n try {\n const models = getModels(providerName as KnownProvider) as Model<Api>[];\n return models[0] ?? null;\n } catch {\n return null;\n }\n }\n\n private findStaticModel(providerName: string, modelId: string): Model<Api> | null {\n try {\n const models = getModels(providerName as KnownProvider) as Model<Api>[];\n return models.find((m) => m.id === modelId) ?? null;\n } catch {\n return null;\n }\n }\n\n /** Force re-fetch of dynamic models from provider APIs */\n async refreshDynamicModels(): Promise<void> {\n this.dynamicModelsFetched = false;\n this.dynamicModels.clear();\n await this.ensureDynamicModels();\n }\n\n /**\n * Infer the real provider from model ID for logo resolution.\n * e.g. \"x-ai/grok-4\" → \"xai\", \"anthropic/claude-4\" → \"anthropic\"\n */\n private inferLogoProvider(modelId: string, fallback: string): string {\n const MODEL_PREFIX_TO_PROVIDER: Record<string, string> = {\n 'openai/': 'openai', 'gpt-': 'openai', 'o1-': 'openai', 'o3-': 'openai', 'o4-': 'openai', 'chatgpt-': 'openai',\n 'anthropic/': 'anthropic', 'claude-': 'anthropic',\n 'google/': 'google', 'gemini-': 'google', 'gemma-': 'google',\n 'x-ai/': 'xai', 'grok-': 'xai',\n 'meta-llama/': 'meta',\n 'mistralai/': 'mistral', 'mistral-': 'mistral',\n 'deepseek/': 'deepseek',\n 'microsoft/': 'microsoft',\n 'nvidia/': 'nvidia',\n 'qwen/': 'qwen',\n 'cohere/': 'cohere',\n 'perplexity/': 'perplexity',\n 'amazon/': 'amazon',\n 'z-ai/': 'zai',\n 'minimax/': 'minimax',\n 'baidu/': 'baidu',\n 'bytedance/': 'bytedance', 'bytedance-seed/': 'bytedance',\n 'tencent/': 'tencent',\n 'xiaomi/': 'xiaomi',\n 'ibm-granite/': 'ibm', 'ibm/': 'ibm',\n 'ai21/': 'ai21',\n 'inflection/': 'inflection',\n 'upstage/': 'upstage',\n 'alibaba/': 'qwen',\n };\n\n const lower = modelId.toLowerCase();\n for (const [prefix, provider] of Object.entries(MODEL_PREFIX_TO_PROVIDER)) {\n if (lower.startsWith(prefix)) return provider;\n }\n return fallback;\n }\n\n private findModel(modelId?: string): { model: Model<Api> | null; provider: string | null } {\n // 1. Search dynamic models first (100% dynamic catalog)\n if (modelId) {\n const dynamic = this.dynamicModels.get(modelId);\n if (dynamic) return { model: dynamic, provider: String(dynamic.provider) };\n }\n\n // 2. No specific model requested — return first dynamic model available\n if (!modelId) {\n const first = this.dynamicModels.values().next();\n if (!first.done && first.value) {\n return { model: first.value, provider: String(first.value.provider) };\n }\n }\n\n // 3. Last resort: check static catalog for Model object (needed by pi-ai complete/stream)\n for (const provider of KNOWN_PROVIDERS) {\n try {\n const models = getModels(provider) as Model<Api>[];\n const found = modelId\n ? models.find((m) => m.id === modelId)\n : undefined;\n if (found) return { model: found, provider };\n } catch {\n // skip\n }\n }\n\n return { model: null, provider: null };\n }\n}\n","// src/providers/fal.ts\nimport { fal } from '@fal-ai/client';\nimport type { NoosphereProvider } from './base.js';\nimport type {\n Modality, ModelInfo, ImageOptions, VideoOptions, SpeakOptions, NoosphereResult,\n} from '../types.js';\nimport { getProviderLogo } from '../logos.js';\n\nconst FAL_PRICING_URL = 'https://api.fal.ai/v1/models/pricing';\n\nexport class FalProvider implements NoosphereProvider {\n readonly id = 'fal';\n readonly name = 'fal.ai';\n readonly modalities: Modality[] = ['image', 'video', 'tts'];\n readonly isLocal = false;\n\n private apiKey: string;\n private pricingCache: Map<string, { price: number; unit: string }> = new Map();\n\n constructor(apiKey: string) {\n this.apiKey = apiKey;\n fal.config({ credentials: apiKey });\n }\n\n async ping(): Promise<boolean> {\n return !!this.apiKey;\n }\n\n async listModels(modality?: Modality): Promise<ModelInfo[]> {\n try {\n const res = await fetch(FAL_PRICING_URL, {\n headers: { Authorization: `Key ${this.apiKey}` },\n });\n if (!res.ok) return [];\n\n const data = await res.json() as Array<{ modelId: string; price: number; unit: string }>;\n this.pricingCache.clear();\n\n const models: ModelInfo[] = [];\n for (const entry of data) {\n const inferredModality = this.inferModality(entry.modelId, entry.unit);\n if (modality && inferredModality !== modality) continue;\n\n this.pricingCache.set(entry.modelId, { price: entry.price, unit: entry.unit });\n models.push({\n id: entry.modelId,\n provider: 'fal',\n name: entry.modelId.replace('fal-ai/', ''),\n modality: inferredModality,\n local: false,\n cost: { price: entry.price, unit: entry.unit },\n logo: getProviderLogo('fal'),\n });\n }\n return models;\n } catch {\n return [];\n }\n }\n\n async image(options: ImageOptions): Promise<NoosphereResult> {\n const model = options.model ?? 'fal-ai/flux/schnell';\n const start = Date.now();\n\n const response = await fal.subscribe(model, {\n input: {\n prompt: options.prompt,\n negative_prompt: options.negativePrompt,\n image_size: options.width && options.height\n ? { width: options.width, height: options.height }\n : undefined,\n seed: options.seed,\n num_inference_steps: options.steps,\n guidance_scale: options.guidanceScale,\n },\n });\n\n const image = (response.data as any)?.images?.[0];\n const pricing = this.pricingCache.get(model);\n\n return {\n url: image?.url,\n provider: 'fal',\n model,\n modality: 'image',\n latencyMs: Date.now() - start,\n usage: {\n cost: pricing?.price ?? 0,\n unit: pricing?.unit ?? 'per_image',\n },\n media: {\n width: image?.width,\n height: image?.height,\n format: 'png',\n },\n };\n }\n\n async video(options: VideoOptions): Promise<NoosphereResult> {\n const model = options.model ?? 'fal-ai/kling-video/v2/master/text-to-video';\n const start = Date.now();\n\n const response = await fal.subscribe(model, {\n input: {\n prompt: options.prompt,\n image_url: options.imageUrl,\n duration: options.duration,\n fps: options.fps,\n },\n });\n\n const video = (response.data as any)?.video;\n const pricing = this.pricingCache.get(model);\n\n return {\n url: video?.url ?? (response.data as any)?.video_url,\n provider: 'fal',\n model,\n modality: 'video',\n latencyMs: Date.now() - start,\n usage: {\n cost: pricing?.price ?? 0,\n unit: pricing?.unit ?? 'per_second',\n },\n media: {\n width: options.width,\n height: options.height,\n duration: options.duration,\n format: 'mp4',\n fps: options.fps,\n },\n };\n }\n\n async speak(options: SpeakOptions): Promise<NoosphereResult> {\n const model = options.model ?? 'fal-ai/kokoro/american-english';\n const start = Date.now();\n\n const response = await fal.run(model, {\n input: {\n text: options.text,\n voice: options.voice,\n speed: options.speed,\n },\n });\n\n const audioUrl = (response.data as any)?.audio_url ?? (response.data as any)?.audio?.url;\n const pricing = this.pricingCache.get(model);\n\n return {\n url: audioUrl,\n provider: 'fal',\n model,\n modality: 'tts',\n latencyMs: Date.now() - start,\n usage: {\n cost: pricing?.price ?? 0,\n input: options.text.length,\n unit: pricing?.unit ?? 'per_1k_chars',\n },\n media: {\n format: options.format ?? 'mp3',\n },\n };\n }\n\n private inferModality(modelId: string, unit: string): Modality {\n if (unit.includes('char') || modelId.includes('tts') || modelId.includes('kokoro') || modelId.includes('elevenlabs')) return 'tts';\n if (unit.includes('second') || modelId.includes('video') || modelId.includes('kling') || modelId.includes('sora') || modelId.includes('veo')) return 'video';\n return 'image';\n }\n}\n","// src/providers/comfyui.ts\nimport type { NoosphereProvider } from './base.js';\nimport type { Modality, ModelInfo, ImageOptions, VideoOptions, NoosphereResult } from '../types.js';\nimport { getProviderLogo } from '../logos.js';\n\ninterface ComfyUIConfig {\n host: string;\n port: number;\n}\n\nconst DEFAULT_TXT2IMG_WORKFLOW = {\n '3': {\n class_type: 'KSampler',\n inputs: {\n seed: 0, steps: 20, cfg: 7, sampler_name: 'euler',\n scheduler: 'normal', denoise: 1,\n model: ['4', 0], positive: ['6', 0], negative: ['7', 0], latent_image: ['5', 0],\n },\n },\n '4': { class_type: 'CheckpointLoaderSimple', inputs: { ckpt_name: 'sd_xl_base_1.0.safetensors' } },\n '5': { class_type: 'EmptyLatentImage', inputs: { width: 1024, height: 1024, batch_size: 1 } },\n '6': { class_type: 'CLIPTextEncode', inputs: { text: '', clip: ['4', 1] } },\n '7': { class_type: 'CLIPTextEncode', inputs: { text: '', clip: ['4', 1] } },\n '8': { class_type: 'VAEDecode', inputs: { samples: ['3', 0], vae: ['4', 2] } },\n '9': { class_type: 'SaveImage', inputs: { filename_prefix: 'noosphere', images: ['8', 0] } },\n};\n\nexport class ComfyUIProvider implements NoosphereProvider {\n readonly id = 'comfyui';\n readonly name = 'ComfyUI';\n readonly modalities: Modality[] = ['image', 'video'];\n readonly isLocal = true;\n\n private baseUrl: string;\n\n constructor(config: ComfyUIConfig) {\n this.baseUrl = `${config.host}:${config.port}`;\n }\n\n async ping(): Promise<boolean> {\n try {\n const res = await fetch(`${this.baseUrl}/system_stats`);\n return res.ok;\n } catch {\n return false;\n }\n }\n\n async listModels(modality?: Modality): Promise<ModelInfo[]> {\n try {\n const res = await fetch(`${this.baseUrl}/object_info`);\n if (!res.ok) return [];\n\n const models: ModelInfo[] = [];\n\n const logo = getProviderLogo('comfyui');\n if (!modality || modality === 'image') {\n models.push({\n id: 'comfyui-txt2img', provider: 'comfyui', name: 'ComfyUI Text-to-Image',\n modality: 'image', local: true, cost: { price: 0, unit: 'free' }, logo,\n capabilities: { maxWidth: 2048, maxHeight: 2048, supportsNegativePrompt: true },\n });\n }\n if (!modality || modality === 'video') {\n models.push({\n id: 'comfyui-txt2vid', provider: 'comfyui', name: 'ComfyUI Text-to-Video',\n modality: 'video', local: true, cost: { price: 0, unit: 'free' }, logo,\n capabilities: { maxDuration: 10, supportsImageToVideo: true },\n });\n }\n\n return models;\n } catch {\n return [];\n }\n }\n\n async image(options: ImageOptions): Promise<NoosphereResult> {\n const start = Date.now();\n const workflow = structuredClone(DEFAULT_TXT2IMG_WORKFLOW);\n\n // Inject prompt\n (workflow['6'] as any).inputs.text = options.prompt;\n (workflow['7'] as any).inputs.text = options.negativePrompt ?? '';\n (workflow['5'] as any).inputs.width = options.width ?? 1024;\n (workflow['5'] as any).inputs.height = options.height ?? 1024;\n if (options.seed !== undefined) (workflow['3'] as any).inputs.seed = options.seed;\n if (options.steps !== undefined) (workflow['3'] as any).inputs.steps = options.steps;\n if (options.guidanceScale !== undefined) (workflow['3'] as any).inputs.cfg = options.guidanceScale;\n\n // Queue prompt\n const queueRes = await fetch(`${this.baseUrl}/prompt`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ prompt: workflow }),\n });\n if (!queueRes.ok) throw new Error(`ComfyUI queue failed: ${queueRes.status}`);\n const { prompt_id } = await queueRes.json() as { prompt_id: string };\n\n // Poll for completion\n const imageData = await this.pollForResult(prompt_id);\n\n return {\n buffer: Buffer.from(imageData),\n provider: 'comfyui',\n model: options.model ?? 'comfyui-txt2img',\n modality: 'image',\n latencyMs: Date.now() - start,\n usage: { cost: 0, unit: 'free' },\n media: {\n width: options.width ?? 1024,\n height: options.height ?? 1024,\n format: 'png',\n },\n };\n }\n\n async video(_options: VideoOptions): Promise<NoosphereResult> {\n // TODO: Video workflow templates will be added when ComfyUI video nodes are configured\n throw new Error('ComfyUI video generation requires a configured AnimateDiff workflow');\n }\n\n private async pollForResult(promptId: string, maxWaitMs = 300000): Promise<ArrayBuffer> {\n const deadline = Date.now() + maxWaitMs;\n\n while (Date.now() < deadline) {\n const res = await fetch(`${this.baseUrl}/history/${promptId}`);\n if (!res.ok) {\n await new Promise((r) => setTimeout(r, 1000));\n continue;\n }\n\n const history = await res.json() as Record<string, any>;\n const entry = history[promptId];\n if (!entry?.outputs) {\n await new Promise((r) => setTimeout(r, 1000));\n continue;\n }\n\n // Find the SaveImage output node\n for (const nodeOutput of Object.values(entry.outputs) as any[]) {\n if (nodeOutput.images?.length > 0) {\n const img = nodeOutput.images[0];\n const imgRes = await fetch(\n `${this.baseUrl}/view?filename=${img.filename}&subfolder=${img.subfolder}&type=${img.type}`,\n );\n return imgRes.arrayBuffer();\n }\n }\n\n await new Promise((r) => setTimeout(r, 1000));\n }\n\n throw new Error(`ComfyUI generation timed out after ${maxWaitMs}ms`);\n }\n}\n","// src/providers/local-tts.ts\nimport type { NoosphereProvider } from './base.js';\nimport type { Modality, ModelInfo, SpeakOptions, NoosphereResult } from '../types.js';\nimport { getProviderLogo } from '../logos.js';\n\ninterface LocalTTSConfig {\n id: string;\n name: string;\n host: string;\n port: number;\n}\n\nexport class LocalTTSProvider implements NoosphereProvider {\n readonly id: string;\n readonly name: string;\n readonly modalities: Modality[] = ['tts'];\n readonly isLocal = true;\n\n private baseUrl: string;\n\n constructor(config: LocalTTSConfig) {\n this.id = config.id;\n this.name = config.name;\n this.baseUrl = `${config.host}:${config.port}`;\n }\n\n async ping(): Promise<boolean> {\n try {\n const res = await fetch(`${this.baseUrl}/health`);\n return res.ok;\n } catch {\n return false;\n }\n }\n\n async listModels(modality?: Modality): Promise<ModelInfo[]> {\n if (modality && modality !== 'tts') return [];\n\n try {\n // Try Piper-style /voices endpoint first (returns array directly)\n let voices: Array<{ id: string; name?: string }> = [];\n\n try {\n const res = await fetch(`${this.baseUrl}/voices`);\n if (res.ok) {\n const data = await res.json();\n if (Array.isArray(data)) {\n voices = data as Array<{ id: string; name?: string }>;\n }\n }\n } catch {\n // Fall back to OpenAI-compatible /v1/models endpoint\n const res = await fetch(`${this.baseUrl}/v1/models`);\n if (res.ok) {\n const data = await res.json() as { data?: Array<{ id: string }> };\n voices = data.data ?? [];\n }\n }\n\n const logo = getProviderLogo(this.id);\n return voices.map((v) => ({\n id: v.id,\n provider: this.id,\n name: v.name ?? v.id,\n modality: 'tts' as const,\n local: true,\n cost: { price: 0, unit: 'free' },\n logo,\n capabilities: { voices: voices.map((vv) => vv.id) },\n }));\n } catch {\n return [];\n }\n }\n\n async speak(options: SpeakOptions): Promise<NoosphereResult> {\n const start = Date.now();\n\n // OpenAI-compatible TTS endpoint\n const res = await fetch(`${this.baseUrl}/v1/audio/speech`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n model: options.model ?? 'tts-1',\n input: options.text,\n voice: options.voice ?? 'default',\n speed: options.speed ?? 1.0,\n response_format: options.format ?? 'mp3',\n }),\n });\n\n if (!res.ok) {\n throw new Error(`Local TTS failed: ${res.status} ${await res.text()}`);\n }\n\n const audioBuffer = Buffer.from(await res.arrayBuffer());\n\n return {\n buffer: audioBuffer,\n provider: this.id,\n model: options.model ?? options.voice ?? 'default',\n modality: 'tts',\n latencyMs: Date.now() - start,\n usage: {\n cost: 0,\n input: options.text.length,\n unit: 'characters',\n },\n media: {\n format: options.format ?? 'mp3',\n },\n };\n }\n}\n","// src/providers/huggingface.ts\nimport { HfInference } from '@huggingface/inference';\nimport type { NoosphereProvider } from './base.js';\nimport type {\n Modality, ModelInfo, ChatOptions, ImageOptions, SpeakOptions, NoosphereResult, ProviderLogo,\n} from '../types.js';\nimport { getProviderLogo } from '../logos.js';\n\nconst HF_HUB_API = 'https://huggingface.co/api/models';\nconst FETCH_TIMEOUT_MS = 10000;\n\n// Pipeline tag → Noosphere modality mapping\nconst PIPELINE_TAG_MAP: Record<string, { modality: Modality; limit: number }> = {\n 'text-generation': { modality: 'llm', limit: 50 },\n 'text-to-image': { modality: 'image', limit: 50 },\n 'text-to-speech': { modality: 'tts', limit: 30 },\n};\n\n\nexport class HuggingFaceProvider implements NoosphereProvider {\n readonly id = 'huggingface';\n readonly name = 'HuggingFace Inference';\n readonly modalities: Modality[] = ['image', 'tts', 'llm'];\n readonly isLocal = false;\n\n private client: HfInference;\n private token: string;\n private dynamicModels: ModelInfo[] | null = null;\n\n constructor(token: string) {\n this.token = token;\n this.client = new HfInference(token);\n }\n\n async ping(): Promise<boolean> {\n return true;\n }\n\n async listModels(modality?: Modality): Promise<ModelInfo[]> {\n // 100% dynamic — fetch from Hub API (once, cached after)\n if (!this.dynamicModels) {\n await this.fetchHubModels();\n }\n\n const all = this.dynamicModels ?? [];\n if (modality) return all.filter((m) => m.modality === modality);\n return all;\n }\n\n private async fetchHubModels(): Promise<void> {\n const seenIds = new Set<string>();\n const models: ModelInfo[] = [];\n\n // 100% dynamic — fetch trending models per pipeline_tag in parallel\n const fetches = Object.entries(PIPELINE_TAG_MAP).map(\n ([tag, { modality, limit }]) => this.fetchByPipelineTag(tag, modality, limit),\n );\n\n const results = await Promise.allSettled(fetches);\n\n for (const result of results) {\n if (result.status !== 'fulfilled') continue;\n for (const model of result.value) {\n if (seenIds.has(model.id)) continue;\n seenIds.add(model.id);\n models.push(model);\n }\n }\n\n this.dynamicModels = models;\n }\n\n private async fetchByPipelineTag(\n pipelineTag: string,\n modality: Modality,\n limit: number,\n ): Promise<ModelInfo[]> {\n try {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), FETCH_TIMEOUT_MS);\n\n try {\n const params = new URLSearchParams({\n pipeline_tag: pipelineTag,\n inference_provider: 'all',\n sort: 'trendingScore',\n limit: String(limit),\n 'expand[]': 'inferenceProviderMapping',\n });\n\n const res = await fetch(`${HF_HUB_API}?${params}`, {\n headers: this.token ? { Authorization: `Bearer ${this.token}` } : {},\n signal: controller.signal,\n });\n if (!res.ok) return [];\n\n const data = await res.json() as Array<{\n id?: string;\n modelId?: string;\n pipeline_tag?: string;\n likes?: number;\n downloads?: number;\n inferenceProviderMapping?: Array<{\n provider: string;\n providerId: string;\n status: string;\n providerDetails?: { context_length?: number; pricing?: { input?: number; output?: number } };\n }>;\n }>;\n\n return data\n .filter((entry) => entry.id || entry.modelId)\n .map((entry) => {\n const id = entry.id ?? entry.modelId!;\n const liveProviders = (entry.inferenceProviderMapping ?? [])\n .filter((p) => p.status === 'live');\n const providers = liveProviders.map((p) => p.provider);\n\n // Build per-inference-provider logos\n const inferenceProviderLogos: Record<string, ProviderLogo> = {};\n for (const p of liveProviders) {\n const pLogo = getProviderLogo(p.provider);\n if (pLogo) inferenceProviderLogos[p.provider] = pLogo;\n }\n\n // Try to extract pricing from first provider with pricing data\n const pricingProvider = (entry.inferenceProviderMapping ?? [])\n .find((p) => p.providerDetails?.pricing);\n const pricing = pricingProvider?.providerDetails?.pricing;\n const contextLength = (entry.inferenceProviderMapping ?? [])\n .find((p) => p.providerDetails?.context_length)?.providerDetails?.context_length;\n\n return {\n id,\n provider: 'huggingface',\n name: id.split('/').pop() ?? id,\n modality,\n local: false,\n cost: {\n price: pricing?.input ?? 0,\n unit: pricing ? 'per_1m_tokens' : 'free',\n },\n logo: getProviderLogo('huggingface'),\n capabilities: {\n ...(modality === 'llm' ? {\n contextWindow: contextLength,\n supportsStreaming: true,\n } : {}),\n ...(providers.length > 0 ? { inferenceProviders: providers } : {}),\n ...(Object.keys(inferenceProviderLogos).length > 0 ? { inferenceProviderLogos } : {}),\n },\n } as ModelInfo;\n });\n } finally {\n clearTimeout(timer);\n }\n } catch {\n return [];\n }\n }\n\n async chat(options: ChatOptions): Promise<NoosphereResult> {\n const start = Date.now();\n const model = options.model ?? 'meta-llama/Llama-3.1-8B-Instruct';\n\n const response = await this.client.chatCompletion({\n model,\n messages: options.messages,\n temperature: options.temperature,\n max_tokens: options.maxTokens,\n });\n\n const choice = response.choices?.[0];\n const usage = response.usage;\n\n return {\n content: choice?.message?.content ?? '',\n provider: 'huggingface',\n model,\n modality: 'llm',\n latencyMs: Date.now() - start,\n usage: {\n cost: 0,\n input: usage?.prompt_tokens,\n output: usage?.completion_tokens,\n unit: 'tokens',\n },\n };\n }\n\n async image(options: ImageOptions): Promise<NoosphereResult> {\n const start = Date.now();\n const model = options.model ?? 'stabilityai/stable-diffusion-xl-base-1.0';\n\n const blob = await this.client.textToImage({\n model,\n inputs: options.prompt,\n parameters: {\n negative_prompt: options.negativePrompt,\n width: options.width,\n height: options.height,\n guidance_scale: options.guidanceScale,\n num_inference_steps: options.steps,\n },\n }, { outputType: 'blob' });\n\n const buffer = Buffer.from(await blob.arrayBuffer());\n\n return {\n buffer,\n provider: 'huggingface',\n model,\n modality: 'image',\n latencyMs: Date.now() - start,\n usage: { cost: 0, unit: 'free' },\n media: {\n width: options.width ?? 1024,\n height: options.height ?? 1024,\n format: 'png',\n },\n };\n }\n\n async speak(options: SpeakOptions): Promise<NoosphereResult> {\n const start = Date.now();\n const model = options.model ?? 'facebook/mms-tts-eng';\n\n const blob = await this.client.textToSpeech({\n model,\n inputs: options.text,\n });\n\n const buffer = Buffer.from(await blob.arrayBuffer());\n\n return {\n buffer,\n provider: 'huggingface',\n model,\n modality: 'tts',\n latencyMs: Date.now() - start,\n usage: {\n cost: 0,\n input: options.text.length,\n unit: 'characters',\n },\n media: { format: 'wav' },\n };\n }\n}\n","// src/noosphere.ts\nimport type {\n NoosphereConfig,\n ChatOptions,\n ImageOptions,\n VideoOptions,\n SpeakOptions,\n NoosphereResult,\n NoosphereStream,\n StreamEvent,\n ModelInfo,\n ProviderInfo,\n UsageEvent,\n UsageQueryOptions,\n UsageSummary,\n SyncResult,\n Modality,\n} from './types.js';\nimport { NoosphereError } from './errors.js';\nimport { resolveConfig, type ResolvedConfig } from './config.js';\nimport { Registry } from './registry.js';\nimport { UsageTracker } from './tracking.js';\nimport type { NoosphereProvider } from './providers/base.js';\nimport { PiAiProvider } from './providers/pi-ai.js';\nimport { FalProvider } from './providers/fal.js';\nimport { ComfyUIProvider } from './providers/comfyui.js';\nimport { LocalTTSProvider } from './providers/local-tts.js';\nimport { HuggingFaceProvider } from './providers/huggingface.js';\n\nexport class Noosphere {\n private config: ResolvedConfig;\n private registry: Registry;\n private tracker: UsageTracker;\n private initialized = false;\n\n constructor(config: NoosphereConfig = {}) {\n this.config = resolveConfig(config);\n this.registry = new Registry(this.config.discoveryCacheTTL);\n this.tracker = new UsageTracker(this.config.onUsage);\n }\n\n /** Register a custom provider adapter */\n registerProvider(provider: NoosphereProvider): void {\n this.registry.addProvider(provider);\n }\n\n // --- Generation Methods ---\n\n async chat(options: ChatOptions): Promise<NoosphereResult> {\n if (!this.initialized) await this.init();\n const provider = this.resolveProviderForModality('llm', options.provider, options.model);\n if (!provider.chat) {\n throw new NoosphereError(`Provider '${provider.id}' does not support chat`, {\n code: 'INVALID_INPUT', provider: provider.id, modality: 'llm',\n });\n }\n\n const start = Date.now();\n try {\n const result = await this.executeWithRetry(\n 'llm', provider,\n () => provider.chat!(options),\n (alt) => alt.chat ? () => alt.chat!(options) : null,\n );\n await this.trackUsage(result, options.metadata);\n return result;\n } catch (err) {\n await this.trackError('llm', provider.id, options.model, start, err, options.metadata);\n throw err;\n }\n }\n\n stream(options: ChatOptions): NoosphereStream {\n const self = this;\n let innerStream: NoosphereStream | undefined;\n let finalResult: NoosphereResult | undefined;\n let providerRef: NoosphereProvider | undefined;\n\n const ensureInit = async () => {\n if (!self.initialized) await self.init();\n if (!providerRef) {\n providerRef = self.resolveProviderForModality('llm', options.provider, options.model);\n if (!providerRef.stream) {\n throw new NoosphereError(`Provider '${providerRef.id}' does not support streaming`, {\n code: 'INVALID_INPUT', provider: providerRef.id, modality: 'llm',\n });\n }\n innerStream = providerRef.stream(options);\n }\n };\n\n const wrappedIterator: AsyncIterable<StreamEvent> = {\n async *[Symbol.asyncIterator]() {\n await ensureInit();\n try {\n for await (const event of innerStream!) {\n if (event.type === 'done' && event.result) {\n finalResult = event.result;\n await self.trackUsage(event.result, options.metadata);\n }\n yield event;\n }\n } catch (err) {\n await self.trackError('llm', providerRef!.id, options.model, Date.now(), err, options.metadata);\n throw err;\n }\n },\n };\n\n return {\n [Symbol.asyncIterator]: () => wrappedIterator[Symbol.asyncIterator](),\n result: async () => {\n if (finalResult) return finalResult;\n for await (const event of wrappedIterator) {\n if (event.type === 'done' && event.result) return event.result;\n if (event.type === 'error' && event.error) throw event.error;\n }\n throw new NoosphereError('Stream ended without result', {\n code: 'GENERATION_FAILED', provider: providerRef?.id ?? 'unknown', modality: 'llm',\n });\n },\n abort: () => innerStream?.abort(),\n };\n }\n\n async image(options: ImageOptions): Promise<NoosphereResult> {\n if (!this.initialized) await this.init();\n const provider = this.resolveProviderForModality('image', options.provider, options.model);\n if (!provider.image) {\n throw new NoosphereError(`Provider '${provider.id}' does not support image generation`, {\n code: 'INVALID_INPUT', provider: provider.id, modality: 'image',\n });\n }\n\n const start = Date.now();\n try {\n const result = await this.executeWithRetry(\n 'image', provider,\n () => provider.image!(options),\n (alt) => alt.image ? () => alt.image!(options) : null,\n );\n await this.trackUsage(result, options.metadata);\n return result;\n } catch (err) {\n await this.trackError('image', provider.id, options.model, start, err, options.metadata);\n throw err;\n }\n }\n\n async video(options: VideoOptions): Promise<NoosphereResult> {\n if (!this.initialized) await this.init();\n const provider = this.resolveProviderForModality('video', options.provider, options.model);\n if (!provider.video) {\n throw new NoosphereError(`Provider '${provider.id}' does not support video generation`, {\n code: 'INVALID_INPUT', provider: provider.id, modality: 'video',\n });\n }\n\n const start = Date.now();\n try {\n const result = await this.executeWithRetry(\n 'video', provider,\n () => provider.video!(options),\n (alt) => alt.video ? () => alt.video!(options) : null,\n );\n await this.trackUsage(result, options.metadata);\n return result;\n } catch (err) {\n await this.trackError('video', provider.id, options.model, start, err, options.metadata);\n throw err;\n }\n }\n\n async speak(options: SpeakOptions): Promise<NoosphereResult> {\n if (!this.initialized) await this.init();\n const provider = this.resolveProviderForModality('tts', options.provider, options.model);\n if (!provider.speak) {\n throw new NoosphereError(`Provider '${provider.id}' does not support TTS`, {\n code: 'INVALID_INPUT', provider: provider.id, modality: 'tts',\n });\n }\n\n const start = Date.now();\n try {\n const result = await this.executeWithRetry(\n 'tts', provider,\n () => provider.speak!(options),\n (alt) => alt.speak ? () => alt.speak!(options) : null,\n );\n await this.trackUsage(result, options.metadata);\n return result;\n } catch (err) {\n await this.trackError('tts', provider.id, options.model, start, err, options.metadata);\n throw err;\n }\n }\n\n // --- Discovery Methods ---\n\n async getProviders(modality?: Modality): Promise<ProviderInfo[]> {\n if (!this.initialized) await this.init();\n return this.registry.getProviderInfos(modality);\n }\n\n async getModels(modality?: Modality): Promise<ModelInfo[]> {\n if (!this.initialized) await this.init();\n return this.registry.getModels(modality);\n }\n\n async getModel(provider: string, modelId: string): Promise<ModelInfo | null> {\n if (!this.initialized) await this.init();\n return this.registry.getModel(provider, modelId);\n }\n\n async syncModels(): Promise<SyncResult> {\n if (!this.initialized) await this.init();\n return this.registry.syncAll();\n }\n\n // --- Tracking Methods ---\n\n getUsage(options?: UsageQueryOptions): UsageSummary {\n return this.tracker.getSummary(options);\n }\n\n // --- Lifecycle ---\n\n async dispose(): Promise<void> {\n for (const provider of this.registry.getAllProviders()) {\n if (provider.dispose) {\n await provider.dispose();\n }\n }\n this.registry.clearCache();\n this.tracker.clear();\n }\n\n // --- Internal ---\n\n private async init(): Promise<void> {\n if (this.initialized) return;\n this.initialized = true;\n\n const { keys, local, autoDetectLocal } = this.config;\n\n // Register cloud providers based on available keys\n const llmKeys: Record<string, string | undefined> = {\n openai: keys.openai,\n anthropic: keys.anthropic,\n google: keys.google,\n openrouter: keys.openrouter,\n groq: keys.groq,\n mistral: keys.mistral,\n xai: keys.xai,\n };\n const hasAnyLLMKey = Object.values(llmKeys).some(Boolean);\n if (hasAnyLLMKey) {\n this.registry.addProvider(new PiAiProvider(llmKeys));\n }\n\n if (keys.fal) {\n this.registry.addProvider(new FalProvider(keys.fal));\n }\n\n if (keys.huggingface) {\n this.registry.addProvider(new HuggingFaceProvider(keys.huggingface));\n }\n\n // Auto-detect local services in parallel\n if (autoDetectLocal) {\n const PING_TIMEOUT_MS = 2000;\n\n const pingUrl = async (url: string): Promise<boolean> => {\n try {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), PING_TIMEOUT_MS);\n try {\n const res = await fetch(url, { signal: controller.signal });\n return res.ok;\n } finally {\n clearTimeout(timer);\n }\n } catch {\n return false;\n }\n };\n\n const comfyuiCfg = local['comfyui'];\n const piperCfg = local['piper'];\n const kokoroCfg = local['kokoro'];\n\n await Promise.allSettled([\n // ComfyUI\n (async () => {\n if (comfyuiCfg?.enabled) {\n const ok = await pingUrl(`${comfyuiCfg.host}:${comfyuiCfg.port}/system_stats`);\n if (ok) {\n this.registry.addProvider(new ComfyUIProvider({ host: comfyuiCfg.host, port: comfyuiCfg.port }));\n }\n }\n })(),\n // Piper TTS\n (async () => {\n if (piperCfg?.enabled) {\n const ok = await pingUrl(`${piperCfg.host}:${piperCfg.port}/health`);\n if (ok) {\n this.registry.addProvider(new LocalTTSProvider({ id: 'piper', name: 'Piper TTS', host: piperCfg.host, port: piperCfg.port }));\n }\n }\n })(),\n // Kokoro TTS\n (async () => {\n if (kokoroCfg?.enabled) {\n const ok = await pingUrl(`${kokoroCfg.host}:${kokoroCfg.port}/health`);\n if (ok) {\n this.registry.addProvider(new LocalTTSProvider({ id: 'kokoro', name: 'Kokoro TTS', host: kokoroCfg.host, port: kokoroCfg.port }));\n }\n }\n })(),\n ]);\n }\n }\n\n private resolveProviderForModality(modality: Modality, preferredId?: string, modelId?: string): NoosphereProvider {\n // 1. If a specific model was requested, look it up in the registry\n if (modelId && !preferredId) {\n const resolved = this.registry.resolveModel(modelId, modality);\n if (resolved) return resolved.provider;\n }\n\n // 2. Check defaults if no preference\n if (!preferredId) {\n const defaultCfg = this.config.defaults[modality];\n if (defaultCfg) {\n preferredId = defaultCfg.provider;\n }\n }\n\n // 3. Resolve by provider ID (local-first, then cloud)\n const provider = this.registry.resolveProvider(modality, preferredId);\n if (!provider) {\n throw new NoosphereError(\n `No provider available for modality '${modality}'${preferredId ? ` (requested: ${preferredId})` : ''}`,\n { code: 'NO_PROVIDER', provider: preferredId ?? 'none', modality },\n );\n }\n return provider;\n }\n\n private async executeWithRetry<T>(\n modality: Modality,\n provider: NoosphereProvider,\n fn: () => Promise<T>,\n failoverFnFactory?: (alt: NoosphereProvider) => (() => Promise<T>) | null,\n ): Promise<T> {\n const { maxRetries, backoffMs, retryableErrors, failover } = this.config.retry;\n let lastError: Error | undefined;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n return await fn();\n } catch (err) {\n lastError = err instanceof Error ? err : new Error(String(err));\n\n const isNoosphereErr = err instanceof NoosphereError;\n const code = isNoosphereErr ? err.code : 'GENERATION_FAILED';\n\n // GENERATION_FAILED: retryable same-provider only, no cross-provider failover\n const isRetryable = retryableErrors.includes(code) || code === 'GENERATION_FAILED';\n const allowsFailover = code !== 'GENERATION_FAILED' && retryableErrors.includes(code);\n\n if (!isRetryable || attempt === maxRetries) {\n // Failover to another provider (only for non-GENERATION_FAILED errors)\n if (failover && allowsFailover && failoverFnFactory) {\n const altProviders = this.registry.getAllProviders()\n .filter((p) => p.id !== provider.id && p.modalities.includes(modality));\n for (const alt of altProviders) {\n try {\n const altFn = failoverFnFactory(alt);\n if (altFn) return await altFn();\n } catch {\n // Continue to next provider\n }\n }\n }\n break;\n }\n\n const delay = backoffMs * Math.pow(2, attempt);\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n }\n\n throw lastError ?? new NoosphereError('Generation failed', {\n code: 'GENERATION_FAILED', provider: provider.id, modality,\n });\n }\n\n private async trackUsage(result: NoosphereResult, metadata?: Record<string, unknown>): Promise<void> {\n const event: UsageEvent = {\n modality: result.modality,\n provider: result.provider,\n model: result.model,\n cost: result.usage.cost,\n latencyMs: result.latencyMs,\n input: result.usage.input,\n output: result.usage.output,\n unit: result.usage.unit,\n timestamp: new Date().toISOString(),\n success: true,\n metadata,\n };\n await this.tracker.record(event);\n }\n\n private async trackError(\n modality: Modality, provider: string, model: string | undefined,\n startMs: number, err: unknown, metadata?: Record<string, unknown>,\n ): Promise<void> {\n const event: UsageEvent = {\n modality, provider, model: model ?? 'unknown',\n cost: 0, latencyMs: Date.now() - startMs,\n timestamp: new Date().toISOString(),\n success: false,\n error: err instanceof Error ? err.message : String(err),\n metadata,\n };\n await this.tracker.record(event);\n }\n}\n"],"mappings":"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","names":["resolve","FETCH_TIMEOUT_MS","resolve"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/errors.ts","../src/config.ts","../src/logos.ts","../src/registry.ts","../src/tracking.ts","../src/providers/pi-ai.ts","../src/providers/fal.ts","../src/providers/comfyui.ts","../src/providers/local-tts.ts","../src/providers/huggingface.ts","../src/providers/ollama.ts","../src/providers/hf-local.ts","../src/providers/whisper-local.ts","../src/providers/audiocraft.ts","../src/providers/openai-compat.ts","../src/noosphere.ts"],"sourcesContent":["// src/index.ts\nexport { Noosphere } from './noosphere.js';\nexport { NoosphereError } from './errors.js';\nexport type {\n NoosphereConfig,\n NoosphereResult,\n NoosphereStream,\n StreamEvent,\n Modality,\n ModelInfo,\n ProviderInfo,\n ChatOptions,\n ImageOptions,\n VideoOptions,\n SpeakOptions,\n BaseOptions,\n UsageEvent,\n UsageQueryOptions,\n UsageSummary,\n SyncResult,\n NoosphereErrorCode,\n LocalServiceConfig,\n ProviderLogo,\n ModelStatus,\n LocalModelInfo,\n TranscriptionOptions,\n TranscriptionResult,\n MusicOptions,\n} from './types.js';\nexport type { NoosphereProvider } from './providers/base.js';\nexport { OllamaProvider } from './providers/ollama.js';\nexport type { OllamaPullProgress, OllamaModelDetail, OllamaRunningModel } from './providers/ollama.js';\nexport { HfLocalProvider } from './providers/hf-local.js';\nexport { WhisperLocalProvider } from './providers/whisper-local.js';\nexport { AudioCraftProvider } from './providers/audiocraft.js';\nexport { OpenAICompatProvider, detectOpenAICompatServers } from './providers/openai-compat.js';\nexport type { OpenAICompatConfig } from './providers/openai-compat.js';\nexport { PROVIDER_LOGOS, getProviderLogo, getAllProviderLogos, PROVIDER_IDS } from './logos.js';\n","import type { Modality, NoosphereErrorCode } from './types.js';\n\nconst RETRYABLE_CODES: Set<NoosphereErrorCode> = new Set([\n 'PROVIDER_UNAVAILABLE',\n 'RATE_LIMITED',\n 'TIMEOUT',\n 'GENERATION_FAILED',\n]);\n\nexport class NoosphereError extends Error {\n readonly code: NoosphereErrorCode;\n readonly provider: string;\n readonly modality: Modality;\n readonly model?: string;\n override readonly cause?: Error;\n\n constructor(\n message: string,\n options: {\n code: NoosphereErrorCode;\n provider: string;\n modality: Modality;\n model?: string;\n cause?: Error;\n },\n ) {\n super(message);\n this.name = 'NoosphereError';\n this.code = options.code;\n this.provider = options.provider;\n this.modality = options.modality;\n this.model = options.model;\n this.cause = options.cause;\n }\n\n isRetryable(): boolean {\n return RETRYABLE_CODES.has(this.code);\n }\n}\n","import type { NoosphereConfig, NoosphereErrorCode, LocalServiceConfig } from './types.js';\n\n// Load .env / .env.vault (dotenvx supports both plain and encrypted)\n// Falls back silently if dotenvx isn't installed — env vars from shell still work.\nlet _envLoaded = false;\nfunction loadEnv(): void {\n if (_envLoaded) return;\n _envLoaded = true;\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const dotenvx = require('@dotenvx/dotenvx');\n dotenvx.config({ quiet: true });\n } catch {\n // dotenvx not available — no-op\n }\n}\n\nconst ENV_KEY_MAP: Record<string, string> = {\n openai: 'OPENAI_API_KEY',\n anthropic: 'ANTHROPIC_API_KEY',\n google: 'GEMINI_API_KEY',\n fal: 'FAL_KEY',\n openrouter: 'OPENROUTER_API_KEY',\n huggingface: 'HUGGINGFACE_TOKEN',\n groq: 'GROQ_API_KEY',\n mistral: 'MISTRAL_API_KEY',\n xai: 'XAI_API_KEY',\n};\n\nconst LOCAL_DEFAULTS: Record<string, { host: string; port: number; envHost: string; envPort: string }> = {\n ollama: { host: 'http://localhost', port: 11434, envHost: 'OLLAMA_HOST', envPort: 'OLLAMA_PORT' },\n comfyui: { host: 'http://localhost', port: 8188, envHost: 'COMFYUI_HOST', envPort: 'COMFYUI_PORT' },\n piper: { host: 'http://localhost', port: 5500, envHost: 'PIPER_HOST', envPort: 'PIPER_PORT' },\n kokoro: { host: 'http://localhost', port: 5501, envHost: 'KOKORO_HOST', envPort: 'KOKORO_PORT' },\n};\n\nconst DEFAULT_RETRYABLE: NoosphereErrorCode[] = [\n 'PROVIDER_UNAVAILABLE',\n 'RATE_LIMITED',\n 'TIMEOUT',\n];\n\nexport interface ResolvedConfig {\n keys: Record<string, string | undefined>;\n local: Record<string, { enabled: boolean; host: string; port: number; type?: string }>;\n customLocal: LocalServiceConfig[];\n defaults: NonNullable<NoosphereConfig['defaults']>;\n autoDetectLocal: boolean;\n discoveryCacheTTL: number;\n retry: { maxRetries: number; backoffMs: number; retryableErrors: NoosphereErrorCode[]; failover: boolean };\n timeout: { llm: number; image: number; video: number; tts: number };\n onUsage?: NoosphereConfig['onUsage'];\n}\n\nexport function resolveConfig(input: NoosphereConfig): ResolvedConfig {\n loadEnv();\n\n // Resolve API keys: config > env\n const keys: Record<string, string | undefined> = {};\n for (const [name, envVar] of Object.entries(ENV_KEY_MAP)) {\n keys[name] = input.keys?.[name as keyof NonNullable<NoosphereConfig['keys']>] ?? process.env[envVar];\n }\n\n // Resolve local services: config > env > defaults\n const local: Record<string, { enabled: boolean; host: string; port: number; type?: string }> = {};\n for (const [name, defaults] of Object.entries(LOCAL_DEFAULTS)) {\n const cfgLocal = input.local?.[name as keyof NonNullable<NoosphereConfig['local']>] as LocalServiceConfig | undefined;\n const envPort = process.env[defaults.envPort];\n const envHost = process.env[defaults.envHost];\n\n local[name] = {\n enabled: cfgLocal?.enabled ?? true,\n host: cfgLocal?.host ?? envHost ?? defaults.host,\n port: cfgLocal?.port ?? (envPort ? parseInt(envPort, 10) : defaults.port),\n type: cfgLocal?.type,\n };\n }\n\n const autoDetectEnv = process.env.NOOSPHERE_AUTO_DETECT_LOCAL;\n const cacheTTLEnv = process.env.NOOSPHERE_DISCOVERY_CACHE_TTL;\n\n return {\n keys,\n local,\n customLocal: input.local?.custom ?? [],\n defaults: input.defaults ?? {},\n autoDetectLocal: input.autoDetectLocal ?? (autoDetectEnv !== undefined ? autoDetectEnv !== 'false' : true),\n discoveryCacheTTL: input.discoveryCacheTTL ?? (cacheTTLEnv ? parseInt(cacheTTLEnv, 10) : 60),\n retry: {\n maxRetries: input.retry?.maxRetries ?? 2,\n backoffMs: input.retry?.backoffMs ?? 1000,\n retryableErrors: input.retry?.retryableErrors ?? DEFAULT_RETRYABLE,\n failover: input.retry?.failover ?? true,\n },\n timeout: {\n llm: input.timeout?.llm ?? 30000,\n image: input.timeout?.image ?? 120000,\n video: input.timeout?.video ?? 300000,\n tts: input.timeout?.tts ?? 60000,\n },\n onUsage: input.onUsage,\n };\n}\n","// src/logos.ts\n// Provider logos served from DigitalOcean Spaces CDN.\n// SVG + PNG (512×512) for each provider.\n\nexport interface ProviderLogo {\n svg?: string;\n png?: string;\n}\n\nconst CDN_BASE = 'https://blockchainstarter.nyc3.digitaloceanspaces.com/noosphere/logos';\n\n/**\n * All known provider IDs with logo assets.\n */\nexport const PROVIDER_IDS = [\n // Cloud LLM\n 'openai', 'anthropic', 'google', 'groq', 'mistral', 'xai',\n 'openrouter', 'cerebras', 'pi-ai',\n // Media\n 'fal', 'huggingface',\n // Local\n 'comfyui', 'piper', 'kokoro', 'ollama',\n // Model orgs (from OpenRouter prefixes)\n 'meta', 'deepseek', 'microsoft', 'nvidia', 'qwen',\n 'cohere', 'perplexity', 'amazon',\n // Additional model orgs\n 'zai', 'minimax', 'baidu', 'bytedance', 'tencent',\n 'xiaomi', 'ibm', 'ai21', 'inflection', 'upstage',\n // HuggingFace inference providers\n 'sambanova', 'together', 'fireworks-ai', 'replicate', 'nebius', 'novita',\n] as const;\n\nexport type ProviderId = (typeof PROVIDER_IDS)[number];\n\n// Providers that have SVGs available\nconst HAS_SVG = new Set<string>([\n 'openai', 'anthropic', 'google', 'groq', 'mistral', 'xai',\n 'openrouter', 'cerebras', 'huggingface', 'ollama',\n 'meta', 'deepseek', 'microsoft', 'nvidia', 'qwen',\n 'cohere', 'perplexity', 'amazon', 'baidu',\n 'together', 'fireworks-ai', 'replicate', 'nebius', 'novita',\n 'comfyui', 'fal', 'kokoro', 'piper', 'sambanova', 'pi-ai', 'zai',\n // NO SVG: bytedance, tencent, xiaomi, ibm, ai21, inflection, upstage, minimax\n]);\n\n// Cache\nconst _cache = new Map<string, ProviderLogo>();\n\n/**\n * Get CDN URLs for a provider's logo.\n */\nexport function getProviderLogo(providerId: string | undefined | null): ProviderLogo | undefined {\n if (!providerId) return undefined;\n\n const cached = _cache.get(providerId);\n if (cached) return cached;\n\n const normalized = providerId.toLowerCase().replace(/[-_\\s]/g, '');\n\n let matchedId: string | null = null;\n for (const id of PROVIDER_IDS) {\n if (id === providerId) { matchedId = id; break; }\n }\n if (!matchedId) {\n for (const id of PROVIDER_IDS) {\n if (id.replace(/[-_\\s]/g, '') === normalized) { matchedId = id; break; }\n }\n }\n\n if (!matchedId) return undefined;\n\n const logo: ProviderLogo = {\n png: `${CDN_BASE}/png/${matchedId}.png`,\n };\n if (HAS_SVG.has(matchedId)) {\n logo.svg = `${CDN_BASE}/svg/${matchedId}.svg`;\n }\n\n _cache.set(providerId, logo);\n return logo;\n}\n\n/**\n * Get all provider logos as a map.\n */\nexport function getAllProviderLogos(): Record<string, ProviderLogo> {\n const result: Record<string, ProviderLogo> = {};\n for (const id of PROVIDER_IDS) {\n const logo = getProviderLogo(id);\n if (logo) result[id] = logo;\n }\n return result;\n}\n\n// Backwards-compat lazy proxy\nlet _allLogos: Record<string, ProviderLogo> | null = null;\nexport const PROVIDER_LOGOS: Record<string, ProviderLogo> = new Proxy({} as Record<string, ProviderLogo>, {\n get(_, prop: string) {\n if (!_allLogos) _allLogos = getAllProviderLogos();\n return _allLogos[prop];\n },\n ownKeys() {\n if (!_allLogos) _allLogos = getAllProviderLogos();\n return Object.keys(_allLogos);\n },\n getOwnPropertyDescriptor(_, prop: string) {\n if (!_allLogos) _allLogos = getAllProviderLogos();\n if (prop in _allLogos) {\n return { configurable: true, enumerable: true, value: _allLogos[prop] };\n }\n return undefined;\n },\n has(_, prop: string) {\n if (!_allLogos) _allLogos = getAllProviderLogos();\n return prop in _allLogos;\n },\n});\n","// src/registry.ts\nimport type { Modality, ModelInfo, ProviderInfo, SyncResult } from './types.js';\nimport type { NoosphereProvider } from './providers/base.js';\nimport { getProviderLogo } from './logos.js';\n\ninterface CachedModels {\n models: ModelInfo[];\n syncedAt: number;\n}\n\nexport class Registry {\n private providers = new Map<string, NoosphereProvider>();\n private modelCache = new Map<string, CachedModels>(); // providerId -> cached models\n private cacheTTLMs: number;\n\n constructor(cacheTTLMinutes: number) {\n this.cacheTTLMs = cacheTTLMinutes * 60 * 1000;\n }\n\n addProvider(provider: NoosphereProvider): void {\n this.providers.set(provider.id, provider);\n }\n\n getProvider(id: string): NoosphereProvider | undefined {\n return this.providers.get(id);\n }\n\n getAllProviders(): NoosphereProvider[] {\n return Array.from(this.providers.values());\n }\n\n resolveProvider(modality: Modality, preferredId?: string): NoosphereProvider | null {\n if (preferredId) {\n const p = this.providers.get(preferredId);\n if (p && p.modalities.includes(modality)) return p;\n return null;\n }\n\n // Priority: local first, then cloud\n let bestCloud: NoosphereProvider | null = null;\n for (const p of this.providers.values()) {\n if (!p.modalities.includes(modality)) continue;\n if (p.isLocal) return p;\n if (!bestCloud) bestCloud = p;\n }\n return bestCloud;\n }\n\n resolveModel(\n modelId: string,\n modality: Modality,\n ): { provider: NoosphereProvider; model: ModelInfo } | null {\n for (const [providerId, cached] of this.modelCache) {\n const model = cached.models.find(\n (m) => m.id === modelId && m.modality === modality,\n );\n if (model) {\n const provider = this.providers.get(providerId);\n if (provider) return { provider, model };\n }\n }\n return null;\n }\n\n getModels(modality?: Modality): ModelInfo[] {\n const all: ModelInfo[] = [];\n for (const cached of this.modelCache.values()) {\n for (const model of cached.models) {\n if (!modality || model.modality === modality) {\n all.push(model);\n }\n }\n }\n return all;\n }\n\n getModel(provider: string, modelId: string): ModelInfo | null {\n const cached = this.modelCache.get(provider);\n return cached?.models.find((m) => m.id === modelId) ?? null;\n }\n\n async syncProvider(providerId: string): Promise<number> {\n const provider = this.providers.get(providerId);\n if (!provider) return 0;\n\n const models = await provider.listModels();\n this.modelCache.set(providerId, { models, syncedAt: Date.now() });\n return models.length;\n }\n\n async syncAll(): Promise<SyncResult> {\n const byProvider: Record<string, number> = {};\n const errors: string[] = [];\n let synced = 0;\n\n for (const provider of this.providers.values()) {\n try {\n const count = await this.syncProvider(provider.id);\n byProvider[provider.id] = count;\n synced += count;\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n errors.push(`${provider.id}: ${msg}`);\n byProvider[provider.id] = 0;\n }\n }\n\n return { synced, byProvider, errors };\n }\n\n isCacheStale(providerId: string): boolean {\n const cached = this.modelCache.get(providerId);\n if (!cached) return true;\n return Date.now() - cached.syncedAt > this.cacheTTLMs;\n }\n\n clearCache(): void {\n this.modelCache.clear();\n }\n\n getProviderInfos(modality?: Modality): ProviderInfo[] {\n const infos: ProviderInfo[] = [];\n for (const provider of this.providers.values()) {\n if (modality && !provider.modalities.includes(modality)) continue;\n const cached = this.modelCache.get(provider.id);\n infos.push({\n id: provider.id,\n name: provider.name,\n modalities: provider.modalities,\n local: provider.isLocal,\n status: 'online', // ping-based status is set externally\n modelCount: cached?.models.length ?? 0,\n logo: getProviderLogo(provider.id),\n });\n }\n return infos;\n }\n}\n","import type { UsageEvent, UsageQueryOptions, UsageSummary, Modality } from './types.js';\n\nexport class UsageTracker {\n private events: UsageEvent[] = [];\n private onUsage?: (event: UsageEvent) => void | Promise<void>;\n\n constructor(onUsage?: (event: UsageEvent) => void | Promise<void>) {\n this.onUsage = onUsage;\n }\n\n async record(event: UsageEvent): Promise<void> {\n this.events.push(event);\n if (this.onUsage) {\n await this.onUsage(event);\n }\n }\n\n getSummary(options?: UsageQueryOptions): UsageSummary {\n let filtered = this.events;\n\n if (options?.since) {\n const since = new Date(options.since).getTime();\n filtered = filtered.filter((e) => new Date(e.timestamp).getTime() >= since);\n }\n if (options?.until) {\n const until = new Date(options.until).getTime();\n filtered = filtered.filter((e) => new Date(e.timestamp).getTime() <= until);\n }\n if (options?.provider) {\n filtered = filtered.filter((e) => e.provider === options.provider);\n }\n if (options?.modality) {\n filtered = filtered.filter((e) => e.modality === options.modality);\n }\n\n const byProvider: Record<string, number> = {};\n const byModality: Record<Modality, number> = { llm: 0, image: 0, video: 0, tts: 0, stt: 0, music: 0, embedding: 0 };\n let totalCost = 0;\n\n for (const event of filtered) {\n totalCost += event.cost;\n byProvider[event.provider] = (byProvider[event.provider] ?? 0) + event.cost;\n byModality[event.modality] += event.cost;\n }\n\n return {\n totalCost,\n totalRequests: filtered.length,\n byProvider,\n byModality,\n };\n }\n\n clear(): void {\n this.events = [];\n }\n}\n","// src/providers/pi-ai.ts\nimport { getModels, getProviders, complete, stream, setApiKey } from '@mariozechner/pi-ai';\nimport type { KnownProvider, Model, Api, Context, AssistantMessage } from '@mariozechner/pi-ai';\nimport type { NoosphereProvider } from './base.js';\nimport type {\n Modality, ModelInfo, ChatOptions, NoosphereResult, NoosphereStream, StreamEvent,\n} from '../types.js';\nimport { getProviderLogo } from '../logos.js';\n\nconst KNOWN_PROVIDERS: KnownProvider[] = ['anthropic', 'google', 'openai', 'xai', 'groq', 'cerebras', 'openrouter', 'zai'];\nconst LOCAL_PROVIDERS = new Set(['ollama']);\n\nconst FETCH_TIMEOUT_MS = 8000;\n\n// --- Provider-specific model filtering ---\n\n// OpenAI: only chat/completion models (not embeddings, tts, whisper, dall-e, etc.)\nconst OPENAI_CHAT_PREFIXES = ['gpt-', 'o1', 'o3', 'o4', 'chatgpt-', 'codex-'];\nconst OPENAI_REASONING_PREFIXES = ['o1', 'o3', 'o4'];\n\n// Google: only generative language models\nconst GOOGLE_GENERATIVE_PREFIXES = ['gemini-', 'gemma-'];\n\n// Anthropic: all models are chat models\nconst ANTHROPIC_CHAT_PREFIXES = ['claude-'];\n\n// Provider API endpoint configurations\ninterface ProviderApiConfig {\n url: string;\n headers: (key: string) => Record<string, string>;\n piApiType: Api;\n piBaseUrl: string;\n providerName: string;\n filterChat: (id: string) => boolean;\n isReasoning: (id: string) => boolean;\n extractEntries: (data: any) => Array<{ id: string; name?: string; contextWindow?: number; maxTokens?: number }>;\n}\n\nconst PROVIDER_APIS: Record<string, (key: string) => ProviderApiConfig> = {\n openai: () => ({\n url: 'https://api.openai.com/v1/models',\n headers: (key) => ({ Authorization: `Bearer ${key}` }),\n piApiType: 'openai-responses' as Api,\n piBaseUrl: 'https://api.openai.com/v1',\n providerName: 'openai',\n filterChat: (id) => OPENAI_CHAT_PREFIXES.some((p) => id.startsWith(p)),\n isReasoning: (id) => OPENAI_REASONING_PREFIXES.some((p) => id.startsWith(p)),\n extractEntries: (data) =>\n (data?.data ?? []).map((e: any) => ({ id: e.id, name: e.id })),\n }),\n anthropic: () => ({\n url: 'https://api.anthropic.com/v1/models?limit=100',\n headers: (key) => ({ 'x-api-key': key, 'anthropic-version': '2023-06-01' }),\n piApiType: 'anthropic-messages' as Api,\n piBaseUrl: 'https://api.anthropic.com/v1',\n providerName: 'anthropic',\n filterChat: (id) => ANTHROPIC_CHAT_PREFIXES.some((p) => id.startsWith(p)),\n isReasoning: (id) => id.includes('opus') || id.includes('sonnet'),\n extractEntries: (data) =>\n (data?.data ?? []).map((e: any) => ({ id: e.id, name: e.display_name ?? e.id })),\n }),\n google: (key) => ({\n url: `https://generativelanguage.googleapis.com/v1beta/models?key=${key}`,\n headers: () => ({}),\n piApiType: 'google-generative-ai' as Api,\n piBaseUrl: 'https://generativelanguage.googleapis.com/v1beta',\n providerName: 'google',\n filterChat: (id) => GOOGLE_GENERATIVE_PREFIXES.some((p) => id.startsWith(p)),\n isReasoning: (id) => id.includes('thinking') || id.includes('2.5'),\n extractEntries: (data) =>\n (data?.models ?? [])\n .filter((e: any) => !e.supportedGenerationMethods || e.supportedGenerationMethods.includes('generateContent'))\n .map((e: any) => ({\n id: (e.name as string).replace(/^models\\//, ''),\n name: e.displayName ?? (e.name as string).replace(/^models\\//, ''),\n contextWindow: e.inputTokenLimit,\n maxTokens: e.outputTokenLimit,\n })),\n }),\n groq: () => ({\n url: 'https://api.groq.com/openai/v1/models',\n headers: (key) => ({ Authorization: `Bearer ${key}` }),\n piApiType: 'openai-completions' as Api,\n piBaseUrl: 'https://api.groq.com/openai/v1',\n providerName: 'groq',\n filterChat: () => true, // Groq only serves chat models\n isReasoning: (id) => id.includes('deepseek-r1'),\n extractEntries: (data) =>\n (data?.data ?? []).map((e: any) => ({ id: e.id, name: e.id })),\n }),\n mistral: () => ({\n url: 'https://api.mistral.ai/v1/models',\n headers: (key) => ({ Authorization: `Bearer ${key}` }),\n piApiType: 'openai-completions' as Api,\n piBaseUrl: 'https://api.mistral.ai/v1',\n providerName: 'mistral',\n filterChat: (id) => !id.includes('embed'),\n isReasoning: (id) => id.includes('large') || id.includes('codestral'),\n extractEntries: (data) =>\n (data?.data ?? []).map((e: any) => ({ id: e.id, name: e.id })),\n }),\n xai: () => ({\n url: 'https://api.x.ai/v1/models',\n headers: (key) => ({ Authorization: `Bearer ${key}` }),\n piApiType: 'openai-completions' as Api,\n piBaseUrl: 'https://api.x.ai/v1',\n providerName: 'xai',\n filterChat: (id) => id.startsWith('grok'),\n isReasoning: (id) => id.includes('think'),\n extractEntries: (data) =>\n (data?.data ?? []).map((e: any) => ({ id: e.id, name: e.id })),\n }),\n openrouter: () => ({\n url: 'https://openrouter.ai/api/v1/models',\n headers: (key) => ({ Authorization: `Bearer ${key}` }),\n piApiType: 'openai-completions' as Api,\n piBaseUrl: 'https://openrouter.ai/api/v1',\n providerName: 'openrouter',\n filterChat: () => true, // OpenRouter only lists usable models\n isReasoning: (id) => id.includes('o1') || id.includes('o3') || id.includes('thinking') || id.includes('deepseek-r1'),\n extractEntries: (data) =>\n (data?.data ?? []).map((e: any) => ({\n id: e.id,\n name: e.name ?? e.id,\n contextWindow: e.context_length,\n maxTokens: e.max_completion_tokens ?? e.top_provider?.max_completion_tokens,\n })),\n }),\n cerebras: () => ({\n url: 'https://api.cerebras.ai/v1/models',\n headers: (key) => ({ Authorization: `Bearer ${key}` }),\n piApiType: 'openai-completions' as Api,\n piBaseUrl: 'https://api.cerebras.ai/v1',\n providerName: 'cerebras',\n filterChat: () => true,\n isReasoning: () => false,\n extractEntries: (data) =>\n (data?.data ?? []).map((e: any) => ({ id: e.id, name: e.id })),\n }),\n};\n\nfunction extractText(msg: AssistantMessage): string {\n return msg.content\n .filter((c): c is { type: 'text'; text: string; textSignature?: string } => c.type === 'text')\n .map((c) => c.text)\n .join('');\n}\n\nfunction extractThinking(msg: AssistantMessage): string | undefined {\n const thinking = msg.content\n .filter((c): c is { type: 'thinking'; thinking: string; thinkingSignature?: string } => c.type === 'thinking')\n .map((c) => c.thinking)\n .join('');\n return thinking || undefined;\n}\n\nexport class PiAiProvider implements NoosphereProvider {\n readonly id = 'pi-ai';\n readonly name = 'pi-ai (LLM Gateway)';\n readonly modalities: Modality[] = ['llm'];\n readonly isLocal = false;\n\n private keys: Record<string, string>;\n // Dynamically discovered models not in pi-ai's static catalog\n private dynamicModels = new Map<string, Model<Api>>();\n private dynamicModelsFetched = false;\n\n constructor(keys: Record<string, string | undefined>) {\n this.keys = {};\n for (const [k, v] of Object.entries(keys)) {\n if (v) {\n this.keys[k] = v;\n // Set API key in pi-ai for the known provider\n if (KNOWN_PROVIDERS.includes(k as KnownProvider)) {\n setApiKey(k as KnownProvider, v);\n } else {\n setApiKey(k, v);\n }\n }\n }\n }\n\n async ping(): Promise<boolean> {\n try {\n getProviders();\n return true;\n } catch {\n return false;\n }\n }\n\n async listModels(modality?: Modality): Promise<ModelInfo[]> {\n if (modality && modality !== 'llm') return [];\n\n // 100% dynamic — fetch from ALL provider APIs\n await this.ensureDynamicModels();\n\n const models: ModelInfo[] = [];\n for (const [, m] of this.dynamicModels) {\n const providerName = String(m.provider);\n // For aggregators (openrouter), infer the real provider from model ID prefix\n const logoProvider = this.inferLogoProvider(m.id, providerName);\n models.push({\n id: m.id,\n provider: 'pi-ai',\n name: m.name || m.id,\n modality: 'llm' as const,\n local: false,\n cost: {\n price: m.cost.input ?? 0,\n unit: m.cost.input > 0 ? 'per_1m_tokens' : 'free',\n },\n logo: getProviderLogo(logoProvider),\n capabilities: {\n contextWindow: m.contextWindow,\n maxTokens: m.maxTokens,\n supportsVision: m.input.includes('image'),\n supportsStreaming: true,\n },\n });\n }\n\n return models;\n }\n\n async chat(options: ChatOptions): Promise<NoosphereResult> {\n const start = Date.now();\n\n // Find the model — static catalog first, then dynamic\n await this.ensureDynamicModels();\n const { model, provider } = this.findModel(options.model);\n\n if (!model || !provider) {\n throw new Error(`Model not found: ${options.model ?? 'default'}`);\n }\n\n const context: Context = {\n systemPrompt: options.messages.find((m) => m.role === 'system')?.content,\n messages: options.messages\n .filter((m) => m.role !== 'system')\n .map((m) => ({\n role: m.role as 'user',\n content: m.content,\n timestamp: Date.now(),\n })),\n };\n\n const response = await complete(model, context);\n\n const inputTokens = response.usage?.input ?? 0;\n const outputTokens = response.usage?.output ?? 0;\n\n return {\n content: extractText(response),\n thinking: extractThinking(response),\n provider: 'pi-ai',\n model: response.model ?? options.model ?? 'unknown',\n modality: 'llm',\n latencyMs: Date.now() - start,\n usage: {\n cost: response.usage?.cost?.total ?? 0,\n input: inputTokens,\n output: outputTokens,\n unit: 'tokens',\n },\n };\n }\n\n stream(options: ChatOptions): NoosphereStream {\n const start = Date.now();\n const self = this;\n let innerStream: ReturnType<typeof stream> | undefined;\n let providerModel: { model: Model<Api>; provider: string } | undefined;\n let aborted = false;\n let resolveResult: ((r: NoosphereResult) => void) | null = null;\n let rejectResult: ((e: Error) => void) | null = null;\n const resultPromise = new Promise<NoosphereResult>((resolve, reject) => {\n resolveResult = resolve;\n rejectResult = reject;\n });\n\n const ensureModel = async () => {\n if (!providerModel) {\n await self.ensureDynamicModels();\n const found = self.findModel(options.model);\n if (!found.model || !found.provider) {\n throw new Error(`Model not found: ${options.model ?? 'default'}`);\n }\n providerModel = { model: found.model, provider: found.provider };\n\n const context: Context = {\n systemPrompt: options.messages.find((m) => m.role === 'system')?.content,\n messages: options.messages\n .filter((m) => m.role !== 'system')\n .map((m) => ({\n role: m.role as 'user',\n content: m.content,\n timestamp: Date.now(),\n })),\n };\n\n innerStream = stream(providerModel.model, context);\n }\n };\n\n const asyncIterator: AsyncIterable<StreamEvent> = {\n async *[Symbol.asyncIterator]() {\n try {\n await ensureModel();\n\n for await (const chunk of innerStream!) {\n if (aborted) break;\n if (chunk.type === 'text_delta') {\n yield { type: 'text_delta', delta: chunk.delta };\n } else if (chunk.type === 'thinking_delta') {\n yield { type: 'thinking_delta', delta: chunk.delta };\n }\n }\n\n const final = await innerStream!.result();\n const inputTokens = final.usage?.input ?? 0;\n const outputTokens = final.usage?.output ?? 0;\n const result: NoosphereResult = {\n content: extractText(final),\n thinking: extractThinking(final),\n provider: 'pi-ai',\n model: final.model ?? options.model ?? 'unknown',\n modality: 'llm',\n latencyMs: Date.now() - start,\n usage: {\n cost: final.usage?.cost?.total ?? 0,\n input: inputTokens,\n output: outputTokens,\n unit: 'tokens',\n },\n };\n\n resolveResult?.(result);\n yield { type: 'done', result };\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n rejectResult?.(error);\n yield { type: 'error', error };\n }\n },\n };\n\n return {\n [Symbol.asyncIterator]: () => asyncIterator[Symbol.asyncIterator](),\n result: () => resultPromise,\n abort: () => { aborted = true; },\n };\n }\n\n // --- Dynamic Model Discovery (ALL providers) ---\n\n private async ensureDynamicModels(): Promise<void> {\n if (this.dynamicModelsFetched) return;\n this.dynamicModelsFetched = true;\n\n // 100% dynamic — fetch from ALL provider APIs in parallel\n const fetchPromises: Promise<void>[] = [];\n for (const [providerKey, configFactory] of Object.entries(PROVIDER_APIS)) {\n const apiKey = this.keys[providerKey];\n if (!apiKey) continue;\n fetchPromises.push(this.fetchProviderModels(configFactory(apiKey), apiKey));\n }\n\n await Promise.allSettled(fetchPromises);\n }\n\n private async fetchProviderModels(\n config: ProviderApiConfig,\n apiKey: string,\n ): Promise<void> {\n try {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), FETCH_TIMEOUT_MS);\n\n try {\n const headers = config.headers(apiKey);\n const res = await fetch(config.url, {\n headers: Object.keys(headers).length > 0 ? headers : undefined,\n signal: controller.signal,\n });\n if (!res.ok) return;\n\n const data = await res.json();\n const entries = config.extractEntries(data);\n\n // Try to enrich with static catalog metadata (cost data) if available\n const staticTemplate = this.findStaticTemplate(config.providerName);\n\n for (const entry of entries) {\n const id = entry.id;\n if (!config.filterChat(id)) continue;\n\n // Check if static catalog has this exact model for richer metadata\n const staticMatch = this.findStaticModel(config.providerName, id);\n\n this.dynamicModels.set(id, {\n id,\n name: entry.name ?? id,\n api: config.piApiType,\n provider: config.providerName,\n baseUrl: config.piBaseUrl,\n reasoning: config.isReasoning(id),\n input: staticMatch?.input ?? ['text', 'image'],\n cost: staticMatch?.cost ?? staticTemplate?.cost ?? { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },\n contextWindow: entry.contextWindow ?? staticMatch?.contextWindow ?? staticTemplate?.contextWindow ?? 128000,\n maxTokens: entry.maxTokens ?? staticMatch?.maxTokens ?? staticTemplate?.maxTokens ?? 16384,\n } as Model<Api>);\n }\n } finally {\n clearTimeout(timer);\n }\n } catch {\n // Network failure — silently skip\n }\n }\n\n private findStaticTemplate(providerName: string): Model<Api> | null {\n try {\n const models = getModels(providerName as KnownProvider) as Model<Api>[];\n return models[0] ?? null;\n } catch {\n return null;\n }\n }\n\n private findStaticModel(providerName: string, modelId: string): Model<Api> | null {\n try {\n const models = getModels(providerName as KnownProvider) as Model<Api>[];\n return models.find((m) => m.id === modelId) ?? null;\n } catch {\n return null;\n }\n }\n\n /** Force re-fetch of dynamic models from provider APIs */\n async refreshDynamicModels(): Promise<void> {\n this.dynamicModelsFetched = false;\n this.dynamicModels.clear();\n await this.ensureDynamicModels();\n }\n\n /**\n * Infer the real provider from model ID for logo resolution.\n * e.g. \"x-ai/grok-4\" → \"xai\", \"anthropic/claude-4\" → \"anthropic\"\n */\n private inferLogoProvider(modelId: string, fallback: string): string {\n const MODEL_PREFIX_TO_PROVIDER: Record<string, string> = {\n 'openai/': 'openai', 'gpt-': 'openai', 'o1-': 'openai', 'o3-': 'openai', 'o4-': 'openai', 'chatgpt-': 'openai',\n 'anthropic/': 'anthropic', 'claude-': 'anthropic',\n 'google/': 'google', 'gemini-': 'google', 'gemma-': 'google',\n 'x-ai/': 'xai', 'grok-': 'xai',\n 'meta-llama/': 'meta',\n 'mistralai/': 'mistral', 'mistral-': 'mistral',\n 'deepseek/': 'deepseek',\n 'microsoft/': 'microsoft',\n 'nvidia/': 'nvidia',\n 'qwen/': 'qwen',\n 'cohere/': 'cohere',\n 'perplexity/': 'perplexity',\n 'amazon/': 'amazon',\n 'z-ai/': 'zai',\n 'minimax/': 'minimax',\n 'baidu/': 'baidu',\n 'bytedance/': 'bytedance', 'bytedance-seed/': 'bytedance',\n 'tencent/': 'tencent',\n 'xiaomi/': 'xiaomi',\n 'ibm-granite/': 'ibm', 'ibm/': 'ibm',\n 'ai21/': 'ai21',\n 'inflection/': 'inflection',\n 'upstage/': 'upstage',\n 'alibaba/': 'qwen',\n };\n\n const lower = modelId.toLowerCase();\n for (const [prefix, provider] of Object.entries(MODEL_PREFIX_TO_PROVIDER)) {\n if (lower.startsWith(prefix)) return provider;\n }\n return fallback;\n }\n\n private findModel(modelId?: string): { model: Model<Api> | null; provider: string | null } {\n // 1. Search dynamic models first (100% dynamic catalog)\n if (modelId) {\n const dynamic = this.dynamicModels.get(modelId);\n if (dynamic) return { model: dynamic, provider: String(dynamic.provider) };\n }\n\n // 2. No specific model requested — return first dynamic model available\n if (!modelId) {\n const first = this.dynamicModels.values().next();\n if (!first.done && first.value) {\n return { model: first.value, provider: String(first.value.provider) };\n }\n }\n\n // 3. Last resort: check static catalog for Model object (needed by pi-ai complete/stream)\n for (const provider of KNOWN_PROVIDERS) {\n try {\n const models = getModels(provider) as Model<Api>[];\n const found = modelId\n ? models.find((m) => m.id === modelId)\n : undefined;\n if (found) return { model: found, provider };\n } catch {\n // skip\n }\n }\n\n return { model: null, provider: null };\n }\n}\n","// src/providers/fal.ts\nimport { fal } from '@fal-ai/client';\nimport type { NoosphereProvider } from './base.js';\nimport type {\n Modality, ModelInfo, ImageOptions, VideoOptions, SpeakOptions, NoosphereResult,\n} from '../types.js';\nimport { getProviderLogo } from '../logos.js';\n\nconst FAL_PRICING_URL = 'https://api.fal.ai/v1/models/pricing';\n\nexport class FalProvider implements NoosphereProvider {\n readonly id = 'fal';\n readonly name = 'fal.ai';\n readonly modalities: Modality[] = ['image', 'video', 'tts'];\n readonly isLocal = false;\n\n private apiKey: string;\n private pricingCache: Map<string, { price: number; unit: string }> = new Map();\n\n constructor(apiKey: string) {\n this.apiKey = apiKey;\n fal.config({ credentials: apiKey });\n }\n\n async ping(): Promise<boolean> {\n return !!this.apiKey;\n }\n\n async listModels(modality?: Modality): Promise<ModelInfo[]> {\n try {\n const res = await fetch(FAL_PRICING_URL, {\n headers: { Authorization: `Key ${this.apiKey}` },\n });\n if (!res.ok) return [];\n\n const data = await res.json() as Array<{ modelId: string; price: number; unit: string }>;\n this.pricingCache.clear();\n\n const models: ModelInfo[] = [];\n for (const entry of data) {\n const inferredModality = this.inferModality(entry.modelId, entry.unit);\n if (modality && inferredModality !== modality) continue;\n\n this.pricingCache.set(entry.modelId, { price: entry.price, unit: entry.unit });\n models.push({\n id: entry.modelId,\n provider: 'fal',\n name: entry.modelId.replace('fal-ai/', ''),\n modality: inferredModality,\n local: false,\n cost: { price: entry.price, unit: entry.unit },\n logo: getProviderLogo('fal'),\n });\n }\n return models;\n } catch {\n return [];\n }\n }\n\n async image(options: ImageOptions): Promise<NoosphereResult> {\n const model = options.model ?? 'fal-ai/flux/schnell';\n const start = Date.now();\n\n const response = await fal.subscribe(model, {\n input: {\n prompt: options.prompt,\n negative_prompt: options.negativePrompt,\n image_size: options.width && options.height\n ? { width: options.width, height: options.height }\n : undefined,\n seed: options.seed,\n num_inference_steps: options.steps,\n guidance_scale: options.guidanceScale,\n },\n });\n\n const image = (response.data as any)?.images?.[0];\n const pricing = this.pricingCache.get(model);\n\n return {\n url: image?.url,\n provider: 'fal',\n model,\n modality: 'image',\n latencyMs: Date.now() - start,\n usage: {\n cost: pricing?.price ?? 0,\n unit: pricing?.unit ?? 'per_image',\n },\n media: {\n width: image?.width,\n height: image?.height,\n format: 'png',\n },\n };\n }\n\n async video(options: VideoOptions): Promise<NoosphereResult> {\n const model = options.model ?? 'fal-ai/kling-video/v2/master/text-to-video';\n const start = Date.now();\n\n const response = await fal.subscribe(model, {\n input: {\n prompt: options.prompt,\n image_url: options.imageUrl,\n duration: options.duration,\n fps: options.fps,\n },\n });\n\n const video = (response.data as any)?.video;\n const pricing = this.pricingCache.get(model);\n\n return {\n url: video?.url ?? (response.data as any)?.video_url,\n provider: 'fal',\n model,\n modality: 'video',\n latencyMs: Date.now() - start,\n usage: {\n cost: pricing?.price ?? 0,\n unit: pricing?.unit ?? 'per_second',\n },\n media: {\n width: options.width,\n height: options.height,\n duration: options.duration,\n format: 'mp4',\n fps: options.fps,\n },\n };\n }\n\n async speak(options: SpeakOptions): Promise<NoosphereResult> {\n const model = options.model ?? 'fal-ai/kokoro/american-english';\n const start = Date.now();\n\n const response = await fal.run(model, {\n input: {\n text: options.text,\n voice: options.voice,\n speed: options.speed,\n },\n });\n\n const audioUrl = (response.data as any)?.audio_url ?? (response.data as any)?.audio?.url;\n const pricing = this.pricingCache.get(model);\n\n return {\n url: audioUrl,\n provider: 'fal',\n model,\n modality: 'tts',\n latencyMs: Date.now() - start,\n usage: {\n cost: pricing?.price ?? 0,\n input: options.text.length,\n unit: pricing?.unit ?? 'per_1k_chars',\n },\n media: {\n format: options.format ?? 'mp3',\n },\n };\n }\n\n private inferModality(modelId: string, unit: string): Modality {\n if (unit.includes('char') || modelId.includes('tts') || modelId.includes('kokoro') || modelId.includes('elevenlabs')) return 'tts';\n if (unit.includes('second') || modelId.includes('video') || modelId.includes('kling') || modelId.includes('sora') || modelId.includes('veo')) return 'video';\n return 'image';\n }\n}\n","// src/providers/comfyui.ts\nimport type { NoosphereProvider } from './base.js';\nimport type { Modality, ModelInfo, ImageOptions, VideoOptions, NoosphereResult } from '../types.js';\nimport { getProviderLogo } from '../logos.js';\n\ninterface ComfyUIConfig {\n host: string;\n port: number;\n}\n\nconst DEFAULT_TXT2IMG_WORKFLOW = {\n '3': {\n class_type: 'KSampler',\n inputs: {\n seed: 0, steps: 20, cfg: 7, sampler_name: 'euler',\n scheduler: 'normal', denoise: 1,\n model: ['4', 0], positive: ['6', 0], negative: ['7', 0], latent_image: ['5', 0],\n },\n },\n '4': { class_type: 'CheckpointLoaderSimple', inputs: { ckpt_name: 'sd_xl_base_1.0.safetensors' } },\n '5': { class_type: 'EmptyLatentImage', inputs: { width: 1024, height: 1024, batch_size: 1 } },\n '6': { class_type: 'CLIPTextEncode', inputs: { text: '', clip: ['4', 1] } },\n '7': { class_type: 'CLIPTextEncode', inputs: { text: '', clip: ['4', 1] } },\n '8': { class_type: 'VAEDecode', inputs: { samples: ['3', 0], vae: ['4', 2] } },\n '9': { class_type: 'SaveImage', inputs: { filename_prefix: 'noosphere', images: ['8', 0] } },\n};\n\nexport class ComfyUIProvider implements NoosphereProvider {\n readonly id = 'comfyui';\n readonly name = 'ComfyUI';\n readonly modalities: Modality[] = ['image', 'video'];\n readonly isLocal = true;\n\n private baseUrl: string;\n\n constructor(config: ComfyUIConfig) {\n this.baseUrl = `${config.host}:${config.port}`;\n }\n\n async ping(): Promise<boolean> {\n try {\n const res = await fetch(`${this.baseUrl}/system_stats`);\n return res.ok;\n } catch {\n return false;\n }\n }\n\n async listModels(modality?: Modality): Promise<ModelInfo[]> {\n const models: ModelInfo[] = [];\n const logo = getProviderLogo('comfyui');\n\n // Try to fetch installed models dynamically from ComfyUI\n try {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), 5000);\n try {\n const res = await fetch(`${this.baseUrl}/object_info`, { signal: controller.signal });\n if (res.ok) {\n const objectInfo = await res.json() as Record<string, any>;\n\n // Extract checkpoint models from CheckpointLoaderSimple\n const ckptNode = objectInfo?.['CheckpointLoaderSimple'];\n const ckptNames: string[] = ckptNode?.input?.required?.ckpt_name?.[0] ?? [];\n for (const name of ckptNames) {\n if (modality && modality !== 'image') continue;\n models.push({\n id: `comfyui-ckpt-${name}`, provider: 'comfyui', name: `ComfyUI: ${name}`,\n modality: 'image', local: true, cost: { price: 0, unit: 'free' }, logo,\n status: 'installed',\n localInfo: { sizeBytes: 0, runtime: 'comfyui' },\n capabilities: { maxWidth: 2048, maxHeight: 2048, supportsNegativePrompt: true },\n });\n }\n\n // Extract LoRA models\n const loraNode = objectInfo?.['LoraLoader'];\n const loraNames: string[] = loraNode?.input?.required?.lora_name?.[0] ?? [];\n for (const name of loraNames) {\n if (modality && modality !== 'image') continue;\n models.push({\n id: `comfyui-lora-${name}`, provider: 'comfyui', name: `LoRA: ${name}`,\n modality: 'image', local: true, cost: { price: 0, unit: 'free' }, logo,\n status: 'installed',\n localInfo: { sizeBytes: 0, runtime: 'comfyui' },\n });\n }\n }\n } finally {\n clearTimeout(timer);\n }\n } catch { /* ComfyUI not running or unreachable */ }\n\n // If no dynamic models found, add generic entries\n if (models.length === 0) {\n if (!modality || modality === 'image') {\n models.push({\n id: 'comfyui-txt2img', provider: 'comfyui', name: 'ComfyUI Text-to-Image',\n modality: 'image', local: true, cost: { price: 0, unit: 'free' }, logo,\n capabilities: { maxWidth: 2048, maxHeight: 2048, supportsNegativePrompt: true },\n });\n }\n if (!modality || modality === 'video') {\n models.push({\n id: 'comfyui-txt2vid', provider: 'comfyui', name: 'ComfyUI Text-to-Video',\n modality: 'video', local: true, cost: { price: 0, unit: 'free' }, logo,\n capabilities: { maxDuration: 10, supportsImageToVideo: true },\n });\n }\n }\n\n // Fetch CivitAI catalog (available models)\n if (!modality || modality === 'image') {\n try {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), 5000);\n try {\n const res = await fetch(\n 'https://civitai.com/api/v1/models?types=Checkpoint&sort=Highest%20Rated&limit=50&nsfw=false',\n { signal: controller.signal },\n );\n if (res.ok) {\n const data = await res.json() as { items?: any[] };\n for (const item of data.items ?? []) {\n const version = item.modelVersions?.[0];\n models.push({\n id: `civitai-${item.id}`, provider: 'comfyui',\n name: item.name ?? `CivitAI Model ${item.id}`,\n modality: 'image', local: true, cost: { price: 0, unit: 'free' }, logo,\n status: 'available',\n localInfo: {\n sizeBytes: version?.files?.[0]?.sizeKB ? version.files[0].sizeKB * 1024 : 0,\n runtime: 'comfyui',\n },\n });\n }\n }\n } finally {\n clearTimeout(timer);\n }\n } catch { /* CivitAI unreachable */ }\n }\n\n return models;\n }\n\n async image(options: ImageOptions): Promise<NoosphereResult> {\n const start = Date.now();\n const workflow = structuredClone(DEFAULT_TXT2IMG_WORKFLOW);\n\n // Inject prompt\n (workflow['6'] as any).inputs.text = options.prompt;\n (workflow['7'] as any).inputs.text = options.negativePrompt ?? '';\n (workflow['5'] as any).inputs.width = options.width ?? 1024;\n (workflow['5'] as any).inputs.height = options.height ?? 1024;\n if (options.seed !== undefined) (workflow['3'] as any).inputs.seed = options.seed;\n if (options.steps !== undefined) (workflow['3'] as any).inputs.steps = options.steps;\n if (options.guidanceScale !== undefined) (workflow['3'] as any).inputs.cfg = options.guidanceScale;\n\n // Queue prompt\n const queueRes = await fetch(`${this.baseUrl}/prompt`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ prompt: workflow }),\n });\n if (!queueRes.ok) throw new Error(`ComfyUI queue failed: ${queueRes.status}`);\n const { prompt_id } = await queueRes.json() as { prompt_id: string };\n\n // Poll for completion\n const imageData = await this.pollForResult(prompt_id);\n\n return {\n buffer: Buffer.from(imageData),\n provider: 'comfyui',\n model: options.model ?? 'comfyui-txt2img',\n modality: 'image',\n latencyMs: Date.now() - start,\n usage: { cost: 0, unit: 'free' },\n media: {\n width: options.width ?? 1024,\n height: options.height ?? 1024,\n format: 'png',\n },\n };\n }\n\n async video(_options: VideoOptions): Promise<NoosphereResult> {\n // TODO: Video workflow templates will be added when ComfyUI video nodes are configured\n throw new Error('ComfyUI video generation requires a configured AnimateDiff workflow');\n }\n\n private async pollForResult(promptId: string, maxWaitMs = 300000): Promise<ArrayBuffer> {\n const deadline = Date.now() + maxWaitMs;\n\n while (Date.now() < deadline) {\n const res = await fetch(`${this.baseUrl}/history/${promptId}`);\n if (!res.ok) {\n await new Promise((r) => setTimeout(r, 1000));\n continue;\n }\n\n const history = await res.json() as Record<string, any>;\n const entry = history[promptId];\n if (!entry?.outputs) {\n await new Promise((r) => setTimeout(r, 1000));\n continue;\n }\n\n // Find the SaveImage output node\n for (const nodeOutput of Object.values(entry.outputs) as any[]) {\n if (nodeOutput.images?.length > 0) {\n const img = nodeOutput.images[0];\n const imgRes = await fetch(\n `${this.baseUrl}/view?filename=${img.filename}&subfolder=${img.subfolder}&type=${img.type}`,\n );\n return imgRes.arrayBuffer();\n }\n }\n\n await new Promise((r) => setTimeout(r, 1000));\n }\n\n throw new Error(`ComfyUI generation timed out after ${maxWaitMs}ms`);\n }\n}\n","// src/providers/local-tts.ts\nimport type { NoosphereProvider } from './base.js';\nimport type { Modality, ModelInfo, SpeakOptions, NoosphereResult } from '../types.js';\nimport { getProviderLogo } from '../logos.js';\n\ninterface LocalTTSConfig {\n id: string;\n name: string;\n host: string;\n port: number;\n}\n\nexport class LocalTTSProvider implements NoosphereProvider {\n readonly id: string;\n readonly name: string;\n readonly modalities: Modality[] = ['tts'];\n readonly isLocal = true;\n\n private baseUrl: string;\n\n constructor(config: LocalTTSConfig) {\n this.id = config.id;\n this.name = config.name;\n this.baseUrl = `${config.host}:${config.port}`;\n }\n\n async ping(): Promise<boolean> {\n try {\n const res = await fetch(`${this.baseUrl}/health`);\n return res.ok;\n } catch {\n return false;\n }\n }\n\n async listModels(modality?: Modality): Promise<ModelInfo[]> {\n if (modality && modality !== 'tts') return [];\n\n try {\n // Try Piper-style /voices endpoint first (returns array directly)\n let voices: Array<{ id: string; name?: string }> = [];\n\n try {\n const res = await fetch(`${this.baseUrl}/voices`);\n if (res.ok) {\n const data = await res.json();\n if (Array.isArray(data)) {\n voices = data as Array<{ id: string; name?: string }>;\n }\n }\n } catch {\n // Fall back to OpenAI-compatible /v1/models endpoint\n const res = await fetch(`${this.baseUrl}/v1/models`);\n if (res.ok) {\n const data = await res.json() as { data?: Array<{ id: string }> };\n voices = data.data ?? [];\n }\n }\n\n const logo = getProviderLogo(this.id);\n return voices.map((v) => ({\n id: v.id,\n provider: this.id,\n name: v.name ?? v.id,\n modality: 'tts' as const,\n local: true,\n cost: { price: 0, unit: 'free' },\n logo,\n capabilities: { voices: voices.map((vv) => vv.id) },\n }));\n } catch {\n return [];\n }\n }\n\n async speak(options: SpeakOptions): Promise<NoosphereResult> {\n const start = Date.now();\n\n // OpenAI-compatible TTS endpoint\n const res = await fetch(`${this.baseUrl}/v1/audio/speech`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n model: options.model ?? 'tts-1',\n input: options.text,\n voice: options.voice ?? 'default',\n speed: options.speed ?? 1.0,\n response_format: options.format ?? 'mp3',\n }),\n });\n\n if (!res.ok) {\n throw new Error(`Local TTS failed: ${res.status} ${await res.text()}`);\n }\n\n const audioBuffer = Buffer.from(await res.arrayBuffer());\n\n return {\n buffer: audioBuffer,\n provider: this.id,\n model: options.model ?? options.voice ?? 'default',\n modality: 'tts',\n latencyMs: Date.now() - start,\n usage: {\n cost: 0,\n input: options.text.length,\n unit: 'characters',\n },\n media: {\n format: options.format ?? 'mp3',\n },\n };\n }\n}\n","// src/providers/huggingface.ts\nimport { HfInference } from '@huggingface/inference';\nimport type { NoosphereProvider } from './base.js';\nimport type {\n Modality, ModelInfo, ChatOptions, ImageOptions, SpeakOptions, NoosphereResult, ProviderLogo,\n} from '../types.js';\nimport { getProviderLogo } from '../logos.js';\n\nconst HF_HUB_API = 'https://huggingface.co/api/models';\nconst FETCH_TIMEOUT_MS = 10000;\n\n// Pipeline tag → Noosphere modality mapping\nconst PIPELINE_TAG_MAP: Record<string, { modality: Modality; limit: number }> = {\n 'text-generation': { modality: 'llm', limit: 50 },\n 'text-to-image': { modality: 'image', limit: 50 },\n 'text-to-speech': { modality: 'tts', limit: 30 },\n};\n\n\nexport class HuggingFaceProvider implements NoosphereProvider {\n readonly id = 'huggingface';\n readonly name = 'HuggingFace Inference';\n readonly modalities: Modality[] = ['image', 'tts', 'llm'];\n readonly isLocal = false;\n\n private client: HfInference;\n private token: string;\n private dynamicModels: ModelInfo[] | null = null;\n\n constructor(token: string) {\n this.token = token;\n this.client = new HfInference(token);\n }\n\n async ping(): Promise<boolean> {\n return true;\n }\n\n async listModels(modality?: Modality): Promise<ModelInfo[]> {\n // 100% dynamic — fetch from Hub API (once, cached after)\n if (!this.dynamicModels) {\n await this.fetchHubModels();\n }\n\n const all = this.dynamicModels ?? [];\n if (modality) return all.filter((m) => m.modality === modality);\n return all;\n }\n\n private async fetchHubModels(): Promise<void> {\n const seenIds = new Set<string>();\n const models: ModelInfo[] = [];\n\n // 100% dynamic — fetch trending models per pipeline_tag in parallel\n const fetches = Object.entries(PIPELINE_TAG_MAP).map(\n ([tag, { modality, limit }]) => this.fetchByPipelineTag(tag, modality, limit),\n );\n\n const results = await Promise.allSettled(fetches);\n\n for (const result of results) {\n if (result.status !== 'fulfilled') continue;\n for (const model of result.value) {\n if (seenIds.has(model.id)) continue;\n seenIds.add(model.id);\n models.push(model);\n }\n }\n\n this.dynamicModels = models;\n }\n\n private async fetchByPipelineTag(\n pipelineTag: string,\n modality: Modality,\n limit: number,\n ): Promise<ModelInfo[]> {\n try {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), FETCH_TIMEOUT_MS);\n\n try {\n const params = new URLSearchParams({\n pipeline_tag: pipelineTag,\n inference_provider: 'all',\n sort: 'trendingScore',\n limit: String(limit),\n 'expand[]': 'inferenceProviderMapping',\n });\n\n const res = await fetch(`${HF_HUB_API}?${params}`, {\n headers: this.token ? { Authorization: `Bearer ${this.token}` } : {},\n signal: controller.signal,\n });\n if (!res.ok) return [];\n\n const data = await res.json() as Array<{\n id?: string;\n modelId?: string;\n pipeline_tag?: string;\n likes?: number;\n downloads?: number;\n inferenceProviderMapping?: Array<{\n provider: string;\n providerId: string;\n status: string;\n providerDetails?: { context_length?: number; pricing?: { input?: number; output?: number } };\n }>;\n }>;\n\n return data\n .filter((entry) => entry.id || entry.modelId)\n .map((entry) => {\n const id = entry.id ?? entry.modelId!;\n const liveProviders = (entry.inferenceProviderMapping ?? [])\n .filter((p) => p.status === 'live');\n const providers = liveProviders.map((p) => p.provider);\n\n // Build per-inference-provider logos\n const inferenceProviderLogos: Record<string, ProviderLogo> = {};\n for (const p of liveProviders) {\n const pLogo = getProviderLogo(p.provider);\n if (pLogo) inferenceProviderLogos[p.provider] = pLogo;\n }\n\n // Try to extract pricing from first provider with pricing data\n const pricingProvider = (entry.inferenceProviderMapping ?? [])\n .find((p) => p.providerDetails?.pricing);\n const pricing = pricingProvider?.providerDetails?.pricing;\n const contextLength = (entry.inferenceProviderMapping ?? [])\n .find((p) => p.providerDetails?.context_length)?.providerDetails?.context_length;\n\n return {\n id,\n provider: 'huggingface',\n name: id.split('/').pop() ?? id,\n modality,\n local: false,\n cost: {\n price: pricing?.input ?? 0,\n unit: pricing ? 'per_1m_tokens' : 'free',\n },\n logo: getProviderLogo('huggingface'),\n capabilities: {\n ...(modality === 'llm' ? {\n contextWindow: contextLength,\n supportsStreaming: true,\n } : {}),\n ...(providers.length > 0 ? { inferenceProviders: providers } : {}),\n ...(Object.keys(inferenceProviderLogos).length > 0 ? { inferenceProviderLogos } : {}),\n },\n } as ModelInfo;\n });\n } finally {\n clearTimeout(timer);\n }\n } catch {\n return [];\n }\n }\n\n async chat(options: ChatOptions): Promise<NoosphereResult> {\n const start = Date.now();\n const model = options.model ?? 'meta-llama/Llama-3.1-8B-Instruct';\n\n const response = await this.client.chatCompletion({\n model,\n messages: options.messages,\n temperature: options.temperature,\n max_tokens: options.maxTokens,\n });\n\n const choice = response.choices?.[0];\n const usage = response.usage;\n\n return {\n content: choice?.message?.content ?? '',\n provider: 'huggingface',\n model,\n modality: 'llm',\n latencyMs: Date.now() - start,\n usage: {\n cost: 0,\n input: usage?.prompt_tokens,\n output: usage?.completion_tokens,\n unit: 'tokens',\n },\n };\n }\n\n async image(options: ImageOptions): Promise<NoosphereResult> {\n const start = Date.now();\n const model = options.model ?? 'stabilityai/stable-diffusion-xl-base-1.0';\n\n const blob = await this.client.textToImage({\n model,\n inputs: options.prompt,\n parameters: {\n negative_prompt: options.negativePrompt,\n width: options.width,\n height: options.height,\n guidance_scale: options.guidanceScale,\n num_inference_steps: options.steps,\n },\n }, { outputType: 'blob' });\n\n const buffer = Buffer.from(await blob.arrayBuffer());\n\n return {\n buffer,\n provider: 'huggingface',\n model,\n modality: 'image',\n latencyMs: Date.now() - start,\n usage: { cost: 0, unit: 'free' },\n media: {\n width: options.width ?? 1024,\n height: options.height ?? 1024,\n format: 'png',\n },\n };\n }\n\n async speak(options: SpeakOptions): Promise<NoosphereResult> {\n const start = Date.now();\n const model = options.model ?? 'facebook/mms-tts-eng';\n\n const blob = await this.client.textToSpeech({\n model,\n inputs: options.text,\n });\n\n const buffer = Buffer.from(await blob.arrayBuffer());\n\n return {\n buffer,\n provider: 'huggingface',\n model,\n modality: 'tts',\n latencyMs: Date.now() - start,\n usage: {\n cost: 0,\n input: options.text.length,\n unit: 'characters',\n },\n media: { format: 'wav' },\n };\n }\n}\n","// src/providers/ollama.ts\nimport type { NoosphereProvider } from './base.js';\nimport type {\n Modality, ModelInfo, ChatOptions, NoosphereResult, NoosphereStream, StreamEvent,\n} from '../types.js';\nimport { getProviderLogo } from '../logos.js';\n\n// --- Ollama-specific types ---\n\nexport interface OllamaPullProgress {\n status: string;\n digest?: string;\n total?: number;\n completed?: number;\n}\n\nexport interface OllamaModelDetail {\n modelfile: string;\n parameters: string;\n template: string;\n details: {\n parent_model: string;\n format: string;\n family: string;\n families: string[];\n parameter_size: string;\n quantization_level: string;\n };\n}\n\nexport interface OllamaRunningModel {\n name: string;\n model: string;\n size: number;\n digest: string;\n expires_at: string;\n size_vram: number;\n}\n\n// --- Family → logo provider map ---\n\nconst OLLAMA_FAMILY_TO_PROVIDER: Record<string, string> = {\n 'llama': 'meta', 'codellama': 'meta',\n 'gemma': 'google', 'gemma2': 'google', 'gemma3': 'google',\n 'qwen': 'qwen', 'qwen2': 'qwen', 'qwen2.5': 'qwen', 'qwen3': 'qwen',\n 'deepseek': 'deepseek', 'deepcoder': 'deepseek', 'deepscaler': 'deepseek',\n 'qwq': 'qwen',\n 'phi': 'microsoft', 'phi3': 'microsoft', 'phi4': 'microsoft',\n 'mistral': 'mistral', 'mixtral': 'mistral', 'codestral': 'mistral', 'ministral': 'mistral',\n 'nemotron': 'nvidia',\n 'command': 'cohere', 'command-r': 'cohere',\n 'gpt-oss': 'openai',\n 'starcoder': 'huggingface',\n 'falcon': 'meta',\n 'glm': 'zai',\n 'granite': 'ibm',\n 'olmo': 'meta',\n 'yi': 'zai',\n 'minimax': 'minimax',\n 'kimi': 'meta',\n 'dolphin': 'ollama',\n 'wizard': 'ollama',\n 'nomic': 'ollama',\n 'mxbai': 'ollama',\n 'bge': 'ollama',\n 'all-minilm': 'ollama',\n 'moondream': 'ollama',\n};\n\nconst VISION_MODELS = new Set([\n 'llava', 'moondream', 'minicpm-v', 'llama3.2-vision', 'qwen2.5vl', 'gemma3',\n 'llava-llama3', 'llava-phi3', 'bakllava',\n]);\n\nfunction inferLogoProvider(modelName: string, _family?: string): string {\n // Strip namespace (e.g. \"artifish/llama3.2-uncensored\" → \"llama3.2-uncensored\")\n const base = modelName.split(':')[0].toLowerCase().replace(/^[^/]+\\//, '');\n \n // Try model name prefix — longest match first to avoid \"llama\" matching \"llava\"\n const sortedPrefixes = Object.entries(OLLAMA_FAMILY_TO_PROVIDER)\n .sort((a, b) => b[0].length - a[0].length);\n for (const [prefix, provider] of sortedPrefixes) {\n if (base === prefix || base.startsWith(prefix)) return provider;\n }\n \n // NOTE: We intentionally do NOT use the `family` field from Ollama API\n // because it represents the model architecture (e.g. qwen2), not the org.\n // deepseek-r1 has family \"qwen2\", mistral has family \"llama\", etc.\n \n return 'ollama';\n}\n\nfunction supportsVision(modelName: string): boolean {\n const base = modelName.split(':')[0].toLowerCase();\n for (const v of VISION_MODELS) {\n if (base === v || base.startsWith(v)) return true;\n }\n return false;\n}\n\nasync function fetchJson(url: string, options?: RequestInit & { timeoutMs?: number }): Promise<any> {\n const timeoutMs = options?.timeoutMs ?? 5000;\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n try {\n const res = await fetch(url, { ...options, signal: controller.signal });\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n return await res.json();\n } finally {\n clearTimeout(timer);\n }\n}\n\nexport class OllamaProvider implements NoosphereProvider {\n readonly id = 'ollama';\n readonly name = 'Ollama (Local)';\n readonly modalities: Modality[] = ['llm'];\n readonly isLocal = true;\n\n private baseUrl: string;\n\n constructor(config?: { host?: string; port?: number }) {\n const host = config?.host ?? 'http://localhost';\n const port = config?.port ?? 11434;\n // Build base URL: strip trailing slash, append port if not already in URL\n const cleanHost = host.replace(/\\/+$/, '');\n // Check if host already has a port (after the protocol part)\n const hasPort = /:\\d+$/.test(cleanHost);\n this.baseUrl = hasPort ? cleanHost : `${cleanHost}:${port}`;\n }\n\n async ping(): Promise<boolean> {\n try {\n await fetchJson(`${this.baseUrl}/api/version`, { timeoutMs: 2000 });\n return true;\n } catch {\n return false;\n }\n }\n\n async listModels(_modality?: Modality): Promise<ModelInfo[]> {\n if (_modality && _modality !== 'llm') return [];\n\n // Fetch all three sources in parallel, fail silently\n const [localData, catalogData, runningData] = await Promise.all([\n fetchJson(`${this.baseUrl}/api/tags`, { timeoutMs: 5000 }).catch(() => null),\n fetchJson('https://ollama.com/api/tags', { timeoutMs: 5000 }).catch(() => null),\n fetchJson(`${this.baseUrl}/api/ps`, { timeoutMs: 5000 }).catch(() => null),\n ]);\n\n const runningNames = new Set<string>();\n if (runningData?.models) {\n for (const m of runningData.models) {\n runningNames.add(m.name);\n // Also add without tag for matching\n runningNames.add(m.model);\n }\n }\n\n const models = new Map<string, ModelInfo>();\n\n // Local installed models\n if (localData?.models) {\n for (const m of localData.models) {\n const isRunning = runningNames.has(m.name) || runningNames.has(m.model);\n models.set(m.name, this.toModelInfo(m, isRunning ? 'running' : 'installed', true));\n }\n }\n\n // Web catalog models (only add if not already installed)\n if (catalogData?.models) {\n for (const m of catalogData.models) {\n const name = m.name;\n if (!models.has(name)) {\n models.set(name, this.toModelInfo(m, 'available', false));\n }\n }\n }\n\n return Array.from(models.values());\n }\n\n private toModelInfo(\n m: any,\n status: 'installed' | 'available' | 'running',\n isLocal: boolean,\n ): ModelInfo {\n const name = m.name ?? m.model ?? 'unknown';\n const family = m.details?.family;\n const logoProvider = inferLogoProvider(name, family);\n\n return {\n id: name,\n provider: 'ollama',\n name,\n modality: 'llm',\n local: true,\n cost: { price: 0, unit: 'free' },\n logo: getProviderLogo(logoProvider),\n status,\n localInfo: {\n sizeBytes: m.size ?? 0,\n family: family ?? m.details?.family,\n parameterSize: m.details?.parameter_size,\n quantization: m.details?.quantization_level,\n format: m.details?.format,\n digest: m.digest,\n modifiedAt: m.modified_at,\n running: status === 'running',\n runtime: 'ollama',\n },\n capabilities: {\n contextWindow: 128000,\n supportsVision: supportsVision(name),\n supportsStreaming: true,\n },\n };\n }\n\n async chat(options: ChatOptions): Promise<NoosphereResult> {\n const start = Date.now();\n const messages = options.messages.map((m) => ({\n role: m.role,\n content: m.content,\n }));\n\n const body: any = {\n model: options.model ?? 'llama3.2',\n messages,\n stream: false,\n };\n if (options.temperature !== undefined || options.maxTokens !== undefined) {\n body.options = {};\n if (options.temperature !== undefined) body.options.temperature = options.temperature;\n if (options.maxTokens !== undefined) body.options.num_predict = options.maxTokens;\n }\n\n const res = await fetch(`${this.baseUrl}/api/chat`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n });\n\n if (!res.ok) {\n throw new Error(`Ollama chat failed: ${res.status} ${await res.text()}`);\n }\n\n const data: any = await res.json();\n return {\n content: data.message?.content ?? '',\n provider: 'ollama',\n model: options.model ?? 'llama3.2',\n modality: 'llm',\n latencyMs: Date.now() - start,\n usage: {\n cost: 0,\n input: data.prompt_eval_count ?? 0,\n output: data.eval_count ?? 0,\n unit: 'tokens',\n },\n };\n }\n\n stream(options: ChatOptions): NoosphereStream {\n const self = this;\n const start = Date.now();\n let aborted = false;\n let resolveResult: ((r: NoosphereResult) => void) | null = null;\n let rejectResult: ((e: Error) => void) | null = null;\n const resultPromise = new Promise<NoosphereResult>((resolve, reject) => {\n resolveResult = resolve;\n rejectResult = reject;\n });\n\n const messages = options.messages.map((m) => ({\n role: m.role,\n content: m.content,\n }));\n\n const body: any = {\n model: options.model ?? 'llama3.2',\n messages,\n stream: true,\n };\n if (options.temperature !== undefined || options.maxTokens !== undefined) {\n body.options = {};\n if (options.temperature !== undefined) body.options.temperature = options.temperature;\n if (options.maxTokens !== undefined) body.options.num_predict = options.maxTokens;\n }\n\n const asyncIterator: AsyncIterable<StreamEvent> = {\n async *[Symbol.asyncIterator]() {\n try {\n const res = await fetch(`${self.baseUrl}/api/chat`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n });\n\n if (!res.ok) {\n throw new Error(`Ollama stream failed: ${res.status} ${await res.text()}`);\n }\n\n const reader = res.body!.getReader();\n const decoder = new TextDecoder();\n let fullContent = '';\n let finalData: any = null;\n let buffer = '';\n\n while (!aborted) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() ?? '';\n\n for (const line of lines) {\n if (!line.trim()) continue;\n try {\n const chunk = JSON.parse(line);\n if (chunk.message?.content) {\n fullContent += chunk.message.content;\n yield { type: 'text_delta', delta: chunk.message.content };\n }\n if (chunk.done) {\n finalData = chunk;\n }\n } catch {\n // skip malformed JSON\n }\n }\n }\n\n const result: NoosphereResult = {\n content: fullContent,\n provider: 'ollama',\n model: options.model ?? 'llama3.2',\n modality: 'llm',\n latencyMs: Date.now() - start,\n usage: {\n cost: 0,\n input: finalData?.prompt_eval_count ?? 0,\n output: finalData?.eval_count ?? 0,\n unit: 'tokens',\n },\n };\n\n resolveResult?.(result);\n yield { type: 'done', result };\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n rejectResult?.(error);\n yield { type: 'error', error };\n }\n },\n };\n\n return {\n [Symbol.asyncIterator]: () => asyncIterator[Symbol.asyncIterator](),\n result: () => resultPromise,\n abort: () => { aborted = true; },\n };\n }\n\n // --- Extra model management methods ---\n\n async *pullModel(name: string): AsyncGenerator<OllamaPullProgress> {\n const res = await fetch(`${this.baseUrl}/api/pull`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ name, stream: true }),\n });\n\n if (!res.ok) {\n throw new Error(`Ollama pull failed: ${res.status} ${await res.text()}`);\n }\n\n const reader = res.body!.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() ?? '';\n for (const line of lines) {\n if (!line.trim()) continue;\n try {\n yield JSON.parse(line) as OllamaPullProgress;\n } catch { /* skip */ }\n }\n }\n }\n\n async deleteModel(name: string): Promise<void> {\n const res = await fetch(`${this.baseUrl}/api/delete`, {\n method: 'DELETE',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ name }),\n });\n if (!res.ok) {\n throw new Error(`Ollama delete failed: ${res.status} ${await res.text()}`);\n }\n }\n\n async showModel(name: string): Promise<OllamaModelDetail> {\n const res = await fetch(`${this.baseUrl}/api/show`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ name }),\n });\n if (!res.ok) {\n throw new Error(`Ollama show failed: ${res.status} ${await res.text()}`);\n }\n return await res.json() as OllamaModelDetail;\n }\n\n async getRunningModels(): Promise<OllamaRunningModel[]> {\n const data = await fetchJson(`${this.baseUrl}/api/ps`, { timeoutMs: 5000 });\n return data?.models ?? [];\n }\n}\n","// src/providers/hf-local.ts\nimport type { NoosphereProvider } from './base.js';\nimport type { Modality, ModelInfo } from '../types.js';\nimport { getProviderLogo } from '../logos.js';\nimport { readdir, readFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\n\nconst FETCH_TIMEOUT_MS = 5000;\nconst HF_HUB_API = 'https://huggingface.co/api/models';\n\nconst PIPELINE_TAG_TO_MODALITY: Record<string, Modality> = {\n 'text-to-image': 'image',\n 'text-to-video': 'video',\n 'text-to-audio': 'tts',\n 'text-to-speech': 'tts',\n 'automatic-speech-recognition': 'stt',\n};\n\nconst CATALOG_QUERIES: Array<{ pipeline_tag: string; limit: number; library?: string }> = [\n { pipeline_tag: 'text-to-image', limit: 50 },\n { pipeline_tag: 'text-to-video', limit: 30 },\n { pipeline_tag: 'text-to-audio', limit: 30 },\n { pipeline_tag: 'text-to-speech', limit: 30 },\n { pipeline_tag: 'automatic-speech-recognition', limit: 30 },\n { pipeline_tag: 'text-to-image', limit: 100, library: 'diffusers' },\n];\n\nasync function fetchJsonTimeout(url: string, timeoutMs = FETCH_TIMEOUT_MS): Promise<any> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n try {\n const res = await fetch(url, { signal: controller.signal });\n if (!res.ok) return null;\n return await res.json();\n } catch {\n return null;\n } finally {\n clearTimeout(timer);\n }\n}\n\nexport class HfLocalProvider implements NoosphereProvider {\n readonly id = 'hf-local';\n readonly name = 'HuggingFace Local Models';\n readonly modalities: Modality[] = ['image', 'video', 'tts', 'stt'];\n readonly isLocal = true;\n\n private cachedModels: ModelInfo[] | null = null;\n\n async ping(): Promise<boolean> {\n return true;\n }\n\n async listModels(modality?: Modality): Promise<ModelInfo[]> {\n if (!this.cachedModels) {\n const [catalog, installed] = await Promise.all([\n this.fetchCatalog(),\n this.scanLocalCache(),\n ]);\n\n // Merge: installed models override catalog entries\n const modelMap = new Map<string, ModelInfo>();\n for (const m of catalog) modelMap.set(m.id, m);\n for (const m of installed) modelMap.set(m.id, m);\n this.cachedModels = Array.from(modelMap.values());\n }\n\n if (modality) return this.cachedModels.filter((m) => m.modality === modality);\n return this.cachedModels;\n }\n\n private async fetchCatalog(): Promise<ModelInfo[]> {\n const seen = new Set<string>();\n const models: ModelInfo[] = [];\n const logo = getProviderLogo('huggingface');\n\n const results = await Promise.allSettled(\n CATALOG_QUERIES.map(async (q) => {\n const params = new URLSearchParams({\n pipeline_tag: q.pipeline_tag,\n sort: 'downloads',\n limit: String(q.limit),\n });\n if (q.library) params.set('library', q.library);\n return fetchJsonTimeout(`${HF_HUB_API}?${params}`);\n }),\n );\n\n for (const result of results) {\n if (result.status !== 'fulfilled' || !Array.isArray(result.value)) continue;\n for (const entry of result.value) {\n const id = entry.id ?? entry.modelId;\n if (!id || seen.has(id)) continue;\n seen.add(id);\n\n const pipelineTag = entry.pipeline_tag ?? '';\n const modality = PIPELINE_TAG_TO_MODALITY[pipelineTag] ?? 'image';\n\n models.push({\n id,\n provider: 'hf-local',\n name: id.split('/').pop() ?? id,\n modality,\n local: true,\n cost: { price: 0, unit: 'free' },\n logo,\n status: 'available',\n localInfo: {\n sizeBytes: 0,\n runtime: 'huggingface',\n family: entry.library_name,\n },\n capabilities: {},\n });\n }\n }\n\n return models;\n }\n\n private async scanLocalCache(): Promise<ModelInfo[]> {\n const models: ModelInfo[] = [];\n const cacheDir = join(homedir(), '.cache', 'huggingface', 'hub');\n const logo = getProviderLogo('huggingface');\n\n try {\n const entries = await readdir(cacheDir, { withFileTypes: true });\n for (const entry of entries) {\n if (!entry.isDirectory() || !entry.name.startsWith('models--')) continue;\n\n // Parse \"models--org--name\" → \"org/name\"\n const parts = entry.name.replace('models--', '').split('--');\n const modelId = parts.join('/');\n const modelDir = join(cacheDir, entry.name);\n\n // Read refs/main to get snapshot hash\n let snapshotHash: string | undefined;\n try {\n snapshotHash = (await readFile(join(modelDir, 'refs', 'main'), 'utf-8')).trim();\n } catch { continue; }\n\n // Try to detect pipeline from model_index.json or config.json\n let pipelineTag = '';\n const snapshotDir = join(modelDir, 'snapshots', snapshotHash!);\n try {\n const modelIndex = JSON.parse(await readFile(join(snapshotDir, 'model_index.json'), 'utf-8'));\n if (modelIndex._class_name?.includes('Stable') || modelIndex._class_name?.includes('Flux')) {\n pipelineTag = 'text-to-image';\n } else if (modelIndex._class_name?.includes('Video') || modelIndex._class_name?.includes('Animate')) {\n pipelineTag = 'text-to-video';\n }\n } catch {\n try {\n const config = JSON.parse(await readFile(join(snapshotDir, 'config.json'), 'utf-8'));\n if (config.task_specific_params?.['text-to-image']) pipelineTag = 'text-to-image';\n else if (config.model_type?.includes('whisper')) pipelineTag = 'automatic-speech-recognition';\n } catch { /* skip */ }\n }\n\n const modality = PIPELINE_TAG_TO_MODALITY[pipelineTag] ?? 'image';\n\n models.push({\n id: modelId,\n provider: 'hf-local',\n name: modelId.split('/').pop() ?? modelId,\n modality,\n local: true,\n cost: { price: 0, unit: 'free' },\n logo,\n status: 'installed',\n localInfo: {\n sizeBytes: 0,\n runtime: 'huggingface',\n diskPath: snapshotDir,\n },\n });\n }\n } catch { /* cache dir doesn't exist */ }\n\n return models;\n }\n}\n","// src/providers/whisper-local.ts\nimport type { NoosphereProvider } from './base.js';\nimport type { Modality, ModelInfo } from '../types.js';\nimport type { TranscriptionOptions, TranscriptionResult } from '../types.js';\nimport { getProviderLogo } from '../logos.js';\nimport { execFile } from 'node:child_process';\nimport { access } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\n\nconst WHISPER_MODELS = ['tiny', 'base', 'small', 'medium', 'large', 'large-v2', 'large-v3', 'turbo'];\n\nfunction runPython(code: string, timeoutMs = 5000): Promise<string> {\n return new Promise((resolve, reject) => {\n const proc = execFile('python3', ['-c', code], { timeout: timeoutMs }, (err, stdout) => {\n if (err) reject(err);\n else resolve(stdout.trim());\n });\n });\n}\n\nasync function fileExists(path: string): Promise<boolean> {\n try { await access(path); return true; } catch { return false; }\n}\n\nexport class WhisperLocalProvider implements NoosphereProvider {\n readonly id = 'whisper-local';\n readonly name = 'Whisper (Local)';\n readonly modalities: Modality[] = ['stt'];\n readonly isLocal = true;\n\n private runtime: 'whisper' | 'faster-whisper' | null = null;\n\n async ping(): Promise<boolean> {\n return (await this.detectRuntime()) !== null;\n }\n\n private async detectRuntime(): Promise<'whisper' | 'faster-whisper' | null> {\n if (this.runtime) return this.runtime;\n try {\n await runPython('import faster_whisper; print(\"ok\")');\n this.runtime = 'faster-whisper';\n return this.runtime;\n } catch { /* not installed */ }\n try {\n await runPython('import whisper; print(whisper.__version__)');\n this.runtime = 'whisper';\n return this.runtime;\n } catch { /* not installed */ }\n return null;\n }\n\n async listModels(_modality?: Modality): Promise<ModelInfo[]> {\n if (_modality && _modality !== 'stt') return [];\n\n const runtime = await this.detectRuntime();\n if (!runtime) return [];\n\n const logo = getProviderLogo('huggingface');\n const models: ModelInfo[] = [];\n\n for (const name of WHISPER_MODELS) {\n const installed = await this.isModelCached(name, runtime);\n models.push({\n id: `whisper-${name}`,\n provider: 'whisper-local',\n name: `Whisper ${name}`,\n modality: 'stt',\n local: true,\n cost: { price: 0, unit: 'free' },\n logo,\n status: installed ? 'installed' : 'available',\n localInfo: {\n sizeBytes: 0,\n runtime,\n },\n });\n }\n\n return models;\n }\n\n private async isModelCached(name: string, runtime: string): Promise<boolean> {\n if (runtime === 'whisper') {\n return fileExists(join(homedir(), '.cache', 'whisper', `${name}.pt`));\n }\n // faster-whisper uses HF cache\n const hfDir = join(homedir(), '.cache', 'huggingface', 'hub', `models--Systran--faster-whisper-${name}`);\n return fileExists(hfDir);\n }\n\n async transcribe(options: TranscriptionOptions): Promise<TranscriptionResult> {\n const runtime = await this.detectRuntime();\n if (!runtime) throw new Error('Whisper is not installed');\n\n const model = options.model?.replace('whisper-', '') ?? 'base';\n const lang = options.language ? `--language ${options.language}` : '';\n const task = options.task ?? 'transcribe';\n\n if (runtime === 'faster-whisper') {\n const code = `\nimport json, sys\nfrom faster_whisper import WhisperModel\nmodel = WhisperModel(\"${model}\")\nsegments, info = model.transcribe(\"${options.audio}\", task=\"${task}\"${options.language ? `, language=\"${options.language}\"` : ''})\nsegs = [{\"start\": s.start, \"end\": s.end, \"text\": s.text} for s in segments]\nprint(json.dumps({\"text\": \" \".join(s[\"text\"] for s in segs), \"language\": info.language, \"duration\": info.duration, \"segments\": segs}))\n`;\n const output = await runPython(code, 120000);\n return JSON.parse(output);\n } else {\n const code = `\nimport json, whisper\nmodel = whisper.load_model(\"${model}\")\nresult = model.transcribe(\"${options.audio}\", task=\"${task}\"${options.language ? `, language=\"${options.language}\"` : ''})\nsegs = [{\"start\": s[\"start\"], \"end\": s[\"end\"], \"text\": s[\"text\"]} for s in result.get(\"segments\", [])]\nprint(json.dumps({\"text\": result[\"text\"], \"language\": result.get(\"language\", \"\"), \"duration\": 0, \"segments\": segs}))\n`;\n const output = await runPython(code, 120000);\n return JSON.parse(output);\n }\n }\n}\n","// src/providers/audiocraft.ts\nimport type { NoosphereProvider } from './base.js';\nimport type { Modality, ModelInfo } from '../types.js';\nimport { getProviderLogo } from '../logos.js';\nimport { execFile } from 'node:child_process';\nimport { access } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\n\nconst AUDIOCRAFT_MODELS = [\n { id: 'musicgen-small', name: 'MusicGen Small' },\n { id: 'musicgen-medium', name: 'MusicGen Medium' },\n { id: 'musicgen-large', name: 'MusicGen Large' },\n { id: 'musicgen-melody', name: 'MusicGen Melody' },\n { id: 'audiogen-medium', name: 'AudioGen Medium' },\n];\n\nfunction runPython(code: string, timeoutMs = 5000): Promise<string> {\n return new Promise((resolve, reject) => {\n execFile('python3', ['-c', code], { timeout: timeoutMs }, (err, stdout) => {\n if (err) reject(err);\n else resolve(stdout.trim());\n });\n });\n}\n\nasync function fileExists(path: string): Promise<boolean> {\n try { await access(path); return true; } catch { return false; }\n}\n\nexport class AudioCraftProvider implements NoosphereProvider {\n readonly id = 'audiocraft';\n readonly name = 'AudioCraft (Local)';\n readonly modalities: Modality[] = ['music'];\n readonly isLocal = true;\n\n private detected: boolean | null = null;\n\n async ping(): Promise<boolean> {\n if (this.detected !== null) return this.detected;\n try {\n await runPython('import audiocraft; print(\"ok\")');\n this.detected = true;\n } catch {\n this.detected = false;\n }\n return this.detected;\n }\n\n async listModels(_modality?: Modality): Promise<ModelInfo[]> {\n if (_modality && _modality !== 'music') return [];\n if (!(await this.ping())) return [];\n\n const logo = getProviderLogo('meta');\n const models: ModelInfo[] = [];\n\n for (const m of AUDIOCRAFT_MODELS) {\n const hfDir = join(homedir(), '.cache', 'huggingface', 'hub', `models--facebook--${m.id}`);\n const installed = await fileExists(hfDir);\n\n models.push({\n id: m.id,\n provider: 'audiocraft',\n name: m.name,\n modality: 'music',\n local: true,\n cost: { price: 0, unit: 'free' },\n logo,\n status: installed ? 'installed' : 'available',\n localInfo: {\n sizeBytes: 0,\n runtime: 'audiocraft',\n },\n });\n }\n\n return models;\n }\n}\n","// src/providers/openai-compat.ts\nimport type { NoosphereProvider } from './base.js';\nimport type {\n Modality, ModelInfo, ChatOptions, NoosphereResult, NoosphereStream, StreamEvent,\n} from '../types.js';\nimport { getProviderLogo } from '../logos.js';\n\nconst FETCH_TIMEOUT_MS = 5000;\n\nexport interface OpenAICompatConfig {\n baseUrl: string;\n apiKey?: string;\n name?: string;\n id?: string;\n}\n\n// Common local server ports and their names\nexport const KNOWN_LOCAL_SERVERS: Array<{ port: number; name: string; id: string }> = [\n { port: 8080, name: 'llama.cpp / LocalAI', id: 'llamacpp' },\n { port: 1234, name: 'LM Studio', id: 'lmstudio' },\n { port: 8000, name: 'vLLM', id: 'vllm' },\n { port: 5000, name: 'TabbyAPI', id: 'tabbyapi' },\n { port: 5001, name: 'KoboldCpp', id: 'koboldcpp' },\n { port: 1337, name: 'Jan', id: 'jan' },\n];\n\nasync function fetchJsonTimeout(url: string, headers?: Record<string, string>, timeoutMs = FETCH_TIMEOUT_MS): Promise<any> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n try {\n const res = await fetch(url, { signal: controller.signal, headers });\n if (!res.ok) return null;\n return await res.json();\n } catch {\n return null;\n } finally {\n clearTimeout(timer);\n }\n}\n\nexport class OpenAICompatProvider implements NoosphereProvider {\n readonly id: string;\n readonly name: string;\n readonly modalities: Modality[] = ['llm'];\n readonly isLocal = true;\n\n private baseUrl: string;\n private headers: Record<string, string>;\n\n constructor(config: OpenAICompatConfig) {\n this.baseUrl = config.baseUrl.replace(/\\/+$/, '');\n this.id = config.id ?? `openai-compat-${new URL(config.baseUrl).port}`;\n this.name = config.name ?? `OpenAI-Compatible (${this.baseUrl})`;\n this.headers = { 'Content-Type': 'application/json' };\n if (config.apiKey) {\n this.headers['Authorization'] = `Bearer ${config.apiKey}`;\n }\n }\n\n async ping(): Promise<boolean> {\n const data = await fetchJsonTimeout(`${this.baseUrl}/v1/models`, this.headers, 2000);\n return data !== null;\n }\n\n async listModels(_modality?: Modality): Promise<ModelInfo[]> {\n if (_modality && _modality !== 'llm') return [];\n\n const data = await fetchJsonTimeout(`${this.baseUrl}/v1/models`, this.headers);\n if (!data?.data || !Array.isArray(data.data)) return [];\n\n const logo = getProviderLogo('openai');\n return data.data.map((m: any) => ({\n id: m.id,\n provider: this.id,\n name: m.id,\n modality: 'llm' as const,\n local: true,\n cost: { price: 0, unit: 'free' },\n logo,\n status: 'running' as const,\n localInfo: {\n sizeBytes: 0,\n runtime: this.id,\n },\n capabilities: {\n supportsStreaming: true,\n },\n }));\n }\n\n async chat(options: ChatOptions): Promise<NoosphereResult> {\n const start = Date.now();\n const model = options.model ?? 'default';\n\n const body: any = {\n model,\n messages: options.messages,\n stream: false,\n };\n if (options.temperature !== undefined) body.temperature = options.temperature;\n if (options.maxTokens !== undefined) body.max_tokens = options.maxTokens;\n if (options.jsonMode) body.response_format = { type: 'json_object' };\n\n const res = await fetch(`${this.baseUrl}/v1/chat/completions`, {\n method: 'POST',\n headers: this.headers,\n body: JSON.stringify(body),\n });\n\n if (!res.ok) throw new Error(`OpenAI-compat chat failed: ${res.status} ${await res.text()}`);\n\n const data = await res.json() as any;\n const choice = data.choices?.[0];\n\n return {\n content: choice?.message?.content ?? '',\n provider: this.id,\n model,\n modality: 'llm',\n latencyMs: Date.now() - start,\n usage: {\n cost: 0,\n input: data.usage?.prompt_tokens ?? 0,\n output: data.usage?.completion_tokens ?? 0,\n unit: 'tokens',\n },\n };\n }\n\n stream(options: ChatOptions): NoosphereStream {\n const self = this;\n const start = Date.now();\n let aborted = false;\n let resolveResult: ((r: NoosphereResult) => void) | null = null;\n let rejectResult: ((e: Error) => void) | null = null;\n const resultPromise = new Promise<NoosphereResult>((resolve, reject) => {\n resolveResult = resolve;\n rejectResult = reject;\n });\n\n const model = options.model ?? 'default';\n const body: any = {\n model,\n messages: options.messages,\n stream: true,\n };\n if (options.temperature !== undefined) body.temperature = options.temperature;\n if (options.maxTokens !== undefined) body.max_tokens = options.maxTokens;\n\n const asyncIterator: AsyncIterable<StreamEvent> = {\n async *[Symbol.asyncIterator]() {\n try {\n const res = await fetch(`${self.baseUrl}/v1/chat/completions`, {\n method: 'POST',\n headers: self.headers,\n body: JSON.stringify(body),\n });\n\n if (!res.ok) throw new Error(`Stream failed: ${res.status} ${await res.text()}`);\n\n const reader = res.body!.getReader();\n const decoder = new TextDecoder();\n let fullContent = '';\n let buffer = '';\n\n while (!aborted) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() ?? '';\n\n for (const line of lines) {\n if (!line.startsWith('data: ') || line === 'data: [DONE]') continue;\n try {\n const chunk = JSON.parse(line.slice(6));\n const delta = chunk.choices?.[0]?.delta?.content;\n if (delta) {\n fullContent += delta;\n yield { type: 'text_delta', delta };\n }\n } catch { /* skip */ }\n }\n }\n\n const result: NoosphereResult = {\n content: fullContent,\n provider: self.id,\n model,\n modality: 'llm',\n latencyMs: Date.now() - start,\n usage: { cost: 0, unit: 'tokens' },\n };\n\n resolveResult?.(result);\n yield { type: 'done', result };\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n rejectResult?.(error);\n yield { type: 'error', error };\n }\n },\n };\n\n return {\n [Symbol.asyncIterator]: () => asyncIterator[Symbol.asyncIterator](),\n result: () => resultPromise,\n abort: () => { aborted = true; },\n };\n }\n}\n\n/** Auto-detect running OpenAI-compatible servers on common ports */\nexport async function detectOpenAICompatServers(): Promise<OpenAICompatProvider[]> {\n const providers: OpenAICompatProvider[] = [];\n\n const results = await Promise.allSettled(\n KNOWN_LOCAL_SERVERS.map(async (server) => {\n const baseUrl = `http://localhost:${server.port}`;\n const provider = new OpenAICompatProvider({\n baseUrl,\n name: server.name,\n id: server.id,\n });\n const ok = await provider.ping();\n if (ok) return provider;\n return null;\n }),\n );\n\n for (const result of results) {\n if (result.status === 'fulfilled' && result.value) {\n providers.push(result.value);\n }\n }\n\n return providers;\n}\n","// src/noosphere.ts\nimport type {\n NoosphereConfig,\n ChatOptions,\n ImageOptions,\n VideoOptions,\n SpeakOptions,\n NoosphereResult,\n NoosphereStream,\n StreamEvent,\n ModelInfo,\n ProviderInfo,\n UsageEvent,\n UsageQueryOptions,\n UsageSummary,\n SyncResult,\n Modality,\n} from './types.js';\nimport { NoosphereError } from './errors.js';\nimport { resolveConfig, type ResolvedConfig } from './config.js';\nimport { Registry } from './registry.js';\nimport { UsageTracker } from './tracking.js';\nimport type { NoosphereProvider } from './providers/base.js';\nimport { PiAiProvider } from './providers/pi-ai.js';\nimport { FalProvider } from './providers/fal.js';\nimport { ComfyUIProvider } from './providers/comfyui.js';\nimport { LocalTTSProvider } from './providers/local-tts.js';\nimport { HuggingFaceProvider } from './providers/huggingface.js';\nimport { OllamaProvider } from './providers/ollama.js';\nimport { HfLocalProvider } from './providers/hf-local.js';\nimport { WhisperLocalProvider } from './providers/whisper-local.js';\nimport { AudioCraftProvider } from './providers/audiocraft.js';\nimport { OpenAICompatProvider, detectOpenAICompatServers } from './providers/openai-compat.js';\n\nexport class Noosphere {\n private config: ResolvedConfig;\n private registry: Registry;\n private tracker: UsageTracker;\n private initialized = false;\n\n constructor(config: NoosphereConfig = {}) {\n this.config = resolveConfig(config);\n this.registry = new Registry(this.config.discoveryCacheTTL);\n this.tracker = new UsageTracker(this.config.onUsage);\n }\n\n /** Register a custom provider adapter */\n registerProvider(provider: NoosphereProvider): void {\n this.registry.addProvider(provider);\n }\n\n // --- Generation Methods ---\n\n async chat(options: ChatOptions): Promise<NoosphereResult> {\n if (!this.initialized) await this.init();\n const provider = this.resolveProviderForModality('llm', options.provider, options.model);\n if (!provider.chat) {\n throw new NoosphereError(`Provider '${provider.id}' does not support chat`, {\n code: 'INVALID_INPUT', provider: provider.id, modality: 'llm',\n });\n }\n\n const start = Date.now();\n try {\n const result = await this.executeWithRetry(\n 'llm', provider,\n () => provider.chat!(options),\n (alt) => alt.chat ? () => alt.chat!(options) : null,\n );\n await this.trackUsage(result, options.metadata);\n return result;\n } catch (err) {\n await this.trackError('llm', provider.id, options.model, start, err, options.metadata);\n throw err;\n }\n }\n\n stream(options: ChatOptions): NoosphereStream {\n const self = this;\n let innerStream: NoosphereStream | undefined;\n let finalResult: NoosphereResult | undefined;\n let providerRef: NoosphereProvider | undefined;\n\n const ensureInit = async () => {\n if (!self.initialized) await self.init();\n if (!providerRef) {\n providerRef = self.resolveProviderForModality('llm', options.provider, options.model);\n if (!providerRef.stream) {\n throw new NoosphereError(`Provider '${providerRef.id}' does not support streaming`, {\n code: 'INVALID_INPUT', provider: providerRef.id, modality: 'llm',\n });\n }\n innerStream = providerRef.stream(options);\n }\n };\n\n const wrappedIterator: AsyncIterable<StreamEvent> = {\n async *[Symbol.asyncIterator]() {\n await ensureInit();\n try {\n for await (const event of innerStream!) {\n if (event.type === 'done' && event.result) {\n finalResult = event.result;\n await self.trackUsage(event.result, options.metadata);\n }\n yield event;\n }\n } catch (err) {\n await self.trackError('llm', providerRef!.id, options.model, Date.now(), err, options.metadata);\n throw err;\n }\n },\n };\n\n return {\n [Symbol.asyncIterator]: () => wrappedIterator[Symbol.asyncIterator](),\n result: async () => {\n if (finalResult) return finalResult;\n for await (const event of wrappedIterator) {\n if (event.type === 'done' && event.result) return event.result;\n if (event.type === 'error' && event.error) throw event.error;\n }\n throw new NoosphereError('Stream ended without result', {\n code: 'GENERATION_FAILED', provider: providerRef?.id ?? 'unknown', modality: 'llm',\n });\n },\n abort: () => innerStream?.abort(),\n };\n }\n\n async image(options: ImageOptions): Promise<NoosphereResult> {\n if (!this.initialized) await this.init();\n const provider = this.resolveProviderForModality('image', options.provider, options.model);\n if (!provider.image) {\n throw new NoosphereError(`Provider '${provider.id}' does not support image generation`, {\n code: 'INVALID_INPUT', provider: provider.id, modality: 'image',\n });\n }\n\n const start = Date.now();\n try {\n const result = await this.executeWithRetry(\n 'image', provider,\n () => provider.image!(options),\n (alt) => alt.image ? () => alt.image!(options) : null,\n );\n await this.trackUsage(result, options.metadata);\n return result;\n } catch (err) {\n await this.trackError('image', provider.id, options.model, start, err, options.metadata);\n throw err;\n }\n }\n\n async video(options: VideoOptions): Promise<NoosphereResult> {\n if (!this.initialized) await this.init();\n const provider = this.resolveProviderForModality('video', options.provider, options.model);\n if (!provider.video) {\n throw new NoosphereError(`Provider '${provider.id}' does not support video generation`, {\n code: 'INVALID_INPUT', provider: provider.id, modality: 'video',\n });\n }\n\n const start = Date.now();\n try {\n const result = await this.executeWithRetry(\n 'video', provider,\n () => provider.video!(options),\n (alt) => alt.video ? () => alt.video!(options) : null,\n );\n await this.trackUsage(result, options.metadata);\n return result;\n } catch (err) {\n await this.trackError('video', provider.id, options.model, start, err, options.metadata);\n throw err;\n }\n }\n\n async speak(options: SpeakOptions): Promise<NoosphereResult> {\n if (!this.initialized) await this.init();\n const provider = this.resolveProviderForModality('tts', options.provider, options.model);\n if (!provider.speak) {\n throw new NoosphereError(`Provider '${provider.id}' does not support TTS`, {\n code: 'INVALID_INPUT', provider: provider.id, modality: 'tts',\n });\n }\n\n const start = Date.now();\n try {\n const result = await this.executeWithRetry(\n 'tts', provider,\n () => provider.speak!(options),\n (alt) => alt.speak ? () => alt.speak!(options) : null,\n );\n await this.trackUsage(result, options.metadata);\n return result;\n } catch (err) {\n await this.trackError('tts', provider.id, options.model, start, err, options.metadata);\n throw err;\n }\n }\n\n // --- Discovery Methods ---\n\n async getProviders(modality?: Modality): Promise<ProviderInfo[]> {\n if (!this.initialized) await this.init();\n return this.registry.getProviderInfos(modality);\n }\n\n async getModels(modality?: Modality): Promise<ModelInfo[]> {\n if (!this.initialized) await this.init();\n return this.registry.getModels(modality);\n }\n\n async getModel(provider: string, modelId: string): Promise<ModelInfo | null> {\n if (!this.initialized) await this.init();\n return this.registry.getModel(provider, modelId);\n }\n\n async syncModels(): Promise<SyncResult> {\n if (!this.initialized) await this.init();\n return this.registry.syncAll();\n }\n\n // --- Tracking Methods ---\n\n getUsage(options?: UsageQueryOptions): UsageSummary {\n return this.tracker.getSummary(options);\n }\n\n // --- Local Model Management ---\n\n async installModel(name: string): Promise<AsyncGenerator<import('./providers/ollama.js').OllamaPullProgress>> {\n if (!this.initialized) await this.init();\n const provider = this.registry.getProvider('ollama') as OllamaProvider | undefined;\n if (!provider) throw new NoosphereError('Ollama provider not available', { code: 'PROVIDER_UNAVAILABLE', provider: 'ollama', modality: 'llm' });\n return provider.pullModel(name);\n }\n\n async uninstallModel(name: string): Promise<void> {\n if (!this.initialized) await this.init();\n const provider = this.registry.getProvider('ollama') as OllamaProvider | undefined;\n if (!provider) throw new NoosphereError('Ollama provider not available', { code: 'PROVIDER_UNAVAILABLE', provider: 'ollama', modality: 'llm' });\n await provider.deleteModel(name);\n }\n\n async getHardware(): Promise<{ ollama: boolean; runningModels: import('./providers/ollama.js').OllamaRunningModel[] }> {\n if (!this.initialized) await this.init();\n const provider = this.registry.getProvider('ollama') as OllamaProvider | undefined;\n if (!provider) return { ollama: false, runningModels: [] };\n try {\n const runningModels = await provider.getRunningModels();\n return { ollama: true, runningModels };\n } catch {\n return { ollama: false, runningModels: [] };\n }\n }\n\n // --- Lifecycle ---\n\n async dispose(): Promise<void> {\n for (const provider of this.registry.getAllProviders()) {\n if (provider.dispose) {\n await provider.dispose();\n }\n }\n this.registry.clearCache();\n this.tracker.clear();\n }\n\n // --- Internal ---\n\n private async init(): Promise<void> {\n if (this.initialized) return;\n this.initialized = true;\n\n const { keys, local, autoDetectLocal } = this.config;\n\n // Register cloud providers based on available keys\n const llmKeys: Record<string, string | undefined> = {\n openai: keys.openai,\n anthropic: keys.anthropic,\n google: keys.google,\n openrouter: keys.openrouter,\n groq: keys.groq,\n mistral: keys.mistral,\n xai: keys.xai,\n };\n const hasAnyLLMKey = Object.values(llmKeys).some(Boolean);\n if (hasAnyLLMKey) {\n this.registry.addProvider(new PiAiProvider(llmKeys));\n }\n\n if (keys.fal) {\n this.registry.addProvider(new FalProvider(keys.fal));\n }\n\n if (keys.huggingface) {\n this.registry.addProvider(new HuggingFaceProvider(keys.huggingface));\n }\n\n // Auto-detect local services in parallel\n if (autoDetectLocal) {\n const PING_TIMEOUT_MS = 2000;\n\n const pingUrl = async (url: string): Promise<boolean> => {\n try {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), PING_TIMEOUT_MS);\n try {\n const res = await fetch(url, { signal: controller.signal });\n return res.ok;\n } finally {\n clearTimeout(timer);\n }\n } catch {\n return false;\n }\n };\n\n const ollamaCfg = local['ollama'];\n const comfyuiCfg = local['comfyui'];\n const piperCfg = local['piper'];\n const kokoroCfg = local['kokoro'];\n\n await Promise.allSettled([\n // Ollama — auto-detect even without explicit config\n (async () => {\n const host = ollamaCfg?.host ?? 'http://localhost';\n const port = ollamaCfg?.port ?? 11434;\n const provider = new OllamaProvider({ host, port });\n const ok = await provider.ping();\n if (ok) {\n this.registry.addProvider(provider);\n }\n })(),\n // ComfyUI\n (async () => {\n if (comfyuiCfg?.enabled) {\n const ok = await pingUrl(`${comfyuiCfg.host}:${comfyuiCfg.port}/system_stats`);\n if (ok) {\n this.registry.addProvider(new ComfyUIProvider({ host: comfyuiCfg.host, port: comfyuiCfg.port }));\n }\n }\n })(),\n // Piper TTS\n (async () => {\n if (piperCfg?.enabled) {\n const ok = await pingUrl(`${piperCfg.host}:${piperCfg.port}/health`);\n if (ok) {\n this.registry.addProvider(new LocalTTSProvider({ id: 'piper', name: 'Piper TTS', host: piperCfg.host, port: piperCfg.port }));\n }\n }\n })(),\n // Kokoro TTS\n (async () => {\n if (kokoroCfg?.enabled) {\n const ok = await pingUrl(`${kokoroCfg.host}:${kokoroCfg.port}/health`);\n if (ok) {\n this.registry.addProvider(new LocalTTSProvider({ id: 'kokoro', name: 'Kokoro TTS', host: kokoroCfg.host, port: kokoroCfg.port }));\n }\n }\n })(),\n // HuggingFace local model catalog\n (async () => {\n this.registry.addProvider(new HfLocalProvider());\n })(),\n // Whisper local STT\n (async () => {\n const whisper = new WhisperLocalProvider();\n const ok = await whisper.ping();\n if (ok) this.registry.addProvider(whisper);\n })(),\n // AudioCraft local music generation\n (async () => {\n const audiocraft = new AudioCraftProvider();\n const ok = await audiocraft.ping();\n if (ok) this.registry.addProvider(audiocraft);\n })(),\n // Auto-detect OpenAI-compatible servers\n (async () => {\n const servers = await detectOpenAICompatServers();\n for (const server of servers) {\n this.registry.addProvider(server);\n }\n })(),\n ]);\n }\n }\n\n private resolveProviderForModality(modality: Modality, preferredId?: string, modelId?: string): NoosphereProvider {\n // 1. If a specific model was requested, look it up in the registry\n if (modelId && !preferredId) {\n const resolved = this.registry.resolveModel(modelId, modality);\n if (resolved) return resolved.provider;\n }\n\n // 2. Check defaults if no preference\n if (!preferredId) {\n const defaultCfg = (this.config.defaults as Record<string, { provider: string; model: string } | undefined>)[modality];\n if (defaultCfg) {\n preferredId = defaultCfg.provider;\n }\n }\n\n // 3. Resolve by provider ID (local-first, then cloud)\n const provider = this.registry.resolveProvider(modality, preferredId);\n if (!provider) {\n throw new NoosphereError(\n `No provider available for modality '${modality}'${preferredId ? ` (requested: ${preferredId})` : ''}`,\n { code: 'NO_PROVIDER', provider: preferredId ?? 'none', modality },\n );\n }\n return provider;\n }\n\n private async executeWithRetry<T>(\n modality: Modality,\n provider: NoosphereProvider,\n fn: () => Promise<T>,\n failoverFnFactory?: (alt: NoosphereProvider) => (() => Promise<T>) | null,\n ): Promise<T> {\n const { maxRetries, backoffMs, retryableErrors, failover } = this.config.retry;\n let lastError: Error | undefined;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n return await fn();\n } catch (err) {\n lastError = err instanceof Error ? err : new Error(String(err));\n\n const isNoosphereErr = err instanceof NoosphereError;\n const code = isNoosphereErr ? err.code : 'GENERATION_FAILED';\n\n // GENERATION_FAILED: retryable same-provider only, no cross-provider failover\n const isRetryable = retryableErrors.includes(code) || code === 'GENERATION_FAILED';\n const allowsFailover = code !== 'GENERATION_FAILED' && retryableErrors.includes(code);\n\n if (!isRetryable || attempt === maxRetries) {\n // Failover to another provider (only for non-GENERATION_FAILED errors)\n if (failover && allowsFailover && failoverFnFactory) {\n const altProviders = this.registry.getAllProviders()\n .filter((p) => p.id !== provider.id && p.modalities.includes(modality));\n for (const alt of altProviders) {\n try {\n const altFn = failoverFnFactory(alt);\n if (altFn) return await altFn();\n } catch {\n // Continue to next provider\n }\n }\n }\n break;\n }\n\n const delay = backoffMs * Math.pow(2, attempt);\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n }\n\n throw lastError ?? new NoosphereError('Generation failed', {\n code: 'GENERATION_FAILED', provider: provider.id, modality,\n });\n }\n\n private async trackUsage(result: NoosphereResult, metadata?: Record<string, unknown>): Promise<void> {\n const event: UsageEvent = {\n modality: result.modality,\n provider: result.provider,\n model: result.model,\n cost: result.usage.cost,\n latencyMs: result.latencyMs,\n input: result.usage.input,\n output: result.usage.output,\n unit: result.usage.unit,\n timestamp: new Date().toISOString(),\n success: true,\n metadata,\n };\n await this.tracker.record(event);\n }\n\n private async trackError(\n modality: Modality, provider: string, model: string | undefined,\n startMs: number, err: unknown, metadata?: Record<string, unknown>,\n ): Promise<void> {\n const event: UsageEvent = {\n modality, provider, model: model ?? 'unknown',\n cost: 0, latencyMs: Date.now() - startMs,\n timestamp: new Date().toISOString(),\n success: false,\n error: err instanceof Error ? err.message : String(err),\n metadata,\n };\n await this.tracker.record(event);\n }\n}\n"],"mappings":"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","names":["FETCH_TIMEOUT_MS","FETCH_TIMEOUT_MS","HF_HUB_API","import_promises","import_node_path","import_node_os","import_node_child_process","import_promises","import_node_path","import_node_os","runPython","fileExists","FETCH_TIMEOUT_MS","fetchJsonTimeout"]}
|