mozart-router 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (238) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +250 -0
  3. package/dist/adapters/cursor.d.ts +10 -0
  4. package/dist/adapters/cursor.d.ts.map +1 -0
  5. package/dist/adapters/cursor.js +39 -0
  6. package/dist/adapters/cursor.js.map +1 -0
  7. package/dist/adapters/generic.d.ts +24 -0
  8. package/dist/adapters/generic.d.ts.map +1 -0
  9. package/dist/adapters/generic.js +192 -0
  10. package/dist/adapters/generic.js.map +1 -0
  11. package/dist/adapters/hermes.d.ts +10 -0
  12. package/dist/adapters/hermes.d.ts.map +1 -0
  13. package/dist/adapters/hermes.js +170 -0
  14. package/dist/adapters/hermes.js.map +1 -0
  15. package/dist/adapters/index.d.ts +13 -0
  16. package/dist/adapters/index.d.ts.map +1 -0
  17. package/dist/adapters/index.js +27 -0
  18. package/dist/adapters/index.js.map +1 -0
  19. package/dist/adapters/litellm.d.ts +15 -0
  20. package/dist/adapters/litellm.d.ts.map +1 -0
  21. package/dist/adapters/litellm.js +238 -0
  22. package/dist/adapters/litellm.js.map +1 -0
  23. package/dist/adapters/lmstudio.d.ts +12 -0
  24. package/dist/adapters/lmstudio.d.ts.map +1 -0
  25. package/dist/adapters/lmstudio.js +128 -0
  26. package/dist/adapters/lmstudio.js.map +1 -0
  27. package/dist/adapters/nim.d.ts +12 -0
  28. package/dist/adapters/nim.d.ts.map +1 -0
  29. package/dist/adapters/nim.js +163 -0
  30. package/dist/adapters/nim.js.map +1 -0
  31. package/dist/adapters/ollama.d.ts +12 -0
  32. package/dist/adapters/ollama.d.ts.map +1 -0
  33. package/dist/adapters/ollama.js +243 -0
  34. package/dist/adapters/ollama.js.map +1 -0
  35. package/dist/adapters/openclaw.d.ts +10 -0
  36. package/dist/adapters/openclaw.d.ts.map +1 -0
  37. package/dist/adapters/openclaw.js +197 -0
  38. package/dist/adapters/openclaw.js.map +1 -0
  39. package/dist/adapters/opencode.d.ts +10 -0
  40. package/dist/adapters/opencode.d.ts.map +1 -0
  41. package/dist/adapters/opencode.js +180 -0
  42. package/dist/adapters/opencode.js.map +1 -0
  43. package/dist/adapters/openrouter.d.ts +13 -0
  44. package/dist/adapters/openrouter.d.ts.map +1 -0
  45. package/dist/adapters/openrouter.js +173 -0
  46. package/dist/adapters/openrouter.js.map +1 -0
  47. package/dist/adapters/vllm.d.ts +12 -0
  48. package/dist/adapters/vllm.d.ts.map +1 -0
  49. package/dist/adapters/vllm.js +129 -0
  50. package/dist/adapters/vllm.js.map +1 -0
  51. package/dist/api/dashboard.d.ts +3 -0
  52. package/dist/api/dashboard.d.ts.map +1 -0
  53. package/dist/api/dashboard.js +98 -0
  54. package/dist/api/dashboard.js.map +1 -0
  55. package/dist/api/mcp.d.ts +32 -0
  56. package/dist/api/mcp.d.ts.map +1 -0
  57. package/dist/api/mcp.js +215 -0
  58. package/dist/api/mcp.js.map +1 -0
  59. package/dist/api/middleware.d.ts +20 -0
  60. package/dist/api/middleware.d.ts.map +1 -0
  61. package/dist/api/middleware.js +239 -0
  62. package/dist/api/middleware.js.map +1 -0
  63. package/dist/api/server.d.ts +26 -0
  64. package/dist/api/server.d.ts.map +1 -0
  65. package/dist/api/server.js +294 -0
  66. package/dist/api/server.js.map +1 -0
  67. package/dist/api/streaming.d.ts +19 -0
  68. package/dist/api/streaming.d.ts.map +1 -0
  69. package/dist/api/streaming.js +274 -0
  70. package/dist/api/streaming.js.map +1 -0
  71. package/dist/cli/config-init.d.ts +2 -0
  72. package/dist/cli/config-init.d.ts.map +1 -0
  73. package/dist/cli/config-init.js +73 -0
  74. package/dist/cli/config-init.js.map +1 -0
  75. package/dist/cli/main.d.ts +3 -0
  76. package/dist/cli/main.d.ts.map +1 -0
  77. package/dist/cli/main.js +618 -0
  78. package/dist/cli/main.js.map +1 -0
  79. package/dist/context/advanced-optimizer.d.ts +12 -0
  80. package/dist/context/advanced-optimizer.d.ts.map +1 -0
  81. package/dist/context/advanced-optimizer.js +64 -0
  82. package/dist/context/advanced-optimizer.js.map +1 -0
  83. package/dist/context/optimizer.d.ts +7 -0
  84. package/dist/context/optimizer.d.ts.map +1 -0
  85. package/dist/context/optimizer.js +101 -0
  86. package/dist/context/optimizer.js.map +1 -0
  87. package/dist/core/cache.d.ts +39 -0
  88. package/dist/core/cache.d.ts.map +1 -0
  89. package/dist/core/cache.js +90 -0
  90. package/dist/core/cache.js.map +1 -0
  91. package/dist/core/health.d.ts +32 -0
  92. package/dist/core/health.d.ts.map +1 -0
  93. package/dist/core/health.js +92 -0
  94. package/dist/core/health.js.map +1 -0
  95. package/dist/core/inventory.d.ts +28 -0
  96. package/dist/core/inventory.d.ts.map +1 -0
  97. package/dist/core/inventory.js +106 -0
  98. package/dist/core/inventory.js.map +1 -0
  99. package/dist/core/metrics.d.ts +48 -0
  100. package/dist/core/metrics.d.ts.map +1 -0
  101. package/dist/core/metrics.js +115 -0
  102. package/dist/core/metrics.js.map +1 -0
  103. package/dist/core/mozart.d.ts +39 -0
  104. package/dist/core/mozart.d.ts.map +1 -0
  105. package/dist/core/mozart.js +156 -0
  106. package/dist/core/mozart.js.map +1 -0
  107. package/dist/core/persistence.d.ts +13 -0
  108. package/dist/core/persistence.d.ts.map +1 -0
  109. package/dist/core/persistence.js +119 -0
  110. package/dist/core/persistence.js.map +1 -0
  111. package/dist/core/plugins.d.ts +18 -0
  112. package/dist/core/plugins.d.ts.map +1 -0
  113. package/dist/core/plugins.js +110 -0
  114. package/dist/core/plugins.js.map +1 -0
  115. package/dist/core/reliability.d.ts +23 -0
  116. package/dist/core/reliability.d.ts.map +1 -0
  117. package/dist/core/reliability.js +70 -0
  118. package/dist/core/reliability.js.map +1 -0
  119. package/dist/core/session.d.ts +17 -0
  120. package/dist/core/session.d.ts.map +1 -0
  121. package/dist/core/session.js +67 -0
  122. package/dist/core/session.js.map +1 -0
  123. package/dist/cost/dynamic-pricing.d.ts +24 -0
  124. package/dist/cost/dynamic-pricing.d.ts.map +1 -0
  125. package/dist/cost/dynamic-pricing.js +71 -0
  126. package/dist/cost/dynamic-pricing.js.map +1 -0
  127. package/dist/cost/estimator.d.ts +8 -0
  128. package/dist/cost/estimator.d.ts.map +1 -0
  129. package/dist/cost/estimator.js +48 -0
  130. package/dist/cost/estimator.js.map +1 -0
  131. package/dist/explain/engine.d.ts +6 -0
  132. package/dist/explain/engine.d.ts.map +1 -0
  133. package/dist/explain/engine.js +59 -0
  134. package/dist/explain/engine.js.map +1 -0
  135. package/dist/index.d.ts +59 -0
  136. package/dist/index.d.ts.map +1 -0
  137. package/dist/index.js +112 -0
  138. package/dist/index.js.map +1 -0
  139. package/dist/logs/logger.d.ts +35 -0
  140. package/dist/logs/logger.d.ts.map +1 -0
  141. package/dist/logs/logger.js +73 -0
  142. package/dist/logs/logger.js.map +1 -0
  143. package/dist/logs/redactor.d.ts +6 -0
  144. package/dist/logs/redactor.d.ts.map +1 -0
  145. package/dist/logs/redactor.js +54 -0
  146. package/dist/logs/redactor.js.map +1 -0
  147. package/dist/policy/engine.d.ts +9 -0
  148. package/dist/policy/engine.d.ts.map +1 -0
  149. package/dist/policy/engine.js +55 -0
  150. package/dist/policy/engine.js.map +1 -0
  151. package/dist/policy/loader.d.ts +3 -0
  152. package/dist/policy/loader.d.ts.map +1 -0
  153. package/dist/policy/loader.js +27 -0
  154. package/dist/policy/loader.js.map +1 -0
  155. package/dist/policy/profiles.d.ts +11 -0
  156. package/dist/policy/profiles.d.ts.map +1 -0
  157. package/dist/policy/profiles.js +263 -0
  158. package/dist/policy/profiles.js.map +1 -0
  159. package/dist/policy/yaml-loader.d.ts +10 -0
  160. package/dist/policy/yaml-loader.d.ts.map +1 -0
  161. package/dist/policy/yaml-loader.js +160 -0
  162. package/dist/policy/yaml-loader.js.map +1 -0
  163. package/dist/privacy/guard.d.ts +8 -0
  164. package/dist/privacy/guard.d.ts.map +1 -0
  165. package/dist/privacy/guard.js +125 -0
  166. package/dist/privacy/guard.js.map +1 -0
  167. package/dist/routing/circuit-breaker.d.ts +23 -0
  168. package/dist/routing/circuit-breaker.d.ts.map +1 -0
  169. package/dist/routing/circuit-breaker.js +74 -0
  170. package/dist/routing/circuit-breaker.js.map +1 -0
  171. package/dist/routing/classifier.d.ts +5 -0
  172. package/dist/routing/classifier.d.ts.map +1 -0
  173. package/dist/routing/classifier.js +102 -0
  174. package/dist/routing/classifier.js.map +1 -0
  175. package/dist/routing/fallback.d.ts +27 -0
  176. package/dist/routing/fallback.d.ts.map +1 -0
  177. package/dist/routing/fallback.js +66 -0
  178. package/dist/routing/fallback.js.map +1 -0
  179. package/dist/routing/multistage.d.ts +49 -0
  180. package/dist/routing/multistage.d.ts.map +1 -0
  181. package/dist/routing/multistage.js +108 -0
  182. package/dist/routing/multistage.js.map +1 -0
  183. package/dist/routing/router.d.ts +22 -0
  184. package/dist/routing/router.d.ts.map +1 -0
  185. package/dist/routing/router.js +123 -0
  186. package/dist/routing/router.js.map +1 -0
  187. package/dist/routing/scorer.d.ts +8 -0
  188. package/dist/routing/scorer.d.ts.map +1 -0
  189. package/dist/routing/scorer.js +131 -0
  190. package/dist/routing/scorer.js.map +1 -0
  191. package/dist/skills/definitions.d.ts +10 -0
  192. package/dist/skills/definitions.d.ts.map +1 -0
  193. package/dist/skills/definitions.js +112 -0
  194. package/dist/skills/definitions.js.map +1 -0
  195. package/dist/skills/index.d.ts +3 -0
  196. package/dist/skills/index.d.ts.map +1 -0
  197. package/dist/skills/index.js +14 -0
  198. package/dist/skills/index.js.map +1 -0
  199. package/dist/types/index.d.ts +298 -0
  200. package/dist/types/index.d.ts.map +1 -0
  201. package/dist/types/index.js +34 -0
  202. package/dist/types/index.js.map +1 -0
  203. package/dist/utils/canrunit.d.ts +26 -0
  204. package/dist/utils/canrunit.d.ts.map +1 -0
  205. package/dist/utils/canrunit.js +69 -0
  206. package/dist/utils/canrunit.js.map +1 -0
  207. package/dist/utils/dealsforge.d.ts +6 -0
  208. package/dist/utils/dealsforge.d.ts.map +1 -0
  209. package/dist/utils/dealsforge.js +105 -0
  210. package/dist/utils/dealsforge.js.map +1 -0
  211. package/docs/ADAPTERS.md +129 -0
  212. package/docs/ARCHITECTURE.md +113 -0
  213. package/docs/DELEGATED_EXECUTION.md +62 -0
  214. package/docs/FEATURE_MATRIX.md +113 -0
  215. package/docs/GATEWAY_FIRST_PRINCIPLES.md +66 -0
  216. package/docs/INTEGRATIONS.md +94 -0
  217. package/docs/LIMITATIONS.md +43 -0
  218. package/docs/RECOMMEND_ONLY_MODE.md +82 -0
  219. package/docs/ROADMAP.md +70 -0
  220. package/docs/SECURITY.md +74 -0
  221. package/docs/SKILLS_AND_TOOLS.md +141 -0
  222. package/examples/community-adapter/TEMPLATE.md +157 -0
  223. package/examples/generic-tools/README.md +29 -0
  224. package/examples/generic-tools/mozart-tools.json +86 -0
  225. package/examples/hermes/README.md +29 -0
  226. package/examples/hermes/mozart-tool.json +48 -0
  227. package/examples/litellm/README.md +21 -0
  228. package/examples/litellm/config.yaml +39 -0
  229. package/examples/ollama/README.md +37 -0
  230. package/examples/ollama/usage.ts +59 -0
  231. package/examples/openclaw/README.md +26 -0
  232. package/examples/openclaw/mozart-skill.yaml +80 -0
  233. package/examples/opencode/README.md +30 -0
  234. package/examples/opencode/SKILL.md +47 -0
  235. package/examples/opencode/mozart-skill.json +64 -0
  236. package/examples/openrouter/README.md +21 -0
  237. package/examples/openrouter/config.json +14 -0
  238. package/package.json +53 -0
