learngraph 0.2.0 → 0.4.0

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 (76) hide show
  1. package/README.md +82 -1
  2. package/dist/cjs/llm/adapters/anthropic.js +124 -0
  3. package/dist/cjs/llm/adapters/anthropic.js.map +1 -0
  4. package/dist/cjs/llm/adapters/base.js +100 -0
  5. package/dist/cjs/llm/adapters/base.js.map +1 -0
  6. package/dist/cjs/llm/adapters/gemini.js +156 -0
  7. package/dist/cjs/llm/adapters/gemini.js.map +1 -0
  8. package/dist/cjs/llm/adapters/index.js +33 -0
  9. package/dist/cjs/llm/adapters/index.js.map +1 -0
  10. package/dist/cjs/llm/adapters/mediapipe.js +290 -0
  11. package/dist/cjs/llm/adapters/mediapipe.js.map +1 -0
  12. package/dist/cjs/llm/adapters/ollama.js +149 -0
  13. package/dist/cjs/llm/adapters/ollama.js.map +1 -0
  14. package/dist/cjs/llm/adapters/openai.js +126 -0
  15. package/dist/cjs/llm/adapters/openai.js.map +1 -0
  16. package/dist/cjs/llm/adapters/openrouter.js +190 -0
  17. package/dist/cjs/llm/adapters/openrouter.js.map +1 -0
  18. package/dist/cjs/llm/index.js +42 -5
  19. package/dist/cjs/llm/index.js.map +1 -1
  20. package/dist/cjs/llm/orchestrator.js +219 -0
  21. package/dist/cjs/llm/orchestrator.js.map +1 -0
  22. package/dist/cjs/llm/prompts.js +367 -0
  23. package/dist/cjs/llm/prompts.js.map +1 -0
  24. package/dist/cjs/types/llm.js +8 -0
  25. package/dist/cjs/types/llm.js.map +1 -0
  26. package/dist/esm/llm/adapters/anthropic.js +119 -0
  27. package/dist/esm/llm/adapters/anthropic.js.map +1 -0
  28. package/dist/esm/llm/adapters/base.js +95 -0
  29. package/dist/esm/llm/adapters/base.js.map +1 -0
  30. package/dist/esm/llm/adapters/gemini.js +151 -0
  31. package/dist/esm/llm/adapters/gemini.js.map +1 -0
  32. package/dist/esm/llm/adapters/index.js +13 -0
  33. package/dist/esm/llm/adapters/index.js.map +1 -0
  34. package/dist/esm/llm/adapters/mediapipe.js +252 -0
  35. package/dist/esm/llm/adapters/mediapipe.js.map +1 -0
  36. package/dist/esm/llm/adapters/ollama.js +144 -0
  37. package/dist/esm/llm/adapters/ollama.js.map +1 -0
  38. package/dist/esm/llm/adapters/openai.js +121 -0
  39. package/dist/esm/llm/adapters/openai.js.map +1 -0
  40. package/dist/esm/llm/adapters/openrouter.js +185 -0
  41. package/dist/esm/llm/adapters/openrouter.js.map +1 -0
  42. package/dist/esm/llm/index.js +12 -6
  43. package/dist/esm/llm/index.js.map +1 -1
  44. package/dist/esm/llm/orchestrator.js +214 -0
  45. package/dist/esm/llm/orchestrator.js.map +1 -0
  46. package/dist/esm/llm/prompts.js +360 -0
  47. package/dist/esm/llm/prompts.js.map +1 -0
  48. package/dist/esm/types/llm.js +7 -0
  49. package/dist/esm/types/llm.js.map +1 -0
  50. package/dist/types/llm/adapters/anthropic.d.ts +21 -0
  51. package/dist/types/llm/adapters/anthropic.d.ts.map +1 -0
  52. package/dist/types/llm/adapters/base.d.ts +46 -0
  53. package/dist/types/llm/adapters/base.d.ts.map +1 -0
  54. package/dist/types/llm/adapters/gemini.d.ts +30 -0
  55. package/dist/types/llm/adapters/gemini.d.ts.map +1 -0
  56. package/dist/types/llm/adapters/index.d.ts +14 -0
  57. package/dist/types/llm/adapters/index.d.ts.map +1 -0
  58. package/dist/types/llm/adapters/mediapipe.d.ts +113 -0
  59. package/dist/types/llm/adapters/mediapipe.d.ts.map +1 -0
  60. package/dist/types/llm/adapters/ollama.d.ts +30 -0
  61. package/dist/types/llm/adapters/ollama.d.ts.map +1 -0
  62. package/dist/types/llm/adapters/openai.d.ts +22 -0
  63. package/dist/types/llm/adapters/openai.d.ts.map +1 -0
  64. package/dist/types/llm/adapters/openrouter.d.ts +58 -0
  65. package/dist/types/llm/adapters/openrouter.d.ts.map +1 -0
  66. package/dist/types/llm/index.d.ts +5 -0
  67. package/dist/types/llm/index.d.ts.map +1 -1
  68. package/dist/types/llm/orchestrator.d.ts +35 -0
  69. package/dist/types/llm/orchestrator.d.ts.map +1 -0
  70. package/dist/types/llm/prompts.d.ts +269 -0
  71. package/dist/types/llm/prompts.d.ts.map +1 -0
  72. package/dist/types/types/index.d.ts +1 -0
  73. package/dist/types/types/index.d.ts.map +1 -1
  74. package/dist/types/types/llm.d.ts +337 -0
  75. package/dist/types/types/llm.d.ts.map +1 -0
  76. package/package.json +6 -2
