@standardagents/novita 0.42.2 → 0.43.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -57,6 +57,15 @@ that value to `cachedInputPerMillion` and uses it for cached prompt tokens.
57
57
  Cache write tokens remain part of uncached prompt input usage and are priced at
58
58
  the normal input rate.
59
59
 
60
+ Some catalog entries are tiered (`is_tiered_billing`), with rates in
61
+ `tiered_billing_configs` that depend on prompt size. The provider prices each
62
+ request at the tier that matches its reported `promptTokens`. For example,
63
+ MiniMax M3 bills $0.30 input / $0.06 cache read / $1.20 output per million
64
+ tokens below 524,288 prompt tokens, and double from 524,288. The catalog lists
65
+ 524,288 as both the end of the first tier and the start of the second, so the
66
+ provider applies the higher tier at exactly 524,288. Model discovery shows the
67
+ base tier.
68
+
60
69
  When response usage includes token counts, generated and streamed responses also
61
70
  attach `usage.cost`. If the live catalog cannot be reached, the provider falls
62
71
  back to a small static set of currently recommended Novita models.
package/dist/index.d.ts CHANGED
@@ -34,18 +34,30 @@ interface NovitaModelInfo {
34
34
  context_size?: number;
35
35
  input_token_price_per_m?: number;
36
36
  output_token_price_per_m?: number;
37
- pricing?: {
38
- prompt?: NovitaPriceInfo;
39
- completion?: NovitaPriceInfo;
40
- input_cache_read?: NovitaPriceInfo;
41
- };
37
+ pricing?: NovitaPricing;
38
+ is_tiered_billing?: boolean;
39
+ tiered_billing_configs?: NovitaTierConfig[];
42
40
  }
43
41
  interface NovitaPriceInfo {
44
42
  origin_price_per_m?: number;
45
43
  price_per_m?: number;
46
44
  }
45
+ interface NovitaPricing {
46
+ prompt?: NovitaPriceInfo;
47
+ completion?: NovitaPriceInfo;
48
+ input_cache_read?: NovitaPriceInfo;
49
+ }
50
+ interface NovitaTierConfig {
51
+ min_tokens?: number;
52
+ max_tokens?: number;
53
+ pricing?: NovitaPricing;
54
+ }
47
55
  declare function normalizeNovitaPricePerMillion(value: unknown): number | undefined;
48
- declare function novitaUsagePricingFromModel(model: NovitaModelInfo | undefined): ProviderUsagePricing | undefined;
56
+ /**
57
+ * Pass the request's `promptTokens` to price tiered catalog entries
58
+ * (`is_tiered_billing`) at the matching tier. Without it, the base rates apply.
59
+ */
60
+ declare function novitaUsagePricingFromModel(model: NovitaModelInfo | undefined, promptTokens?: number): ProviderUsagePricing | undefined;
49
61
  declare function calculateNovitaUsageCost(usage: ProviderUsage, pricing?: ProviderUsagePricing): number | undefined;