@@ -0,0 +1,98 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.dashboardHtml = dashboardHtml;
4
+ // Lightweight local dashboard served inline by the API server.
5
+ // No framework, no build step, no external dependencies.
6
+ // Pure HTML/CSS served by the existing Node.js http server.
7
+ function dashboardHtml(mozart) {
8
+ const snapshot = mozart.getInventory();
9
+ const activeGateways = snapshot.gateways.filter((g) => g.detected);
10
+ const report = mozart.generateReport();
11
+ return `<!DOCTYPE html>
12
+ <html lang="en">
13
+ <head>
14
+ <meta charset="UTF-8">
15
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
16
+ <title>Mozart Dashboard</title>
17
+ <style>
18
+ *{margin:0;padding:0;box-sizing:border-box}
19
+ body{font-family:system-ui,-apple-system,sans-serif;background:#0d1117;color:#c9d1d9;padding:2rem}
20
+ h1{color:#58a6ff;font-size:1.5rem;margin-bottom:.5rem}
21
+ h2{color:#f0f6fc;font-size:1.1rem;margin:1.5rem 0 .5rem;border-bottom:1px solid #21262d;padding-bottom:.25rem}
22
+ .sub{color:#8b949e;font-size:.85rem;margin-bottom:1.5rem}
23
+ .cards{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:1rem;margin-bottom:1.5rem}
24
+ .card{background:#161b22;border:1px solid #21262d;border-radius:6px;padding:1rem}
25
+ .card .value{font-size:1.8rem;font-weight:600;color:#58a6ff}
26
+ .card .label{font-size:.8rem;color:#8b949e;margin-top:.25rem}
27
+ table{width:100%;border-collapse:collapse;margin-top:.5rem}
28
+ th,td{text-align:left;padding:.5rem .75rem;border-bottom:1px solid #21262d;font-size:.85rem}
29
+ th{color:#8b949e;font-weight:500}
30
+ .green{color:#3fb950}
31
+ .yellow{color:#d29922}
32
+ .red{color:#f85149}
33
+ .tag{display:inline-block;padding:2px 8px;border-radius:12px;font-size:.75rem;font-weight:500}
34
+ .tag-green{background:#23863633;color:#3fb950;border:1px solid #238636}
35
+ .tag-yellow{background:#9e6a0333;color:#d29922;border:1px solid #9e6a03}
36
+ .tag-gray{background:#21262d;color:#8b949e;border:1px solid #30363d}
37
+ .proto{background:#161b22;border-left:3px solid #58a6ff;padding:.75rem 1rem;margin:1rem 0;border-radius:4px;font-size:.85rem;color:#8b949e}
38
+ pre{background:#161b22;border-radius:4px;padding:.75rem;font-size:.8rem;overflow-x:auto;margin-top:.5rem;border:1px solid #21262d}
39
+ </style>
40
+ </head>
41
+ <body>
42
+ <h1>Mozart Dashboard</h1>
43
+ <p class="sub">Local conductor for AI agents — v0.1.0</p>
44
+
45
+ <div class="proto">Gateways execute. Mozart decides.<br>Do not rebuild what the gateway already does. Detect it, understand it, orchestrate it.</div>
46
+
47
+ <h2>Overview</h2>
48
+ <div class="cards">
49
+ <div class="card"><div class="value">${activeGateways.length}</div><div class="label">Active Gateways</div></div>
50
+ <div class="card"><div class="value">${snapshot.providers.length}</div><div class="label">Providers</div></div>
51
+ <div class="card"><div class="value">${snapshot.models.length}</div><div class="label">Models</div></div>
52
+ <div class="card"><div class="value">${snapshot.models.filter((m) => m.privacyLevel === 'local').length}</div><div class="label">Local Models</div></div>
53
+ </div>
54
+
55
+ <h2>Gateways</h2>
56
+ <table>
57
+ <tr><th>Gateway</th><th>Status</th><th>Models</th></tr>
58
+ ${snapshot.gateways.map((g) => `
59
+ <tr>
60
+ <td>${g.gatewayName}</td>
61
+ <td><span class="tag ${g.detected ? 'tag-green' : 'tag-gray'}">${g.status}</span></td>
62
+ <td>${snapshot.models.filter((m) => m.gatewayId === g.gatewayId).length}</td>
63
+ </tr>`).join('')}
64
+ </table>
65
+
66
+ <h2>Models</h2>
67
+ <table>
68
+ <tr><th>Model</th><th>Provider</th><th>Gateway</th><th>Privacy</th><th>Quality</th></tr>
69
+ ${snapshot.models.map((m) => `
70
+ <tr>
71
+ <td>${m.id}</td>
72
+ <td>${m.providerId}</td>
73
+ <td>${m.gatewayId ?? '-'}</td>
74
+ <td><span class="tag ${m.privacyLevel === 'local' ? 'tag-green' : 'tag-yellow'}">${m.privacyLevel}</span></td>
75
+ <td>${m.qualityClass}</td>
76
+ </tr>`).join('')}
77
+ </table>
78
+
79
+ <h2>Session Report</h2>
80
+ <pre>${report}</pre>
81
+
82
+ <h2>API Endpoints</h2>
83
+ <pre>
84
+ GET /health
85
+ GET /v1/inventory
86
+ POST /v1/route
87
+ POST /v1/simulate
88
+ POST /v1/explain
89
+ GET /v1/report
90
+ POST /v1/context/compress
91
+ POST /v1/policy/evaluate
92
+ </pre>
93
+
94
+ <p style="margin-top:2rem;color:#30363d;font-size:.75rem">Mozart v0.1.0 — MIT License — <a href="https://github.com/ucav/mozart-router" style="color:#30363d">github.com/ucav/mozart-router</a></p>
95
+ </body>
96
+ </html>`;
97
+ }
98
+ //# sourceMappingURL=dashboard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard.js","sourceRoot":"","sources":["../../src/api/dashboard.ts"],"names":[],"mappings":";;AASA,sCA2FC;AA/FD,+DAA+D;AAC/D,yDAAyD;AACzD,4DAA4D;AAE5D,SAAgB,aAAa,CAAC,MAAc;IAC1C,MAAM,QAAQ,GAAG,MAAM,CAAC,YAAY,EAAE,CAAC;IACvC,MAAM,cAAc,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IACnE,MAAM,MAAM,GAAG,MAAM,CAAC,cAAc,EAAE,CAAC;IAEvC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;uCAsC8B,cAAc,CAAC,MAAM;uCACrB,QAAQ,CAAC,SAAS,CAAC,MAAM;uCACzB,QAAQ,CAAC,MAAM,CAAC,MAAM;uCACtB,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,KAAK,OAAO,CAAC,CAAC,MAAM;;;;;;EAMrG,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;;QAEvB,CAAC,CAAC,WAAW;yBACI,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,UAAU,KAAK,CAAC,CAAC,MAAM;QACnE,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,CAAC,CAAC,SAAS,CAAC,CAAC,MAAM;MACnE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;;;;;;EAMd,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;;QAErB,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC,UAAU;QACZ,CAAC,CAAC,SAAS,IAAI,GAAG;yBACD,CAAC,CAAC,YAAY,KAAK,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,YAAY;QAC3F,CAAC,CAAC,YAAY;MAChB,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;;;;OAIT,MAAM;;;;;;;;;;;;;;;;QAgBL,CAAC;AACT,CAAC"}
@@ -0,0 +1,32 @@
1
+ import { Mozart } from '../core/mozart';
2
+ export interface McpToolDefinition {
3
+ name: string;
4
+ description: string;
5
+ inputSchema: {
6
+ type: 'object';
7
+ properties: Record<string, unknown>;
8
+ required?: string[];
9
+ };
10
+ }
11
+ export interface McpRequest {
12
+ jsonrpc: '2.0';
13
+ id: number | string;
14
+ method: string;
15
+ params?: Record<string, unknown>;
16
+ }
17
+ export interface McpResponse {
18
+ jsonrpc: '2.0';
19
+ id: number | string;
20
+ result?: unknown;
21
+ error?: {
22
+ code: number;
23
+ message: string;
24
+ };
25
+ }
26
+ export declare class MozartMcpServer {
27
+ private mozart;
28
+ constructor(mozart: Mozart);
29
+ getTools(): McpToolDefinition[];
30
+ handleRequest(request: McpRequest): Promise<McpResponse>;
31
+ }
32
+ //# sourceMappingURL=mcp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../../src/api/mcp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAMxC,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ,CAAC;QACf,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACpC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;KACrB,CAAC;CACH;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,KAAK,CAAC;IACf,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,KAAK,CAAC;IACf,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CAC3C;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAAS;gBAEX,MAAM,EAAE,MAAM;IAI1B,QAAQ,IAAI,iBAAiB,EAAE;IAqEzB,aAAa,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC;CAwJ/D"}
@@ -0,0 +1,215 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MozartMcpServer = void 0;
4
+ class MozartMcpServer {
5
+ mozart;
6
+ constructor(mozart) {
7
+ this.mozart = mozart;
8
+ }
9
+ getTools() {
10
+ return [
11
+ {
12
+ name: 'mozart_route_model',
13
+ description: 'Choose the best available model/provider/gateway for a task based on cost, context, latency, and privacy.',
14
+ inputSchema: {
15
+ type: 'object',
16
+ properties: {
17
+ task: { type: 'string', description: 'The task to route' },
18
+ privacy_mode: { type: 'string', enum: ['open', 'balanced', 'privacy_first', 'local_only'] },
19
+ budget_mode: { type: 'string', enum: ['lowest', 'balanced', 'quality'] },
20
+ },
21
+ required: ['task'],
22
+ },
23
+ },
24
+ {
25
+ name: 'mozart_estimate_cost',
26
+ description: 'Estimate the tokens and cost for a task before execution.',
27
+ inputSchema: {
28
+ type: 'object',
29
+ properties: {
30
+ task: { type: 'string', description: 'Task description' },
31
+ context: { type: 'string', description: 'Context to include' },
32
+ },
33
+ required: ['task'],
34
+ },
35
+ },
36
+ {
37
+ name: 'mozart_privacy_check',
38
+ description: 'Scan content for secrets and sensitive data before sending to models.',
39
+ inputSchema: {
40
+ type: 'object',
41
+ properties: {
42
+ content: { type: 'string', description: 'Content to scan' },
43
+ },
44
+ required: ['content'],
45
+ },
46
+ },
47
+ {
48
+ name: 'mozart_inventory',
49
+ description: 'List all detected gateways, providers, and models.',
50
+ inputSchema: {
51
+ type: 'object',
52
+ properties: {},
53
+ },
54
+ },
55
+ {
56
+ name: 'mozart_compress_context',
57
+ description: 'Optimize and compress context to reduce token usage.',
58
+ inputSchema: {
59
+ type: 'object',
60
+ properties: {
61
+ content: { type: 'string', description: 'Content to compress' },
62
+ max_tokens: { type: 'number', description: 'Maximum tokens' },
63
+ },
64
+ required: ['content'],
65
+ },
66
+ },
67
+ {
68
+ name: 'mozart_report',
69
+ description: 'Get the current session report with routing stats and cost estimates.',
70
+ inputSchema: {
71
+ type: 'object',
72
+ properties: {},
73
+ },
74
+ },
75
+ ];
76
+ }
77
+ async handleRequest(request) {
78
+ const { id, method, params } = request;
79
+ try {
80
+ switch (method) {
81
+ case 'initialize':
82
+ return {
83
+ jsonrpc: '2.0', id,
84
+ result: {
85
+ protocolVersion: '2024-11-05',
86
+ serverInfo: { name: 'mozart-router', version: '0.1.0' },
87
+ capabilities: { tools: {} },
88
+ },
89
+ };
90
+ case 'tools/list':
91
+ return {
92
+ jsonrpc: '2.0', id,
93
+ result: { tools: this.getTools() },
94
+ };
95
+ case 'tools/call': {
96
+ const toolName = params?.name;
97
+ const toolArgs = (params?.arguments ?? {});
98
+ let result;
99
+ switch (toolName) {
100
+ case 'mozart_route_model': {
101
+ const route = await this.mozart.recommend(toolArgs.task);
102
+ result = {
103
+ content: [{
104
+ type: 'text',
105
+ text: JSON.stringify({
106
+ selected_gateway: route.selectedGateway,
107
+ selected_provider: route.selectedProvider,
108
+ selected_model: route.selectedModel,
109
+ confidence: route.confidence,
110
+ estimated_cost: route.estimatedCost,
111
+ explanation: route.explanation,
112
+ fallbacks: route.fallbacks.map((f) => f.selectedModel),
113
+ }, null, 2),
114
+ }],
115
+ };
116
+ break;
117
+ }
118
+ case 'mozart_estimate_cost': {
119
+ const route = await this.mozart.simulate(toolArgs.task);
120
+ result = {
121
+ content: [{
122
+ type: 'text',
123
+ text: JSON.stringify({
124
+ estimated_tokens: route.estimatedTokens,
125
+ estimated_cost: route.estimatedCost,
126
+ selected_model: route.selectedModel,
127
+ }, null, 2),
128
+ }],
129
+ };
130
+ break;
131
+ }
132
+ case 'mozart_privacy_check': {
133
+ const check = this.mozart.privacyGuard.evaluate(toolArgs.content);
134
+ result = {
135
+ content: [{
136
+ type: 'text',
137
+ text: JSON.stringify({
138
+ allowed: check.allowed,
139
+ action: check.action,
140
+ findings_count: check.findings.length,
141
+ findings: check.findings.map((f) => ({ type: f.type, severity: f.severity, action: f.action })),
142
+ }, null, 2),
143
+ }],
144
+ };
145
+ break;
146
+ }
147
+ case 'mozart_inventory': {
148
+ const snapshot = this.mozart.getInventory();
149
+ result = {
150
+ content: [{
151
+ type: 'text',
152
+ text: JSON.stringify({
153
+ gateways: snapshot.gateways.filter((g) => g.detected).map((g) => g.gatewayName),
154
+ providers_count: snapshot.providers.length,
155
+ models_count: snapshot.models.length,
156
+ local_models: snapshot.models.filter((m) => m.privacyLevel === 'local').length,
157
+ cloud_models: snapshot.models.filter((m) => m.privacyLevel === 'cloud').length,
158
+ }, null, 2),
159
+ }],
160
+ };
161
+ break;
162
+ }
163
+ case 'mozart_compress_context': {
164
+ const strategy = this.mozart.contextOptimizer.optimize(toolArgs.content, [], {
165
+ taskType: 'chat', complexity: 'low', contextNeed: 'low', privacyNeed: 'low',
166
+ latencyPreference: 'balanced', costPreference: 'balanced',
167
+ requiresTools: false, requiresJson: false, requiresLongContext: false,
168
+ requiresCodeStrength: false, requiresVision: false, requiresReasoning: false,
169
+ });
170
+ result = {
171
+ content: [{
172
+ type: 'text',
173
+ text: JSON.stringify({
174
+ strategy: strategy.action,
175
+ estimated_input_tokens: strategy.estimatedInputTokens,
176
+ max_tokens: strategy.maxTokens,
177
+ }, null, 2),
178
+ }],
179
+ };
180
+ break;
181
+ }
182
+ case 'mozart_report': {
183
+ result = {
184
+ content: [{
185
+ type: 'text',
186
+ text: this.mozart.generateReport(),
187
+ }],
188
+ };
189
+ break;
190
+ }
191
+ default:
192
+ return {
193
+ jsonrpc: '2.0', id,
194
+ error: { code: -32601, message: `Unknown tool: ${toolName}` },
195
+ };
196
+ }
197
+ return { jsonrpc: '2.0', id, result };
198
+ }
199
+ default:
200
+ return {
201
+ jsonrpc: '2.0', id,
202
+ error: { code: -32601, message: `Unknown method: ${method}` },
203
+ };
204
+ }
205
+ }
206
+ catch (err) {
207
+ return {
208
+ jsonrpc: '2.0', id,
209
+ error: { code: -32000, message: String(err) },
210
+ };
211
+ }
212
+ }
213
+ }
214
+ exports.MozartMcpServer = MozartMcpServer;
215
+ //# sourceMappingURL=mcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/api/mcp.ts"],"names":[],"mappings":";;;AA8BA,MAAa,eAAe;IAClB,MAAM,CAAS;IAEvB,YAAY,MAAc;QACxB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,QAAQ;QACN,OAAO;YACL;gBACE,IAAI,EAAE,oBAAoB;gBAC1B,WAAW,EAAE,2GAA2G;gBACxH,WAAW,EAAE;oBACX,IAAI,EAAE,QAAQ;oBACd,UAAU,EAAE;wBACV,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,mBAAmB,EAAE;wBAC1D,YAAY,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,eAAe,EAAE,YAAY,CAAC,EAAE;wBAC3F,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,QAAQ,EAAE,UAAU,EAAE,SAAS,CAAC,EAAE;qBACzE;oBACD,QAAQ,EAAE,CAAC,MAAM,CAAC;iBACnB;aACF;YACD;gBACE,IAAI,EAAE,sBAAsB;gBAC5B,WAAW,EAAE,2DAA2D;gBACxE,WAAW,EAAE;oBACX,IAAI,EAAE,QAAQ;oBACd,UAAU,EAAE;wBACV,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,kBAAkB,EAAE;wBACzD,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,oBAAoB,EAAE;qBAC/D;oBACD,QAAQ,EAAE,CAAC,MAAM,CAAC;iBACnB;aACF;YACD;gBACE,IAAI,EAAE,sBAAsB;gBAC5B,WAAW,EAAE,uEAAuE;gBACpF,WAAW,EAAE;oBACX,IAAI,EAAE,QAAQ;oBACd,UAAU,EAAE;wBACV,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,iBAAiB,EAAE;qBAC5D;oBACD,QAAQ,EAAE,CAAC,SAAS,CAAC;iBACtB;aACF;YACD;gBACE,IAAI,EAAE,kBAAkB;gBACxB,WAAW,EAAE,oDAAoD;gBACjE,WAAW,EAAE;oBACX,IAAI,EAAE,QAAQ;oBACd,UAAU,EAAE,EAAE;iBACf;aACF;YACD;gBACE,IAAI,EAAE,yBAAyB;gBAC/B,WAAW,EAAE,sDAAsD;gBACnE,WAAW,EAAE;oBACX,IAAI,EAAE,QAAQ;oBACd,UAAU,EAAE;wBACV,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,qBAAqB,EAAE;wBAC/D,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,gBAAgB,EAAE;qBAC9D;oBACD,QAAQ,EAAE,CAAC,SAAS,CAAC;iBACtB;aACF;YACD;gBACE,IAAI,EAAE,eAAe;gBACrB,WAAW,EAAE,uEAAuE;gBACpF,WAAW,EAAE;oBACX,IAAI,EAAE,QAAQ;oBACd,UAAU,EAAE,EAAE;iBACf;aACF;SACF,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,OAAmB;QACrC,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;QAEvC,IAAI,CAAC;YACH,QAAQ,MAAM,EAAE,CAAC;gBACf,KAAK,YAAY;oBACf,OAAO;wBACL,OAAO,EAAE,KAAK,EAAE,EAAE;wBAClB,MAAM,EAAE;4BACN,eAAe,EAAE,YAAY;4BAC7B,UAAU,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,OAAO,EAAE;4BACvD,YAAY,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;yBAC5B;qBACF,CAAC;gBAEJ,KAAK,YAAY;oBACf,OAAO;wBACL,OAAO,EAAE,KAAK,EAAE,EAAE;wBAClB,MAAM,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE;qBACnC,CAAC;gBAEJ,KAAK,YAAY,CAAC,CAAC,CAAC;oBAClB,MAAM,QAAQ,GAAG,MAAM,EAAE,IAAc,CAAC;oBACxC,MAAM,QAAQ,GAAG,CAAC,MAAM,EAAE,SAAS,IAAI,EAAE,CAA4B,CAAC;oBAEtE,IAAI,MAAe,CAAC;oBAEpB,QAAQ,QAAQ,EAAE,CAAC;wBACjB,KAAK,oBAAoB,CAAC,CAAC,CAAC;4BAC1B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAc,CAAC,CAAC;4BACnE,MAAM,GAAG;gCACP,OAAO,EAAE,CAAC;wCACR,IAAI,EAAE,MAAM;wCACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;4CACnB,gBAAgB,EAAE,KAAK,CAAC,eAAe;4CACvC,iBAAiB,EAAE,KAAK,CAAC,gBAAgB;4CACzC,cAAc,EAAE,KAAK,CAAC,aAAa;4CACnC,UAAU,EAAE,KAAK,CAAC,UAAU;4CAC5B,cAAc,EAAE,KAAK,CAAC,aAAa;4CACnC,WAAW,EAAE,KAAK,CAAC,WAAW;4CAC9B,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC;yCACvD,EAAE,IAAI,EAAE,CAAC,CAAC;qCACZ,CAAC;6BACH,CAAC;4BACF,MAAM;wBACR,CAAC;wBAED,KAAK,sBAAsB,CAAC,CAAC,CAAC;4BAC5B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAc,CAAC,CAAC;4BAClE,MAAM,GAAG;gCACP,OAAO,EAAE,CAAC;wCACR,IAAI,EAAE,MAAM;wCACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;4CACnB,gBAAgB,EAAE,KAAK,CAAC,eAAe;4CACvC,cAAc,EAAE,KAAK,CAAC,aAAa;4CACnC,cAAc,EAAE,KAAK,CAAC,aAAa;yCACpC,EAAE,IAAI,EAAE,CAAC,CAAC;qCACZ,CAAC;6BACH,CAAC;4BACF,MAAM;wBACR,CAAC;wBAED,KAAK,sBAAsB,CAAC,CAAC,CAAC;4BAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAiB,CAAC,CAAC;4BAC5E,MAAM,GAAG;gCACP,OAAO,EAAE,CAAC;wCACR,IAAI,EAAE,MAAM;wCACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;4CACnB,OAAO,EAAE,KAAK,CAAC,OAAO;4CACtB,MAAM,EAAE,KAAK,CAAC,MAAM;4CACpB,cAAc,EAAE,KAAK,CAAC,QAAQ,CAAC,MAAM;4CACrC,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;yCAChG,EAAE,IAAI,EAAE,CAAC,CAAC;qCACZ,CAAC;6BACH,CAAC;4BACF,MAAM;wBACR,CAAC;wBAED,KAAK,kBAAkB,CAAC,CAAC,CAAC;4BACxB,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;4BAC5C,MAAM,GAAG;gCACP,OAAO,EAAE,CAAC;wCACR,IAAI,EAAE,MAAM;wCACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;4CACnB,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC;4CAC/E,eAAe,EAAE,QAAQ,CAAC,SAAS,CAAC,MAAM;4CAC1C,YAAY,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM;4CACpC,YAAY,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,KAAK,OAAO,CAAC,CAAC,MAAM;4CAC9E,YAAY,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,KAAK,OAAO,CAAC,CAAC,MAAM;yCAC/E,EAAE,IAAI,EAAE,CAAC,CAAC;qCACZ,CAAC;6BACH,CAAC;4BACF,MAAM;wBACR,CAAC;wBAED,KAAK,yBAAyB,CAAC,CAAC,CAAC;4BAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CACpD,QAAQ,CAAC,OAAiB,EAC1B,EAAE,EACF;gCACE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK;gCAC3E,iBAAiB,EAAE,UAAU,EAAE,cAAc,EAAE,UAAU;gCACzD,aAAa,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,mBAAmB,EAAE,KAAK;gCACrE,oBAAoB,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,iBAAiB,EAAE,KAAK;6BAC7E,CACF,CAAC;4BACF,MAAM,GAAG;gCACP,OAAO,EAAE,CAAC;wCACR,IAAI,EAAE,MAAM;wCACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;4CACnB,QAAQ,EAAE,QAAQ,CAAC,MAAM;4CACzB,sBAAsB,EAAE,QAAQ,CAAC,oBAAoB;4CACrD,UAAU,EAAE,QAAQ,CAAC,SAAS;yCAC/B,EAAE,IAAI,EAAE,CAAC,CAAC;qCACZ,CAAC;6BACH,CAAC;4BACF,MAAM;wBACR,CAAC;wBAED,KAAK,eAAe,CAAC,CAAC,CAAC;4BACrB,MAAM,GAAG;gCACP,OAAO,EAAE,CAAC;wCACR,IAAI,EAAE,MAAM;wCACZ,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE;qCACnC,CAAC;6BACH,CAAC;4BACF,MAAM;wBACR,CAAC;wBAED;4BACE,OAAO;gCACL,OAAO,EAAE,KAAK,EAAE,EAAE;gCAClB,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,iBAAiB,QAAQ,EAAE,EAAE;6BAC9D,CAAC;oBACN,CAAC;oBAED,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC;gBACxC,CAAC;gBAED;oBACE,OAAO;wBACL,OAAO,EAAE,KAAK,EAAE,EAAE;wBAClB,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,mBAAmB,MAAM,EAAE,EAAE;qBAC9D,CAAC;YACN,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE,KAAK,EAAE,EAAE;gBAClB,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE;aAC9C,CAAC;QACJ,CAAC;IACH,CAAC;CACF;AApOD,0CAoOC"}
@@ -0,0 +1,20 @@
1
+ import { Mozart } from '../core/mozart';
2
+ export interface MiddlewareOptions {
3
+ port?: number;
4
+ host?: string;
5
+ upstreamUrl?: string;
6
+ }
7
+ export declare class MozartMiddleware {
8
+ private server;
9
+ private mozart;
10
+ private port;
11
+ private host;
12
+ private upstreamUrl;
13
+ constructor(mozart: Mozart, options?: MiddlewareOptions);
14
+ start(): Promise<void>;
15
+ stop(): Promise<void>;
16
+ private handleRequest;
17
+ private handleChatCompletion;
18
+ private readBody;
19
+ }
20
+ //# sourceMappingURL=middleware.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../../src/api/middleware.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAOxC,MAAM,WAAW,iBAAiB;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,WAAW,CAAS;gBAEhB,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,iBAAiB;IAOvD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAiBtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAOP,aAAa;YAwCb,oBAAoB;IAqHlC,OAAO,CAAC,QAAQ;CAUjB"}
@@ -0,0 +1,239 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.MozartMiddleware = void 0;
37
+ const http = __importStar(require("http"));
38
+ class MozartMiddleware {
39
+ server = null;
40
+ mozart;
41
+ port;
42
+ host;
43
+ upstreamUrl;
44
+ constructor(mozart, options) {
45
+ this.mozart = mozart;
46
+ this.port = options?.port ?? 4445;
47
+ this.host = options?.host ?? '127.0.0.1';
48
+ this.upstreamUrl = options?.upstreamUrl ?? 'http://localhost:4000'; // default LiteLLM
49
+ }
50
+ start() {
51
+ return new Promise((resolve, reject) => {
52
+ this.server = http.createServer((req, res) => {
53
+ this.handleRequest(req, res);
54
+ });
55
+ this.server.on('error', reject);
56
+ this.server.listen(this.port, this.host, () => {
57
+ console.log(`Mozart Middleware (OpenAI-compatible) running at http://${this.host}:${this.port}`);
58
+ console.log(` POST /v1/chat/completions — auto-routed by Mozart`);
59
+ console.log(` GET /health — health check`);
60
+ console.log(` GET /v1/models — available models`);
61
+ resolve();
62
+ });
63
+ });
64
+ }
65
+ stop() {
66
+ return new Promise((resolve) => {
67
+ if (this.server)
68
+ this.server.close(() => resolve());
69
+ else
70
+ resolve();
71
+ });
72
+ }
73
+ async handleRequest(req, res) {
74
+ res.setHeader('Content-Type', 'application/json');
75
+ res.setHeader('Access-Control-Allow-Origin', '*');
76
+ res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');
77
+ res.setHeader('Access-Control-Allow-Headers', '*');
78
+ if (req.method === 'OPTIONS') {
79
+ res.writeHead(204);
80
+ res.end();
81
+ return;
82
+ }
83
+ const url = req.url ?? '/';
84
+ const method = req.method ?? 'GET';
85
+ try {
86
+ if (method === 'GET' && url === '/health') {
87
+ res.writeHead(200);
88
+ res.end(JSON.stringify({ status: 'ok', mode: 'middleware' }));
89
+ }
90
+ else if (method === 'GET' && url === '/v1/models') {
91
+ const snapshot = this.mozart.getInventory();
92
+ const models = snapshot.models.map((m) => ({
93
+ id: m.id,
94
+ object: 'model',
95
+ owned_by: m.providerId,
96
+ }));
97
+ res.writeHead(200);
98
+ res.end(JSON.stringify({ object: 'list', data: models }));
99
+ }
100
+ else if (method === 'POST' && (url === '/v1/chat/completions' || url === '/chat/completions')) {
101
+ await this.handleChatCompletion(req, res);
102
+ }
103
+ else {
104
+ res.writeHead(404);
105
+ res.end(JSON.stringify({ error: 'Not found' }));
106
+ }
107
+ }
108
+ catch (err) {
109
+ res.writeHead(500);
110
+ res.end(JSON.stringify({ error: String(err) }));
111
+ }
112
+ }
113
+ async handleChatCompletion(req, res) {
114
+ const body = await this.readBody(req);
115
+ const messages = body.messages ?? [];
116
+ const userMessage = messages.filter((m) => m.role === 'user').map((m) => m.content).join('\n');
117
+ const requestedModel = body.model;
118
+ // Let Mozart route the task
119
+ const route = await this.mozart.route(userMessage);
120
+ if (route.selectedModel === 'none') {
121
+ // Fallback: forward to upstream gateway
122
+ res.writeHead(200);
123
+ res.end(JSON.stringify({
124
+ id: 'mozart-fallback',
125
+ object: 'chat.completion',
126
+ model: requestedModel ?? 'unknown',
127
+ choices: [{
128
+ index: 0,
129
+ message: {
130
+ role: 'assistant',
131
+ content: `[Mozart] No suitable model found. Task: ${route.explanation[0]}. Run 'mozart doctor' to detect available models.`,
132
+ },
133
+ finish_reason: 'stop',
134
+ }],
135
+ usage: { prompt_tokens: 0, completion_tokens: 0, total_tokens: 0 },
136
+ mozart_route: route,
137
+ }));
138
+ return;
139
+ }
140
+ // Try to execute via adapter
141
+ const adapter = this.mozart.registry.getAdapter(route.selectedGateway);
142
+ if (adapter?.execute) {
143
+ const result = await adapter.execute({
144
+ input: userMessage,
145
+ model: route.selectedModel,
146
+ provider: route.selectedProvider,
147
+ gateway: route.selectedGateway,
148
+ executionTarget: await (adapter.getExecutionTarget
149
+ ? adapter.getExecutionTarget(route)
150
+ : Promise.resolve({
151
+ adapter: adapter.id,
152
+ provider: route.selectedProvider,
153
+ model: route.selectedModel,
154
+ apiKeyManagedBy: 'gateway',
155
+ method: 'gateway_call',
156
+ })),
157
+ });
158
+ if (result.success && result.output) {
159
+ res.writeHead(200);
160
+ res.end(JSON.stringify({
161
+ id: `mozart-${Date.now()}`,
162
+ object: 'chat.completion',
163
+ model: route.selectedModel,
164
+ choices: [{
165
+ index: 0,
166
+ message: { role: 'assistant', content: result.output },
167
+ finish_reason: 'stop',
168
+ }],
169
+ usage: {
170
+ prompt_tokens: route.estimatedTokens.input,
171
+ completion_tokens: route.estimatedTokens.output,
172
+ total_tokens: route.estimatedTokens.total,
173
+ },
174
+ mozart_route: {
175
+ provider: route.selectedProvider,
176
+ model: route.selectedModel,
177
+ confidence: route.confidence,
178
+ estimated_cost: route.estimatedCost,
179
+ explanation: route.explanation,
180
+ },
181
+ }));
182
+ return;
183
+ }
184
+ res.writeHead(200);
185
+ res.end(JSON.stringify({
186
+ id: `mozart-${Date.now()}`,
187
+ object: 'chat.completion',
188
+ model: route.selectedModel,
189
+ choices: [{
190
+ index: 0,
191
+ message: {
192
+ role: 'assistant',
193
+ content: `[Mozart Route] Recommended: ${route.selectedProvider}/${route.selectedModel}\nExecution failed: ${result.error}\nRun via your gateway directly.`,
194
+ },
195
+ finish_reason: 'stop',
196
+ }],
197
+ mozart_route: route,
198
+ }));
199
+ return;
200
+ }
201
+ // Recommend-only: return the recommendation
202
+ res.writeHead(200);
203
+ res.end(JSON.stringify({
204
+ id: `mozart-${Date.now()}`,
205
+ object: 'chat.completion',
206
+ model: route.selectedModel,
207
+ choices: [{
208
+ index: 0,
209
+ message: {
210
+ role: 'assistant',
211
+ content: `[Mozart Recommendation]\nUse: ${route.selectedGateway ?? 'direct'} / ${route.selectedProvider} / ${route.selectedModel}\nCost: $${route.estimatedCost.toFixed(4)}\nConfidence: ${Math.round(route.confidence * 100)}%\n\n${route.explanation.join('\n')}`,
212
+ },
213
+ finish_reason: 'stop',
214
+ }],
215
+ usage: {
216
+ prompt_tokens: route.estimatedTokens.input,
217
+ completion_tokens: route.estimatedTokens.output,
218
+ total_tokens: route.estimatedTokens.total,
219
+ },
220
+ mozart_route: route,
221
+ }));
222
+ }
223
+ readBody(req) {
224
+ return new Promise((resolve) => {
225
+ let data = '';
226
+ req.on('data', (chunk) => { data += chunk; });
227
+ req.on('end', () => {
228
+ try {
229
+ resolve(data ? JSON.parse(data) : {});
230
+ }
231
+ catch {
232
+ resolve({});
233
+ }
234
+ });
235
+ });
236
+ }
237
+ }
238
+ exports.MozartMiddleware = MozartMiddleware;
239
+ //# sourceMappingURL=middleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../src/api/middleware.ts"],"names":[],"mappings":"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"}