@thanh01.pmt/curriculum-kit 1.4.25 → 1.4.27

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.
Files changed (40) hide show
  1. package/LICENSE +21 -0
  2. package/dist/ai/index.cjs +68 -5
  3. package/dist/ai/index.cjs.map +1 -1
  4. package/dist/ai/index.d.cts +4 -4
  5. package/dist/ai/index.d.ts +4 -4
  6. package/dist/ai/index.mjs +68 -6
  7. package/dist/ai/index.mjs.map +1 -1
  8. package/dist/index.cjs +71 -6
  9. package/dist/index.cjs.map +1 -1
  10. package/dist/index.d.cts +5 -5
  11. package/dist/index.d.ts +5 -5
  12. package/dist/index.mjs +71 -7
  13. package/dist/index.mjs.map +1 -1
  14. package/dist/media/index.cjs +52 -4
  15. package/dist/media/index.cjs.map +1 -1
  16. package/dist/media/index.d.cts +1 -1
  17. package/dist/media/index.d.ts +1 -1
  18. package/dist/media/index.mjs +52 -4
  19. package/dist/media/index.mjs.map +1 -1
  20. package/dist/{milestoneBundleGenerator-CzSOeAzU.d.cts → milestoneBundleGenerator-CN6F1zPs.d.cts} +1 -1
  21. package/dist/{milestoneBundleGenerator-Bkba8OPG.d.ts → milestoneBundleGenerator-DTiJ5gIh.d.ts} +1 -1
  22. package/dist/pipeline/index.cjs +23 -4
  23. package/dist/pipeline/index.cjs.map +1 -1
  24. package/dist/pipeline/index.d.cts +3 -3
  25. package/dist/pipeline/index.d.ts +3 -3
  26. package/dist/pipeline/index.mjs +23 -4
  27. package/dist/pipeline/index.mjs.map +1 -1
  28. package/dist/{provider-factory-DxzOVEmh.d.cts → provider-factory-Bv-eIkhg.d.cts} +1 -1
  29. package/dist/{provider-factory-DxzOVEmh.d.ts → provider-factory-Bv-eIkhg.d.ts} +1 -1
  30. package/dist/storage/index.d.cts +2 -2
  31. package/dist/storage/index.d.ts +2 -2
  32. package/dist/{streamRunner-CYESG6IE.d.cts → streamRunner-kpS4MZP1.d.cts} +2 -1
  33. package/dist/{streamRunner-CYESG6IE.d.ts → streamRunner-kpS4MZP1.d.ts} +2 -1
  34. package/dist/workflow/index.cjs +67 -5
  35. package/dist/workflow/index.cjs.map +1 -1
  36. package/dist/workflow/index.d.cts +1 -1
  37. package/dist/workflow/index.d.ts +1 -1
  38. package/dist/workflow/index.mjs +67 -5
  39. package/dist/workflow/index.mjs.map +1 -1
  40. package/package.json +22 -23
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") || "nvidia/nemotron-3-ultra-550b-a55b:free,@preset/coding-free,deepseek/deepseek-chat:free";
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 === "nvidia") {
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: "nvidia", model: "nvidia/nemotron-3-ultra-550b-a55b:free" };
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 || "@preset/coding-free";
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",
@@ -904,6 +953,15 @@ function getAIModel(options = {}) {
904
953
  console.warn(`[provider-factory] Model "${resolvedModelName}" is not permitted by ALLOWED_AI_MODELS. Using designated model "${designated.model}".`);
905
954
  resolvedModelName = designated.model;
906
955
  }
956
+ if (provider === "9router" || provider === "ninerouter") {
957
+ const apiKey = options.apiKey || resolveApiKey("NINEROUTER_API_KEY") || resolveApiKey("NINE_ROUTER_API_KEY") || "";
958
+ const rawUrl = options.baseURL || resolveApiKey("NINEROUTER_BASE_URL") || resolveApiKey("NINE_ROUTER_BASE_URL") || "https://ai-router.orchable.app/v1";
959
+ const ninerouter = openai.createOpenAI({
960
+ apiKey,
961
+ baseURL: rawUrl.replace(/^["']|["']$/g, "").trim()
962
+ });
963
+ return ninerouter.chat(resolvedModelName || "fast-reasoning");
964
+ }
907
965
  if (provider === "nvidia") {
908
966
  const apiKey = options.apiKey || process.env.NVIDIA_API_KEY || "";
909
967
  const nvidia = openai.createOpenAI({
@@ -972,6 +1030,9 @@ function getAIModel(options = {}) {
972
1030
  return fallback.chat(resolvedModelName);
973
1031
  }
974
1032
  function detectDefaultProvider() {
1033
+ if ((process.env.NINEROUTER_API_KEY || resolveApiKey("NINEROUTER_API_KEY") || resolveApiKey("NINE_ROUTER_API_KEY")) && isProviderEnabled("9router")) {
1034
+ return "9router";
1035
+ }
975
1036
  if (process.env.NVIDIA_API_KEY && isProviderEnabled("nvidia")) {
976
1037
  return "nvidia";
977
1038
  }
@@ -997,6 +1058,8 @@ var init_provider_factory = __esm({
997
1058
  "src/ai/provider-factory.ts"() {
998
1059
  init_streamRunner();
999
1060
  DEFAULT_MODELS = {
1061
+ "9router": "fast-reasoning",
1062
+ ninerouter: "fast-reasoning",
1000
1063
  nvidia: "nvidia/nemotron-3-ultra-550b-a55b:free",
1001
1064
  openrouter: "@preset/coding-free",
1002
1065
  alibaba: "qwen3.7-plus",
@@ -12003,7 +12066,8 @@ async function ensureExpositionForLesson(storage, projectId, lessonCode, options
12003
12066
  for (const p of hwPatterns) {
12004
12067
  const m = lpRaw.match(p);
12005
12068
  if (m && m[1] && !hw) {
12006
- hw = m[1].trim().replace(/\*+/g, "").slice(0, 300);
12069
+ const firstSentence = m[1].split(/(?<=[.!?])\s/)[0] || m[1];
12070
+ hw = firstSentence.replace(/\*+/g, "").replace(/\s+/g, " ").trim().slice(0, 140);
12007
12071
  break;
12008
12072
  }
12009
12073
  }
@@ -32455,6 +32519,7 @@ exports.renderFrameworkFromPlan = renderFrameworkFromPlan;
32455
32519
  exports.renderHorizonPromptBlock = renderHorizonPromptBlock;
32456
32520
  exports.renderMediaPlaceholder = renderMediaPlaceholder;
32457
32521
  exports.researcherTools = researcherTools;
32522
+ exports.resolveApiKey = resolveApiKey;
32458
32523
  exports.resolveGateSettings = resolveGateSettings;
32459
32524
  exports.resolveStandardsPacks = resolveStandardsPacks;
32460
32525
  exports.resolveStreamBudget = resolveStreamBudget;