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.
- package/LICENSE +21 -0
- package/README.md +250 -0
- package/dist/adapters/cursor.d.ts +10 -0
- package/dist/adapters/cursor.d.ts.map +1 -0
- package/dist/adapters/cursor.js +39 -0
- package/dist/adapters/cursor.js.map +1 -0
- package/dist/adapters/generic.d.ts +24 -0
- package/dist/adapters/generic.d.ts.map +1 -0
- package/dist/adapters/generic.js +192 -0
- package/dist/adapters/generic.js.map +1 -0
- package/dist/adapters/hermes.d.ts +10 -0
- package/dist/adapters/hermes.d.ts.map +1 -0
- package/dist/adapters/hermes.js +170 -0
- package/dist/adapters/hermes.js.map +1 -0
- package/dist/adapters/index.d.ts +13 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +27 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/litellm.d.ts +15 -0
- package/dist/adapters/litellm.d.ts.map +1 -0
- package/dist/adapters/litellm.js +238 -0
- package/dist/adapters/litellm.js.map +1 -0
- package/dist/adapters/lmstudio.d.ts +12 -0
- package/dist/adapters/lmstudio.d.ts.map +1 -0
- package/dist/adapters/lmstudio.js +128 -0
- package/dist/adapters/lmstudio.js.map +1 -0
- package/dist/adapters/nim.d.ts +12 -0
- package/dist/adapters/nim.d.ts.map +1 -0
- package/dist/adapters/nim.js +163 -0
- package/dist/adapters/nim.js.map +1 -0
- package/dist/adapters/ollama.d.ts +12 -0
- package/dist/adapters/ollama.d.ts.map +1 -0
- package/dist/adapters/ollama.js +243 -0
- package/dist/adapters/ollama.js.map +1 -0
- package/dist/adapters/openclaw.d.ts +10 -0
- package/dist/adapters/openclaw.d.ts.map +1 -0
- package/dist/adapters/openclaw.js +197 -0
- package/dist/adapters/openclaw.js.map +1 -0
- package/dist/adapters/opencode.d.ts +10 -0
- package/dist/adapters/opencode.d.ts.map +1 -0
- package/dist/adapters/opencode.js +180 -0
- package/dist/adapters/opencode.js.map +1 -0
- package/dist/adapters/openrouter.d.ts +13 -0
- package/dist/adapters/openrouter.d.ts.map +1 -0
- package/dist/adapters/openrouter.js +173 -0
- package/dist/adapters/openrouter.js.map +1 -0
- package/dist/adapters/vllm.d.ts +12 -0
- package/dist/adapters/vllm.d.ts.map +1 -0
- package/dist/adapters/vllm.js +129 -0
- package/dist/adapters/vllm.js.map +1 -0
- package/dist/api/dashboard.d.ts +3 -0
- package/dist/api/dashboard.d.ts.map +1 -0
- package/dist/api/dashboard.js +98 -0
- package/dist/api/dashboard.js.map +1 -0
- package/dist/api/mcp.d.ts +32 -0
- package/dist/api/mcp.d.ts.map +1 -0
- package/dist/api/mcp.js +215 -0
- package/dist/api/mcp.js.map +1 -0
- package/dist/api/middleware.d.ts +20 -0
- package/dist/api/middleware.d.ts.map +1 -0
- package/dist/api/middleware.js +239 -0
- package/dist/api/middleware.js.map +1 -0
- package/dist/api/server.d.ts +26 -0
- package/dist/api/server.d.ts.map +1 -0
- package/dist/api/server.js +294 -0
- package/dist/api/server.js.map +1 -0
- package/dist/api/streaming.d.ts +19 -0
- package/dist/api/streaming.d.ts.map +1 -0
- package/dist/api/streaming.js +274 -0
- package/dist/api/streaming.js.map +1 -0
- package/dist/cli/config-init.d.ts +2 -0
- package/dist/cli/config-init.d.ts.map +1 -0
- package/dist/cli/config-init.js +73 -0
- package/dist/cli/config-init.js.map +1 -0
- package/dist/cli/main.d.ts +3 -0
- package/dist/cli/main.d.ts.map +1 -0
- package/dist/cli/main.js +618 -0
- package/dist/cli/main.js.map +1 -0
- package/dist/context/advanced-optimizer.d.ts +12 -0
- package/dist/context/advanced-optimizer.d.ts.map +1 -0
- package/dist/context/advanced-optimizer.js +64 -0
- package/dist/context/advanced-optimizer.js.map +1 -0
- package/dist/context/optimizer.d.ts +7 -0
- package/dist/context/optimizer.d.ts.map +1 -0
- package/dist/context/optimizer.js +101 -0
- package/dist/context/optimizer.js.map +1 -0
- package/dist/core/cache.d.ts +39 -0
- package/dist/core/cache.d.ts.map +1 -0
- package/dist/core/cache.js +90 -0
- package/dist/core/cache.js.map +1 -0
- package/dist/core/health.d.ts +32 -0
- package/dist/core/health.d.ts.map +1 -0
- package/dist/core/health.js +92 -0
- package/dist/core/health.js.map +1 -0
- package/dist/core/inventory.d.ts +28 -0
- package/dist/core/inventory.d.ts.map +1 -0
- package/dist/core/inventory.js +106 -0
- package/dist/core/inventory.js.map +1 -0
- package/dist/core/metrics.d.ts +48 -0
- package/dist/core/metrics.d.ts.map +1 -0
- package/dist/core/metrics.js +115 -0
- package/dist/core/metrics.js.map +1 -0
- package/dist/core/mozart.d.ts +39 -0
- package/dist/core/mozart.d.ts.map +1 -0
- package/dist/core/mozart.js +156 -0
- package/dist/core/mozart.js.map +1 -0
- package/dist/core/persistence.d.ts +13 -0
- package/dist/core/persistence.d.ts.map +1 -0
- package/dist/core/persistence.js +119 -0
- package/dist/core/persistence.js.map +1 -0
- package/dist/core/plugins.d.ts +18 -0
- package/dist/core/plugins.d.ts.map +1 -0
- package/dist/core/plugins.js +110 -0
- package/dist/core/plugins.js.map +1 -0
- package/dist/core/reliability.d.ts +23 -0
- package/dist/core/reliability.d.ts.map +1 -0
- package/dist/core/reliability.js +70 -0
- package/dist/core/reliability.js.map +1 -0
- package/dist/core/session.d.ts +17 -0
- package/dist/core/session.d.ts.map +1 -0
- package/dist/core/session.js +67 -0
- package/dist/core/session.js.map +1 -0
- package/dist/cost/dynamic-pricing.d.ts +24 -0
- package/dist/cost/dynamic-pricing.d.ts.map +1 -0
- package/dist/cost/dynamic-pricing.js +71 -0
- package/dist/cost/dynamic-pricing.js.map +1 -0
- package/dist/cost/estimator.d.ts +8 -0
- package/dist/cost/estimator.d.ts.map +1 -0
- package/dist/cost/estimator.js +48 -0
- package/dist/cost/estimator.js.map +1 -0
- package/dist/explain/engine.d.ts +6 -0
- package/dist/explain/engine.d.ts.map +1 -0
- package/dist/explain/engine.js +59 -0
- package/dist/explain/engine.js.map +1 -0
- package/dist/index.d.ts +59 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +112 -0
- package/dist/index.js.map +1 -0
- package/dist/logs/logger.d.ts +35 -0
- package/dist/logs/logger.d.ts.map +1 -0
- package/dist/logs/logger.js +73 -0
- package/dist/logs/logger.js.map +1 -0
- package/dist/logs/redactor.d.ts +6 -0
- package/dist/logs/redactor.d.ts.map +1 -0
- package/dist/logs/redactor.js +54 -0
- package/dist/logs/redactor.js.map +1 -0
- package/dist/policy/engine.d.ts +9 -0
- package/dist/policy/engine.d.ts.map +1 -0
- package/dist/policy/engine.js +55 -0
- package/dist/policy/engine.js.map +1 -0
- package/dist/policy/loader.d.ts +3 -0
- package/dist/policy/loader.d.ts.map +1 -0
- package/dist/policy/loader.js +27 -0
- package/dist/policy/loader.js.map +1 -0
- package/dist/policy/profiles.d.ts +11 -0
- package/dist/policy/profiles.d.ts.map +1 -0
- package/dist/policy/profiles.js +263 -0
- package/dist/policy/profiles.js.map +1 -0
- package/dist/policy/yaml-loader.d.ts +10 -0
- package/dist/policy/yaml-loader.d.ts.map +1 -0
- package/dist/policy/yaml-loader.js +160 -0
- package/dist/policy/yaml-loader.js.map +1 -0
- package/dist/privacy/guard.d.ts +8 -0
- package/dist/privacy/guard.d.ts.map +1 -0
- package/dist/privacy/guard.js +125 -0
- package/dist/privacy/guard.js.map +1 -0
- package/dist/routing/circuit-breaker.d.ts +23 -0
- package/dist/routing/circuit-breaker.d.ts.map +1 -0
- package/dist/routing/circuit-breaker.js +74 -0
- package/dist/routing/circuit-breaker.js.map +1 -0
- package/dist/routing/classifier.d.ts +5 -0
- package/dist/routing/classifier.d.ts.map +1 -0
- package/dist/routing/classifier.js +102 -0
- package/dist/routing/classifier.js.map +1 -0
- package/dist/routing/fallback.d.ts +27 -0
- package/dist/routing/fallback.d.ts.map +1 -0
- package/dist/routing/fallback.js +66 -0
- package/dist/routing/fallback.js.map +1 -0
- package/dist/routing/multistage.d.ts +49 -0
- package/dist/routing/multistage.d.ts.map +1 -0
- package/dist/routing/multistage.js +108 -0
- package/dist/routing/multistage.js.map +1 -0
- package/dist/routing/router.d.ts +22 -0
- package/dist/routing/router.d.ts.map +1 -0
- package/dist/routing/router.js +123 -0
- package/dist/routing/router.js.map +1 -0
- package/dist/routing/scorer.d.ts +8 -0
- package/dist/routing/scorer.d.ts.map +1 -0
- package/dist/routing/scorer.js +131 -0
- package/dist/routing/scorer.js.map +1 -0
- package/dist/skills/definitions.d.ts +10 -0
- package/dist/skills/definitions.d.ts.map +1 -0
- package/dist/skills/definitions.js +112 -0
- package/dist/skills/definitions.js.map +1 -0
- package/dist/skills/index.d.ts +3 -0
- package/dist/skills/index.d.ts.map +1 -0
- package/dist/skills/index.js +14 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/types/index.d.ts +298 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +34 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/canrunit.d.ts +26 -0
- package/dist/utils/canrunit.d.ts.map +1 -0
- package/dist/utils/canrunit.js +69 -0
- package/dist/utils/canrunit.js.map +1 -0
- package/dist/utils/dealsforge.d.ts +6 -0
- package/dist/utils/dealsforge.d.ts.map +1 -0
- package/dist/utils/dealsforge.js +105 -0
- package/dist/utils/dealsforge.js.map +1 -0
- package/docs/ADAPTERS.md +129 -0
- package/docs/ARCHITECTURE.md +113 -0
- package/docs/DELEGATED_EXECUTION.md +62 -0
- package/docs/FEATURE_MATRIX.md +113 -0
- package/docs/GATEWAY_FIRST_PRINCIPLES.md +66 -0
- package/docs/INTEGRATIONS.md +94 -0
- package/docs/LIMITATIONS.md +43 -0
- package/docs/RECOMMEND_ONLY_MODE.md +82 -0
- package/docs/ROADMAP.md +70 -0
- package/docs/SECURITY.md +74 -0
- package/docs/SKILLS_AND_TOOLS.md +141 -0
- package/examples/community-adapter/TEMPLATE.md +157 -0
- package/examples/generic-tools/README.md +29 -0
- package/examples/generic-tools/mozart-tools.json +86 -0
- package/examples/hermes/README.md +29 -0
- package/examples/hermes/mozart-tool.json +48 -0
- package/examples/litellm/README.md +21 -0
- package/examples/litellm/config.yaml +39 -0
- package/examples/ollama/README.md +37 -0
- package/examples/ollama/usage.ts +59 -0
- package/examples/openclaw/README.md +26 -0
- package/examples/openclaw/mozart-skill.yaml +80 -0
- package/examples/opencode/README.md +30 -0
- package/examples/opencode/SKILL.md +47 -0
- package/examples/opencode/mozart-skill.json +64 -0
- package/examples/openrouter/README.md +21 -0
- package/examples/openrouter/config.json +14 -0
- package/package.json +53 -0
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DEFAULT_POLICY = void 0;
|
|
4
|
+
exports.DEFAULT_POLICY = {
|
|
5
|
+
mode: 'local_first',
|
|
6
|
+
profile: 'startup-budget',
|
|
7
|
+
privacy: {
|
|
8
|
+
mode: 'balanced',
|
|
9
|
+
secrets: 'local_only',
|
|
10
|
+
envFiles: 'block_cloud',
|
|
11
|
+
customerData: 'trusted_only',
|
|
12
|
+
},
|
|
13
|
+
budget: {
|
|
14
|
+
mode: 'balanced',
|
|
15
|
+
dailyLimitUsd: 5,
|
|
16
|
+
warnAtPercent: 80,
|
|
17
|
+
},
|
|
18
|
+
routing: {
|
|
19
|
+
explain: true,
|
|
20
|
+
fallback: true,
|
|
21
|
+
cheapFirst: true,
|
|
22
|
+
premiumForCritical: true,
|
|
23
|
+
maxRetries: 2,
|
|
24
|
+
preferLocalForSimpleTasks: true,
|
|
25
|
+
allowCloudForCode: true,
|
|
26
|
+
allowCloudForSensitiveFiles: false,
|
|
27
|
+
},
|
|
28
|
+
logs: {
|
|
29
|
+
enabled: true,
|
|
30
|
+
redactSecrets: true,
|
|
31
|
+
retentionDays: 30,
|
|
32
|
+
},
|
|
33
|
+
};
|
|
34
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":";;;AAmKa,QAAA,cAAc,GAAiB;IAC1C,IAAI,EAAE,aAAa;IACnB,OAAO,EAAE,gBAAgB;IACzB,OAAO,EAAE;QACP,IAAI,EAAE,UAAU;QAChB,OAAO,EAAE,YAAY;QACrB,QAAQ,EAAE,aAAa;QACvB,YAAY,EAAE,cAAc;KAC7B;IACD,MAAM,EAAE;QACN,IAAI,EAAE,UAAU;QAChB,aAAa,EAAE,CAAC;QAChB,aAAa,EAAE,EAAE;KAClB;IACD,OAAO,EAAE;QACP,OAAO,EAAE,IAAI;QACb,QAAQ,EAAE,IAAI;QACd,UAAU,EAAE,IAAI;QAChB,kBAAkB,EAAE,IAAI;QACxB,UAAU,EAAE,CAAC;QACb,yBAAyB,EAAE,IAAI;QAC/B,iBAAiB,EAAE,IAAI;QACvB,2BAA2B,EAAE,KAAK;KACnC;IACD,IAAI,EAAE;QACJ,OAAO,EAAE,IAAI;QACb,aAAa,EAAE,IAAI;QACnB,aAAa,EAAE,EAAE;KAClB;CACF,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export interface LocalCapability {
|
|
2
|
+
os: string;
|
|
3
|
+
arch: string;
|
|
4
|
+
platform: string;
|
|
5
|
+
cpu: {
|
|
6
|
+
model: string;
|
|
7
|
+
cores: number;
|
|
8
|
+
};
|
|
9
|
+
ram: {
|
|
10
|
+
totalGB: number;
|
|
11
|
+
freeGB: number;
|
|
12
|
+
};
|
|
13
|
+
gpu?: {
|
|
14
|
+
model: string;
|
|
15
|
+
vramGB?: number;
|
|
16
|
+
};
|
|
17
|
+
ollamaAvailable: boolean;
|
|
18
|
+
localModelCount: number;
|
|
19
|
+
}
|
|
20
|
+
export declare function scanLocalCapability(): LocalCapability;
|
|
21
|
+
export declare function estimateLocalModelCapacity(capability: LocalCapability): Array<{
|
|
22
|
+
modelSize: string;
|
|
23
|
+
vramRequired: number;
|
|
24
|
+
canRun: boolean;
|
|
25
|
+
}>;
|
|
26
|
+
//# sourceMappingURL=canrunit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canrunit.d.ts","sourceRoot":"","sources":["../../src/utils/canrunit.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IACtC,GAAG,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACzC,GAAG,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACzC,eAAe,EAAE,OAAO,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,wBAAgB,mBAAmB,IAAI,eAAe,CAsBrD;AAED,wBAAgB,0BAA0B,CAAC,UAAU,EAAE,eAAe,GAAG,KAAK,CAAC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,CAAC,CAS3I"}
|
|
@@ -0,0 +1,69 @@
|
|
|
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.scanLocalCapability = scanLocalCapability;
|
|
37
|
+
exports.estimateLocalModelCapacity = estimateLocalModelCapacity;
|
|
38
|
+
const os = __importStar(require("os"));
|
|
39
|
+
function scanLocalCapability() {
|
|
40
|
+
const totalRAM = Math.round((os.totalmem() / (1024 * 1024 * 1024)) * 10) / 10;
|
|
41
|
+
const freeRAM = Math.round((os.freemem() / (1024 * 1024 * 1024)) * 10) / 10;
|
|
42
|
+
const result = {
|
|
43
|
+
os: os.type(),
|
|
44
|
+
arch: os.arch(),
|
|
45
|
+
platform: os.platform(),
|
|
46
|
+
cpu: {
|
|
47
|
+
model: os.cpus()[0]?.model ?? 'unknown',
|
|
48
|
+
cores: os.cpus().length,
|
|
49
|
+
},
|
|
50
|
+
ram: {
|
|
51
|
+
totalGB: totalRAM,
|
|
52
|
+
freeGB: freeRAM,
|
|
53
|
+
},
|
|
54
|
+
ollamaAvailable: false,
|
|
55
|
+
localModelCount: 0,
|
|
56
|
+
};
|
|
57
|
+
// GPU detection placeholder (requires native modules)
|
|
58
|
+
return result;
|
|
59
|
+
}
|
|
60
|
+
function estimateLocalModelCapacity(capability) {
|
|
61
|
+
const vramGB = capability.gpu?.vramGB ?? 0;
|
|
62
|
+
return [
|
|
63
|
+
{ modelSize: '7B (Q4)', vramRequired: 5, canRun: vramGB >= 5 || capability.ram.totalGB >= 8 },
|
|
64
|
+
{ modelSize: '13B (Q4)', vramRequired: 8, canRun: vramGB >= 8 || capability.ram.totalGB >= 16 },
|
|
65
|
+
{ modelSize: '34B (Q4)', vramRequired: 20, canRun: vramGB >= 20 },
|
|
66
|
+
{ modelSize: '70B (Q4)', vramRequired: 40, canRun: vramGB >= 40 },
|
|
67
|
+
];
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=canrunit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canrunit.js","sourceRoot":"","sources":["../../src/utils/canrunit.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAaA,kDAsBC;AAED,gEASC;AA9CD,uCAAyB;AAazB,SAAgB,mBAAmB;IACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,CAAC,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC;IAC9E,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,CAAC,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC;IAE5E,MAAM,MAAM,GAAoB;QAC9B,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE;QACb,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE;QACf,QAAQ,EAAE,EAAE,CAAC,QAAQ,EAAE;QACvB,GAAG,EAAE;YACH,KAAK,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,SAAS;YACvC,KAAK,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,MAAM;SACxB;QACD,GAAG,EAAE;YACH,OAAO,EAAE,QAAQ;YACjB,MAAM,EAAE,OAAO;SAChB;QACD,eAAe,EAAE,KAAK;QACtB,eAAe,EAAE,CAAC;KACnB,CAAC;IAEF,sDAAsD;IACtD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAgB,0BAA0B,CAAC,UAA2B;IACpE,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,EAAE,MAAM,IAAI,CAAC,CAAC;IAE3C,OAAO;QACL,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,OAAO,IAAI,CAAC,EAAE;QAC7F,EAAE,SAAS,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,EAAE;QAC/F,EAAE,SAAS,EAAE,UAAU,EAAE,YAAY,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,IAAI,EAAE,EAAE;QACjE,EAAE,SAAS,EAAE,UAAU,EAAE,YAAY,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,IAAI,EAAE,EAAE;KAClE,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dealsforge.d.ts","sourceRoot":"","sources":["../../src/utils/dealsforge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAkEtD,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,iBAAiB,GAC1B;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,CA0CjD"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.syncDealsForgeData = syncDealsForgeData;
|
|
4
|
+
const DEALSFORGE_MODELS = [
|
|
5
|
+
{
|
|
6
|
+
providerId: 'openrouter',
|
|
7
|
+
id: 'openai/gpt-4o',
|
|
8
|
+
displayName: 'GPT-4o',
|
|
9
|
+
family: 'gpt-4',
|
|
10
|
+
contextWindow: 128000,
|
|
11
|
+
inputPrice: 2.5,
|
|
12
|
+
outputPrice: 10.0,
|
|
13
|
+
latencyClass: 'medium',
|
|
14
|
+
qualityClass: 'premium',
|
|
15
|
+
modality: ['text', 'vision', 'multimodal'],
|
|
16
|
+
strengths: ['general', 'coding', 'vision', 'tools'],
|
|
17
|
+
supportsTools: true,
|
|
18
|
+
supportsJsonMode: true,
|
|
19
|
+
privacyLevel: 'cloud',
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
providerId: 'openrouter',
|
|
23
|
+
id: 'openai/gpt-4.1-nano',
|
|
24
|
+
displayName: 'GPT-4.1 Nano',
|
|
25
|
+
family: 'gpt-4',
|
|
26
|
+
contextWindow: 1000000,
|
|
27
|
+
inputPrice: 0.1,
|
|
28
|
+
outputPrice: 0.4,
|
|
29
|
+
latencyClass: 'fast',
|
|
30
|
+
qualityClass: 'medium',
|
|
31
|
+
modality: ['text'],
|
|
32
|
+
strengths: ['cheap', 'long_context'],
|
|
33
|
+
privacyLevel: 'cloud',
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
providerId: 'openrouter',
|
|
37
|
+
id: 'anthropic/claude-haiku-3.5',
|
|
38
|
+
displayName: 'Claude Haiku 3.5',
|
|
39
|
+
family: 'claude',
|
|
40
|
+
contextWindow: 200000,
|
|
41
|
+
inputPrice: 0.8,
|
|
42
|
+
outputPrice: 4.0,
|
|
43
|
+
latencyClass: 'fast',
|
|
44
|
+
qualityClass: 'high',
|
|
45
|
+
modality: ['text', 'vision'],
|
|
46
|
+
strengths: ['coding', 'fast', 'tools'],
|
|
47
|
+
supportsTools: true,
|
|
48
|
+
privacyLevel: 'cloud',
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
providerId: 'openrouter',
|
|
52
|
+
id: 'deepseek/deepseek-r1',
|
|
53
|
+
displayName: 'DeepSeek R1',
|
|
54
|
+
family: 'deepseek',
|
|
55
|
+
contextWindow: 65536,
|
|
56
|
+
inputPrice: 0.55,
|
|
57
|
+
outputPrice: 2.19,
|
|
58
|
+
latencyClass: 'medium',
|
|
59
|
+
qualityClass: 'high',
|
|
60
|
+
modality: ['text'],
|
|
61
|
+
strengths: ['reasoning', 'coding', 'math'],
|
|
62
|
+
supportsTools: true,
|
|
63
|
+
privacyLevel: 'cloud',
|
|
64
|
+
},
|
|
65
|
+
];
|
|
66
|
+
function syncDealsForgeData(registry) {
|
|
67
|
+
let modelsAdded = 0;
|
|
68
|
+
let providersAdded = 0;
|
|
69
|
+
for (const entry of DEALSFORGE_MODELS) {
|
|
70
|
+
const model = {
|
|
71
|
+
...entry,
|
|
72
|
+
id: entry.id,
|
|
73
|
+
displayName: entry.displayName,
|
|
74
|
+
modality: entry.modality ?? ['text'],
|
|
75
|
+
latencyClass: entry.latencyClass ?? 'unknown',
|
|
76
|
+
qualityClass: entry.qualityClass ?? 'unknown',
|
|
77
|
+
strengths: entry.strengths ?? [],
|
|
78
|
+
weaknesses: [],
|
|
79
|
+
privacyLevel: entry.privacyLevel ?? 'cloud',
|
|
80
|
+
availability: 'available',
|
|
81
|
+
sourceConfidence: 'high',
|
|
82
|
+
lastCheckedAt: new Date().toISOString(),
|
|
83
|
+
};
|
|
84
|
+
const existing = registry.getModel(entry.providerId, entry.id);
|
|
85
|
+
if (!existing) {
|
|
86
|
+
registry.addModel(model);
|
|
87
|
+
modelsAdded++;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
// Add a DealsForge provider
|
|
91
|
+
const existing = registry.getProvider('dealsforge');
|
|
92
|
+
if (!existing) {
|
|
93
|
+
registry.addProvider({
|
|
94
|
+
id: 'dealsforge',
|
|
95
|
+
name: 'DealsForge Intelligence',
|
|
96
|
+
source: 'dealsforge',
|
|
97
|
+
privacyLevel: 'cloud',
|
|
98
|
+
status: 'available',
|
|
99
|
+
lastCheckedAt: new Date().toISOString(),
|
|
100
|
+
});
|
|
101
|
+
providersAdded++;
|
|
102
|
+
}
|
|
103
|
+
return { modelsAdded, providersAdded };
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=dealsforge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dealsforge.js","sourceRoot":"","sources":["../../src/utils/dealsforge.ts"],"names":[],"mappings":"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"}
|
package/docs/ADAPTERS.md
ADDED
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
# Adapters
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
Mozart adapters connect to existing gateways and tools. Each adapter implements the `GatewayAdapter` interface:
|
|
6
|
+
|
|
7
|
+
```typescript
|
|
8
|
+
interface GatewayAdapter {
|
|
9
|
+
id: string;
|
|
10
|
+
name: string;
|
|
11
|
+
detect(): Promise<DetectionResult>;
|
|
12
|
+
readConfig?(): Promise<GatewayConfigSummary>;
|
|
13
|
+
listProviders(): Promise<Provider[]>;
|
|
14
|
+
listModels(): Promise<Model[]>;
|
|
15
|
+
listCapabilities?(): Promise<CapabilitySummary>;
|
|
16
|
+
getExecutionTarget?(decision: RouteDecision): Promise<ExecutionTarget>;
|
|
17
|
+
testConnection?(): Promise<ConnectionStatus>;
|
|
18
|
+
execute?(request: ExecutionRequest): Promise<ExecutionResult>;
|
|
19
|
+
}
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## Real adapters
|
|
23
|
+
|
|
24
|
+
### OllamaAdapter
|
|
25
|
+
- **ID:** `ollama`
|
|
26
|
+
- **Detection:** Checks for `ollama` in PATH, runs `ollama --version` and `ollama list`
|
|
27
|
+
- **Provider:** Local Ollama instance
|
|
28
|
+
- **Execution:** Direct HTTP to `http://localhost:11434`
|
|
29
|
+
- **Privacy:** Local-only, no API key needed
|
|
30
|
+
|
|
31
|
+
### LiteLLMAdapter
|
|
32
|
+
- **ID:** `litellm`
|
|
33
|
+
- **Detection:** Scans for `litellm_config.yaml` in common locations (cwd, ~/.litellm/)
|
|
34
|
+
- **Provider:** Parsed from config
|
|
35
|
+
- **Execution:** Delegates to LiteLLM proxy (does not execute directly)
|
|
36
|
+
- **Note:** Never reads or stores raw API keys from config
|
|
37
|
+
|
|
38
|
+
### OpenRouterAdapter
|
|
39
|
+
- **ID:** `openrouter`
|
|
40
|
+
- **Detection:** Checks for `OPENROUTER_API_KEY` in environment
|
|
41
|
+
- **Provider:** OpenRouter gateway
|
|
42
|
+
- **Execution:** Recommends models, delegates execution
|
|
43
|
+
- **Inventory:** Curated list of popular models with pricing
|
|
44
|
+
|
|
45
|
+
### OpenCodeAdapter
|
|
46
|
+
- **ID:** `opencode`
|
|
47
|
+
- **Status:** Real detection
|
|
48
|
+
- **Detection:** Checks for OpenCode installation via environment variables (OPENCODE_CLIENT, OPENCODE_SERVER_USERNAME) and data directory
|
|
49
|
+
- **Integration path:** `examples/opencode/mozart-skill.json`
|
|
50
|
+
|
|
51
|
+
### OpenClawAdapter
|
|
52
|
+
- **ID:** `openclaw`
|
|
53
|
+
- **Status:** Real detection — reads openclaw.json
|
|
54
|
+
- **Detection:** Parses `~/.openclaw/openclaw.json`, extracts all providers, models, gateway settings
|
|
55
|
+
- **Integration path:** `examples/openclaw/mozart-skill.yaml`
|
|
56
|
+
|
|
57
|
+
### LMStudioAdapter
|
|
58
|
+
- **ID:** `lmstudio`
|
|
59
|
+
- **Status:** Real — HTTP detection
|
|
60
|
+
- **Detection:** Queries `http://localhost:1234/v1/models`
|
|
61
|
+
- **Execution:** Direct HTTP to LM Studio's OpenAI-compatible endpoint
|
|
62
|
+
|
|
63
|
+
### VllmAdapter
|
|
64
|
+
- **ID:** `vllm`
|
|
65
|
+
- **Status:** Real — HTTP detection
|
|
66
|
+
- **Detection:** Queries `http://localhost:8000/v1/models`
|
|
67
|
+
- **Execution:** Direct HTTP to vLLM's OpenAI-compatible endpoint
|
|
68
|
+
|
|
69
|
+
### NvidiaNimAdapter
|
|
70
|
+
- **ID:** `nim`
|
|
71
|
+
- **Status:** Real — HTTP + env detection
|
|
72
|
+
- **Detection:** Queries local NIM endpoint + checks NVIDIA_API_KEY
|
|
73
|
+
- **Inventory:** Curated list of NIM-available models (Llama, Mixtral)
|
|
74
|
+
|
|
75
|
+
### GenericOpenAIAdapter
|
|
76
|
+
- **ID:** configurable
|
|
77
|
+
- **Status:** Universal plug-and-play
|
|
78
|
+
- **Detection:** Queries any OpenAI-compatible `/v1/models` endpoint
|
|
79
|
+
- **Auto-discovery:** Scans 11 common endpoints (Ollama, LM Studio, vLLM, LiteLLM, OpenRouter, OpenAI, Groq, Together, DeepSeek, Fireworks, Mistral)
|
|
80
|
+
- **Custom:** Accepts any base URL — no code changes needed for new gateways
|
|
81
|
+
|
|
82
|
+
## Stub adapters
|
|
83
|
+
|
|
84
|
+
These adapters have full typed interfaces ready but require the target environment for real detection:
|
|
85
|
+
|
|
86
|
+
### HermesAdapter
|
|
87
|
+
- **ID:** `hermes`
|
|
88
|
+
- **Status:** Stub with manifest
|
|
89
|
+
- **Integration path:** `examples/hermes/mozart-tool.json`
|
|
90
|
+
- **Next steps:** Connect to Hermes tool system
|
|
91
|
+
|
|
92
|
+
### CursorAdapter
|
|
93
|
+
- **ID:** `cursor`
|
|
94
|
+
- **Status:** Stub with documentation
|
|
95
|
+
- **Next steps:** Expose as local endpoint or use via SDK
|
|
96
|
+
|
|
97
|
+
## Creating a custom adapter
|
|
98
|
+
|
|
99
|
+
```typescript
|
|
100
|
+
import { GatewayAdapter, DetectionResult, Provider, Model } from 'mozart-router';
|
|
101
|
+
|
|
102
|
+
export class MyCustomAdapter implements GatewayAdapter {
|
|
103
|
+
id = 'my-custom';
|
|
104
|
+
name = 'My Custom Gateway';
|
|
105
|
+
|
|
106
|
+
async detect(): Promise<DetectionResult> {
|
|
107
|
+
// Check if your gateway is available
|
|
108
|
+
return {
|
|
109
|
+
detected: true,
|
|
110
|
+
gatewayId: this.id,
|
|
111
|
+
gatewayName: this.name,
|
|
112
|
+
status: 'active',
|
|
113
|
+
providersCount: 1,
|
|
114
|
+
modelsCount: 3,
|
|
115
|
+
details: ['Custom gateway detected'],
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
async listProviders(): Promise<Provider[]> {
|
|
120
|
+
// Return your providers
|
|
121
|
+
return [];
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
async listModels(): Promise<Model[]> {
|
|
125
|
+
// Return your models
|
|
126
|
+
return [];
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
```
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
# Architecture
|
|
2
|
+
|
|
3
|
+
## High-level design
|
|
4
|
+
|
|
5
|
+
Mozart is designed as a **gateway-first orchestration layer**. It does not replace gateways — it sits between agents and gateways adding decision intelligence.
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
┌──────────────────────────────────────────────────┐
|
|
9
|
+
│ Agent / IDE / User │
|
|
10
|
+
├──────────────────────────────────────────────────┤
|
|
11
|
+
│ Mozart Interface Layer │
|
|
12
|
+
│ ┌──────────┐ ┌──────────┐ ┌──────────────────┐ │
|
|
13
|
+
│ │ SDK │ │ CLI │ │ Skill/Tool API │ │
|
|
14
|
+
│ └──────────┘ └──────────┘ └──────────────────┘ │
|
|
15
|
+
├──────────────────────────────────────────────────┤
|
|
16
|
+
│ Gateway Introspection Layer │
|
|
17
|
+
│ ┌────────┐ ┌────────┐ ┌────────┐ ┌──────────┐ │
|
|
18
|
+
│ │Ollama │ │LiteLLM │ │OpenRt │ │Agent De- │ │
|
|
19
|
+
│ │Adapter │ │Adapter │ │Adapter│ │tectors │ │
|
|
20
|
+
│ └────────┘ └────────┘ └────────┘ └──────────┘ │
|
|
21
|
+
├──────────────────────────────────────────────────┤
|
|
22
|
+
│ Mozart Core Engine │
|
|
23
|
+
│ ┌──────────┐ ┌──────────┐ ┌──────────────────┐ │
|
|
24
|
+
│ │Inventory │ │ Policy │ │ Privacy Guard │ │
|
|
25
|
+
│ │Registry │ │ Engine │ │ │ │
|
|
26
|
+
│ └──────────┘ └──────────┘ └──────────────────┘ │
|
|
27
|
+
│ ┌──────────┐ ┌──────────┐ ┌──────────────────┐ │
|
|
28
|
+
│ │ Task │ │ Routing │ │ Context │ │
|
|
29
|
+
│ │Classifier│ │ Engine │ │ Optimizer │ │
|
|
30
|
+
│ └──────────┘ └──────────┘ └──────────────────┘ │
|
|
31
|
+
│ ┌──────────┐ ┌──────────┐ ┌──────────────────┐ │
|
|
32
|
+
│ │ Cost │ │Explain- │ │ Logger + │ │
|
|
33
|
+
│ │Estimator │ │ability │ │ Redactor │ │
|
|
34
|
+
│ └──────────┘ └──────────┘ └──────────────────┘ │
|
|
35
|
+
├──────────────────────────────────────────────────┤
|
|
36
|
+
│ Execution Delegation Layer │
|
|
37
|
+
│ ┌──────────────────────────────────────────────┐ │
|
|
38
|
+
│ │ Delegates to: LiteLLM / OpenRouter / │ │
|
|
39
|
+
│ │ Ollama / Direct Provider / Agent Tool │ │
|
|
40
|
+
│ └──────────────────────────────────────────────┘ │
|
|
41
|
+
└──────────────────────────────────────────────────┘
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## Design principles
|
|
45
|
+
|
|
46
|
+
### 1. Gateway-first
|
|
47
|
+
Mozart never rebuilds what a gateway already does. It detects, understands, and orchestrates existing infrastructure.
|
|
48
|
+
|
|
49
|
+
### 2. Agent-first
|
|
50
|
+
Mozart integrates as a skill, tool, or adapter within existing agent frameworks — never as a separate application.
|
|
51
|
+
|
|
52
|
+
### 3. Integration-first
|
|
53
|
+
Every module is designed to be importable as a TypeScript SDK, not locked behind a UI or service boundary.
|
|
54
|
+
|
|
55
|
+
### 4. Local-first
|
|
56
|
+
All processing (classification, privacy scanning, routing, logging) happens locally. No cloud dependency for core functionality.
|
|
57
|
+
|
|
58
|
+
### 5. Privacy by default
|
|
59
|
+
Secrets are never logged. Privacy guard scans all content before routing. Local-only mode available.
|
|
60
|
+
|
|
61
|
+
### 6. Modular
|
|
62
|
+
Every component is independently usable. You can use just the Privacy Guard, just the Router, or the full orchestrator.
|
|
63
|
+
|
|
64
|
+
## Module dependencies
|
|
65
|
+
|
|
66
|
+
```
|
|
67
|
+
types/ (zero dependencies)
|
|
68
|
+
|
|
|
69
|
+
├─ core/
|
|
70
|
+
│ ├─ inventory.ts (types)
|
|
71
|
+
│ ├─ session.ts (types)
|
|
72
|
+
│ └─ mozart.ts (all modules)
|
|
73
|
+
|
|
|
74
|
+
├─ adapters/ (types, core/inventory)
|
|
75
|
+
│ ├─ ollama.ts
|
|
76
|
+
│ ├─ litellm.ts
|
|
77
|
+
│ ├─ openrouter.ts
|
|
78
|
+
│ ├─ opencode.ts
|
|
79
|
+
│ ├─ openclaw.ts
|
|
80
|
+
│ ├─ hermes.ts
|
|
81
|
+
│ └─ cursor.ts
|
|
82
|
+
|
|
|
83
|
+
├─ routing/
|
|
84
|
+
│ ├─ classifier.ts (types)
|
|
85
|
+
│ ├─ scorer.ts (types)
|
|
86
|
+
│ └─ router.ts (types, core/inventory, policy, cost)
|
|
87
|
+
|
|
|
88
|
+
├─ policy/engine.ts (types)
|
|
89
|
+
├─ privacy/guard.ts (types, logs)
|
|
90
|
+
├─ context/optimizer.ts (types)
|
|
91
|
+
├─ cost/estimator.ts (types)
|
|
92
|
+
├─ explain/engine.ts (types)
|
|
93
|
+
|
|
|
94
|
+
├─ logs/
|
|
95
|
+
│ ├─ logger.ts (types)
|
|
96
|
+
│ └─ redactor.ts
|
|
97
|
+
|
|
|
98
|
+
├─ skills/definitions.ts (types)
|
|
99
|
+
└─ cli/main.ts (all modules)
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
## Data flow
|
|
103
|
+
|
|
104
|
+
```
|
|
105
|
+
User Input → Task Classifier → Task Profile
|
|
106
|
+
→ Privacy Guard → Privacy Decision
|
|
107
|
+
→ Policy Engine → Policy Evaluation
|
|
108
|
+
→ Context Optimizer → Context Strategy
|
|
109
|
+
→ Routing Engine → Route Decision
|
|
110
|
+
→ Execution Delegation → Gateway Call
|
|
111
|
+
→ Explainability → Explanation
|
|
112
|
+
→ Logger → Local Logs
|
|
113
|
+
```
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# Delegated Execution — Mozart
|
|
2
|
+
|
|
3
|
+
Mozart delegates execution to existing gateways. It does not become a gateway itself.
|
|
4
|
+
|
|
5
|
+
## Architecture
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
Agent → Mozart → Gateway → Provider
|
|
9
|
+
(decide) (execute)
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
Mozart sits in the decision position. The gateway sits in the execution position. This separation is intentional and permanent.
|
|
13
|
+
|
|
14
|
+
## Execution targets
|
|
15
|
+
|
|
16
|
+
When Mozart selects a route, it produces an `ExecutionTarget`:
|
|
17
|
+
|
|
18
|
+
```typescript
|
|
19
|
+
interface ExecutionTarget {
|
|
20
|
+
adapter: string; // Which adapter handles this
|
|
21
|
+
gateway?: string; // Which gateway
|
|
22
|
+
provider: string; // Which provider
|
|
23
|
+
model: string; // Which model
|
|
24
|
+
baseUrl?: string; // Where to send the request
|
|
25
|
+
requiresApiKey?: boolean;
|
|
26
|
+
apiKeyManagedBy: 'gateway' | 'env' | 'manual' | 'none';
|
|
27
|
+
method: 'gateway_call' | 'tool_call' | 'direct_http' | 'local_exec';
|
|
28
|
+
}
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
Key field: `apiKeyManagedBy` — Mozart never stores the key, only records who manages it.
|
|
32
|
+
|
|
33
|
+
## Execution flow
|
|
34
|
+
|
|
35
|
+
1. Mozart routes the task → produces `RouteDecision`
|
|
36
|
+
2. Mozart delegates to the adapter → adapter provides `ExecutionTarget`
|
|
37
|
+
3. Mozart calls `adapter.execute()` → adapter handles the HTTP call
|
|
38
|
+
4. Mozart returns the result → gateway never exposed
|
|
39
|
+
|
|
40
|
+
## Adapter responsibility
|
|
41
|
+
|
|
42
|
+
Adapters are responsible for:
|
|
43
|
+
- Detecting the gateway
|
|
44
|
+
- Reading its config (without raw keys)
|
|
45
|
+
- Providing execution targets
|
|
46
|
+
- Executing calls when possible
|
|
47
|
+
|
|
48
|
+
Mozart is responsible for:
|
|
49
|
+
- Classifying tasks
|
|
50
|
+
- Scoring models
|
|
51
|
+
- Selecting the best route
|
|
52
|
+
- Delegating to the right adapter
|
|
53
|
+
|
|
54
|
+
## When execution is not available
|
|
55
|
+
|
|
56
|
+
If an adapter doesn't support execution (or the gateway isn't accessible):
|
|
57
|
+
|
|
58
|
+
- Mozart returns a recommendation (recommend-only)
|
|
59
|
+
- The user/agent sends the call themselves using their existing gateway
|
|
60
|
+
- Mozart's recommendation includes the exact model, provider, and rationale
|
|
61
|
+
|
|
62
|
+
This is the preferred mode. Execution is optional.
|