osagent-core 0.1.39 → 0.1.87
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.
- package/dist/src/code_assist/oauth-credential-storage.test.js +1 -1
- package/dist/src/code_assist/oauth-credential-storage.test.js.map +1 -1
- package/dist/src/code_assist/oauth2.test.js +12 -12
- package/dist/src/code_assist/oauth2.test.js.map +1 -1
- package/dist/src/config/config.test.js +3 -3
- package/dist/src/config/config.test.js.map +1 -1
- package/dist/src/config/models.js +2 -1
- package/dist/src/config/models.js.map +1 -1
- package/dist/src/config/storage.test.js +10 -10
- package/dist/src/config/storage.test.js.map +1 -1
- package/dist/src/core/client.test.js +1 -1
- package/dist/src/core/client.test.js.map +1 -1
- package/dist/src/core/contentGenerator.js +127 -28
- package/dist/src/core/contentGenerator.js.map +1 -1
- package/dist/src/core/coreToolScheduler.test.js +1 -1
- package/dist/src/core/coreToolScheduler.test.js.map +1 -1
- package/dist/src/core/logger.test.js +1 -1
- package/dist/src/core/logger.test.js.map +1 -1
- package/dist/src/core/ollamaContentGenerator/index.js +21 -2
- package/dist/src/core/ollamaContentGenerator/index.js.map +1 -1
- package/dist/src/core/openaiContentGenerator/converter.d.ts +27 -1
- package/dist/src/core/openaiContentGenerator/converter.js +105 -4
- package/dist/src/core/openaiContentGenerator/converter.js.map +1 -1
- package/dist/src/core/openaiContentGenerator/errorHandler.d.ts +4 -0
- package/dist/src/core/openaiContentGenerator/errorHandler.js +60 -1
- package/dist/src/core/openaiContentGenerator/errorHandler.js.map +1 -1
- package/dist/src/core/openaiContentGenerator/pipeline.js +48 -1
- package/dist/src/core/openaiContentGenerator/pipeline.js.map +1 -1
- package/dist/src/core/openaiContentGenerator/pipeline.test.js +2 -0
- package/dist/src/core/openaiContentGenerator/pipeline.test.js.map +1 -1
- package/dist/src/core/openaiContentGenerator/provider/dashscope.js +2 -2
- package/dist/src/core/openaiContentGenerator/provider/dashscope.js.map +1 -1
- package/dist/src/core/openaiContentGenerator/provider/dashscope.test.js +6 -6
- package/dist/src/core/openaiContentGenerator/provider/default.test.js +4 -4
- package/dist/src/core/openaiContentGenerator/provider/ollama.d.ts +24 -0
- package/dist/src/core/openaiContentGenerator/provider/ollama.js +105 -1
- package/dist/src/core/openaiContentGenerator/provider/ollama.js.map +1 -1
- package/dist/src/core/openaiContentGenerator/provider/openrouter.js +1 -1
- package/dist/src/core/openaiContentGenerator/provider/openrouter.js.map +1 -1
- package/dist/src/core/openaiContentGenerator/provider/openrouter.test.js +11 -11
- package/dist/src/core/openaiContentGenerator/provider/openrouter.test.js.map +1 -1
- package/dist/src/core/openaiContentGenerator/streamingToolCallParser.js +13 -10
- package/dist/src/core/openaiContentGenerator/streamingToolCallParser.js.map +1 -1
- package/dist/src/core/prompts.test.js +36 -36
- package/dist/src/core/prompts.test.js.map +1 -1
- package/dist/src/core/tokenLimits.js +67 -49
- package/dist/src/core/tokenLimits.js.map +1 -1
- package/dist/src/core/tokenLimits.test.js +66 -65
- package/dist/src/core/tokenLimits.test.js.map +1 -1
- package/dist/src/generated/git-commit.d.ts +2 -2
- package/dist/src/generated/git-commit.js +2 -2
- package/dist/src/ide/ide-client.d.ts +1 -0
- package/dist/src/ide/ide-client.js +17 -6
- package/dist/src/ide/ide-client.js.map +1 -1
- package/dist/src/ide/ide-client.test.js +18 -18
- package/dist/src/ide/ide-client.test.js.map +1 -1
- package/dist/src/ide/ide-installer.js +2 -1
- package/dist/src/ide/ide-installer.js.map +1 -1
- package/dist/src/ide/process-utils.js +13 -4
- package/dist/src/ide/process-utils.js.map +1 -1
- package/dist/src/ide/types.d.ts +44 -44
- package/dist/src/index.d.ts +4 -0
- package/dist/src/index.js +4 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/mcp/google-auth-provider.js +1 -1
- package/dist/src/mcp/google-auth-provider.js.map +1 -1
- package/dist/src/mcp/google-auth-provider.test.js +3 -3
- package/dist/src/mcp/token-storage/file-token-storage.test.js +3 -3
- package/dist/src/mcp/token-storage/file-token-storage.test.js.map +1 -1
- package/dist/src/orchestration/agent-registry.js +8 -1
- package/dist/src/orchestration/agent-registry.js.map +1 -1
- package/dist/src/orchestration/agents.js +40 -147
- package/dist/src/orchestration/agents.js.map +1 -1
- package/dist/src/orchestration/context-manager.js +3 -65
- package/dist/src/orchestration/context-manager.js.map +1 -1
- package/dist/src/orchestration/index.d.ts +4 -0
- package/dist/src/orchestration/index.js +4 -0
- package/dist/src/orchestration/index.js.map +1 -1
- package/dist/src/orchestration/orchestration-queue.d.ts +7 -0
- package/dist/src/orchestration/orchestration-queue.js +11 -0
- package/dist/src/orchestration/orchestration-queue.js.map +1 -1
- package/dist/src/orchestration/orchestrator.d.ts +1 -0
- package/dist/src/orchestration/semanticSkillMatcher.d.ts +75 -0
- package/dist/src/orchestration/semanticSkillMatcher.js +227 -0
- package/dist/src/orchestration/semanticSkillMatcher.js.map +1 -0
- package/dist/src/orchestration/skill-plugins.d.ts +127 -0
- package/dist/src/orchestration/skill-plugins.js +246 -0
- package/dist/src/orchestration/skill-plugins.js.map +1 -0
- package/dist/src/qwen/qwenContentGenerator.test.js +90 -158
- package/dist/src/qwen/qwenContentGenerator.test.js.map +1 -1
- package/dist/src/qwen/qwenOAuth2.test.js +1 -1
- package/dist/src/qwen/qwenOAuth2.test.js.map +1 -1
- package/dist/src/qwen/sharedTokenManager.d.ts +4 -0
- package/dist/src/qwen/sharedTokenManager.js +18 -3
- package/dist/src/qwen/sharedTokenManager.js.map +1 -1
- package/dist/src/services/chatCompressionService.d.ts +2 -1
- package/dist/src/services/chatCompressionService.js +2 -1
- package/dist/src/services/chatCompressionService.js.map +1 -1
- package/dist/src/services/chatCompressionService.test.js +1 -1
- package/dist/src/services/chatRecordingService.test.js +4 -4
- package/dist/src/services/chatRecordingService.test.js.map +1 -1
- package/dist/src/services/embeddings/embeddingService.d.ts +77 -0
- package/dist/src/services/embeddings/embeddingService.js +333 -0
- package/dist/src/services/embeddings/embeddingService.js.map +1 -0
- package/dist/src/services/embeddings/index.d.ts +19 -0
- package/dist/src/services/embeddings/index.js +12 -0
- package/dist/src/services/embeddings/index.js.map +1 -0
- package/dist/src/services/embeddings/ollamaEmbedding.d.ts +39 -0
- package/dist/src/services/embeddings/ollamaEmbedding.js +203 -0
- package/dist/src/services/embeddings/ollamaEmbedding.js.map +1 -0
- package/dist/src/services/embeddings/openRouterEmbedding.d.ts +43 -0
- package/dist/src/services/embeddings/openRouterEmbedding.js +212 -0
- package/dist/src/services/embeddings/openRouterEmbedding.js.map +1 -0
- package/dist/src/services/embeddings/types.d.ts +90 -0
- package/dist/src/services/embeddings/types.js +21 -0
- package/dist/src/services/embeddings/types.js.map +1 -0
- package/dist/src/services/episodicMemory.d.ts +124 -0
- package/dist/src/services/episodicMemory.js +304 -0
- package/dist/src/services/episodicMemory.js.map +1 -0
- package/dist/src/services/gitService.test.js +1 -1
- package/dist/src/services/gitService.test.js.map +1 -1
- package/dist/src/services/loopDetectionService.js +13 -0
- package/dist/src/services/loopDetectionService.js.map +1 -1
- package/dist/src/services/vectorMemory/index.d.ts +20 -0
- package/dist/src/services/vectorMemory/index.js +9 -0
- package/dist/src/services/vectorMemory/index.js.map +1 -0
- package/dist/src/services/vectorMemory/types.d.ts +202 -0
- package/dist/src/services/vectorMemory/types.js +19 -0
- package/dist/src/services/vectorMemory/types.js.map +1 -0
- package/dist/src/services/vectorMemory/vectorMemoryService.d.ts +92 -0
- package/dist/src/services/vectorMemory/vectorMemoryService.js +534 -0
- package/dist/src/services/vectorMemory/vectorMemoryService.js.map +1 -0
- package/dist/src/subagents/hooks-registry.d.ts +58 -0
- package/dist/src/subagents/hooks-registry.js +80 -0
- package/dist/src/subagents/hooks-registry.js.map +1 -0
- package/dist/src/subagents/index.d.ts +6 -2
- package/dist/src/subagents/index.js +6 -1
- package/dist/src/subagents/index.js.map +1 -1
- package/dist/src/subagents/subagent-hooks.d.ts +136 -1
- package/dist/src/subagents/subagent-hooks.js +128 -1
- package/dist/src/subagents/subagent-hooks.js.map +1 -1
- package/dist/src/subagents/subagent-manager.test.js +49 -26
- package/dist/src/subagents/subagent-manager.test.js.map +1 -1
- package/dist/src/tools/mcp-client.js +7 -1
- package/dist/src/tools/mcp-client.js.map +1 -1
- package/dist/src/tools/mcp-client.test.js +12 -12
- package/dist/src/tools/mcp-client.test.js.map +1 -1
- package/dist/src/tools/memoryTool.test.js +28 -28
- package/dist/src/tools/memoryTool.test.js.map +1 -1
- package/dist/src/tools/modifiable-tool.test.js +9 -9
- package/dist/src/tools/modifiable-tool.test.js.map +1 -1
- package/dist/src/tools/shell.d.ts +1 -1
- package/dist/src/tools/shell.js +37 -7
- package/dist/src/tools/shell.js.map +1 -1
- package/dist/src/tools/shell.test.js +28 -6
- package/dist/src/tools/shell.test.js.map +1 -1
- package/dist/src/tools/task.js +5 -1
- package/dist/src/tools/task.js.map +1 -1
- package/dist/src/tools/task.test.js +4 -4
- package/dist/src/tools/task.test.js.map +1 -1
- package/dist/src/tools/todoWrite.js +1 -1
- package/dist/src/tools/todoWrite.test.js +3 -3
- package/dist/src/tools/tool-names.d.ts +1 -1
- package/dist/src/tools/tool-names.js +1 -1
- package/dist/src/utils/bfsFileSearch.test.js +3 -3
- package/dist/src/utils/bfsFileSearch.test.js.map +1 -1
- package/dist/src/utils/errorParsing.test.js +7 -7
- package/dist/src/utils/errorParsing.test.js.map +1 -1
- package/dist/src/utils/filesearch/fileSearch.test.js +1 -1
- package/dist/src/utils/getFolderStructure.test.js +9 -9
- package/dist/src/utils/getFolderStructure.test.js.map +1 -1
- package/dist/src/utils/ignorePatterns.test.js +6 -6
- package/dist/src/utils/ignorePatterns.test.js.map +1 -1
- package/dist/src/utils/installationManager.test.js +1 -1
- package/dist/src/utils/installationManager.test.js.map +1 -1
- package/dist/src/utils/memoryImportProcessor.js +1 -1
- package/dist/src/utils/memoryImportProcessor.js.map +1 -1
- package/dist/src/utils/memoryImportProcessor.test.js +1 -1
- package/dist/src/utils/memoryImportProcessor.test.js.map +1 -1
- package/dist/src/utils/ripgrepUtils.test.js +15 -11
- package/dist/src/utils/ripgrepUtils.test.js.map +1 -1
- package/dist/src/utils/shell-utils.test.js +4 -1
- package/dist/src/utils/shell-utils.test.js.map +1 -1
- package/dist/src/utils/userAccountManager.test.js +1 -1
- package/dist/src/utils/userAccountManager.test.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +7 -4
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 OSAgent OC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { EmbeddingError } from './types.js';
|
|
7
|
+
/**
|
|
8
|
+
* Ollama Embedding Provider
|
|
9
|
+
*
|
|
10
|
+
* Primary embedding provider using local Ollama instance.
|
|
11
|
+
* Uses nomic-embed-text model (768 dimensions) by default.
|
|
12
|
+
*
|
|
13
|
+
* @see https://ollama.com/blog/embedding-models
|
|
14
|
+
*/
|
|
15
|
+
export class OllamaEmbeddingProvider {
|
|
16
|
+
name = 'ollama';
|
|
17
|
+
baseUrl;
|
|
18
|
+
model;
|
|
19
|
+
timeoutMs;
|
|
20
|
+
dimensions;
|
|
21
|
+
constructor(config = {}) {
|
|
22
|
+
// Check OLLAMA_HOST env var for WSL/remote setups
|
|
23
|
+
const ollamaHost = process.env['OLLAMA_HOST'];
|
|
24
|
+
const ollamaBaseUrl = process.env['OLLAMA_BASE_URL'];
|
|
25
|
+
const effectiveUrl = ollamaHost
|
|
26
|
+
? (ollamaHost.startsWith('http') ? ollamaHost : `http://${ollamaHost}`)
|
|
27
|
+
: (ollamaBaseUrl?.replace(/\/v1\/?$/, '') ?? 'http://localhost:11434');
|
|
28
|
+
this.baseUrl = config.baseUrl ?? effectiveUrl.replace(/\/$/, '');
|
|
29
|
+
this.model = config.model ?? 'nomic-embed-text';
|
|
30
|
+
this.timeoutMs = config.timeoutMs ?? 30000;
|
|
31
|
+
// nomic-embed-text produces 768-dimensional embeddings
|
|
32
|
+
this.dimensions = this.model.includes('nomic') ? 768 : 384;
|
|
33
|
+
}
|
|
34
|
+
getDimensions() {
|
|
35
|
+
return this.dimensions;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Check if Ollama is running and the model is available
|
|
39
|
+
*/
|
|
40
|
+
async isAvailable() {
|
|
41
|
+
try {
|
|
42
|
+
// Check if Ollama server is running
|
|
43
|
+
const response = await fetch(`${this.baseUrl}/api/tags`, {
|
|
44
|
+
method: 'GET',
|
|
45
|
+
signal: AbortSignal.timeout(5000),
|
|
46
|
+
});
|
|
47
|
+
if (!response.ok) {
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
// Check if the embedding model is available
|
|
51
|
+
const data = (await response.json());
|
|
52
|
+
const models = data.models ?? [];
|
|
53
|
+
const modelAvailable = models.some((m) => m.name === this.model || m.name.startsWith(`${this.model}:`));
|
|
54
|
+
if (!modelAvailable) {
|
|
55
|
+
console.warn(`[OllamaEmbedding] Model ${this.model} not found. Available: ${models.map((m) => m.name).join(', ')}`);
|
|
56
|
+
console.warn(`[OllamaEmbedding] Pull it with: ollama pull ${this.model}`);
|
|
57
|
+
}
|
|
58
|
+
return modelAvailable;
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Generate embedding for a single text
|
|
66
|
+
*/
|
|
67
|
+
async embed(text) {
|
|
68
|
+
if (!text || text.trim().length === 0) {
|
|
69
|
+
throw new EmbeddingError('Text cannot be empty', 'invalid_input', this.name);
|
|
70
|
+
}
|
|
71
|
+
try {
|
|
72
|
+
const response = await fetch(`${this.baseUrl}/api/embed`, {
|
|
73
|
+
method: 'POST',
|
|
74
|
+
headers: { 'Content-Type': 'application/json' },
|
|
75
|
+
body: JSON.stringify({
|
|
76
|
+
model: this.model,
|
|
77
|
+
input: text,
|
|
78
|
+
}),
|
|
79
|
+
signal: AbortSignal.timeout(this.timeoutMs),
|
|
80
|
+
});
|
|
81
|
+
if (!response.ok) {
|
|
82
|
+
const errorText = await response.text();
|
|
83
|
+
if (response.status === 404) {
|
|
84
|
+
throw new EmbeddingError(`Model ${this.model} not found. Run: ollama pull ${this.model}`, 'model_not_found', this.name);
|
|
85
|
+
}
|
|
86
|
+
throw new EmbeddingError(`Ollama API error: ${response.status} - ${errorText}`, 'unknown', this.name);
|
|
87
|
+
}
|
|
88
|
+
const data = (await response.json());
|
|
89
|
+
if (!data.embeddings || data.embeddings.length === 0) {
|
|
90
|
+
throw new EmbeddingError('No embeddings returned from Ollama', 'unknown', this.name);
|
|
91
|
+
}
|
|
92
|
+
return data.embeddings[0];
|
|
93
|
+
}
|
|
94
|
+
catch (error) {
|
|
95
|
+
if (error instanceof EmbeddingError) {
|
|
96
|
+
throw error;
|
|
97
|
+
}
|
|
98
|
+
if (error instanceof Error) {
|
|
99
|
+
if (error.name === 'TimeoutError' || error.name === 'AbortError') {
|
|
100
|
+
throw new EmbeddingError(`Ollama request timed out after ${this.timeoutMs}ms`, 'timeout', this.name, error);
|
|
101
|
+
}
|
|
102
|
+
if (error.message.includes('ECONNREFUSED') || error.message.includes('fetch failed')) {
|
|
103
|
+
throw new EmbeddingError('Ollama server not running. Start with: ollama serve', 'provider_unavailable', this.name, error);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
throw new EmbeddingError(`Ollama embedding failed: ${error instanceof Error ? error.message : String(error)}`, 'unknown', this.name, error instanceof Error ? error : undefined);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Generate embeddings for multiple texts (batch operation)
|
|
111
|
+
*/
|
|
112
|
+
async embedBatch(texts) {
|
|
113
|
+
if (texts.length === 0) {
|
|
114
|
+
return [];
|
|
115
|
+
}
|
|
116
|
+
// Filter out empty texts
|
|
117
|
+
const validTexts = texts.filter((t) => t && t.trim().length > 0);
|
|
118
|
+
if (validTexts.length === 0) {
|
|
119
|
+
throw new EmbeddingError('All texts are empty', 'invalid_input', this.name);
|
|
120
|
+
}
|
|
121
|
+
try {
|
|
122
|
+
const response = await fetch(`${this.baseUrl}/api/embed`, {
|
|
123
|
+
method: 'POST',
|
|
124
|
+
headers: { 'Content-Type': 'application/json' },
|
|
125
|
+
body: JSON.stringify({
|
|
126
|
+
model: this.model,
|
|
127
|
+
input: validTexts,
|
|
128
|
+
}),
|
|
129
|
+
signal: AbortSignal.timeout(this.timeoutMs * 2), // Longer timeout for batch
|
|
130
|
+
});
|
|
131
|
+
if (!response.ok) {
|
|
132
|
+
const errorText = await response.text();
|
|
133
|
+
throw new EmbeddingError(`Ollama batch API error: ${response.status} - ${errorText}`, 'unknown', this.name);
|
|
134
|
+
}
|
|
135
|
+
const data = (await response.json());
|
|
136
|
+
if (!data.embeddings) {
|
|
137
|
+
throw new EmbeddingError('No embeddings returned from Ollama batch', 'unknown', this.name);
|
|
138
|
+
}
|
|
139
|
+
return data.embeddings;
|
|
140
|
+
}
|
|
141
|
+
catch (error) {
|
|
142
|
+
if (error instanceof EmbeddingError) {
|
|
143
|
+
throw error;
|
|
144
|
+
}
|
|
145
|
+
// Fallback to sequential embedding if batch fails
|
|
146
|
+
console.warn('[OllamaEmbedding] Batch failed, falling back to sequential');
|
|
147
|
+
const results = [];
|
|
148
|
+
for (const text of validTexts) {
|
|
149
|
+
results.push(await this.embed(text));
|
|
150
|
+
}
|
|
151
|
+
return results;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Pull the embedding model if not available
|
|
156
|
+
*/
|
|
157
|
+
async pullModel() {
|
|
158
|
+
try {
|
|
159
|
+
console.log(`[OllamaEmbedding] Pulling model ${this.model}...`);
|
|
160
|
+
const response = await fetch(`${this.baseUrl}/api/pull`, {
|
|
161
|
+
method: 'POST',
|
|
162
|
+
headers: { 'Content-Type': 'application/json' },
|
|
163
|
+
body: JSON.stringify({ name: this.model }),
|
|
164
|
+
signal: AbortSignal.timeout(600000), // 10 minute timeout for model download
|
|
165
|
+
});
|
|
166
|
+
if (!response.ok) {
|
|
167
|
+
console.error(`[OllamaEmbedding] Failed to pull model: ${response.status}`);
|
|
168
|
+
return false;
|
|
169
|
+
}
|
|
170
|
+
// Stream the response to show progress
|
|
171
|
+
const reader = response.body?.getReader();
|
|
172
|
+
if (reader) {
|
|
173
|
+
const decoder = new TextDecoder();
|
|
174
|
+
while (true) {
|
|
175
|
+
const { done, value } = await reader.read();
|
|
176
|
+
if (done)
|
|
177
|
+
break;
|
|
178
|
+
const chunk = decoder.decode(value);
|
|
179
|
+
// Parse NDJSON response
|
|
180
|
+
const lines = chunk.split('\n').filter((l) => l.trim());
|
|
181
|
+
for (const line of lines) {
|
|
182
|
+
try {
|
|
183
|
+
const data = JSON.parse(line);
|
|
184
|
+
if (data.status) {
|
|
185
|
+
console.log(`[OllamaEmbedding] ${data.status}`);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
catch {
|
|
189
|
+
// Ignore parse errors
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
console.log(`[OllamaEmbedding] Model ${this.model} pulled successfully`);
|
|
195
|
+
return true;
|
|
196
|
+
}
|
|
197
|
+
catch (error) {
|
|
198
|
+
console.error(`[OllamaEmbedding] Failed to pull model: ${error}`);
|
|
199
|
+
return false;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
//# sourceMappingURL=ollamaEmbedding.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ollamaEmbedding.js","sourceRoot":"","sources":["../../../../src/services/embeddings/ollamaEmbedding.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 OSAgent OC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import type { EmbeddingProvider, OpenRouterEmbeddingConfig } from './types.js';
|
|
7
|
+
/**
|
|
8
|
+
* OpenRouter Embedding Provider
|
|
9
|
+
*
|
|
10
|
+
* Fallback embedding provider using OpenRouter API.
|
|
11
|
+
* Uses text-embedding-3-small model (1536 dimensions) by default.
|
|
12
|
+
*
|
|
13
|
+
* @see https://openrouter.ai/docs/api/reference/embeddings
|
|
14
|
+
*/
|
|
15
|
+
export declare class OpenRouterEmbeddingProvider implements EmbeddingProvider {
|
|
16
|
+
readonly name = "openrouter";
|
|
17
|
+
private readonly apiKey;
|
|
18
|
+
private readonly baseUrl;
|
|
19
|
+
private readonly model;
|
|
20
|
+
private readonly timeoutMs;
|
|
21
|
+
private readonly dimensions;
|
|
22
|
+
constructor(config: OpenRouterEmbeddingConfig);
|
|
23
|
+
getDimensions(): number;
|
|
24
|
+
/**
|
|
25
|
+
* Check if OpenRouter is available with valid API key
|
|
26
|
+
*/
|
|
27
|
+
isAvailable(): Promise<boolean>;
|
|
28
|
+
/**
|
|
29
|
+
* Generate embedding for a single text
|
|
30
|
+
*/
|
|
31
|
+
embed(text: string): Promise<number[]>;
|
|
32
|
+
/**
|
|
33
|
+
* Generate embeddings for multiple texts (batch operation)
|
|
34
|
+
*/
|
|
35
|
+
embedBatch(texts: string[]): Promise<number[][]>;
|
|
36
|
+
/**
|
|
37
|
+
* Check remaining credits (if supported)
|
|
38
|
+
*/
|
|
39
|
+
getCredits(): Promise<{
|
|
40
|
+
remaining: number;
|
|
41
|
+
limit: number;
|
|
42
|
+
} | null>;
|
|
43
|
+
}
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 OSAgent OC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { EmbeddingError } from './types.js';
|
|
7
|
+
/**
|
|
8
|
+
* OpenRouter Embedding Provider
|
|
9
|
+
*
|
|
10
|
+
* Fallback embedding provider using OpenRouter API.
|
|
11
|
+
* Uses text-embedding-3-small model (1536 dimensions) by default.
|
|
12
|
+
*
|
|
13
|
+
* @see https://openrouter.ai/docs/api/reference/embeddings
|
|
14
|
+
*/
|
|
15
|
+
export class OpenRouterEmbeddingProvider {
|
|
16
|
+
name = 'openrouter';
|
|
17
|
+
apiKey;
|
|
18
|
+
baseUrl;
|
|
19
|
+
model;
|
|
20
|
+
timeoutMs;
|
|
21
|
+
dimensions;
|
|
22
|
+
constructor(config) {
|
|
23
|
+
if (!config.apiKey) {
|
|
24
|
+
throw new Error('OpenRouter API key is required');
|
|
25
|
+
}
|
|
26
|
+
this.apiKey = config.apiKey;
|
|
27
|
+
this.baseUrl = config.baseUrl ?? 'https://openrouter.ai/api/v1';
|
|
28
|
+
this.model = config.model ?? 'openai/text-embedding-3-small';
|
|
29
|
+
this.timeoutMs = config.timeoutMs ?? 30000;
|
|
30
|
+
// Dimensions based on model
|
|
31
|
+
if (this.model.includes('text-embedding-3-large')) {
|
|
32
|
+
this.dimensions = 3072;
|
|
33
|
+
}
|
|
34
|
+
else if (this.model.includes('text-embedding-3-small')) {
|
|
35
|
+
this.dimensions = 1536;
|
|
36
|
+
}
|
|
37
|
+
else if (this.model.includes('text-embedding-ada')) {
|
|
38
|
+
this.dimensions = 1536;
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
this.dimensions = 1536; // Default fallback
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
getDimensions() {
|
|
45
|
+
return this.dimensions;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Check if OpenRouter is available with valid API key
|
|
49
|
+
*/
|
|
50
|
+
async isAvailable() {
|
|
51
|
+
try {
|
|
52
|
+
// Make a minimal request to verify the API key
|
|
53
|
+
const response = await fetch(`${this.baseUrl}/models`, {
|
|
54
|
+
method: 'GET',
|
|
55
|
+
headers: {
|
|
56
|
+
Authorization: `Bearer ${this.apiKey}`,
|
|
57
|
+
'HTTP-Referer': 'https://osagent.dev',
|
|
58
|
+
'X-Title': 'OSAgent',
|
|
59
|
+
},
|
|
60
|
+
signal: AbortSignal.timeout(5000),
|
|
61
|
+
});
|
|
62
|
+
return response.ok;
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Generate embedding for a single text
|
|
70
|
+
*/
|
|
71
|
+
async embed(text) {
|
|
72
|
+
if (!text || text.trim().length === 0) {
|
|
73
|
+
throw new EmbeddingError('Text cannot be empty', 'invalid_input', this.name);
|
|
74
|
+
}
|
|
75
|
+
try {
|
|
76
|
+
const response = await fetch(`${this.baseUrl}/embeddings`, {
|
|
77
|
+
method: 'POST',
|
|
78
|
+
headers: {
|
|
79
|
+
'Content-Type': 'application/json',
|
|
80
|
+
Authorization: `Bearer ${this.apiKey}`,
|
|
81
|
+
'HTTP-Referer': 'https://osagent.dev',
|
|
82
|
+
'X-Title': 'OSAgent',
|
|
83
|
+
},
|
|
84
|
+
body: JSON.stringify({
|
|
85
|
+
model: this.model,
|
|
86
|
+
input: text,
|
|
87
|
+
}),
|
|
88
|
+
signal: AbortSignal.timeout(this.timeoutMs),
|
|
89
|
+
});
|
|
90
|
+
if (!response.ok) {
|
|
91
|
+
const errorData = (await response.json().catch(() => ({})));
|
|
92
|
+
const errorMessage = errorData.error?.message || `HTTP ${response.status}`;
|
|
93
|
+
if (response.status === 401) {
|
|
94
|
+
throw new EmbeddingError('Invalid OpenRouter API key', 'provider_unavailable', this.name);
|
|
95
|
+
}
|
|
96
|
+
if (response.status === 402) {
|
|
97
|
+
throw new EmbeddingError('OpenRouter credits exhausted. Add credits at openrouter.ai', 'rate_limit', this.name);
|
|
98
|
+
}
|
|
99
|
+
if (response.status === 429) {
|
|
100
|
+
throw new EmbeddingError('OpenRouter rate limit exceeded', 'rate_limit', this.name);
|
|
101
|
+
}
|
|
102
|
+
throw new EmbeddingError(`OpenRouter API error: ${errorMessage}`, 'unknown', this.name);
|
|
103
|
+
}
|
|
104
|
+
const data = (await response.json());
|
|
105
|
+
if (!data.data || data.data.length === 0 || !data.data[0].embedding) {
|
|
106
|
+
throw new EmbeddingError('No embeddings returned from OpenRouter', 'unknown', this.name);
|
|
107
|
+
}
|
|
108
|
+
return data.data[0].embedding;
|
|
109
|
+
}
|
|
110
|
+
catch (error) {
|
|
111
|
+
if (error instanceof EmbeddingError) {
|
|
112
|
+
throw error;
|
|
113
|
+
}
|
|
114
|
+
if (error instanceof Error) {
|
|
115
|
+
if (error.name === 'TimeoutError' || error.name === 'AbortError') {
|
|
116
|
+
throw new EmbeddingError(`OpenRouter request timed out after ${this.timeoutMs}ms`, 'timeout', this.name, error);
|
|
117
|
+
}
|
|
118
|
+
if (error.message.includes('fetch failed') || error.message.includes('ENOTFOUND')) {
|
|
119
|
+
throw new EmbeddingError('Cannot reach OpenRouter API. Check your internet connection.', 'network_error', this.name, error);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
throw new EmbeddingError(`OpenRouter embedding failed: ${error instanceof Error ? error.message : String(error)}`, 'unknown', this.name, error instanceof Error ? error : undefined);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Generate embeddings for multiple texts (batch operation)
|
|
127
|
+
*/
|
|
128
|
+
async embedBatch(texts) {
|
|
129
|
+
if (texts.length === 0) {
|
|
130
|
+
return [];
|
|
131
|
+
}
|
|
132
|
+
// Filter out empty texts
|
|
133
|
+
const validTexts = texts.filter((t) => t && t.trim().length > 0);
|
|
134
|
+
if (validTexts.length === 0) {
|
|
135
|
+
throw new EmbeddingError('All texts are empty', 'invalid_input', this.name);
|
|
136
|
+
}
|
|
137
|
+
try {
|
|
138
|
+
const response = await fetch(`${this.baseUrl}/embeddings`, {
|
|
139
|
+
method: 'POST',
|
|
140
|
+
headers: {
|
|
141
|
+
'Content-Type': 'application/json',
|
|
142
|
+
Authorization: `Bearer ${this.apiKey}`,
|
|
143
|
+
'HTTP-Referer': 'https://osagent.dev',
|
|
144
|
+
'X-Title': 'OSAgent',
|
|
145
|
+
},
|
|
146
|
+
body: JSON.stringify({
|
|
147
|
+
model: this.model,
|
|
148
|
+
input: validTexts,
|
|
149
|
+
}),
|
|
150
|
+
signal: AbortSignal.timeout(this.timeoutMs * 2), // Longer timeout for batch
|
|
151
|
+
});
|
|
152
|
+
if (!response.ok) {
|
|
153
|
+
const errorData = (await response.json().catch(() => ({})));
|
|
154
|
+
const errorMessage = errorData.error?.message || `HTTP ${response.status}`;
|
|
155
|
+
throw new EmbeddingError(`OpenRouter batch API error: ${errorMessage}`, 'unknown', this.name);
|
|
156
|
+
}
|
|
157
|
+
const data = (await response.json());
|
|
158
|
+
if (!data.data) {
|
|
159
|
+
throw new EmbeddingError('No embeddings returned from OpenRouter batch', 'unknown', this.name);
|
|
160
|
+
}
|
|
161
|
+
// Sort by index to ensure correct order
|
|
162
|
+
const sorted = data.data.sort((a, b) => (a.index ?? 0) - (b.index ?? 0));
|
|
163
|
+
return sorted.map((item) => {
|
|
164
|
+
if (!item.embedding) {
|
|
165
|
+
throw new EmbeddingError('Missing embedding in OpenRouter batch response', 'unknown', this.name);
|
|
166
|
+
}
|
|
167
|
+
return item.embedding;
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
catch (error) {
|
|
171
|
+
if (error instanceof EmbeddingError) {
|
|
172
|
+
throw error;
|
|
173
|
+
}
|
|
174
|
+
// Fallback to sequential embedding if batch fails
|
|
175
|
+
console.warn('[OpenRouterEmbedding] Batch failed, falling back to sequential');
|
|
176
|
+
const results = [];
|
|
177
|
+
for (const text of validTexts) {
|
|
178
|
+
results.push(await this.embed(text));
|
|
179
|
+
}
|
|
180
|
+
return results;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Check remaining credits (if supported)
|
|
185
|
+
*/
|
|
186
|
+
async getCredits() {
|
|
187
|
+
try {
|
|
188
|
+
const response = await fetch(`${this.baseUrl}/auth/key`, {
|
|
189
|
+
method: 'GET',
|
|
190
|
+
headers: {
|
|
191
|
+
Authorization: `Bearer ${this.apiKey}`,
|
|
192
|
+
},
|
|
193
|
+
signal: AbortSignal.timeout(5000),
|
|
194
|
+
});
|
|
195
|
+
if (!response.ok) {
|
|
196
|
+
return null;
|
|
197
|
+
}
|
|
198
|
+
const data = (await response.json());
|
|
199
|
+
if (data.data) {
|
|
200
|
+
return {
|
|
201
|
+
remaining: (data.data.limit ?? 0) - (data.data.usage ?? 0),
|
|
202
|
+
limit: data.data.limit ?? 0,
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
return null;
|
|
206
|
+
}
|
|
207
|
+
catch {
|
|
208
|
+
return null;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
//# sourceMappingURL=openRouterEmbedding.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openRouterEmbedding.js","sourceRoot":"","sources":["../../../../src/services/embeddings/openRouterEmbedding.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 OSAgent OC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Embedding Provider Interface
|
|
8
|
+
*
|
|
9
|
+
* Defines the contract for embedding providers (Ollama, OpenRouter, etc.)
|
|
10
|
+
* that convert text into vector representations for semantic search.
|
|
11
|
+
*/
|
|
12
|
+
export interface EmbeddingProvider {
|
|
13
|
+
/** Provider name for logging/debugging */
|
|
14
|
+
readonly name: string;
|
|
15
|
+
/** Get embedding dimensions (e.g., 768 for nomic-embed-text, 1536 for OpenAI) */
|
|
16
|
+
getDimensions(): number;
|
|
17
|
+
/** Check if provider is available and configured */
|
|
18
|
+
isAvailable(): Promise<boolean>;
|
|
19
|
+
/** Generate embedding for a single text */
|
|
20
|
+
embed(text: string): Promise<number[]>;
|
|
21
|
+
/** Generate embeddings for multiple texts (batch operation) */
|
|
22
|
+
embedBatch(texts: string[]): Promise<number[][]>;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Embedding result with metadata
|
|
26
|
+
*/
|
|
27
|
+
export interface EmbeddingResult {
|
|
28
|
+
/** The embedding vector */
|
|
29
|
+
embedding: number[];
|
|
30
|
+
/** Provider that generated this embedding */
|
|
31
|
+
provider: string;
|
|
32
|
+
/** Model used for embedding */
|
|
33
|
+
model: string;
|
|
34
|
+
/** Time taken in milliseconds */
|
|
35
|
+
durationMs: number;
|
|
36
|
+
/** Token count if available */
|
|
37
|
+
tokenCount?: number;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Embedding service configuration
|
|
41
|
+
*/
|
|
42
|
+
export interface EmbeddingServiceConfig {
|
|
43
|
+
/** Primary provider (tried first) */
|
|
44
|
+
primaryProvider?: EmbeddingProvider;
|
|
45
|
+
/** Fallback provider (used if primary fails) */
|
|
46
|
+
fallbackProvider?: EmbeddingProvider;
|
|
47
|
+
/** Whether to cache embeddings */
|
|
48
|
+
enableCache?: boolean;
|
|
49
|
+
/** Cache TTL in milliseconds */
|
|
50
|
+
cacheTtlMs?: number;
|
|
51
|
+
/** Maximum batch size for batch operations */
|
|
52
|
+
maxBatchSize?: number;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Ollama embedding configuration
|
|
56
|
+
*/
|
|
57
|
+
export interface OllamaEmbeddingConfig {
|
|
58
|
+
/** Ollama API base URL (default: http://localhost:11434) */
|
|
59
|
+
baseUrl?: string;
|
|
60
|
+
/** Model to use (default: nomic-embed-text) */
|
|
61
|
+
model?: string;
|
|
62
|
+
/** Request timeout in milliseconds */
|
|
63
|
+
timeoutMs?: number;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* OpenRouter embedding configuration
|
|
67
|
+
*/
|
|
68
|
+
export interface OpenRouterEmbeddingConfig {
|
|
69
|
+
/** OpenRouter API key */
|
|
70
|
+
apiKey: string;
|
|
71
|
+
/** API base URL (default: https://openrouter.ai/api/v1) */
|
|
72
|
+
baseUrl?: string;
|
|
73
|
+
/** Model to use (default: text-embedding-3-small) */
|
|
74
|
+
model?: string;
|
|
75
|
+
/** Request timeout in milliseconds */
|
|
76
|
+
timeoutMs?: number;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Embedding error types
|
|
80
|
+
*/
|
|
81
|
+
export type EmbeddingErrorType = 'provider_unavailable' | 'model_not_found' | 'rate_limit' | 'timeout' | 'invalid_input' | 'network_error' | 'unknown';
|
|
82
|
+
/**
|
|
83
|
+
* Custom error for embedding operations
|
|
84
|
+
*/
|
|
85
|
+
export declare class EmbeddingError extends Error {
|
|
86
|
+
readonly type: EmbeddingErrorType;
|
|
87
|
+
readonly provider: string;
|
|
88
|
+
readonly cause?: Error;
|
|
89
|
+
constructor(message: string, type: EmbeddingErrorType, provider: string, cause?: Error);
|
|
90
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 OSAgent OC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Custom error for embedding operations
|
|
8
|
+
*/
|
|
9
|
+
export class EmbeddingError extends Error {
|
|
10
|
+
type;
|
|
11
|
+
provider;
|
|
12
|
+
cause;
|
|
13
|
+
constructor(message, type, provider, cause) {
|
|
14
|
+
super(message);
|
|
15
|
+
this.name = 'EmbeddingError';
|
|
16
|
+
this.type = type;
|
|
17
|
+
this.provider = provider;
|
|
18
|
+
this.cause = cause;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/services/embeddings/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA4GH;;GAEG;AACH,MAAM,OAAO,cAAe,SAAQ,KAAK;IACvB,IAAI,CAAqB;IACzB,QAAQ,CAAS;IACR,KAAK,CAAS;IAEvC,YACE,OAAe,EACf,IAAwB,EACxB,QAAgB,EAChB,KAAa;QAEb,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;QAC7B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;CACF"}
|