@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/ai/index.cjs
CHANGED
|
@@ -177,14 +177,19 @@ function isModelAllowed(model) {
|
|
|
177
177
|
});
|
|
178
178
|
}
|
|
179
179
|
function getDesignatedFallbackChain() {
|
|
180
|
-
const rawProviders = resolveApiKey("FALLBACK_AI_PROVIDER") || resolveApiKey("FALLBACK_AI_PROVIDERS") || resolveApiKey("DEFAULT_AI_PROVIDER") || "nvidia,openrouter";
|
|
181
|
-
const rawModels = resolveApiKey("FALLBACK_AI_MODEL") || resolveApiKey("FALLBACK_AI_MODELS") || resolveApiKey("DEFAULT_AI_MODEL") || "
|
|
180
|
+
const rawProviders = resolveApiKey("FALLBACK_AI_PROVIDER") || resolveApiKey("FALLBACK_AI_PROVIDERS") || resolveApiKey("DEFAULT_AI_PROVIDER") || "9router,nvidia,openrouter";
|
|
181
|
+
const rawModels = resolveApiKey("FALLBACK_AI_MODEL") || resolveApiKey("FALLBACK_AI_MODELS") || resolveApiKey("DEFAULT_AI_MODEL") || "fast-reasoning,deep-reasoning,mid-range,free-tier";
|
|
182
182
|
const providerList = rawProviders.split(",").map((p) => p.trim().toLowerCase()).filter((p) => p.length > 0 && isProviderEnabled(p));
|
|
183
183
|
const modelList = rawModels.split(",").map((m) => m.trim()).filter((m) => m.length > 0 && isModelAllowed(m));
|
|
184
184
|
const chain = [];
|
|
185
185
|
for (const provider of providerList) {
|
|
186
186
|
let providerModels = [];
|
|
187
|
-
if (provider === "
|
|
187
|
+
if (provider === "9router" || provider === "ninerouter") {
|
|
188
|
+
providerModels = modelList.filter((m) => ["fast-reasoning", "deep-reasoning", "mid-range", "free-tier"].includes(m));
|
|
189
|
+
if (providerModels.length === 0) {
|
|
190
|
+
providerModels = ["fast-reasoning", "mid-range", "free-tier"];
|
|
191
|
+
}
|
|
192
|
+
} else if (provider === "nvidia") {
|
|
188
193
|
providerModels = modelList.filter((m) => m.startsWith("nvidia/") || m.startsWith("meta/") || m.startsWith("mistralai/"));
|
|
189
194
|
if (providerModels.length === 0) {
|
|
190
195
|
providerModels = ["nvidia/nemotron-3-ultra-550b-a55b:free", "nvidia/nemotron-3.5-lightning-30b-a3b"];
|
|
@@ -223,7 +228,7 @@ function getDesignatedFallbackChain() {
|
|
|
223
228
|
function getDesignatedFallbackConfig() {
|
|
224
229
|
const chain = getDesignatedFallbackChain();
|
|
225
230
|
if (chain.length > 0) return chain[0];
|
|
226
|
-
return { provider: "
|
|
231
|
+
return { provider: "9router", model: "fast-reasoning" };
|
|
227
232
|
}
|
|
228
233
|
function extractThoughtAndContent(rawText) {
|
|
229
234
|
let text = rawText || "";
|
|
@@ -467,8 +472,51 @@ Guidelines:
|
|
|
467
472
|
}))
|
|
468
473
|
];
|
|
469
474
|
const providerErrors = {};
|
|
470
|
-
const requestedModel = options.model || "
|
|
475
|
+
const requestedModel = options.model || "fast-reasoning";
|
|
471
476
|
const isNvidiaPreferred = requestedModel.startsWith("nvidia/") || Boolean(nvidiaKey && !openrouterKey) && isProviderEnabled("nvidia");
|
|
477
|
+
const ninerouterKey = resolveApiKey("NINEROUTER_API_KEY") || resolveApiKey("NINE_ROUTER_API_KEY");
|
|
478
|
+
if (ninerouterKey && isProviderEnabled("9router")) {
|
|
479
|
+
const rawUrl = resolveApiKey("NINEROUTER_BASE_URL") || resolveApiKey("NINE_ROUTER_BASE_URL") || "https://ai-router.orchable.app/v1";
|
|
480
|
+
const ninerouterBaseUrl = rawUrl.replace(/^["']|["']$/g, "").replace(/\/$/, "");
|
|
481
|
+
const candidateModels = [
|
|
482
|
+
options.model || "fast-reasoning",
|
|
483
|
+
"fast-reasoning",
|
|
484
|
+
"mid-range",
|
|
485
|
+
"free-tier"
|
|
486
|
+
].filter((m) => isModelAllowed(m));
|
|
487
|
+
const unique9RouterModels = Array.from(new Set(candidateModels));
|
|
488
|
+
for (const model of unique9RouterModels) {
|
|
489
|
+
try {
|
|
490
|
+
const idle = createStreamAbortController({ idleMs: 45e3, totalMs: 3e5 });
|
|
491
|
+
const res = await fetch(`${ninerouterBaseUrl}/chat/completions`, {
|
|
492
|
+
method: "POST",
|
|
493
|
+
headers: {
|
|
494
|
+
"Authorization": `Bearer ${ninerouterKey}`,
|
|
495
|
+
"Content-Type": "application/json"
|
|
496
|
+
},
|
|
497
|
+
body: JSON.stringify({
|
|
498
|
+
model,
|
|
499
|
+
messages: formattedMessages,
|
|
500
|
+
max_tokens: maxTokens,
|
|
501
|
+
temperature,
|
|
502
|
+
stream: true,
|
|
503
|
+
stream_options: { include_usage: true }
|
|
504
|
+
}),
|
|
505
|
+
signal: idle.signal
|
|
506
|
+
});
|
|
507
|
+
if (res.ok) {
|
|
508
|
+
const text = await processOpenAISSEStream(res, onChunk, idle);
|
|
509
|
+
if (text && text.trim()) return text;
|
|
510
|
+
} else {
|
|
511
|
+
const errText = await res.text().catch(() => "");
|
|
512
|
+
providerErrors[`9router_${model}`] = `HTTP ${res.status}: ${errText.slice(0, 120)}`;
|
|
513
|
+
}
|
|
514
|
+
} catch (e) {
|
|
515
|
+
providerErrors[`9router_${model}`] = e?.message || "Network error";
|
|
516
|
+
console.warn(`[9Router Stream] Failover for ${model}:`, e?.message || e);
|
|
517
|
+
}
|
|
518
|
+
}
|
|
519
|
+
}
|
|
472
520
|
if (nvidiaKey && isProviderEnabled("nvidia")) {
|
|
473
521
|
const candidateNemotronModels = [
|
|
474
522
|
requestedModel.startsWith("nvidia/") ? requestedModel : "nvidia/nemotron-3-ultra-550b-a55b:free",
|
|
@@ -678,7 +726,41 @@ Guidelines:
|
|
|
678
726
|
);
|
|
679
727
|
for (const target of fallbackChain) {
|
|
680
728
|
const { provider, model } = target;
|
|
681
|
-
if (provider === "
|
|
729
|
+
if ((provider === "9router" || provider === "ninerouter") && ninerouterKey && isProviderEnabled("9router")) {
|
|
730
|
+
try {
|
|
731
|
+
const rawUrl = resolveApiKey("NINEROUTER_BASE_URL") || resolveApiKey("NINE_ROUTER_BASE_URL") || "https://ai-router.orchable.app/v1";
|
|
732
|
+
const fbBaseUrl = rawUrl.replace(/["']/g, "").replace(/\/$/, "");
|
|
733
|
+
const idle = createStreamAbortController({ idleMs: 45e3, totalMs: 3e5 });
|
|
734
|
+
const res = await fetch(`${fbBaseUrl}/chat/completions`, {
|
|
735
|
+
method: "POST",
|
|
736
|
+
headers: {
|
|
737
|
+
"Authorization": `Bearer ${ninerouterKey}`,
|
|
738
|
+
"Content-Type": "application/json"
|
|
739
|
+
},
|
|
740
|
+
body: JSON.stringify({
|
|
741
|
+
model,
|
|
742
|
+
messages: formattedMessages,
|
|
743
|
+
max_tokens: maxTokens,
|
|
744
|
+
temperature,
|
|
745
|
+
stream: true,
|
|
746
|
+
stream_options: { include_usage: true }
|
|
747
|
+
}),
|
|
748
|
+
signal: idle.signal
|
|
749
|
+
});
|
|
750
|
+
if (res.ok) {
|
|
751
|
+
const text = await processOpenAISSEStream(res, onChunk, idle);
|
|
752
|
+
if (text && text.trim()) {
|
|
753
|
+
console.log(`[streamRunner] \u2705 Designated fallback 9Router (${model}) succeeded!`);
|
|
754
|
+
return text;
|
|
755
|
+
}
|
|
756
|
+
} else {
|
|
757
|
+
const errText = await res.text().catch(() => "");
|
|
758
|
+
providerErrors[`designated_fallback_9router_${model}`] = `HTTP ${res.status}: ${errText.slice(0, 120)}`;
|
|
759
|
+
}
|
|
760
|
+
} catch (e) {
|
|
761
|
+
providerErrors[`designated_fallback_9router_${model}`] = e?.message || "Network error";
|
|
762
|
+
}
|
|
763
|
+
} else if (provider === "nvidia" && nvidiaKey && isProviderEnabled("nvidia")) {
|
|
682
764
|
try {
|
|
683
765
|
const nvdIdle = options.idleTimeoutMs ?? 18e4;
|
|
684
766
|
const nvdTotal = options.timeoutMs ?? 6e5;
|
|
@@ -835,6 +917,8 @@ async function runCurriculumAIInference(messages, projectContext, options = {},
|
|
|
835
917
|
|
|
836
918
|
// src/ai/provider-factory.ts
|
|
837
919
|
var DEFAULT_MODELS = {
|
|
920
|
+
"9router": "fast-reasoning",
|
|
921
|
+
ninerouter: "fast-reasoning",
|
|
838
922
|
nvidia: "nvidia/nemotron-3-ultra-550b-a55b:free",
|
|
839
923
|
openrouter: "@preset/coding-free",
|
|
840
924
|
alibaba: "qwen3.7-plus",
|
|
@@ -866,6 +950,15 @@ function getAIModel(options = {}) {
|
|
|
866
950
|
console.warn(`[provider-factory] Model "${resolvedModelName}" is not permitted by ALLOWED_AI_MODELS. Using designated model "${designated.model}".`);
|
|
867
951
|
resolvedModelName = designated.model;
|
|
868
952
|
}
|
|
953
|
+
if (provider === "9router" || provider === "ninerouter") {
|
|
954
|
+
const apiKey = options.apiKey || resolveApiKey("NINEROUTER_API_KEY") || resolveApiKey("NINE_ROUTER_API_KEY") || "";
|
|
955
|
+
const rawUrl = options.baseURL || resolveApiKey("NINEROUTER_BASE_URL") || resolveApiKey("NINE_ROUTER_BASE_URL") || "https://ai-router.orchable.app/v1";
|
|
956
|
+
const ninerouter = openai.createOpenAI({
|
|
957
|
+
apiKey,
|
|
958
|
+
baseURL: rawUrl.replace(/^["']|["']$/g, "").trim()
|
|
959
|
+
});
|
|
960
|
+
return ninerouter.chat(resolvedModelName || "fast-reasoning");
|
|
961
|
+
}
|
|
869
962
|
if (provider === "nvidia") {
|
|
870
963
|
const apiKey = options.apiKey || process.env.NVIDIA_API_KEY || "";
|
|
871
964
|
const nvidia = openai.createOpenAI({
|
|
@@ -934,6 +1027,9 @@ function getAIModel(options = {}) {
|
|
|
934
1027
|
return fallback.chat(resolvedModelName);
|
|
935
1028
|
}
|
|
936
1029
|
function detectDefaultProvider() {
|
|
1030
|
+
if ((process.env.NINEROUTER_API_KEY || resolveApiKey("NINEROUTER_API_KEY") || resolveApiKey("NINE_ROUTER_API_KEY")) && isProviderEnabled("9router")) {
|
|
1031
|
+
return "9router";
|
|
1032
|
+
}
|
|
937
1033
|
if (process.env.NVIDIA_API_KEY && isProviderEnabled("nvidia")) {
|
|
938
1034
|
return "nvidia";
|
|
939
1035
|
}
|
|
@@ -5130,6 +5226,7 @@ exports.isModelAllowed = isModelAllowed;
|
|
|
5130
5226
|
exports.isProviderEnabled = isProviderEnabled;
|
|
5131
5227
|
exports.packagerTools = packagerTools;
|
|
5132
5228
|
exports.researcherTools = researcherTools;
|
|
5229
|
+
exports.resolveApiKey = resolveApiKey;
|
|
5133
5230
|
exports.reviewerTools = reviewerTools;
|
|
5134
5231
|
exports.runCurriculumAIInference = runCurriculumAIInference;
|
|
5135
5232
|
exports.streamCurriculumAIInference = streamCurriculumAIInference;
|