@standardagents/novita 0.44.0 → 0.45.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.js +7 -5
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
package/dist/index.js
CHANGED
|
@@ -493,7 +493,8 @@ function buildChatParams(request, reasoningLevels = getNovitaReasoningLevels(req
|
|
|
493
493
|
}
|
|
494
494
|
}
|
|
495
495
|
if (request.providerOptions) {
|
|
496
|
-
const
|
|
496
|
+
const safeOptions = { ...request.providerOptions };
|
|
497
|
+
delete safeOptions._metadata;
|
|
497
498
|
Object.assign(params, safeOptions);
|
|
498
499
|
}
|
|
499
500
|
if (request.reasoning?.level !== void 0) {
|
|
@@ -501,7 +502,8 @@ function buildChatParams(request, reasoningLevels = getNovitaReasoningLevels(req
|
|
|
501
502
|
delete params.reasoning_effort;
|
|
502
503
|
delete params.reasoningEffort;
|
|
503
504
|
if (params.reasoning && typeof params.reasoning === "object" && "effort" in params.reasoning) {
|
|
504
|
-
const
|
|
505
|
+
const otherReasoning = { ...params.reasoning };
|
|
506
|
+
delete otherReasoning.effort;
|
|
505
507
|
params.reasoning = otherReasoning;
|
|
506
508
|
}
|
|
507
509
|
if (request.reasoning.levels ?? reasoningLevels) params.enable_thinking = mapReasoningLevel(request.reasoning.level, request.reasoning.levels ?? reasoningLevels) !== null;
|
|
@@ -620,7 +622,7 @@ var myshell_ai_default = 'data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/
|
|
|
620
622
|
var nvidia_default = 'data:image/svg+xml,<svg height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"><path d="M10.212 8.976V7.62c.127-.01.256-.017.388-.021 3.596-.117 5.957 3.184 5.957 3.184s-2.548 3.647-5.282 3.647a3.227 3.227 0 01-1.063-.175v-4.109c1.4.174 1.681.812 2.523 2.258l1.873-1.627a4.905 4.905 0 00-3.67-1.846 6.594 6.594 0 00-.729.044m0-4.476v2.025c.13-.01.259-.019.388-.024 5.002-.174 8.261 4.226 8.261 4.226s-3.743 4.69-7.643 4.69c-.338 0-.675-.031-1.007-.092v1.25c.278.038.558.057.838.057 3.629 0 6.253-1.91 8.794-4.169.421.347 2.146 1.193 2.501 1.564-2.416 2.083-8.048 3.763-11.24 3.763-.308 0-.603-.02-.894-.048V19.5H24v-15H10.21zm0 9.756v1.068c-3.356-.616-4.287-4.21-4.287-4.21a7.173 7.173 0 014.287-2.138v1.172h-.005a3.182 3.182 0 00-2.502 1.178s.615 2.276 2.507 2.931m-5.961-3.3c1.436-1.935 3.604-3.148 5.961-3.336V6.523C5.81 6.887 2 10.723 2 10.723s2.158 6.427 8.21 7.015v-1.166C5.77 16 4.25 10.958 4.25 10.958h-.002z" fill="%2374B71B" fill-rule="nonzero"/></svg>%0A';
|
|
621
623
|
|
|
622
624
|
// src/vendor-icons/openai.svg
|
|
623
|
-
var openai_default = 'data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" fill="none" viewBox="0 0 128 128"><
|
|
625
|
+
var openai_default = 'data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" fill="none" viewBox="0 0 128 128"><rect width="128" height="128" rx="28" fill="%23000"/><path fill="%23fff" transform="translate(18 18) scale(0.71875)" d="M118.824 52.388a31.9 31.9 0 0 0-2.74-26.192 32.25 32.25 0 0 0-34.736-15.472A31.9 31.9 0 0 0 57.296 0C43.28-.032 30.844 8.992 26.532 22.328A31.9 31.9 0 0 0 5.208 37.796C-1.828 49.924-.224 65.212 9.176 75.612a31.9 31.9 0 0 0 2.74 26.192 32.25 32.25 0 0 0 34.736 15.472 31.88 31.88 0 0 0 24.052 10.72c14.024.036 26.464-8.996 30.776-22.344a31.9 31.9 0 0 0 21.324-15.468 32.26 32.26 0 0 0-3.976-37.804zm-48.112 67.244a23.9 23.9 0 0 1-15.356-5.552c.196-.104.536-.292.756-.428L81.6 98.932a4.14 4.14 0 0 0 2.096-3.628V59.372l10.772 6.22a.38.38 0 0 1 .208.296v29.756c-.016 13.232-10.732 23.96-23.964 23.988M19.176 97.62a23.88 23.88 0 0 1-2.86-16.072c.188.112.52.316.756.452L42.56 96.72a4.15 4.15 0 0 0 4.188 0l31.116-17.968v12.44a.4.4 0 0 1-.152.332L51.948 106.4c-11.476 6.608-26.132 2.68-32.768-8.78zm-6.708-55.636a23.9 23.9 0 0 1 12.484-10.516c0 .22-.012.608-.012.88v29.444a4.15 4.15 0 0 0 2.092 3.624L58.148 83.38 47.376 89.6a.38.38 0 0 1-.364.032L21.244 74.744c-11.452-6.632-15.38-21.284-8.78-32.756zm88.504 20.596L69.856 44.612l10.772-6.216a.38.38 0 0 1 .364-.032L106.76 53.24c11.472 6.628 15.404 21.304 8.776 32.776a23.98 23.98 0 0 1-12.48 10.512V66.204a4.14 4.14 0 0 0-2.08-3.624zm10.72-16.136c-.188-.116-.52-.316-.756-.452l-25.488-14.72a4.15 4.15 0 0 0-4.188 0L50.144 49.24V36.8a.4.4 0 0 1 .152-.332L76.06 21.604c11.476-6.62 26.148-2.68 32.764 8.8a23.98 23.98 0 0 1 2.86 16.04zM44.288 68.616l-10.776-6.22a.38.38 0 0 1-.208-.296V32.344C33.312 19.096 44.06 8.36 57.308 8.368a23.98 23.98 0 0 1 15.336 5.552c-.196.104-.532.292-.756.428L46.4 29.068a4.14 4.14 0 0 0-2.096 3.624l-.016 35.916zM50.14 56 64 47.996l13.86 8V72L64 80l-13.86-8z"/></svg>%0A';
|
|
624
626
|
|
|
625
627
|
// src/vendor-icons/openchat.svg
|
|
626
628
|
var openchat_default = 'data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" viewBox="0 0 48 48" fill="none"><rect width="48" height="48" rx="10" fill="%23374151"/><text x="24" y="28" fill="white" font-size="11" font-family="Arial, sans-serif" font-weight="700" text-anchor="middle">CHAT</text></svg>%0A';
|
|
@@ -1053,7 +1055,7 @@ var NovitaProvider = class _NovitaProvider {
|
|
|
1053
1055
|
}
|
|
1054
1056
|
}
|
|
1055
1057
|
async stream(request) {
|
|
1056
|
-
const
|
|
1058
|
+
const toProviderError = this.toProviderError.bind(this);
|
|
1057
1059
|
const pricingPromise = this.getPricingModel(request.model);
|
|
1058
1060
|
try {
|
|
1059
1061
|
const response = await fetch(`${this.baseUrl()}/chat/completions`, {
|
|
@@ -1084,7 +1086,7 @@ var NovitaProvider = class _NovitaProvider {
|
|
|
1084
1086
|
yield chunk;
|
|
1085
1087
|
}
|
|
1086
1088
|
} catch (error) {
|
|
1087
|
-
const providerError =
|
|
1089
|
+
const providerError = toProviderError(error);
|
|
1088
1090
|
yield createChatErrorChunk(providerError.message, providerError.code);
|
|
1089
1091
|
}
|
|
1090
1092
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +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 getNovitaReasoningLevels,\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?: NovitaPricing;\n is_tiered_billing?: boolean;\n tiered_billing_configs?: NovitaTierConfig[];\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\ninterface NovitaPricing {\n prompt?: NovitaPriceInfo;\n completion?: NovitaPriceInfo;\n input_cache_read?: NovitaPriceInfo;\n}\n\ninterface NovitaTierConfig {\n min_tokens?: number;\n max_tokens?: number;\n pricing?: NovitaPricing;\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 pricing: {\n prompt: { price_per_m: 3_000 },\n completion: { price_per_m: 12_000 },\n input_cache_read: { price_per_m: 600 },\n },\n is_tiered_billing: true,\n tiered_billing_configs: [\n {\n min_tokens: 1,\n max_tokens: 524_288,\n pricing: {\n prompt: { price_per_m: 3_000 },\n completion: { price_per_m: 12_000 },\n input_cache_read: { price_per_m: 600 },\n },\n },\n {\n min_tokens: 524_288,\n max_tokens: 1_000_000,\n pricing: {\n prompt: { price_per_m: 6_000 },\n completion: { price_per_m: 24_000 },\n input_cache_read: { price_per_m: 1_200 },\n },\n },\n ],\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\nfunction novitaTierPricing(\n model: NovitaModelInfo | undefined,\n promptTokens: number | undefined\n): NovitaPricing | undefined {\n if (!model?.is_tiered_billing || promptTokens === undefined) return undefined;\n // Catalog tiers overlap at their boundary: MiniMax M3 lists tier 1 as\n // 1–524,288 and tier 2 as 524,288–1,000,000. Novita does not say which tier\n // owns the shared value, so the upper tier applies from its min_tokens\n // (`>=`), the same rule as provider-pricing's longContextThreshold.\n let selected: NovitaTierConfig | undefined;\n for (const tier of model.tiered_billing_configs ?? []) {\n if (typeof tier.min_tokens !== 'number' || promptTokens < tier.min_tokens) continue;\n if (!selected || tier.min_tokens >= (selected.min_tokens as number)) selected = tier;\n }\n return selected?.pricing;\n}\n\n/**\n * Pass the request's `promptTokens` to price tiered catalog entries\n * (`is_tiered_billing`) at the matching tier. Without it, the base rates apply.\n */\nexport function novitaUsagePricingFromModel(\n model: NovitaModelInfo | undefined,\n promptTokens?: number\n): ProviderUsagePricing | undefined {\n const tierPricing = novitaTierPricing(model, promptTokens);\n const prices = tierPricing ?? model?.pricing;\n const inputPerMillion = normalizeNovitaPricePerMillion(\n prices?.prompt?.price_per_m ?? (tierPricing ? undefined : model?.input_token_price_per_m)\n );\n const outputPerMillion = normalizeNovitaPricePerMillion(\n prices?.completion?.price_per_m ?? (tierPricing ? undefined : model?.output_token_price_per_m)\n );\n if (inputPerMillion === undefined || outputPerMillion === undefined) {\n return undefined;\n }\n const cachedInputPerMillion = normalizeNovitaPricePerMillion(\n prices?.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 reasoningLevels: getNovitaReasoningLevels(model.id),\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 settlePricingModel(\n pricingPromise: Promise<NovitaModelInfo | undefined>\n ): Promise<NovitaModelInfo | 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 /** Resolves the catalog entry; pricing is chosen once usage reports the prompt size. */\n private async getPricingModel(\n modelId: string | undefined\n ): Promise<NovitaModelInfo | undefined> {\n if (!modelId) return undefined;\n try {\n const models = await this.fetchModelsWithCache();\n return models.find((candidate) => candidate.id === modelId);\n } catch {\n return STATIC_MODELS.find((candidate) => candidate.id === modelId);\n }\n }\n\n async generate(request: ProviderRequest): Promise<ProviderResponse> {\n const pricingPromise = this.getPricingModel(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 pricingModel = await NovitaProvider.settlePricingModel(pricingPromise);\n const data = await response.json();\n return transformChatResponse(\n data,\n novitaUsagePricingFromModel(pricingModel, data.usage?.prompt_tokens)\n );\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.getPricingModel(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 pricingModel = await NovitaProvider.settlePricingModel(pricingPromise);\n attachUsagePricing(\n chunk.usage,\n novitaUsagePricingFromModel(pricingModel, chunk.usage.promptTokens)\n );\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 { mapReasoningLevel } from '@standardagents/spec';\nimport 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 user?: string;\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 const content = Array.isArray(msg.content)\n ? msg.content.filter(part => part.type === 'text').map(part => part.text).join('\\n')\n : msg.content;\n let output: string;\n\n if (typeof content === 'string') {\n output = content;\n } else if ('type' in content) {\n if (content.type === 'text') {\n output = content.text;\n } else if (content.type === 'error') {\n output = `Error: ${content.error}`;\n } else {\n output = JSON.stringify(content);\n }\n } else {\n output = JSON.stringify(content);\n }\n\n const imageAttachments = (Array.isArray(msg.content) ? msg.content.filter(part => (part.type === 'image' && Boolean(part.data)) || part.type === 'image_url') : []);\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 imageContent.push(transformChatContentPart(attachment));\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 // No `strict` (2026-08-04): grammar-constrained decoding measurably\n // degraded Hy3's generation quality — three exact-replica runs without\n // it produced the best output of a 30-run campaign, and no trained\n // harness (Claude Code/opencode) sends it.\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 getNovitaReasoningLevels(model: string): Record<number, string | null> | undefined {\n return /^(qwen\\/qwen3(?!.*(?:instruct|thinking|coder))|moonshotai\\/kimi-k2\\.5)/i.test(model)\n ? { 0: null, 100: 'enabled' } : undefined;\n}\n\nexport function buildChatParams(request: ProviderRequest, reasoningLevels = getNovitaReasoningLevels(request.model)): 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 // Stable per-thread identity → replica-sticky routing. Novita load-balances\n // models across replicas with per-replica prefix caches; without `user`,\n // consecutive requests land on random replicas and only the\n // universally-warm system prompt ever hits (measured 3-4% cached on Hy3\n // while a byte-identical replay to a warm replica cached 99.9%).\n if (request.user) {\n params.user = request.user;\n }\n\n if (request.stopSequences && request.stopSequences.length > 0) {\n params.stop = request.stopSequences;\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 if (request.reasoning?.level !== undefined) {\n delete params.effort;\n delete params.reasoning_effort;\n delete params.reasoningEffort;\n if (params.reasoning && typeof params.reasoning === 'object' && 'effort' in params.reasoning) {\n const { effort, ...otherReasoning } = params.reasoning;\n params.reasoning = otherReasoning;\n }\n if (request.reasoning.levels ?? reasoningLevels) params.enable_thinking = mapReasoningLevel(request.reasoning.level, request.reasoning.levels ?? reasoningLevels) !== null;\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":[]}
|
|
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 getNovitaReasoningLevels,\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?: NovitaPricing;\n is_tiered_billing?: boolean;\n tiered_billing_configs?: NovitaTierConfig[];\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\ninterface NovitaPricing {\n prompt?: NovitaPriceInfo;\n completion?: NovitaPriceInfo;\n input_cache_read?: NovitaPriceInfo;\n}\n\ninterface NovitaTierConfig {\n min_tokens?: number;\n max_tokens?: number;\n pricing?: NovitaPricing;\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 pricing: {\n prompt: { price_per_m: 3_000 },\n completion: { price_per_m: 12_000 },\n input_cache_read: { price_per_m: 600 },\n },\n is_tiered_billing: true,\n tiered_billing_configs: [\n {\n min_tokens: 1,\n max_tokens: 524_288,\n pricing: {\n prompt: { price_per_m: 3_000 },\n completion: { price_per_m: 12_000 },\n input_cache_read: { price_per_m: 600 },\n },\n },\n {\n min_tokens: 524_288,\n max_tokens: 1_000_000,\n pricing: {\n prompt: { price_per_m: 6_000 },\n completion: { price_per_m: 24_000 },\n input_cache_read: { price_per_m: 1_200 },\n },\n },\n ],\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\nfunction novitaTierPricing(\n model: NovitaModelInfo | undefined,\n promptTokens: number | undefined\n): NovitaPricing | undefined {\n if (!model?.is_tiered_billing || promptTokens === undefined) return undefined;\n // Catalog tiers overlap at their boundary: MiniMax M3 lists tier 1 as\n // 1–524,288 and tier 2 as 524,288–1,000,000. Novita does not say which tier\n // owns the shared value, so the upper tier applies from its min_tokens\n // (`>=`), the same rule as provider-pricing's longContextThreshold.\n let selected: NovitaTierConfig | undefined;\n for (const tier of model.tiered_billing_configs ?? []) {\n if (typeof tier.min_tokens !== 'number' || promptTokens < tier.min_tokens) continue;\n if (!selected || tier.min_tokens >= (selected.min_tokens as number)) selected = tier;\n }\n return selected?.pricing;\n}\n\n/**\n * Pass the request's `promptTokens` to price tiered catalog entries\n * (`is_tiered_billing`) at the matching tier. Without it, the base rates apply.\n */\nexport function novitaUsagePricingFromModel(\n model: NovitaModelInfo | undefined,\n promptTokens?: number\n): ProviderUsagePricing | undefined {\n const tierPricing = novitaTierPricing(model, promptTokens);\n const prices = tierPricing ?? model?.pricing;\n const inputPerMillion = normalizeNovitaPricePerMillion(\n prices?.prompt?.price_per_m ?? (tierPricing ? undefined : model?.input_token_price_per_m)\n );\n const outputPerMillion = normalizeNovitaPricePerMillion(\n prices?.completion?.price_per_m ?? (tierPricing ? undefined : model?.output_token_price_per_m)\n );\n if (inputPerMillion === undefined || outputPerMillion === undefined) {\n return undefined;\n }\n const cachedInputPerMillion = normalizeNovitaPricePerMillion(\n prices?.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 reasoningLevels: getNovitaReasoningLevels(model.id),\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 settlePricingModel(\n pricingPromise: Promise<NovitaModelInfo | undefined>\n ): Promise<NovitaModelInfo | 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 /** Resolves the catalog entry; pricing is chosen once usage reports the prompt size. */\n private async getPricingModel(\n modelId: string | undefined\n ): Promise<NovitaModelInfo | undefined> {\n if (!modelId) return undefined;\n try {\n const models = await this.fetchModelsWithCache();\n return models.find((candidate) => candidate.id === modelId);\n } catch {\n return STATIC_MODELS.find((candidate) => candidate.id === modelId);\n }\n }\n\n async generate(request: ProviderRequest): Promise<ProviderResponse> {\n const pricingPromise = this.getPricingModel(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 pricingModel = await NovitaProvider.settlePricingModel(pricingPromise);\n const data = await response.json();\n return transformChatResponse(\n data,\n novitaUsagePricingFromModel(pricingModel, data.usage?.prompt_tokens)\n );\n } catch (error) {\n throw this.toProviderError(error);\n }\n }\n\n async stream(request: ProviderRequest): Promise<AsyncIterable<ProviderStreamChunk>> {\n const toProviderError = this.toProviderError.bind(this);\n const pricingPromise = this.getPricingModel(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 pricingModel = await NovitaProvider.settlePricingModel(pricingPromise);\n attachUsagePricing(\n chunk.usage,\n novitaUsagePricingFromModel(pricingModel, chunk.usage.promptTokens)\n );\n }\n yield chunk;\n }\n } catch (error) {\n const providerError = 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 { mapReasoningLevel } from '@standardagents/spec';\nimport 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 user?: string;\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 const content = Array.isArray(msg.content)\n ? msg.content.filter(part => part.type === 'text').map(part => part.text).join('\\n')\n : msg.content;\n let output: string;\n\n if (typeof content === 'string') {\n output = content;\n } else if ('type' in content) {\n if (content.type === 'text') {\n output = content.text;\n } else if (content.type === 'error') {\n output = `Error: ${content.error}`;\n } else {\n output = JSON.stringify(content);\n }\n } else {\n output = JSON.stringify(content);\n }\n\n const imageAttachments = (Array.isArray(msg.content) ? msg.content.filter(part => (part.type === 'image' && Boolean(part.data)) || part.type === 'image_url') : []);\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 imageContent.push(transformChatContentPart(attachment));\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 // No `strict` (2026-08-04): grammar-constrained decoding measurably\n // degraded Hy3's generation quality — three exact-replica runs without\n // it produced the best output of a 30-run campaign, and no trained\n // harness (Claude Code/opencode) sends it.\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 getNovitaReasoningLevels(model: string): Record<number, string | null> | undefined {\n return /^(qwen\\/qwen3(?!.*(?:instruct|thinking|coder))|moonshotai\\/kimi-k2\\.5)/i.test(model)\n ? { 0: null, 100: 'enabled' } : undefined;\n}\n\nexport function buildChatParams(request: ProviderRequest, reasoningLevels = getNovitaReasoningLevels(request.model)): 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 // Stable per-thread identity → replica-sticky routing. Novita load-balances\n // models across replicas with per-replica prefix caches; without `user`,\n // consecutive requests land on random replicas and only the\n // universally-warm system prompt ever hits (measured 3-4% cached on Hy3\n // while a byte-identical replay to a warm replica cached 99.9%).\n if (request.user) {\n params.user = request.user;\n }\n\n if (request.stopSequences && request.stopSequences.length > 0) {\n params.stop = request.stopSequences;\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 safeOptions = { ...request.providerOptions };\n delete safeOptions._metadata;\n Object.assign(params, safeOptions);\n }\n\n if (request.reasoning?.level !== undefined) {\n delete params.effort;\n delete params.reasoning_effort;\n delete params.reasoningEffort;\n if (params.reasoning && typeof params.reasoning === 'object' && 'effort' in params.reasoning) {\n const otherReasoning: Record<string, unknown> = { ...params.reasoning };\n delete otherReasoning.effort;\n params.reasoning = otherReasoning;\n }\n if (request.reasoning.levels ?? reasoningLevels) params.enable_thinking = mapReasoningLevel(request.reasoning.level, request.reasoning.levels ?? reasoningLevels) !== null;\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
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@standardagents/novita",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.45.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public",
|
|
@@ -31,10 +31,10 @@
|
|
|
31
31
|
"zod": "^4.3.5"
|
|
32
32
|
},
|
|
33
33
|
"peerDependencies": {
|
|
34
|
-
"@standardagents/spec": "^0.
|
|
34
|
+
"@standardagents/spec": "^0.45.0"
|
|
35
35
|
},
|
|
36
36
|
"devDependencies": {
|
|
37
|
-
"@standardagents/spec": "0.
|
|
37
|
+
"@standardagents/spec": "0.45.0",
|
|
38
38
|
"tsup": "^8.3.5",
|
|
39
39
|
"typescript": "^5.9.0"
|
|
40
40
|
},
|