adaptive-memory-multi-model-router 2.16.0 → 2.16.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (248) hide show
  1. package/.github/workflows/adapters-ci.yml +142 -0
  2. package/.github/workflows/auto-submit-sitemap.yml +41 -0
  3. package/.github/workflows/ci.yml +2 -5
  4. package/.github/workflows/mcp-pypi-publish.yml +34 -0
  5. package/.github/workflows/pypi-publish.yml +146 -0
  6. package/.github/workflows/tmlpd-publish.yml +23 -0
  7. package/README.md +245 -148
  8. package/RELEASE_v2.16.0.md +149 -0
  9. package/TECHNICAL_README.md +253 -0
  10. package/adapters/README.md +36 -0
  11. package/adapters/__init__.py +25 -0
  12. package/adapters/a3m_adapter/__init__.py +51 -0
  13. package/adapters/a3m_adapter/adapter/__init__.py +22 -0
  14. package/adapters/a3m_adapter/adapter/autogen.py +169 -0
  15. package/adapters/a3m_adapter/adapter/config.py +100 -0
  16. package/adapters/a3m_adapter/adapter/haystack.py +197 -0
  17. package/adapters/a3m_adapter/adapter/langchain.py +155 -0
  18. package/adapters/a3m_adapter/adapter/langgraph.py +196 -0
  19. package/adapters/a3m_adapter/adapter/llamaindex.py +162 -0
  20. package/adapters/a3m_adapter/adapter/pinecone.py +217 -0
  21. package/adapters/a3m_adapter/adapter/vercel.py +188 -0
  22. package/adapters/a3m_adapter/tests/__init__.py +1 -0
  23. package/adapters/a3m_adapter/tests/test_adapters.py +118 -0
  24. package/adapters/a3m_adapter/tests/test_integration.py +80 -0
  25. package/adapters/requirements-dev.txt +6 -0
  26. package/adapters/requirements.txt +4 -0
  27. package/adapters/setup.py +23 -0
  28. package/demo.py +251 -0
  29. package/discoverability-diagnosis.md +280 -0
  30. package/dist/analytics/costAnalytics.d.ts.map +1 -1
  31. package/dist/benchmark/reproducible.d.ts.map +1 -1
  32. package/dist/cache/semanticCache.d.ts.map +1 -1
  33. package/dist/cli/setupWizard.d.ts +257 -50
  34. package/dist/cli/setupWizard.d.ts.map +1 -1
  35. package/dist/cli/setupWizard.js +419 -109
  36. package/dist/cli/setupWizard.js.map +1 -1
  37. package/dist/cli/tui.d.ts +6 -0
  38. package/dist/cli/tui.js +96 -67
  39. package/dist/cli/tui.js.map +1 -0
  40. package/dist/cli.js +9 -0
  41. package/dist/cost/budgetEnforcer.d.ts.map +1 -1
  42. package/dist/cost/costTracker.d.ts.map +1 -1
  43. package/dist/ensemble/multiRoundDialog.d.ts.map +1 -1
  44. package/dist/ensemble/shapleyValue.d.ts.map +1 -1
  45. package/dist/ensemble.d.ts +1 -1
  46. package/dist/ensemble.js +141 -0
  47. package/dist/integrations/langchainAdapter.d.ts.map +1 -1
  48. package/dist/integrations/langchainAdapter.js +3 -3
  49. package/dist/integrations/langchainAdapter.js.map +1 -1
  50. package/dist/integrations/oauth.d.ts.map +1 -1
  51. package/dist/integrations/scienceAdapter.d.ts.map +1 -1
  52. package/dist/memory/autoFetch.d.ts.map +1 -1
  53. package/dist/memory/hybridMemory.d.ts.map +1 -1
  54. package/dist/memory/memoryTree.d.ts.map +1 -1
  55. package/dist/memory/obsidianVault.d.ts.map +1 -1
  56. package/dist/memory/reasoningBank.d.ts.map +1 -1
  57. package/dist/observability/metrics.d.ts.map +1 -1
  58. package/dist/observability/tracer.d.ts.map +1 -1
  59. package/dist/providers/providerConfig.d.ts.map +1 -1
  60. package/dist/providers/providerConfig.js +32 -17
  61. package/dist/providers/providerConfig.js.map +1 -1
  62. package/dist/routing/advancedRouter.d.ts.map +1 -1
  63. package/dist/routing/advancedRouter.js +106 -14
  64. package/dist/routing/advancedRouter.js.map +1 -1
  65. package/dist/routing/providerHealth.d.ts.map +1 -1
  66. package/dist/routing/providerRetry.d.ts.map +1 -1
  67. package/dist/routing/shadowSampler.d.ts.map +1 -0
  68. package/dist/routing/shadowSampler.js.map +1 -1
  69. package/dist/security/guardrails.d.ts.map +1 -1
  70. package/dist/server/handlers/chatHandler.d.ts.map +1 -1
  71. package/dist/server/handlers/completionsHandler.d.ts.map +1 -1
  72. package/dist/server/handlers/embeddingsHandler.d.ts.map +1 -1
  73. package/dist/server/handlers/healthHandler.d.ts.map +1 -1
  74. package/dist/server/handlers/metricsHandler.d.ts.map +1 -1
  75. package/dist/server/handlers/modelsHandler.d.ts.map +1 -1
  76. package/dist/server/metrics.d.ts.map +1 -1
  77. package/dist/server/proxyServer.d.ts.map +1 -1
  78. package/dist/server/router.d.ts.map +1 -1
  79. package/dist/server/state.d.ts.map +1 -1
  80. package/dist/skills/__tests__/skill_manager.test.js +5 -265
  81. package/dist/skills/__tests__/skill_manager.test.js.map +1 -1
  82. package/dist/utils/tokenUtils.d.ts.map +1 -1
  83. package/docker-compose.yml +84 -60
  84. package/docs/ARTICLE_Biology_Inspired_Routing.md +208 -0
  85. package/docs/ARTICLE_Master.md +78 -0
  86. package/docs/ARTICLE_Master_CN.md +78 -0
  87. package/docs/ARTICLE_OpenRouter_Stripe.md +140 -0
  88. package/docs/DEVPTO_ARTICLE.md +84 -0
  89. package/docs/HUMAN_STYLE_GUIDE.md +75 -0
  90. package/docs/IMPRINT_PLAN.md +88 -0
  91. package/docs/OPENROUTER_ALTERNATIVE.md +184 -0
  92. package/docs/SOCIAL_CAMPAIGN.md +316 -0
  93. package/docs/anthropic.html +45 -0
  94. package/docs/best-llm-routers-2025.html +157 -0
  95. package/docs/cerebras.html +43 -0
  96. package/docs/cli-cheatsheet.md +286 -212
  97. package/docs/comparison.md +2 -2
  98. package/docs/deepseek.html +44 -0
  99. package/docs/google.html +47 -0
  100. package/docs/groq.html +44 -0
  101. package/docs/llms-full.txt +360 -138
  102. package/docs/llms.txt +70 -71
  103. package/docs/mistral.html +43 -0
  104. package/docs/ollama.html +50 -0
  105. package/docs/openai.html +57 -0
  106. package/docs/sitemap.xml +69 -57
  107. package/docs-site/blog/best-llm-routers-2025.html +157 -0
  108. package/docs-site/index.html +68 -9
  109. package/docs-site/providers/anthropic.html +45 -0
  110. package/docs-site/providers/cerebras.html +43 -0
  111. package/docs-site/providers/deepseek.html +44 -0
  112. package/docs-site/providers/google.html +47 -0
  113. package/docs-site/providers/groq.html +44 -0
  114. package/docs-site/providers/index.html +41 -0
  115. package/docs-site/providers/mistral.html +43 -0
  116. package/docs-site/providers/ollama.html +50 -0
  117. package/docs-site/providers/openai.html +57 -0
  118. package/docs-site/sitemap.xml +69 -0
  119. package/llms.txt +70 -62
  120. package/package.json +44 -182
  121. package/packages/agentkit-adapter/LICENSE +21 -0
  122. package/packages/agentkit-adapter/README.md +126 -0
  123. package/packages/agentkit-adapter/examples/agentkit-example.ts +139 -0
  124. package/packages/agentkit-adapter/package.json +57 -0
  125. package/packages/agentkit-adapter/src/adapter.ts +381 -0
  126. package/packages/agentkit-adapter/src/index.ts +36 -0
  127. package/packages/agentkit-adapter/src/types.ts +105 -0
  128. package/packages/agentkit-adapter/src/util.ts +13 -0
  129. package/packages/agentkit-adapter/tsconfig.json +22 -0
  130. package/prometheus.yml +8 -0
  131. package/python/README.md +35 -81
  132. package/python/a3m/__init__.py +32 -3
  133. package/python/a3m/adapters/__init__.py +21 -0
  134. package/python/a3m/adapters/langchain.py +190 -0
  135. package/python/a3m/adapters/llamaindex.py +249 -0
  136. package/python/a3m/adapters/qdrant.py +240 -0
  137. package/python/a3m/adapters/weaviate.py +263 -0
  138. package/python/a3m/client.py +5 -0
  139. package/python/build_verify.sh +32 -0
  140. package/python/mcp-server/README.md +172 -0
  141. package/python/mcp-server/a3m_mcp/__init__.py +25 -0
  142. package/python/mcp-server/a3m_mcp/__main__.py +15 -0
  143. package/python/mcp-server/a3m_mcp/server.py +205 -0
  144. package/python/mcp-server/pyproject.toml +24 -0
  145. package/python/pyproject.toml +60 -6
  146. package/python/setup.py +3 -28
  147. package/scripts/submit-sitemap.sh +52 -0
  148. package/src/__types__/registry.d.ts +14 -0
  149. package/src/cli/setupWizard.ts +443 -112
  150. package/src/cli/tui.ts +159 -0
  151. package/src/ensemble.ts +154 -1
  152. package/src/integrations/langchainAdapter.ts +2 -2
  153. package/src/providers/providerConfig.ts +32 -17
  154. package/src/providers/registry.js +27 -0
  155. package/src/routing/advancedRouter.ts +99 -14
  156. package/src/routing/shadowSampler.ts +1 -1
  157. package/test-install/package.json +12 -0
  158. package/tests/tsconfig.json +0 -1
  159. package/tmlpd-pi-extension/README.md +105 -44
  160. package/tmlpd-pi-extension/docs/demo.svg +33 -0
  161. package/tmlpd-pi-extension/package.json +35 -106
  162. package/tmlpd-pi-extension/src/tokenOptimization/contextStratifier.ts +163 -0
  163. package/tmlpd-pi-extension/src/tokenOptimization/fetchOnceLocal.ts +136 -0
  164. package/tmlpd-pi-extension/src/tokenOptimization/index.ts +197 -0
  165. package/tmlpd-pi-extension/src/tokenOptimization/interAgentCompression.ts +157 -0
  166. package/tmlpd-pi-extension/src/tokenOptimization/schemaContract.ts +101 -0
  167. package/tmlpd-pi-extension/src/tokenOptimization/semanticCache.ts +248 -0
  168. package/tmlpd-pi-extension/src/tokenOptimization/tokenAwareFallback.ts +192 -0
  169. package/tmlpd-pi-extension/test/verify.js +21 -0
  170. package/tsconfig.build.json +3 -2
  171. package/packages/a3m-vercel-ai/dist/a3m-language-model.d.ts +0 -12
  172. package/packages/a3m-vercel-ai/dist/a3m-language-model.d.ts.map +0 -1
  173. package/packages/a3m-vercel-ai/dist/a3m-language-model.js +0 -289
  174. package/packages/a3m-vercel-ai/dist/a3m-language-model.js.map +0 -1
  175. package/packages/a3m-vercel-ai/dist/index.d.ts +0 -82
  176. package/packages/a3m-vercel-ai/dist/index.d.ts.map +0 -1
  177. package/packages/a3m-vercel-ai/dist/index.js +0 -79
  178. package/packages/a3m-vercel-ai/dist/index.js.map +0 -1
  179. package/packages/a3m-vercel-ai/dist/types.d.ts +0 -97
  180. package/packages/a3m-vercel-ai/dist/types.d.ts.map +0 -1
  181. package/packages/a3m-vercel-ai/dist/types.js +0 -5
  182. package/packages/a3m-vercel-ai/dist/types.js.map +0 -1
  183. package/src/skills/__tests__/skill_manager.test.ts +0 -328
  184. package/tmlpd-pi-extension/dist/cache/prefixCache.d.ts +0 -114
  185. package/tmlpd-pi-extension/dist/cache/prefixCache.d.ts.map +0 -1
  186. package/tmlpd-pi-extension/dist/cache/prefixCache.js +0 -285
  187. package/tmlpd-pi-extension/dist/cache/prefixCache.js.map +0 -1
  188. package/tmlpd-pi-extension/dist/cache/responseCache.d.ts +0 -58
  189. package/tmlpd-pi-extension/dist/cache/responseCache.d.ts.map +0 -1
  190. package/tmlpd-pi-extension/dist/cache/responseCache.js +0 -153
  191. package/tmlpd-pi-extension/dist/cache/responseCache.js.map +0 -1
  192. package/tmlpd-pi-extension/dist/cli.js +0 -59
  193. package/tmlpd-pi-extension/dist/cost/costTracker.d.ts +0 -95
  194. package/tmlpd-pi-extension/dist/cost/costTracker.d.ts.map +0 -1
  195. package/tmlpd-pi-extension/dist/cost/costTracker.js +0 -240
  196. package/tmlpd-pi-extension/dist/cost/costTracker.js.map +0 -1
  197. package/tmlpd-pi-extension/dist/index.d.ts +0 -723
  198. package/tmlpd-pi-extension/dist/index.d.ts.map +0 -1
  199. package/tmlpd-pi-extension/dist/index.js +0 -239
  200. package/tmlpd-pi-extension/dist/index.js.map +0 -1
  201. package/tmlpd-pi-extension/dist/memory/episodicMemory.d.ts +0 -82
  202. package/tmlpd-pi-extension/dist/memory/episodicMemory.d.ts.map +0 -1
  203. package/tmlpd-pi-extension/dist/memory/episodicMemory.js +0 -145
  204. package/tmlpd-pi-extension/dist/memory/episodicMemory.js.map +0 -1
  205. package/tmlpd-pi-extension/dist/orchestration/haloOrchestrator.d.ts +0 -102
  206. package/tmlpd-pi-extension/dist/orchestration/haloOrchestrator.d.ts.map +0 -1
  207. package/tmlpd-pi-extension/dist/orchestration/haloOrchestrator.js +0 -207
  208. package/tmlpd-pi-extension/dist/orchestration/haloOrchestrator.js.map +0 -1
  209. package/tmlpd-pi-extension/dist/orchestration/mctsWorkflow.d.ts +0 -85
  210. package/tmlpd-pi-extension/dist/orchestration/mctsWorkflow.d.ts.map +0 -1
  211. package/tmlpd-pi-extension/dist/orchestration/mctsWorkflow.js +0 -210
  212. package/tmlpd-pi-extension/dist/orchestration/mctsWorkflow.js.map +0 -1
  213. package/tmlpd-pi-extension/dist/providers/localProvider.d.ts +0 -102
  214. package/tmlpd-pi-extension/dist/providers/localProvider.d.ts.map +0 -1
  215. package/tmlpd-pi-extension/dist/providers/localProvider.js +0 -338
  216. package/tmlpd-pi-extension/dist/providers/localProvider.js.map +0 -1
  217. package/tmlpd-pi-extension/dist/providers/registry.d.ts +0 -55
  218. package/tmlpd-pi-extension/dist/providers/registry.d.ts.map +0 -1
  219. package/tmlpd-pi-extension/dist/providers/registry.js +0 -138
  220. package/tmlpd-pi-extension/dist/providers/registry.js.map +0 -1
  221. package/tmlpd-pi-extension/dist/routing/advancedRouter.d.ts +0 -68
  222. package/tmlpd-pi-extension/dist/routing/advancedRouter.d.ts.map +0 -1
  223. package/tmlpd-pi-extension/dist/routing/advancedRouter.js +0 -332
  224. package/tmlpd-pi-extension/dist/routing/advancedRouter.js.map +0 -1
  225. package/tmlpd-pi-extension/dist/tools/tmlpdTools.d.ts +0 -101
  226. package/tmlpd-pi-extension/dist/tools/tmlpdTools.d.ts.map +0 -1
  227. package/tmlpd-pi-extension/dist/tools/tmlpdTools.js +0 -368
  228. package/tmlpd-pi-extension/dist/tools/tmlpdTools.js.map +0 -1
  229. package/tmlpd-pi-extension/dist/utils/batchProcessor.d.ts +0 -96
  230. package/tmlpd-pi-extension/dist/utils/batchProcessor.d.ts.map +0 -1
  231. package/tmlpd-pi-extension/dist/utils/batchProcessor.js +0 -170
  232. package/tmlpd-pi-extension/dist/utils/batchProcessor.js.map +0 -1
  233. package/tmlpd-pi-extension/dist/utils/compression.d.ts +0 -61
  234. package/tmlpd-pi-extension/dist/utils/compression.d.ts.map +0 -1
  235. package/tmlpd-pi-extension/dist/utils/compression.js +0 -281
  236. package/tmlpd-pi-extension/dist/utils/compression.js.map +0 -1
  237. package/tmlpd-pi-extension/dist/utils/reliability.d.ts +0 -74
  238. package/tmlpd-pi-extension/dist/utils/reliability.d.ts.map +0 -1
  239. package/tmlpd-pi-extension/dist/utils/reliability.js +0 -177
  240. package/tmlpd-pi-extension/dist/utils/reliability.js.map +0 -1
  241. package/tmlpd-pi-extension/dist/utils/speculativeDecoding.d.ts +0 -117
  242. package/tmlpd-pi-extension/dist/utils/speculativeDecoding.d.ts.map +0 -1
  243. package/tmlpd-pi-extension/dist/utils/speculativeDecoding.js +0 -246
  244. package/tmlpd-pi-extension/dist/utils/speculativeDecoding.js.map +0 -1
  245. package/tmlpd-pi-extension/dist/utils/tokenUtils.d.ts +0 -50
  246. package/tmlpd-pi-extension/dist/utils/tokenUtils.d.ts.map +0 -1
  247. package/tmlpd-pi-extension/dist/utils/tokenUtils.js +0 -124
  248. package/tmlpd-pi-extension/dist/utils/tokenUtils.js.map +0 -1
