@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
@@ -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-DxzOVEmh.cjs';
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';
@@ -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-DxzOVEmh.js';
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';
@@ -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") || "nvidia/nemotron-3-ultra-550b-a55b:free,@preset/coding-free,deepseek/deepseek-chat:free";
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 === "nvidia") {
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: "nvidia", model: "nvidia/nemotron-3-ultra-550b-a55b:free" };
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 || "@preset/coding-free";
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 === "nvidia" && nvidiaKey && isProviderEnabled("nvidia")) {
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",