50
62
  declare class NovitaProvider implements LLMProviderInterface {
51
63
  readonly name = "novita";
@@ -65,8 +77,9 @@ declare class NovitaProvider implements LLMProviderInterface {
65
77
  getModelCapabilities(modelId: string): Promise<ModelCapabilities | null>;
66
78
  private mapToProviderModelInfo;
67
79
  getModels(filter?: string): Promise<ProviderModelInfo[]>;
68
- private static settleUsagePricing;
69
- private getUsagePricing;
80
+ private static settlePricingModel;
81
+ /** Resolves the catalog entry; pricing is chosen once usage reports the prompt size. */
82
+ private getPricingModel;
70
83
  generate(request: ProviderRequest): Promise<ProviderResponse>;
71
84
  stream(request: ProviderRequest): Promise<AsyncIterable<ProviderStreamChunk>>;
72
85
  private toHttpProviderErrorFromResponse;
package/dist/index.js CHANGED
@@ -781,7 +781,33 @@ var STATIC_MODELS = [
781
781
  description: "Large general-purpose model on Novita for agents, tool use, and long context.",
782
782
  context_size: 1e6,
783
783
  input_token_price_per_m: 3e3,
784
- output_token_price_per_m: 12e3
784
+ output_token_price_per_m: 12e3,
785
+ pricing: {
786
+ prompt: { price_per_m: 3e3 },
787
+ completion: { price_per_m: 12e3 },
788
+ input_cache_read: { price_per_m: 600 }
789
+ },
790
+ is_tiered_billing: true,
791
+ tiered_billing_configs: [
792
+ {
793
+ min_tokens: 1,
794
+ max_tokens: 524288,
795
+ pricing: {
796
+ prompt: { price_per_m: 3e3 },
797
+ completion: { price_per_m: 12e3 },
798
+ input_cache_read: { price_per_m: 600 }
799
+ }
800
+ },
801
+ {
802
+ min_tokens: 524288,
803
+ max_tokens: 1e6,
804
+ pricing: {
805
+ prompt: { price_per_m: 6e3 },
806
+ completion: { price_per_m: 24e3 },
807
+ input_cache_read: { price_per_m: 1200 }
808
+ }
809
+ }
810
+ ]
785
811
  },
786
812
  {
787
813
  id: "deepseek/deepseek-v4-pro",
@@ -832,18 +858,29 @@ function normalizeNovitaPricePerMillion(value) {
832
858
  }
833
859
  return Number((value / NOVITA_PRICE_SCALE).toFixed(12));
834
860
  }
835
- function novitaUsagePricingFromModel(model) {
861
+ function novitaTierPricing(model, promptTokens) {
862
+ if (!model?.is_tiered_billing || promptTokens === void 0) return void 0;
863
+ let selected;
864
+ for (const tier of model.tiered_billing_configs ?? []) {
865
+ if (typeof tier.min_tokens !== "number" || promptTokens < tier.min_tokens) continue;
866
+ if (!selected || tier.min_tokens >= selected.min_tokens) selected = tier;
867
+ }
868
+ return selected?.pricing;
869
+ }
870
+ function novitaUsagePricingFromModel(model, promptTokens) {
871
+ const tierPricing = novitaTierPricing(model, promptTokens);
872
+ const prices = tierPricing ?? model?.pricing;
836
873
  const inputPerMillion = normalizeNovitaPricePerMillion(
837
- model?.pricing?.prompt?.price_per_m ?? model?.input_token_price_per_m
874
+ prices?.prompt?.price_per_m ?? (tierPricing ? void 0 : model?.input_token_price_per_m)
838
875
  );
839
876
  const outputPerMillion = normalizeNovitaPricePerMillion(
840
- model?.pricing?.completion?.price_per_m ?? model?.output_token_price_per_m
877
+ prices?.completion?.price_per_m ?? (tierPricing ? void 0 : model?.output_token_price_per_m)
841
878
  );
842
879
  if (inputPerMillion === void 0 || outputPerMillion === void 0) {
843
880
  return void 0;
844
881
  }
845
882
  const cachedInputPerMillion = normalizeNovitaPricePerMillion(
846
- model?.pricing?.input_cache_read?.price_per_m
883
+ prices?.input_cache_read?.price_per_m
847
884
  );
848
885
  const pricing = {
849
886
  inputPerMillion,
@@ -964,7 +1001,7 @@ var NovitaProvider = class _NovitaProvider {
964
1001
  return STATIC_MODELS.map((model) => this.mapToProviderModelInfo(model));
965
1002
  }
966
1003
  }
967
- static async settleUsagePricing(pricingPromise) {
1004
+ static async settlePricingModel(pricingPromise) {
968
1005
  let timer;
969
1006
  const timeout = new Promise((resolve) => {
970
1007
  timer = setTimeout(() => resolve(void 0), _NovitaProvider.USAGE_PRICING_FINISH_WAIT_MS);
@@ -975,19 +1012,18 @@ var NovitaProvider = class _NovitaProvider {
975
1012
  if (timer !== void 0) clearTimeout(timer);
976
1013
  }
977
1014
  }
978
- async getUsagePricing(modelId) {
1015
+ /** Resolves the catalog entry; pricing is chosen once usage reports the prompt size. */
1016
+ async getPricingModel(modelId) {
979
1017
  if (!modelId) return void 0;
980
1018
  try {
981
1019
  const models = await this.fetchModelsWithCache();
982
- const model = models.find((candidate) => candidate.id === modelId);
983
- return novitaUsagePricingFromModel(model);
1020
+ return models.find((candidate) => candidate.id === modelId);
984
1021
  } catch {
985
- const staticModel = STATIC_MODELS.find((candidate) => candidate.id === modelId);
986
- return novitaUsagePricingFromModel(staticModel);
1022
+ return STATIC_MODELS.find((candidate) => candidate.id === modelId);
987
1023
  }
988
1024
  }
989
1025
  async generate(request) {
990
- const pricingPromise = this.getUsagePricing(request.model);
1026
+ const pricingPromise = this.getPricingModel(request.model);
991
1027
  try {
992
1028
  const response = await fetch(`${this.baseUrl()}/chat/completions`, {
993
1029
  method: "POST",
@@ -998,16 +1034,19 @@ var NovitaProvider = class _NovitaProvider {
998
1034
  if (!response.ok) {
999
1035
  throw await this.toHttpProviderErrorFromResponse(response, "Novita API error");
1000
1036
  }
1001
- const pricing = await _NovitaProvider.settleUsagePricing(pricingPromise);
1037
+ const pricingModel = await _NovitaProvider.settlePricingModel(pricingPromise);
1002
1038
  const data = await response.json();
1003
- return transformChatResponse(data, pricing);
1039
+ return transformChatResponse(
1040
+ data,
1041
+ novitaUsagePricingFromModel(pricingModel, data.usage?.prompt_tokens)
1042
+ );
1004
1043
  } catch (error) {
1005
1044
  throw this.toProviderError(error);
1006
1045
  }
1007
1046
  }
1008
1047
  async stream(request) {
1009
1048
  const self = this;
1010
- const pricingPromise = this.getUsagePricing(request.model);
1049
+ const pricingPromise = this.getPricingModel(request.model);
1011
1050
  try {
1012
1051
  const response = await fetch(`${this.baseUrl()}/chat/completions`, {
1013
1052
  method: "POST",
@@ -1028,8 +1067,11 @@ var NovitaProvider = class _NovitaProvider {
1028
1067
  try {
1029
1068
  for await (const chunk of parseChatSSEStream(response, state)) {
1030
1069
  if (chunk.type === "finish") {
1031
- const pricing = await _NovitaProvider.settleUsagePricing(pricingPromise);
1032
- if (pricing) attachUsagePricing(chunk.usage, pricing);
1070
+ const pricingModel = await _NovitaProvider.settlePricingModel(pricingPromise);
1071
+ attachUsagePricing(
1072
+ chunk.usage,
1073
+ novitaUsagePricingFromModel(pricingModel, chunk.usage.promptTokens)
1074
+ );
1033
1075
  }
1034
1076
  yield chunk;
1035
1077
  }
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 createChatErrorChunk,\n createChatStreamState,\n parseChatSSEStream,\n transformChatResponse,\n truncateChatBase64,\n} from './chat-completions-transformers';\nimport { getNovitaIconDataUri, getNovitaModelIconDataUri } from './icons';\n\nexport { ProviderError };\n\nexport interface NovitaModelInfo {\n id: string;\n object?: string;\n created?: number;\n title?: string;\n description?: string;\n context_size?: number;\n input_token_price_per_m?: number;\n output_token_price_per_m?: number;\n pricing?: {\n prompt?: NovitaPriceInfo;\n completion?: NovitaPriceInfo;\n input_cache_read?: NovitaPriceInfo;\n };\n}\n\nconst DEFAULT_BASE_URL = 'https://api.novita.ai/openai/v1';\nconst NOVITA_PRICE_SCALE = 10_000;\n\ninterface NovitaPriceInfo {\n origin_price_per_m?: number;\n price_per_m?: number;\n}\n\nconst STATIC_MODELS: NovitaModelInfo[] = [\n {\n id: 'zai-org/glm-5.2',\n title: 'zai-org/glm-5.2',\n description: 'Large long-context model on Novita for coding, reasoning, and planning.',\n context_size: 1_048_576,\n input_token_price_per_m: 14_000,\n output_token_price_per_m: 44_000,\n },\n {\n id: 'moonshotai/kimi-k2.7-code',\n title: 'moonshotai/kimi-k2.7-code',\n description: 'Large coding and agentic tool-use model on Novita.',\n context_size: 262_144,\n input_token_price_per_m: 9_500,\n output_token_price_per_m: 40_000,\n },\n {\n id: 'minimax/minimax-m3',\n title: 'minimax/minimax-m3',\n description: 'Large general-purpose model on Novita for agents, tool use, and long context.',\n context_size: 1_000_000,\n input_token_price_per_m: 3_000,\n output_token_price_per_m: 12_000,\n },\n {\n id: 'deepseek/deepseek-v4-pro',\n title: 'deepseek/deepseek-v4-pro',\n description: 'Large reasoning and planning model on Novita.',\n context_size: 1_048_576,\n input_token_price_per_m: 16_000,\n output_token_price_per_m: 32_000,\n },\n {\n id: 'deepseek/deepseek-v4-flash',\n title: 'deepseek/deepseek-v4-flash',\n description: 'Cost-effective long-context DeepSeek model on Novita.',\n context_size: 1_048_576,\n input_token_price_per_m: 1_400,\n output_token_price_per_m: 2_800,\n },\n {\n id: 'deepseek/deepseek-v3.2',\n title: 'deepseek/deepseek-v3.2',\n description: 'General reasoning and planning model on Novita.',\n context_size: 163_840,\n input_token_price_per_m: 2_690,\n output_token_price_per_m: 4_000,\n },\n {\n id: 'nvidia/nemotron-3-nano-30b-a3b',\n title: 'nvidia/nemotron-3-nano-30b-a3b',\n description: 'Low-latency Novita model for lightweight extraction and classification.',\n context_size: 262_144,\n input_token_price_per_m: 500,\n output_token_price_per_m: 2_000,\n },\n];\n\nfunction trimTrailingSlashes(value: string): string {\n return value.replace(/\\/+$/, '');\n}\n\nfunction includesInsensitive(haystack: string | undefined, needle: string): boolean {\n return haystack?.toLowerCase().includes(needle.toLowerCase()) ?? false;\n}\n\nfunction isVisionModel(model: NovitaModelInfo): boolean {\n const searchable = `${model.id} ${model.title || ''} ${model.description || ''}`;\n return (\n includesInsensitive(searchable, 'vision') ||\n includesInsensitive(searchable, 'visual') ||\n includesInsensitive(searchable, 'multimodal') ||\n includesInsensitive(searchable, 'image') ||\n includesInsensitive(searchable, 'ocr') ||\n /\\bvl\\b/i.test(searchable)\n );\n}\n\nexport function normalizeNovitaPricePerMillion(value: unknown): number | undefined {\n if (typeof value !== 'number' || !Number.isFinite(value)) {\n return undefined;\n }\n return Number((value / NOVITA_PRICE_SCALE).toFixed(12));\n}\n\nexport function novitaUsagePricingFromModel(\n model: NovitaModelInfo | undefined\n): ProviderUsagePricing | undefined {\n const inputPerMillion = normalizeNovitaPricePerMillion(\n model?.pricing?.prompt?.price_per_m ?? model?.input_token_price_per_m\n );\n const outputPerMillion = normalizeNovitaPricePerMillion(\n model?.pricing?.completion?.price_per_m ?? model?.output_token_price_per_m\n );\n if (inputPerMillion === undefined || outputPerMillion === undefined) {\n return undefined;\n }\n const cachedInputPerMillion = normalizeNovitaPricePerMillion(\n model?.pricing?.input_cache_read?.price_per_m\n );\n const pricing: ProviderUsagePricing = {\n inputPerMillion,\n outputPerMillion,\n };\n if (cachedInputPerMillion !== undefined) {\n pricing.cachedInputPerMillion = cachedInputPerMillion;\n }\n return pricing;\n}\n\nexport function calculateNovitaUsageCost(\n usage: ProviderUsage,\n pricing?: ProviderUsagePricing\n): number | undefined {\n if (\n !pricing ||\n typeof pricing.inputPerMillion !== 'number' ||\n typeof pricing.outputPerMillion !== 'number'\n ) {\n return undefined;\n }\n\n const cachedTokens = usage.cachedTokens || 0;\n const uncachedPromptTokens = Math.max(0, usage.promptTokens - cachedTokens);\n const cachedRate = pricing.cachedInputPerMillion ?? pricing.inputPerMillion;\n\n return Number((\n (uncachedPromptTokens / 1_000_000) * pricing.inputPerMillion +\n (cachedTokens / 1_000_000) * cachedRate +\n (usage.completionTokens / 1_000_000) * pricing.outputPerMillion\n ).toFixed(12));\n}\n\nexport class NovitaProvider implements Provider {\n readonly name = 'novita';\n readonly specificationVersion = '1' as const;\n\n private config: ProviderFactoryConfig;\n\n private static modelsCache: NovitaModelInfo[] | null = null;\n private static modelsCacheTime = 0;\n private static readonly CACHE_TTL = 5 * 60 * 1000;\n private static readonly USAGE_PRICING_FINISH_WAIT_MS = 2500;\n\n constructor(config: ProviderFactoryConfig) {\n this.config = config;\n }\n\n supportsModel(_modelId: string): boolean {\n return true;\n }\n\n getIcon(modelId?: string): string {\n return getNovitaModelIconDataUri(modelId) || getNovitaIconDataUri();\n }\n\n private baseUrl(): string {\n return trimTrailingSlashes(this.config.baseUrl || DEFAULT_BASE_URL);\n }\n\n private headers(): HeadersInit {\n return {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${this.config.apiKey}`,\n };\n }\n\n private async fetchModelsWithCache(): Promise<NovitaModelInfo[]> {\n const now = Date.now();\n\n if (\n NovitaProvider.modelsCache &&\n now - NovitaProvider.modelsCacheTime < NovitaProvider.CACHE_TTL\n ) {\n return NovitaProvider.modelsCache;\n }\n\n const response = await fetch(`${this.baseUrl()}/models`, {\n method: 'GET',\n headers: this.headers(),\n });\n\n if (!response.ok) {\n throw await this.toHttpProviderErrorFromResponse(response, 'Novita models API error');\n }\n\n const data = await response.json() as { data?: NovitaModelInfo[] };\n const merged = new Map<string, NovitaModelInfo>();\n\n for (const model of STATIC_MODELS) {\n merged.set(model.id, model);\n }\n\n for (const model of data.data || []) {\n merged.set(model.id, { ...merged.get(model.id), ...model });\n }\n\n NovitaProvider.modelsCache = Array.from(merged.values());\n NovitaProvider.modelsCacheTime = now;\n\n return NovitaProvider.modelsCache;\n }\n\n private mapModelCapabilities(model: NovitaModelInfo): ModelCapabilities {\n return {\n supportsImages: isVisionModel(model),\n supportsToolCalls: true,\n supportsStreaming: true,\n supportsJsonMode: true,\n maxContextTokens: model.context_size,\n };\n }\n\n async getModelCapabilities(modelId: string): Promise<ModelCapabilities | null> {\n try {\n const models = await this.fetchModelsWithCache();\n const model = models.find((candidate) => candidate.id === modelId);\n if (!model) return null;\n return this.mapModelCapabilities(model);\n } catch (error) {\n console.error(`Failed to fetch capabilities for Novita model ${modelId}:`, error);\n const staticModel = STATIC_MODELS.find((candidate) => candidate.id === modelId);\n return staticModel ? this.mapModelCapabilities(staticModel) : null;\n }\n }\n\n private mapToProviderModelInfo(model: NovitaModelInfo): ProviderModelInfo {\n const pricing = novitaUsagePricingFromModel(model);\n\n return {\n id: model.id,\n name: model.title || model.id,\n description: model.description,\n contextLength: model.context_size,\n iconId: this.getIcon(model.id),\n slug: model.id,\n inputPrice: pricing?.inputPerMillion,\n outputPrice: pricing?.outputPerMillion,\n cachedPrice: pricing?.cachedInputPerMillion,\n capabilities: this.mapModelCapabilities(model),\n };\n }\n\n async getModels(filter?: string): Promise<ProviderModelInfo[]> {\n try {\n let models = (await this.fetchModelsWithCache())\n .map((model) => this.mapToProviderModelInfo(model))\n .sort((a, b) => a.name.localeCompare(b.name));\n\n if (filter) {\n const lowerFilter = filter.toLowerCase();\n models = models.filter(\n (model) =>\n model.id.toLowerCase().includes(lowerFilter) ||\n model.name.toLowerCase().includes(lowerFilter) ||\n (model.description && model.description.toLowerCase().includes(lowerFilter))\n );\n }\n\n return models;\n } catch (error) {\n console.error('Failed to fetch models from Novita:', error);\n return STATIC_MODELS.map((model) => this.mapToProviderModelInfo(model));\n }\n }\n\n private static async settleUsagePricing(\n pricingPromise: Promise<ProviderUsagePricing | undefined>\n ): Promise<ProviderUsagePricing | undefined> {\n let timer: ReturnType<typeof setTimeout> | undefined;\n const timeout = new Promise<undefined>((resolve) => {\n timer = setTimeout(() => resolve(undefined), NovitaProvider.USAGE_PRICING_FINISH_WAIT_MS);\n });\n try {\n return await Promise.race([pricingPromise, timeout]);\n } finally {\n if (timer !== undefined) clearTimeout(timer);\n }\n }\n\n private async getUsagePricing(\n modelId: string | undefined\n ): Promise<ProviderUsagePricing | undefined> {\n if (!modelId) return undefined;\n try {\n const models = await this.fetchModelsWithCache();\n const model = models.find((candidate) => candidate.id === modelId);\n return novitaUsagePricingFromModel(model);\n } catch {\n const staticModel = STATIC_MODELS.find((candidate) => candidate.id === modelId);\n return novitaUsagePricingFromModel(staticModel);\n }\n }\n\n async generate(request: ProviderRequest): Promise<ProviderResponse> {\n const pricingPromise = this.getUsagePricing(request.model);\n\n try {\n const response = await fetch(`${this.baseUrl()}/chat/completions`, {\n method: 'POST',\n headers: this.headers(),\n body: JSON.stringify(buildChatParams(request)),\n signal: request.signal,\n });\n\n if (!response.ok) {\n throw await this.toHttpProviderErrorFromResponse(response, 'Novita API error');\n }\n\n const pricing = await NovitaProvider.settleUsagePricing(pricingPromise);\n const data = await response.json();\n return transformChatResponse(data, pricing);\n } catch (error) {\n throw this.toProviderError(error);\n }\n }\n\n async stream(request: ProviderRequest): Promise<AsyncIterable<ProviderStreamChunk>> {\n const self = this;\n const pricingPromise = this.getUsagePricing(request.model);\n\n try {\n const response = await fetch(`${this.baseUrl()}/chat/completions`, {\n method: 'POST',\n headers: this.headers(),\n body: JSON.stringify({\n ...buildChatParams(request),\n stream: true,\n stream_options: { include_usage: true },\n }),\n signal: request.signal,\n });\n\n if (!response.ok) {\n throw await this.toHttpProviderErrorFromResponse(response, 'Novita API error');\n }\n\n return {\n async *[Symbol.asyncIterator]() {\n const state = createChatStreamState(request.model);\n\n try {\n for await (const chunk of parseChatSSEStream(response, state)) {\n if (chunk.type === 'finish') {\n const pricing = await NovitaProvider.settleUsagePricing(pricingPromise);\n if (pricing) attachUsagePricing(chunk.usage, pricing);\n }\n yield chunk;\n }\n } catch (error) {\n const providerError = self.toProviderError(error);\n yield createChatErrorChunk(providerError.message, providerError.code);\n }\n },\n };\n } catch (error) {\n throw this.toProviderError(error);\n }\n }\n\n private async toHttpProviderErrorFromResponse(\n response: Response,\n fallbackPrefix: string\n ): Promise<ProviderError> {\n const errorText = await response.text();\n let errorMessage = `${fallbackPrefix}: ${response.status}`;\n try {\n const errorJson = JSON.parse(errorText) as {\n error?: { message?: string };\n message?: string;\n };\n errorMessage = errorJson.error?.message || errorJson.message || errorMessage;\n } catch {\n errorMessage = errorText || errorMessage;\n }\n\n return this.toHttpProviderError(errorMessage, response.status, response.headers);\n }\n\n private toProviderError(error: unknown): ProviderError {\n if (error instanceof ProviderError) {\n return error;\n }\n\n if (error instanceof Error) {\n const anyError = error as Error & {\n status?: number;\n statusCode?: number;\n headers?: Record<string, string>;\n code?: string;\n };\n\n const status = anyError.status || anyError.statusCode;\n const retryAfter = anyError.headers?.['retry-after']\n ? parseInt(anyError.headers['retry-after'], 10)\n : undefined;\n\n if (status === 429) {\n return new ProviderError(error.message, 'rate_limit', status, retryAfter);\n }\n if (status === 401 || status === 403) {\n return new ProviderError(error.message, 'auth_error', status);\n }\n if (status === 400 || status === 404) {\n return new ProviderError(error.message, 'invalid_request', status);\n }\n if (status && status >= 500) {\n return new ProviderError(error.message, 'server_error', status);\n }\n if (error.name === 'AbortError' || anyError.code === 'ETIMEDOUT') {\n return new ProviderError(error.message, 'timeout');\n }\n\n return new ProviderError(error.message, 'unknown', status);\n }\n\n return new ProviderError(String(error), 'unknown');\n }\n\n private toHttpProviderError(\n message: string,\n status: number,\n headers?: Headers\n ): ProviderError {\n const retryAfterHeader = headers?.get('retry-after');\n const retryAfter = retryAfterHeader ? parseInt(retryAfterHeader, 10) : undefined;\n\n if (status === 429) {\n return new ProviderError(message, 'rate_limit', status, retryAfter);\n }\n if (status === 401 || status === 403) {\n return new ProviderError(message, 'auth_error', status);\n }\n if (status === 400 || status === 404) {\n return new ProviderError(message, 'invalid_request', status);\n }\n if (status >= 500) {\n return new ProviderError(message, 'server_error', status);\n }\n\n return new ProviderError(message, 'unknown', status);\n }\n\n async inspectRequest(request: ProviderRequest): Promise<InspectedRequest> {\n const params = buildChatParams(request);\n\n return {\n body: truncateChatBase64(params as Record<string, unknown>),\n messagesPath: 'messages',\n metadata: {\n endpoint: 'POST /openai/v1/chat/completions',\n headers: {\n 'Content-Type': 'application/json',\n },\n },\n };\n }\n}\n","import type {\n ContentPart,\n ProviderFinishReason,\n ProviderMessage,\n ProviderReasoningDetail,\n ProviderRequest,\n ProviderResponse,\n ProviderStreamChunk,\n ProviderTool,\n ProviderToolCallPart,\n ProviderUsage,\n ProviderUsagePricing,\n} from '@standardagents/spec';\n\nexport type NovitaChatContentPart =\n | { type: 'text'; text: string }\n | { type: 'image_url'; image_url: { url: string; detail?: 'auto' | 'low' | 'high' } };\n\nexport type NovitaChatMessage =\n | { role: 'system'; content: string; name?: string }\n | { role: 'user'; content: string | NovitaChatContentPart[]; name?: string }\n | {\n role: 'assistant';\n content?: string | null;\n tool_calls?: NovitaChatToolCall[];\n reasoning_content?: string | null;\n }\n | { role: 'tool'; tool_call_id: string; content: string };\n\nexport interface NovitaChatToolCall {\n id: string;\n type: 'function';\n index?: number;\n function: {\n name: string;\n arguments: string;\n };\n}\n\nexport interface NovitaChatTool {\n type: 'function';\n function: {\n name: string;\n description?: string;\n parameters?: Record<string, unknown>;\n strict?: boolean;\n };\n}\n\nexport type NovitaChatToolChoice =\n | 'auto'\n | 'none'\n | 'required'\n | { type: 'function'; function: { name: string } };\n\nexport interface NovitaChatCompletionRequest {\n model: string;\n messages: NovitaChatMessage[];\n tools?: NovitaChatTool[];\n tool_choice?: NovitaChatToolChoice;\n parallel_tool_calls?: boolean;\n max_tokens?: number;\n temperature?: number;\n top_p?: number;\n stop?: string[];\n stream?: boolean;\n stream_options?: { include_usage?: boolean };\n 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 let output: string;\n\n if (typeof msg.content === 'string') {\n output = msg.content;\n } else if ('type' in msg.content) {\n if (msg.content.type === 'text') {\n output = msg.content.text;\n } else if (msg.content.type === 'error') {\n output = `Error: ${msg.content.error}`;\n } else {\n output = JSON.stringify(msg.content);\n }\n } else {\n output = JSON.stringify(msg.content);\n }\n\n const imageAttachments = msg.attachments?.filter((a) => a.type === 'image' && a.data) || [];\n result.push({\n role: 'tool',\n tool_call_id: msg.toolCallId,\n content: output || (imageAttachments.length > 0 ? 'Success' : ''),\n });\n\n if (imageAttachments.length > 0) {\n const imageContent: NovitaChatContentPart[] = [];\n const toolName = msg.toolName || 'the tool';\n const isSingle = imageAttachments.length === 1;\n const descriptor = isSingle ? 'the file' : `${imageAttachments.length} files`;\n const verb = isSingle ? 'is' : 'are';\n\n imageContent.push({\n type: 'text',\n text: `Here ${verb} ${descriptor} from ${toolName}:`,\n });\n\n for (const attachment of imageAttachments) {\n const attachmentData = attachment.data || '';\n const imageData = attachmentData.startsWith('data:')\n ? attachmentData\n : `data:${attachment.mediaType || 'image/png'};base64,${attachmentData}`;\n\n imageContent.push({\n type: 'image_url',\n image_url: {\n url: imageData,\n detail: 'auto',\n },\n });\n }\n\n result.push({\n role: 'user',\n content: imageContent,\n });\n }\n break;\n }\n }\n }\n\n return result;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === 'object' && !Array.isArray(value);\n}\n\nconst STRICT_UNSUPPORTED_KEYWORDS = new Set<string>([\n 'minLength', 'maxLength', 'pattern', 'format',\n 'minimum', 'maximum', 'exclusiveMinimum', 'exclusiveMaximum', 'multipleOf',\n 'minItems', 'maxItems', 'uniqueItems', 'minContains', 'maxContains',\n 'minProperties', 'maxProperties', 'patternProperties', 'propertyNames',\n 'dependentRequired', 'dependentSchemas', 'unevaluatedProperties',\n 'default', 'examples', '$schema', '$comment', 'contentEncoding', 'contentMediaType',\n]);\n\nfunction normalizeStrictJsonSchema(schema: unknown): unknown {\n if (Array.isArray(schema)) {\n return schema.map((item) => normalizeStrictJsonSchema(item));\n }\n if (!isRecord(schema)) {\n return schema;\n }\n\n const normalized: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(schema)) {\n if (STRICT_UNSUPPORTED_KEYWORDS.has(key)) continue;\n\n if (key === 'properties' && isRecord(value)) {\n const props: Record<string, unknown> = {};\n for (const [propName, propSchema] of Object.entries(value)) {\n props[propName] = normalizeStrictJsonSchema(propSchema);\n }\n normalized[key] = props;\n } else if (key === 'enum' || key === 'const') {\n normalized[key] = value;\n } else {\n normalized[key] = normalizeStrictJsonSchema(value);\n }\n }\n\n const properties = isRecord(normalized.properties) ? normalized.properties : undefined;\n const type = normalized.type;\n const isObjectSchema =\n type === 'object' || (Array.isArray(type) && type.includes('object')) || !!properties;\n\n if (isObjectSchema) {\n if (normalized.type === undefined) {\n normalized.type = 'object';\n }\n normalized.properties = properties || {};\n normalized.required = Object.keys(normalized.properties as Record<string, unknown>);\n normalized.additionalProperties = false;\n }\n\n return normalized;\n}\n\nfunction normalizeStrictToolParameters(\n parameters?: Record<string, unknown> | null\n): Record<string, unknown> {\n const base = isRecord(parameters) ? { ...parameters } : {};\n if (base.type === undefined) base.type = 'object';\n if (base.properties === undefined) base.properties = {};\n return normalizeStrictJsonSchema(base) as Record<string, unknown>;\n}\n\nexport function transformChatTool(tool: ProviderTool): NovitaChatTool {\n const inputParams = tool.function.parameters as Record<string, unknown> | null | undefined;\n\n return {\n type: 'function',\n function: {\n name: tool.function.name,\n description: tool.function.description || undefined,\n parameters: normalizeStrictToolParameters(inputParams),\n // 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 buildChatParams(request: ProviderRequest): NovitaChatCompletionRequest {\n const params: NovitaChatCompletionRequest = {\n model: request.model,\n messages: transformChatMessages(request.messages),\n };\n\n if (request.tools && request.tools.length > 0) {\n params.tools = request.tools.map(transformChatTool);\n\n const toolChoice = transformChatToolChoice(request.toolChoice);\n if (toolChoice !== undefined) {\n params.tool_choice = toolChoice;\n }\n\n if (request.parallelToolCalls !== undefined) {\n params.parallel_tool_calls = request.parallelToolCalls;\n }\n }\n\n if (request.maxOutputTokens !== undefined) {\n params.max_tokens = request.maxOutputTokens;\n }\n\n if (request.temperature !== undefined) {\n params.temperature = request.temperature;\n }\n\n if (request.topP !== undefined) {\n params.top_p = request.topP;\n }\n\n // 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 // No explicit enable_thinking/separate_reasoning (2026-08-04): Novita's\n // serving defaults already run Hy3 thinking in tool mode, and the exact\n // -replica campaign showed the explicit stamps are at best neutral. Callers\n // can still force them via providerOptions.\n\n if (request.responseFormat?.type === 'json') {\n if (request.responseFormat.schema) {\n params.response_format = {\n type: 'json_schema',\n json_schema: {\n name: 'response',\n schema: normalizeStrictJsonSchema(request.responseFormat.schema) as Record<string, unknown>,\n strict: true,\n },\n };\n } else {\n params.response_format = { type: 'json_object' };\n }\n }\n\n if (request.providerOptions) {\n const { _metadata, ...safeOptions } = request.providerOptions as Record<string, unknown> & {\n _metadata?: unknown;\n };\n Object.assign(params, safeOptions);\n }\n\n return params;\n}\n\nexport function createChatErrorChunk(error: string, code?: string): ProviderStreamChunk {\n return { type: 'error', error, code };\n}\n\nfunction isBase64Like(str: string): boolean {\n if (str.startsWith('data:')) return true;\n if (str.length > 200) {\n const base64Pattern = /^[A-Za-z0-9+/]+=*$/;\n return base64Pattern.test(str.substring(0, 200));\n }\n return false;\n}\n\nfunction truncateBase64String(str: string, maxLength: number = 50): string {\n if (str.length <= maxLength) return str;\n const preview = str.substring(0, maxLength);\n return `${preview}...[truncated, ${str.length.toLocaleString()} chars]`;\n}\n\nexport function truncateChatBase64<T>(obj: T, maxLength: number = 50): T {\n if (obj === null || obj === undefined) {\n return obj;\n }\n\n if (typeof obj === 'string') {\n return (isBase64Like(obj) ? truncateBase64String(obj, maxLength) : obj) as T;\n }\n\n if (Array.isArray(obj)) {\n return obj.map((item) => truncateChatBase64(item, maxLength)) as T;\n }\n\n if (typeof obj === 'object') {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n result[key] = truncateChatBase64(value, maxLength);\n }\n return result as T;\n }\n\n return obj;\n}\n","import AI4BHARAT_ICON_FILE from './vendor-icons/ai4bharat.svg';\nimport AISINGAPORE_ICON_FILE from './vendor-icons/aisingapore.svg';\nimport ANTHROPIC_ICON_FILE from './vendor-icons/anthropic.svg';\nimport BAAI_ICON_FILE from './vendor-icons/baai.svg';\nimport BLACK_FOREST_LABS_ICON_FILE from './vendor-icons/blackforestlabs.svg';\nimport BYTEDANCE_ICON_FILE from './vendor-icons/bytedance.svg';\nimport COHERE_ICON_FILE from './vendor-icons/cohere.svg';\nimport DEEPGRAM_ICON_FILE from './vendor-icons/deepgram.svg';\nimport DEEPSEEK_ICON_FILE from './vendor-icons/deepseek.svg';\nimport DEFOG_ICON_FILE from './vendor-icons/defog.svg';\nimport EXAONE_ICON_FILE from './vendor-icons/exaone.svg';\nimport FBLGIT_ICON_FILE from './vendor-icons/fblgit.svg';\nimport GOOGLE_ICON_FILE from './vendor-icons/google.svg';\nimport HUGGINGFACE_ICON_FILE from './vendor-icons/huggingface.svg';\nimport IBM_ICON_FILE from './vendor-icons/ibm.svg';\nimport LEONARDO_ICON_FILE from './vendor-icons/leonardo.svg';\nimport LLAVA_HF_ICON_FILE from './vendor-icons/llava-hf.svg';\nimport LYKON_ICON_FILE from './vendor-icons/lykon.svg';\nimport META_ICON_FILE from './vendor-icons/meta.svg';\nimport MICROSOFT_ICON_FILE from './vendor-icons/microsoft.svg';\nimport MINIMAX_ICON_FILE from './vendor-icons/minimax.svg';\nimport MISTRALAI_ICON_FILE from './vendor-icons/mistralai.svg';\nimport MOONSHOTAI_ICON_FILE from './vendor-icons/moonshotai.svg';\nimport MYSHELL_AI_ICON_FILE from './vendor-icons/myshell-ai.svg';\nimport NVIDIA_ICON_FILE from './vendor-icons/nvidia.svg';\nimport OPENAI_ICON_FILE from './vendor-icons/openai.svg';\nimport OPENCHAT_ICON_FILE from './vendor-icons/openchat.svg';\nimport OPENROUTER_ICON_FILE from './vendor-icons/openrouter.svg';\nimport PERPLEXITY_ICON_FILE from './vendor-icons/perplexity.svg';\nimport PFNET_ICON_FILE from './vendor-icons/pfnet.svg';\nimport PIPECAT_AI_ICON_FILE from './vendor-icons/pipecat-ai.svg';\nimport QWEN_ICON_FILE from './vendor-icons/qwen.svg';\nimport RUNWAYML_ICON_FILE from './vendor-icons/runwayml.svg';\nimport STABILITY_AI_ICON_FILE from './vendor-icons/stabilityai.svg';\nimport THEBLOKE_ICON_FILE from './vendor-icons/thebloke.svg';\nimport TIIUAE_ICON_FILE from './vendor-icons/tiiuae.svg';\nimport TINYLLAMA_ICON_FILE from './vendor-icons/tinyllama.svg';\nimport UNUM_ICON_FILE from './vendor-icons/unum.svg';\nimport XAI_ICON_FILE from './vendor-icons/xai.svg';\nimport ZAI_ORG_ICON_FILE from './vendor-icons/zai-org.svg';\n\nexport const NOVITA_ICON = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"48\" height=\"48\" viewBox=\"0 0 48 48\" role=\"img\" aria-label=\"Novita AI\">\n <rect width=\"48\" height=\"48\" rx=\"10\" fill=\"#F7F8FA\"/>\n <g transform=\"translate(7 13.35) scale(1.4167)\">\n <path d=\"M24 14.8323V14.8326H14.3246L9.16716 9.67507V14.8326H0V14.8314L9.16716 5.66422V0H9.16774L24 14.8323Z\" fill=\"#050505\"/>\n </g>\n</svg>`;\n\nconst OPENROUTER_LAB_ICONS: Record<string, string> = {\n anthropic: ANTHROPIC_ICON_FILE,\n google: GOOGLE_ICON_FILE,\n 'google-ai': GOOGLE_ICON_FILE,\n meta: META_ICON_FILE,\n 'meta-llama': META_ICON_FILE,\n nvidia: NVIDIA_ICON_FILE,\n alibaba: QWEN_ICON_FILE,\n deepseek: DEEPSEEK_ICON_FILE,\n 'deepseek-ai': DEEPSEEK_ICON_FILE,\n qwen: QWEN_ICON_FILE,\n minimax: MINIMAX_ICON_FILE,\n moonshotai: MOONSHOTAI_ICON_FILE,\n moonshot: MOONSHOTAI_ICON_FILE,\n 'x-ai': XAI_ICON_FILE,\n xai: XAI_ICON_FILE,\n 'z-ai': ZAI_ORG_ICON_FILE,\n 'zai-org': ZAI_ORG_ICON_FILE,\n zai: ZAI_ORG_ICON_FILE,\n zhipu: ZAI_ORG_ICON_FILE,\n exaone: EXAONE_ICON_FILE,\n lgai: EXAONE_ICON_FILE,\n openrouter: OPENROUTER_ICON_FILE,\n openai: OPENAI_ICON_FILE,\n 'openai-sdk': OPENAI_ICON_FILE,\n mistral: MISTRALAI_ICON_FILE,\n mistralai: MISTRALAI_ICON_FILE,\n cohere: COHERE_ICON_FILE,\n perplexity: PERPLEXITY_ICON_FILE,\n};\n\nconst COPIED_OPENROUTER_VENDOR_ICONS: Record<string, string> = {\n ai4bharat: AI4BHARAT_ICON_FILE,\n aisingapore: AISINGAPORE_ICON_FILE,\n baai: BAAI_ICON_FILE,\n 'black-forest-labs': BLACK_FOREST_LABS_ICON_FILE,\n blackforestlabs: BLACK_FOREST_LABS_ICON_FILE,\n bfl: BLACK_FOREST_LABS_ICON_FILE,\n bytedance: BYTEDANCE_ICON_FILE,\n deepgram: DEEPGRAM_ICON_FILE,\n defog: DEFOG_ICON_FILE,\n fblgit: FBLGIT_ICON_FILE,\n google: GOOGLE_ICON_FILE,\n huggingface: HUGGINGFACE_ICON_FILE,\n 'hugging-face': HUGGINGFACE_ICON_FILE,\n ibm: IBM_ICON_FILE,\n 'ibm-granite': IBM_ICON_FILE,\n leonardo: LEONARDO_ICON_FILE,\n 'leonardo-ai': LEONARDO_ICON_FILE,\n 'llava-hf': LLAVA_HF_ICON_FILE,\n lykon: LYKON_ICON_FILE,\n microsoft: MICROSOFT_ICON_FILE,\n 'myshell-ai': MYSHELL_AI_ICON_FILE,\n openchat: OPENCHAT_ICON_FILE,\n pfnet: PFNET_ICON_FILE,\n 'pipecat-ai': PIPECAT_AI_ICON_FILE,\n runwayml: RUNWAYML_ICON_FILE,\n 'stability-ai': STABILITY_AI_ICON_FILE,\n stabilityai: STABILITY_AI_ICON_FILE,\n thebloke: THEBLOKE_ICON_FILE,\n tiiuae: TIIUAE_ICON_FILE,\n tinyllama: TINYLLAMA_ICON_FILE,\n unum: UNUM_ICON_FILE,\n};\n\nexport function svgToDataUri(svg: string): string {\n const encoded = encodeURIComponent(svg)\n .replace(/'/g, '%27')\n .replace(/\"/g, '%22');\n return `data:image/svg+xml,${encoded}`;\n}\n\nfunction normalizeIcon(icon: string): string {\n if (icon.startsWith('data:') || icon.startsWith('http://') || icon.startsWith('https://')) {\n return icon;\n }\n return svgToDataUri(icon);\n}\n\nfunction getVendorSegment(modelId?: string): string | undefined {\n const normalized = (modelId || '').trim().toLowerCase();\n if (!normalized || !normalized.includes('/')) return undefined;\n return normalized.split('/')[0];\n}\n\nfunction getLabIcon(modelId?: string): string | undefined {\n const vendor = getVendorSegment(modelId);\n if (!vendor) return undefined;\n\n const icon = OPENROUTER_LAB_ICONS[vendor] || COPIED_OPENROUTER_VENDOR_ICONS[vendor];\n return icon ? normalizeIcon(icon) : undefined;\n}\n\nexport function getNovitaIconDataUri(): string {\n return svgToDataUri(NOVITA_ICON);\n}\n\nexport function getNovitaModelIconDataUri(modelId?: string): string | undefined {\n return getLabIcon(modelId);\n}\n","import { z } from 'zod';\n\n/**\n * Novita provider options schema.\n *\n * Novita exposes an OpenAI-compatible Chat Completions API. These options cover\n * documented Novita-specific and OpenAI-compatible parameters, while\n * passthrough keeps the provider forward-compatible with new API fields.\n */\nexport const novitaProviderOptions = z.object({\n /** Number of completions to generate. */\n n: z.number().int().min(1).max(128).optional(),\n\n /** Sampling seed for best-effort determinism. */\n seed: z.number().int().optional(),\n\n /** Penalize repeated tokens based on frequency. */\n frequency_penalty: z.number().min(-2).max(2).optional(),\n\n /** Penalize repeated tokens based on presence. */\n presence_penalty: z.number().min(-2).max(2).optional(),\n\n /** Novita repetition penalty. */\n repetition_penalty: z.number().gt(0).lt(2).optional(),\n\n /** Top-k sampling limit. */\n top_k: z.number().int().gt(1).lt(128).optional(),\n\n /** Minimum probability threshold relative to the most likely token. */\n min_p: z.number().min(0).max(1).optional(),\n\n /** Token logit biases. */\n logit_bias: z.record(z.string(), z.number().int().min(-100).max(100)).optional(),\n\n /** Return output token log probabilities. */\n logprobs: z.boolean().optional(),\n\n /** Number of top logprobs to return when `logprobs` is enabled. */\n top_logprobs: z.number().int().min(0).max(20).optional(),\n\n /** Request reasoning content separately when supported by the selected model. */\n separate_reasoning: z.boolean().optional(),\n\n /** Enable or disable model thinking when supported by the selected model. */\n enable_thinking: z.boolean().optional(),\n\n /** Output modalities for models that can return audio. */\n modalities: z.array(z.string()).optional(),\n}).passthrough();\n\nexport type NovitaProviderOptions = z.infer<typeof novitaProviderOptions>;\n","import type { ProviderFactoryConfig, ProviderFactoryWithOptions, ProviderConfigSlots } from '@standardagents/spec';\nimport { NovitaProvider } from './NovitaProvider';\nimport { novitaProviderOptions } from './providerOptions';\n\n/**\n * Novita AI provider factory for Standard Agents.\n *\n * Uses Novita's OpenAI-compatible Chat Completions API and live model catalog.\n */\nexport const novita: ProviderFactoryWithOptions<typeof novitaProviderOptions> =\n Object.assign(\n (config: ProviderFactoryConfig) => new NovitaProvider(config),\n {\n providerOptions: novitaProviderOptions,\n configSlots: {\n apiKey: {\n type: 'secret',\n required: true,\n defaultEnv: 'NOVITA_API_KEY',\n overridable: true,\n description: 'Novita AI API key used to authenticate provider requests.',\n },\n baseUrl: {\n type: 'url',\n required: false,\n default: 'https://api.novita.ai/openai/v1',\n overridable: true,\n description: 'Novita OpenAI-compatible API base URL.',\n },\n timeout: {\n type: 'number',\n required: false,\n default: 30000,\n overridable: true,\n description: 'Provider request timeout in milliseconds.',\n },\n } satisfies ProviderConfigSlots,\n }\n );\n\nexport { novitaProviderOptions, type NovitaProviderOptions } from './providerOptions';\nexport {\n NovitaProvider,\n normalizeNovitaPricePerMillion,\n novitaUsagePricingFromModel,\n calculateNovitaUsageCost,\n type NovitaModelInfo,\n} from './NovitaProvider';\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/NovitaProvider.ts","../src/chat-completions-transformers.ts","../src/icons.ts","../src/providerOptions.ts","../src/index.ts"],"sourcesContent":["import type {\n InspectedRequest,\n LLMProviderInterface as Provider,\n ModelCapabilities,\n ProviderFactoryConfig,\n ProviderModelInfo,\n ProviderRequest,\n ProviderResponse,\n ProviderStreamChunk,\n ProviderUsage,\n ProviderUsagePricing,\n} from '@standardagents/spec';\nimport { ProviderError } from '@standardagents/spec';\nimport {\n attachUsagePricing,\n buildChatParams,\n createChatErrorChunk,\n createChatStreamState,\n parseChatSSEStream,\n transformChatResponse,\n truncateChatBase64,\n} from './chat-completions-transformers';\nimport { getNovitaIconDataUri, getNovitaModelIconDataUri } from './icons';\n\nexport { ProviderError };\n\nexport interface NovitaModelInfo {\n id: string;\n object?: string;\n created?: number;\n title?: string;\n description?: string;\n context_size?: number;\n input_token_price_per_m?: number;\n output_token_price_per_m?: number;\n pricing?: 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 };\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 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 let output: string;\n\n if (typeof msg.content === 'string') {\n output = msg.content;\n } else if ('type' in msg.content) {\n if (msg.content.type === 'text') {\n output = msg.content.text;\n } else if (msg.content.type === 'error') {\n output = `Error: ${msg.content.error}`;\n } else {\n output = JSON.stringify(msg.content);\n }\n } else {\n output = JSON.stringify(msg.content);\n }\n\n const imageAttachments = msg.attachments?.filter((a) => a.type === 'image' && a.data) || [];\n result.push({\n role: 'tool',\n tool_call_id: msg.toolCallId,\n content: output || (imageAttachments.length > 0 ? 'Success' : ''),\n });\n\n if (imageAttachments.length > 0) {\n const imageContent: NovitaChatContentPart[] = [];\n const toolName = msg.toolName || 'the tool';\n const isSingle = imageAttachments.length === 1;\n const descriptor = isSingle ? 'the file' : `${imageAttachments.length} files`;\n const verb = isSingle ? 'is' : 'are';\n\n imageContent.push({\n type: 'text',\n text: `Here ${verb} ${descriptor} from ${toolName}:`,\n });\n\n for (const attachment of imageAttachments) {\n const attachmentData = attachment.data || '';\n const imageData = attachmentData.startsWith('data:')\n ? attachmentData\n : `data:${attachment.mediaType || 'image/png'};base64,${attachmentData}`;\n\n imageContent.push({\n type: 'image_url',\n image_url: {\n url: imageData,\n detail: 'auto',\n },\n });\n }\n\n result.push({\n role: 'user',\n content: imageContent,\n });\n }\n break;\n }\n }\n }\n\n return result;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === 'object' && !Array.isArray(value);\n}\n\nconst STRICT_UNSUPPORTED_KEYWORDS = new Set<string>([\n 'minLength', 'maxLength', 'pattern', 'format',\n 'minimum', 'maximum', 'exclusiveMinimum', 'exclusiveMaximum', 'multipleOf',\n 'minItems', 'maxItems', 'uniqueItems', 'minContains', 'maxContains',\n 'minProperties', 'maxProperties', 'patternProperties', 'propertyNames',\n 'dependentRequired', 'dependentSchemas', 'unevaluatedProperties',\n 'default', 'examples', '$schema', '$comment', 'contentEncoding', 'contentMediaType',\n]);\n\nfunction normalizeStrictJsonSchema(schema: unknown): unknown {\n if (Array.isArray(schema)) {\n return schema.map((item) => normalizeStrictJsonSchema(item));\n }\n if (!isRecord(schema)) {\n return schema;\n }\n\n const normalized: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(schema)) {\n if (STRICT_UNSUPPORTED_KEYWORDS.has(key)) continue;\n\n if (key === 'properties' && isRecord(value)) {\n const props: Record<string, unknown> = {};\n for (const [propName, propSchema] of Object.entries(value)) {\n props[propName] = normalizeStrictJsonSchema(propSchema);\n }\n normalized[key] = props;\n } else if (key === 'enum' || key === 'const') {\n normalized[key] = value;\n } else {\n normalized[key] = normalizeStrictJsonSchema(value);\n }\n }\n\n const properties = isRecord(normalized.properties) ? normalized.properties : undefined;\n const type = normalized.type;\n const isObjectSchema =\n type === 'object' || (Array.isArray(type) && type.includes('object')) || !!properties;\n\n if (isObjectSchema) {\n if (normalized.type === undefined) {\n normalized.type = 'object';\n }\n normalized.properties = properties || {};\n normalized.required = Object.keys(normalized.properties as Record<string, unknown>);\n normalized.additionalProperties = false;\n }\n\n return normalized;\n}\n\nfunction normalizeStrictToolParameters(\n parameters?: Record<string, unknown> | null\n): Record<string, unknown> {\n const base = isRecord(parameters) ? { ...parameters } : {};\n if (base.type === undefined) base.type = 'object';\n if (base.properties === undefined) base.properties = {};\n return normalizeStrictJsonSchema(base) as Record<string, unknown>;\n}\n\nexport function transformChatTool(tool: ProviderTool): NovitaChatTool {\n const inputParams = tool.function.parameters as Record<string, unknown> | null | undefined;\n\n return {\n type: 'function',\n function: {\n name: tool.function.name,\n description: tool.function.description || undefined,\n parameters: normalizeStrictToolParameters(inputParams),\n // 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 buildChatParams(request: ProviderRequest): NovitaChatCompletionRequest {\n const params: NovitaChatCompletionRequest = {\n model: request.model,\n messages: transformChatMessages(request.messages),\n };\n\n if (request.tools && request.tools.length > 0) {\n params.tools = request.tools.map(transformChatTool);\n\n const toolChoice = transformChatToolChoice(request.toolChoice);\n if (toolChoice !== undefined) {\n params.tool_choice = toolChoice;\n }\n\n if (request.parallelToolCalls !== undefined) {\n params.parallel_tool_calls = request.parallelToolCalls;\n }\n }\n\n if (request.maxOutputTokens !== undefined) {\n params.max_tokens = request.maxOutputTokens;\n }\n\n if (request.temperature !== undefined) {\n params.temperature = request.temperature;\n }\n\n if (request.topP !== undefined) {\n params.top_p = request.topP;\n }\n\n // 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 // No explicit enable_thinking/separate_reasoning (2026-08-04): Novita's\n // serving defaults already run Hy3 thinking in tool mode, and the exact\n // -replica campaign showed the explicit stamps are at best neutral. Callers\n // can still force them via providerOptions.\n\n if (request.responseFormat?.type === 'json') {\n if (request.responseFormat.schema) {\n params.response_format = {\n type: 'json_schema',\n json_schema: {\n name: 'response',\n schema: normalizeStrictJsonSchema(request.responseFormat.schema) as Record<string, unknown>,\n strict: true,\n },\n };\n } else {\n params.response_format = { type: 'json_object' };\n }\n }\n\n if (request.providerOptions) {\n const { _metadata, ...safeOptions } = request.providerOptions as Record<string, unknown> & {\n _metadata?: unknown;\n };\n Object.assign(params, safeOptions);\n }\n\n return params;\n}\n\nexport function createChatErrorChunk(error: string, code?: string): ProviderStreamChunk {\n return { type: 'error', error, code };\n}\n\nfunction isBase64Like(str: string): boolean {\n if (str.startsWith('data:')) return true;\n if (str.length > 200) {\n const base64Pattern = /^[A-Za-z0-9+/]+=*$/;\n return base64Pattern.test(str.substring(0, 200));\n }\n return false;\n}\n\nfunction truncateBase64String(str: string, maxLength: number = 50): string {\n if (str.length <= maxLength) return str;\n const preview = str.substring(0, maxLength);\n return `${preview}...[truncated, ${str.length.toLocaleString()} chars]`;\n}\n\nexport function truncateChatBase64<T>(obj: T, maxLength: number = 50): T {\n if (obj === null || obj === undefined) {\n return obj;\n }\n\n if (typeof obj === 'string') {\n return (isBase64Like(obj) ? truncateBase64String(obj, maxLength) : obj) as T;\n }\n\n if (Array.isArray(obj)) {\n return obj.map((item) => truncateChatBase64(item, maxLength)) as T;\n }\n\n if (typeof obj === 'object') {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n result[key] = truncateChatBase64(value, maxLength);\n }\n return result as T;\n }\n\n return obj;\n}\n","import AI4BHARAT_ICON_FILE from './vendor-icons/ai4bharat.svg';\nimport AISINGAPORE_ICON_FILE from './vendor-icons/aisingapore.svg';\nimport ANTHROPIC_ICON_FILE from './vendor-icons/anthropic.svg';\nimport BAAI_ICON_FILE from './vendor-icons/baai.svg';\nimport BLACK_FOREST_LABS_ICON_FILE from './vendor-icons/blackforestlabs.svg';\nimport BYTEDANCE_ICON_FILE from './vendor-icons/bytedance.svg';\nimport COHERE_ICON_FILE from './vendor-icons/cohere.svg';\nimport DEEPGRAM_ICON_FILE from './vendor-icons/deepgram.svg';\nimport DEEPSEEK_ICON_FILE from './vendor-icons/deepseek.svg';\nimport DEFOG_ICON_FILE from './vendor-icons/defog.svg';\nimport EXAONE_ICON_FILE from './vendor-icons/exaone.svg';\nimport FBLGIT_ICON_FILE from './vendor-icons/fblgit.svg';\nimport GOOGLE_ICON_FILE from './vendor-icons/google.svg';\nimport HUGGINGFACE_ICON_FILE from './vendor-icons/huggingface.svg';\nimport IBM_ICON_FILE from './vendor-icons/ibm.svg';\nimport LEONARDO_ICON_FILE from './vendor-icons/leonardo.svg';\nimport LLAVA_HF_ICON_FILE from './vendor-icons/llava-hf.svg';\nimport LYKON_ICON_FILE from './vendor-icons/lykon.svg';\nimport META_ICON_FILE from './vendor-icons/meta.svg';\nimport MICROSOFT_ICON_FILE from './vendor-icons/microsoft.svg';\nimport MINIMAX_ICON_FILE from './vendor-icons/minimax.svg';\nimport MISTRALAI_ICON_FILE from './vendor-icons/mistralai.svg';\nimport MOONSHOTAI_ICON_FILE from './vendor-icons/moonshotai.svg';\nimport MYSHELL_AI_ICON_FILE from './vendor-icons/myshell-ai.svg';\nimport NVIDIA_ICON_FILE from './vendor-icons/nvidia.svg';\nimport OPENAI_ICON_FILE from './vendor-icons/openai.svg';\nimport OPENCHAT_ICON_FILE from './vendor-icons/openchat.svg';\nimport OPENROUTER_ICON_FILE from './vendor-icons/openrouter.svg';\nimport PERPLEXITY_ICON_FILE from './vendor-icons/perplexity.svg';\nimport PFNET_ICON_FILE from './vendor-icons/pfnet.svg';\nimport PIPECAT_AI_ICON_FILE from './vendor-icons/pipecat-ai.svg';\nimport QWEN_ICON_FILE from './vendor-icons/qwen.svg';\nimport RUNWAYML_ICON_FILE from './vendor-icons/runwayml.svg';\nimport STABILITY_AI_ICON_FILE from './vendor-icons/stabilityai.svg';\nimport THEBLOKE_ICON_FILE from './vendor-icons/thebloke.svg';\nimport TIIUAE_ICON_FILE from './vendor-icons/tiiuae.svg';\nimport TINYLLAMA_ICON_FILE from './vendor-icons/tinyllama.svg';\nimport UNUM_ICON_FILE from './vendor-icons/unum.svg';\nimport XAI_ICON_FILE from './vendor-icons/xai.svg';\nimport ZAI_ORG_ICON_FILE from './vendor-icons/zai-org.svg';\n\nexport const NOVITA_ICON = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"48\" height=\"48\" viewBox=\"0 0 48 48\" role=\"img\" aria-label=\"Novita AI\">\n <rect width=\"48\" height=\"48\" rx=\"10\" fill=\"#F7F8FA\"/>\n <g transform=\"translate(7 13.35) scale(1.4167)\">\n <path d=\"M24 14.8323V14.8326H14.3246L9.16716 9.67507V14.8326H0V14.8314L9.16716 5.66422V0H9.16774L24 14.8323Z\" fill=\"#050505\"/>\n </g>\n</svg>`;\n\nconst OPENROUTER_LAB_ICONS: Record<string, string> = {\n anthropic: ANTHROPIC_ICON_FILE,\n google: GOOGLE_ICON_FILE,\n 'google-ai': GOOGLE_ICON_FILE,\n meta: META_ICON_FILE,\n 'meta-llama': META_ICON_FILE,\n nvidia: NVIDIA_ICON_FILE,\n alibaba: QWEN_ICON_FILE,\n deepseek: DEEPSEEK_ICON_FILE,\n 'deepseek-ai': DEEPSEEK_ICON_FILE,\n qwen: QWEN_ICON_FILE,\n minimax: MINIMAX_ICON_FILE,\n moonshotai: MOONSHOTAI_ICON_FILE,\n moonshot: MOONSHOTAI_ICON_FILE,\n 'x-ai': XAI_ICON_FILE,\n xai: XAI_ICON_FILE,\n 'z-ai': ZAI_ORG_ICON_FILE,\n 'zai-org': ZAI_ORG_ICON_FILE,\n zai: ZAI_ORG_ICON_FILE,\n zhipu: ZAI_ORG_ICON_FILE,\n exaone: EXAONE_ICON_FILE,\n lgai: EXAONE_ICON_FILE,\n openrouter: OPENROUTER_ICON_FILE,\n openai: OPENAI_ICON_FILE,\n 'openai-sdk': OPENAI_ICON_FILE,\n mistral: MISTRALAI_ICON_FILE,\n mistralai: MISTRALAI_ICON_FILE,\n cohere: COHERE_ICON_FILE,\n perplexity: PERPLEXITY_ICON_FILE,\n};\n\nconst COPIED_OPENROUTER_VENDOR_ICONS: Record<string, string> = {\n ai4bharat: AI4BHARAT_ICON_FILE,\n aisingapore: AISINGAPORE_ICON_FILE,\n baai: BAAI_ICON_FILE,\n 'black-forest-labs': BLACK_FOREST_LABS_ICON_FILE,\n blackforestlabs: BLACK_FOREST_LABS_ICON_FILE,\n bfl: BLACK_FOREST_LABS_ICON_FILE,\n bytedance: BYTEDANCE_ICON_FILE,\n deepgram: DEEPGRAM_ICON_FILE,\n defog: DEFOG_ICON_FILE,\n fblgit: FBLGIT_ICON_FILE,\n google: GOOGLE_ICON_FILE,\n huggingface: HUGGINGFACE_ICON_FILE,\n 'hugging-face': HUGGINGFACE_ICON_FILE,\n ibm: IBM_ICON_FILE,\n 'ibm-granite': IBM_ICON_FILE,\n leonardo: LEONARDO_ICON_FILE,\n 'leonardo-ai': LEONARDO_ICON_FILE,\n 'llava-hf': LLAVA_HF_ICON_FILE,\n lykon: LYKON_ICON_FILE,\n microsoft: MICROSOFT_ICON_FILE,\n 'myshell-ai': MYSHELL_AI_ICON_FILE,\n openchat: OPENCHAT_ICON_FILE,\n pfnet: PFNET_ICON_FILE,\n 'pipecat-ai': PIPECAT_AI_ICON_FILE,\n runwayml: RUNWAYML_ICON_FILE,\n 'stability-ai': STABILITY_AI_ICON_FILE,\n stabilityai: STABILITY_AI_ICON_FILE,\n thebloke: THEBLOKE_ICON_FILE,\n tiiuae: TIIUAE_ICON_FILE,\n tinyllama: TINYLLAMA_ICON_FILE,\n unum: UNUM_ICON_FILE,\n};\n\nexport function svgToDataUri(svg: string): string {\n const encoded = encodeURIComponent(svg)\n .replace(/'/g, '%27')\n .replace(/\"/g, '%22');\n return `data:image/svg+xml,${encoded}`;\n}\n\nfunction normalizeIcon(icon: string): string {\n if (icon.startsWith('data:') || icon.startsWith('http://') || icon.startsWith('https://')) {\n return icon;\n }\n return svgToDataUri(icon);\n}\n\nfunction getVendorSegment(modelId?: string): string | undefined {\n const normalized = (modelId || '').trim().toLowerCase();\n if (!normalized || !normalized.includes('/')) return undefined;\n return normalized.split('/')[0];\n}\n\nfunction getLabIcon(modelId?: string): string | undefined {\n const vendor = getVendorSegment(modelId);\n if (!vendor) return undefined;\n\n const icon = OPENROUTER_LAB_ICONS[vendor] || COPIED_OPENROUTER_VENDOR_ICONS[vendor];\n return icon ? normalizeIcon(icon) : undefined;\n}\n\nexport function getNovitaIconDataUri(): string {\n return svgToDataUri(NOVITA_ICON);\n}\n\nexport function getNovitaModelIconDataUri(modelId?: string): string | undefined {\n return getLabIcon(modelId);\n}\n","import { z } from 'zod';\n\n/**\n * Novita provider options schema.\n *\n * Novita exposes an OpenAI-compatible Chat Completions API. These options cover\n * documented Novita-specific and OpenAI-compatible parameters, while\n * passthrough keeps the provider forward-compatible with new API fields.\n */\nexport const novitaProviderOptions = z.object({\n /** Number of completions to generate. */\n n: z.number().int().min(1).max(128).optional(),\n\n /** Sampling seed for best-effort determinism. */\n seed: z.number().int().optional(),\n\n /** Penalize repeated tokens based on frequency. */\n frequency_penalty: z.number().min(-2).max(2).optional(),\n\n /** Penalize repeated tokens based on presence. */\n presence_penalty: z.number().min(-2).max(2).optional(),\n\n /** Novita repetition penalty. */\n repetition_penalty: z.number().gt(0).lt(2).optional(),\n\n /** Top-k sampling limit. */\n top_k: z.number().int().gt(1).lt(128).optional(),\n\n /** Minimum probability threshold relative to the most likely token. */\n min_p: z.number().min(0).max(1).optional(),\n\n /** Token logit biases. */\n logit_bias: z.record(z.string(), z.number().int().min(-100).max(100)).optional(),\n\n /** Return output token log probabilities. */\n logprobs: z.boolean().optional(),\n\n /** Number of top logprobs to return when `logprobs` is enabled. */\n top_logprobs: z.number().int().min(0).max(20).optional(),\n\n /** Request reasoning content separately when supported by the selected model. */\n separate_reasoning: z.boolean().optional(),\n\n /** Enable or disable model thinking when supported by the selected model. */\n enable_thinking: z.boolean().optional(),\n\n /** Output modalities for models that can return audio. */\n modalities: z.array(z.string()).optional(),\n}).passthrough();\n\nexport type NovitaProviderOptions = z.infer<typeof novitaProviderOptions>;\n","import type { ProviderFactoryConfig, ProviderFactoryWithOptions, ProviderConfigSlots } from '@standardagents/spec';\nimport { NovitaProvider } from './NovitaProvider';\nimport { novitaProviderOptions } from './providerOptions';\n\n/**\n * Novita AI provider factory for Standard Agents.\n *\n * Uses Novita's OpenAI-compatible Chat Completions API and live model catalog.\n */\nexport const novita: ProviderFactoryWithOptions<typeof novitaProviderOptions> =\n Object.assign(\n (config: ProviderFactoryConfig) => new NovitaProvider(config),\n {\n providerOptions: novitaProviderOptions,\n configSlots: {\n apiKey: {\n type: 'secret',\n required: true,\n defaultEnv: 'NOVITA_API_KEY',\n overridable: true,\n description: 'Novita AI API key used to authenticate provider requests.',\n },\n baseUrl: {\n type: 'url',\n required: false,\n default: 'https://api.novita.ai/openai/v1',\n overridable: true,\n description: 'Novita OpenAI-compatible API base URL.',\n },\n timeout: {\n type: 'number',\n required: false,\n default: 30000,\n overridable: true,\n description: 'Provider request timeout in milliseconds.',\n },\n } satisfies ProviderConfigSlots,\n }\n );\n\nexport { novitaProviderOptions, type NovitaProviderOptions } from './providerOptions';\nexport {\n NovitaProvider,\n normalizeNovitaPricePerMillion,\n novitaUsagePricingFromModel,\n calculateNovitaUsageCost,\n type NovitaModelInfo,\n} from './NovitaProvider';\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@standardagents/novita",
3
- "version": "0.42.2",
3
+ "version": "0.43.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.42.2"
34
+ "@standardagents/spec": "^0.43.0"
35
35
  },
36
36
  "devDependencies": {
37
- "@standardagents/spec": "0.42.2",
37
+ "@standardagents/spec": "0.43.0",
38
38
  "tsup": "^8.3.5",
39
39
  "typescript": "^5.9.0"
40
40
  },