@thanh01.pmt/curriculum-kit 1.4.26 → 1.4.28
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ai/index.cjs +103 -6
- package/dist/ai/index.cjs.map +1 -1
- package/dist/ai/index.d.cts +4 -4
- package/dist/ai/index.d.ts +4 -4
- package/dist/ai/index.mjs +103 -7
- package/dist/ai/index.mjs.map +1 -1
- package/dist/index.cjs +104 -6
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +5 -5
- package/dist/index.d.ts +5 -5
- package/dist/index.mjs +104 -7
- package/dist/index.mjs.map +1 -1
- package/dist/media/index.cjs +87 -5
- package/dist/media/index.cjs.map +1 -1
- package/dist/media/index.d.cts +1 -1
- package/dist/media/index.d.ts +1 -1
- package/dist/media/index.mjs +87 -5
- package/dist/media/index.mjs.map +1 -1
- package/dist/{milestoneBundleGenerator-CzSOeAzU.d.cts → milestoneBundleGenerator-CN6F1zPs.d.cts} +1 -1
- package/dist/{milestoneBundleGenerator-Bkba8OPG.d.ts → milestoneBundleGenerator-DTiJ5gIh.d.ts} +1 -1
- package/dist/pipeline/index.cjs +23 -4
- package/dist/pipeline/index.cjs.map +1 -1
- package/dist/pipeline/index.d.cts +3 -3
- package/dist/pipeline/index.d.ts +3 -3
- package/dist/pipeline/index.mjs +23 -4
- package/dist/pipeline/index.mjs.map +1 -1
- package/dist/{provider-factory-DxzOVEmh.d.cts → provider-factory-Bv-eIkhg.d.cts} +1 -1
- package/dist/{provider-factory-DxzOVEmh.d.ts → provider-factory-Bv-eIkhg.d.ts} +1 -1
- package/dist/storage/index.d.cts +2 -2
- package/dist/storage/index.d.ts +2 -2
- package/dist/{streamRunner-CYESG6IE.d.cts → streamRunner-kpS4MZP1.d.cts} +2 -1
- package/dist/{streamRunner-CYESG6IE.d.ts → streamRunner-kpS4MZP1.d.ts} +2 -1
- package/dist/workflow/index.cjs +102 -6
- package/dist/workflow/index.cjs.map +1 -1
- package/dist/workflow/index.d.cts +1 -1
- package/dist/workflow/index.d.ts +1 -1
- package/dist/workflow/index.mjs +102 -6
- package/dist/workflow/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -165,6 +165,7 @@ __export(streamRunner_exports, {
|
|
|
165
165
|
getDesignatedFallbackConfig: () => getDesignatedFallbackConfig,
|
|
166
166
|
isModelAllowed: () => isModelAllowed,
|
|
167
167
|
isProviderEnabled: () => isProviderEnabled,
|
|
168
|
+
resolveApiKey: () => resolveApiKey,
|
|
168
169
|
runCurriculumAIInference: () => runCurriculumAIInference,
|
|
169
170
|
streamCurriculumAIInference: () => streamCurriculumAIInference
|
|
170
171
|
});
|
|
@@ -230,14 +231,19 @@ function isModelAllowed(model) {
|
|
|
230
231
|
});
|
|
231
232
|
}
|
|
232
233
|
function getDesignatedFallbackChain() {
|
|
233
|
-
const rawProviders = resolveApiKey("FALLBACK_AI_PROVIDER") || resolveApiKey("FALLBACK_AI_PROVIDERS") || resolveApiKey("DEFAULT_AI_PROVIDER") || "nvidia,openrouter";
|
|
234
|
-
const rawModels = resolveApiKey("FALLBACK_AI_MODEL") || resolveApiKey("FALLBACK_AI_MODELS") || resolveApiKey("DEFAULT_AI_MODEL") || "
|
|
234
|
+
const rawProviders = resolveApiKey("FALLBACK_AI_PROVIDER") || resolveApiKey("FALLBACK_AI_PROVIDERS") || resolveApiKey("DEFAULT_AI_PROVIDER") || "9router,nvidia,openrouter";
|
|
235
|
+
const rawModels = resolveApiKey("FALLBACK_AI_MODEL") || resolveApiKey("FALLBACK_AI_MODELS") || resolveApiKey("DEFAULT_AI_MODEL") || "fast-reasoning,deep-reasoning,mid-range,free-tier";
|
|
235
236
|
const providerList = rawProviders.split(",").map((p) => p.trim().toLowerCase()).filter((p) => p.length > 0 && isProviderEnabled(p));
|
|
236
237
|
const modelList = rawModels.split(",").map((m) => m.trim()).filter((m) => m.length > 0 && isModelAllowed(m));
|
|
237
238
|
const chain = [];
|
|
238
239
|
for (const provider of providerList) {
|
|
239
240
|
let providerModels = [];
|
|
240
|
-
if (provider === "
|
|
241
|
+
if (provider === "9router" || provider === "ninerouter") {
|
|
242
|
+
providerModels = modelList.filter((m) => ["fast-reasoning", "deep-reasoning", "mid-range", "free-tier"].includes(m));
|
|
243
|
+
if (providerModels.length === 0) {
|
|
244
|
+
providerModels = ["fast-reasoning", "mid-range", "free-tier"];
|
|
245
|
+
}
|
|
246
|
+
} else if (provider === "nvidia") {
|
|
241
247
|
providerModels = modelList.filter((m) => m.startsWith("nvidia/") || m.startsWith("meta/") || m.startsWith("mistralai/"));
|
|
242
248
|
if (providerModels.length === 0) {
|
|
243
249
|
providerModels = ["nvidia/nemotron-3-ultra-550b-a55b:free", "nvidia/nemotron-3.5-lightning-30b-a3b"];
|
|
@@ -276,7 +282,7 @@ function getDesignatedFallbackChain() {
|
|
|
276
282
|
function getDesignatedFallbackConfig() {
|
|
277
283
|
const chain = getDesignatedFallbackChain();
|
|
278
284
|
if (chain.length > 0) return chain[0];
|
|
279
|
-
return { provider: "
|
|
285
|
+
return { provider: "9router", model: "fast-reasoning" };
|
|
280
286
|
}
|
|
281
287
|
function extractThoughtAndContent(rawText) {
|
|
282
288
|
let text = rawText || "";
|
|
@@ -518,8 +524,51 @@ Guidelines:
|
|
|
518
524
|
}))
|
|
519
525
|
];
|
|
520
526
|
const providerErrors = {};
|
|
521
|
-
const requestedModel = options.model || "
|
|
527
|
+
const requestedModel = options.model || "fast-reasoning";
|
|
522
528
|
const isNvidiaPreferred = requestedModel.startsWith("nvidia/") || Boolean(nvidiaKey && !openrouterKey) && isProviderEnabled("nvidia");
|
|
529
|
+
const ninerouterKey = resolveApiKey("NINEROUTER_API_KEY") || resolveApiKey("NINE_ROUTER_API_KEY");
|
|
530
|
+
if (ninerouterKey && isProviderEnabled("9router")) {
|
|
531
|
+
const rawUrl = resolveApiKey("NINEROUTER_BASE_URL") || resolveApiKey("NINE_ROUTER_BASE_URL") || "https://ai-router.orchable.app/v1";
|
|
532
|
+
const ninerouterBaseUrl = rawUrl.replace(/^["']|["']$/g, "").replace(/\/$/, "");
|
|
533
|
+
const candidateModels = [
|
|
534
|
+
options.model || "fast-reasoning",
|
|
535
|
+
"fast-reasoning",
|
|
536
|
+
"mid-range",
|
|
537
|
+
"free-tier"
|
|
538
|
+
].filter((m) => isModelAllowed(m));
|
|
539
|
+
const unique9RouterModels = Array.from(new Set(candidateModels));
|
|
540
|
+
for (const model of unique9RouterModels) {
|
|
541
|
+
try {
|
|
542
|
+
const idle = createStreamAbortController({ idleMs: 45e3, totalMs: 3e5 });
|
|
543
|
+
const res = await fetch(`${ninerouterBaseUrl}/chat/completions`, {
|
|
544
|
+
method: "POST",
|
|
545
|
+
headers: {
|
|
546
|
+
"Authorization": `Bearer ${ninerouterKey}`,
|
|
547
|
+
"Content-Type": "application/json"
|
|
548
|
+
},
|
|
549
|
+
body: JSON.stringify({
|
|
550
|
+
model,
|
|
551
|
+
messages: formattedMessages,
|
|
552
|
+
max_tokens: maxTokens,
|
|
553
|
+
temperature,
|
|
554
|
+
stream: true,
|
|
555
|
+
stream_options: { include_usage: true }
|
|
556
|
+
}),
|
|
557
|
+
signal: idle.signal
|
|
558
|
+
});
|
|
559
|
+
if (res.ok) {
|
|
560
|
+
const text = await processOpenAISSEStream(res, onChunk, idle);
|
|
561
|
+
if (text && text.trim()) return text;
|
|
562
|
+
} else {
|
|
563
|
+
const errText = await res.text().catch(() => "");
|
|
564
|
+
providerErrors[`9router_${model}`] = `HTTP ${res.status}: ${errText.slice(0, 120)}`;
|
|
565
|
+
}
|
|
566
|
+
} catch (e) {
|
|
567
|
+
providerErrors[`9router_${model}`] = e?.message || "Network error";
|
|
568
|
+
console.warn(`[9Router Stream] Failover for ${model}:`, e?.message || e);
|
|
569
|
+
}
|
|
570
|
+
}
|
|
571
|
+
}
|
|
523
572
|
if (nvidiaKey && isProviderEnabled("nvidia")) {
|
|
524
573
|
const candidateNemotronModels = [
|
|
525
574
|
requestedModel.startsWith("nvidia/") ? requestedModel : "nvidia/nemotron-3-ultra-550b-a55b:free",
|
|
@@ -729,7 +778,41 @@ Guidelines:
|
|
|
729
778
|
);
|
|
730
779
|
for (const target of fallbackChain) {
|
|
731
780
|
const { provider, model } = target;
|
|
732
|
-
if (provider === "
|
|
781
|
+
if ((provider === "9router" || provider === "ninerouter") && ninerouterKey && isProviderEnabled("9router")) {
|
|
782
|
+
try {
|
|
783
|
+
const rawUrl = resolveApiKey("NINEROUTER_BASE_URL") || resolveApiKey("NINE_ROUTER_BASE_URL") || "https://ai-router.orchable.app/v1";
|
|
784
|
+
const fbBaseUrl = rawUrl.replace(/["']/g, "").replace(/\/$/, "");
|
|
785
|
+
const idle = createStreamAbortController({ idleMs: 45e3, totalMs: 3e5 });
|
|
786
|
+
const res = await fetch(`${fbBaseUrl}/chat/completions`, {
|
|
787
|
+
method: "POST",
|
|
788
|
+
headers: {
|
|
789
|
+
"Authorization": `Bearer ${ninerouterKey}`,
|
|
790
|
+
"Content-Type": "application/json"
|
|
791
|
+
},
|
|
792
|
+
body: JSON.stringify({
|
|
793
|
+
model,
|
|
794
|
+
messages: formattedMessages,
|
|
795
|
+
max_tokens: maxTokens,
|
|
796
|
+
temperature,
|
|
797
|
+
stream: true,
|
|
798
|
+
stream_options: { include_usage: true }
|
|
799
|
+
}),
|
|
800
|
+
signal: idle.signal
|
|
801
|
+
});
|
|
802
|
+
if (res.ok) {
|
|
803
|
+
const text = await processOpenAISSEStream(res, onChunk, idle);
|
|
804
|
+
if (text && text.trim()) {
|
|
805
|
+
console.log(`[streamRunner] \u2705 Designated fallback 9Router (${model}) succeeded!`);
|
|
806
|
+
return text;
|
|
807
|
+
}
|
|
808
|
+
} else {
|
|
809
|
+
const errText = await res.text().catch(() => "");
|
|
810
|
+
providerErrors[`designated_fallback_9router_${model}`] = `HTTP ${res.status}: ${errText.slice(0, 120)}`;
|
|
811
|
+
}
|
|
812
|
+
} catch (e) {
|
|
813
|
+
providerErrors[`designated_fallback_9router_${model}`] = e?.message || "Network error";
|
|
814
|
+
}
|
|
815
|
+
} else if (provider === "nvidia" && nvidiaKey && isProviderEnabled("nvidia")) {
|
|
733
816
|
try {
|
|
734
817
|
const nvdIdle = options.idleTimeoutMs ?? 18e4;
|
|
735
818
|
const nvdTotal = options.timeoutMs ?? 6e5;
|
|
@@ -904,6 +987,15 @@ function getAIModel(options = {}) {
|
|
|
904
987
|
console.warn(`[provider-factory] Model "${resolvedModelName}" is not permitted by ALLOWED_AI_MODELS. Using designated model "${designated.model}".`);
|
|
905
988
|
resolvedModelName = designated.model;
|
|
906
989
|
}
|
|
990
|
+
if (provider === "9router" || provider === "ninerouter") {
|
|
991
|
+
const apiKey = options.apiKey || resolveApiKey("NINEROUTER_API_KEY") || resolveApiKey("NINE_ROUTER_API_KEY") || "";
|
|
992
|
+
const rawUrl = options.baseURL || resolveApiKey("NINEROUTER_BASE_URL") || resolveApiKey("NINE_ROUTER_BASE_URL") || "https://ai-router.orchable.app/v1";
|
|
993
|
+
const ninerouter = openai.createOpenAI({
|
|
994
|
+
apiKey,
|
|
995
|
+
baseURL: rawUrl.replace(/^["']|["']$/g, "").trim()
|
|
996
|
+
});
|
|
997
|
+
return ninerouter.chat(resolvedModelName || "fast-reasoning");
|
|
998
|
+
}
|
|
907
999
|
if (provider === "nvidia") {
|
|
908
1000
|
const apiKey = options.apiKey || process.env.NVIDIA_API_KEY || "";
|
|
909
1001
|
const nvidia = openai.createOpenAI({
|
|
@@ -972,6 +1064,9 @@ function getAIModel(options = {}) {
|
|
|
972
1064
|
return fallback.chat(resolvedModelName);
|
|
973
1065
|
}
|
|
974
1066
|
function detectDefaultProvider() {
|
|
1067
|
+
if ((process.env.NINEROUTER_API_KEY || resolveApiKey("NINEROUTER_API_KEY") || resolveApiKey("NINE_ROUTER_API_KEY")) && isProviderEnabled("9router")) {
|
|
1068
|
+
return "9router";
|
|
1069
|
+
}
|
|
975
1070
|
if (process.env.NVIDIA_API_KEY && isProviderEnabled("nvidia")) {
|
|
976
1071
|
return "nvidia";
|
|
977
1072
|
}
|
|
@@ -997,6 +1092,8 @@ var init_provider_factory = __esm({
|
|
|
997
1092
|
"src/ai/provider-factory.ts"() {
|
|
998
1093
|
init_streamRunner();
|
|
999
1094
|
DEFAULT_MODELS = {
|
|
1095
|
+
"9router": "fast-reasoning",
|
|
1096
|
+
ninerouter: "fast-reasoning",
|
|
1000
1097
|
nvidia: "nvidia/nemotron-3-ultra-550b-a55b:free",
|
|
1001
1098
|
openrouter: "@preset/coding-free",
|
|
1002
1099
|
alibaba: "qwen3.7-plus",
|
|
@@ -32456,6 +32553,7 @@ exports.renderFrameworkFromPlan = renderFrameworkFromPlan;
|
|
|
32456
32553
|
exports.renderHorizonPromptBlock = renderHorizonPromptBlock;
|
|
32457
32554
|
exports.renderMediaPlaceholder = renderMediaPlaceholder;
|
|
32458
32555
|
exports.researcherTools = researcherTools;
|
|
32556
|
+
exports.resolveApiKey = resolveApiKey;
|
|
32459
32557
|
exports.resolveGateSettings = resolveGateSettings;
|
|
32460
32558
|
exports.resolveStandardsPacks = resolveStandardsPacks;
|
|
32461
32559
|
exports.resolveStreamBudget = resolveStreamBudget;
|