@@ -1,79 +0,0 @@
1
- /**
2
- * @a3m/vercel-ai - A3M Router Provider for Vercel AI SDK
3
- *
4
- * Drop-in replacement that routes to the cheapest capable provider
5
- * with parallel execution, caching, and automatic fallback.
6
- *
7
- * @example
8
- * ```typescript
9
- * import { createA3MProvider } from '@a3m/vercel-ai';
10
- * import { generateText } from 'ai';
11
- *
12
- * const a3m = createA3MProvider();
13
- *
14
- * const { text } = await generateText({
15
- * model: a3m('auto'),
16
- * prompt: 'What is the capital of France?',
17
- * });
18
- * ```
19
- */
20
- export { createA3MLanguageModel } from './a3m-language-model';
21
- import { createA3MLanguageModel } from './a3m-language-model';
22
- /**
23
- * Create an A3M Router provider for Vercel AI SDK
24
- */
25
- export function createA3MProvider(config = {}) {
26
- const languageModel = createA3MLanguageModel(config);
27
- const provider = Object.assign((modelId) => {
28
- // Return the language model - A3M handles model selection internally
29
- return languageModel;
30
- }, {
31
- name: 'a3m',
32
- // Allow accessing config for introspection
33
- __config: config,
34
- });
35
- return provider;
36
- }
37
- /**
38
- * Example usage with Next.js App Router
39
- *
40
- * ```typescript
41
- * // app/api/chat/route.ts
42
- * import { createA3MProvider } from '@a3m/vercel-ai';
43
- * import { generateText } from 'ai';
44
- *
45
- * const a3m = createA3MProvider({
46
- * parallelEnsemble: true,
47
- * });
48
- *
49
- * export async function POST(req: Request) {
50
- * const { messages } = await req.json();
51
- *
52
- * const result = await generateText({
53
- * model: a3m('auto'),
54
- * messages,
55
- * });
56
- *
57
- * return Response.json(result);
58
- * }
59
- * ```
60
- */
61
- /**
62
- * Example usage with streaming
63
- *
64
- * ```typescript
65
- * import { createA3MProvider } from '@a3m/vercel-ai';
66
- * import { streamText } from 'ai';
67
- *
68
- * const a3m = createA3MProvider();
69
- *
70
- * const result = await streamText({
71
- * model: a3m('auto'),
72
- * prompt: 'Write a story about a robot...',
73
- * });
74
- *
75
- * // Stream to response
76
- * return result.toDataStreamResponse();
77
- * ```
78
- */
79
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAGH,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAI9D,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAe9D;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,SAA0B,EAAE;IAC5D,MAAM,aAAa,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAC;IAErD,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAC5B,CAAC,OAAe,EAAE,EAAE;QAClB,qEAAqE;QACrE,OAAO,aAAa,CAAC;IACvB,CAAC,EACD;QACE,IAAI,EAAE,KAAc;QACpB,2CAA2C;QAC3C,QAAQ,EAAE,MAAM;KACjB,CACF,CAAC;IAEF,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH;;;;;;;;;;;;;;;;;GAiBG"}
@@ -1,97 +0,0 @@
1
- /**
2
- * A3M Router configuration for Vercel AI SDK
3
- */
4
- export interface A3MRouterConfig {
5
- /**
6
- * A3M Router endpoint
7
- * @default 'http://localhost:8787'
8
- */
9
- baseURL?: string;
10
- /**
11
- * API key for A3M Router
12
- * @default 'not-needed' for local
13
- */
14
- apiKey?: string;
15
- /**
16
- * Enable parallel ensemble execution
17
- * Runs multiple providers and picks the best result
18
- * @default false
19
- */
20
- parallelEnsemble?: boolean;
21
- /**
22
- * Number of providers to run in parallel when parallelEnsemble is true
23
- * @default 3
24
- */
25
- parallelCount?: number;
26
- /**
27
- * Enable stealth mode (anti-detection for browser automation)
28
- * @default false
29
- */
30
- stealth?: boolean;
31
- /**
32
- * Cache configuration
33
- */
34
- cache?: {
35
- enabled?: boolean;
36
- ttl?: number;
37
- };
38
- /**
39
- * Provider configuration
40
- * Maps provider names to their API keys
41
- */
42
- providers?: Record<string, {
43
- apiKey: string;
44
- /** Override the base URL for this provider */
45
- baseURL?: string;
46
- }>;
47
- /**
48
- * Cost limits per provider
49
- */
50
- budgetLimits?: Record<string, {
51
- maxCostPerRequest?: number;
52
- maxRequestsPerMinute?: number;
53
- }>;
54
- }
55
- /**
56
- * A3M Router response from /route or /generate
57
- */
58
- export interface A3MRouteResponse {
59
- /** The generated content */
60
- content: string;
61
- /** The provider that was selected */
62
- provider: string;
63
- /** The model that was used */
64
- model: string;
65
- /** Cost in USD */
66
- cost: number;
67
- /** Latency in ms */
68
- latencyMs: number;
69
- /** Token usage */
70
- usage?: {
71
- promptTokens: number;
72
- completionTokens: number;
73
- totalTokens: number;
74
- };
75
- /** Confidence score (0-1) */
76
- confidence?: number;
77
- /** Finish reason */
78
- finishReason?: 'stop' | 'length' | 'error';
79
- }
80
- /**
81
- * A3M Router streaming response chunk
82
- */
83
- export interface A3MStreamChunk {
84
- /** The delta content */
85
- delta: string;
86
- /** Provider that responded */
87
- provider: string;
88
- /** Whether this is the final chunk */
89
- done: boolean;
90
- /** Token usage (only on final chunk) */
91
- usage?: {
92
- promptTokens: number;
93
- completionTokens: number;
94
- totalTokens: number;
95
- };
96
- }
97
- //# sourceMappingURL=types.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,eAAe;IAC9B;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAE3B;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB;;OAEG;IACH,KAAK,CAAC,EAAE;QACN,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,GAAG,CAAC,EAAE,MAAM,CAAC;KACd,CAAC;IAEF;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QACzB,MAAM,EAAE,MAAM,CAAC;QACf,8CAA8C;QAC9C,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC,CAAC;IAEH;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QAC5B,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAC3B,oBAAoB,CAAC,EAAE,MAAM,CAAC;KAC/B,CAAC,CAAC;CACJ;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,4BAA4B;IAC5B,OAAO,EAAE,MAAM,CAAC;IAEhB,qCAAqC;IACrC,QAAQ,EAAE,MAAM,CAAC;IAEjB,8BAA8B;IAC9B,KAAK,EAAE,MAAM,CAAC;IAEd,kBAAkB;IAClB,IAAI,EAAE,MAAM,CAAC;IAEb,oBAAoB;IACpB,SAAS,EAAE,MAAM,CAAC;IAElB,kBAAkB;IAClB,KAAK,CAAC,EAAE;QACN,YAAY,EAAE,MAAM,CAAC;QACrB,gBAAgB,EAAE,MAAM,CAAC;QACzB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;IAEF,6BAA6B;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,oBAAoB;IACpB,YAAY,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;CAC5C;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,wBAAwB;IACxB,KAAK,EAAE,MAAM,CAAC;IAEd,8BAA8B;IAC9B,QAAQ,EAAE,MAAM,CAAC;IAEjB,sCAAsC;IACtC,IAAI,EAAE,OAAO,CAAC;IAEd,wCAAwC;IACxC,KAAK,CAAC,EAAE;QACN,YAAY,EAAE,MAAM,CAAC;QACrB,gBAAgB,EAAE,MAAM,CAAC;QACzB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;CACH"}
@@ -1,5 +0,0 @@
1
- /**
2
- * A3M Router configuration for Vercel AI SDK
3
- */
4
- export {};
5
- //# sourceMappingURL=types.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -1,328 +0,0 @@
1
- /**
2
- * Tests for SkillManager and TMLEnhancedAgent
3
- */
4
-
5
- import { describe, it, expect, beforeEach, jest } from '@jest/globals';
6
- import { SkillManager, Skill } from '../skill_manager';
7
- import { TMLEnhancedAgent } from '../../agents/skill_enhanced_agent';
8
- import * as fs from 'fs';
9
- import * as path from 'path';
10
-
11
- // Mock fs operations
12
- jest.mock('fs');
13
-
14
- describe('SkillManager', () => {
15
- let skillManager: SkillManager;
16
- const mockSkillsDir = '/mock/skills';
17
-
18
- beforeEach(() => {
19
- jest.clearAllMocks();
20
- skillManager = new SkillManager(mockSkillsDir);
21
- });
22
-
23
- describe('initialization', () => {
24
- it('should create skill manager instance', () => {
25
- expect(skillManager).toBeInstanceOf(SkillManager);
26
- expect(skillManager.skills_dir).toBeDefined();
27
- });
28
-
29
- it('should have empty skills initially if directory does not exist', () => {
30
- expect(skillManager.list_skills()).toEqual([]);
31
- });
32
- });
33
-
34
- describe('load_skills_metadata', () => {
35
- it('should load skill metadata from SKILL.md files', () => {
36
- // Mock directory listing and file reading
37
- const mockSkillMD = `---
38
- name: "Test Skill"
39
- description: "A test skill for testing"
40
- ---
41
- # Test Skill Content`;
42
-
43
- jest.spyOn(fs, 'existsSync').mockReturnValue(true);
44
- jest.spyOn(Path.prototype, 'isDirectory').mockReturnValue(true);
45
- jest.spyOn(Path.prototype, 'iterdir').mockReturnValue([
46
- { name: 'SKILL.md', isFile: () => true }
47
- ] as any);
48
- jest.spyOn(fs, 'readFileSync').mockReturnValue(mockSkillMD);
49
-
50
- skillManager.reload_skills();
51
-
52
- expect(skillManager.list_skills()).toContain('Test Skill');
53
- });
54
-
55
- it('should skip directories without SKILL.md', () => {
56
- jest.spyOn(Path.prototype, 'existsSync').mockReturnValue(false);
57
-
58
- skillManager.reload_skills();
59
-
60
- expect(skillManager.list_skills()).toEqual([]);
61
- });
62
- });
63
-
64
- describe('get_relevant_skills', () => {
65
- beforeEach(() => {
66
- // Add mock skills
67
- skillManager.skills['React Development'] = new Skill(
68
- 'React Development',
69
- 'Best practices for React components',
70
- Path('/mock/react'),
71
- {}
72
- );
73
-
74
- skillManager.skills['Node.js API'] = new Skill(
75
- 'Node.js API',
76
- 'Building backend APIs with Node.js and Express',
77
- Path('/mock/nodejs'),
78
- {}
79
- );
80
-
81
- skillManager.skills['Python Django'] = new Skill(
82
- 'Python Django',
83
- 'Django web framework for Python',
84
- Path('/mock/python'),
85
- {}
86
- );
87
- });
88
-
89
- it('should find skills with keyword matching', () => {
90
- const relevant = skillManager.get_relevant_skills(
91
- 'Build a React component for user login',
92
- 2
93
- );
94
-
95
- expect(relevant).toContain('React Development');
96
- });
97
-
98
- it('should return skills ordered by relevance', () => {
99
- const relevant = skillManager.get_relevant_skills(
100
- 'Create a React component with Node.js backend',
101
- 3
102
- );
103
-
104
- // React should come first (exact match)
105
- expect(relevant[0]).toBe('React Development');
106
- expect(relevant).toContain('Node.js API');
107
- });
108
-
109
- it('should respect threshold parameter', () => {
110
- const relevant = skillManager.get_relevant_skills(
111
- 'Build a Go microservice',
112
- 2,
113
- 0.5 // Higher threshold
114
- );
115
-
116
- // Should return fewer or no skills due to high threshold
117
- expect(relevant.length).toBeLessThanOrEqual(2);
118
- });
119
- });
120
-
121
- describe('load_skill', () => {
122
- it('should load full skill content on first call', () => {
123
- const mockSkill = skillManager.skills['React Development'];
124
- mockSkill.content = null;
125
-
126
- const mockContent = '# React Development\n\nBest practices...';
127
-
128
- jest.spyOn(fs, 'readFileSync').mockReturnValue(
129
- `---\nname: "React Development"\ndescription: "Best practices"\n---\n${mockContent}`
130
- );
131
-
132
- const loaded = skillManager.load_skill('React Development');
133
-
134
- expect(loaded.content).toBe(mockContent);
135
- expect(loaded.loaded_at).toBeDefined();
136
- });
137
-
138
- it('should return cached content on subsequent calls', () => {
139
- const mockSkill = skillManager.skills['React Development'];
140
- mockSkill.content = 'Cached content';
141
-
142
- const loaded1 = skillManager.load_skill('React Development');
143
- const loaded2 = skillManager.load_skill('React Development');
144
-
145
- expect(loaded1).toBe(loaded2);
146
- expect(loaded1.content).toBe('Cached content');
147
- });
148
-
149
- it('should throw error for non-existent skill', () => {
150
- expect(() => {
151
- skillManager.load_skill('Non-existent Skill');
152
- }).toThrow("Skill 'Non-existent Skill' not found");
153
- });
154
- });
155
-
156
- describe('validate_skill', () => {
157
- it('should return validation results for existing skill', () => {
158
- const mockSkill = skillManager.skills['React Development'];
159
-
160
- jest.spyOn(skillManager, 'list_additional_files').mockReturnValue([]);
161
-
162
- const validation = skillManager.validate_skill('React Development');
163
-
164
- expect(validation).toHaveProperty('exists', true);
165
- expect(validation).toHaveProperty('has_name', true);
166
- expect(validation).toHaveProperty('has_description', true);
167
- });
168
-
169
- it('should return all false for non-existent skill', () => {
170
- const validation = skillManager.validate_skill('Non-existent');
171
-
172
- expect(validation.exists).toBe(false);
173
- expect(validation.has_skill_md).toBe(false);
174
- });
175
- });
176
- });
177
-
178
- describe('TMLEnhancedAgent', () => {
179
- let agent: TMLEnhancedAgent;
180
-
181
- beforeEach(() => {
182
- agent = new TMLEnhancedAgent(
183
- 'frontend-agent',
184
- 'anthropic',
185
- 'claude-sonnet-4',
186
- 'mock-skills',
187
- ['React Frontend Development', 'TypeScript Best Practices']
188
- );
189
- });
190
-
191
- describe('initialization', () => {
192
- it('should create agent with configuration', () => {
193
- expect(agent.agent_id).toBe('frontend-agent');
194
- expect(agent.provider).toBe('anthropic');
195
- expect(agent.model).toBe('claude-sonnet-4');
196
- });
197
-
198
- it('should initialize with assigned skills', () => {
199
- expect(agent.assigned_skills).toContain('React Frontend Development');
200
- expect(agent.assigned_skills).toContain('TypeScript Best Practices');
201
- });
202
- });
203
-
204
- describe('execute_task', () => {
205
- it('should execute task with relevant skills', async () => {
206
- const task = {
207
- description: 'Build a React login form component',
208
- context: 'Must include email and password fields',
209
- requirements: 'Use TypeScript and Material-UI'
210
- };
211
-
212
- // Mock skill loading
213
- jest.spyOn(agent, '_get_relevant_skills').mockReturnValue([]);
214
-
215
- // Mock LLM call
216
- jest.spyOn(agent, '_execute_llm_call').mockReturnValue({
217
- success: true,
218
- output: 'React component code...',
219
- tokens_used: 150,
220
- cost: 0.015,
221
- execution_time: 3.2
222
- });
223
-
224
- const result = agent.execute_task(task);
225
-
226
- expect(result.success).toBe(true);
227
- expect(result.output).toBeDefined();
228
- });
229
-
230
- it('should remember successful patterns', () => {
231
- const task = { description: 'Test task' };
232
-
233
- jest.spyOn(agent, '_get_relevant_skills').mockReturnValue([]);
234
- jest.spyOn(agent, '_execute_llm_call').mockReturnValue({
235
- success: true,
236
- output: 'Success'
237
- });
238
-
239
- jest.spyOn(agent, '_remember_success_pattern').mockImplementation(() => {});
240
-
241
- agent.execute_task(task);
242
-
243
- expect(agent._remember_success_pattern).toHaveBeenCalled();
244
- });
245
- });
246
-
247
- describe('skill management', () => {
248
- it('should add skill to agent', () => {
249
- agent.add_skill('Jest Testing');
250
-
251
- expect(agent.assigned_skills).toContain('Jest Testing');
252
- });
253
-
254
- it('should remove skill from agent', () => {
255
- agent.remove_skill('TypeScript Best Practices');
256
-
257
- expect(agent.assigned_skills).not.toContain('TypeScript Best Practices');
258
- });
259
-
260
- it('should list all available skills', () => {
261
- jest.spyOn(agent.skill_manager, 'list_skills').mockReturnValue([
262
- 'Skill 1',
263
- 'Skill 2',
264
- 'Skill 3'
265
- ]);
266
-
267
- const skills = agent.list_available_skills();
268
-
269
- expect(skills).toHaveLength(3);
270
- });
271
- });
272
-
273
- describe('serialization', () => {
274
- it('should convert to dictionary', () => {
275
- const dict = agent.to_dict();
276
-
277
- expect(dict).toHaveProperty('agent_id', 'frontend-agent');
278
- expect(dict).toHaveProperty('provider', 'anthropic');
279
- expect(dict).toHaveProperty('model', 'claude-sonnet-4');
280
- expect(dict).toHaveProperty('assigned_skills');
281
- expect(dict).toHaveProperty('available_skills');
282
- });
283
- });
284
- });
285
-
286
- describe('TMLEnhancedAgentFactory', () => {
287
- describe('create_from_config', () => {
288
- it('should create agent from config', () => {
289
- const config = {
290
- id: 'test-agent',
291
- provider: 'openai',
292
- model: 'gpt-4-turbo',
293
- skills_dir: 'test-skills',
294
- skills: ['Test Skill']
295
- };
296
-
297
- const agent = TMLEnhancedAgentFactory.create_from_config(config);
298
-
299
- expect(agent).toBeInstanceOf(TMLEnhancedAgent);
300
- expect(agent.agent_id).toBe('test-agent');
301
- });
302
- });
303
-
304
- describe('create_multiple_from_config', () => {
305
- it('should create multiple agents from config list', () => {
306
- const configs = [
307
- {
308
- id: 'agent-1',
309
- provider: 'anthropic',
310
- model: 'claude-sonnet-4',
311
- skills: ['Skill A']
312
- },
313
- {
314
- id: 'agent-2',
315
- provider: 'openai',
316
- model: 'gpt-4-turbo',
317
- skills: ['Skill B']
318
- }
319
- ];
320
-
321
- const agents = TMLEnhancedAgentFactory.create_multiple_from_config(configs);
322
-
323
- expect(agents).toHaveLength(2);
324
- expect(agents[0].agent_id).toBe('agent-1');
325
- expect(agents[1].agent_id).toBe('agent-2');
326
- });
327
- });
328
- });
@@ -1,114 +0,0 @@
1
- /**
2
- * TMLPD Prefix Cache - RadixAttention Style
3
- *
4
- * Inspired by SGLang's RadixAttention (arXiv:2312.07104)
5
- * Caches KV states for common prefixes (system prompts, etc.)
6
- * 5-10x speedup for repeated prompt patterns
7
- */
8
- export interface CacheEntry {
9
- key: string;
10
- prefix: string;
11
- kv_state?: Buffer;
12
- response_hash?: string;
13
- hit_count: number;
14
- last_used: number;
15
- token_count: number;
16
- children: Map<string, string>;
17
- }
18
- export interface PrefixCacheStats {
19
- total_entries: number;
20
- total_hits: number;
21
- total_misses: number;
22
- hit_rate: number;
23
- memory_estimate_mb: number;
24
- oldest_entry_age_ms: number;
25
- }
26
- export declare class PrefixCache {
27
- private entries;
28
- private access_order;
29
- private max_entries;
30
- private max_memory_mb;
31
- constructor(options?: {
32
- max_entries?: number;
33
- max_memory_mb?: number;
34
- });
35
- /**
36
- * Generate cache key from text prefix
37
- */
38
- private generateKey;
39
- /**
40
- * Check if prefix is cached
41
- */
42
- has(prefix: string, model?: string): boolean;
43
- /**
44
- * Get cached entry
45
- */
46
- get(prefix: string, model?: string): CacheEntry | undefined;
47
- /**
48
- * Store a new prefix with its KV state
49
- */
50
- store(prefix: string, options?: {
51
- kv_state?: Buffer;
52
- response_hash?: string;
53
- model?: string;
54
- children?: Map<string, string>;
55
- }): string;
56
- /**
57
- * Extend cached prefix with completion
58
- */
59
- extend(prefix: string, completion: string, options?: {
60
- model?: string;
61
- }): string;
62
- /**
63
- * Find common prefix between two texts
64
- */
65
- findCommonPrefix(text1: string, text2: string): string;
66
- /**
67
- * Lookup with prefix matching
68
- * Returns cached entry if any prefix is found
69
- */
70
- lookup(text: string, model?: string): {
71
- cached: boolean;
72
- prefix?: string;
73
- remaining?: string;
74
- };
75
- /**
76
- * Batch lookup for multiple texts
77
- */
78
- lookupBatch(texts: string[], model?: string): Array<{
79
- cached: boolean;
80
- prefix?: string;
81
- remaining?: string;
82
- }>;
83
- /**
84
- * Get cache statistics
85
- */
86
- getStats(): PrefixCacheStats;
87
- /**
88
- * Get estimated memory usage
89
- */
90
- private getMemoryUsage;
91
- /**
92
- * Update LRU order
93
- */
94
- private updateLRU;
95
- /**
96
- * Evict least recently used entry
97
- */
98
- private evictLRU;
99
- /**
100
- * Clear all cache
101
- */
102
- clear(): void;
103
- /**
104
- * Invalidate entries matching pattern
105
- */
106
- invalidate(pattern?: string): number;
107
- /**
108
- * Warm up cache with common system prompts
109
- */
110
- warmup(common_prefixes: string[], model?: string): void;
111
- }
112
- export default PrefixCache;
113
- export declare function createWarmedCache(): PrefixCache;
114
- //# sourceMappingURL=prefixCache.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"prefixCache.d.ts","sourceRoot":"","sources":["../../src/cache/prefixCache.ts"],"names":[],"mappings":"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"}