@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
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { MilestoneInput, LessonPlan, CurriculumQualityReport, ActivityLab, CodeLab, SelfLab, DiagnosticQuiz, SlideDeck, Handout, Worksheet, TeacherGuide, Extension, ProjectRoadmap } from '../schemas/index.cjs';
|
|
2
|
-
import { M as ModelResolutionOptions } from '../provider-factory-
|
|
2
|
+
import { M as ModelResolutionOptions } from '../provider-factory-Bv-eIkhg.cjs';
|
|
3
3
|
import { G as GitPublishOptions, a as GitPublishResult, S as SupabasePublishOptions, b as SupabasePublishResult } from '../supabasePublisher-C627qXFT.cjs';
|
|
4
4
|
import { S as SingleArtifactRequest, a as SingleArtifactResult } from '../gateSettings-DabOqP6_.cjs';
|
|
5
5
|
export { b as CurriculumArtifactType, C as CurriculumGateMode, D as DEFAULT_GATE_SETTINGS, G as GateSettings, R as ResolvedGateSettings, g as gateModeFor, p as parseGateSettings, r as resolveGateSettings } from '../gateSettings-DabOqP6_.cjs';
|
package/dist/workflow/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { MilestoneInput, LessonPlan, CurriculumQualityReport, ActivityLab, CodeLab, SelfLab, DiagnosticQuiz, SlideDeck, Handout, Worksheet, TeacherGuide, Extension, ProjectRoadmap } from '../schemas/index.js';
|
|
2
|
-
import { M as ModelResolutionOptions } from '../provider-factory-
|
|
2
|
+
import { M as ModelResolutionOptions } from '../provider-factory-Bv-eIkhg.js';
|
|
3
3
|
import { G as GitPublishOptions, a as GitPublishResult, S as SupabasePublishOptions, b as SupabasePublishResult } from '../supabasePublisher-C627qXFT.js';
|
|
4
4
|
import { S as SingleArtifactRequest, a as SingleArtifactResult } from '../gateSettings-DabOqP6_.js';
|
|
5
5
|
export { b as CurriculumArtifactType, C as CurriculumGateMode, D as DEFAULT_GATE_SETTINGS, G as GateSettings, R as ResolvedGateSettings, g as gateModeFor, p as parseGateSettings, r as resolveGateSettings } from '../gateSettings-DabOqP6_.js';
|
package/dist/workflow/index.mjs
CHANGED
|
@@ -195,14 +195,19 @@ function isModelAllowed(model) {
|
|
|
195
195
|
});
|
|
196
196
|
}
|
|
197
197
|
function getDesignatedFallbackChain() {
|
|
198
|
-
const rawProviders = resolveApiKey("FALLBACK_AI_PROVIDER") || resolveApiKey("FALLBACK_AI_PROVIDERS") || resolveApiKey("DEFAULT_AI_PROVIDER") || "nvidia,openrouter";
|
|
199
|
-
const rawModels = resolveApiKey("FALLBACK_AI_MODEL") || resolveApiKey("FALLBACK_AI_MODELS") || resolveApiKey("DEFAULT_AI_MODEL") || "
|
|
198
|
+
const rawProviders = resolveApiKey("FALLBACK_AI_PROVIDER") || resolveApiKey("FALLBACK_AI_PROVIDERS") || resolveApiKey("DEFAULT_AI_PROVIDER") || "9router,nvidia,openrouter";
|
|
199
|
+
const rawModels = resolveApiKey("FALLBACK_AI_MODEL") || resolveApiKey("FALLBACK_AI_MODELS") || resolveApiKey("DEFAULT_AI_MODEL") || "fast-reasoning,deep-reasoning,mid-range,free-tier";
|
|
200
200
|
const providerList = rawProviders.split(",").map((p) => p.trim().toLowerCase()).filter((p) => p.length > 0 && isProviderEnabled(p));
|
|
201
201
|
const modelList = rawModels.split(",").map((m) => m.trim()).filter((m) => m.length > 0 && isModelAllowed(m));
|
|
202
202
|
const chain = [];
|
|
203
203
|
for (const provider of providerList) {
|
|
204
204
|
let providerModels = [];
|
|
205
|
-
if (provider === "
|
|
205
|
+
if (provider === "9router" || provider === "ninerouter") {
|
|
206
|
+
providerModels = modelList.filter((m) => ["fast-reasoning", "deep-reasoning", "mid-range", "free-tier"].includes(m));
|
|
207
|
+
if (providerModels.length === 0) {
|
|
208
|
+
providerModels = ["fast-reasoning", "mid-range", "free-tier"];
|
|
209
|
+
}
|
|
210
|
+
} else if (provider === "nvidia") {
|
|
206
211
|
providerModels = modelList.filter((m) => m.startsWith("nvidia/") || m.startsWith("meta/") || m.startsWith("mistralai/"));
|
|
207
212
|
if (providerModels.length === 0) {
|
|
208
213
|
providerModels = ["nvidia/nemotron-3-ultra-550b-a55b:free", "nvidia/nemotron-3.5-lightning-30b-a3b"];
|
|
@@ -241,7 +246,7 @@ function getDesignatedFallbackChain() {
|
|
|
241
246
|
function getDesignatedFallbackConfig() {
|
|
242
247
|
const chain = getDesignatedFallbackChain();
|
|
243
248
|
if (chain.length > 0) return chain[0];
|
|
244
|
-
return { provider: "
|
|
249
|
+
return { provider: "9router", model: "fast-reasoning" };
|
|
245
250
|
}
|
|
246
251
|
function extractThoughtAndContent(rawText) {
|
|
247
252
|
let text = rawText || "";
|
|
@@ -480,8 +485,51 @@ Guidelines:
|
|
|
480
485
|
}))
|
|
481
486
|
];
|
|
482
487
|
const providerErrors = {};
|
|
483
|
-
const requestedModel = options.model || "
|
|
488
|
+
const requestedModel = options.model || "fast-reasoning";
|
|
484
489
|
const isNvidiaPreferred = requestedModel.startsWith("nvidia/") || Boolean(nvidiaKey && !openrouterKey) && isProviderEnabled("nvidia");
|
|
490
|
+
const ninerouterKey = resolveApiKey("NINEROUTER_API_KEY") || resolveApiKey("NINE_ROUTER_API_KEY");
|
|
491
|
+
if (ninerouterKey && isProviderEnabled("9router")) {
|
|
492
|
+
const rawUrl = resolveApiKey("NINEROUTER_BASE_URL") || resolveApiKey("NINE_ROUTER_BASE_URL") || "https://ai-router.orchable.app/v1";
|
|
493
|
+
const ninerouterBaseUrl = rawUrl.replace(/^["']|["']$/g, "").replace(/\/$/, "");
|
|
494
|
+
const candidateModels = [
|
|
495
|
+
options.model || "fast-reasoning",
|
|
496
|
+
"fast-reasoning",
|
|
497
|
+
"mid-range",
|
|
498
|
+
"free-tier"
|
|
499
|
+
].filter((m) => isModelAllowed(m));
|
|
500
|
+
const unique9RouterModels = Array.from(new Set(candidateModels));
|
|
501
|
+
for (const model of unique9RouterModels) {
|
|
502
|
+
try {
|
|
503
|
+
const idle = createStreamAbortController({ idleMs: 45e3, totalMs: 3e5 });
|
|
504
|
+
const res = await fetch(`${ninerouterBaseUrl}/chat/completions`, {
|
|
505
|
+
method: "POST",
|
|
506
|
+
headers: {
|
|
507
|
+
"Authorization": `Bearer ${ninerouterKey}`,
|
|
508
|
+
"Content-Type": "application/json"
|
|
509
|
+
},
|
|
510
|
+
body: JSON.stringify({
|
|
511
|
+
model,
|
|
512
|
+
messages: formattedMessages,
|
|
513
|
+
max_tokens: maxTokens,
|
|
514
|
+
temperature,
|
|
515
|
+
stream: true,
|
|
516
|
+
stream_options: { include_usage: true }
|
|
517
|
+
}),
|
|
518
|
+
signal: idle.signal
|
|
519
|
+
});
|
|
520
|
+
if (res.ok) {
|
|
521
|
+
const text = await processOpenAISSEStream(res, onChunk, idle);
|
|
522
|
+
if (text && text.trim()) return text;
|
|
523
|
+
} else {
|
|
524
|
+
const errText = await res.text().catch(() => "");
|
|
525
|
+
providerErrors[`9router_${model}`] = `HTTP ${res.status}: ${errText.slice(0, 120)}`;
|
|
526
|
+
}
|
|
527
|
+
} catch (e) {
|
|
528
|
+
providerErrors[`9router_${model}`] = e?.message || "Network error";
|
|
529
|
+
console.warn(`[9Router Stream] Failover for ${model}:`, e?.message || e);
|
|
530
|
+
}
|
|
531
|
+
}
|
|
532
|
+
}
|
|
485
533
|
if (nvidiaKey && isProviderEnabled("nvidia")) {
|
|
486
534
|
const candidateNemotronModels = [
|
|
487
535
|
requestedModel.startsWith("nvidia/") ? requestedModel : "nvidia/nemotron-3-ultra-550b-a55b:free",
|
|
@@ -691,7 +739,41 @@ Guidelines:
|
|
|
691
739
|
);
|
|
692
740
|
for (const target of fallbackChain) {
|
|
693
741
|
const { provider, model } = target;
|
|
694
|
-
if (provider === "
|
|
742
|
+
if ((provider === "9router" || provider === "ninerouter") && ninerouterKey && isProviderEnabled("9router")) {
|
|
743
|
+
try {
|
|
744
|
+
const rawUrl = resolveApiKey("NINEROUTER_BASE_URL") || resolveApiKey("NINE_ROUTER_BASE_URL") || "https://ai-router.orchable.app/v1";
|
|
745
|
+
const fbBaseUrl = rawUrl.replace(/["']/g, "").replace(/\/$/, "");
|
|
746
|
+
const idle = createStreamAbortController({ idleMs: 45e3, totalMs: 3e5 });
|
|
747
|
+
const res = await fetch(`${fbBaseUrl}/chat/completions`, {
|
|
748
|
+
method: "POST",
|
|
749
|
+
headers: {
|
|
750
|
+
"Authorization": `Bearer ${ninerouterKey}`,
|
|
751
|
+
"Content-Type": "application/json"
|
|
752
|
+
},
|
|
753
|
+
body: JSON.stringify({
|
|
754
|
+
model,
|
|
755
|
+
messages: formattedMessages,
|
|
756
|
+
max_tokens: maxTokens,
|
|
757
|
+
temperature,
|
|
758
|
+
stream: true,
|
|
759
|
+
stream_options: { include_usage: true }
|
|
760
|
+
}),
|
|
761
|
+
signal: idle.signal
|
|
762
|
+
});
|
|
763
|
+
if (res.ok) {
|
|
764
|
+
const text = await processOpenAISSEStream(res, onChunk, idle);
|
|
765
|
+
if (text && text.trim()) {
|
|
766
|
+
console.log(`[streamRunner] \u2705 Designated fallback 9Router (${model}) succeeded!`);
|
|
767
|
+
return text;
|
|
768
|
+
}
|
|
769
|
+
} else {
|
|
770
|
+
const errText = await res.text().catch(() => "");
|
|
771
|
+
providerErrors[`designated_fallback_9router_${model}`] = `HTTP ${res.status}: ${errText.slice(0, 120)}`;
|
|
772
|
+
}
|
|
773
|
+
} catch (e) {
|
|
774
|
+
providerErrors[`designated_fallback_9router_${model}`] = e?.message || "Network error";
|
|
775
|
+
}
|
|
776
|
+
} else if (provider === "nvidia" && nvidiaKey && isProviderEnabled("nvidia")) {
|
|
695
777
|
try {
|
|
696
778
|
const nvdIdle = options.idleTimeoutMs ?? 18e4;
|
|
697
779
|
const nvdTotal = options.timeoutMs ?? 6e5;
|
|
@@ -863,6 +945,15 @@ function getAIModel(options = {}) {
|
|
|
863
945
|
console.warn(`[provider-factory] Model "${resolvedModelName}" is not permitted by ALLOWED_AI_MODELS. Using designated model "${designated.model}".`);
|
|
864
946
|
resolvedModelName = designated.model;
|
|
865
947
|
}
|
|
948
|
+
if (provider === "9router" || provider === "ninerouter") {
|
|
949
|
+
const apiKey = options.apiKey || resolveApiKey("NINEROUTER_API_KEY") || resolveApiKey("NINE_ROUTER_API_KEY") || "";
|
|
950
|
+
const rawUrl = options.baseURL || resolveApiKey("NINEROUTER_BASE_URL") || resolveApiKey("NINE_ROUTER_BASE_URL") || "https://ai-router.orchable.app/v1";
|
|
951
|
+
const ninerouter = createOpenAI({
|
|
952
|
+
apiKey,
|
|
953
|
+
baseURL: rawUrl.replace(/^["']|["']$/g, "").trim()
|
|
954
|
+
});
|
|
955
|
+
return ninerouter.chat(resolvedModelName || "fast-reasoning");
|
|
956
|
+
}
|
|
866
957
|
if (provider === "nvidia") {
|
|
867
958
|
const apiKey = options.apiKey || process.env.NVIDIA_API_KEY || "";
|
|
868
959
|
const nvidia = createOpenAI({
|
|
@@ -931,6 +1022,9 @@ function getAIModel(options = {}) {
|
|
|
931
1022
|
return fallback.chat(resolvedModelName);
|
|
932
1023
|
}
|
|
933
1024
|
function detectDefaultProvider() {
|
|
1025
|
+
if ((process.env.NINEROUTER_API_KEY || resolveApiKey("NINEROUTER_API_KEY") || resolveApiKey("NINE_ROUTER_API_KEY")) && isProviderEnabled("9router")) {
|
|
1026
|
+
return "9router";
|
|
1027
|
+
}
|
|
934
1028
|
if (process.env.NVIDIA_API_KEY && isProviderEnabled("nvidia")) {
|
|
935
1029
|
return "nvidia";
|
|
936
1030
|
}
|
|
@@ -956,6 +1050,8 @@ var init_provider_factory = __esm({
|
|
|
956
1050
|
"src/ai/provider-factory.ts"() {
|
|
957
1051
|
init_streamRunner();
|
|
958
1052
|
DEFAULT_MODELS = {
|
|
1053
|
+
"9router": "fast-reasoning",
|
|
1054
|
+
ninerouter: "fast-reasoning",
|
|
959
1055
|
nvidia: "nvidia/nemotron-3-ultra-550b-a55b:free",
|
|
960
1056
|
openrouter: "@preset/coding-free",
|
|
961
1057
|
alibaba: "qwen3.7-plus",
|