@standardagents/novita 0.0.0-dev.fffff
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 +65 -0
- package/dist/index.d.ts +85 -0
- package/dist/index.js +1183 -0
- package/dist/index.js.map +1 -0
- package/package.json +50 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/NovitaProvider.ts","../src/chat-completions-transformers.ts","../src/icons.ts","../src/providerOptions.ts","../src/index.ts"],"sourcesContent":["import type {\n InspectedRequest,\n LLMProviderInterface as Provider,\n ModelCapabilities,\n ProviderFactoryConfig,\n ProviderModelInfo,\n ProviderRequest,\n ProviderResponse,\n ProviderStreamChunk,\n ProviderUsage,\n ProviderUsagePricing,\n} from '@standardagents/spec';\nimport { ProviderError } from '@standardagents/spec';\nimport {\n attachUsagePricing,\n buildChatParams,\n createChatErrorChunk,\n createChatStreamState,\n parseChatSSEStream,\n transformChatResponse,\n truncateChatBase64,\n} from './chat-completions-transformers';\nimport { getNovitaIconDataUri, getNovitaModelIconDataUri } from './icons';\n\nexport { ProviderError };\n\nexport interface NovitaModelInfo {\n id: string;\n object?: string;\n created?: number;\n title?: string;\n description?: string;\n context_size?: number;\n input_token_price_per_m?: number;\n output_token_price_per_m?: number;\n pricing?: {\n prompt?: NovitaPriceInfo;\n completion?: NovitaPriceInfo;\n input_cache_read?: NovitaPriceInfo;\n };\n}\n\nconst DEFAULT_BASE_URL = 'https://api.novita.ai/openai/v1';\nconst NOVITA_PRICE_SCALE = 10_000;\n\ninterface NovitaPriceInfo {\n origin_price_per_m?: number;\n price_per_m?: number;\n}\n\nconst STATIC_MODELS: NovitaModelInfo[] = [\n {\n id: 'zai-org/glm-5.2',\n title: 'zai-org/glm-5.2',\n description: 'Large long-context model on Novita for coding, reasoning, and planning.',\n context_size: 1_048_576,\n input_token_price_per_m: 14_000,\n output_token_price_per_m: 44_000,\n },\n {\n id: 'moonshotai/kimi-k2.7-code',\n title: 'moonshotai/kimi-k2.7-code',\n description: 'Large coding and agentic tool-use model on Novita.',\n context_size: 262_144,\n input_token_price_per_m: 9_500,\n output_token_price_per_m: 40_000,\n },\n {\n id: 'minimax/minimax-m3',\n title: 'minimax/minimax-m3',\n description: 'Large general-purpose model on Novita for agents, tool use, and long context.',\n context_size: 1_000_000,\n input_token_price_per_m: 3_000,\n output_token_price_per_m: 12_000,\n },\n {\n id: 'deepseek/deepseek-v4-pro',\n title: 'deepseek/deepseek-v4-pro',\n description: 'Large reasoning and planning model on Novita.',\n context_size: 1_048_576,\n input_token_price_per_m: 16_000,\n output_token_price_per_m: 32_000,\n },\n {\n id: 'deepseek/deepseek-v4-flash',\n title: 'deepseek/deepseek-v4-flash',\n description: 'Cost-effective long-context DeepSeek model on Novita.',\n context_size: 1_048_576,\n input_token_price_per_m: 1_400,\n output_token_price_per_m: 2_800,\n },\n {\n id: 'deepseek/deepseek-v3.2',\n title: 'deepseek/deepseek-v3.2',\n description: 'General reasoning and planning model on Novita.',\n context_size: 163_840,\n input_token_price_per_m: 2_690,\n output_token_price_per_m: 4_000,\n },\n {\n id: 'nvidia/nemotron-3-nano-30b-a3b',\n title: 'nvidia/nemotron-3-nano-30b-a3b',\n description: 'Low-latency Novita model for lightweight extraction and classification.',\n context_size: 262_144,\n input_token_price_per_m: 500,\n output_token_price_per_m: 2_000,\n },\n];\n\nfunction trimTrailingSlashes(value: string): string {\n return value.replace(/\\/+$/, '');\n}\n\nfunction includesInsensitive(haystack: string | undefined, needle: string): boolean {\n return haystack?.toLowerCase().includes(needle.toLowerCase()) ?? false;\n}\n\nfunction isVisionModel(model: NovitaModelInfo): boolean {\n const searchable = `${model.id} ${model.title || ''} ${model.description || ''}`;\n return (\n includesInsensitive(searchable, 'vision') ||\n includesInsensitive(searchable, 'visual') ||\n includesInsensitive(searchable, 'multimodal') ||\n includesInsensitive(searchable, 'image') ||\n includesInsensitive(searchable, 'ocr') ||\n /\\bvl\\b/i.test(searchable)\n );\n}\n\nexport function normalizeNovitaPricePerMillion(value: unknown): number | undefined {\n if (typeof value !== 'number' || !Number.isFinite(value)) {\n return undefined;\n }\n return Number((value / NOVITA_PRICE_SCALE).toFixed(12));\n}\n\nexport function novitaUsagePricingFromModel(\n model: NovitaModelInfo | undefined\n): ProviderUsagePricing | undefined {\n const inputPerMillion = normalizeNovitaPricePerMillion(\n model?.pricing?.prompt?.price_per_m ?? model?.input_token_price_per_m\n );\n const outputPerMillion = normalizeNovitaPricePerMillion(\n model?.pricing?.completion?.price_per_m ?? model?.output_token_price_per_m\n );\n if (inputPerMillion === undefined || outputPerMillion === undefined) {\n return undefined;\n }\n const cachedInputPerMillion = normalizeNovitaPricePerMillion(\n model?.pricing?.input_cache_read?.price_per_m\n );\n const pricing: ProviderUsagePricing = {\n inputPerMillion,\n outputPerMillion,\n };\n if (cachedInputPerMillion !== undefined) {\n pricing.cachedInputPerMillion = cachedInputPerMillion;\n }\n return pricing;\n}\n\nexport function calculateNovitaUsageCost(\n usage: ProviderUsage,\n pricing?: ProviderUsagePricing\n): number | undefined {\n if (\n !pricing ||\n typeof pricing.inputPerMillion !== 'number' ||\n typeof pricing.outputPerMillion !== 'number'\n ) {\n return undefined;\n }\n\n const cachedTokens = usage.cachedTokens || 0;\n const uncachedPromptTokens = Math.max(0, usage.promptTokens - cachedTokens);\n const cachedRate = pricing.cachedInputPerMillion ?? pricing.inputPerMillion;\n\n return Number((\n (uncachedPromptTokens / 1_000_000) * pricing.inputPerMillion +\n (cachedTokens / 1_000_000) * cachedRate +\n (usage.completionTokens / 1_000_000) * pricing.outputPerMillion\n ).toFixed(12));\n}\n\nexport class NovitaProvider implements Provider {\n readonly name = 'novita';\n readonly specificationVersion = '1' as const;\n\n private config: ProviderFactoryConfig;\n\n private static modelsCache: NovitaModelInfo[] | null = null;\n private static modelsCacheTime = 0;\n private static readonly CACHE_TTL = 5 * 60 * 1000;\n private static readonly USAGE_PRICING_FINISH_WAIT_MS = 2500;\n\n constructor(config: ProviderFactoryConfig) {\n this.config = config;\n }\n\n supportsModel(_modelId: string): boolean {\n return true;\n }\n\n getIcon(modelId?: string): string {\n return getNovitaModelIconDataUri(modelId) || getNovitaIconDataUri();\n }\n\n private baseUrl(): string {\n return trimTrailingSlashes(this.config.baseUrl || DEFAULT_BASE_URL);\n }\n\n private headers(): HeadersInit {\n return {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${this.config.apiKey}`,\n };\n }\n\n private async fetchModelsWithCache(): Promise<NovitaModelInfo[]> {\n const now = Date.now();\n\n if (\n NovitaProvider.modelsCache &&\n now - NovitaProvider.modelsCacheTime < NovitaProvider.CACHE_TTL\n ) {\n return NovitaProvider.modelsCache;\n }\n\n const response = await fetch(`${this.baseUrl()}/models`, {\n method: 'GET',\n headers: this.headers(),\n });\n\n if (!response.ok) {\n throw await this.toHttpProviderErrorFromResponse(response, 'Novita models API error');\n }\n\n const data = await response.json() as { data?: NovitaModelInfo[] };\n const merged = new Map<string, NovitaModelInfo>();\n\n for (const model of STATIC_MODELS) {\n merged.set(model.id, model);\n }\n\n for (const model of data.data || []) {\n merged.set(model.id, { ...merged.get(model.id), ...model });\n }\n\n NovitaProvider.modelsCache = Array.from(merged.values());\n NovitaProvider.modelsCacheTime = now;\n\n return NovitaProvider.modelsCache;\n }\n\n private mapModelCapabilities(model: NovitaModelInfo): ModelCapabilities {\n return {\n supportsImages: isVisionModel(model),\n supportsToolCalls: true,\n supportsStreaming: true,\n supportsJsonMode: true,\n maxContextTokens: model.context_size,\n };\n }\n\n async getModelCapabilities(modelId: string): Promise<ModelCapabilities | null> {\n try {\n const models = await this.fetchModelsWithCache();\n const model = models.find((candidate) => candidate.id === modelId);\n if (!model) return null;\n return this.mapModelCapabilities(model);\n } catch (error) {\n console.error(`Failed to fetch capabilities for Novita model ${modelId}:`, error);\n const staticModel = STATIC_MODELS.find((candidate) => candidate.id === modelId);\n return staticModel ? this.mapModelCapabilities(staticModel) : null;\n }\n }\n\n private mapToProviderModelInfo(model: NovitaModelInfo): ProviderModelInfo {\n const pricing = novitaUsagePricingFromModel(model);\n\n return {\n id: model.id,\n name: model.title || model.id,\n description: model.description,\n contextLength: model.context_size,\n iconId: this.getIcon(model.id),\n slug: model.id,\n inputPrice: pricing?.inputPerMillion,\n outputPrice: pricing?.outputPerMillion,\n cachedPrice: pricing?.cachedInputPerMillion,\n capabilities: this.mapModelCapabilities(model),\n };\n }\n\n async getModels(filter?: string): Promise<ProviderModelInfo[]> {\n try {\n let models = (await this.fetchModelsWithCache())\n .map((model) => this.mapToProviderModelInfo(model))\n .sort((a, b) => a.name.localeCompare(b.name));\n\n if (filter) {\n const lowerFilter = filter.toLowerCase();\n models = models.filter(\n (model) =>\n model.id.toLowerCase().includes(lowerFilter) ||\n model.name.toLowerCase().includes(lowerFilter) ||\n (model.description && model.description.toLowerCase().includes(lowerFilter))\n );\n }\n\n return models;\n } catch (error) {\n console.error('Failed to fetch models from Novita:', error);\n return STATIC_MODELS.map((model) => this.mapToProviderModelInfo(model));\n }\n }\n\n private static async settleUsagePricing(\n pricingPromise: Promise<ProviderUsagePricing | undefined>\n ): Promise<ProviderUsagePricing | undefined> {\n let timer: ReturnType<typeof setTimeout> | undefined;\n const timeout = new Promise<undefined>((resolve) => {\n timer = setTimeout(() => resolve(undefined), NovitaProvider.USAGE_PRICING_FINISH_WAIT_MS);\n });\n try {\n return await Promise.race([pricingPromise, timeout]);\n } finally {\n if (timer !== undefined) clearTimeout(timer);\n }\n }\n\n private async getUsagePricing(\n modelId: string | undefined\n ): Promise<ProviderUsagePricing | undefined> {\n if (!modelId) return undefined;\n try {\n const models = await this.fetchModelsWithCache();\n const model = models.find((candidate) => candidate.id === modelId);\n return novitaUsagePricingFromModel(model);\n } catch {\n const staticModel = STATIC_MODELS.find((candidate) => candidate.id === modelId);\n return novitaUsagePricingFromModel(staticModel);\n }\n }\n\n async generate(request: ProviderRequest): Promise<ProviderResponse> {\n const pricingPromise = this.getUsagePricing(request.model);\n\n try {\n const response = await fetch(`${this.baseUrl()}/chat/completions`, {\n method: 'POST',\n headers: this.headers(),\n body: JSON.stringify(buildChatParams(request)),\n signal: request.signal,\n });\n\n if (!response.ok) {\n throw await this.toHttpProviderErrorFromResponse(response, 'Novita API error');\n }\n\n const pricing = await NovitaProvider.settleUsagePricing(pricingPromise);\n const data = await response.json();\n return transformChatResponse(data, pricing);\n } catch (error) {\n throw this.toProviderError(error);\n }\n }\n\n async stream(request: ProviderRequest): Promise<AsyncIterable<ProviderStreamChunk>> {\n const self = this;\n const pricingPromise = this.getUsagePricing(request.model);\n\n try {\n const response = await fetch(`${this.baseUrl()}/chat/completions`, {\n method: 'POST',\n headers: this.headers(),\n body: JSON.stringify({\n ...buildChatParams(request),\n stream: true,\n stream_options: { include_usage: true },\n }),\n signal: request.signal,\n });\n\n if (!response.ok) {\n throw await this.toHttpProviderErrorFromResponse(response, 'Novita API error');\n }\n\n return {\n async *[Symbol.asyncIterator]() {\n const state = createChatStreamState(request.model);\n\n try {\n for await (const chunk of parseChatSSEStream(response, state)) {\n if (chunk.type === 'finish') {\n const pricing = await NovitaProvider.settleUsagePricing(pricingPromise);\n if (pricing) attachUsagePricing(chunk.usage, pricing);\n }\n yield chunk;\n }\n } catch (error) {\n const providerError = self.toProviderError(error);\n yield createChatErrorChunk(providerError.message, providerError.code);\n }\n },\n };\n } catch (error) {\n throw this.toProviderError(error);\n }\n }\n\n private async toHttpProviderErrorFromResponse(\n response: Response,\n fallbackPrefix: string\n ): Promise<ProviderError> {\n const errorText = await response.text();\n let errorMessage = `${fallbackPrefix}: ${response.status}`;\n try {\n const errorJson = JSON.parse(errorText) as {\n error?: { message?: string };\n message?: string;\n };\n errorMessage = errorJson.error?.message || errorJson.message || errorMessage;\n } catch {\n errorMessage = errorText || errorMessage;\n }\n\n return this.toHttpProviderError(errorMessage, response.status, response.headers);\n }\n\n private toProviderError(error: unknown): ProviderError {\n if (error instanceof ProviderError) {\n return error;\n }\n\n if (error instanceof Error) {\n const anyError = error as Error & {\n status?: number;\n statusCode?: number;\n headers?: Record<string, string>;\n code?: string;\n };\n\n const status = anyError.status || anyError.statusCode;\n const retryAfter = anyError.headers?.['retry-after']\n ? parseInt(anyError.headers['retry-after'], 10)\n : undefined;\n\n if (status === 429) {\n return new ProviderError(error.message, 'rate_limit', status, retryAfter);\n }\n if (status === 401 || status === 403) {\n return new ProviderError(error.message, 'auth_error', status);\n }\n if (status === 400 || status === 404) {\n return new ProviderError(error.message, 'invalid_request', status);\n }\n if (status && status >= 500) {\n return new ProviderError(error.message, 'server_error', status);\n }\n if (error.name === 'AbortError' || anyError.code === 'ETIMEDOUT') {\n return new ProviderError(error.message, 'timeout');\n }\n\n return new ProviderError(error.message, 'unknown', status);\n }\n\n return new ProviderError(String(error), 'unknown');\n }\n\n private toHttpProviderError(\n message: string,\n status: number,\n headers?: Headers\n ): ProviderError {\n const retryAfterHeader = headers?.get('retry-after');\n const retryAfter = retryAfterHeader ? parseInt(retryAfterHeader, 10) : undefined;\n\n if (status === 429) {\n return new ProviderError(message, 'rate_limit', status, retryAfter);\n }\n if (status === 401 || status === 403) {\n return new ProviderError(message, 'auth_error', status);\n }\n if (status === 400 || status === 404) {\n return new ProviderError(message, 'invalid_request', status);\n }\n if (status >= 500) {\n return new ProviderError(message, 'server_error', status);\n }\n\n return new ProviderError(message, 'unknown', status);\n }\n\n async inspectRequest(request: ProviderRequest): Promise<InspectedRequest> {\n const params = buildChatParams(request);\n\n return {\n body: truncateChatBase64(params as Record<string, unknown>),\n messagesPath: 'messages',\n metadata: {\n endpoint: 'POST /openai/v1/chat/completions',\n headers: {\n 'Content-Type': 'application/json',\n },\n },\n };\n }\n}\n","import type {\n ContentPart,\n ProviderFinishReason,\n ProviderMessage,\n ProviderReasoningDetail,\n ProviderRequest,\n ProviderResponse,\n ProviderStreamChunk,\n ProviderTool,\n ProviderToolCallPart,\n ProviderUsage,\n ProviderUsagePricing,\n} from '@standardagents/spec';\n\nexport type NovitaChatContentPart =\n | { type: 'text'; text: string }\n | { type: 'image_url'; image_url: { url: string; detail?: 'auto' | 'low' | 'high' } };\n\nexport type NovitaChatMessage =\n | { role: 'system'; content: string; name?: string }\n | { role: 'user'; content: string | NovitaChatContentPart[]; name?: string }\n | {\n role: 'assistant';\n content?: string | null;\n tool_calls?: NovitaChatToolCall[];\n reasoning_content?: string | null;\n }\n | { role: 'tool'; tool_call_id: string; content: string };\n\nexport interface NovitaChatToolCall {\n id: string;\n type: 'function';\n index?: number;\n function: {\n name: string;\n arguments: string;\n };\n}\n\nexport interface NovitaChatTool {\n type: 'function';\n function: {\n name: string;\n description?: string;\n parameters?: Record<string, unknown>;\n strict?: boolean;\n };\n}\n\nexport type NovitaChatToolChoice =\n | 'auto'\n | 'none'\n | 'required'\n | { type: 'function'; function: { name: string } };\n\nexport interface NovitaChatCompletionRequest {\n model: string;\n messages: NovitaChatMessage[];\n tools?: NovitaChatTool[];\n tool_choice?: NovitaChatToolChoice;\n parallel_tool_calls?: boolean;\n max_tokens?: number;\n temperature?: number;\n top_p?: number;\n stop?: string[];\n stream?: boolean;\n stream_options?: { include_usage?: boolean };\n response_format?:\n | { type: 'json_object' }\n | { type: 'json_schema'; json_schema: { name: string; schema: Record<string, unknown>; strict?: boolean } };\n n?: number;\n seed?: number;\n frequency_penalty?: number;\n presence_penalty?: number;\n repetition_penalty?: number;\n top_k?: number;\n min_p?: number;\n logit_bias?: Record<string, number>;\n logprobs?: boolean;\n top_logprobs?: number;\n separate_reasoning?: boolean;\n enable_thinking?: boolean;\n modalities?: string[];\n [key: string]: unknown;\n}\n\nexport interface NovitaChatCompletionUsage {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n prompt_tokens_details?: {\n cached_tokens?: number;\n cache_creation_input_tokens?: number;\n cache_read_input_tokens?: number;\n text_tokens?: number;\n image_tokens?: number;\n video_tokens?: number;\n audio_tokens?: number;\n } | null;\n completion_tokens_details?: {\n reasoning_tokens?: number;\n } | null;\n}\n\nexport interface NovitaChatCompletionResponse {\n id: string;\n object?: string;\n created?: number;\n model?: string;\n choices: Array<{\n index: number;\n message: {\n role: 'assistant';\n content: string | null;\n reasoning_content?: string | null;\n reasoning?: string | null;\n tool_calls?: NovitaChatToolCall[];\n };\n finish_reason: string;\n }>;\n usage?: NovitaChatCompletionUsage;\n}\n\nexport interface NovitaChatStreamChunk {\n id?: string;\n object?: string;\n created?: number;\n model?: string;\n choices?: Array<{\n index: number;\n delta: {\n role?: string;\n content?: string | null;\n reasoning_content?: string | null;\n reasoning?: string | null;\n tool_calls?: Array<{\n index: number;\n id?: string;\n type?: 'function';\n function?: {\n name?: string;\n arguments?: string;\n };\n }>;\n };\n finish_reason?: string | null;\n }>;\n usage?: NovitaChatCompletionUsage | null;\n}\n\nfunction roundCost(value: number): number {\n return Number(value.toFixed(12));\n}\n\nexport function calculateUsageCost(\n usage: ProviderUsage,\n pricing?: ProviderUsagePricing\n): number | undefined {\n if (\n !pricing ||\n typeof pricing.inputPerMillion !== 'number' ||\n typeof pricing.outputPerMillion !== 'number'\n ) {\n return undefined;\n }\n\n const cachedTokens = usage.cachedTokens || 0;\n const uncachedPromptTokens = Math.max(0, usage.promptTokens - cachedTokens);\n const cachedRate = pricing.cachedInputPerMillion ?? pricing.inputPerMillion;\n\n return roundCost(\n (uncachedPromptTokens / 1_000_000) * pricing.inputPerMillion +\n (cachedTokens / 1_000_000) * cachedRate +\n (usage.completionTokens / 1_000_000) * pricing.outputPerMillion\n );\n}\n\nexport function attachUsagePricing(\n usage: ProviderUsage,\n pricing?: ProviderUsagePricing\n): ProviderUsage {\n if (!pricing) return usage;\n usage.pricing = pricing;\n const cost = calculateUsageCost(usage, pricing);\n if (cost !== undefined) usage.cost = cost;\n return usage;\n}\n\nexport function transformChatContentPart(part: ContentPart): NovitaChatContentPart {\n if (part.type === 'text') {\n return { type: 'text', text: part.text };\n }\n\n if (part.type === 'image') {\n const data = part.data || '';\n const imageUrl = data.startsWith('data:')\n ? data\n : `data:${part.mediaType || 'image/png'};base64,${data}`;\n\n return {\n type: 'image_url',\n image_url: {\n url: imageUrl,\n detail: part.detail || 'auto',\n },\n };\n }\n\n if (part.type === 'image_url') {\n return {\n type: 'image_url',\n image_url: {\n url: part.image_url?.url || '',\n detail: part.image_url?.detail || 'auto',\n },\n };\n }\n\n return {\n type: 'text',\n text: `[File: ${part.filename || 'file'}]`,\n };\n}\n\nexport function transformChatMessageContent(\n content: string | ContentPart[]\n): string | NovitaChatContentPart[] {\n if (typeof content === 'string') {\n return content;\n }\n return content.map(transformChatContentPart);\n}\n\nexport function transformChatMessages(messages: ProviderMessage[]): NovitaChatMessage[] {\n const result: NovitaChatMessage[] = [];\n\n for (const msg of messages) {\n switch (msg.role) {\n case 'system':\n result.push({\n role: 'system',\n content: msg.content,\n });\n break;\n case 'user':\n result.push({\n role: 'user',\n content: transformChatMessageContent(msg.content),\n });\n break;\n case 'assistant': {\n const message: NovitaChatMessage & { role: 'assistant' } = {\n role: 'assistant',\n content: msg.content || null,\n };\n\n if (msg.toolCalls && msg.toolCalls.length > 0) {\n message.tool_calls = msg.toolCalls.map((tc) => ({\n id: tc.id,\n type: 'function',\n function: {\n name: tc.name,\n arguments: typeof tc.arguments === 'string'\n ? tc.arguments\n : JSON.stringify(tc.arguments),\n },\n }));\n }\n\n if (msg.reasoning) {\n message.reasoning_content = msg.reasoning;\n }\n\n result.push(message);\n break;\n }\n case 'tool': {\n let output: string;\n\n if (typeof msg.content === 'string') {\n output = msg.content;\n } else if ('type' in msg.content) {\n if (msg.content.type === 'text') {\n output = msg.content.text;\n } else if (msg.content.type === 'error') {\n output = `Error: ${msg.content.error}`;\n } else {\n output = JSON.stringify(msg.content);\n }\n } else {\n output = JSON.stringify(msg.content);\n }\n\n const imageAttachments = msg.attachments?.filter((a) => a.type === 'image' && a.data) || [];\n result.push({\n role: 'tool',\n tool_call_id: msg.toolCallId,\n content: output || (imageAttachments.length > 0 ? 'Success' : ''),\n });\n\n if (imageAttachments.length > 0) {\n const imageContent: NovitaChatContentPart[] = [];\n const toolName = msg.toolName || 'the tool';\n const isSingle = imageAttachments.length === 1;\n const descriptor = isSingle ? 'the file' : `${imageAttachments.length} files`;\n const verb = isSingle ? 'is' : 'are';\n\n imageContent.push({\n type: 'text',\n text: `Here ${verb} ${descriptor} from ${toolName}:`,\n });\n\n for (const attachment of imageAttachments) {\n const attachmentData = attachment.data || '';\n const imageData = attachmentData.startsWith('data:')\n ? attachmentData\n : `data:${attachment.mediaType || 'image/png'};base64,${attachmentData}`;\n\n imageContent.push({\n type: 'image_url',\n image_url: {\n url: imageData,\n detail: 'auto',\n },\n });\n }\n\n result.push({\n role: 'user',\n content: imageContent,\n });\n }\n break;\n }\n }\n }\n\n return result;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === 'object' && !Array.isArray(value);\n}\n\nconst STRICT_UNSUPPORTED_KEYWORDS = new Set<string>([\n 'minLength', 'maxLength', 'pattern', 'format',\n 'minimum', 'maximum', 'exclusiveMinimum', 'exclusiveMaximum', 'multipleOf',\n 'minItems', 'maxItems', 'uniqueItems', 'minContains', 'maxContains',\n 'minProperties', 'maxProperties', 'patternProperties', 'propertyNames',\n 'dependentRequired', 'dependentSchemas', 'unevaluatedProperties',\n 'default', 'examples', '$schema', '$comment', 'contentEncoding', 'contentMediaType',\n]);\n\nfunction normalizeStrictJsonSchema(schema: unknown): unknown {\n if (Array.isArray(schema)) {\n return schema.map((item) => normalizeStrictJsonSchema(item));\n }\n if (!isRecord(schema)) {\n return schema;\n }\n\n const normalized: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(schema)) {\n if (STRICT_UNSUPPORTED_KEYWORDS.has(key)) continue;\n\n if (key === 'properties' && isRecord(value)) {\n const props: Record<string, unknown> = {};\n for (const [propName, propSchema] of Object.entries(value)) {\n props[propName] = normalizeStrictJsonSchema(propSchema);\n }\n normalized[key] = props;\n } else if (key === 'enum' || key === 'const') {\n normalized[key] = value;\n } else {\n normalized[key] = normalizeStrictJsonSchema(value);\n }\n }\n\n const properties = isRecord(normalized.properties) ? normalized.properties : undefined;\n const type = normalized.type;\n const isObjectSchema =\n type === 'object' || (Array.isArray(type) && type.includes('object')) || !!properties;\n\n if (isObjectSchema) {\n if (normalized.type === undefined) {\n normalized.type = 'object';\n }\n normalized.properties = properties || {};\n normalized.required = Object.keys(normalized.properties as Record<string, unknown>);\n normalized.additionalProperties = false;\n }\n\n return normalized;\n}\n\nfunction normalizeStrictToolParameters(\n parameters?: Record<string, unknown> | null\n): Record<string, unknown> {\n const base = isRecord(parameters) ? { ...parameters } : {};\n if (base.type === undefined) base.type = 'object';\n if (base.properties === undefined) base.properties = {};\n return normalizeStrictJsonSchema(base) as Record<string, unknown>;\n}\n\nexport function transformChatTool(tool: ProviderTool): NovitaChatTool {\n const inputParams = tool.function.parameters as Record<string, unknown> | null | undefined;\n\n return {\n type: 'function',\n function: {\n name: tool.function.name,\n description: tool.function.description || undefined,\n parameters: normalizeStrictToolParameters(inputParams),\n strict: true,\n },\n };\n}\n\nexport function transformChatToolChoice(\n choice: ProviderRequest['toolChoice']\n): NovitaChatToolChoice | undefined {\n if (choice === 'auto') return 'auto';\n if (choice === 'none') return 'none';\n if (choice === 'required') return 'required';\n if (typeof choice === 'object' && 'name' in choice) {\n return { type: 'function', function: { name: choice.name } };\n }\n return undefined;\n}\n\nexport function mapChatFinishReason(finishReason: string | null | undefined): ProviderFinishReason {\n switch (finishReason) {\n case 'stop':\n return 'stop';\n case 'tool_calls':\n case 'function_call':\n return 'tool_calls';\n case 'length':\n return 'length';\n case 'content_filter':\n return 'content_filter';\n case 'error':\n return 'error';\n default:\n return 'stop';\n }\n}\n\nexport function extractChatToolCalls(\n toolCalls: NovitaChatToolCall[] | undefined\n): ProviderToolCallPart[] | undefined {\n if (!toolCalls || toolCalls.length === 0) {\n return undefined;\n }\n\n return toolCalls.map((tc) => {\n let parsedArgs: Record<string, unknown> = {};\n try {\n parsedArgs = tc.function.arguments ? JSON.parse(tc.function.arguments) : {};\n } catch {\n parsedArgs = {};\n }\n\n return {\n id: tc.id,\n name: tc.function.name,\n arguments: parsedArgs,\n };\n });\n}\n\nexport function transformChatUsage(\n usage: NovitaChatCompletionUsage | null | undefined,\n pricing?: ProviderUsagePricing\n): ProviderUsage {\n const mapped: ProviderUsage = {\n promptTokens: usage?.prompt_tokens || 0,\n completionTokens: usage?.completion_tokens || 0,\n totalTokens: usage?.total_tokens || 0,\n cachedTokens: usage?.prompt_tokens_details?.cached_tokens,\n reasoningTokens: usage?.completion_tokens_details?.reasoning_tokens,\n };\n\n return attachUsagePricing(mapped, pricing);\n}\n\nexport function transformChatResponse(\n response: NovitaChatCompletionResponse,\n pricing?: ProviderUsagePricing\n): ProviderResponse {\n const choice = response.choices?.[0];\n const message = choice?.message;\n const reasoning = message?.reasoning_content || message?.reasoning || null;\n\n return {\n content: message?.content || null,\n reasoning,\n reasoningDetails: reasoning ? [{ type: 'text', text: reasoning }] : undefined,\n toolCalls: extractChatToolCalls(message?.tool_calls),\n finishReason: mapChatFinishReason(choice?.finish_reason),\n usage: transformChatUsage(response.usage, pricing),\n metadata: {\n model: response.model,\n provider: 'novita',\n requestId: response.id,\n created: response.created,\n object: response.object,\n },\n };\n}\n\nexport interface NovitaChatStreamState {\n model?: string;\n content: string;\n toolCalls: Map<number, { id: string; name: string; arguments: string }>;\n reasoningContent: string;\n hasContent: boolean;\n hasReasoning: boolean;\n finishReason: string | null;\n}\n\nexport function createChatStreamState(model?: string): NovitaChatStreamState {\n return {\n model,\n content: '',\n toolCalls: new Map(),\n reasoningContent: '',\n hasContent: false,\n hasReasoning: false,\n finishReason: null,\n };\n}\n\nexport function processChatStreamChunk(\n chunk: NovitaChatStreamChunk,\n state: NovitaChatStreamState\n): ProviderStreamChunk[] {\n const chunks: ProviderStreamChunk[] = [];\n const choice = chunk.choices?.[0];\n const delta = choice?.delta;\n\n if (chunk.model) {\n state.model = chunk.model;\n }\n\n if (!delta && !choice?.finish_reason && !chunk.usage) {\n return chunks;\n }\n\n if (delta?.content) {\n state.hasContent = true;\n state.content += delta.content;\n chunks.push({ type: 'content-delta', delta: delta.content });\n }\n\n const reasoningDelta = delta?.reasoning_content || delta?.reasoning;\n if (reasoningDelta) {\n state.hasReasoning = true;\n state.reasoningContent += reasoningDelta;\n chunks.push({ type: 'reasoning-delta', delta: reasoningDelta });\n }\n\n if (delta?.tool_calls) {\n for (const tc of delta.tool_calls) {\n const existing = state.toolCalls.get(tc.index);\n\n if (tc.id && tc.function?.name) {\n state.toolCalls.set(tc.index, {\n id: tc.id,\n name: tc.function.name,\n arguments: tc.function.arguments || '',\n });\n chunks.push({\n type: 'tool-call-start',\n id: tc.id,\n name: tc.function.name,\n });\n } else if (existing && tc.function?.arguments) {\n existing.arguments += tc.function.arguments;\n chunks.push({\n type: 'tool-call-delta',\n id: existing.id,\n argumentsDelta: tc.function.arguments,\n });\n }\n }\n }\n\n if (choice?.finish_reason) {\n state.finishReason = choice.finish_reason;\n\n if (state.hasContent) {\n chunks.push({ type: 'content-done' });\n }\n\n if (state.hasReasoning) {\n chunks.push({ type: 'reasoning-done' });\n }\n\n for (const tc of state.toolCalls.values()) {\n let parsedArgs: Record<string, unknown> = {};\n try {\n parsedArgs = tc.arguments ? JSON.parse(tc.arguments) : {};\n } catch {\n parsedArgs = {};\n }\n\n chunks.push({\n type: 'tool-call-done',\n id: tc.id,\n arguments: parsedArgs,\n });\n }\n }\n\n if (chunk.usage) {\n const reasoningDetails: ProviderReasoningDetail[] | undefined = state.reasoningContent\n ? [{ type: 'text', text: state.reasoningContent }]\n : undefined;\n\n chunks.push({\n type: 'finish',\n finishReason: mapChatFinishReason(state.finishReason),\n usage: transformChatUsage(chunk.usage),\n reasoningDetails,\n });\n }\n\n return chunks;\n}\n\nexport function parseChatStreamEvent(jsonStr: string): NovitaChatStreamChunk | null {\n try {\n return JSON.parse(jsonStr) as NovitaChatStreamChunk;\n } catch {\n return null;\n }\n}\n\nexport async function* parseChatSSEStream(\n response: Response,\n state: NovitaChatStreamState\n): AsyncIterable<ProviderStreamChunk> {\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error('No response body');\n }\n\n const decoder = new TextDecoder();\n let buffer = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(':')) continue;\n if (!trimmed.startsWith('data: ')) continue;\n\n const data = trimmed.slice(6);\n if (data === '[DONE]') continue;\n\n const chunk = parseChatStreamEvent(data);\n if (!chunk) continue;\n\n for (const providerChunk of processChatStreamChunk(chunk, state)) {\n yield providerChunk;\n }\n }\n }\n\n if (buffer.trim()) {\n const trimmed = buffer.trim();\n if (trimmed.startsWith('data: ')) {\n const data = trimmed.slice(6);\n if (data !== '[DONE]') {\n const chunk = parseChatStreamEvent(data);\n if (chunk) {\n for (const providerChunk of processChatStreamChunk(chunk, state)) {\n yield providerChunk;\n }\n }\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n}\n\nexport function buildChatParams(request: ProviderRequest): NovitaChatCompletionRequest {\n const params: NovitaChatCompletionRequest = {\n model: request.model,\n messages: transformChatMessages(request.messages),\n };\n\n if (request.tools && request.tools.length > 0) {\n params.tools = request.tools.map(transformChatTool);\n\n const toolChoice = transformChatToolChoice(request.toolChoice);\n if (toolChoice !== undefined) {\n params.tool_choice = toolChoice;\n }\n\n if (request.parallelToolCalls !== undefined) {\n params.parallel_tool_calls = request.parallelToolCalls;\n }\n }\n\n if (request.maxOutputTokens !== undefined) {\n params.max_tokens = request.maxOutputTokens;\n }\n\n if (request.temperature !== undefined) {\n params.temperature = request.temperature;\n }\n\n if (request.topP !== undefined) {\n params.top_p = request.topP;\n }\n\n if (request.stopSequences && request.stopSequences.length > 0) {\n params.stop = request.stopSequences;\n }\n\n if (request.reasoning?.level !== undefined && request.reasoning.level > 0) {\n params.separate_reasoning = true;\n params.enable_thinking = true;\n }\n\n if (request.responseFormat?.type === 'json') {\n if (request.responseFormat.schema) {\n params.response_format = {\n type: 'json_schema',\n json_schema: {\n name: 'response',\n schema: normalizeStrictJsonSchema(request.responseFormat.schema) as Record<string, unknown>,\n strict: true,\n },\n };\n } else {\n params.response_format = { type: 'json_object' };\n }\n }\n\n if (request.providerOptions) {\n const { _metadata, ...safeOptions } = request.providerOptions as Record<string, unknown> & {\n _metadata?: unknown;\n };\n Object.assign(params, safeOptions);\n }\n\n return params;\n}\n\nexport function createChatErrorChunk(error: string, code?: string): ProviderStreamChunk {\n return { type: 'error', error, code };\n}\n\nfunction isBase64Like(str: string): boolean {\n if (str.startsWith('data:')) return true;\n if (str.length > 200) {\n const base64Pattern = /^[A-Za-z0-9+/]+=*$/;\n return base64Pattern.test(str.substring(0, 200));\n }\n return false;\n}\n\nfunction truncateBase64String(str: string, maxLength: number = 50): string {\n if (str.length <= maxLength) return str;\n const preview = str.substring(0, maxLength);\n return `${preview}...[truncated, ${str.length.toLocaleString()} chars]`;\n}\n\nexport function truncateChatBase64<T>(obj: T, maxLength: number = 50): T {\n if (obj === null || obj === undefined) {\n return obj;\n }\n\n if (typeof obj === 'string') {\n return (isBase64Like(obj) ? truncateBase64String(obj, maxLength) : obj) as T;\n }\n\n if (Array.isArray(obj)) {\n return obj.map((item) => truncateChatBase64(item, maxLength)) as T;\n }\n\n if (typeof obj === 'object') {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n result[key] = truncateChatBase64(value, maxLength);\n }\n return result as T;\n }\n\n return obj;\n}\n","import AI4BHARAT_ICON_FILE from './vendor-icons/ai4bharat.svg';\nimport AISINGAPORE_ICON_FILE from './vendor-icons/aisingapore.svg';\nimport ANTHROPIC_ICON_FILE from './vendor-icons/anthropic.svg';\nimport BAAI_ICON_FILE from './vendor-icons/baai.svg';\nimport BLACK_FOREST_LABS_ICON_FILE from './vendor-icons/blackforestlabs.svg';\nimport BYTEDANCE_ICON_FILE from './vendor-icons/bytedance.svg';\nimport COHERE_ICON_FILE from './vendor-icons/cohere.svg';\nimport DEEPGRAM_ICON_FILE from './vendor-icons/deepgram.svg';\nimport DEEPSEEK_ICON_FILE from './vendor-icons/deepseek.svg';\nimport DEFOG_ICON_FILE from './vendor-icons/defog.svg';\nimport EXAONE_ICON_FILE from './vendor-icons/exaone.svg';\nimport FBLGIT_ICON_FILE from './vendor-icons/fblgit.svg';\nimport GOOGLE_ICON_FILE from './vendor-icons/google.svg';\nimport HUGGINGFACE_ICON_FILE from './vendor-icons/huggingface.svg';\nimport IBM_ICON_FILE from './vendor-icons/ibm.svg';\nimport LEONARDO_ICON_FILE from './vendor-icons/leonardo.svg';\nimport LLAVA_HF_ICON_FILE from './vendor-icons/llava-hf.svg';\nimport LYKON_ICON_FILE from './vendor-icons/lykon.svg';\nimport META_ICON_FILE from './vendor-icons/meta.svg';\nimport MICROSOFT_ICON_FILE from './vendor-icons/microsoft.svg';\nimport MINIMAX_ICON_FILE from './vendor-icons/minimax.svg';\nimport MISTRALAI_ICON_FILE from './vendor-icons/mistralai.svg';\nimport MOONSHOTAI_ICON_FILE from './vendor-icons/moonshotai.svg';\nimport MYSHELL_AI_ICON_FILE from './vendor-icons/myshell-ai.svg';\nimport NVIDIA_ICON_FILE from './vendor-icons/nvidia.svg';\nimport OPENAI_ICON_FILE from './vendor-icons/openai.svg';\nimport OPENCHAT_ICON_FILE from './vendor-icons/openchat.svg';\nimport OPENROUTER_ICON_FILE from './vendor-icons/openrouter.svg';\nimport PERPLEXITY_ICON_FILE from './vendor-icons/perplexity.svg';\nimport PFNET_ICON_FILE from './vendor-icons/pfnet.svg';\nimport PIPECAT_AI_ICON_FILE from './vendor-icons/pipecat-ai.svg';\nimport QWEN_ICON_FILE from './vendor-icons/qwen.svg';\nimport RUNWAYML_ICON_FILE from './vendor-icons/runwayml.svg';\nimport STABILITY_AI_ICON_FILE from './vendor-icons/stabilityai.svg';\nimport THEBLOKE_ICON_FILE from './vendor-icons/thebloke.svg';\nimport TIIUAE_ICON_FILE from './vendor-icons/tiiuae.svg';\nimport TINYLLAMA_ICON_FILE from './vendor-icons/tinyllama.svg';\nimport UNUM_ICON_FILE from './vendor-icons/unum.svg';\nimport XAI_ICON_FILE from './vendor-icons/xai.svg';\nimport ZAI_ORG_ICON_FILE from './vendor-icons/zai-org.svg';\n\nexport const NOVITA_ICON = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"48\" height=\"48\" viewBox=\"0 0 48 48\" role=\"img\" aria-label=\"Novita AI\">\n <rect width=\"48\" height=\"48\" rx=\"10\" fill=\"#F7F8FA\"/>\n <g transform=\"translate(7 13.35) scale(1.4167)\">\n <path d=\"M24 14.8323V14.8326H14.3246L9.16716 9.67507V14.8326H0V14.8314L9.16716 5.66422V0H9.16774L24 14.8323Z\" fill=\"#050505\"/>\n </g>\n</svg>`;\n\nconst OPENROUTER_LAB_ICONS: Record<string, string> = {\n anthropic: ANTHROPIC_ICON_FILE,\n google: GOOGLE_ICON_FILE,\n 'google-ai': GOOGLE_ICON_FILE,\n meta: META_ICON_FILE,\n 'meta-llama': META_ICON_FILE,\n nvidia: NVIDIA_ICON_FILE,\n alibaba: QWEN_ICON_FILE,\n deepseek: DEEPSEEK_ICON_FILE,\n 'deepseek-ai': DEEPSEEK_ICON_FILE,\n qwen: QWEN_ICON_FILE,\n minimax: MINIMAX_ICON_FILE,\n moonshotai: MOONSHOTAI_ICON_FILE,\n moonshot: MOONSHOTAI_ICON_FILE,\n 'x-ai': XAI_ICON_FILE,\n xai: XAI_ICON_FILE,\n 'z-ai': ZAI_ORG_ICON_FILE,\n 'zai-org': ZAI_ORG_ICON_FILE,\n zai: ZAI_ORG_ICON_FILE,\n zhipu: ZAI_ORG_ICON_FILE,\n exaone: EXAONE_ICON_FILE,\n lgai: EXAONE_ICON_FILE,\n openrouter: OPENROUTER_ICON_FILE,\n openai: OPENAI_ICON_FILE,\n 'openai-sdk': OPENAI_ICON_FILE,\n mistral: MISTRALAI_ICON_FILE,\n mistralai: MISTRALAI_ICON_FILE,\n cohere: COHERE_ICON_FILE,\n perplexity: PERPLEXITY_ICON_FILE,\n};\n\nconst COPIED_OPENROUTER_VENDOR_ICONS: Record<string, string> = {\n ai4bharat: AI4BHARAT_ICON_FILE,\n aisingapore: AISINGAPORE_ICON_FILE,\n baai: BAAI_ICON_FILE,\n 'black-forest-labs': BLACK_FOREST_LABS_ICON_FILE,\n blackforestlabs: BLACK_FOREST_LABS_ICON_FILE,\n bfl: BLACK_FOREST_LABS_ICON_FILE,\n bytedance: BYTEDANCE_ICON_FILE,\n deepgram: DEEPGRAM_ICON_FILE,\n defog: DEFOG_ICON_FILE,\n fblgit: FBLGIT_ICON_FILE,\n google: GOOGLE_ICON_FILE,\n huggingface: HUGGINGFACE_ICON_FILE,\n 'hugging-face': HUGGINGFACE_ICON_FILE,\n ibm: IBM_ICON_FILE,\n 'ibm-granite': IBM_ICON_FILE,\n leonardo: LEONARDO_ICON_FILE,\n 'leonardo-ai': LEONARDO_ICON_FILE,\n 'llava-hf': LLAVA_HF_ICON_FILE,\n lykon: LYKON_ICON_FILE,\n microsoft: MICROSOFT_ICON_FILE,\n 'myshell-ai': MYSHELL_AI_ICON_FILE,\n openchat: OPENCHAT_ICON_FILE,\n pfnet: PFNET_ICON_FILE,\n 'pipecat-ai': PIPECAT_AI_ICON_FILE,\n runwayml: RUNWAYML_ICON_FILE,\n 'stability-ai': STABILITY_AI_ICON_FILE,\n stabilityai: STABILITY_AI_ICON_FILE,\n thebloke: THEBLOKE_ICON_FILE,\n tiiuae: TIIUAE_ICON_FILE,\n tinyllama: TINYLLAMA_ICON_FILE,\n unum: UNUM_ICON_FILE,\n};\n\nexport function svgToDataUri(svg: string): string {\n const encoded = encodeURIComponent(svg)\n .replace(/'/g, '%27')\n .replace(/\"/g, '%22');\n return `data:image/svg+xml,${encoded}`;\n}\n\nfunction normalizeIcon(icon: string): string {\n if (icon.startsWith('data:') || icon.startsWith('http://') || icon.startsWith('https://')) {\n return icon;\n }\n return svgToDataUri(icon);\n}\n\nfunction getVendorSegment(modelId?: string): string | undefined {\n const normalized = (modelId || '').trim().toLowerCase();\n if (!normalized || !normalized.includes('/')) return undefined;\n return normalized.split('/')[0];\n}\n\nfunction getLabIcon(modelId?: string): string | undefined {\n const vendor = getVendorSegment(modelId);\n if (!vendor) return undefined;\n\n const icon = OPENROUTER_LAB_ICONS[vendor] || COPIED_OPENROUTER_VENDOR_ICONS[vendor];\n return icon ? normalizeIcon(icon) : undefined;\n}\n\nexport function getNovitaIconDataUri(): string {\n return svgToDataUri(NOVITA_ICON);\n}\n\nexport function getNovitaModelIconDataUri(modelId?: string): string | undefined {\n return getLabIcon(modelId);\n}\n","import { z } from 'zod';\n\n/**\n * Novita provider options schema.\n *\n * Novita exposes an OpenAI-compatible Chat Completions API. These options cover\n * documented Novita-specific and OpenAI-compatible parameters, while\n * passthrough keeps the provider forward-compatible with new API fields.\n */\nexport const novitaProviderOptions = z.object({\n /** Number of completions to generate. */\n n: z.number().int().min(1).max(128).optional(),\n\n /** Sampling seed for best-effort determinism. */\n seed: z.number().int().optional(),\n\n /** Penalize repeated tokens based on frequency. */\n frequency_penalty: z.number().min(-2).max(2).optional(),\n\n /** Penalize repeated tokens based on presence. */\n presence_penalty: z.number().min(-2).max(2).optional(),\n\n /** Novita repetition penalty. */\n repetition_penalty: z.number().gt(0).lt(2).optional(),\n\n /** Top-k sampling limit. */\n top_k: z.number().int().gt(1).lt(128).optional(),\n\n /** Minimum probability threshold relative to the most likely token. */\n min_p: z.number().min(0).max(1).optional(),\n\n /** Token logit biases. */\n logit_bias: z.record(z.string(), z.number().int().min(-100).max(100)).optional(),\n\n /** Return output token log probabilities. */\n logprobs: z.boolean().optional(),\n\n /** Number of top logprobs to return when `logprobs` is enabled. */\n top_logprobs: z.number().int().min(0).max(20).optional(),\n\n /** Request reasoning content separately when supported by the selected model. */\n separate_reasoning: z.boolean().optional(),\n\n /** Enable or disable model thinking when supported by the selected model. */\n enable_thinking: z.boolean().optional(),\n\n /** Output modalities for models that can return audio. */\n modalities: z.array(z.string()).optional(),\n}).passthrough();\n\nexport type NovitaProviderOptions = z.infer<typeof novitaProviderOptions>;\n","import type { ProviderFactoryConfig, ProviderFactoryWithOptions, ProviderConfigSlots } from '@standardagents/spec';\nimport { NovitaProvider } from './NovitaProvider';\nimport { novitaProviderOptions } from './providerOptions';\n\n/**\n * Novita AI provider factory for Standard Agents.\n *\n * Uses Novita's OpenAI-compatible Chat Completions API and live model catalog.\n */\nexport const novita: ProviderFactoryWithOptions<typeof novitaProviderOptions> =\n Object.assign(\n (config: ProviderFactoryConfig) => new NovitaProvider(config),\n {\n providerOptions: novitaProviderOptions,\n configSlots: {\n apiKey: {\n type: 'secret',\n required: true,\n defaultEnv: 'NOVITA_API_KEY',\n overridable: true,\n description: 'Novita AI API key used to authenticate provider requests.',\n },\n baseUrl: {\n type: 'url',\n required: false,\n default: 'https://api.novita.ai/openai/v1',\n overridable: true,\n description: 'Novita OpenAI-compatible API base URL.',\n },\n timeout: {\n type: 'number',\n required: false,\n default: 30000,\n overridable: true,\n description: 'Provider request timeout in milliseconds.',\n },\n } satisfies ProviderConfigSlots,\n }\n );\n\nexport { novitaProviderOptions, type NovitaProviderOptions } from './providerOptions';\nexport {\n NovitaProvider,\n normalizeNovitaPricePerMillion,\n novitaUsagePricingFromModel,\n calculateNovitaUsageCost,\n type NovitaModelInfo,\n} from './NovitaProvider';\n"],"mappings":"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","names":[]}
|
package/package.json
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@standardagents/novita",
|
|
3
|
+
"version": "0.0.0-dev.fffff",
|
|
4
|
+
"private": false,
|
|
5
|
+
"publishConfig": {
|
|
6
|
+
"access": "public",
|
|
7
|
+
"registry": "https://registry.npmjs.org/"
|
|
8
|
+
},
|
|
9
|
+
"type": "module",
|
|
10
|
+
"description": "Novita AI provider for Standard Agents",
|
|
11
|
+
"main": "./dist/index.js",
|
|
12
|
+
"types": "./dist/index.d.ts",
|
|
13
|
+
"exports": {
|
|
14
|
+
".": {
|
|
15
|
+
"types": "./dist/index.d.ts",
|
|
16
|
+
"import": "./dist/index.js"
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
"files": [
|
|
20
|
+
"dist",
|
|
21
|
+
"README.md"
|
|
22
|
+
],
|
|
23
|
+
"scripts": {
|
|
24
|
+
"build": "tsup",
|
|
25
|
+
"dev": "tsup --watch",
|
|
26
|
+
"typecheck": "tsc --noEmit",
|
|
27
|
+
"test": "cd ../.. && vitest --dir packages/novita",
|
|
28
|
+
"test:run": "cd ../.. && vitest run --dir packages/novita"
|
|
29
|
+
},
|
|
30
|
+
"dependencies": {
|
|
31
|
+
"zod": "^4.3.5"
|
|
32
|
+
},
|
|
33
|
+
"peerDependencies": {
|
|
34
|
+
"@standardagents/spec": "^0.24.7"
|
|
35
|
+
},
|
|
36
|
+
"devDependencies": {
|
|
37
|
+
"@standardagents/spec": "workspace:*",
|
|
38
|
+
"tsup": "^8.3.5",
|
|
39
|
+
"typescript": "^5.9.0"
|
|
40
|
+
},
|
|
41
|
+
"keywords": [
|
|
42
|
+
"standardagents",
|
|
43
|
+
"novita",
|
|
44
|
+
"provider",
|
|
45
|
+
"ai",
|
|
46
|
+
"llm"
|
|
47
|
+
],
|
|
48
|
+
"author": "FormKit Inc.",
|
|
49
|
+
"license": "UNLICENSED"
|
|
50
|
+
}
|