@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.
Files changed (39) hide show
  1. package/dist/ai/index.cjs +103 -6
  2. package/dist/ai/index.cjs.map +1 -1
  3. package/dist/ai/index.d.cts +4 -4
  4. package/dist/ai/index.d.ts +4 -4
  5. package/dist/ai/index.mjs +103 -7
  6. package/dist/ai/index.mjs.map +1 -1
  7. package/dist/index.cjs +104 -6
  8. package/dist/index.cjs.map +1 -1
  9. package/dist/index.d.cts +5 -5
  10. package/dist/index.d.ts +5 -5
  11. package/dist/index.mjs +104 -7
  12. package/dist/index.mjs.map +1 -1
  13. package/dist/media/index.cjs +87 -5
  14. package/dist/media/index.cjs.map +1 -1
  15. package/dist/media/index.d.cts +1 -1
  16. package/dist/media/index.d.ts +1 -1
  17. package/dist/media/index.mjs +87 -5
  18. package/dist/media/index.mjs.map +1 -1
  19. package/dist/{milestoneBundleGenerator-CzSOeAzU.d.cts → milestoneBundleGenerator-CN6F1zPs.d.cts} +1 -1
  20. package/dist/{milestoneBundleGenerator-Bkba8OPG.d.ts → milestoneBundleGenerator-DTiJ5gIh.d.ts} +1 -1
  21. package/dist/pipeline/index.cjs +23 -4
  22. package/dist/pipeline/index.cjs.map +1 -1
  23. package/dist/pipeline/index.d.cts +3 -3
  24. package/dist/pipeline/index.d.ts +3 -3
  25. package/dist/pipeline/index.mjs +23 -4
  26. package/dist/pipeline/index.mjs.map +1 -1
  27. package/dist/{provider-factory-DxzOVEmh.d.cts → provider-factory-Bv-eIkhg.d.cts} +1 -1
  28. package/dist/{provider-factory-DxzOVEmh.d.ts → provider-factory-Bv-eIkhg.d.ts} +1 -1
  29. package/dist/storage/index.d.cts +2 -2
  30. package/dist/storage/index.d.ts +2 -2
  31. package/dist/{streamRunner-CYESG6IE.d.cts → streamRunner-kpS4MZP1.d.cts} +2 -1
  32. package/dist/{streamRunner-CYESG6IE.d.ts → streamRunner-kpS4MZP1.d.ts} +2 -1
  33. package/dist/workflow/index.cjs +102 -6
  34. package/dist/workflow/index.cjs.map +1 -1
  35. package/dist/workflow/index.d.cts +1 -1
  36. package/dist/workflow/index.d.ts +1 -1
  37. package/dist/workflow/index.mjs +102 -6
  38. package/dist/workflow/index.mjs.map +1 -1
  39. 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") || "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",
@@ -729,7 +778,41 @@ Guidelines:
729
778
  );
730
779
  for (const target of fallbackChain) {
731
780
  const { provider, model } = target;
732
- if (provider === "nvidia" && nvidiaKey && isProviderEnabled("nvidia")) {
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;