learngraph 0.1.1 → 0.3.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 (150) hide show
  1. package/LICENSE +190 -21
  2. package/README.md +165 -3
  3. package/dist/cjs/llm/adapters/anthropic.js +124 -0
  4. package/dist/cjs/llm/adapters/anthropic.js.map +1 -0
  5. package/dist/cjs/llm/adapters/base.js +100 -0
  6. package/dist/cjs/llm/adapters/base.js.map +1 -0
  7. package/dist/cjs/llm/adapters/index.js +22 -0
  8. package/dist/cjs/llm/adapters/index.js.map +1 -0
  9. package/dist/cjs/llm/adapters/ollama.js +149 -0
  10. package/dist/cjs/llm/adapters/ollama.js.map +1 -0
  11. package/dist/cjs/llm/adapters/openai.js +126 -0
  12. package/dist/cjs/llm/adapters/openai.js.map +1 -0
  13. package/dist/cjs/llm/index.js +34 -5
  14. package/dist/cjs/llm/index.js.map +1 -1
  15. package/dist/cjs/llm/orchestrator.js +219 -0
  16. package/dist/cjs/llm/orchestrator.js.map +1 -0
  17. package/dist/cjs/llm/prompts.js +367 -0
  18. package/dist/cjs/llm/prompts.js.map +1 -0
  19. package/dist/cjs/parsers/base.js +189 -0
  20. package/dist/cjs/parsers/base.js.map +1 -0
  21. package/dist/cjs/parsers/demo.js +159 -0
  22. package/dist/cjs/parsers/demo.js.map +1 -0
  23. package/dist/cjs/parsers/extractor.js +191 -0
  24. package/dist/cjs/parsers/extractor.js.map +1 -0
  25. package/dist/cjs/parsers/index.js +43 -4
  26. package/dist/cjs/parsers/index.js.map +1 -1
  27. package/dist/cjs/parsers/json.js +157 -0
  28. package/dist/cjs/parsers/json.js.map +1 -0
  29. package/dist/cjs/parsers/markdown.js +168 -0
  30. package/dist/cjs/parsers/markdown.js.map +1 -0
  31. package/dist/cjs/parsers/samples.js +139 -0
  32. package/dist/cjs/parsers/samples.js.map +1 -0
  33. package/dist/cjs/storage/base.js +231 -0
  34. package/dist/cjs/storage/base.js.map +1 -0
  35. package/dist/cjs/storage/errors.js +128 -0
  36. package/dist/cjs/storage/errors.js.map +1 -0
  37. package/dist/cjs/storage/index.js +92 -5
  38. package/dist/cjs/storage/index.js.map +1 -1
  39. package/dist/cjs/storage/levelgraph.js +855 -0
  40. package/dist/cjs/storage/levelgraph.js.map +1 -0
  41. package/dist/cjs/storage/memory.js +447 -0
  42. package/dist/cjs/storage/memory.js.map +1 -0
  43. package/dist/cjs/storage/neo4j.js +866 -0
  44. package/dist/cjs/storage/neo4j.js.map +1 -0
  45. package/dist/cjs/storage/seeds.js +565 -0
  46. package/dist/cjs/storage/seeds.js.map +1 -0
  47. package/dist/cjs/types/llm.js +8 -0
  48. package/dist/cjs/types/llm.js.map +1 -0
  49. package/dist/cjs/types/parser.js +8 -0
  50. package/dist/cjs/types/parser.js.map +1 -0
  51. package/dist/esm/llm/adapters/anthropic.js +119 -0
  52. package/dist/esm/llm/adapters/anthropic.js.map +1 -0
  53. package/dist/esm/llm/adapters/base.js +95 -0
  54. package/dist/esm/llm/adapters/base.js.map +1 -0
  55. package/dist/esm/llm/adapters/index.js +10 -0
  56. package/dist/esm/llm/adapters/index.js.map +1 -0
  57. package/dist/esm/llm/adapters/ollama.js +144 -0
  58. package/dist/esm/llm/adapters/ollama.js.map +1 -0
  59. package/dist/esm/llm/adapters/openai.js +121 -0
  60. package/dist/esm/llm/adapters/openai.js.map +1 -0
  61. package/dist/esm/llm/index.js +12 -6
  62. package/dist/esm/llm/index.js.map +1 -1
  63. package/dist/esm/llm/orchestrator.js +214 -0
  64. package/dist/esm/llm/orchestrator.js.map +1 -0
  65. package/dist/esm/llm/prompts.js +360 -0
  66. package/dist/esm/llm/prompts.js.map +1 -0
  67. package/dist/esm/parsers/base.js +179 -0
  68. package/dist/esm/parsers/base.js.map +1 -0
  69. package/dist/esm/parsers/demo.js +154 -0
  70. package/dist/esm/parsers/demo.js.map +1 -0
  71. package/dist/esm/parsers/extractor.js +187 -0
  72. package/dist/esm/parsers/extractor.js.map +1 -0
  73. package/dist/esm/parsers/index.js +24 -5
  74. package/dist/esm/parsers/index.js.map +1 -1
  75. package/dist/esm/parsers/json.js +153 -0
  76. package/dist/esm/parsers/json.js.map +1 -0
  77. package/dist/esm/parsers/markdown.js +164 -0
  78. package/dist/esm/parsers/markdown.js.map +1 -0
  79. package/dist/esm/parsers/samples.js +136 -0
  80. package/dist/esm/parsers/samples.js.map +1 -0
  81. package/dist/esm/storage/base.js +221 -0
  82. package/dist/esm/storage/base.js.map +1 -0
  83. package/dist/esm/storage/errors.js +116 -0
  84. package/dist/esm/storage/errors.js.map +1 -0
  85. package/dist/esm/storage/index.js +71 -6
  86. package/dist/esm/storage/index.js.map +1 -1
  87. package/dist/esm/storage/levelgraph.js +818 -0
  88. package/dist/esm/storage/levelgraph.js.map +1 -0
  89. package/dist/esm/storage/memory.js +443 -0
  90. package/dist/esm/storage/memory.js.map +1 -0
  91. package/dist/esm/storage/neo4j.js +829 -0
  92. package/dist/esm/storage/neo4j.js.map +1 -0
  93. package/dist/esm/storage/seeds.js +561 -0
  94. package/dist/esm/storage/seeds.js.map +1 -0
  95. package/dist/esm/types/llm.js +7 -0
  96. package/dist/esm/types/llm.js.map +1 -0
  97. package/dist/esm/types/parser.js +7 -0
  98. package/dist/esm/types/parser.js.map +1 -0
  99. package/dist/types/llm/adapters/anthropic.d.ts +21 -0
  100. package/dist/types/llm/adapters/anthropic.d.ts.map +1 -0
  101. package/dist/types/llm/adapters/base.d.ts +46 -0
  102. package/dist/types/llm/adapters/base.d.ts.map +1 -0
  103. package/dist/types/llm/adapters/index.d.ts +11 -0
  104. package/dist/types/llm/adapters/index.d.ts.map +1 -0
  105. package/dist/types/llm/adapters/ollama.d.ts +30 -0
  106. package/dist/types/llm/adapters/ollama.d.ts.map +1 -0
  107. package/dist/types/llm/adapters/openai.d.ts +22 -0
  108. package/dist/types/llm/adapters/openai.d.ts.map +1 -0
  109. package/dist/types/llm/index.d.ts +5 -0
  110. package/dist/types/llm/index.d.ts.map +1 -1
  111. package/dist/types/llm/orchestrator.d.ts +35 -0
  112. package/dist/types/llm/orchestrator.d.ts.map +1 -0
  113. package/dist/types/llm/prompts.d.ts +269 -0
  114. package/dist/types/llm/prompts.d.ts.map +1 -0
  115. package/dist/types/parsers/base.d.ts +39 -0
  116. package/dist/types/parsers/base.d.ts.map +1 -0
  117. package/dist/types/parsers/demo.d.ts +87 -0
  118. package/dist/types/parsers/demo.d.ts.map +1 -0
  119. package/dist/types/parsers/extractor.d.ts +43 -0
  120. package/dist/types/parsers/extractor.d.ts.map +1 -0
  121. package/dist/types/parsers/index.d.ts +10 -0
  122. package/dist/types/parsers/index.d.ts.map +1 -1
  123. package/dist/types/parsers/json.d.ts +71 -0
  124. package/dist/types/parsers/json.d.ts.map +1 -0
  125. package/dist/types/parsers/markdown.d.ts +43 -0
  126. package/dist/types/parsers/markdown.d.ts.map +1 -0
  127. package/dist/types/parsers/samples.d.ts +27 -0
  128. package/dist/types/parsers/samples.d.ts.map +1 -0
  129. package/dist/types/storage/base.d.ts +39 -0
  130. package/dist/types/storage/base.d.ts.map +1 -0
  131. package/dist/types/storage/errors.d.ts +74 -0
  132. package/dist/types/storage/errors.d.ts.map +1 -0
  133. package/dist/types/storage/index.d.ts +50 -2
  134. package/dist/types/storage/index.d.ts.map +1 -1
  135. package/dist/types/storage/levelgraph.d.ts +92 -0
  136. package/dist/types/storage/levelgraph.d.ts.map +1 -0
  137. package/dist/types/storage/memory.d.ts +70 -0
  138. package/dist/types/storage/memory.d.ts.map +1 -0
  139. package/dist/types/storage/neo4j.d.ts +88 -0
  140. package/dist/types/storage/neo4j.d.ts.map +1 -0
  141. package/dist/types/storage/seeds.d.ts +27 -0
  142. package/dist/types/storage/seeds.d.ts.map +1 -0
  143. package/dist/types/types/index.d.ts +2 -0
  144. package/dist/types/types/index.d.ts.map +1 -1
  145. package/dist/types/types/llm.d.ts +298 -0
  146. package/dist/types/types/llm.d.ts.map +1 -0
  147. package/dist/types/types/parser.d.ts +208 -0
  148. package/dist/types/types/parser.d.ts.map +1 -0
  149. package/package.json +4 -2
  150. package/scripts/postinstall.js +68 -0
