@standardagents/novita 0.42.2 → 0.42.3
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 +9 -0
- package/dist/index.d.ts +21 -8
- package/dist/index.js +59 -17
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
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
|
-
|
|
39
|
-
|
|
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
|
-
|
|
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
|
|
69
|
-
|
|
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
|
|
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
|
-
|
|
874
|
+
prices?.prompt?.price_per_m ?? (tierPricing ? void 0 : model?.input_token_price_per_m)
|
|
838
875
|
);
|
|
839
876
|
const outputPerMillion = normalizeNovitaPricePerMillion(
|
|
840
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
983
|
-
return novitaUsagePricingFromModel(model);
|
|
1020
|
+
return models.find((candidate) => candidate.id === modelId);
|
|
984
1021
|
} catch {
|
|
985
|
-
|
|
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.
|
|
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
|
|
1037
|
+
const pricingModel = await _NovitaProvider.settlePricingModel(pricingPromise);
|
|
1002
1038
|
const data = await response.json();
|
|
1003
|
-
return transformChatResponse(
|
|
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.
|
|
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
|
|
1032
|
-
|
|
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":";AAYA,SAAS,qBAAqB;;;AC2I9B,SAAS,UAAU,OAAuB;AACxC,SAAO,OAAO,MAAM,QAAQ,EAAE,CAAC;AACjC;AAEO,SAAS,mBACd,OACA,SACoB;AACpB,MACE,CAAC,WACD,OAAO,QAAQ,oBAAoB,YACnC,OAAO,QAAQ,qBAAqB,UACpC;AACA,WAAO;AAAA,EACT;AAEA,QAAM,eAAe,MAAM,gBAAgB;AAC3C,QAAM,uBAAuB,KAAK,IAAI,GAAG,MAAM,eAAe,YAAY;AAC1E,QAAM,aAAa,QAAQ,yBAAyB,QAAQ;AAE5D,SAAO;AAAA,IACJ,uBAAuB,MAAa,QAAQ,kBAC1C,eAAe,MAAa,aAC5B,MAAM,mBAAmB,MAAa,QAAQ;AAAA,EACnD;AACF;AAEO,SAAS,mBACd,OACA,SACe;AACf,MAAI,CAAC,QAAS,QAAO;AACrB,QAAM,UAAU;AAChB,QAAM,OAAO,mBAAmB,OAAO,OAAO;AAC9C,MAAI,SAAS,OAAW,OAAM,OAAO;AACrC,SAAO;AACT;AAEO,SAAS,yBAAyB,MAA0C;AACjF,MAAI,KAAK,SAAS,QAAQ;AACxB,WAAO,EAAE,MAAM,QAAQ,MAAM,KAAK,KAAK;AAAA,EACzC;AAEA,MAAI,KAAK,SAAS,SAAS;AACzB,UAAM,OAAO,KAAK,QAAQ;AAC1B,UAAM,WAAW,KAAK,WAAW,OAAO,IACpC,OACA,QAAQ,KAAK,aAAa,WAAW,WAAW,IAAI;AAExD,WAAO;AAAA,MACL,MAAM;AAAA,MACN,WAAW;AAAA,QACT,KAAK;AAAA,QACL,QAAQ,KAAK,UAAU;AAAA,MACzB;AAAA,IACF;AAAA,EACF;AAEA,MAAI,KAAK,SAAS,aAAa;AAC7B,WAAO;AAAA,MACL,MAAM;AAAA,MACN,WAAW;AAAA,QACT,KAAK,KAAK,WAAW,OAAO;AAAA,QAC5B,QAAQ,KAAK,WAAW,UAAU;AAAA,MACpC;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,MAAM,UAAU,KAAK,YAAY,MAAM;AAAA,EACzC;AACF;AAEO,SAAS,4BACd,SACkC;AAClC,MAAI,OAAO,YAAY,UAAU;AAC/B,WAAO;AAAA,EACT;AACA,SAAO,QAAQ,IAAI,wBAAwB;AAC7C;AAEO,SAAS,sBAAsB,UAAkD;AACtF,QAAM,SAA8B,CAAC;AAErC,aAAW,OAAO,UAAU;AAC1B,YAAQ,IAAI,MAAM;AAAA,MAChB,KAAK;AACH,eAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,SAAS,IAAI;AAAA,QACf,CAAC;AACD;AAAA,MACF,KAAK;AACH,eAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,SAAS,4BAA4B,IAAI,OAAO;AAAA,QAClD,CAAC;AACD;AAAA,MACF,KAAK,aAAa;AAChB,cAAM,UAAqD;AAAA,UACzD,MAAM;AAAA,UACN,SAAS,IAAI,WAAW;AAAA,QAC1B;AAEA,YAAI,IAAI,aAAa,IAAI,UAAU,SAAS,GAAG;AAC7C,kBAAQ,aAAa,IAAI,UAAU,IAAI,CAAC,QAAQ;AAAA,YAC9C,IAAI,GAAG;AAAA,YACP,MAAM;AAAA,YACN,UAAU;AAAA,cACR,MAAM,GAAG;AAAA,cACT,WAAW,OAAO,GAAG,cAAc,WAC/B,GAAG,YACH,KAAK,UAAU,GAAG,SAAS;AAAA,YACjC;AAAA,UACF,EAAE;AAAA,QACJ;AAEA,YAAI,IAAI,WAAW;AACjB,kBAAQ,oBAAoB,IAAI;AAAA,QAClC;AAEA,eAAO,KAAK,OAAO;AACnB;AAAA,MACF;AAAA,MACA,KAAK,QAAQ;AACX,YAAI;AAEJ,YAAI,OAAO,IAAI,YAAY,UAAU;AACnC,mBAAS,IAAI;AAAA,QACf,WAAW,UAAU,IAAI,SAAS;AAChC,cAAI,IAAI,QAAQ,SAAS,QAAQ;AAC/B,qBAAS,IAAI,QAAQ;AAAA,UACvB,WAAW,IAAI,QAAQ,SAAS,SAAS;AACvC,qBAAS,UAAU,IAAI,QAAQ,KAAK;AAAA,UACtC,OAAO;AACL,qBAAS,KAAK,UAAU,IAAI,OAAO;AAAA,UACrC;AAAA,QACF,OAAO;AACL,mBAAS,KAAK,UAAU,IAAI,OAAO;AAAA,QACrC;AAEA,cAAM,mBAAmB,IAAI,aAAa,OAAO,CAAC,MAAM,EAAE,SAAS,WAAW,EAAE,IAAI,KAAK,CAAC;AAC1F,eAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,cAAc,IAAI;AAAA,UAClB,SAAS,WAAW,iBAAiB,SAAS,IAAI,YAAY;AAAA,QAChE,CAAC;AAED,YAAI,iBAAiB,SAAS,GAAG;AAC/B,gBAAM,eAAwC,CAAC;AAC/C,gBAAM,WAAW,IAAI,YAAY;AACjC,gBAAM,WAAW,iBAAiB,WAAW;AAC7C,gBAAM,aAAa,WAAW,aAAa,GAAG,iBAAiB,MAAM;AACrE,gBAAM,OAAO,WAAW,OAAO;AAE/B,uBAAa,KAAK;AAAA,YAChB,MAAM;AAAA,YACN,MAAM,QAAQ,IAAI,IAAI,UAAU,SAAS,QAAQ;AAAA,UACnD,CAAC;AAED,qBAAW,cAAc,kBAAkB;AACzC,kBAAM,iBAAiB,WAAW,QAAQ;AAC1C,kBAAM,YAAY,eAAe,WAAW,OAAO,IAC/C,iBACA,QAAQ,WAAW,aAAa,WAAW,WAAW,cAAc;AAExE,yBAAa,KAAK;AAAA,cAChB,MAAM;AAAA,cACN,WAAW;AAAA,gBACT,KAAK;AAAA,gBACL,QAAQ;AAAA,cACV;AAAA,YACF,CAAC;AAAA,UACH;AAEA,iBAAO,KAAK;AAAA,YACV,MAAM;AAAA,YACN,SAAS;AAAA,UACX,CAAC;AAAA,QACH;AACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,SAAS,OAAkD;AAClE,SAAO,CAAC,CAAC,SAAS,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK;AACrE;AAEA,IAAM,8BAA8B,oBAAI,IAAY;AAAA,EAClD;AAAA,EAAa;AAAA,EAAa;AAAA,EAAW;AAAA,EACrC;AAAA,EAAW;AAAA,EAAW;AAAA,EAAoB;AAAA,EAAoB;AAAA,EAC9D;AAAA,EAAY;AAAA,EAAY;AAAA,EAAe;AAAA,EAAe;AAAA,EACtD;AAAA,EAAiB;AAAA,EAAiB;AAAA,EAAqB;AAAA,EACvD;AAAA,EAAqB;AAAA,EAAoB;AAAA,EACzC;AAAA,EAAW;AAAA,EAAY;AAAA,EAAW;AAAA,EAAY;AAAA,EAAmB;AACnE,CAAC;AAED,SAAS,0BAA0B,QAA0B;AAC3D,MAAI,MAAM,QAAQ,MAAM,GAAG;AACzB,WAAO,OAAO,IAAI,CAAC,SAAS,0BAA0B,IAAI,CAAC;AAAA,EAC7D;AACA,MAAI,CAAC,SAAS,MAAM,GAAG;AACrB,WAAO;AAAA,EACT;AAEA,QAAM,aAAsC,CAAC;AAC7C,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AACjD,QAAI,4BAA4B,IAAI,GAAG,EAAG;AAE1C,QAAI,QAAQ,gBAAgB,SAAS,KAAK,GAAG;AAC3C,YAAM,QAAiC,CAAC;AACxC,iBAAW,CAAC,UAAU,UAAU,KAAK,OAAO,QAAQ,KAAK,GAAG;AAC1D,cAAM,QAAQ,IAAI,0BAA0B,UAAU;AAAA,MACxD;AACA,iBAAW,GAAG,IAAI;AAAA,IACpB,WAAW,QAAQ,UAAU,QAAQ,SAAS;AAC5C,iBAAW,GAAG,IAAI;AAAA,IACpB,OAAO;AACL,iBAAW,GAAG,IAAI,0BAA0B,KAAK;AAAA,IACnD;AAAA,EACF;AAEA,QAAM,aAAa,SAAS,WAAW,UAAU,IAAI,WAAW,aAAa;AAC7E,QAAM,OAAO,WAAW;AACxB,QAAM,iBACJ,SAAS,YAAa,MAAM,QAAQ,IAAI,KAAK,KAAK,SAAS,QAAQ,KAAM,CAAC,CAAC;AAE7E,MAAI,gBAAgB;AAClB,QAAI,WAAW,SAAS,QAAW;AACjC,iBAAW,OAAO;AAAA,IACpB;AACA,eAAW,aAAa,cAAc,CAAC;AACvC,eAAW,WAAW,OAAO,KAAK,WAAW,UAAqC;AAClF,eAAW,uBAAuB;AAAA,EACpC;AAEA,SAAO;AACT;AAEA,SAAS,8BACP,YACyB;AACzB,QAAM,OAAO,SAAS,UAAU,IAAI,EAAE,GAAG,WAAW,IAAI,CAAC;AACzD,MAAI,KAAK,SAAS,OAAW,MAAK,OAAO;AACzC,MAAI,KAAK,eAAe,OAAW,MAAK,aAAa,CAAC;AACtD,SAAO,0BAA0B,IAAI;AACvC;AAEO,SAAS,kBAAkB,MAAoC;AACpE,QAAM,cAAc,KAAK,SAAS;AAElC,SAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAU;AAAA,MACR,MAAM,KAAK,SAAS;AAAA,MACpB,aAAa,KAAK,SAAS,eAAe;AAAA,MAC1C,YAAY,8BAA8B,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA,IAKvD;AAAA,EACF;AACF;AAEO,SAAS,wBACd,QACkC;AAClC,MAAI,WAAW,OAAQ,QAAO;AAC9B,MAAI,WAAW,OAAQ,QAAO;AAC9B,MAAI,WAAW,WAAY,QAAO;AAClC,MAAI,OAAO,WAAW,YAAY,UAAU,QAAQ;AAClD,WAAO,EAAE,MAAM,YAAY,UAAU,EAAE,MAAM,OAAO,KAAK,EAAE;AAAA,EAC7D;AACA,SAAO;AACT;AAEO,SAAS,oBAAoB,cAA+D;AACjG,UAAQ,cAAc;AAAA,IACpB,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAEO,SAAS,qBACd,WACoC;AACpC,MAAI,CAAC,aAAa,UAAU,WAAW,GAAG;AACxC,WAAO;AAAA,EACT;AAEA,SAAO,UAAU,IAAI,CAAC,OAAO;AAC3B,QAAI,aAAsC,CAAC;AAC3C,QAAI;AACF,mBAAa,GAAG,SAAS,YAAY,KAAK,MAAM,GAAG,SAAS,SAAS,IAAI,CAAC;AAAA,IAC5E,QAAQ;AACN,mBAAa,CAAC;AAAA,IAChB;AAEA,WAAO;AAAA,MACL,IAAI,GAAG;AAAA,MACP,MAAM,GAAG,SAAS;AAAA,MAClB,WAAW;AAAA,IACb;AAAA,EACF,CAAC;AACH;AAEO,SAAS,mBACd,OACA,SACe;AACf,QAAM,SAAwB;AAAA,IAC5B,cAAc,OAAO,iBAAiB;AAAA,IACtC,kBAAkB,OAAO,qBAAqB;AAAA,IAC9C,aAAa,OAAO,gBAAgB;AAAA,IACpC,cAAc,OAAO,uBAAuB;AAAA,IAC5C,iBAAiB,OAAO,2BAA2B;AAAA,EACrD;AAEA,SAAO,mBAAmB,QAAQ,OAAO;AAC3C;AAEO,SAAS,sBACd,UACA,SACkB;AAClB,QAAM,SAAS,SAAS,UAAU,CAAC;AACnC,QAAM,UAAU,QAAQ;AACxB,QAAM,YAAY,SAAS,qBAAqB,SAAS,aAAa;AAEtE,SAAO;AAAA,IACL,SAAS,SAAS,WAAW;AAAA,IAC7B;AAAA,IACA,kBAAkB,YAAY,CAAC,EAAE,MAAM,QAAQ,MAAM,UAAU,CAAC,IAAI;AAAA,IACpE,WAAW,qBAAqB,SAAS,UAAU;AAAA,IACnD,cAAc,oBAAoB,QAAQ,aAAa;AAAA,IACvD,OAAO,mBAAmB,SAAS,OAAO,OAAO;AAAA,IACjD,UAAU;AAAA,MACR,OAAO,SAAS;AAAA,MAChB,UAAU;AAAA,MACV,WAAW,SAAS;AAAA,MACpB,SAAS,SAAS;AAAA,MAClB,QAAQ,SAAS;AAAA,IACnB;AAAA,EACF;AACF;AAYO,SAAS,sBAAsB,OAAuC;AAC3E,SAAO;AAAA,IACL;AAAA,IACA,SAAS;AAAA,IACT,WAAW,oBAAI,IAAI;AAAA,IACnB,kBAAkB;AAAA,IAClB,YAAY;AAAA,IACZ,cAAc;AAAA,IACd,cAAc;AAAA,EAChB;AACF;AAEO,SAAS,uBACd,OACA,OACuB;AACvB,QAAM,SAAgC,CAAC;AACvC,QAAM,SAAS,MAAM,UAAU,CAAC;AAChC,QAAM,QAAQ,QAAQ;AAEtB,MAAI,MAAM,OAAO;AACf,UAAM,QAAQ,MAAM;AAAA,EACtB;AAEA,MAAI,CAAC,SAAS,CAAC,QAAQ,iBAAiB,CAAC,MAAM,OAAO;AACpD,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,SAAS;AAClB,UAAM,aAAa;AACnB,UAAM,WAAW,MAAM;AACvB,WAAO,KAAK,EAAE,MAAM,iBAAiB,OAAO,MAAM,QAAQ,CAAC;AAAA,EAC7D;AAEA,QAAM,iBAAiB,OAAO,qBAAqB,OAAO;AAC1D,MAAI,gBAAgB;AAClB,UAAM,eAAe;AACrB,UAAM,oBAAoB;AAC1B,WAAO,KAAK,EAAE,MAAM,mBAAmB,OAAO,eAAe,CAAC;AAAA,EAChE;AAEA,MAAI,OAAO,YAAY;AACrB,eAAW,MAAM,MAAM,YAAY;AACjC,YAAM,WAAW,MAAM,UAAU,IAAI,GAAG,KAAK;AAE7C,UAAI,GAAG,MAAM,GAAG,UAAU,MAAM;AAC9B,cAAM,UAAU,IAAI,GAAG,OAAO;AAAA,UAC5B,IAAI,GAAG;AAAA,UACP,MAAM,GAAG,SAAS;AAAA,UAClB,WAAW,GAAG,SAAS,aAAa;AAAA,QACtC,CAAC;AACD,eAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,IAAI,GAAG;AAAA,UACP,MAAM,GAAG,SAAS;AAAA,QACpB,CAAC;AAAA,MACH,WAAW,YAAY,GAAG,UAAU,WAAW;AAC7C,iBAAS,aAAa,GAAG,SAAS;AAClC,eAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,IAAI,SAAS;AAAA,UACb,gBAAgB,GAAG,SAAS;AAAA,QAC9B,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,MAAI,QAAQ,eAAe;AACzB,UAAM,eAAe,OAAO;AAE5B,QAAI,MAAM,YAAY;AACpB,aAAO,KAAK,EAAE,MAAM,eAAe,CAAC;AAAA,IACtC;AAEA,QAAI,MAAM,cAAc;AACtB,aAAO,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAAA,IACxC;AAEA,eAAW,MAAM,MAAM,UAAU,OAAO,GAAG;AACzC,UAAI,aAAsC,CAAC;AAC3C,UAAI;AACF,qBAAa,GAAG,YAAY,KAAK,MAAM,GAAG,SAAS,IAAI,CAAC;AAAA,MAC1D,QAAQ;AACN,qBAAa,CAAC;AAAA,MAChB;AAEA,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,IAAI,GAAG;AAAA,QACP,WAAW;AAAA,MACb,CAAC;AAAA,IACH;AAAA,EACF;AAEA,MAAI,MAAM,OAAO;AACf,UAAM,mBAA0D,MAAM,mBAClE,CAAC,EAAE,MAAM,QAAQ,MAAM,MAAM,iBAAiB,CAAC,IAC/C;AAEJ,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,cAAc,oBAAoB,MAAM,YAAY;AAAA,MACpD,OAAO,mBAAmB,MAAM,KAAK;AAAA,MACrC;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAEO,SAAS,qBAAqB,SAA+C;AAClF,MAAI;AACF,WAAO,KAAK,MAAM,OAAO;AAAA,EAC3B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,gBAAuB,mBACrB,UACA,OACoC;AACpC,QAAM,SAAS,SAAS,MAAM,UAAU;AACxC,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI,MAAM,kBAAkB;AAAA,EACpC;AAEA,QAAM,UAAU,IAAI,YAAY;AAChC,MAAI,SAAS;AAEb,MAAI;AACF,WAAO,MAAM;AACX,YAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAC1C,UAAI,KAAM;AAEV,gBAAU,QAAQ,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC;AAEhD,YAAM,QAAQ,OAAO,MAAM,IAAI;AAC/B,eAAS,MAAM,IAAI,KAAK;AAExB,iBAAW,QAAQ,OAAO;AACxB,cAAM,UAAU,KAAK,KAAK;AAC1B,YAAI,CAAC,WAAW,QAAQ,WAAW,GAAG,EAAG;AACzC,YAAI,CAAC,QAAQ,WAAW,QAAQ,EAAG;AAEnC,cAAM,OAAO,QAAQ,MAAM,CAAC;AAC5B,YAAI,SAAS,SAAU;AAEvB,cAAM,QAAQ,qBAAqB,IAAI;AACvC,YAAI,CAAC,MAAO;AAEZ,mBAAW,iBAAiB,uBAAuB,OAAO,KAAK,GAAG;AAChE,gBAAM;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAEA,QAAI,OAAO,KAAK,GAAG;AACjB,YAAM,UAAU,OAAO,KAAK;AAC5B,UAAI,QAAQ,WAAW,QAAQ,GAAG;AAChC,cAAM,OAAO,QAAQ,MAAM,CAAC;AAC5B,YAAI,SAAS,UAAU;AACrB,gBAAM,QAAQ,qBAAqB,IAAI;AACvC,cAAI,OAAO;AACT,uBAAW,iBAAiB,uBAAuB,OAAO,KAAK,GAAG;AAChE,oBAAM;AAAA,YACR;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF,UAAE;AACA,WAAO,YAAY;AAAA,EACrB;AACF;AAEO,SAAS,gBAAgB,SAAuD;AACrF,QAAM,SAAsC;AAAA,IAC1C,OAAO,QAAQ;AAAA,IACf,UAAU,sBAAsB,QAAQ,QAAQ;AAAA,EAClD;AAEA,MAAI,QAAQ,SAAS,QAAQ,MAAM,SAAS,GAAG;AAC7C,WAAO,QAAQ,QAAQ,MAAM,IAAI,iBAAiB;AAElD,UAAM,aAAa,wBAAwB,QAAQ,UAAU;AAC7D,QAAI,eAAe,QAAW;AAC5B,aAAO,cAAc;AAAA,IACvB;AAEA,QAAI,QAAQ,sBAAsB,QAAW;AAC3C,aAAO,sBAAsB,QAAQ;AAAA,IACvC;AAAA,EACF;AAEA,MAAI,QAAQ,oBAAoB,QAAW;AACzC,WAAO,aAAa,QAAQ;AAAA,EAC9B;AAEA,MAAI,QAAQ,gBAAgB,QAAW;AACrC,WAAO,cAAc,QAAQ;AAAA,EAC/B;AAEA,MAAI,QAAQ,SAAS,QAAW;AAC9B,WAAO,QAAQ,QAAQ;AAAA,EACzB;AAOA,MAAI,QAAQ,MAAM;AAChB,WAAO,OAAO,QAAQ;AAAA,EACxB;AAEA,MAAI,QAAQ,iBAAiB,QAAQ,cAAc,SAAS,GAAG;AAC7D,WAAO,OAAO,QAAQ;AAAA,EACxB;AAOA,MAAI,QAAQ,gBAAgB,SAAS,QAAQ;AAC3C,QAAI,QAAQ,eAAe,QAAQ;AACjC,aAAO,kBAAkB;AAAA,QACvB,MAAM;AAAA,QACN,aAAa;AAAA,UACX,MAAM;AAAA,UACN,QAAQ,0BAA0B,QAAQ,eAAe,MAAM;AAAA,UAC/D,QAAQ;AAAA,QACV;AAAA,MACF;AAAA,IACF,OAAO;AACL,aAAO,kBAAkB,EAAE,MAAM,cAAc;AAAA,IACjD;AAAA,EACF;AAEA,MAAI,QAAQ,iBAAiB;AAC3B,UAAM,EAAE,WAAW,GAAG,YAAY,IAAI,QAAQ;AAG9C,WAAO,OAAO,QAAQ,WAAW;AAAA,EACnC;AAEA,SAAO;AACT;AAEO,SAAS,qBAAqB,OAAe,MAAoC;AACtF,SAAO,EAAE,MAAM,SAAS,OAAO,KAAK;AACtC;AAEA,SAAS,aAAa,KAAsB;AAC1C,MAAI,IAAI,WAAW,OAAO,EAAG,QAAO;AACpC,MAAI,IAAI,SAAS,KAAK;AACpB,UAAM,gBAAgB;AACtB,WAAO,cAAc,KAAK,IAAI,UAAU,GAAG,GAAG,CAAC;AAAA,EACjD;AACA,SAAO;AACT;AAEA,SAAS,qBAAqB,KAAa,YAAoB,IAAY;AACzE,MAAI,IAAI,UAAU,UAAW,QAAO;AACpC,QAAM,UAAU,IAAI,UAAU,GAAG,SAAS;AAC1C,SAAO,GAAG,OAAO,kBAAkB,IAAI,OAAO,eAAe,CAAC;AAChE;AAEO,SAAS,mBAAsB,KAAQ,YAAoB,IAAO;AACvE,MAAI,QAAQ,QAAQ,QAAQ,QAAW;AACrC,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,QAAQ,UAAU;AAC3B,WAAQ,aAAa,GAAG,IAAI,qBAAqB,KAAK,SAAS,IAAI;AAAA,EACrE;AAEA,MAAI,MAAM,QAAQ,GAAG,GAAG;AACtB,WAAO,IAAI,IAAI,CAAC,SAAS,mBAAmB,MAAM,SAAS,CAAC;AAAA,EAC9D;AAEA,MAAI,OAAO,QAAQ,UAAU;AAC3B,UAAM,SAAkC,CAAC;AACzC,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,GAAG,GAAG;AAC9C,aAAO,GAAG,IAAI,mBAAmB,OAAO,SAAS;AAAA,IACnD;AACA,WAAO;AAAA,EACT;AAEA,SAAO;AACT;A;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACvwBO,IAAM,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAO3B,IAAM,uBAA+C;AAAA,EACnD,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,aAAa;AAAA,EACb,MAAM;AAAA,EACN,cAAc;AAAA,EACd,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,UAAU;AAAA,EACV,eAAe;AAAA,EACf,MAAM;AAAA,EACN,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,KAAK;AAAA,EACL,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,YAAY;AAAA,EACZ,QAAQ;AAAA,EACR,cAAc;AAAA,EACd,SAAS;AAAA,EACT,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,YAAY;AACd;AAEA,IAAM,iCAAyD;AAAA,EAC7D,WAAW;AAAA,EACX,aAAa;AAAA,EACb,MAAM;AAAA,EACN,qBAAqB;AAAA,EACrB,iBAAiB;AAAA,EACjB,KAAK;AAAA,EACL,WAAW;AAAA,EACX,UAAU;AAAA,EACV,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,aAAa;AAAA,EACb,gBAAgB;AAAA,EAChB,KAAK;AAAA,EACL,eAAe;AAAA,EACf,UAAU;AAAA,EACV,eAAe;AAAA,EACf,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,WAAW;AAAA,EACX,cAAc;AAAA,EACd,UAAU;AAAA,EACV,OAAO;AAAA,EACP,cAAc;AAAA,EACd,UAAU;AAAA,EACV,gBAAgB;AAAA,EAChB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,MAAM;AACR;AAEO,SAAS,aAAa,KAAqB;AAChD,QAAM,UAAU,mBAAmB,GAAG,EACnC,QAAQ,MAAM,KAAK,EACnB,QAAQ,MAAM,KAAK;AACtB,SAAO,sBAAsB,OAAO;AACtC;AAEA,SAAS,cAAc,MAAsB;AAC3C,MAAI,KAAK,WAAW,OAAO,KAAK,KAAK,WAAW,SAAS,KAAK,KAAK,WAAW,UAAU,GAAG;AACzF,WAAO;AAAA,EACT;AACA,SAAO,aAAa,IAAI;AAC1B;AAEA,SAAS,iBAAiB,SAAsC;AAC9D,QAAM,cAAc,WAAW,IAAI,KAAK,EAAE,YAAY;AACtD,MAAI,CAAC,cAAc,CAAC,WAAW,SAAS,GAAG,EAAG,QAAO;AACrD,SAAO,WAAW,MAAM,GAAG,EAAE,CAAC;AAChC;AAEA,SAAS,WAAW,SAAsC;AACxD,QAAM,SAAS,iBAAiB,OAAO;AACvC,MAAI,CAAC,OAAQ,QAAO;AAEpB,QAAM,OAAO,qBAAqB,MAAM,KAAK,+BAA+B,MAAM;AAClF,SAAO,OAAO,cAAc,IAAI,IAAI;AACtC;AAEO,SAAS,uBAA+B;AAC7C,SAAO,aAAa,WAAW;AACjC;AAEO,SAAS,0BAA0B,SAAsC;AAC9E,SAAO,WAAW,OAAO;AAC3B;;;AFzGA,IAAM,mBAAmB;AACzB,IAAM,qBAAqB;AAO3B,IAAM,gBAAmC;AAAA,EACvC;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,aAAa;AAAA,IACb,cAAc;AAAA,IACd,yBAAyB;AAAA,IACzB,0BAA0B;AAAA,EAC5B;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,aAAa;AAAA,IACb,cAAc;AAAA,IACd,yBAAyB;AAAA,IACzB,0BAA0B;AAAA,EAC5B;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,aAAa;AAAA,IACb,cAAc;AAAA,IACd,yBAAyB;AAAA,IACzB,0BAA0B;AAAA,EAC5B;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,aAAa;AAAA,IACb,cAAc;AAAA,IACd,yBAAyB;AAAA,IACzB,0BAA0B;AAAA,EAC5B;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,aAAa;AAAA,IACb,cAAc;AAAA,IACd,yBAAyB;AAAA,IACzB,0BAA0B;AAAA,EAC5B;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,aAAa;AAAA,IACb,cAAc;AAAA,IACd,yBAAyB;AAAA,IACzB,0BAA0B;AAAA,EAC5B;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,aAAa;AAAA,IACb,cAAc;AAAA,IACd,yBAAyB;AAAA,IACzB,0BAA0B;AAAA,EAC5B;AACF;AAEA,SAAS,oBAAoB,OAAuB;AAClD,SAAO,MAAM,QAAQ,QAAQ,EAAE;AACjC;AAEA,SAAS,oBAAoB,UAA8B,QAAyB;AAClF,SAAO,UAAU,YAAY,EAAE,SAAS,OAAO,YAAY,CAAC,KAAK;AACnE;AAEA,SAAS,cAAc,OAAiC;AACtD,QAAM,aAAa,GAAG,MAAM,EAAE,IAAI,MAAM,SAAS,EAAE,IAAI,MAAM,eAAe,EAAE;AAC9E,SACE,oBAAoB,YAAY,QAAQ,KACxC,oBAAoB,YAAY,QAAQ,KACxC,oBAAoB,YAAY,YAAY,KAC5C,oBAAoB,YAAY,OAAO,KACvC,oBAAoB,YAAY,KAAK,KACrC,UAAU,KAAK,UAAU;AAE7B;AAEO,SAAS,+BAA+B,OAAoC;AACjF,MAAI,OAAO,UAAU,YAAY,CAAC,OAAO,SAAS,KAAK,GAAG;AACxD,WAAO;AAAA,EACT;AACA,SAAO,QAAQ,QAAQ,oBAAoB,QAAQ,EAAE,CAAC;AACxD;AAEO,SAAS,4BACd,OACkC;AAClC,QAAM,kBAAkB;AAAA,IACtB,OAAO,SAAS,QAAQ,eAAe,OAAO;AAAA,EAChD;AACA,QAAM,mBAAmB;AAAA,IACvB,OAAO,SAAS,YAAY,eAAe,OAAO;AAAA,EACpD;AACA,MAAI,oBAAoB,UAAa,qBAAqB,QAAW;AACnE,WAAO;AAAA,EACT;AACA,QAAM,wBAAwB;AAAA,IAC5B,OAAO,SAAS,kBAAkB;AAAA,EACpC;AACA,QAAM,UAAgC;AAAA,IACpC;AAAA,IACA;AAAA,EACF;AACA,MAAI,0BAA0B,QAAW;AACvC,YAAQ,wBAAwB;AAAA,EAClC;AACA,SAAO;AACT;AAEO,SAAS,yBACd,OACA,SACoB;AACpB,MACE,CAAC,WACD,OAAO,QAAQ,oBAAoB,YACnC,OAAO,QAAQ,qBAAqB,UACpC;AACA,WAAO;AAAA,EACT;AAEA,QAAM,eAAe,MAAM,gBAAgB;AAC3C,QAAM,uBAAuB,KAAK,IAAI,GAAG,MAAM,eAAe,YAAY;AAC1E,QAAM,aAAa,QAAQ,yBAAyB,QAAQ;AAE5D,SAAO,QACJ,uBAAuB,MAAa,QAAQ,kBAC5C,eAAe,MAAa,aAC5B,MAAM,mBAAmB,MAAa,QAAQ,kBAC/C,QAAQ,EAAE,CAAC;AACf;AAEO,IAAM,iBAAN,MAAM,gBAAmC;AAAA,EACrC,OAAO;AAAA,EACP,uBAAuB;AAAA,EAExB;AAAA,EAER,OAAe,cAAwC;AAAA,EACvD,OAAe,kBAAkB;AAAA,EACjC,OAAwB,YAAY,IAAI,KAAK;AAAA,EAC7C,OAAwB,+BAA+B;AAAA,EAEvD,YAAY,QAA+B;AACzC,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,cAAc,UAA2B;AACvC,WAAO;AAAA,EACT;AAAA,EAEA,QAAQ,SAA0B;AAChC,WAAO,0BAA0B,OAAO,KAAK,qBAAqB;AAAA,EACpE;AAAA,EAEQ,UAAkB;AACxB,WAAO,oBAAoB,KAAK,OAAO,WAAW,gBAAgB;AAAA,EACpE;AAAA,EAEQ,UAAuB;AAC7B,WAAO;AAAA,MACL,gBAAgB;AAAA,MAChB,iBAAiB,UAAU,KAAK,OAAO,MAAM;AAAA,IAC/C;AAAA,EACF;AAAA,EAEA,MAAc,uBAAmD;AAC/D,UAAM,MAAM,KAAK,IAAI;AAErB,QACE,gBAAe,eACf,MAAM,gBAAe,kBAAkB,gBAAe,WACtD;AACA,aAAO,gBAAe;AAAA,IACxB;AAEA,UAAM,WAAW,MAAM,MAAM,GAAG,KAAK,QAAQ,CAAC,WAAW;AAAA,MACvD,QAAQ;AAAA,MACR,SAAS,KAAK,QAAQ;AAAA,IACxB,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,MAAM,KAAK,gCAAgC,UAAU,yBAAyB;AAAA,IACtF;AAEA,UAAM,OAAO,MAAM,SAAS,KAAK;AACjC,UAAM,SAAS,oBAAI,IAA6B;AAEhD,eAAW,SAAS,eAAe;AACjC,aAAO,IAAI,MAAM,IAAI,KAAK;AAAA,IAC5B;AAEA,eAAW,SAAS,KAAK,QAAQ,CAAC,GAAG;AACnC,aAAO,IAAI,MAAM,IAAI,EAAE,GAAG,OAAO,IAAI,MAAM,EAAE,GAAG,GAAG,MAAM,CAAC;AAAA,IAC5D;AAEA,oBAAe,cAAc,MAAM,KAAK,OAAO,OAAO,CAAC;AACvD,oBAAe,kBAAkB;AAEjC,WAAO,gBAAe;AAAA,EACxB;AAAA,EAEQ,qBAAqB,OAA2C;AACtE,WAAO;AAAA,MACL,gBAAgB,cAAc,KAAK;AAAA,MACnC,mBAAmB;AAAA,MACnB,mBAAmB;AAAA,MACnB,kBAAkB;AAAA,MAClB,kBAAkB,MAAM;AAAA,IAC1B;AAAA,EACF;AAAA,EAEA,MAAM,qBAAqB,SAAoD;AAC7E,QAAI;AACF,YAAM,SAAS,MAAM,KAAK,qBAAqB;AAC/C,YAAM,QAAQ,OAAO,KAAK,CAAC,cAAc,UAAU,OAAO,OAAO;AACjE,UAAI,CAAC,MAAO,QAAO;AACnB,aAAO,KAAK,qBAAqB,KAAK;AAAA,IACxC,SAAS,OAAO;AACd,cAAQ,MAAM,iDAAiD,OAAO,KAAK,KAAK;AAChF,YAAM,cAAc,cAAc,KAAK,CAAC,cAAc,UAAU,OAAO,OAAO;AAC9E,aAAO,cAAc,KAAK,qBAAqB,WAAW,IAAI;AAAA,IAChE;AAAA,EACF;AAAA,EAEQ,uBAAuB,OAA2C;AACxE,UAAM,UAAU,4BAA4B,KAAK;AAEjD,WAAO;AAAA,MACL,IAAI,MAAM;AAAA,MACV,MAAM,MAAM,SAAS,MAAM;AAAA,MAC3B,aAAa,MAAM;AAAA,MACnB,eAAe,MAAM;AAAA,MACrB,QAAQ,KAAK,QAAQ,MAAM,EAAE;AAAA,MAC7B,MAAM,MAAM;AAAA,MACZ,YAAY,SAAS;AAAA,MACrB,aAAa,SAAS;AAAA,MACtB,aAAa,SAAS;AAAA,MACtB,cAAc,KAAK,qBAAqB,KAAK;AAAA,IAC/C;AAAA,EACF;AAAA,EAEA,MAAM,UAAU,QAA+C;AAC7D,QAAI;AACF,UAAI,UAAU,MAAM,KAAK,qBAAqB,GAC3C,IAAI,CAAC,UAAU,KAAK,uBAAuB,KAAK,CAAC,EACjD,KAAK,CAAC,GAAG,MAAM,EAAE,KAAK,cAAc,EAAE,IAAI,CAAC;AAE9C,UAAI,QAAQ;AACV,cAAM,cAAc,OAAO,YAAY;AACvC,iBAAS,OAAO;AAAA,UACd,CAAC,UACC,MAAM,GAAG,YAAY,EAAE,SAAS,WAAW,KAC3C,MAAM,KAAK,YAAY,EAAE,SAAS,WAAW,KAC5C,MAAM,eAAe,MAAM,YAAY,YAAY,EAAE,SAAS,WAAW;AAAA,QAC9E;AAAA,MACF;AAEA,aAAO;AAAA,IACT,SAAS,OAAO;AACd,cAAQ,MAAM,uCAAuC,KAAK;AAC1D,aAAO,cAAc,IAAI,CAAC,UAAU,KAAK,uBAAuB,KAAK,CAAC;AAAA,IACxE;AAAA,EACF;AAAA,EAEA,aAAqB,mBACnB,gBAC2C;AAC3C,QAAI;AACJ,UAAM,UAAU,IAAI,QAAmB,CAAC,YAAY;AAClD,cAAQ,WAAW,MAAM,QAAQ,MAAS,GAAG,gBAAe,4BAA4B;AAAA,IAC1F,CAAC;AACD,QAAI;AACF,aAAO,MAAM,QAAQ,KAAK,CAAC,gBAAgB,OAAO,CAAC;AAAA,IACrD,UAAE;AACA,UAAI,UAAU,OAAW,cAAa,KAAK;AAAA,IAC7C;AAAA,EACF;AAAA,EAEA,MAAc,gBACZ,SAC2C;AAC3C,QAAI,CAAC,QAAS,QAAO;AACrB,QAAI;AACF,YAAM,SAAS,MAAM,KAAK,qBAAqB;AAC/C,YAAM,QAAQ,OAAO,KAAK,CAAC,cAAc,UAAU,OAAO,OAAO;AACjE,aAAO,4BAA4B,KAAK;AAAA,IAC1C,QAAQ;AACN,YAAM,cAAc,cAAc,KAAK,CAAC,cAAc,UAAU,OAAO,OAAO;AAC9E,aAAO,4BAA4B,WAAW;AAAA,IAChD;AAAA,EACF;AAAA,EAEA,MAAM,SAAS,SAAqD;AAClE,UAAM,iBAAiB,KAAK,gBAAgB,QAAQ,KAAK;AAEzD,QAAI;AACF,YAAM,WAAW,MAAM,MAAM,GAAG,KAAK,QAAQ,CAAC,qBAAqB;AAAA,QACjE,QAAQ;AAAA,QACR,SAAS,KAAK,QAAQ;AAAA,QACtB,MAAM,KAAK,UAAU,gBAAgB,OAAO,CAAC;AAAA,QAC7C,QAAQ,QAAQ;AAAA,MAClB,CAAC;AAED,UAAI,CAAC,SAAS,IAAI;AAChB,cAAM,MAAM,KAAK,gCAAgC,UAAU,kBAAkB;AAAA,MAC/E;AAEA,YAAM,UAAU,MAAM,gBAAe,mBAAmB,cAAc;AACtE,YAAM,OAAO,MAAM,SAAS,KAAK;AACjC,aAAO,sBAAsB,MAAM,OAAO;AAAA,IAC5C,SAAS,OAAO;AACd,YAAM,KAAK,gBAAgB,KAAK;AAAA,IAClC;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,SAAuE;AAClF,UAAM,OAAO;AACb,UAAM,iBAAiB,KAAK,gBAAgB,QAAQ,KAAK;AAEzD,QAAI;AACF,YAAM,WAAW,MAAM,MAAM,GAAG,KAAK,QAAQ,CAAC,qBAAqB;AAAA,QACjE,QAAQ;AAAA,QACR,SAAS,KAAK,QAAQ;AAAA,QACtB,MAAM,KAAK,UAAU;AAAA,UACnB,GAAG,gBAAgB,OAAO;AAAA,UAC1B,QAAQ;AAAA,UACR,gBAAgB,EAAE,eAAe,KAAK;AAAA,QACxC,CAAC;AAAA,QACD,QAAQ,QAAQ;AAAA,MAClB,CAAC;AAED,UAAI,CAAC,SAAS,IAAI;AAChB,cAAM,MAAM,KAAK,gCAAgC,UAAU,kBAAkB;AAAA,MAC/E;AAEA,aAAO;AAAA,QACL,QAAQ,OAAO,aAAa,IAAI;AAC9B,gBAAM,QAAQ,sBAAsB,QAAQ,KAAK;AAEjD,cAAI;AACF,6BAAiB,SAAS,mBAAmB,UAAU,KAAK,GAAG;AAC7D,kBAAI,MAAM,SAAS,UAAU;AAC3B,sBAAM,UAAU,MAAM,gBAAe,mBAAmB,cAAc;AACtE,oBAAI,QAAS,oBAAmB,MAAM,OAAO,OAAO;AAAA,cACtD;AACA,oBAAM;AAAA,YACR;AAAA,UACF,SAAS,OAAO;AACd,kBAAM,gBAAgB,KAAK,gBAAgB,KAAK;AAChD,kBAAM,qBAAqB,cAAc,SAAS,cAAc,IAAI;AAAA,UACtE;AAAA,QACF;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AACd,YAAM,KAAK,gBAAgB,KAAK;AAAA,IAClC;AAAA,EACF;AAAA,EAEA,MAAc,gCACZ,UACA,gBACwB;AACxB,UAAM,YAAY,MAAM,SAAS,KAAK;AACtC,QAAI,eAAe,GAAG,cAAc,KAAK,SAAS,MAAM;AACxD,QAAI;AACF,YAAM,YAAY,KAAK,MAAM,SAAS;AAItC,qBAAe,UAAU,OAAO,WAAW,UAAU,WAAW;AAAA,IAClE,QAAQ;AACN,qBAAe,aAAa;AAAA,IAC9B;AAEA,WAAO,KAAK,oBAAoB,cAAc,SAAS,QAAQ,SAAS,OAAO;AAAA,EACjF;AAAA,EAEQ,gBAAgB,OAA+B;AACrD,QAAI,iBAAiB,eAAe;AAClC,aAAO;AAAA,IACT;AAEA,QAAI,iBAAiB,OAAO;AAC1B,YAAM,WAAW;AAOjB,YAAM,SAAS,SAAS,UAAU,SAAS;AAC3C,YAAM,aAAa,SAAS,UAAU,aAAa,IAC/C,SAAS,SAAS,QAAQ,aAAa,GAAG,EAAE,IAC5C;AAEJ,UAAI,WAAW,KAAK;AAClB,eAAO,IAAI,cAAc,MAAM,SAAS,cAAc,QAAQ,UAAU;AAAA,MAC1E;AACA,UAAI,WAAW,OAAO,WAAW,KAAK;AACpC,eAAO,IAAI,cAAc,MAAM,SAAS,cAAc,MAAM;AAAA,MAC9D;AACA,UAAI,WAAW,OAAO,WAAW,KAAK;AACpC,eAAO,IAAI,cAAc,MAAM,SAAS,mBAAmB,MAAM;AAAA,MACnE;AACA,UAAI,UAAU,UAAU,KAAK;AAC3B,eAAO,IAAI,cAAc,MAAM,SAAS,gBAAgB,MAAM;AAAA,MAChE;AACA,UAAI,MAAM,SAAS,gBAAgB,SAAS,SAAS,aAAa;AAChE,eAAO,IAAI,cAAc,MAAM,SAAS,SAAS;AAAA,MACnD;AAEA,aAAO,IAAI,cAAc,MAAM,SAAS,WAAW,MAAM;AAAA,IAC3D;AAEA,WAAO,IAAI,cAAc,OAAO,KAAK,GAAG,SAAS;AAAA,EACnD;AAAA,EAEQ,oBACN,SACA,QACA,SACe;AACf,UAAM,mBAAmB,SAAS,IAAI,aAAa;AACnD,UAAM,aAAa,mBAAmB,SAAS,kBAAkB,EAAE,IAAI;AAEvE,QAAI,WAAW,KAAK;AAClB,aAAO,IAAI,cAAc,SAAS,cAAc,QAAQ,UAAU;AAAA,IACpE;AACA,QAAI,WAAW,OAAO,WAAW,KAAK;AACpC,aAAO,IAAI,cAAc,SAAS,cAAc,MAAM;AAAA,IACxD;AACA,QAAI,WAAW,OAAO,WAAW,KAAK;AACpC,aAAO,IAAI,cAAc,SAAS,mBAAmB,MAAM;AAAA,IAC7D;AACA,QAAI,UAAU,KAAK;AACjB,aAAO,IAAI,cAAc,SAAS,gBAAgB,MAAM;AAAA,IAC1D;AAEA,WAAO,IAAI,cAAc,SAAS,WAAW,MAAM;AAAA,EACrD;AAAA,EAEA,MAAM,eAAe,SAAqD;AACxE,UAAM,SAAS,gBAAgB,OAAO;AAEtC,WAAO;AAAA,MACL,MAAM,mBAAmB,MAAiC;AAAA,MAC1D,cAAc;AAAA,MACd,UAAU;AAAA,QACR,UAAU;AAAA,QACV,SAAS;AAAA,UACP,gBAAgB;AAAA,QAClB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;AG5fA,SAAS,SAAS;AASX,IAAM,wBAAwB,EAAE,OAAO;AAAA;AAAA,EAE5C,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,SAAS;AAAA;AAAA,EAG7C,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AAAA;AAAA,EAGhC,mBAAmB,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA;AAAA,EAGtD,kBAAkB,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA;AAAA,EAGrD,oBAAoB,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,SAAS;AAAA;AAAA,EAGpD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,EAAE,GAAG,GAAG,EAAE,SAAS;AAAA;AAAA,EAG/C,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA;AAAA,EAGzC,YAAY,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,IAAI,EAAE,IAAI,GAAG,CAAC,EAAE,SAAS;AAAA;AAAA,EAG/E,UAAU,EAAE,QAAQ,EAAE,SAAS;AAAA;AAAA,EAG/B,cAAc,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,SAAS;AAAA;AAAA,EAGvD,oBAAoB,EAAE,QAAQ,EAAE,SAAS;AAAA;AAAA,EAGzC,iBAAiB,EAAE,QAAQ,EAAE,SAAS;AAAA;AAAA,EAGtC,YAAY,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAC3C,CAAC,EAAE,YAAY;;;ACvCR,IAAM,SACX,OAAO;AAAA,EACL,CAAC,WAAkC,IAAI,eAAe,MAAM;AAAA,EAC5D;AAAA,IACE,iBAAiB;AAAA,IACjB,aAAa;AAAA,MACX,QAAQ;AAAA,QACN,MAAM;AAAA,QACN,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,aAAa;AAAA,QACb,aAAa;AAAA,MACf;AAAA,MACA,SAAS;AAAA,QACP,MAAM;AAAA,QACN,UAAU;AAAA,QACV,SAAS;AAAA,QACT,aAAa;AAAA,QACb,aAAa;AAAA,MACf;AAAA,MACA,SAAS;AAAA,QACP,MAAM;AAAA,QACN,UAAU;AAAA,QACV,SAAS;AAAA,QACT,aAAa;AAAA,QACb,aAAa;AAAA,MACf;AAAA,IACF;AAAA,EACF;AACF;","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.
|
|
3
|
+
"version": "0.42.3",
|
|
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.
|
|
34
|
+
"@standardagents/spec": "^0.42.3"
|
|
35
35
|
},
|
|
36
36
|
"devDependencies": {
|
|
37
|
-
"@standardagents/spec": "0.42.
|
|
37
|
+
"@standardagents/spec": "0.42.3",
|
|
38
38
|
"tsup": "^8.3.5",
|
|
39
39
|
"typescript": "^5.9.0"
|
|
40
40
|
},
|