agentic-flow 3.0.0 → 3.2.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.
- package/.agents/skills/agentic-flow-ecosystem/SKILL.md +50 -0
- package/.claude/skills/agentic-flow-ecosystem/skill.md +58 -0
- package/.claude/skills/agentic-flow-quickstart/skill.md +6 -6
- package/.claude/skills/hooks-automation/skill.md +11 -11
- package/.claude/skills/memory-patterns/skill.md +7 -7
- package/.claude/skills/sparc-methodology/skill.md +13 -13
- package/.claude/skills/swarm-coordination/skill.md +5 -5
- package/.claude/skills/worker-benchmarks/skill.md +5 -5
- package/.claude/skills/worker-integration/skill.md +5 -5
- package/.claude/statusline.mjs +22 -5
- package/CHANGELOG.md +48 -0
- package/README.md +83 -71
- package/dist/.tsbuildinfo +1 -1
- package/dist/cli/commands/hooks.d.ts.map +1 -1
- package/dist/cli/commands/hooks.js +17 -17
- package/dist/cli/commands/hooks.js.map +1 -1
- package/dist/cli/commands/init.d.ts +2 -5
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +11 -15
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/swarm.d.ts.map +1 -1
- package/dist/cli/commands/swarm.js +3 -2
- package/dist/cli/commands/swarm.js.map +1 -1
- package/dist/core/agentdb-fast.d.ts +21 -11
- package/dist/core/agentdb-fast.d.ts.map +1 -1
- package/dist/core/agentdb-fast.js +39 -14
- package/dist/core/agentdb-fast.js.map +1 -1
- package/dist/integrations/agent-booster.d.ts +35 -0
- package/dist/integrations/agent-booster.d.ts.map +1 -0
- package/dist/integrations/agent-booster.js +45 -0
- package/dist/integrations/agent-booster.js.map +1 -0
- package/dist/integrations/index.d.ts +15 -0
- package/dist/integrations/index.d.ts.map +1 -0
- package/dist/integrations/index.js +11 -0
- package/dist/integrations/index.js.map +1 -0
- package/dist/integrations/onnx-wasm-embedder.d.ts +59 -0
- package/dist/integrations/onnx-wasm-embedder.d.ts.map +1 -0
- package/dist/integrations/onnx-wasm-embedder.js +145 -0
- package/dist/integrations/onnx-wasm-embedder.js.map +1 -0
- package/dist/integrations/optional.d.ts +44 -0
- package/dist/integrations/optional.d.ts.map +1 -0
- package/dist/integrations/optional.js +107 -0
- package/dist/integrations/optional.js.map +1 -0
- package/dist/integrations/prompt-injection.d.ts +52 -0
- package/dist/integrations/prompt-injection.d.ts.map +1 -0
- package/dist/integrations/prompt-injection.js +126 -0
- package/dist/integrations/prompt-injection.js.map +1 -0
- package/dist/integrations/sublinear.d.ts +71 -0
- package/dist/integrations/sublinear.d.ts.map +1 -0
- package/dist/integrations/sublinear.js +227 -0
- package/dist/integrations/sublinear.js.map +1 -0
- package/dist/integrations/task-partition.d.ts +40 -0
- package/dist/integrations/task-partition.d.ts.map +1 -0
- package/dist/integrations/task-partition.js +173 -0
- package/dist/integrations/task-partition.js.map +1 -0
- package/dist/mcp/mcp-policy.d.ts.map +1 -1
- package/dist/mcp/mcp-policy.js +2 -0
- package/dist/mcp/mcp-policy.js.map +1 -1
- package/dist/mcp/standalone-stdio.js +12 -26
- package/dist/mcp/standalone-stdio.js.map +1 -1
- package/dist/mcp/tools/ecosystem-tools.d.ts +49 -0
- package/dist/mcp/tools/ecosystem-tools.d.ts.map +1 -0
- package/dist/mcp/tools/ecosystem-tools.js +126 -0
- package/dist/mcp/tools/ecosystem-tools.js.map +1 -0
- package/dist/proxy/anthropic-to-gemini.d.ts.map +1 -1
- package/dist/proxy/anthropic-to-gemini.js +10 -14
- package/dist/proxy/anthropic-to-gemini.js.map +1 -1
- package/dist/proxy/anthropic-to-openrouter.d.ts.map +1 -1
- package/dist/proxy/anthropic-to-openrouter.js +6 -25
- package/dist/proxy/anthropic-to-openrouter.js.map +1 -1
- package/dist/proxy/anthropic-to-requesty.d.ts.map +1 -1
- package/dist/proxy/anthropic-to-requesty.js +8 -10
- package/dist/proxy/anthropic-to-requesty.js.map +1 -1
- package/dist/proxy/sse-lines.d.ts +9 -0
- package/dist/proxy/sse-lines.d.ts.map +1 -0
- package/dist/proxy/sse-lines.js +37 -0
- package/dist/proxy/sse-lines.js.map +1 -0
- package/dist/reasoningbank/index.d.ts +2 -1
- package/dist/reasoningbank/index.d.ts.map +1 -1
- package/dist/reasoningbank/index.js +1 -1
- package/dist/reasoningbank/index.js.map +1 -1
- package/dist/reasoningbank/utils/embeddings.d.ts +17 -0
- package/dist/reasoningbank/utils/embeddings.d.ts.map +1 -1
- package/dist/reasoningbank/utils/embeddings.js +48 -17
- package/dist/reasoningbank/utils/embeddings.js.map +1 -1
- package/dist/routing/SemanticRouter.d.ts +25 -9
- package/dist/routing/SemanticRouter.d.ts.map +1 -1
- package/dist/routing/SemanticRouter.js +63 -12
- package/dist/routing/SemanticRouter.js.map +1 -1
- package/dist/utils/input-validator.d.ts +10 -2
- package/dist/utils/input-validator.d.ts.map +1 -1
- package/dist/utils/input-validator.js +30 -2
- package/dist/utils/input-validator.js.map +1 -1
- package/dist/utils/model-cache.d.ts.map +1 -1
- package/dist/utils/model-cache.js +6 -25
- package/dist/utils/model-cache.js.map +1 -1
- package/dist/utils/package-version.d.ts +9 -0
- package/dist/utils/package-version.d.ts.map +1 -0
- package/dist/utils/package-version.js +39 -0
- package/dist/utils/package-version.js.map +1 -0
- package/dist/wasm/onnx-embeddings-wasm.d.ts.map +1 -1
- package/dist/wasm/onnx-embeddings-wasm.js +21 -10
- package/dist/wasm/onnx-embeddings-wasm.js.map +1 -1
- package/docs/docker-tests/TEST-V1.7.8.Dockerfile +2 -2
- package/docs/docker-tests/TEST-V1.7.9-NODE20.Dockerfile +2 -2
- package/docs/docker-tests/TEST-V1.7.9.Dockerfile +2 -2
- package/docs/guides/CLAUDE-CODE-INTEGRATION.md +25 -8
- package/docs/guides/PROXY-ARCHITECTURE-AND-EXTENSION.md +22 -9
- package/docs/guides/STANDALONE_PROXY_GUIDE.md +16 -6
- package/docs/integrations/FASTMCP_CLI_INTEGRATION.md +1 -1
- package/docs/plans/requesty/02-architecture.md +5 -6
- package/docs/plans/requesty/03-implementation-phases.md +3 -4
- package/docs/plans/requesty/05-migration-guide.md +2 -2
- package/package.json +12 -7
- package/scripts/validate-providers.sh +7 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model-cache.d.ts","sourceRoot":"","sources":["../../src/utils/model-cache.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAUH,UAAU,UAAU;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,cAAM,UAAU;IACd,OAAO,CAAC,KAAK,CAAkC;IAC/C,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,WAAW,CAAK;gBAEZ,SAAS,GAAE,MAAY;IAInC;;OAEG;IACG,SAAS,CAAC,CAAC,EACf,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACxB,YAAY,GAAE,MAAyB,GACtC,OAAO,CAAC,CAAC,CAAC;IA4Bb;;OAEG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAIzB;;OAEG;IACH,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS;IAUlC;;OAEG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,YAAY,GAAE,MAAyB,GAAG,IAAI;IAW3E;;OAEG;IACH,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAI5B;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;OAEG;IACH,QAAQ,IAAI,UAAU;IAoBtB;;OAEG;IACH,OAAO,CAAC,aAAa;CAuBtB;AAGD,eAAO,MAAM,UAAU,YAAmB,CAAC;AAG3C,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,GAAG,CAAC,
|
|
1
|
+
{"version":3,"file":"model-cache.d.ts","sourceRoot":"","sources":["../../src/utils/model-cache.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAUH,UAAU,UAAU;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,cAAM,UAAU;IACd,OAAO,CAAC,KAAK,CAAkC;IAC/C,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,WAAW,CAAK;gBAEZ,SAAS,GAAE,MAAY;IAInC;;OAEG;IACG,SAAS,CAAC,CAAC,EACf,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACxB,YAAY,GAAE,MAAyB,GACtC,OAAO,CAAC,CAAC,CAAC;IA4Bb;;OAEG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAIzB;;OAEG;IACH,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS;IAUlC;;OAEG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,YAAY,GAAE,MAAyB,GAAG,IAAI;IAW3E;;OAEG;IACH,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAI5B;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;OAEG;IACH,QAAQ,IAAI,UAAU;IAoBtB;;OAEG;IACH,OAAO,CAAC,aAAa;CAuBtB;AAGD,eAAO,MAAM,UAAU,YAAmB,CAAC;AAG3C,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,GAAG,CAAC,CAa1D;AAED,wBAAsB,6BAA6B,CACjD,IAAI,GAAE,MAA6B,EACnC,KAAK,GAAE,MAAkC,GACxC,OAAO,CAAC,GAAG,CAAC,CASd;AAED,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,GAAG,CAAC,CAS1D"}
|
|
@@ -132,31 +132,12 @@ export const modelCache = new ModelCache();
|
|
|
132
132
|
// Convenience functions
|
|
133
133
|
export async function getCachedOnnxEmbedder() {
|
|
134
134
|
return modelCache.getOrLoad('onnx-embeddings', async () => {
|
|
135
|
-
//
|
|
136
|
-
|
|
137
|
-
//
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
data.message?.includes('Import')) {
|
|
142
|
-
return false;
|
|
143
|
-
}
|
|
144
|
-
// @ts-ignore
|
|
145
|
-
return originalEmit.apply(process, [name, data, ...args]);
|
|
146
|
-
};
|
|
147
|
-
try {
|
|
148
|
-
const onnxModule = await import('ruvector-onnx-embeddings-wasm');
|
|
149
|
-
const EmbedderClass = onnxModule.OnnxEmbeddings || onnxModule.default;
|
|
150
|
-
if (EmbedderClass) {
|
|
151
|
-
const embedder = new EmbedderClass();
|
|
152
|
-
await embedder.initialize?.();
|
|
153
|
-
return embedder;
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
finally {
|
|
157
|
-
process.emit = originalEmit;
|
|
158
|
-
}
|
|
159
|
-
return null;
|
|
135
|
+
// ruvector-onnx-embeddings-wasm exposes WasmEmbedder (not the
|
|
136
|
+
// OnnxEmbeddings class this used to look for) and cannot be import()ed
|
|
137
|
+
// as published; the shared loader handles both. Resolves to an object
|
|
138
|
+
// with async embed(text) -> Float32Array, or null.
|
|
139
|
+
const { getOnnxWasmEmbedder } = await import('../integrations/onnx-wasm-embedder.js');
|
|
140
|
+
return getOnnxWasmEmbedder();
|
|
160
141
|
}, 100 * 1024 * 1024 // 100MB estimate for ONNX model
|
|
161
142
|
);
|
|
162
143
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model-cache.js","sourceRoot":"","sources":["../../src/utils/model-cache.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Global Model Cache\n *\n * Caches loaded models in memory to avoid repeated initialization overhead.\n * Supports ONNX embeddings, transformers.js pipelines, and other heavy models.\n */\n\ninterface CachedModel {\n model: any;\n loadedAt: number;\n lastUsed: number;\n useCount: number;\n sizeEstimate: number; // bytes\n}\n\ninterface CacheStats {\n models: number;\n totalSize: number;\n size?: number;\n totalHits: number;\n totalMisses: number;\n hits: number;\n misses: number;\n hitRate: number;\n}\n\nclass ModelCache {\n private cache = new Map<string, CachedModel>();\n private maxSize: number; // Max cache size in bytes\n private totalHits = 0;\n private totalMisses = 0;\n\n constructor(maxSizeMB: number = 512) {\n this.maxSize = maxSizeMB * 1024 * 1024;\n }\n\n /**\n * Get a cached model or load it\n */\n async getOrLoad<T>(\n key: string,\n loader: () => Promise<T>,\n sizeEstimate: number = 50 * 1024 * 1024 // Default 50MB estimate\n ): Promise<T> {\n const cached = this.cache.get(key);\n if (cached) {\n cached.lastUsed = Date.now();\n cached.useCount++;\n this.totalHits++;\n return cached.model as T;\n }\n\n this.totalMisses++;\n\n // Evict if needed\n this.evictIfNeeded(sizeEstimate);\n\n // Load model\n const model = await loader();\n\n this.cache.set(key, {\n model,\n loadedAt: Date.now(),\n lastUsed: Date.now(),\n useCount: 1,\n sizeEstimate\n });\n\n return model;\n }\n\n /**\n * Check if model is cached\n */\n has(key: string): boolean {\n return this.cache.has(key);\n }\n\n /**\n * Get cached model without loading\n */\n get<T>(key: string): T | undefined {\n const cached = this.cache.get(key);\n if (cached) {\n cached.lastUsed = Date.now();\n cached.useCount++;\n return cached.model as T;\n }\n return undefined;\n }\n\n /**\n * Manually cache a model\n */\n set(key: string, model: any, sizeEstimate: number = 50 * 1024 * 1024): void {\n this.evictIfNeeded(sizeEstimate);\n this.cache.set(key, {\n model,\n loadedAt: Date.now(),\n lastUsed: Date.now(),\n useCount: 1,\n sizeEstimate\n });\n }\n\n /**\n * Remove a model from cache\n */\n delete(key: string): boolean {\n return this.cache.delete(key);\n }\n\n /**\n * Clear all cached models\n */\n clear(): void {\n this.cache.clear();\n }\n\n /**\n * Get cache statistics\n */\n getStats(): CacheStats {\n let totalSize = 0;\n for (const cached of this.cache.values()) {\n totalSize += cached.sizeEstimate;\n }\n const hits = this.totalHits;\n const misses = this.totalMisses;\n const total = hits + misses;\n return {\n models: this.cache.size,\n totalSize,\n size: this.cache.size,\n totalHits: hits,\n totalMisses: misses,\n hits,\n misses,\n hitRate: total > 0 ? hits / total : 0\n };\n }\n\n /**\n * Evict least recently used models if cache is full\n */\n private evictIfNeeded(newSize: number): void {\n let currentSize = 0;\n for (const cached of this.cache.values()) {\n currentSize += cached.sizeEstimate;\n }\n\n if (currentSize + newSize <= this.maxSize) {\n return;\n }\n\n // Sort by last used time (LRU)\n const entries = Array.from(this.cache.entries())\n .sort((a, b) => a[1].lastUsed - b[1].lastUsed);\n\n // Evict until we have space\n for (const [key, cached] of entries) {\n if (currentSize + newSize <= this.maxSize) {\n break;\n }\n this.cache.delete(key);\n currentSize -= cached.sizeEstimate;\n }\n }\n}\n\n// Global singleton\nexport const modelCache = new ModelCache();\n\n// Convenience functions\nexport async function getCachedOnnxEmbedder(): Promise<any> {\n return modelCache.getOrLoad(\n 'onnx-embeddings',\n async () => {\n // Suppress experimental warning for WASM\n const originalEmit = process.emit;\n // @ts-ignore\n process.emit = function (name, data, ...args) {\n if (name === 'warning' && typeof data === 'object' &&\n (data as any).name === 'ExperimentalWarning' &&\n (data as any).message?.includes('Import')) {\n return false;\n }\n // @ts-ignore\n return originalEmit.apply(process, [name, data, ...args]);\n };\n\n try {\n const onnxModule = await import('ruvector-onnx-embeddings-wasm') as any;\n const EmbedderClass = onnxModule.OnnxEmbeddings || onnxModule.default;\n if (EmbedderClass) {\n const embedder = new EmbedderClass();\n await embedder.initialize?.();\n return embedder;\n }\n } finally {\n process.emit = originalEmit;\n }\n return null;\n },\n 100 * 1024 * 1024 // 100MB estimate for ONNX model\n );\n}\n\nexport async function getCachedTransformersPipeline(\n task: string = 'feature-extraction',\n model: string = 'Xenova/all-MiniLM-L6-v2'\n): Promise<any> {\n return modelCache.getOrLoad(\n `transformers:${task}:${model}`,\n async () => {\n const { pipeline } = await import('@huggingface/transformers');\n return pipeline(task as any, model);\n },\n 200 * 1024 * 1024 // 200MB estimate for transformers model\n );\n}\n\nexport async function getCachedRuvectorCore(): Promise<any> {\n return modelCache.getOrLoad(\n 'ruvector-core',\n async () => {\n const ruvector = await import('ruvector');\n return ruvector;\n },\n 50 * 1024 * 1024\n );\n}\n"]}
|
|
1
|
+
{"version":3,"file":"model-cache.js","sourceRoot":"","sources":["../../src/utils/model-cache.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Global Model Cache\n *\n * Caches loaded models in memory to avoid repeated initialization overhead.\n * Supports ONNX embeddings, transformers.js pipelines, and other heavy models.\n */\n\ninterface CachedModel {\n model: any;\n loadedAt: number;\n lastUsed: number;\n useCount: number;\n sizeEstimate: number; // bytes\n}\n\ninterface CacheStats {\n models: number;\n totalSize: number;\n size?: number;\n totalHits: number;\n totalMisses: number;\n hits: number;\n misses: number;\n hitRate: number;\n}\n\nclass ModelCache {\n private cache = new Map<string, CachedModel>();\n private maxSize: number; // Max cache size in bytes\n private totalHits = 0;\n private totalMisses = 0;\n\n constructor(maxSizeMB: number = 512) {\n this.maxSize = maxSizeMB * 1024 * 1024;\n }\n\n /**\n * Get a cached model or load it\n */\n async getOrLoad<T>(\n key: string,\n loader: () => Promise<T>,\n sizeEstimate: number = 50 * 1024 * 1024 // Default 50MB estimate\n ): Promise<T> {\n const cached = this.cache.get(key);\n if (cached) {\n cached.lastUsed = Date.now();\n cached.useCount++;\n this.totalHits++;\n return cached.model as T;\n }\n\n this.totalMisses++;\n\n // Evict if needed\n this.evictIfNeeded(sizeEstimate);\n\n // Load model\n const model = await loader();\n\n this.cache.set(key, {\n model,\n loadedAt: Date.now(),\n lastUsed: Date.now(),\n useCount: 1,\n sizeEstimate\n });\n\n return model;\n }\n\n /**\n * Check if model is cached\n */\n has(key: string): boolean {\n return this.cache.has(key);\n }\n\n /**\n * Get cached model without loading\n */\n get<T>(key: string): T | undefined {\n const cached = this.cache.get(key);\n if (cached) {\n cached.lastUsed = Date.now();\n cached.useCount++;\n return cached.model as T;\n }\n return undefined;\n }\n\n /**\n * Manually cache a model\n */\n set(key: string, model: any, sizeEstimate: number = 50 * 1024 * 1024): void {\n this.evictIfNeeded(sizeEstimate);\n this.cache.set(key, {\n model,\n loadedAt: Date.now(),\n lastUsed: Date.now(),\n useCount: 1,\n sizeEstimate\n });\n }\n\n /**\n * Remove a model from cache\n */\n delete(key: string): boolean {\n return this.cache.delete(key);\n }\n\n /**\n * Clear all cached models\n */\n clear(): void {\n this.cache.clear();\n }\n\n /**\n * Get cache statistics\n */\n getStats(): CacheStats {\n let totalSize = 0;\n for (const cached of this.cache.values()) {\n totalSize += cached.sizeEstimate;\n }\n const hits = this.totalHits;\n const misses = this.totalMisses;\n const total = hits + misses;\n return {\n models: this.cache.size,\n totalSize,\n size: this.cache.size,\n totalHits: hits,\n totalMisses: misses,\n hits,\n misses,\n hitRate: total > 0 ? hits / total : 0\n };\n }\n\n /**\n * Evict least recently used models if cache is full\n */\n private evictIfNeeded(newSize: number): void {\n let currentSize = 0;\n for (const cached of this.cache.values()) {\n currentSize += cached.sizeEstimate;\n }\n\n if (currentSize + newSize <= this.maxSize) {\n return;\n }\n\n // Sort by last used time (LRU)\n const entries = Array.from(this.cache.entries())\n .sort((a, b) => a[1].lastUsed - b[1].lastUsed);\n\n // Evict until we have space\n for (const [key, cached] of entries) {\n if (currentSize + newSize <= this.maxSize) {\n break;\n }\n this.cache.delete(key);\n currentSize -= cached.sizeEstimate;\n }\n }\n}\n\n// Global singleton\nexport const modelCache = new ModelCache();\n\n// Convenience functions\nexport async function getCachedOnnxEmbedder(): Promise<any> {\n return modelCache.getOrLoad(\n 'onnx-embeddings',\n async () => {\n // ruvector-onnx-embeddings-wasm exposes WasmEmbedder (not the\n // OnnxEmbeddings class this used to look for) and cannot be import()ed\n // as published; the shared loader handles both. Resolves to an object\n // with async embed(text) -> Float32Array, or null.\n const { getOnnxWasmEmbedder } = await import('../integrations/onnx-wasm-embedder.js');\n return getOnnxWasmEmbedder();\n },\n 100 * 1024 * 1024 // 100MB estimate for ONNX model\n );\n}\n\nexport async function getCachedTransformersPipeline(\n task: string = 'feature-extraction',\n model: string = 'Xenova/all-MiniLM-L6-v2'\n): Promise<any> {\n return modelCache.getOrLoad(\n `transformers:${task}:${model}`,\n async () => {\n const { pipeline } = await import('@huggingface/transformers');\n return pipeline(task as any, model);\n },\n 200 * 1024 * 1024 // 200MB estimate for transformers model\n );\n}\n\nexport async function getCachedRuvectorCore(): Promise<any> {\n return modelCache.getOrLoad(\n 'ruvector-core',\n async () => {\n const ruvector = await import('ruvector');\n return ruvector;\n },\n 50 * 1024 * 1024\n );\n}\n"]}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Version from this package's package.json, found by walking up from this
|
|
3
|
+
* file (src/utils under tsx, dist/utils when built). Throws if it is missing,
|
|
4
|
+
* which only happens in a broken install, rather than falling back to a tag.
|
|
5
|
+
*/
|
|
6
|
+
export declare function readPackageVersion(): string;
|
|
7
|
+
/** `agentic-flow@<installed version>`, for npx commands. */
|
|
8
|
+
export declare function packageSpec(): string;
|
|
9
|
+
//# sourceMappingURL=package-version.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package-version.d.ts","sourceRoot":"","sources":["../../src/utils/package-version.ts"],"names":[],"mappings":"AAYA;;;;GAIG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAgB3C;AAED,4DAA4D;AAC5D,wBAAgB,WAAW,IAAI,MAAM,CAEpC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
// The installed agentic-flow version, for commands we write or print.
|
|
2
|
+
//
|
|
3
|
+
// Generated hooks, statuslines and help text run `npx agentic-flow@<this>`,
|
|
4
|
+
// never a dist-tag: @alpha still resolves to the deprecated March 3.0.0-alpha
|
|
5
|
+
// line, and @latest changes under an installed project without notice.
|
|
6
|
+
import * as fs from 'fs';
|
|
7
|
+
import * as path from 'path';
|
|
8
|
+
import { fileURLToPath } from 'url';
|
|
9
|
+
const VERSION_RE = /^\d+\.\d+\.\d+[\w.+-]*$/;
|
|
10
|
+
let cached;
|
|
11
|
+
/**
|
|
12
|
+
* Version from this package's package.json, found by walking up from this
|
|
13
|
+
* file (src/utils under tsx, dist/utils when built). Throws if it is missing,
|
|
14
|
+
* which only happens in a broken install, rather than falling back to a tag.
|
|
15
|
+
*/
|
|
16
|
+
export function readPackageVersion() {
|
|
17
|
+
if (cached)
|
|
18
|
+
return cached;
|
|
19
|
+
let dir = path.dirname(fileURLToPath(import.meta.url));
|
|
20
|
+
for (;;) {
|
|
21
|
+
const file = path.join(dir, 'package.json');
|
|
22
|
+
if (fs.existsSync(file)) {
|
|
23
|
+
const pkg = JSON.parse(fs.readFileSync(file, 'utf-8'));
|
|
24
|
+
if (pkg.name === 'agentic-flow' && typeof pkg.version === 'string' && VERSION_RE.test(pkg.version)) {
|
|
25
|
+
cached = pkg.version;
|
|
26
|
+
return cached;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
const parent = path.dirname(dir);
|
|
30
|
+
if (parent === dir)
|
|
31
|
+
throw new Error('agentic-flow: cannot find its own package.json to pin the version');
|
|
32
|
+
dir = parent;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
/** `agentic-flow@<installed version>`, for npx commands. */
|
|
36
|
+
export function packageSpec() {
|
|
37
|
+
return `agentic-flow@${readPackageVersion()}`;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=package-version.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package-version.js","sourceRoot":"","sources":["../../src/utils/package-version.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,uEAAuE;AACvE,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,MAAM,UAAU,GAAG,yBAAyB,CAAC;AAC7C,IAAI,MAA0B,CAAC;AAE/B;;;;GAIG;AACH,MAAM,UAAU,kBAAkB;IAChC,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAC1B,IAAI,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACvD,SAAS,CAAC;QACR,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;QAC5C,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACxB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;YACvD,IAAI,GAAG,CAAC,IAAI,KAAK,cAAc,IAAI,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;gBACnG,MAAM,GAAG,GAAG,CAAC,OAAiB,CAAC;gBAC/B,OAAO,MAAM,CAAC;YAChB,CAAC;QACH,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,MAAM,KAAK,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,mEAAmE,CAAC,CAAC;QACzG,GAAG,GAAG,MAAM,CAAC;IACf,CAAC;AACH,CAAC;AAED,4DAA4D;AAC5D,MAAM,UAAU,WAAW;IACzB,OAAO,gBAAgB,kBAAkB,EAAE,EAAE,CAAC;AAChD,CAAC","sourcesContent":["// The installed agentic-flow version, for commands we write or print.\n//\n// Generated hooks, statuslines and help text run `npx agentic-flow@<this>`,\n// never a dist-tag: @alpha still resolves to the deprecated March 3.0.0-alpha\n// line, and @latest changes under an installed project without notice.\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { fileURLToPath } from 'url';\n\nconst VERSION_RE = /^\\d+\\.\\d+\\.\\d+[\\w.+-]*$/;\nlet cached: string | undefined;\n\n/**\n * Version from this package's package.json, found by walking up from this\n * file (src/utils under tsx, dist/utils when built). Throws if it is missing,\n * which only happens in a broken install, rather than falling back to a tag.\n */\nexport function readPackageVersion(): string {\n if (cached) return cached;\n let dir = path.dirname(fileURLToPath(import.meta.url));\n for (;;) {\n const file = path.join(dir, 'package.json');\n if (fs.existsSync(file)) {\n const pkg = JSON.parse(fs.readFileSync(file, 'utf-8'));\n if (pkg.name === 'agentic-flow' && typeof pkg.version === 'string' && VERSION_RE.test(pkg.version)) {\n cached = pkg.version as string;\n return cached;\n }\n }\n const parent = path.dirname(dir);\n if (parent === dir) throw new Error('agentic-flow: cannot find its own package.json to pin the version');\n dir = parent;\n }\n}\n\n/** `agentic-flow@<installed version>`, for npx commands. */\nexport function packageSpec(): string {\n return `agentic-flow@${readPackageVersion()}`;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"onnx-embeddings-wasm.d.ts","sourceRoot":"","sources":["../../src/wasm/onnx-embeddings-wasm.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAkCH,UAAU,SAAS;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,YAAY,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,GAAG,UAAU,CAAC;CAC7B;AAED,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,YAAY,EAAE,CAAC;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,GAAG,UAAU,CAAC;CAC7B;AAED,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;CACtB;AAQD;;GAEG;AACH,wBAAsB,sBAAsB,IAAI,OAAO,CAAC,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"onnx-embeddings-wasm.d.ts","sourceRoot":"","sources":["../../src/wasm/onnx-embeddings-wasm.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAkCH,UAAU,SAAS;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,YAAY,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,GAAG,UAAU,CAAC;CAC7B;AAED,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,YAAY,EAAE,CAAC;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,GAAG,UAAU,CAAC;CAC7B;AAED,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;CACtB;AAQD;;GAEG;AACH,wBAAsB,sBAAsB,IAAI,OAAO,CAAC,OAAO,CAAC,CA6C/D;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,OAAO,CAE7C;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,OAAO,CAEvC;AAED;;GAEG;AACH,wBAAsB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAqCtE;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,eAAe,CAAC,CAuC1E;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAY9E;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,YAAY,GAAG,MAAM,CAkBzE;AAED;;GAEG;AACH,wBAAgB,QAAQ,IAAI,mBAAmB,CAY9C;AAED;;GAEG;AACH,wBAAsB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAO9C;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,IAAI,CAEjC;AA8BD;;GAEG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,WAAW,CAAS;IAEtB,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC;IAKxB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAKjD,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,eAAe,CAAC;IAKrD,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAK/D,gBAAgB,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,YAAY,GAAG,MAAM;IAI1D,WAAW,IAAI,OAAO;IAItB,aAAa,IAAI,OAAO;IAIxB,QAAQ,IAAI,mBAAmB;IAIzB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAIhC;AAKD;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,kBAAkB,CAK1D;;;;;;;;;;;;;;;AAED,wBAaE"}
|
|
@@ -40,16 +40,27 @@ export async function initOnnxEmbeddingsWasm() {
|
|
|
40
40
|
return initPromise;
|
|
41
41
|
initPromise = (async () => {
|
|
42
42
|
try {
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
//
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
43
|
+
// The package's own exports are WasmEmbedder/cosineSimilarity and its
|
|
44
|
+
// published glue cannot be import()ed directly; adapt the shared loader
|
|
45
|
+
// to this module's interface.
|
|
46
|
+
const { getOnnxWasmEmbedder, loadOnnxWasmModule } = await import('../integrations/onnx-wasm-embedder.js');
|
|
47
|
+
const [mod, embedder] = await Promise.all([loadOnnxWasmModule(), getOnnxWasmEmbedder()]);
|
|
48
|
+
if (!mod || !embedder)
|
|
49
|
+
throw new Error('ruvector-onnx-embeddings-wasm or its model is unavailable');
|
|
50
|
+
wasmModule = {
|
|
51
|
+
embed: (text) => embedder.embed(text),
|
|
52
|
+
embedBatch: (texts) => embedder.embedBatch(texts),
|
|
53
|
+
similarity: async (a, b) => mod.cosineSimilarity(await embedder.embed(a), await embedder.embed(b)),
|
|
54
|
+
cosineSimilarity: (a, b) => mod.cosineSimilarity(a, b),
|
|
55
|
+
loadModel: async () => { },
|
|
56
|
+
isModelLoaded: () => true,
|
|
57
|
+
getModelInfo: () => ({ name: 'all-MiniLM-L6-v2', dimension: embedder.dimension, vocabSize: 30522, maxSequenceLength: 256 }),
|
|
58
|
+
isAvailable: () => true,
|
|
59
|
+
isSIMDEnabled: () => Boolean(mod.simd_available?.()),
|
|
60
|
+
getVersion: () => mod.version(),
|
|
61
|
+
initialize: async () => { },
|
|
62
|
+
shutdown: async () => { },
|
|
63
|
+
};
|
|
53
64
|
initialized = true;
|
|
54
65
|
logger.info('ONNX Embeddings WASM initialized', {
|
|
55
66
|
version: wasmModule.getVersion?.() || 'unknown',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"onnx-embeddings-wasm.js","sourceRoot":"","sources":["../../src/wasm/onnx-embeddings-wasm.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * ONNX Embeddings WASM Integration\n *\n * Provides browser-compatible embeddings using ruvector-onnx-embeddings-wasm.\n *\n * Features:\n * - Pure WASM: No native dependencies, runs in browser\n * - all-MiniLM-L6-v2: 384-dimensional semantic embeddings\n * - SIMD Acceleration: Uses WebAssembly SIMD when available\n * - Small Bundle: Optimized WASM binary size\n *\n * Use Cases:\n * - Browser-based semantic search\n * - Client-side RAG applications\n * - Edge computing (Cloudflare Workers, Deno Deploy)\n * - Offline-first applications\n *\n * Performance:\n * - ~50ms per embedding (SIMD enabled)\n * - ~200ms per embedding (SIMD disabled)\n * - Batch processing: ~30ms per embedding\n */\n\nimport { logger } from '../utils/logger.js';\n\n// Module state\nlet wasmModule: OnnxEmbeddingsModule | null = null;\nlet initialized = false;\nlet initPromise: Promise<boolean> | null = null;\n\n/**\n * ONNX Embeddings WASM module interface\n */\ninterface OnnxEmbeddingsModule {\n // Core functions\n embed: (text: string) => Promise<Float32Array>;\n embedBatch: (texts: string[]) => Promise<Float32Array[]>;\n similarity: (text1: string, text2: string) => Promise<number>;\n cosineSimilarity: (a: Float32Array, b: Float32Array) => number;\n\n // Model management\n loadModel: (modelPath?: string) => Promise<void>;\n isModelLoaded: () => boolean;\n getModelInfo: () => ModelInfo;\n\n // Utilities\n isAvailable: () => boolean;\n isSIMDEnabled: () => boolean;\n getVersion: () => string;\n\n // Lifecycle\n initialize: () => Promise<void>;\n shutdown: () => Promise<void>;\n}\n\ninterface ModelInfo {\n name: string;\n dimension: number;\n vocabSize: number;\n maxSequenceLength: number;\n}\n\nexport interface OnnxEmbeddingResult {\n embedding: Float32Array;\n timeMs: number;\n source: 'wasm' | 'fallback';\n}\n\nexport interface OnnxBatchResult {\n embeddings: Float32Array[];\n totalTimeMs: number;\n avgTimeMs: number;\n source: 'wasm' | 'fallback';\n}\n\nexport interface OnnxEmbeddingsStats {\n available: boolean;\n simdEnabled: boolean;\n modelLoaded: boolean;\n modelInfo?: ModelInfo;\n totalEmbeddings: number;\n totalLatencyMs: number;\n avgLatencyMs: number;\n}\n\n// Stats tracking\nlet stats = {\n totalEmbeddings: 0,\n totalLatencyMs: 0,\n};\n\n/**\n * Initialize ONNX Embeddings WASM module\n */\nexport async function initOnnxEmbeddingsWasm(): Promise<boolean> {\n if (initialized) return wasmModule !== null;\n if (initPromise) return initPromise;\n\n initPromise = (async () => {\n try {\n const mod = await import('ruvector-onnx-embeddings-wasm');\n wasmModule = mod as unknown as OnnxEmbeddingsModule;\n\n // Initialize WASM runtime\n if (wasmModule.initialize) {\n await wasmModule.initialize();\n }\n\n // Load default model\n if (wasmModule.loadModel && !wasmModule.isModelLoaded?.()) {\n await wasmModule.loadModel();\n }\n\n initialized = true;\n\n logger.info('ONNX Embeddings WASM initialized', {\n version: wasmModule.getVersion?.() || 'unknown',\n simd: wasmModule.isSIMDEnabled?.() ?? false,\n modelLoaded: wasmModule.isModelLoaded?.() ?? false,\n });\n\n return true;\n } catch (error) {\n logger.debug('ONNX Embeddings WASM not available', { error });\n initialized = true;\n return false;\n }\n })();\n\n return initPromise;\n}\n\n/**\n * Check if ONNX WASM embeddings are available\n */\nexport function isOnnxWasmAvailable(): boolean {\n return wasmModule !== null && (wasmModule.isAvailable?.() ?? false);\n}\n\n/**\n * Check if SIMD acceleration is enabled\n */\nexport function isSIMDEnabled(): boolean {\n return wasmModule?.isSIMDEnabled?.() ?? false;\n}\n\n/**\n * Generate embedding for text using WASM\n */\nexport async function embed(text: string): Promise<OnnxEmbeddingResult> {\n if (!initialized) {\n await initOnnxEmbeddingsWasm();\n }\n\n const startTime = performance.now();\n\n if (wasmModule && wasmModule.isModelLoaded?.()) {\n try {\n const embedding = await wasmModule.embed(text);\n const timeMs = performance.now() - startTime;\n\n stats.totalEmbeddings++;\n stats.totalLatencyMs += timeMs;\n\n return {\n embedding,\n timeMs,\n source: 'wasm',\n };\n } catch (error) {\n logger.warn('WASM embedding failed, using fallback', { error });\n }\n }\n\n // Fallback to simple hash-based embedding\n const embedding = simpleEmbed(text);\n const timeMs = performance.now() - startTime;\n\n stats.totalEmbeddings++;\n stats.totalLatencyMs += timeMs;\n\n return {\n embedding,\n timeMs,\n source: 'fallback',\n };\n}\n\n/**\n * Generate embeddings for multiple texts (batch processing)\n */\nexport async function embedBatch(texts: string[]): Promise<OnnxBatchResult> {\n if (!initialized) {\n await initOnnxEmbeddingsWasm();\n }\n\n const startTime = performance.now();\n\n if (wasmModule && wasmModule.embedBatch && wasmModule.isModelLoaded?.()) {\n try {\n const embeddings = await wasmModule.embedBatch(texts);\n const totalTimeMs = performance.now() - startTime;\n\n stats.totalEmbeddings += texts.length;\n stats.totalLatencyMs += totalTimeMs;\n\n return {\n embeddings,\n totalTimeMs,\n avgTimeMs: totalTimeMs / texts.length,\n source: 'wasm',\n };\n } catch (error) {\n logger.warn('WASM batch embedding failed, using fallback', { error });\n }\n }\n\n // Fallback to sequential simple embeddings\n const embeddings = texts.map((text) => simpleEmbed(text));\n const totalTimeMs = performance.now() - startTime;\n\n stats.totalEmbeddings += texts.length;\n stats.totalLatencyMs += totalTimeMs;\n\n return {\n embeddings,\n totalTimeMs,\n avgTimeMs: totalTimeMs / texts.length,\n source: 'fallback',\n };\n}\n\n/**\n * Compute similarity between two texts\n */\nexport async function similarity(text1: string, text2: string): Promise<number> {\n if (wasmModule && wasmModule.similarity) {\n try {\n return await wasmModule.similarity(text1, text2);\n } catch {\n // Fall through to fallback\n }\n }\n\n // Fallback\n const [result1, result2] = await Promise.all([embed(text1), embed(text2)]);\n return cosineSimilarity(result1.embedding, result2.embedding);\n}\n\n/**\n * Compute cosine similarity between two embeddings\n */\nexport function cosineSimilarity(a: Float32Array, b: Float32Array): number {\n if (wasmModule?.cosineSimilarity) {\n return wasmModule.cosineSimilarity(a, b);\n }\n\n // JS fallback\n let dot = 0;\n let normA = 0;\n let normB = 0;\n\n for (let i = 0; i < a.length; i++) {\n dot += a[i] * b[i];\n normA += a[i] * a[i];\n normB += b[i] * b[i];\n }\n\n const denominator = Math.sqrt(normA) * Math.sqrt(normB);\n return denominator === 0 ? 0 : dot / denominator;\n}\n\n/**\n * Get embedding statistics\n */\nexport function getStats(): OnnxEmbeddingsStats {\n const modelInfo = wasmModule?.getModelInfo?.();\n\n return {\n available: isOnnxWasmAvailable(),\n simdEnabled: isSIMDEnabled(),\n modelLoaded: wasmModule?.isModelLoaded?.() ?? false,\n modelInfo,\n totalEmbeddings: stats.totalEmbeddings,\n totalLatencyMs: stats.totalLatencyMs,\n avgLatencyMs: stats.totalEmbeddings > 0 ? stats.totalLatencyMs / stats.totalEmbeddings : 0,\n };\n}\n\n/**\n * Shutdown WASM module\n */\nexport async function shutdown(): Promise<void> {\n if (wasmModule?.shutdown) {\n await wasmModule.shutdown();\n }\n wasmModule = null;\n initialized = false;\n initPromise = null;\n}\n\n/**\n * Reset stats (for testing)\n */\nexport function resetStats(): void {\n stats = { totalEmbeddings: 0, totalLatencyMs: 0 };\n}\n\n/**\n * Simple hash-based embedding fallback\n * Not semantic, but provides consistent embeddings for testing\n */\nfunction simpleEmbed(text: string, dim: number = 384): Float32Array {\n const embedding = new Float32Array(dim);\n\n // Multi-pass hash for better distribution\n for (let i = 0; i < text.length; i++) {\n const code = text.charCodeAt(i);\n embedding[i % dim] += code / 255;\n embedding[(i * 7) % dim] += (code * 0.3) / 255;\n embedding[(i * 13) % dim] += (code * 0.2) / 255;\n }\n\n // Normalize\n let norm = 0;\n for (let i = 0; i < dim; i++) {\n norm += embedding[i] * embedding[i];\n }\n norm = Math.sqrt(norm) || 1;\n for (let i = 0; i < dim; i++) {\n embedding[i] /= norm;\n }\n\n return embedding;\n}\n\n/**\n * OnnxEmbeddingsWasm class for object-oriented usage\n */\nexport class OnnxEmbeddingsWasm {\n private initialized = false;\n\n async init(): Promise<boolean> {\n this.initialized = await initOnnxEmbeddingsWasm();\n return this.initialized;\n }\n\n async embed(text: string): Promise<OnnxEmbeddingResult> {\n if (!this.initialized) await this.init();\n return embed(text);\n }\n\n async embedBatch(texts: string[]): Promise<OnnxBatchResult> {\n if (!this.initialized) await this.init();\n return embedBatch(texts);\n }\n\n async similarity(text1: string, text2: string): Promise<number> {\n if (!this.initialized) await this.init();\n return similarity(text1, text2);\n }\n\n cosineSimilarity(a: Float32Array, b: Float32Array): number {\n return cosineSimilarity(a, b);\n }\n\n isAvailable(): boolean {\n return isOnnxWasmAvailable();\n }\n\n isSIMDEnabled(): boolean {\n return isSIMDEnabled();\n }\n\n getStats(): OnnxEmbeddingsStats {\n return getStats();\n }\n\n async shutdown(): Promise<void> {\n await shutdown();\n this.initialized = false;\n }\n}\n\n// Singleton instance\nlet instance: OnnxEmbeddingsWasm | null = null;\n\n/**\n * Get singleton OnnxEmbeddingsWasm instance\n */\nexport function getOnnxEmbeddingsWasm(): OnnxEmbeddingsWasm {\n if (!instance) {\n instance = new OnnxEmbeddingsWasm();\n }\n return instance;\n}\n\nexport default {\n OnnxEmbeddingsWasm,\n getOnnxEmbeddingsWasm,\n initOnnxEmbeddingsWasm,\n isOnnxWasmAvailable,\n isSIMDEnabled,\n embed,\n embedBatch,\n similarity,\n cosineSimilarity,\n getStats,\n shutdown,\n resetStats,\n};\n"]}
|
|
1
|
+
{"version":3,"file":"onnx-embeddings-wasm.js","sourceRoot":"","sources":["../../src/wasm/onnx-embeddings-wasm.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * ONNX Embeddings WASM Integration\n *\n * Provides browser-compatible embeddings using ruvector-onnx-embeddings-wasm.\n *\n * Features:\n * - Pure WASM: No native dependencies, runs in browser\n * - all-MiniLM-L6-v2: 384-dimensional semantic embeddings\n * - SIMD Acceleration: Uses WebAssembly SIMD when available\n * - Small Bundle: Optimized WASM binary size\n *\n * Use Cases:\n * - Browser-based semantic search\n * - Client-side RAG applications\n * - Edge computing (Cloudflare Workers, Deno Deploy)\n * - Offline-first applications\n *\n * Performance:\n * - ~50ms per embedding (SIMD enabled)\n * - ~200ms per embedding (SIMD disabled)\n * - Batch processing: ~30ms per embedding\n */\n\nimport { logger } from '../utils/logger.js';\n\n// Module state\nlet wasmModule: OnnxEmbeddingsModule | null = null;\nlet initialized = false;\nlet initPromise: Promise<boolean> | null = null;\n\n/**\n * ONNX Embeddings WASM module interface\n */\ninterface OnnxEmbeddingsModule {\n // Core functions\n embed: (text: string) => Promise<Float32Array>;\n embedBatch: (texts: string[]) => Promise<Float32Array[]>;\n similarity: (text1: string, text2: string) => Promise<number>;\n cosineSimilarity: (a: Float32Array, b: Float32Array) => number;\n\n // Model management\n loadModel: (modelPath?: string) => Promise<void>;\n isModelLoaded: () => boolean;\n getModelInfo: () => ModelInfo;\n\n // Utilities\n isAvailable: () => boolean;\n isSIMDEnabled: () => boolean;\n getVersion: () => string;\n\n // Lifecycle\n initialize: () => Promise<void>;\n shutdown: () => Promise<void>;\n}\n\ninterface ModelInfo {\n name: string;\n dimension: number;\n vocabSize: number;\n maxSequenceLength: number;\n}\n\nexport interface OnnxEmbeddingResult {\n embedding: Float32Array;\n timeMs: number;\n source: 'wasm' | 'fallback';\n}\n\nexport interface OnnxBatchResult {\n embeddings: Float32Array[];\n totalTimeMs: number;\n avgTimeMs: number;\n source: 'wasm' | 'fallback';\n}\n\nexport interface OnnxEmbeddingsStats {\n available: boolean;\n simdEnabled: boolean;\n modelLoaded: boolean;\n modelInfo?: ModelInfo;\n totalEmbeddings: number;\n totalLatencyMs: number;\n avgLatencyMs: number;\n}\n\n// Stats tracking\nlet stats = {\n totalEmbeddings: 0,\n totalLatencyMs: 0,\n};\n\n/**\n * Initialize ONNX Embeddings WASM module\n */\nexport async function initOnnxEmbeddingsWasm(): Promise<boolean> {\n if (initialized) return wasmModule !== null;\n if (initPromise) return initPromise;\n\n initPromise = (async () => {\n try {\n // The package's own exports are WasmEmbedder/cosineSimilarity and its\n // published glue cannot be import()ed directly; adapt the shared loader\n // to this module's interface.\n const { getOnnxWasmEmbedder, loadOnnxWasmModule } = await import('../integrations/onnx-wasm-embedder.js');\n const [mod, embedder] = await Promise.all([loadOnnxWasmModule(), getOnnxWasmEmbedder()]);\n if (!mod || !embedder) throw new Error('ruvector-onnx-embeddings-wasm or its model is unavailable');\n wasmModule = {\n embed: (text: string) => embedder.embed(text),\n embedBatch: (texts: string[]) => embedder.embedBatch(texts),\n similarity: async (a: string, b: string) =>\n mod.cosineSimilarity(await embedder.embed(a), await embedder.embed(b)),\n cosineSimilarity: (a: Float32Array, b: Float32Array) => mod.cosineSimilarity(a, b),\n loadModel: async () => {},\n isModelLoaded: () => true,\n getModelInfo: () => ({ name: 'all-MiniLM-L6-v2', dimension: embedder.dimension, vocabSize: 30522, maxSequenceLength: 256 }),\n isAvailable: () => true,\n isSIMDEnabled: () => Boolean((mod as any).simd_available?.()),\n getVersion: () => mod.version(),\n initialize: async () => {},\n shutdown: async () => {},\n };\n\n initialized = true;\n\n logger.info('ONNX Embeddings WASM initialized', {\n version: wasmModule.getVersion?.() || 'unknown',\n simd: wasmModule.isSIMDEnabled?.() ?? false,\n modelLoaded: wasmModule.isModelLoaded?.() ?? false,\n });\n\n return true;\n } catch (error) {\n logger.debug('ONNX Embeddings WASM not available', { error });\n initialized = true;\n return false;\n }\n })();\n\n return initPromise;\n}\n\n/**\n * Check if ONNX WASM embeddings are available\n */\nexport function isOnnxWasmAvailable(): boolean {\n return wasmModule !== null && (wasmModule.isAvailable?.() ?? false);\n}\n\n/**\n * Check if SIMD acceleration is enabled\n */\nexport function isSIMDEnabled(): boolean {\n return wasmModule?.isSIMDEnabled?.() ?? false;\n}\n\n/**\n * Generate embedding for text using WASM\n */\nexport async function embed(text: string): Promise<OnnxEmbeddingResult> {\n if (!initialized) {\n await initOnnxEmbeddingsWasm();\n }\n\n const startTime = performance.now();\n\n if (wasmModule && wasmModule.isModelLoaded?.()) {\n try {\n const embedding = await wasmModule.embed(text);\n const timeMs = performance.now() - startTime;\n\n stats.totalEmbeddings++;\n stats.totalLatencyMs += timeMs;\n\n return {\n embedding,\n timeMs,\n source: 'wasm',\n };\n } catch (error) {\n logger.warn('WASM embedding failed, using fallback', { error });\n }\n }\n\n // Fallback to simple hash-based embedding\n const embedding = simpleEmbed(text);\n const timeMs = performance.now() - startTime;\n\n stats.totalEmbeddings++;\n stats.totalLatencyMs += timeMs;\n\n return {\n embedding,\n timeMs,\n source: 'fallback',\n };\n}\n\n/**\n * Generate embeddings for multiple texts (batch processing)\n */\nexport async function embedBatch(texts: string[]): Promise<OnnxBatchResult> {\n if (!initialized) {\n await initOnnxEmbeddingsWasm();\n }\n\n const startTime = performance.now();\n\n if (wasmModule && wasmModule.embedBatch && wasmModule.isModelLoaded?.()) {\n try {\n const embeddings = await wasmModule.embedBatch(texts);\n const totalTimeMs = performance.now() - startTime;\n\n stats.totalEmbeddings += texts.length;\n stats.totalLatencyMs += totalTimeMs;\n\n return {\n embeddings,\n totalTimeMs,\n avgTimeMs: totalTimeMs / texts.length,\n source: 'wasm',\n };\n } catch (error) {\n logger.warn('WASM batch embedding failed, using fallback', { error });\n }\n }\n\n // Fallback to sequential simple embeddings\n const embeddings = texts.map((text) => simpleEmbed(text));\n const totalTimeMs = performance.now() - startTime;\n\n stats.totalEmbeddings += texts.length;\n stats.totalLatencyMs += totalTimeMs;\n\n return {\n embeddings,\n totalTimeMs,\n avgTimeMs: totalTimeMs / texts.length,\n source: 'fallback',\n };\n}\n\n/**\n * Compute similarity between two texts\n */\nexport async function similarity(text1: string, text2: string): Promise<number> {\n if (wasmModule && wasmModule.similarity) {\n try {\n return await wasmModule.similarity(text1, text2);\n } catch {\n // Fall through to fallback\n }\n }\n\n // Fallback\n const [result1, result2] = await Promise.all([embed(text1), embed(text2)]);\n return cosineSimilarity(result1.embedding, result2.embedding);\n}\n\n/**\n * Compute cosine similarity between two embeddings\n */\nexport function cosineSimilarity(a: Float32Array, b: Float32Array): number {\n if (wasmModule?.cosineSimilarity) {\n return wasmModule.cosineSimilarity(a, b);\n }\n\n // JS fallback\n let dot = 0;\n let normA = 0;\n let normB = 0;\n\n for (let i = 0; i < a.length; i++) {\n dot += a[i] * b[i];\n normA += a[i] * a[i];\n normB += b[i] * b[i];\n }\n\n const denominator = Math.sqrt(normA) * Math.sqrt(normB);\n return denominator === 0 ? 0 : dot / denominator;\n}\n\n/**\n * Get embedding statistics\n */\nexport function getStats(): OnnxEmbeddingsStats {\n const modelInfo = wasmModule?.getModelInfo?.();\n\n return {\n available: isOnnxWasmAvailable(),\n simdEnabled: isSIMDEnabled(),\n modelLoaded: wasmModule?.isModelLoaded?.() ?? false,\n modelInfo,\n totalEmbeddings: stats.totalEmbeddings,\n totalLatencyMs: stats.totalLatencyMs,\n avgLatencyMs: stats.totalEmbeddings > 0 ? stats.totalLatencyMs / stats.totalEmbeddings : 0,\n };\n}\n\n/**\n * Shutdown WASM module\n */\nexport async function shutdown(): Promise<void> {\n if (wasmModule?.shutdown) {\n await wasmModule.shutdown();\n }\n wasmModule = null;\n initialized = false;\n initPromise = null;\n}\n\n/**\n * Reset stats (for testing)\n */\nexport function resetStats(): void {\n stats = { totalEmbeddings: 0, totalLatencyMs: 0 };\n}\n\n/**\n * Simple hash-based embedding fallback\n * Not semantic, but provides consistent embeddings for testing\n */\nfunction simpleEmbed(text: string, dim: number = 384): Float32Array {\n const embedding = new Float32Array(dim);\n\n // Multi-pass hash for better distribution\n for (let i = 0; i < text.length; i++) {\n const code = text.charCodeAt(i);\n embedding[i % dim] += code / 255;\n embedding[(i * 7) % dim] += (code * 0.3) / 255;\n embedding[(i * 13) % dim] += (code * 0.2) / 255;\n }\n\n // Normalize\n let norm = 0;\n for (let i = 0; i < dim; i++) {\n norm += embedding[i] * embedding[i];\n }\n norm = Math.sqrt(norm) || 1;\n for (let i = 0; i < dim; i++) {\n embedding[i] /= norm;\n }\n\n return embedding;\n}\n\n/**\n * OnnxEmbeddingsWasm class for object-oriented usage\n */\nexport class OnnxEmbeddingsWasm {\n private initialized = false;\n\n async init(): Promise<boolean> {\n this.initialized = await initOnnxEmbeddingsWasm();\n return this.initialized;\n }\n\n async embed(text: string): Promise<OnnxEmbeddingResult> {\n if (!this.initialized) await this.init();\n return embed(text);\n }\n\n async embedBatch(texts: string[]): Promise<OnnxBatchResult> {\n if (!this.initialized) await this.init();\n return embedBatch(texts);\n }\n\n async similarity(text1: string, text2: string): Promise<number> {\n if (!this.initialized) await this.init();\n return similarity(text1, text2);\n }\n\n cosineSimilarity(a: Float32Array, b: Float32Array): number {\n return cosineSimilarity(a, b);\n }\n\n isAvailable(): boolean {\n return isOnnxWasmAvailable();\n }\n\n isSIMDEnabled(): boolean {\n return isSIMDEnabled();\n }\n\n getStats(): OnnxEmbeddingsStats {\n return getStats();\n }\n\n async shutdown(): Promise<void> {\n await shutdown();\n this.initialized = false;\n }\n}\n\n// Singleton instance\nlet instance: OnnxEmbeddingsWasm | null = null;\n\n/**\n * Get singleton OnnxEmbeddingsWasm instance\n */\nexport function getOnnxEmbeddingsWasm(): OnnxEmbeddingsWasm {\n if (!instance) {\n instance = new OnnxEmbeddingsWasm();\n }\n return instance;\n}\n\nexport default {\n OnnxEmbeddingsWasm,\n getOnnxEmbeddingsWasm,\n initOnnxEmbeddingsWasm,\n isOnnxWasmAvailable,\n isSIMDEnabled,\n embed,\n embedBatch,\n similarity,\n cosineSimilarity,\n getStats,\n shutdown,\n resetStats,\n};\n"]}
|
|
@@ -6,8 +6,8 @@ RUN apk add --no-cache python3 make g++ sqlite sqlite-dev
|
|
|
6
6
|
WORKDIR /test
|
|
7
7
|
|
|
8
8
|
RUN echo "========================================" && \
|
|
9
|
-
echo "Testing npx agentic-flow@
|
|
9
|
+
echo "Testing npx agentic-flow@1.7.8" && \
|
|
10
10
|
echo "========================================" && \
|
|
11
|
-
npx agentic-flow@
|
|
11
|
+
npx agentic-flow@1.7.8 --version 2>&1 | head -20
|
|
12
12
|
|
|
13
13
|
CMD ["echo", "✅ Test complete"]
|
|
@@ -6,8 +6,8 @@ RUN apk add --no-cache python3 make g++ sqlite sqlite-dev
|
|
|
6
6
|
WORKDIR /test
|
|
7
7
|
|
|
8
8
|
RUN echo "========================================" && \
|
|
9
|
-
echo "Testing npx agentic-flow@
|
|
9
|
+
echo "Testing npx agentic-flow@1.7.9 with Node 20" && \
|
|
10
10
|
echo "========================================" && \
|
|
11
|
-
npx agentic-flow@
|
|
11
|
+
npx agentic-flow@1.7.9 --version 2>&1
|
|
12
12
|
|
|
13
13
|
CMD ["echo", "✅ Test complete"]
|
|
@@ -6,9 +6,9 @@ RUN apk add --no-cache python3 make g++ sqlite sqlite-dev
|
|
|
6
6
|
WORKDIR /test
|
|
7
7
|
|
|
8
8
|
RUN echo "========================================" && \
|
|
9
|
-
echo "Testing npx agentic-flow@
|
|
9
|
+
echo "Testing npx agentic-flow@1.7.9" && \
|
|
10
10
|
echo "Expecting v1.7.9 with better-sqlite3 v11.x" && \
|
|
11
11
|
echo "========================================" && \
|
|
12
|
-
npx agentic-flow@
|
|
12
|
+
npx agentic-flow@1.7.9 --version 2>&1 | head -20
|
|
13
13
|
|
|
14
14
|
CMD ["echo", "✅ Test complete"]
|
|
@@ -31,18 +31,29 @@ This command:
|
|
|
31
31
|
|
|
32
32
|
**Terminal 1 - Start Proxy:**
|
|
33
33
|
```bash
|
|
34
|
+
export OPENROUTER_API_KEY=sk-or-v1-...
|
|
34
35
|
npx agentic-flow proxy --provider openrouter --port 3000
|
|
36
|
+
# Prints: export ANTHROPIC_API_KEY=sk-ant-proxy-... (a new token every run)
|
|
35
37
|
```
|
|
36
38
|
|
|
37
39
|
**Terminal 2 - Use Claude Code:**
|
|
38
40
|
```bash
|
|
39
41
|
# Inline environment variables (cleanest native approach)
|
|
40
42
|
ANTHROPIC_BASE_URL=http://localhost:3000 \
|
|
41
|
-
ANTHROPIC_API_KEY=
|
|
42
|
-
OPENROUTER_API_KEY=$OPENROUTER_API_KEY \
|
|
43
|
+
ANTHROPIC_API_KEY='<token printed by the proxy>' \
|
|
43
44
|
claude "Write a Python function to sort a list"
|
|
44
45
|
```
|
|
45
46
|
|
|
47
|
+
The provider key stays with the proxy; Claude Code only needs the proxy token.
|
|
48
|
+
|
|
49
|
+
**Authentication (3.0.0+).** The proxy binds `127.0.0.1` and rejects any
|
|
50
|
+
`/v1/messages` request without its token, so nobody else on your network can
|
|
51
|
+
spend your provider key. On start it prints a random per-run token; pass it as
|
|
52
|
+
`ANTHROPIC_API_KEY` (sent as `x-api-key`) or as `Authorization: Bearer`. To
|
|
53
|
+
keep the same token across restarts, set `AGENTIC_FLOW_PROXY_TOKEN` before
|
|
54
|
+
starting the proxy and use that value. `AGENTIC_FLOW_PROXY_HOST` changes the
|
|
55
|
+
bind address; only widen it on a network you trust. `/health` needs no token.
|
|
56
|
+
|
|
46
57
|
---
|
|
47
58
|
|
|
48
59
|
### Option 3: Bash Wrapper Script
|
|
@@ -232,8 +243,7 @@ npx agentic-flow claude-code \
|
|
|
232
243
|
4. **Wrapper spawns Claude Code with env:**
|
|
233
244
|
```bash
|
|
234
245
|
ANTHROPIC_BASE_URL=http://localhost:3000
|
|
235
|
-
ANTHROPIC_API_KEY
|
|
236
|
-
OPENROUTER_API_KEY=sk-or-v1-xxxxx
|
|
246
|
+
ANTHROPIC_API_KEY=<the proxy's per-run token>
|
|
237
247
|
claude "task"
|
|
238
248
|
```
|
|
239
249
|
|
|
@@ -309,7 +319,7 @@ VERBOSE=true npx agentic-flow proxy --provider openrouter
|
|
|
309
319
|
# In another terminal, test with curl
|
|
310
320
|
curl -X POST http://localhost:3000/v1/messages \
|
|
311
321
|
-H "Content-Type: application/json" \
|
|
312
|
-
-H "x-api-key:
|
|
322
|
+
-H "x-api-key: <token printed by the proxy>" \
|
|
313
323
|
-d '{"model":"claude-3-5-sonnet-20241022","messages":[{"role":"user","content":"hello"}],"max_tokens":100}'
|
|
314
324
|
```
|
|
315
325
|
|
|
@@ -361,14 +371,21 @@ proxy.start(3000);
|
|
|
361
371
|
|
|
362
372
|
### Environment Variable Presets
|
|
363
373
|
|
|
364
|
-
Create `~/.agentic-flow-presets
|
|
374
|
+
Create `~/.agentic-flow-presets`. The proxies require a token, so give each
|
|
375
|
+
one a fixed token with `AGENTIC_FLOW_PROXY_TOKEN` when you start it and reuse
|
|
376
|
+
it here:
|
|
365
377
|
|
|
366
378
|
```bash
|
|
379
|
+
# Start the proxies with a stable token, e.g.
|
|
380
|
+
# AGENTIC_FLOW_PROXY_TOKEN=$AF_PROXY_TOKEN npx agentic-flow proxy --provider openrouter --port 3000
|
|
381
|
+
# AGENTIC_FLOW_PROXY_TOKEN=$AF_PROXY_TOKEN npx agentic-flow proxy --provider gemini --port 3001
|
|
382
|
+
export AF_PROXY_TOKEN="sk-ant-proxy-$(openssl rand -hex 32)"
|
|
383
|
+
|
|
367
384
|
# OpenRouter preset
|
|
368
|
-
alias claude-openrouter='ANTHROPIC_BASE_URL=http://localhost:3000 ANTHROPIC_API_KEY
|
|
385
|
+
alias claude-openrouter='ANTHROPIC_BASE_URL=http://localhost:3000 ANTHROPIC_API_KEY=$AF_PROXY_TOKEN claude'
|
|
369
386
|
|
|
370
387
|
# Gemini preset
|
|
371
|
-
alias claude-gemini='ANTHROPIC_BASE_URL=http://localhost:3001 ANTHROPIC_API_KEY
|
|
388
|
+
alias claude-gemini='ANTHROPIC_BASE_URL=http://localhost:3001 ANTHROPIC_API_KEY=$AF_PROXY_TOKEN claude'
|
|
372
389
|
|
|
373
390
|
# Usage
|
|
374
391
|
claude-openrouter "Write code"
|
|
@@ -110,6 +110,7 @@ private convertOpenAIStreamToAnthropic(chunk: string): string {
|
|
|
110
110
|
```typescript
|
|
111
111
|
import express, { Request, Response } from 'express';
|
|
112
112
|
import { logger } from '../utils/logger.js';
|
|
113
|
+
import { createProxyAuthMiddleware, resolveProxyHost, resolveProxyToken } from './proxy-auth.js';
|
|
113
114
|
|
|
114
115
|
interface MistralMessage {
|
|
115
116
|
role: 'system' | 'user' | 'assistant';
|
|
@@ -124,18 +125,23 @@ interface MistralRequest {
|
|
|
124
125
|
stream?: boolean;
|
|
125
126
|
}
|
|
126
127
|
|
|
128
|
+
// Every proxy that holds an upstream key must bind loopback and require a
|
|
129
|
+
// token (3.0.0+). proxy-auth.ts gives you both.
|
|
127
130
|
export class AnthropicToMistralProxy {
|
|
128
131
|
private app: express.Application;
|
|
129
132
|
private mistralApiKey: string;
|
|
130
133
|
private mistralBaseUrl: string;
|
|
131
134
|
private defaultModel: string;
|
|
135
|
+
private authToken: string;
|
|
132
136
|
|
|
133
137
|
constructor(config: {
|
|
134
138
|
mistralApiKey: string;
|
|
135
139
|
mistralBaseUrl?: string;
|
|
136
140
|
defaultModel?: string;
|
|
141
|
+
authToken?: string; // default: AGENTIC_FLOW_PROXY_TOKEN or a random token
|
|
137
142
|
}) {
|
|
138
143
|
this.app = express();
|
|
144
|
+
this.authToken = config.authToken || resolveProxyToken();
|
|
139
145
|
this.mistralApiKey = config.mistralApiKey;
|
|
140
146
|
this.mistralBaseUrl = config.mistralBaseUrl || 'https://api.mistral.ai/v1';
|
|
141
147
|
this.defaultModel = config.defaultModel || 'mistral-large-latest';
|
|
@@ -144,7 +150,13 @@ export class AnthropicToMistralProxy {
|
|
|
144
150
|
this.setupRoutes();
|
|
145
151
|
}
|
|
146
152
|
|
|
153
|
+
public getAuthToken(): string {
|
|
154
|
+
return this.authToken;
|
|
155
|
+
}
|
|
156
|
+
|
|
147
157
|
private setupMiddleware(): void {
|
|
158
|
+
// Reject callers without the token before parsing their body. /health stays open.
|
|
159
|
+
this.app.use(createProxyAuthMiddleware(this.authToken));
|
|
148
160
|
this.app.use(express.json({ limit: '50mb' }));
|
|
149
161
|
}
|
|
150
162
|
|
|
@@ -246,10 +258,11 @@ export class AnthropicToMistralProxy {
|
|
|
246
258
|
};
|
|
247
259
|
}
|
|
248
260
|
|
|
249
|
-
public start(port: number): void {
|
|
250
|
-
this.app.listen(port, () => {
|
|
251
|
-
logger.info('Mistral proxy started', { port });
|
|
252
|
-
console.log(`\n✅ Mistral Proxy running at http
|
|
261
|
+
public start(port: number, host: string = resolveProxyHost()): void {
|
|
262
|
+
this.app.listen(port, host, () => {
|
|
263
|
+
logger.info('Mistral proxy started', { port, host });
|
|
264
|
+
console.log(`\n✅ Mistral Proxy running at http://${host}:${port}`);
|
|
265
|
+
console.log(` export ANTHROPIC_API_KEY=${this.authToken}\n`);
|
|
253
266
|
});
|
|
254
267
|
}
|
|
255
268
|
}
|
|
@@ -283,7 +296,7 @@ node dist/proxy/anthropic-to-mistral.js
|
|
|
283
296
|
|
|
284
297
|
# Terminal 2: Use with Claude Code
|
|
285
298
|
export ANTHROPIC_BASE_URL=http://localhost:3000
|
|
286
|
-
export ANTHROPIC_API_KEY=
|
|
299
|
+
export ANTHROPIC_API_KEY='<token printed by the proxy>'
|
|
287
300
|
npx agentic-flow --agent coder --task "Write hello world"
|
|
288
301
|
```
|
|
289
302
|
|
|
@@ -440,7 +453,7 @@ node dist/proxy/anthropic-to-ollama.js
|
|
|
440
453
|
|
|
441
454
|
# Terminal 2: Use with agents
|
|
442
455
|
export ANTHROPIC_BASE_URL=http://localhost:3000
|
|
443
|
-
export ANTHROPIC_API_KEY=
|
|
456
|
+
export ANTHROPIC_API_KEY='<token printed by the proxy>'
|
|
444
457
|
npx agentic-flow --agent coder --task "Write hello world"
|
|
445
458
|
```
|
|
446
459
|
|
|
@@ -621,7 +634,7 @@ describe('Mistral Proxy', () => {
|
|
|
621
634
|
it('should convert Anthropic request to Mistral format', async () => {
|
|
622
635
|
const response = await fetch(`http://localhost:${port}/v1/messages`, {
|
|
623
636
|
method: 'POST',
|
|
624
|
-
headers: { 'Content-Type': 'application/json' },
|
|
637
|
+
headers: { 'Content-Type': 'application/json', 'x-api-key': proxy.getAuthToken() },
|
|
625
638
|
body: JSON.stringify({
|
|
626
639
|
model: 'claude-3-5-sonnet-20241022',
|
|
627
640
|
messages: [{ role: 'user', content: 'Hello!' }],
|
|
@@ -672,9 +685,9 @@ if (options.provider === 'mistral' || process.env.USE_MISTRAL) {
|
|
|
672
685
|
});
|
|
673
686
|
proxy.start(3000);
|
|
674
687
|
|
|
675
|
-
// Set environment for SDK
|
|
688
|
+
// Set environment for SDK; the proxy rejects requests without its token
|
|
676
689
|
process.env.ANTHROPIC_BASE_URL = 'http://localhost:3000';
|
|
677
|
-
process.env.ANTHROPIC_API_KEY =
|
|
690
|
+
process.env.ANTHROPIC_API_KEY = proxy.getAuthToken();
|
|
678
691
|
}
|
|
679
692
|
```
|
|
680
693
|
|
|
@@ -52,7 +52,7 @@ npx agentic-flow proxy --provider openrouter
|
|
|
52
52
|
```bash
|
|
53
53
|
# Point Claude Code to the proxy
|
|
54
54
|
export ANTHROPIC_BASE_URL=http://localhost:3000
|
|
55
|
-
export ANTHROPIC_API_KEY=
|
|
55
|
+
export ANTHROPIC_API_KEY='<token printed by the proxy>' # required; see below
|
|
56
56
|
|
|
57
57
|
# Now use Claude Code normally
|
|
58
58
|
claude
|
|
@@ -63,6 +63,14 @@ claude --agent coder --task "Create a REST API in Python"
|
|
|
63
63
|
|
|
64
64
|
**That's it!** Claude Code will now route all requests through the proxy, using Gemini or OpenRouter instead of Anthropic.
|
|
65
65
|
|
|
66
|
+
**Authentication (3.0.0+).** The proxy binds `127.0.0.1` and rejects any
|
|
67
|
+
`/v1/messages` request without its token, so nobody else on your network can
|
|
68
|
+
spend your provider key. On start it prints a random per-run token; pass it as
|
|
69
|
+
`ANTHROPIC_API_KEY` (sent as `x-api-key`) or as `Authorization: Bearer`. To
|
|
70
|
+
keep the same token across restarts, set `AGENTIC_FLOW_PROXY_TOKEN` before
|
|
71
|
+
starting the proxy and use that value. `AGENTIC_FLOW_PROXY_HOST` changes the
|
|
72
|
+
bind address; only widen it on a network you trust. `/health` needs no token.
|
|
73
|
+
|
|
66
74
|
## Usage with Cursor IDE
|
|
67
75
|
|
|
68
76
|
**Status:** Cursor does not currently support custom `ANTHROPIC_BASE_URL` for Anthropic models.
|
|
@@ -79,7 +87,7 @@ npx agentic-flow proxy
|
|
|
79
87
|
# Configure Cursor
|
|
80
88
|
Settings → API Keys
|
|
81
89
|
Anthropic Base URL: http://localhost:3000
|
|
82
|
-
Anthropic API Key:
|
|
90
|
+
Anthropic API Key: <token printed by the proxy>
|
|
83
91
|
```
|
|
84
92
|
|
|
85
93
|
## Full Command Reference
|
|
@@ -106,6 +114,8 @@ npx agentic-flow proxy [OPTIONS]
|
|
|
106
114
|
| `GOOGLE_GEMINI_API_KEY` | Gemini | Your Google Gemini API key |
|
|
107
115
|
| `OPENROUTER_API_KEY` | OpenRouter | Your OpenRouter API key |
|
|
108
116
|
| `COMPLETION_MODEL` | Optional | Override default model |
|
|
117
|
+
| `AGENTIC_FLOW_PROXY_TOKEN` | Optional | Token clients must send (default: random per run, printed on start) |
|
|
118
|
+
| `AGENTIC_FLOW_PROXY_HOST` | Optional | Bind address (default: `127.0.0.1`) |
|
|
109
119
|
|
|
110
120
|
## Examples
|
|
111
121
|
|
|
@@ -117,7 +127,7 @@ npx agentic-flow proxy --port 8080
|
|
|
117
127
|
|
|
118
128
|
# In another terminal
|
|
119
129
|
export ANTHROPIC_BASE_URL=http://localhost:8080
|
|
120
|
-
export ANTHROPIC_API_KEY=
|
|
130
|
+
export ANTHROPIC_API_KEY='<token printed by the proxy>'
|
|
121
131
|
claude
|
|
122
132
|
```
|
|
123
133
|
|
|
@@ -129,7 +139,7 @@ npx agentic-flow proxy --provider openrouter --model "anthropic/claude-3.5-sonne
|
|
|
129
139
|
|
|
130
140
|
# Use Claude Code
|
|
131
141
|
export ANTHROPIC_BASE_URL=http://localhost:3000
|
|
132
|
-
export ANTHROPIC_API_KEY=
|
|
142
|
+
export ANTHROPIC_API_KEY='<token printed by the proxy>'
|
|
133
143
|
claude --agent researcher --task "Analyze market trends"
|
|
134
144
|
```
|
|
135
145
|
|
|
@@ -141,7 +151,7 @@ npx agentic-flow proxy --provider openrouter --model "deepseek/deepseek-chat-v3.
|
|
|
141
151
|
|
|
142
152
|
# 98% cost savings vs Claude Sonnet!
|
|
143
153
|
export ANTHROPIC_BASE_URL=http://localhost:3000
|
|
144
|
-
export ANTHROPIC_API_KEY=
|
|
154
|
+
export ANTHROPIC_API_KEY='<token printed by the proxy>'
|
|
145
155
|
claude --agent coder --task "Build a web scraper"
|
|
146
156
|
```
|
|
147
157
|
|
|
@@ -233,7 +243,7 @@ npx agentic-flow proxy
|
|
|
233
243
|
# Enable MCP in Claude Code
|
|
234
244
|
export ENABLE_CLAUDE_FLOW_SDK=true
|
|
235
245
|
export ANTHROPIC_BASE_URL=http://localhost:3000
|
|
236
|
-
export ANTHROPIC_API_KEY=
|
|
246
|
+
export ANTHROPIC_API_KEY='<token printed by the proxy>'
|
|
237
247
|
|
|
238
248
|
# MCP tools will be forwarded to Gemini/OpenRouter
|
|
239
249
|
claude --agent coder --task "Use memory_store to save config"
|