@@ -0,0 +1,190 @@
1
+ "use strict";
2
+ /**
3
+ * OpenRouter LLM adapter
4
+ *
5
+ * OpenRouter provides access to many models through a single API:
6
+ * - OpenAI (GPT-4, GPT-3.5)
7
+ * - Anthropic (Claude)
8
+ * - Google (Gemini, PaLM)
9
+ * - Meta (Llama)
10
+ * - Mistral
11
+ * - And many more
12
+ *
13
+ * @packageDocumentation
14
+ */
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ exports.OpenRouterAdapter = exports.OPENROUTER_MODELS = void 0;
17
+ exports.createOpenRouterAdapter = createOpenRouterAdapter;
18
+ const base_js_1 = require("./base.js");
19
+ /**
20
+ * Popular models available on OpenRouter
21
+ */
22
+ exports.OPENROUTER_MODELS = {
23
+ // OpenAI
24
+ 'openai/gpt-4o': 'openai/gpt-4o',
25
+ 'openai/gpt-4-turbo': 'openai/gpt-4-turbo',
26
+ 'openai/gpt-3.5-turbo': 'openai/gpt-3.5-turbo',
27
+ // Anthropic
28
+ 'anthropic/claude-3.5-sonnet': 'anthropic/claude-3.5-sonnet',
29
+ 'anthropic/claude-3-opus': 'anthropic/claude-3-opus',
30
+ 'anthropic/claude-3-haiku': 'anthropic/claude-3-haiku',
31
+ // Google
32
+ 'google/gemini-pro': 'google/gemini-pro',
33
+ 'google/gemini-pro-1.5': 'google/gemini-pro-1.5',
34
+ // Meta
35
+ 'meta-llama/llama-3.1-70b-instruct': 'meta-llama/llama-3.1-70b-instruct',
36
+ 'meta-llama/llama-3.1-8b-instruct': 'meta-llama/llama-3.1-8b-instruct',
37
+ // Mistral
38
+ 'mistralai/mistral-large': 'mistralai/mistral-large',
39
+ 'mistralai/mistral-medium': 'mistralai/mistral-medium',
40
+ 'mistralai/mixtral-8x7b-instruct': 'mistralai/mixtral-8x7b-instruct',
41
+ // DeepSeek
42
+ 'deepseek/deepseek-chat': 'deepseek/deepseek-chat',
43
+ 'deepseek/deepseek-coder': 'deepseek/deepseek-coder',
44
+ // Qwen
45
+ 'qwen/qwen-2.5-72b-instruct': 'qwen/qwen-2.5-72b-instruct',
46
+ };
47
+ /**
48
+ * Adapter for OpenRouter API
49
+ *
50
+ * OpenRouter provides unified access to 100+ models from various providers.
51
+ * See https://openrouter.ai/docs for full documentation.
52
+ */
53
+ class OpenRouterAdapter extends base_js_1.BaseLLMAdapter {
54
+ baseUrl;
55
+ siteUrl;
56
+ appName;
57
+ constructor(config) {
58
+ super(config);
59
+ this.baseUrl = config.baseUrl ?? 'https://openrouter.ai/api/v1';
60
+ if (config.siteUrl) {
61
+ this.siteUrl = config.siteUrl;
62
+ }
63
+ if (config.appName) {
64
+ this.appName = config.appName;
65
+ }
66
+ }
67
+ get provider() {
68
+ return 'openrouter';
69
+ }
70
+ async complete(request) {
71
+ if (!this.isConfigured()) {
72
+ throw new base_js_1.LLMError('OpenRouter adapter is not configured. Set OPENROUTER_API_KEY environment variable.', 'NOT_CONFIGURED', this.provider);
73
+ }
74
+ const openRouterRequest = this.buildRequest(request);
75
+ try {
76
+ const response = await this.executeRequest(openRouterRequest);
77
+ return this.parseResponse(response);
78
+ }
79
+ catch (error) {
80
+ if (error instanceof base_js_1.LLMError) {
81
+ throw error;
82
+ }
83
+ throw new base_js_1.LLMError(`OpenRouter API request failed: ${error instanceof Error ? error.message : 'Unknown error'}`, 'API_ERROR', this.provider, error instanceof Error ? error : undefined);
84
+ }
85
+ }
86
+ buildRequest(request) {
87
+ const openRouterRequest = {
88
+ model: this.config.model,
89
+ messages: request.messages.map((m) => ({
90
+ role: m.role,
91
+ content: m.content,
92
+ })),
93
+ max_tokens: request.maxTokens ?? this.config.maxTokens ?? 4096,
94
+ temperature: request.temperature ?? this.config.temperature ?? 0.3,
95
+ };
96
+ // Handle JSON response format
97
+ if (request.responseFormat === 'json') {
98
+ openRouterRequest.response_format = { type: 'json_object' };
99
+ }
100
+ return openRouterRequest;
101
+ }
102
+ async executeRequest(request) {
103
+ const headers = {
104
+ 'Content-Type': 'application/json',
105
+ Authorization: `Bearer ${this.config.apiKey}`,
106
+ };
107
+ // Add optional OpenRouter-specific headers for rankings
108
+ if (this.siteUrl) {
109
+ headers['HTTP-Referer'] = this.siteUrl;
110
+ }
111
+ if (this.appName) {
112
+ headers['X-Title'] = this.appName;
113
+ }
114
+ const response = await fetch(`${this.baseUrl}/chat/completions`, {
115
+ method: 'POST',
116
+ headers,
117
+ body: JSON.stringify(request),
118
+ signal: AbortSignal.timeout(this.config.timeout ?? 60000),
119
+ });
120
+ if (!response.ok) {
121
+ const errorBody = await response.text();
122
+ let errorMessage = `HTTP ${response.status}`;
123
+ try {
124
+ const errorJson = JSON.parse(errorBody);
125
+ errorMessage = errorJson.error?.message ?? errorMessage;
126
+ }
127
+ catch {
128
+ errorMessage = errorBody || errorMessage;
129
+ }
130
+ if (response.status === 429) {
131
+ throw new base_js_1.LLMError(`Rate limit exceeded: ${errorMessage}`, 'RATE_LIMIT', this.provider);
132
+ }
133
+ if (response.status === 402) {
134
+ throw new base_js_1.LLMError(`Payment required or insufficient credits: ${errorMessage}`, 'API_ERROR', this.provider);
135
+ }
136
+ throw new base_js_1.LLMError(`OpenRouter API error: ${errorMessage}`, 'API_ERROR', this.provider);
137
+ }
138
+ return response.json();
139
+ }
140
+ parseResponse(response) {
141
+ if (!response.choices || response.choices.length === 0) {
142
+ throw new base_js_1.LLMError('No choices in OpenRouter response', 'INVALID_RESPONSE', this.provider);
143
+ }
144
+ const choice = response.choices[0];
145
+ if (!choice) {
146
+ throw new base_js_1.LLMError('No choice in OpenRouter response', 'INVALID_RESPONSE', this.provider);
147
+ }
148
+ const content = choice.message.content;
149
+ // Try to parse JSON if present
150
+ let json;
151
+ try {
152
+ json = this.parseJSON(content);
153
+ }
154
+ catch {
155
+ // Not JSON, that's fine
156
+ }
157
+ // Map finish reasons to our standard format
158
+ const finishReason = choice.finish_reason === 'stop' ? 'stop' :
159
+ choice.finish_reason === 'length' ? 'length' :
160
+ choice.finish_reason === 'content_filter' ? 'content_filter' : 'stop';
161
+ return {
162
+ content,
163
+ json,
164
+ usage: {
165
+ promptTokens: response.usage.prompt_tokens,
166
+ completionTokens: response.usage.completion_tokens,
167
+ totalTokens: response.usage.total_tokens,
168
+ },
169
+ model: response.model,
170
+ finishReason,
171
+ };
172
+ }
173
+ }
174
+ exports.OpenRouterAdapter = OpenRouterAdapter;
175
+ /**
176
+ * Create an OpenRouter adapter from environment variables
177
+ */
178
+ function createOpenRouterAdapter(model = 'anthropic/claude-3.5-sonnet', overrides) {
179
+ const apiKey = typeof process !== 'undefined' ? process.env.OPENROUTER_API_KEY : undefined;
180
+ const config = {
181
+ provider: 'openrouter',
182
+ model,
183
+ ...overrides,
184
+ };
185
+ if (apiKey) {
186
+ config.apiKey = apiKey;
187
+ }
188
+ return new OpenRouterAdapter(config);
189
+ }
190
+ //# sourceMappingURL=openrouter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openrouter.js","sourceRoot":"","sources":["../../../../src/llm/adapters/openrouter.ts"],"names":[],"mappings":"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"}
@@ -4,9 +4,46 @@
4
4
  *
