agentic-flow 2.0.0-alpha → 2.0.1-alpha
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/README.md +320 -23
- package/agentic-flow/.claude/agents/base-template-generator.md +229 -3
- package/agentic-flow/.claude/agents/core/coder.md +212 -7
- package/agentic-flow/.claude/agents/core/planner.md +228 -7
- package/agentic-flow/.claude/agents/core/researcher.md +205 -10
- package/agentic-flow/.claude/agents/core/reviewer.md +216 -5
- package/agentic-flow/.claude/agents/core/tester.md +213 -3
- package/agentic-flow/.claude/agents/data/ml/data-ml-model.md +256 -5
- package/agentic-flow/.claude/agents/development/backend/dev-backend-api.md +209 -6
- package/agentic-flow/.claude/agents/documentation/api-docs/docs-api-openapi.md +185 -5
- package/agentic-flow/.claude/agents/github/code-review-swarm.md +307 -468
- package/agentic-flow/.claude/agents/github/issue-tracker.md +270 -13
- package/agentic-flow/.claude/agents/github/pr-manager.md +259 -12
- package/agentic-flow/.claude/agents/github/release-manager.md +253 -15
- package/agentic-flow/.claude/agents/github/workflow-automation.md +277 -9
- package/agentic-flow/.claude/agents/sona/sona-learning-optimizer.md +496 -0
- package/agentic-flow/.claude/agents/sparc/architecture.md +231 -4
- package/agentic-flow/.claude/agents/sparc/pseudocode.md +206 -4
- package/agentic-flow/.claude/agents/sparc/refinement.md +283 -6
- package/agentic-flow/.claude/agents/sparc/specification.md +205 -3
- package/agentic-flow/.claude/agents/swarm/adaptive-coordinator.md +731 -0
- package/agentic-flow/.claude/agents/swarm/hierarchical-coordinator.md +455 -1
- package/agentic-flow/.claude/agents/swarm/mesh-coordinator.md +571 -0
- package/agentic-flow/.claude/agents/templates/sparc-coordinator.md +336 -5
- package/agentic-flow/dist/cli/commands/sona-train.d.ts.map +1 -0
- package/agentic-flow/dist/cli/commands/sona-train.js +295 -0
- package/agentic-flow/dist/cli/commands/sona-train.js.map +1 -0
- package/agentic-flow/dist/cli/commands/sona.d.ts.map +1 -0
- package/agentic-flow/dist/cli/commands/sona.js +290 -0
- package/agentic-flow/dist/cli/commands/sona.js.map +1 -0
- package/agentic-flow/dist/core/agentdb-fast.d.ts.map +1 -0
- package/agentic-flow/dist/core/agentdb-fast.js +299 -0
- package/agentic-flow/dist/core/agentdb-fast.js.map +1 -0
- package/agentic-flow/dist/core/attention-fallbacks.d.ts.map +1 -0
- package/agentic-flow/dist/core/attention-fallbacks.js +321 -0
- package/agentic-flow/dist/core/attention-fallbacks.js.map +1 -0
- package/agentic-flow/dist/core/embedding-service.d.ts.map +1 -0
- package/agentic-flow/dist/core/embedding-service.js +370 -0
- package/agentic-flow/dist/core/embedding-service.js.map +1 -0
- package/agentic-flow/dist/core/gnn-wrapper.d.ts.map +1 -0
- package/agentic-flow/dist/core/gnn-wrapper.js +236 -0
- package/agentic-flow/dist/core/gnn-wrapper.js.map +1 -0
- package/agentic-flow/dist/core/index.d.ts.map +1 -1
- package/agentic-flow/dist/core/index.js +80 -3
- package/agentic-flow/dist/core/index.js.map +1 -1
- package/agentic-flow/dist/mcp/claudeFlowSdkServer.d.ts.map +1 -1
- package/agentic-flow/dist/mcp/claudeFlowSdkServer.js +109 -0
- package/agentic-flow/dist/mcp/claudeFlowSdkServer.js.map +1 -1
- package/agentic-flow/dist/mcp/tools/agent-booster-tools.d.ts.map +1 -0
- package/agentic-flow/dist/mcp/tools/agent-booster-tools.js +262 -0
- package/agentic-flow/dist/mcp/tools/agent-booster-tools.js.map +1 -0
- package/agentic-flow/dist/mcp/tools/sona-tools.d.ts.map +1 -0
- package/agentic-flow/dist/mcp/tools/sona-tools.js +560 -0
- package/agentic-flow/dist/mcp/tools/sona-tools.js.map +1 -0
- package/agentic-flow/dist/optimizations/agent-booster-migration.d.ts.map +1 -0
- package/agentic-flow/dist/optimizations/agent-booster-migration.js +323 -0
- package/agentic-flow/dist/optimizations/agent-booster-migration.js.map +1 -0
- package/agentic-flow/dist/optimizations/configuration-tuning.d.ts.map +1 -0
- package/agentic-flow/dist/optimizations/configuration-tuning.js +422 -0
- package/agentic-flow/dist/optimizations/configuration-tuning.js.map +1 -0
- package/agentic-flow/dist/optimizations/ruvector-backend.d.ts.map +1 -0
- package/agentic-flow/dist/optimizations/ruvector-backend.js +464 -0
- package/agentic-flow/dist/optimizations/ruvector-backend.js.map +1 -0
- package/agentic-flow/dist/services/embedding-service.d.ts.map +1 -0
- package/agentic-flow/dist/services/embedding-service.js +367 -0
- package/agentic-flow/dist/services/embedding-service.js.map +1 -0
- package/agentic-flow/dist/services/sona-agent-training.d.ts.map +1 -0
- package/agentic-flow/dist/services/sona-agent-training.js +382 -0
- package/agentic-flow/dist/services/sona-agent-training.js.map +1 -0
- package/agentic-flow/dist/services/sona-agentdb-integration.d.ts.map +1 -0
- package/agentic-flow/dist/services/sona-agentdb-integration.js +346 -0
- package/agentic-flow/dist/services/sona-agentdb-integration.js.map +1 -0
- package/agentic-flow/dist/services/sona-service.d.ts.map +1 -0
- package/agentic-flow/dist/services/sona-service.js +448 -0
- package/agentic-flow/dist/services/sona-service.js.map +1 -0
- package/agentic-flow/dist/services/sona-types.d.ts.map +1 -0
- package/agentic-flow/dist/services/sona-types.js +59 -0
- package/agentic-flow/dist/services/sona-types.js.map +1 -0
- package/docs/README.md +27 -2
- package/package.json +12 -2
- package/docs/AGENTIC_JUJUTSU_QUICKSTART.md +0 -491
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AgentDB Fast API
|
|
3
|
+
*
|
|
4
|
+
* Provides programmatic access to AgentDB without CLI overhead
|
|
5
|
+
* Eliminates 2.3s overhead from process spawning and transformers.js init
|
|
6
|
+
*/
|
|
7
|
+
import agentdb from 'agentdb';
|
|
8
|
+
import { EventEmitter } from 'events';
|
|
9
|
+
/**
|
|
10
|
+
* Fast AgentDB client that avoids CLI overhead
|
|
11
|
+
*
|
|
12
|
+
* Performance:
|
|
13
|
+
* - CLI: ~2,350ms per operation
|
|
14
|
+
* - Direct API: ~10-50ms per operation
|
|
15
|
+
* - Speedup: ~50-200x faster
|
|
16
|
+
*/
|
|
17
|
+
export class AgentDBFast extends EventEmitter {
|
|
18
|
+
db = null;
|
|
19
|
+
config;
|
|
20
|
+
initialized = false;
|
|
21
|
+
embeddingCache = new Map();
|
|
22
|
+
constructor(config = {}) {
|
|
23
|
+
super();
|
|
24
|
+
this.config = {
|
|
25
|
+
path: config.path || '.agentdb-fast',
|
|
26
|
+
vectorDimensions: config.vectorDimensions || 384,
|
|
27
|
+
enableHNSW: config.enableHNSW !== false,
|
|
28
|
+
hnswM: config.hnswM || 16,
|
|
29
|
+
hnswEfConstruction: config.hnswEfConstruction || 200
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Initialize database connection (lazy)
|
|
34
|
+
*/
|
|
35
|
+
async initialize() {
|
|
36
|
+
if (this.initialized)
|
|
37
|
+
return;
|
|
38
|
+
// Use type assertion for now since agentdb may not have open method yet
|
|
39
|
+
const db = agentdb;
|
|
40
|
+
this.db = db.open ? await db.open({
|
|
41
|
+
path: this.config.path,
|
|
42
|
+
vectorDimensions: this.config.vectorDimensions,
|
|
43
|
+
enableHNSW: this.config.enableHNSW,
|
|
44
|
+
hnswM: this.config.hnswM,
|
|
45
|
+
hnswEfConstruction: this.config.hnswEfConstruction
|
|
46
|
+
}) : new db();
|
|
47
|
+
this.initialized = true;
|
|
48
|
+
this.emit('initialized');
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Store an episode (fast, no CLI overhead)
|
|
52
|
+
*/
|
|
53
|
+
async storeEpisode(episode) {
|
|
54
|
+
await this.initialize();
|
|
55
|
+
// Generate embedding if not provided
|
|
56
|
+
if (!episode.embedding) {
|
|
57
|
+
episode.embedding = await this.getEmbedding(episode.task);
|
|
58
|
+
}
|
|
59
|
+
const episodeId = episode.id || this.generateId('episode');
|
|
60
|
+
await this.db.insert({
|
|
61
|
+
id: episodeId,
|
|
62
|
+
vector: episode.embedding,
|
|
63
|
+
metadata: {
|
|
64
|
+
type: 'episode',
|
|
65
|
+
sessionId: episode.sessionId,
|
|
66
|
+
task: episode.task,
|
|
67
|
+
trajectory: JSON.stringify(episode.trajectory),
|
|
68
|
+
reward: episode.reward,
|
|
69
|
+
quality: episode.quality,
|
|
70
|
+
context: episode.context,
|
|
71
|
+
timestamp: episode.timestamp || Date.now()
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
this.emit('episode:stored', episodeId);
|
|
75
|
+
return episodeId;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Retrieve episodes by task similarity (fast)
|
|
79
|
+
*/
|
|
80
|
+
async retrieveEpisodes(options) {
|
|
81
|
+
await this.initialize();
|
|
82
|
+
const dimensions = this.config.vectorDimensions ?? 384;
|
|
83
|
+
const queryEmbedding = options.task
|
|
84
|
+
? await this.getEmbedding(options.task)
|
|
85
|
+
: Array(dimensions).fill(0);
|
|
86
|
+
const k = options.k || 5;
|
|
87
|
+
// Build filter
|
|
88
|
+
const filter = { type: 'episode' };
|
|
89
|
+
if (options.sessionId)
|
|
90
|
+
filter.sessionId = options.sessionId;
|
|
91
|
+
if (options.minReward !== undefined)
|
|
92
|
+
filter.reward = { $gte: options.minReward };
|
|
93
|
+
if (options.maxReward !== undefined) {
|
|
94
|
+
filter.reward = { ...(filter.reward || {}), $lte: options.maxReward };
|
|
95
|
+
}
|
|
96
|
+
const results = await this.db.search({
|
|
97
|
+
vector: queryEmbedding,
|
|
98
|
+
k,
|
|
99
|
+
filter: Object.keys(filter).length > 1 ? filter : undefined
|
|
100
|
+
});
|
|
101
|
+
return results.map((result) => ({
|
|
102
|
+
id: result.id,
|
|
103
|
+
sessionId: result.metadata.sessionId,
|
|
104
|
+
task: result.metadata.task,
|
|
105
|
+
trajectory: JSON.parse(result.metadata.trajectory || '[]'),
|
|
106
|
+
reward: result.metadata.reward,
|
|
107
|
+
quality: result.metadata.quality,
|
|
108
|
+
embedding: result.vector,
|
|
109
|
+
context: result.metadata.context,
|
|
110
|
+
timestamp: result.metadata.timestamp
|
|
111
|
+
}));
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Store a pattern (for ReasoningBank)
|
|
115
|
+
*/
|
|
116
|
+
async storePattern(pattern) {
|
|
117
|
+
await this.initialize();
|
|
118
|
+
if (!pattern.embedding) {
|
|
119
|
+
pattern.embedding = await this.getEmbedding(`${pattern.input} ${pattern.output}`);
|
|
120
|
+
}
|
|
121
|
+
const patternId = pattern.id || this.generateId('pattern');
|
|
122
|
+
await this.db.insert({
|
|
123
|
+
id: patternId,
|
|
124
|
+
vector: pattern.embedding,
|
|
125
|
+
metadata: {
|
|
126
|
+
type: 'pattern',
|
|
127
|
+
task: pattern.task,
|
|
128
|
+
input: pattern.input,
|
|
129
|
+
output: pattern.output,
|
|
130
|
+
quality: pattern.quality,
|
|
131
|
+
context: pattern.context,
|
|
132
|
+
timestamp: pattern.timestamp || Date.now()
|
|
133
|
+
}
|
|
134
|
+
});
|
|
135
|
+
this.emit('pattern:stored', patternId);
|
|
136
|
+
return patternId;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Search for similar patterns
|
|
140
|
+
*/
|
|
141
|
+
async searchPatterns(query, k = 5, minQuality) {
|
|
142
|
+
await this.initialize();
|
|
143
|
+
const queryEmbedding = await this.getEmbedding(query);
|
|
144
|
+
const filter = { type: 'pattern' };
|
|
145
|
+
if (minQuality !== undefined) {
|
|
146
|
+
filter.quality = { $gte: minQuality };
|
|
147
|
+
}
|
|
148
|
+
const results = await this.db.search({
|
|
149
|
+
vector: queryEmbedding,
|
|
150
|
+
k,
|
|
151
|
+
filter: Object.keys(filter).length > 1 ? filter : undefined
|
|
152
|
+
});
|
|
153
|
+
return results.map((result) => ({
|
|
154
|
+
id: result.id,
|
|
155
|
+
task: result.metadata.task,
|
|
156
|
+
input: result.metadata.input,
|
|
157
|
+
output: result.metadata.output,
|
|
158
|
+
quality: result.metadata.quality,
|
|
159
|
+
embedding: result.vector,
|
|
160
|
+
context: result.metadata.context,
|
|
161
|
+
timestamp: result.metadata.timestamp
|
|
162
|
+
}));
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Get database statistics
|
|
166
|
+
*/
|
|
167
|
+
async getStats() {
|
|
168
|
+
await this.initialize();
|
|
169
|
+
const stats = await this.db.stats();
|
|
170
|
+
// Count by type
|
|
171
|
+
const allResults = await this.db.search({
|
|
172
|
+
vector: Array(this.config.vectorDimensions).fill(0),
|
|
173
|
+
k: 10000 // Get all
|
|
174
|
+
});
|
|
175
|
+
const episodes = allResults.filter((r) => r.metadata.type === 'episode');
|
|
176
|
+
const patterns = allResults.filter((r) => r.metadata.type === 'pattern');
|
|
177
|
+
const avgQuality = patterns.reduce((sum, p) => sum + (p.metadata.quality || 0), 0) /
|
|
178
|
+
(patterns.length || 1);
|
|
179
|
+
return {
|
|
180
|
+
totalVectors: stats.totalVectors || 0,
|
|
181
|
+
totalEpisodes: episodes.length,
|
|
182
|
+
totalPatterns: patterns.length,
|
|
183
|
+
avgQuality
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Close database connection
|
|
188
|
+
*/
|
|
189
|
+
async close() {
|
|
190
|
+
this.removeAllListeners();
|
|
191
|
+
this.embeddingCache.clear();
|
|
192
|
+
if (this.db) {
|
|
193
|
+
await this.db.close();
|
|
194
|
+
this.db = null;
|
|
195
|
+
}
|
|
196
|
+
this.initialized = false;
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Generate embedding for text (with caching)
|
|
200
|
+
*
|
|
201
|
+
* Note: This is a simple mock. In production, replace with:
|
|
202
|
+
* - OpenAI embeddings API
|
|
203
|
+
* - Local transformer model
|
|
204
|
+
* - SentenceTransformers
|
|
205
|
+
*/
|
|
206
|
+
async getEmbedding(text) {
|
|
207
|
+
// Check cache
|
|
208
|
+
if (this.embeddingCache.has(text)) {
|
|
209
|
+
return this.embeddingCache.get(text);
|
|
210
|
+
}
|
|
211
|
+
// Simple hash-based embedding (REPLACE IN PRODUCTION)
|
|
212
|
+
const embedding = this.simpleHashEmbedding(text);
|
|
213
|
+
// Cache it
|
|
214
|
+
this.embeddingCache.set(text, embedding);
|
|
215
|
+
if (this.embeddingCache.size > 1000) {
|
|
216
|
+
// LRU-style cleanup
|
|
217
|
+
const firstKey = this.embeddingCache.keys().next().value;
|
|
218
|
+
if (firstKey) {
|
|
219
|
+
this.embeddingCache.delete(firstKey);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
return embedding;
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Simple hash-based embedding (MOCK - REPLACE IN PRODUCTION)
|
|
226
|
+
*
|
|
227
|
+
* Production alternatives:
|
|
228
|
+
* 1. OpenAI: https://platform.openai.com/docs/guides/embeddings
|
|
229
|
+
* 2. Transformers.js: https://huggingface.co/docs/transformers.js
|
|
230
|
+
* 3. SBERT: https://www.sbert.net/
|
|
231
|
+
*/
|
|
232
|
+
simpleHashEmbedding(text) {
|
|
233
|
+
const embedding = new Array(this.config.vectorDimensions);
|
|
234
|
+
// Seed with text hash
|
|
235
|
+
let hash = 0;
|
|
236
|
+
for (let i = 0; i < text.length; i++) {
|
|
237
|
+
hash = (hash << 5) - hash + text.charCodeAt(i);
|
|
238
|
+
hash = hash & hash;
|
|
239
|
+
}
|
|
240
|
+
// Generate pseudo-random embedding
|
|
241
|
+
for (let i = 0; i < this.config.vectorDimensions; i++) {
|
|
242
|
+
const seed = hash + i * 2654435761;
|
|
243
|
+
const x = Math.sin(seed) * 10000;
|
|
244
|
+
embedding[i] = x - Math.floor(x);
|
|
245
|
+
}
|
|
246
|
+
// Normalize
|
|
247
|
+
const norm = Math.sqrt(embedding.reduce((sum, v) => sum + v * v, 0));
|
|
248
|
+
return embedding.map(v => v / norm);
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Generate unique ID
|
|
252
|
+
*/
|
|
253
|
+
generateId(prefix) {
|
|
254
|
+
return `${prefix}_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Convenience function to create a fast AgentDB client
|
|
259
|
+
*/
|
|
260
|
+
export function createFastAgentDB(config) {
|
|
261
|
+
return new AgentDBFast(config);
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Performance comparison helper
|
|
265
|
+
*/
|
|
266
|
+
export async function benchmarkAgentDB() {
|
|
267
|
+
const client = createFastAgentDB({ path: '.agentdb-benchmark' });
|
|
268
|
+
// API benchmark
|
|
269
|
+
const apiStoreStart = Date.now();
|
|
270
|
+
const episodeId = await client.storeEpisode({
|
|
271
|
+
sessionId: 'test-session',
|
|
272
|
+
task: 'test-task',
|
|
273
|
+
trajectory: ['step1', 'step2'],
|
|
274
|
+
reward: 0.8
|
|
275
|
+
});
|
|
276
|
+
const apiStoreTime = Date.now() - apiStoreStart;
|
|
277
|
+
const apiRetrieveStart = Date.now();
|
|
278
|
+
await client.retrieveEpisodes({ task: 'test-task', k: 5 });
|
|
279
|
+
const apiRetrieveTime = Date.now() - apiRetrieveStart;
|
|
280
|
+
await client.close();
|
|
281
|
+
// CLI times from benchmarks
|
|
282
|
+
const cliStoreTime = 2350;
|
|
283
|
+
const cliRetrieveTime = 2400;
|
|
284
|
+
return {
|
|
285
|
+
cli: {
|
|
286
|
+
store: cliStoreTime,
|
|
287
|
+
retrieve: cliRetrieveTime
|
|
288
|
+
},
|
|
289
|
+
api: {
|
|
290
|
+
store: apiStoreTime,
|
|
291
|
+
retrieve: apiRetrieveTime
|
|
292
|
+
},
|
|
293
|
+
speedup: {
|
|
294
|
+
store: cliStoreTime / apiStoreTime,
|
|
295
|
+
retrieve: cliRetrieveTime / apiRetrieveTime
|
|
296
|
+
}
|
|
297
|
+
};
|
|
298
|
+
}
|
|
299
|
+
//# sourceMappingURL=agentdb-fast.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agentdb-fast.js","sourceRoot":"","sources":["../../src/core/agentdb-fast.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * AgentDB Fast API\n *\n * Provides programmatic access to AgentDB without CLI overhead\n * Eliminates 2.3s overhead from process spawning and transformers.js init\n */\n\nimport agentdb from 'agentdb';\nimport { EventEmitter } from 'events';\n\nexport interface Episode {\n id?: string;\n sessionId: string;\n task: string;\n trajectory: string[];\n reward: number;\n quality?: number;\n embedding?: number[];\n context?: Record<string, any>;\n timestamp?: number;\n}\n\nexport interface EpisodeSearchOptions {\n task?: string;\n minReward?: number;\n maxReward?: number;\n sessionId?: string;\n k?: number;\n filter?: Record<string, any>;\n}\n\nexport interface Pattern {\n id?: string;\n task: string;\n input: string;\n output: string;\n quality: number;\n embedding?: number[];\n context?: Record<string, any>;\n timestamp?: number;\n}\n\n/**\n * Fast AgentDB client that avoids CLI overhead\n *\n * Performance:\n * - CLI: ~2,350ms per operation\n * - Direct API: ~10-50ms per operation\n * - Speedup: ~50-200x faster\n */\nexport class AgentDBFast extends EventEmitter {\n private db: any = null;\n private config: {\n path: string;\n vectorDimensions: number;\n enableHNSW: boolean;\n hnswM?: number;\n hnswEfConstruction?: number;\n };\n private initialized: boolean = false;\n private embeddingCache: Map<string, number[]> = new Map();\n\n constructor(config: {\n path?: string;\n vectorDimensions?: number;\n enableHNSW?: boolean;\n hnswM?: number;\n hnswEfConstruction?: number;\n } = {}) {\n super();\n\n this.config = {\n path: config.path || '.agentdb-fast',\n vectorDimensions: config.vectorDimensions || 384,\n enableHNSW: config.enableHNSW !== false,\n hnswM: config.hnswM || 16,\n hnswEfConstruction: config.hnswEfConstruction || 200\n };\n }\n\n /**\n * Initialize database connection (lazy)\n */\n async initialize(): Promise<void> {\n if (this.initialized) return;\n\n // Use type assertion for now since agentdb may not have open method yet\n const db: any = agentdb;\n this.db = db.open ? await db.open({\n path: this.config.path,\n vectorDimensions: this.config.vectorDimensions,\n enableHNSW: this.config.enableHNSW,\n hnswM: this.config.hnswM,\n hnswEfConstruction: this.config.hnswEfConstruction\n }) : new db();\n\n this.initialized = true;\n this.emit('initialized');\n }\n\n /**\n * Store an episode (fast, no CLI overhead)\n */\n async storeEpisode(episode: Episode): Promise<string> {\n await this.initialize();\n\n // Generate embedding if not provided\n if (!episode.embedding) {\n episode.embedding = await this.getEmbedding(episode.task);\n }\n\n const episodeId = episode.id || this.generateId('episode');\n\n await this.db.insert({\n id: episodeId,\n vector: episode.embedding,\n metadata: {\n type: 'episode',\n sessionId: episode.sessionId,\n task: episode.task,\n trajectory: JSON.stringify(episode.trajectory),\n reward: episode.reward,\n quality: episode.quality,\n context: episode.context,\n timestamp: episode.timestamp || Date.now()\n }\n });\n\n this.emit('episode:stored', episodeId);\n return episodeId;\n }\n\n /**\n * Retrieve episodes by task similarity (fast)\n */\n async retrieveEpisodes(options: EpisodeSearchOptions): Promise<Episode[]> {\n await this.initialize();\n\n const dimensions = this.config.vectorDimensions ?? 384;\n const queryEmbedding = options.task\n ? await this.getEmbedding(options.task)\n : Array(dimensions).fill(0);\n\n const k = options.k || 5;\n\n // Build filter\n const filter: Record<string, any> = { type: 'episode' };\n if (options.sessionId) filter.sessionId = options.sessionId;\n if (options.minReward !== undefined) filter.reward = { $gte: options.minReward };\n if (options.maxReward !== undefined) {\n filter.reward = { ...(filter.reward || {}), $lte: options.maxReward };\n }\n\n const results = await this.db.search({\n vector: queryEmbedding,\n k,\n filter: Object.keys(filter).length > 1 ? filter : undefined\n });\n\n return results.map((result: any) => ({\n id: result.id,\n sessionId: result.metadata.sessionId,\n task: result.metadata.task,\n trajectory: JSON.parse(result.metadata.trajectory || '[]'),\n reward: result.metadata.reward,\n quality: result.metadata.quality,\n embedding: result.vector,\n context: result.metadata.context,\n timestamp: result.metadata.timestamp\n }));\n }\n\n /**\n * Store a pattern (for ReasoningBank)\n */\n async storePattern(pattern: Pattern): Promise<string> {\n await this.initialize();\n\n if (!pattern.embedding) {\n pattern.embedding = await this.getEmbedding(`${pattern.input} ${pattern.output}`);\n }\n\n const patternId = pattern.id || this.generateId('pattern');\n\n await this.db.insert({\n id: patternId,\n vector: pattern.embedding,\n metadata: {\n type: 'pattern',\n task: pattern.task,\n input: pattern.input,\n output: pattern.output,\n quality: pattern.quality,\n context: pattern.context,\n timestamp: pattern.timestamp || Date.now()\n }\n });\n\n this.emit('pattern:stored', patternId);\n return patternId;\n }\n\n /**\n * Search for similar patterns\n */\n async searchPatterns(\n query: string,\n k: number = 5,\n minQuality?: number\n ): Promise<Pattern[]> {\n await this.initialize();\n\n const queryEmbedding = await this.getEmbedding(query);\n\n const filter: Record<string, any> = { type: 'pattern' };\n if (minQuality !== undefined) {\n filter.quality = { $gte: minQuality };\n }\n\n const results = await this.db.search({\n vector: queryEmbedding,\n k,\n filter: Object.keys(filter).length > 1 ? filter : undefined\n });\n\n return results.map((result: any) => ({\n id: result.id,\n task: result.metadata.task,\n input: result.metadata.input,\n output: result.metadata.output,\n quality: result.metadata.quality,\n embedding: result.vector,\n context: result.metadata.context,\n timestamp: result.metadata.timestamp\n }));\n }\n\n /**\n * Get database statistics\n */\n async getStats(): Promise<{\n totalVectors: number;\n totalEpisodes: number;\n totalPatterns: number;\n avgQuality: number;\n }> {\n await this.initialize();\n\n const stats = await this.db.stats();\n\n // Count by type\n const allResults = await this.db.search({\n vector: Array(this.config.vectorDimensions).fill(0),\n k: 10000 // Get all\n });\n\n const episodes = allResults.filter((r: any) => r.metadata.type === 'episode');\n const patterns = allResults.filter((r: any) => r.metadata.type === 'pattern');\n\n const avgQuality =\n patterns.reduce((sum: number, p: any) => sum + (p.metadata.quality || 0), 0) /\n (patterns.length || 1);\n\n return {\n totalVectors: stats.totalVectors || 0,\n totalEpisodes: episodes.length,\n totalPatterns: patterns.length,\n avgQuality\n };\n }\n\n /**\n * Close database connection\n */\n async close(): Promise<void> {\n this.removeAllListeners();\n this.embeddingCache.clear();\n\n if (this.db) {\n await this.db.close();\n this.db = null;\n }\n\n this.initialized = false;\n }\n\n /**\n * Generate embedding for text (with caching)\n *\n * Note: This is a simple mock. In production, replace with:\n * - OpenAI embeddings API\n * - Local transformer model\n * - SentenceTransformers\n */\n private async getEmbedding(text: string): Promise<number[]> {\n // Check cache\n if (this.embeddingCache.has(text)) {\n return this.embeddingCache.get(text)!;\n }\n\n // Simple hash-based embedding (REPLACE IN PRODUCTION)\n const embedding = this.simpleHashEmbedding(text);\n\n // Cache it\n this.embeddingCache.set(text, embedding);\n if (this.embeddingCache.size > 1000) {\n // LRU-style cleanup\n const firstKey = this.embeddingCache.keys().next().value as string | undefined;\n if (firstKey) {\n this.embeddingCache.delete(firstKey);\n }\n }\n\n return embedding;\n }\n\n /**\n * Simple hash-based embedding (MOCK - REPLACE IN PRODUCTION)\n *\n * Production alternatives:\n * 1. OpenAI: https://platform.openai.com/docs/guides/embeddings\n * 2. Transformers.js: https://huggingface.co/docs/transformers.js\n * 3. SBERT: https://www.sbert.net/\n */\n private simpleHashEmbedding(text: string): number[] {\n const embedding = new Array(this.config.vectorDimensions);\n\n // Seed with text hash\n let hash = 0;\n for (let i = 0; i < text.length; i++) {\n hash = (hash << 5) - hash + text.charCodeAt(i);\n hash = hash & hash;\n }\n\n // Generate pseudo-random embedding\n for (let i = 0; i < this.config.vectorDimensions; i++) {\n const seed = hash + i * 2654435761;\n const x = Math.sin(seed) * 10000;\n embedding[i] = x - Math.floor(x);\n }\n\n // Normalize\n const norm = Math.sqrt(embedding.reduce((sum, v) => sum + v * v, 0));\n return embedding.map(v => v / norm);\n }\n\n /**\n * Generate unique ID\n */\n private generateId(prefix: string): string {\n return `${prefix}_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n }\n}\n\n/**\n * Convenience function to create a fast AgentDB client\n */\nexport function createFastAgentDB(config?: {\n path?: string;\n vectorDimensions?: number;\n enableHNSW?: boolean;\n}): AgentDBFast {\n return new AgentDBFast(config);\n}\n\n/**\n * Performance comparison helper\n */\nexport async function benchmarkAgentDB(): Promise<{\n cli: { store: number; retrieve: number };\n api: { store: number; retrieve: number };\n speedup: { store: number; retrieve: number };\n}> {\n const client = createFastAgentDB({ path: '.agentdb-benchmark' });\n\n // API benchmark\n const apiStoreStart = Date.now();\n const episodeId = await client.storeEpisode({\n sessionId: 'test-session',\n task: 'test-task',\n trajectory: ['step1', 'step2'],\n reward: 0.8\n });\n const apiStoreTime = Date.now() - apiStoreStart;\n\n const apiRetrieveStart = Date.now();\n await client.retrieveEpisodes({ task: 'test-task', k: 5 });\n const apiRetrieveTime = Date.now() - apiRetrieveStart;\n\n await client.close();\n\n // CLI times from benchmarks\n const cliStoreTime = 2350;\n const cliRetrieveTime = 2400;\n\n return {\n cli: {\n store: cliStoreTime,\n retrieve: cliRetrieveTime\n },\n api: {\n store: apiStoreTime,\n retrieve: apiRetrieveTime\n },\n speedup: {\n store: cliStoreTime / apiStoreTime,\n retrieve: cliRetrieveTime / apiRetrieveTime\n }\n };\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attention-fallbacks.d.ts","sourceRoot":"","sources":["../../src/core/attention-fallbacks.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,321 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Attention Module Fallbacks
|
|
3
|
+
*
|
|
4
|
+
* Since @ruvector/attention is completely broken, provide JavaScript fallbacks
|
|
5
|
+
* Performance will be slower but functionality will work
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Scaled Dot-Product Attention
|
|
9
|
+
* The core attention mechanism
|
|
10
|
+
*/
|
|
11
|
+
export function scaledDotProductAttention(query, key, value, mask) {
|
|
12
|
+
const dk = query.length;
|
|
13
|
+
// Compute attention scores: Q · K^T / sqrt(dk)
|
|
14
|
+
let score = 0;
|
|
15
|
+
for (let i = 0; i < dk; i++) {
|
|
16
|
+
score += query[i] * key[i];
|
|
17
|
+
}
|
|
18
|
+
score /= Math.sqrt(dk);
|
|
19
|
+
// Apply mask if provided
|
|
20
|
+
if (mask && mask[0] === 0) {
|
|
21
|
+
score = -Infinity;
|
|
22
|
+
}
|
|
23
|
+
// Softmax (single score version)
|
|
24
|
+
const expScore = Math.exp(score);
|
|
25
|
+
const weight = expScore; // Simplified for single K,V pair
|
|
26
|
+
// Weighted value
|
|
27
|
+
const output = value.map(v => v * weight);
|
|
28
|
+
return { output, weights: [weight] };
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Multi-Head Attention (JavaScript fallback)
|
|
32
|
+
*
|
|
33
|
+
* Replaces broken @ruvector/attention.multiHeadAttention
|
|
34
|
+
*/
|
|
35
|
+
export class MultiHeadAttention {
|
|
36
|
+
numHeads;
|
|
37
|
+
hiddenDim;
|
|
38
|
+
headDim;
|
|
39
|
+
queryWeights;
|
|
40
|
+
keyWeights;
|
|
41
|
+
valueWeights;
|
|
42
|
+
outputWeights;
|
|
43
|
+
constructor(config) {
|
|
44
|
+
this.numHeads = config.numHeads || 8;
|
|
45
|
+
this.hiddenDim = config.hiddenDim;
|
|
46
|
+
this.headDim = Math.floor(this.hiddenDim / this.numHeads);
|
|
47
|
+
// Initialize weights (random)
|
|
48
|
+
this.queryWeights = this.initializeWeights();
|
|
49
|
+
this.keyWeights = this.initializeWeights();
|
|
50
|
+
this.valueWeights = this.initializeWeights();
|
|
51
|
+
this.outputWeights = this.initializeOutputWeights();
|
|
52
|
+
}
|
|
53
|
+
initializeWeights() {
|
|
54
|
+
const weights = [];
|
|
55
|
+
for (let h = 0; h < this.numHeads; h++) {
|
|
56
|
+
const headWeights = [];
|
|
57
|
+
for (let i = 0; i < this.headDim; i++) {
|
|
58
|
+
const row = [];
|
|
59
|
+
for (let j = 0; j < this.hiddenDim; j++) {
|
|
60
|
+
row.push((Math.random() - 0.5) * 0.1);
|
|
61
|
+
}
|
|
62
|
+
headWeights.push(row);
|
|
63
|
+
}
|
|
64
|
+
weights.push(headWeights);
|
|
65
|
+
}
|
|
66
|
+
return weights;
|
|
67
|
+
}
|
|
68
|
+
initializeOutputWeights() {
|
|
69
|
+
const weights = [];
|
|
70
|
+
for (let i = 0; i < this.hiddenDim; i++) {
|
|
71
|
+
const row = [];
|
|
72
|
+
for (let j = 0; j < this.hiddenDim; j++) {
|
|
73
|
+
row.push((Math.random() - 0.5) * 0.1);
|
|
74
|
+
}
|
|
75
|
+
weights.push(row);
|
|
76
|
+
}
|
|
77
|
+
return weights;
|
|
78
|
+
}
|
|
79
|
+
forward(query, key, value, mask) {
|
|
80
|
+
const headOutputs = [];
|
|
81
|
+
const allWeights = [];
|
|
82
|
+
// Process each head
|
|
83
|
+
for (let h = 0; h < this.numHeads; h++) {
|
|
84
|
+
// Project to head dimension
|
|
85
|
+
const q = this.project(query, this.queryWeights[h]);
|
|
86
|
+
const k = this.project(key, this.keyWeights[h]);
|
|
87
|
+
const v = this.project(value, this.valueWeights[h]);
|
|
88
|
+
// Attention for this head
|
|
89
|
+
const { output, weights } = scaledDotProductAttention(q, k, v, mask);
|
|
90
|
+
headOutputs.push(output);
|
|
91
|
+
allWeights.push(weights);
|
|
92
|
+
}
|
|
93
|
+
// Concatenate heads
|
|
94
|
+
const concatenated = headOutputs.flat();
|
|
95
|
+
// Output projection
|
|
96
|
+
const output = this.project(concatenated, this.outputWeights);
|
|
97
|
+
return { output, attentionWeights: allWeights };
|
|
98
|
+
}
|
|
99
|
+
project(input, weights) {
|
|
100
|
+
const output = [];
|
|
101
|
+
for (let i = 0; i < weights.length; i++) {
|
|
102
|
+
let sum = 0;
|
|
103
|
+
for (let j = 0; j < input.length; j++) {
|
|
104
|
+
sum += input[j] * weights[i][j];
|
|
105
|
+
}
|
|
106
|
+
output.push(sum);
|
|
107
|
+
}
|
|
108
|
+
return output;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Flash Attention (optimized fallback)
|
|
113
|
+
*
|
|
114
|
+
* Replaces broken @ruvector/attention.flashAttention
|
|
115
|
+
* Uses tiling/chunking for better memory efficiency
|
|
116
|
+
*/
|
|
117
|
+
export class FlashAttention {
|
|
118
|
+
hiddenDim;
|
|
119
|
+
blockSize;
|
|
120
|
+
constructor(config) {
|
|
121
|
+
this.hiddenDim = config.hiddenDim;
|
|
122
|
+
this.blockSize = Math.min(64, this.hiddenDim); // Tile size
|
|
123
|
+
}
|
|
124
|
+
forward(query, key, value, numHeads = 8) {
|
|
125
|
+
const seqLen = query.length;
|
|
126
|
+
const headDim = this.hiddenDim / numHeads;
|
|
127
|
+
const output = [];
|
|
128
|
+
const attentionScores = [];
|
|
129
|
+
// Process in blocks for memory efficiency
|
|
130
|
+
for (let i = 0; i < seqLen; i += this.blockSize) {
|
|
131
|
+
const blockEnd = Math.min(i + this.blockSize, seqLen);
|
|
132
|
+
for (let qi = i; qi < blockEnd; qi++) {
|
|
133
|
+
const scores = [];
|
|
134
|
+
let maxScore = -Infinity;
|
|
135
|
+
// Compute attention scores for this query
|
|
136
|
+
for (let ki = 0; ki < seqLen; ki++) {
|
|
137
|
+
let score = 0;
|
|
138
|
+
for (let d = 0; d < query[qi].length; d++) {
|
|
139
|
+
score += query[qi][d] * key[ki][d];
|
|
140
|
+
}
|
|
141
|
+
score /= Math.sqrt(headDim);
|
|
142
|
+
scores.push(score);
|
|
143
|
+
maxScore = Math.max(maxScore, score);
|
|
144
|
+
}
|
|
145
|
+
// Numerically stable softmax
|
|
146
|
+
const expScores = scores.map(s => Math.exp(s - maxScore));
|
|
147
|
+
const sumExp = expScores.reduce((a, b) => a + b, 0);
|
|
148
|
+
const weights = expScores.map(e => e / sumExp);
|
|
149
|
+
// Weighted sum of values
|
|
150
|
+
const outputRow = new Array(value[0].length).fill(0);
|
|
151
|
+
for (let vi = 0; vi < seqLen; vi++) {
|
|
152
|
+
for (let d = 0; d < value[vi].length; d++) {
|
|
153
|
+
outputRow[d] += weights[vi] * value[vi][d];
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
output.push(outputRow);
|
|
157
|
+
attentionScores.push(weights);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
return { output, attentionScores };
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Linear Attention (fallback)
|
|
165
|
+
*
|
|
166
|
+
* O(n) complexity approximation of attention
|
|
167
|
+
*/
|
|
168
|
+
export class LinearAttention {
|
|
169
|
+
hiddenDim;
|
|
170
|
+
featureMap;
|
|
171
|
+
constructor(config) {
|
|
172
|
+
this.hiddenDim = config.hiddenDim;
|
|
173
|
+
// ELU feature map
|
|
174
|
+
this.featureMap = (x) => (x > 0 ? x : Math.exp(x) - 1);
|
|
175
|
+
}
|
|
176
|
+
forward(query, key, value) {
|
|
177
|
+
const seqLen = query.length;
|
|
178
|
+
const dim = value[0].length;
|
|
179
|
+
// Apply feature map
|
|
180
|
+
const queryMapped = query.map(q => q.map(this.featureMap));
|
|
181
|
+
const keyMapped = key.map(k => k.map(this.featureMap));
|
|
182
|
+
// Compute K^T V (dimension: [dim, valueDim])
|
|
183
|
+
const ktv = Array.from({ length: this.hiddenDim }, () => Array(dim).fill(0));
|
|
184
|
+
for (let i = 0; i < seqLen; i++) {
|
|
185
|
+
for (let d1 = 0; d1 < this.hiddenDim; d1++) {
|
|
186
|
+
for (let d2 = 0; d2 < dim; d2++) {
|
|
187
|
+
ktv[d1][d2] += keyMapped[i][d1] * value[i][d2];
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
// Compute Q (K^T V)
|
|
192
|
+
const output = [];
|
|
193
|
+
for (let i = 0; i < seqLen; i++) {
|
|
194
|
+
const row = [];
|
|
195
|
+
for (let d2 = 0; d2 < dim; d2++) {
|
|
196
|
+
let sum = 0;
|
|
197
|
+
for (let d1 = 0; d1 < this.hiddenDim; d1++) {
|
|
198
|
+
sum += queryMapped[i][d1] * ktv[d1][d2];
|
|
199
|
+
}
|
|
200
|
+
row.push(sum);
|
|
201
|
+
}
|
|
202
|
+
// Normalize
|
|
203
|
+
const normSum = queryMapped[i].reduce((a, b) => a + b, 0);
|
|
204
|
+
output.push(row.map(v => v / (normSum + 1e-8)));
|
|
205
|
+
}
|
|
206
|
+
return { output };
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Hyperbolic Attention (simplified fallback)
|
|
211
|
+
*
|
|
212
|
+
* Approximation using hyperbolic geometry
|
|
213
|
+
*/
|
|
214
|
+
export class HyperbolicAttention {
|
|
215
|
+
hiddenDim;
|
|
216
|
+
curvature;
|
|
217
|
+
constructor(config) {
|
|
218
|
+
this.hiddenDim = config.hiddenDim;
|
|
219
|
+
this.curvature = -1.0; // Poincaré ball curvature
|
|
220
|
+
}
|
|
221
|
+
forward(query, key, value) {
|
|
222
|
+
// Hyperbolic distance (simplified)
|
|
223
|
+
const distance = this.hyperbolicDistance(query, key);
|
|
224
|
+
// Attention weight based on hyperbolic distance
|
|
225
|
+
const weight = Math.exp(-distance);
|
|
226
|
+
// Weighted value
|
|
227
|
+
const output = value.map(v => v * weight);
|
|
228
|
+
return { output, distance };
|
|
229
|
+
}
|
|
230
|
+
hyperbolicDistance(a, b) {
|
|
231
|
+
// Simplified hyperbolic distance in Poincaré ball
|
|
232
|
+
let normDiffSq = 0;
|
|
233
|
+
for (let i = 0; i < a.length; i++) {
|
|
234
|
+
const diff = a[i] - b[i];
|
|
235
|
+
normDiffSq += diff * diff;
|
|
236
|
+
}
|
|
237
|
+
const normASq = a.reduce((sum, v) => sum + v * v, 0);
|
|
238
|
+
const normBSq = b.reduce((sum, v) => sum + v * v, 0);
|
|
239
|
+
const numerator = normDiffSq;
|
|
240
|
+
const denominator = (1 - normASq) * (1 - normBSq);
|
|
241
|
+
return Math.acosh(1 + (2 * numerator) / denominator);
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* MoE (Mixture of Experts) Attention (fallback)
|
|
246
|
+
*
|
|
247
|
+
* Routes to different expert attention modules
|
|
248
|
+
*/
|
|
249
|
+
export class MoEAttention {
|
|
250
|
+
experts;
|
|
251
|
+
numExperts;
|
|
252
|
+
gatingWeights;
|
|
253
|
+
constructor(config) {
|
|
254
|
+
this.numExperts = config.numExperts || 4;
|
|
255
|
+
this.experts = Array.from({ length: this.numExperts }, () => new MultiHeadAttention(config));
|
|
256
|
+
// Initialize gating network weights
|
|
257
|
+
this.gatingWeights = Array.from({ length: this.numExperts }, () => Array.from({ length: config.hiddenDim }, () => (Math.random() - 0.5) * 0.1));
|
|
258
|
+
}
|
|
259
|
+
forward(query, key, value, topK = 2) {
|
|
260
|
+
// Compute gating scores
|
|
261
|
+
const gatingScores = this.gatingWeights.map(weights => {
|
|
262
|
+
let score = 0;
|
|
263
|
+
for (let i = 0; i < query.length; i++) {
|
|
264
|
+
score += query[i] * weights[i];
|
|
265
|
+
}
|
|
266
|
+
return score;
|
|
267
|
+
});
|
|
268
|
+
// Softmax over top-K experts
|
|
269
|
+
const expScores = gatingScores.map(s => Math.exp(s));
|
|
270
|
+
const sumExp = expScores.reduce((a, b) => a + b, 0);
|
|
271
|
+
const expertWeights = expScores.map(e => e / sumExp);
|
|
272
|
+
// Get top-K experts
|
|
273
|
+
const expertIndices = expertWeights
|
|
274
|
+
.map((weight, idx) => ({ weight, idx }))
|
|
275
|
+
.sort((a, b) => b.weight - a.weight)
|
|
276
|
+
.slice(0, topK);
|
|
277
|
+
// Weighted combination of expert outputs
|
|
278
|
+
const output = new Array(query.length).fill(0);
|
|
279
|
+
for (const { weight, idx } of expertIndices) {
|
|
280
|
+
const expertOutput = this.experts[idx].forward(query, key, value).output;
|
|
281
|
+
for (let i = 0; i < output.length; i++) {
|
|
282
|
+
output[i] += weight * expertOutput[i];
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
return { output, expertWeights };
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
/**
|
|
289
|
+
* Check if native attention is available
|
|
290
|
+
*/
|
|
291
|
+
export function isNativeAttentionAvailable() {
|
|
292
|
+
try {
|
|
293
|
+
const attention = require('@ruvector/attention');
|
|
294
|
+
// Try a simple operation
|
|
295
|
+
const result = attention.flashAttention(new Float32Array([1, 0]), new Float32Array([1, 0]), new Float32Array([1, 0]), 1);
|
|
296
|
+
return true;
|
|
297
|
+
}
|
|
298
|
+
catch {
|
|
299
|
+
return false;
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
/**
|
|
303
|
+
* Factory function to create appropriate attention module
|
|
304
|
+
*/
|
|
305
|
+
export function createAttention(type, config) {
|
|
306
|
+
switch (type) {
|
|
307
|
+
case 'multi-head':
|
|
308
|
+
return new MultiHeadAttention(config);
|
|
309
|
+
case 'flash':
|
|
310
|
+
return new FlashAttention(config);
|
|
311
|
+
case 'linear':
|
|
312
|
+
return new LinearAttention(config);
|
|
313
|
+
case 'hyperbolic':
|
|
314
|
+
return new HyperbolicAttention(config);
|
|
315
|
+
case 'moe':
|
|
316
|
+
return new MoEAttention(config);
|
|
317
|
+
default:
|
|
318
|
+
return new MultiHeadAttention(config);
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
//# sourceMappingURL=attention-fallbacks.js.map
|