noosphere 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +257 -0
- package/dist/index.js +1290 -0
- package/dist/index.js.map +1 -0
- package/package.json +38 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/errors.ts","../src/config.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":["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\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 // 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/registry.ts\nimport type { Modality, ModelInfo, ProviderInfo, SyncResult } from './types.js';\nimport type { NoosphereProvider } from './providers/base.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 });\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';\n\nconst KNOWN_PROVIDERS: KnownProvider[] = ['anthropic', 'google', 'openai', 'xai', 'groq', 'cerebras', 'openrouter', 'zai'];\nconst LOCAL_PROVIDERS = new Set(['ollama']);\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\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 const models: ModelInfo[] = [];\n for (const provider of KNOWN_PROVIDERS) {\n try {\n const providerModels = getModels(provider);\n for (const m of providerModels as Model<Api>[]) {\n models.push({\n id: m.id,\n provider: 'pi-ai',\n name: m.name || m.id,\n modality: 'llm' as const,\n local: LOCAL_PROVIDERS.has(String(m.provider)),\n cost: {\n price: m.cost.input ?? 0,\n unit: m.cost.input > 0 ? 'per_1m_tokens' : 'free',\n },\n capabilities: {\n contextWindow: m.contextWindow,\n maxTokens: m.maxTokens,\n supportsVision: m.input.includes('image'),\n supportsStreaming: true,\n },\n });\n }\n } catch {\n // Skip providers that fail to load\n }\n }\n return models;\n }\n\n async chat(options: ChatOptions): Promise<NoosphereResult> {\n const start = Date.now();\n\n // Find the model — we need to search through providers\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' | 'assistant',\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 { 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' | 'assistant',\n content: m.content,\n timestamp: Date.now(),\n })),\n };\n\n const piStream = stream(model, context);\n\n const self = this;\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 asyncIterator: AsyncIterable<StreamEvent> = {\n async *[Symbol.asyncIterator]() {\n try {\n for await (const chunk of piStream) {\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 piStream.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 private findModel(modelId?: string): { model: Model<Api> | null; provider: string | null } {\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 : models[0];\n if (found) return { model: found, provider };\n } catch {\n // skip\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';\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 });\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';\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 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' },\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' },\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';\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 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 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,\n} from '../types.js';\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\n constructor(token: string) {\n this.client = new HfInference(token);\n }\n\n async ping(): Promise<boolean> {\n return true; // HF is always \"available\" if token exists\n }\n\n async listModels(modality?: Modality): Promise<ModelInfo[]> {\n // HuggingFace has thousands of models — return curated defaults\n const models: ModelInfo[] = [];\n\n if (!modality || modality === 'image') {\n models.push({\n id: 'stabilityai/stable-diffusion-xl-base-1.0',\n provider: 'huggingface', name: 'SDXL Base', modality: 'image',\n local: false, cost: { price: 0, unit: 'free' },\n });\n }\n if (!modality || modality === 'tts') {\n models.push({\n id: 'facebook/mms-tts-eng',\n provider: 'huggingface', name: 'MMS TTS English', modality: 'tts',\n local: false, cost: { price: 0, unit: 'free' },\n });\n }\n if (!modality || modality === 'llm') {\n models.push({\n id: 'meta-llama/Llama-3.1-8B-Instruct',\n provider: 'huggingface', name: 'Llama 3.1 8B', modality: 'llm',\n local: false, cost: { price: 0, unit: 'free' },\n });\n }\n\n return models;\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":[]}
|
package/package.json
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "noosphere",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Unified AI creation engine — text, image, video, audio across all providers",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"import": "./dist/index.js",
|
|
11
|
+
"types": "./dist/index.d.ts"
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
"files": ["dist", "README.md", "LICENSE"],
|
|
15
|
+
"engines": { "node": ">=18.0.0" },
|
|
16
|
+
"scripts": {
|
|
17
|
+
"build": "tsup",
|
|
18
|
+
"dev": "tsup --watch",
|
|
19
|
+
"test": "vitest run",
|
|
20
|
+
"test:watch": "vitest",
|
|
21
|
+
"test:coverage": "vitest run --coverage",
|
|
22
|
+
"typecheck": "tsc --noEmit",
|
|
23
|
+
"prepublishOnly": "npm run build"
|
|
24
|
+
},
|
|
25
|
+
"dependencies": {
|
|
26
|
+
"@fal-ai/client": "^1.2.0",
|
|
27
|
+
"@huggingface/inference": "^3.6.0",
|
|
28
|
+
"@mariozechner/pi-ai": "^0.5.10"
|
|
29
|
+
},
|
|
30
|
+
"devDependencies": {
|
|
31
|
+
"tsup": "^8.3.0",
|
|
32
|
+
"typescript": "^5.6.3",
|
|
33
|
+
"vitest": "^2.1.3"
|
|
34
|
+
},
|
|
35
|
+
"keywords": ["ai", "llm", "image-generation", "tts", "video-generation", "openai", "anthropic", "fal", "ollama", "comfyui"],
|
|
36
|
+
"author": "0xJesus",
|
|
37
|
+
"license": "MIT"
|
|
38
|
+
}
|