5
5
  * @packageDocumentation
6
6
  */
7
- // LLM integration will be implemented in Phase 4
8
- // export { LLMOrchestrator } from './orchestrator.js';
9
- // export { OpenAIAdapter } from './adapters/openai.js';
10
- // export { AnthropicAdapter } from './adapters/anthropic.js';
11
- // export { OllamaAdapter } from './adapters/ollama.js';
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.buildDecompositionPrompt = exports.buildBloomPrompt = exports.buildPrerequisitePrompt = exports.buildExtractionPrompt = exports.DECOMPOSITION_SCHEMA = exports.BLOOM_ANALYSIS_SCHEMA = exports.PREREQUISITE_SCHEMA = exports.EXTRACTION_SCHEMA = exports.SYSTEM_PROMPTS = exports.createOrchestrator = exports.LLMOrchestrator = exports.MEDIAPIPE_MODELS = exports.createMediaPipeAdapter = exports.MediaPipeAdapter = exports.OPENROUTER_MODELS = exports.createOpenRouterAdapter = exports.OpenRouterAdapter = exports.createGeminiAdapter = exports.GeminiAdapter = exports.createOllamaAdapter = exports.OllamaAdapter = exports.createAnthropicAdapter = exports.AnthropicAdapter = exports.createOpenAIAdapter = exports.OpenAIAdapter = exports.DEFAULT_CONFIG = exports.LLMError = exports.BaseLLMAdapter = void 0;
9
+ // ─────────────────────────────────────────────────────────────────────────────
10
+ // Adapters
11
+ // ─────────────────────────────────────────────────────────────────────────────
12
+ var index_js_1 = require("./adapters/index.js");
13
+ Object.defineProperty(exports, "BaseLLMAdapter", { enumerable: true, get: function () { return index_js_1.BaseLLMAdapter; } });
14
+ Object.defineProperty(exports, "LLMError", { enumerable: true, get: function () { return index_js_1.LLMError; } });
15
+ Object.defineProperty(exports, "DEFAULT_CONFIG", { enumerable: true, get: function () { return index_js_1.DEFAULT_CONFIG; } });
16
+ Object.defineProperty(exports, "OpenAIAdapter", { enumerable: true, get: function () { return index_js_1.OpenAIAdapter; } });
17
+ Object.defineProperty(exports, "createOpenAIAdapter", { enumerable: true, get: function () { return index_js_1.createOpenAIAdapter; } });
18
+ Object.defineProperty(exports, "AnthropicAdapter", { enumerable: true, get: function () { return index_js_1.AnthropicAdapter; } });
19
+ Object.defineProperty(exports, "createAnthropicAdapter", { enumerable: true, get: function () { return index_js_1.createAnthropicAdapter; } });
20
+ Object.defineProperty(exports, "OllamaAdapter", { enumerable: true, get: function () { return index_js_1.OllamaAdapter; } });
21
+ Object.defineProperty(exports, "createOllamaAdapter", { enumerable: true, get: function () { return index_js_1.createOllamaAdapter; } });
22
+ Object.defineProperty(exports, "GeminiAdapter", { enumerable: true, get: function () { return index_js_1.GeminiAdapter; } });
23
+ Object.defineProperty(exports, "createGeminiAdapter", { enumerable: true, get: function () { return index_js_1.createGeminiAdapter; } });
24
+ Object.defineProperty(exports, "OpenRouterAdapter", { enumerable: true, get: function () { return index_js_1.OpenRouterAdapter; } });
25
+ Object.defineProperty(exports, "createOpenRouterAdapter", { enumerable: true, get: function () { return index_js_1.createOpenRouterAdapter; } });
26
+ Object.defineProperty(exports, "OPENROUTER_MODELS", { enumerable: true, get: function () { return index_js_1.OPENROUTER_MODELS; } });
27
+ Object.defineProperty(exports, "MediaPipeAdapter", { enumerable: true, get: function () { return index_js_1.MediaPipeAdapter; } });
28
+ Object.defineProperty(exports, "createMediaPipeAdapter", { enumerable: true, get: function () { return index_js_1.createMediaPipeAdapter; } });
29
+ Object.defineProperty(exports, "MEDIAPIPE_MODELS", { enumerable: true, get: function () { return index_js_1.MEDIAPIPE_MODELS; } });
30
+ // ─────────────────────────────────────────────────────────────────────────────
31
+ // Orchestrator
32
+ // ─────────────────────────────────────────────────────────────────────────────
33
+ var orchestrator_js_1 = require("./orchestrator.js");
34
+ Object.defineProperty(exports, "LLMOrchestrator", { enumerable: true, get: function () { return orchestrator_js_1.LLMOrchestrator; } });
35
+ Object.defineProperty(exports, "createOrchestrator", { enumerable: true, get: function () { return orchestrator_js_1.createOrchestrator; } });
36
+ // ─────────────────────────────────────────────────────────────────────────────
37
+ // Prompts
38
+ // ─────────────────────────────────────────────────────────────────────────────
39
+ var prompts_js_1 = require("./prompts.js");
40
+ Object.defineProperty(exports, "SYSTEM_PROMPTS", { enumerable: true, get: function () { return prompts_js_1.SYSTEM_PROMPTS; } });
41
+ Object.defineProperty(exports, "EXTRACTION_SCHEMA", { enumerable: true, get: function () { return prompts_js_1.EXTRACTION_SCHEMA; } });
42
+ Object.defineProperty(exports, "PREREQUISITE_SCHEMA", { enumerable: true, get: function () { return prompts_js_1.PREREQUISITE_SCHEMA; } });
43
+ Object.defineProperty(exports, "BLOOM_ANALYSIS_SCHEMA", { enumerable: true, get: function () { return prompts_js_1.BLOOM_ANALYSIS_SCHEMA; } });
44
+ Object.defineProperty(exports, "DECOMPOSITION_SCHEMA", { enumerable: true, get: function () { return prompts_js_1.DECOMPOSITION_SCHEMA; } });
45
+ Object.defineProperty(exports, "buildExtractionPrompt", { enumerable: true, get: function () { return prompts_js_1.buildExtractionPrompt; } });
46
+ Object.defineProperty(exports, "buildPrerequisitePrompt", { enumerable: true, get: function () { return prompts_js_1.buildPrerequisitePrompt; } });
47
+ Object.defineProperty(exports, "buildBloomPrompt", { enumerable: true, get: function () { return prompts_js_1.buildBloomPrompt; } });
48
+ Object.defineProperty(exports, "buildDecompositionPrompt", { enumerable: true, get: function () { return prompts_js_1.buildDecompositionPrompt; } });
12
49
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/llm/index.ts"],"names":[],"mappings":";AAAA;;;;GAIG;AAEH,iDAAiD;AACjD,uDAAuD;AACvD,wDAAwD;AACxD,8DAA8D;AAC9D,wDAAwD"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/llm/index.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAgCH,gFAAgF;AAChF,WAAW;AACX,gFAAgF;AAChF,gDAkB6B;AAjB3B,0GAAA,cAAc,OAAA;AACd,oGAAA,QAAQ,OAAA;AACR,0GAAA,cAAc,OAAA;AACd,yGAAA,aAAa,OAAA;AACb,+GAAA,mBAAmB,OAAA;AACnB,4GAAA,gBAAgB,OAAA;AAChB,kHAAA,sBAAsB,OAAA;AACtB,yGAAA,aAAa,OAAA;AACb,+GAAA,mBAAmB,OAAA;AACnB,yGAAA,aAAa,OAAA;AACb,+GAAA,mBAAmB,OAAA;AACnB,6GAAA,iBAAiB,OAAA;AACjB,mHAAA,uBAAuB,OAAA;AACvB,6GAAA,iBAAiB,OAAA;AACjB,4GAAA,gBAAgB,OAAA;AAChB,kHAAA,sBAAsB,OAAA;AACtB,4GAAA,gBAAgB,OAAA;AAIlB,gFAAgF;AAChF,eAAe;AACf,gFAAgF;AAChF,qDAAwE;AAA/D,kHAAA,eAAe,OAAA;AAAE,qHAAA,kBAAkB,OAAA;AAE5C,gFAAgF;AAChF,UAAU;AACV,gFAAgF;AAChF,2CAUsB;AATpB,4GAAA,cAAc,OAAA;AACd,+GAAA,iBAAiB,OAAA;AACjB,iHAAA,mBAAmB,OAAA;AACnB,mHAAA,qBAAqB,OAAA;AACrB,kHAAA,oBAAoB,OAAA;AACpB,mHAAA,qBAAqB,OAAA;AACrB,qHAAA,uBAAuB,OAAA;AACvB,8GAAA,gBAAgB,OAAA;AAChB,sHAAA,wBAAwB,OAAA"}
@@ -0,0 +1,219 @@
1
+ "use strict";
2
+ /**
3
+ * LLM orchestrator for educational tasks
4
+ *
5
+ * @packageDocumentation
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.LLMOrchestrator = void 0;
9
+ exports.createOrchestrator = createOrchestrator;
10
+ const skill_js_1 = require("../types/skill.js");
11
+ const prompts_js_1 = require("./prompts.js");
12
+ /** Default estimated minutes for skill mastery */
13
+ const DEFAULT_ESTIMATED_MINUTES = 30;
14
+ /**
15
+ * Difficulty mapping for Bloom's levels
16
+ */
17
+ const BLOOM_DIFFICULTY = {
18
+ remember: 0.2,
19
+ understand: 0.35,
20
+ apply: 0.5,
21
+ analyze: 0.65,
22
+ evaluate: 0.8,
23
+ create: 0.9,
24
+ };
25
+ /**
26
+ * High-level orchestrator for LLM-based educational tasks
27
+ */
28
+ class LLMOrchestrator {
29
+ adapter;
30
+ constructor(adapter) {
31
+ this.adapter = adapter;
32
+ }
33
+ getAdapter() {
34
+ return this.adapter;
35
+ }
36
+ /**
37
+ * Extract skills from curriculum content
38
+ */
39
+ async extractSkills(request) {
40
+ const startTime = Date.now();
41
+ // Build options object conditionally to avoid undefined values
42
+ const extractionOptions = {};
43
+ if (request.domain)
44
+ extractionOptions.domain = request.domain;
45
+ if (request.gradeLevel)
46
+ extractionOptions.gradeLevel = request.gradeLevel;
47
+ if (request.context)
48
+ extractionOptions.context = request.context;
49
+ const messages = [
50
+ { role: 'system', content: prompts_js_1.SYSTEM_PROMPTS.skillExtraction },
51
+ {
52
+ role: 'user',
53
+ content: (0, prompts_js_1.buildExtractionPrompt)(request.content, extractionOptions),
54
+ },
55
+ ];
56
+ const response = await this.adapter.complete({
57
+ messages,
58
+ responseFormat: 'json',
59
+ jsonSchema: prompts_js_1.EXTRACTION_SCHEMA,
60
+ });
61
+ const parsed = response.json;
62
+ // Apply filters and defaults
63
+ let skills = parsed.skills.map((skill) => ({
64
+ ...skill,
65
+ isThresholdConcept: skill.isThresholdConcept ?? false,
66
+ confidence: skill.confidence ?? 0.8,
67
+ }));
68
+ // Filter by minimum confidence
69
+ if (request.minConfidence) {
70
+ skills = skills.filter((s) => s.confidence >= request.minConfidence);
71
+ }
72
+ // Calculate overall confidence
73
+ const confidence = skills.length > 0 ? skills.reduce((acc, s) => acc + s.confidence, 0) / skills.length : 0;
74
+ return {
75
+ skills,
76
+ confidence,
77
+ usage: response.usage,
78
+ warnings: parsed.warnings ?? [],
79
+ durationMs: Date.now() - startTime,
80
+ };
81
+ }
82
+ /**
83
+ * Infer prerequisites between skills
84
+ */
85
+ async inferPrerequisites(request) {
86
+ const startTime = Date.now();
87
+ // Build options object conditionally to avoid undefined values
88
+ const prerequisiteOptions = {};
89
+ if (request.domain)
90
+ prerequisiteOptions.domain = request.domain;
91
+ if (request.inferTransitive !== undefined)
92
+ prerequisiteOptions.inferTransitive = request.inferTransitive;
93
+ const messages = [
94
+ { role: 'system', content: prompts_js_1.SYSTEM_PROMPTS.prerequisiteInference },
95
+ {
96
+ role: 'user',
97
+ content: (0, prompts_js_1.buildPrerequisitePrompt)(request.skills, prerequisiteOptions),
98
+ },
99
+ ];
100
+ const response = await this.adapter.complete({
101
+ messages,
102
+ responseFormat: 'json',
103
+ jsonSchema: prompts_js_1.PREREQUISITE_SCHEMA,
104
+ });
105
+ const parsed = response.json;
106
+ // Filter by minimum confidence
107
+ let prerequisites = parsed.prerequisites;
108
+ if (request.minConfidence) {
109
+ prerequisites = prerequisites.filter((p) => p.confidence >= request.minConfidence);
110
+ }
111
+ return {
112
+ prerequisites,
113
+ usage: response.usage,
114
+ durationMs: Date.now() - startTime,
115
+ };
116
+ }
117
+ /**
118
+ * Analyze Bloom's level of text
119
+ */
120
+ async analyzeBloomLevel(request) {
121
+ const messages = [
122
+ { role: 'system', content: prompts_js_1.SYSTEM_PROMPTS.bloomAnalysis },
123
+ { role: 'user', content: (0, prompts_js_1.buildBloomPrompt)(request.text, request.context) },
124
+ ];
125
+ const response = await this.adapter.complete({
126
+ messages,
127
+ responseFormat: 'json',
128
+ jsonSchema: prompts_js_1.BLOOM_ANALYSIS_SCHEMA,
129
+ });
130
+ const parsed = response.json;
131
+ return {
132
+ level: parsed.level,
133
+ confidence: parsed.confidence,
134
+ indicators: parsed.indicators,
135
+ reasoning: parsed.reasoning,
136
+ usage: response.usage,
137
+ };
138
+ }
139
+ /**
140
+ * Full curriculum decomposition into skill graph
141
+ */
142
+ async decompose(request) {
143
+ const startTime = Date.now();
144
+ // Build options object conditionally to avoid undefined values
145
+ const decompositionOptions = {};
146
+ if (request.title)
147
+ decompositionOptions.title = request.title;
148
+ if (request.domain)
149
+ decompositionOptions.domain = request.domain;
150
+ if (request.gradeLevel)
151
+ decompositionOptions.gradeLevel = request.gradeLevel;
152
+ if (request.context)
153
+ decompositionOptions.context = request.context;
154
+ if (request.maxDepth !== undefined)
155
+ decompositionOptions.maxDepth = request.maxDepth;
156
+ const messages = [
157
+ { role: 'system', content: prompts_js_1.SYSTEM_PROMPTS.curriculumDecomposition },
158
+ {
159
+ role: 'user',
160
+ content: (0, prompts_js_1.buildDecompositionPrompt)(request.content, decompositionOptions),
161
+ },
162
+ ];
163
+ const response = await this.adapter.complete({
164
+ messages,
165
+ responseFormat: 'json',
166
+ jsonSchema: prompts_js_1.DECOMPOSITION_SCHEMA,
167
+ maxTokens: 8192, // Decomposition can be verbose
168
+ });
169
+ const parsed = response.json;
170
+ // Convert extracted skills to SkillNodeInput format
171
+ const skillInputs = parsed.skills.map((skill) => ({
172
+ name: skill.name,
173
+ description: skill.description,
174
+ bloomLevel: skill.bloomLevel,
175
+ difficulty: skill.difficulty ?? BLOOM_DIFFICULTY[skill.bloomLevel] ?? 0.5,
176
+ isThresholdConcept: skill.isThresholdConcept ?? false,
177
+ masteryThreshold: skill.isThresholdConcept
178
+ ? skill_js_1.THRESHOLD_CONCEPT_MASTERY
179
+ : skill_js_1.SKILL_DEFAULTS.masteryThreshold,
180
+ estimatedMinutes: skill.estimatedMinutes ?? DEFAULT_ESTIMATED_MINUTES,
181
+ tags: skill.keywords ?? [],
182
+ metadata: {
183
+ llmExtracted: true,
184
+ llmId: skill.id,
185
+ confidence: skill.confidence ?? 0.8,
186
+ },
187
+ }));
188
+ // Convert prerequisites with confidence
189
+ const prerequisites = parsed.prerequisites.map((p) => ({
190
+ sourceId: p.sourceId,
191
+ targetId: p.targetId,
192
+ strength: p.strength,
193
+ type: p.type,
194
+ confidence: 0.8, // Default confidence for decomposition
195
+ reasoning: p.reasoning ?? 'Inferred from curriculum structure',
196
+ }));
197
+ return {
198
+ title: parsed.title || request.title || 'Untitled Curriculum',
199
+ skills: parsed.skills.map((s) => ({
200
+ ...s,
201
+ isThresholdConcept: s.isThresholdConcept ?? false,
202
+ confidence: s.confidence ?? 0.8,
203
+ })),
204
+ prerequisites,
205
+ skillInputs,
206
+ usage: response.usage,
207
+ durationMs: Date.now() - startTime,
208
+ warnings: parsed.warnings ?? [],
209
+ };
210
+ }
211
+ }
212
+ exports.LLMOrchestrator = LLMOrchestrator;
213
+ /**
214
+ * Create an orchestrator with a specific adapter
215
+ */
216
+ function createOrchestrator(adapter) {
217
+ return new LLMOrchestrator(adapter);
218
+ }
219
+ //# sourceMappingURL=orchestrator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../../src/llm/orchestrator.ts"],"names":[],"mappings":"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"}