@@ -0,0 +1,149 @@
1
+ "use strict";
2
+ /**
3
+ * Ollama adapter for local LLM integration
4
+ *
5
+ * @packageDocumentation
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.OllamaAdapter = void 0;
9
+ exports.createOllamaAdapter = createOllamaAdapter;
10
+ const base_js_1 = require("./base.js");
11
+ /**
12
+ * Ollama adapter for local models
13
+ */
14
+ class OllamaAdapter extends base_js_1.BaseLLMAdapter {
15
+ baseUrl;
16
+ constructor(config) {
17
+ super(config);
18
+ this.baseUrl = config.baseUrl ?? 'http://localhost:11434';
19
+ }
20
+ get provider() {
21
+ return 'ollama';
22
+ }
23
+ isConfigured() {
24
+ return !!this.config.model;
25
+ }
26
+ async complete(request) {
27
+ if (!this.isConfigured()) {
28
+ throw new base_js_1.LLMError('Ollama adapter not configured. Set model in config.', 'NOT_CONFIGURED', this.provider);
29
+ }
30
+ return this.withRetry(async () => {
31
+ const body = {
32
+ model: this.config.model,
33
+ messages: request.messages.map((m) => ({
34
+ role: m.role,
35
+ content: m.content,
36
+ })),
37
+ stream: false,
38
+ options: {
39
+ num_predict: request.maxTokens ?? this.config.maxTokens ?? base_js_1.DEFAULT_CONFIG.maxTokens,
40
+ temperature: request.temperature ?? this.config.temperature ?? base_js_1.DEFAULT_CONFIG.temperature,
41
+ },
42
+ };
43
+ // Add JSON format if requested
44
+ if (request.responseFormat === 'json') {
45
+ body.format = 'json';
46
+ }
47
+ const controller = new AbortController();
48
+ // Ollama can be slow, use longer timeout
49
+ const timeout = setTimeout(() => controller.abort(), this.config.timeout ?? base_js_1.DEFAULT_CONFIG.timeout * 2);
50
+ try {
51
+ const response = await fetch(`${this.baseUrl}/api/chat`, {
52
+ method: 'POST',
53
+ headers: {
54
+ 'Content-Type': 'application/json',
55
+ },
56
+ body: JSON.stringify(body),
57
+ signal: controller.signal,
58
+ });
59
+ clearTimeout(timeout);
60
+ if (!response.ok) {
61
+ const errorText = await response.text().catch(() => '');
62
+ throw new base_js_1.LLMError(`Ollama API error: HTTP ${response.status} - ${errorText}`, 'API_ERROR', this.provider);
63
+ }
64
+ const data = (await response.json());
65
+ const content = data.message?.content ?? '';
66
+ let json;
67
+ if (request.responseFormat === 'json') {
68
+ json = this.parseJSON(content);
69
+ }
70
+ // Estimate tokens (Ollama provides eval_count)
71
+ const promptTokens = data.prompt_eval_count ?? Math.ceil(request.messages.reduce((acc, m) => acc + m.content.length, 0) / 4);
72
+ const completionTokens = data.eval_count ?? Math.ceil(content.length / 4);
73
+ return {
74
+ content,
75
+ json,
76
+ usage: {
77
+ promptTokens,
78
+ completionTokens,
79
+ totalTokens: promptTokens + completionTokens,
80
+ },
81
+ model: data.model,
82
+ finishReason: data.done ? 'stop' : 'error',
83
+ };
84
+ }
85
+ catch (error) {
86
+ clearTimeout(timeout);
87
+ if (error instanceof base_js_1.LLMError) {
88
+ throw error;
89
+ }
90
+ if (error instanceof Error) {
91
+ if (error.name === 'AbortError') {
92
+ throw new base_js_1.LLMError('Request timeout', 'TIMEOUT', this.provider, error);
93
+ }
94
+ // Check for connection refused
95
+ if (error.message.includes('ECONNREFUSED') || error.message.includes('fetch failed')) {
96
+ throw new base_js_1.LLMError(`Cannot connect to Ollama at ${this.baseUrl}. Is Ollama running?`, 'NETWORK_ERROR', this.provider, error);
97
+ }
98
+ throw new base_js_1.LLMError(`Network error: ${error.message}`, 'NETWORK_ERROR', this.provider, error);
99
+ }
100
+ throw new base_js_1.LLMError('Unknown error', 'API_ERROR', this.provider);
101
+ }
102
+ });
103
+ }
104
+ /**
105
+ * Check if Ollama is available
106
+ */
107
+ async isAvailable() {
108
+ try {
109
+ const response = await fetch(`${this.baseUrl}/api/tags`, {
110
+ method: 'GET',
111
+ });
112
+ return response.ok;
113
+ }
114
+ catch {
115
+ return false;
116
+ }
117
+ }
118
+ /**
119
+ * List available models
120
+ */
121
+ async listModels() {
122
+ try {
123
+ const response = await fetch(`${this.baseUrl}/api/tags`, {
124
+ method: 'GET',
125
+ });
126
+ if (!response.ok) {
127
+ return [];
128
+ }
129
+ const data = (await response.json());
130
+ return data.models?.map((m) => m.name) ?? [];
131
+ }
132
+ catch {
133
+ return [];
134
+ }
135
+ }
136
+ }
137
+ exports.OllamaAdapter = OllamaAdapter;
138
+ /**
139
+ * Create an Ollama adapter
140
+ */
141
+ function createOllamaAdapter(model = 'llama3.2', overrides) {
142
+ return new OllamaAdapter({
143
+ provider: 'ollama',
144
+ model,
145
+ baseUrl: 'http://localhost:11434',
146
+ ...overrides,
147
+ });
148
+ }
149
+ //# sourceMappingURL=ollama.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ollama.js","sourceRoot":"","sources":["../../../../src/llm/adapters/ollama.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,126 @@
1
+ "use strict";
2
+ /**
3
+ * OpenAI adapter for LLM integration
4
+ *
5
+ * @packageDocumentation
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.OpenAIAdapter = void 0;
9
+ exports.createOpenAIAdapter = createOpenAIAdapter;
10
+ const base_js_1 = require("./base.js");
11
+ /**
12
+ * OpenAI adapter for chat completions
13
+ */
14
+ class OpenAIAdapter extends base_js_1.BaseLLMAdapter {
15
+ baseUrl;
16
+ organization;
17
+ constructor(config) {
18
+ super(config);
19
+ this.baseUrl = config.baseUrl ?? 'https://api.openai.com/v1';
20
+ if (config.organization) {
21
+ this.organization = config.organization;
22
+ }
23
+ }
24
+ get provider() {
25
+ return 'openai';
26
+ }
27
+ async complete(request) {
28
+ if (!this.isConfigured()) {
29
+ throw new base_js_1.LLMError('OpenAI adapter not configured. Set OPENAI_API_KEY or pass apiKey in config.', 'NOT_CONFIGURED', this.provider);
30
+ }
31
+ return this.withRetry(async () => {
32
+ const headers = {
33
+ 'Content-Type': 'application/json',
34
+ Authorization: `Bearer ${this.config.apiKey}`,
35
+ };
36
+ if (this.organization) {
37
+ headers['OpenAI-Organization'] = this.organization;
38
+ }
39
+ const body = {
40
+ model: this.config.model,
41
+ messages: request.messages.map((m) => ({
42
+ role: m.role,
43
+ content: m.content,
44
+ })),
45
+ max_tokens: request.maxTokens ?? this.config.maxTokens ?? base_js_1.DEFAULT_CONFIG.maxTokens,
46
+ temperature: request.temperature ?? this.config.temperature ?? base_js_1.DEFAULT_CONFIG.temperature,
47
+ };
48
+ // Add JSON mode if requested
49
+ if (request.responseFormat === 'json') {
50
+ body.response_format = { type: 'json_object' };
51
+ }
52
+ const controller = new AbortController();
53
+ const timeout = setTimeout(() => controller.abort(), this.config.timeout ?? base_js_1.DEFAULT_CONFIG.timeout);
54
+ try {
55
+ const response = await fetch(`${this.baseUrl}/chat/completions`, {
56
+ method: 'POST',
57
+ headers,
58
+ body: JSON.stringify(body),
59
+ signal: controller.signal,
60
+ });
61
+ clearTimeout(timeout);
62
+ if (!response.ok) {
63
+ const errorData = (await response.json().catch(() => ({})));
64
+ const errorMessage = errorData.error?.message ?? `HTTP ${response.status}`;
65
+ if (response.status === 429) {
66
+ throw new base_js_1.LLMError(`Rate limit exceeded: ${errorMessage}`, 'RATE_LIMIT', this.provider);
67
+ }
68
+ throw new base_js_1.LLMError(`OpenAI API error: ${errorMessage}`, 'API_ERROR', this.provider);
69
+ }
70
+ const data = (await response.json());
71
+ const choice = data.choices[0];
72
+ if (!choice) {
73
+ throw new base_js_1.LLMError('No response from OpenAI', 'INVALID_RESPONSE', this.provider);
74
+ }
75
+ const content = choice.message.content;
76
+ let json;
77
+ if (request.responseFormat === 'json') {
78
+ json = this.parseJSON(content);
79
+ }
80
+ return {
81
+ content,
82
+ json,
83
+ usage: {
84
+ promptTokens: data.usage.prompt_tokens,
85
+ completionTokens: data.usage.completion_tokens,
86
+ totalTokens: data.usage.total_tokens,
87
+ },
88
+ model: data.model,
89
+ finishReason: choice.finish_reason === 'stop' ? 'stop' :
90
+ choice.finish_reason === 'length' ? 'length' :
91
+ choice.finish_reason === 'content_filter' ? 'content_filter' : 'error',
92
+ };
93
+ }
94
+ catch (error) {
95
+ clearTimeout(timeout);
96
+ if (error instanceof base_js_1.LLMError) {
97
+ throw error;
98
+ }
99
+ if (error instanceof Error) {
100
+ if (error.name === 'AbortError') {
101
+ throw new base_js_1.LLMError('Request timeout', 'TIMEOUT', this.provider, error);
102
+ }
103
+ throw new base_js_1.LLMError(`Network error: ${error.message}`, 'NETWORK_ERROR', this.provider, error);
104
+ }
105
+ throw new base_js_1.LLMError('Unknown error', 'API_ERROR', this.provider);
106
+ }
107
+ });
108
+ }
109
+ }
110
+ exports.OpenAIAdapter = OpenAIAdapter;
111
+ /**
112
+ * Create an OpenAI adapter from environment variables
113
+ */
114
+ function createOpenAIAdapter(model = 'gpt-4o', overrides) {
115
+ const apiKey = typeof process !== 'undefined' ? process.env.OPENAI_API_KEY : undefined;
116
+ const config = {
117
+ provider: 'openai',
118
+ model,
119
+ ...overrides,
120
+ };
121
+ if (apiKey) {
122
+ config.apiKey = apiKey;
123
+ }
124
+ return new OpenAIAdapter(config);
125
+ }
126
+ //# sourceMappingURL=openai.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.js","sourceRoot":"","sources":["../../../../src/llm/adapters/openai.ts"],"names":[],"mappings":"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"}
@@ -4,9 +4,38 @@
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.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
+ // ─────────────────────────────────────────────────────────────────────────────
23
+ // Orchestrator
24
+ // ─────────────────────────────────────────────────────────────────────────────
25
+ var orchestrator_js_1 = require("./orchestrator.js");
26
+ Object.defineProperty(exports, "LLMOrchestrator", { enumerable: true, get: function () { return orchestrator_js_1.LLMOrchestrator; } });
27
+ Object.defineProperty(exports, "createOrchestrator", { enumerable: true, get: function () { return orchestrator_js_1.createOrchestrator; } });
28
+ // ─────────────────────────────────────────────────────────────────────────────
29
+ // Prompts
30
+ // ─────────────────────────────────────────────────────────────────────────────
31
+ var prompts_js_1 = require("./prompts.js");
32
+ Object.defineProperty(exports, "SYSTEM_PROMPTS", { enumerable: true, get: function () { return prompts_js_1.SYSTEM_PROMPTS; } });
33
+ Object.defineProperty(exports, "EXTRACTION_SCHEMA", { enumerable: true, get: function () { return prompts_js_1.EXTRACTION_SCHEMA; } });
34
+ Object.defineProperty(exports, "PREREQUISITE_SCHEMA", { enumerable: true, get: function () { return prompts_js_1.PREREQUISITE_SCHEMA; } });
35
+ Object.defineProperty(exports, "BLOOM_ANALYSIS_SCHEMA", { enumerable: true, get: function () { return prompts_js_1.BLOOM_ANALYSIS_SCHEMA; } });
36
+ Object.defineProperty(exports, "DECOMPOSITION_SCHEMA", { enumerable: true, get: function () { return prompts_js_1.DECOMPOSITION_SCHEMA; } });
37
+ Object.defineProperty(exports, "buildExtractionPrompt", { enumerable: true, get: function () { return prompts_js_1.buildExtractionPrompt; } });
38
+ Object.defineProperty(exports, "buildPrerequisitePrompt", { enumerable: true, get: function () { return prompts_js_1.buildPrerequisitePrompt; } });
39
+ Object.defineProperty(exports, "buildBloomPrompt", { enumerable: true, get: function () { return prompts_js_1.buildBloomPrompt; } });
40
+ Object.defineProperty(exports, "buildDecompositionPrompt", { enumerable: true, get: function () { return prompts_js_1.buildDecompositionPrompt; } });
12
41
  //# 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;;;AA6BH,gFAAgF;AAChF,WAAW;AACX,gFAAgF;AAChF,gDAU6B;AAT3B,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;AAIrB,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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"}