@zhixuan92/multi-model-agent-core 0.3.1 → 1.0.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/dist/config/load.js +9 -9
- package/dist/config/load.js.map +1 -1
- package/dist/config/schema.d.ts +168 -275
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +30 -39
- package/dist/config/schema.js.map +1 -1
- package/dist/cost/cost-meter.d.ts +13 -0
- package/dist/cost/cost-meter.d.ts.map +1 -0
- package/dist/cost/cost-meter.js +20 -0
- package/dist/cost/cost-meter.js.map +1 -0
- package/dist/delegate-with-escalation.d.ts +1 -28
- package/dist/delegate-with-escalation.d.ts.map +1 -1
- package/dist/delegate-with-escalation.js +10 -89
- package/dist/delegate-with-escalation.js.map +1 -1
- package/dist/error-codes.d.ts +4 -0
- package/dist/error-codes.d.ts.map +1 -0
- package/dist/error-codes.js +16 -0
- package/dist/error-codes.js.map +1 -0
- package/dist/index.d.ts +5 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -5
- package/dist/index.js.map +1 -1
- package/dist/model-profiles.json +10 -5
- package/dist/provider.d.ts +2 -2
- package/dist/provider.d.ts.map +1 -1
- package/dist/provider.js +10 -13
- package/dist/provider.js.map +1 -1
- package/dist/readiness/normalization-budget.d.ts +2 -0
- package/dist/readiness/normalization-budget.d.ts.map +1 -0
- package/dist/readiness/normalization-budget.js +9 -0
- package/dist/readiness/normalization-budget.js.map +1 -0
- package/dist/readiness/normalize-brief.d.ts +17 -0
- package/dist/readiness/normalize-brief.d.ts.map +1 -0
- package/dist/readiness/normalize-brief.js +124 -0
- package/dist/readiness/normalize-brief.js.map +1 -0
- package/dist/readiness/readiness.d.ts +16 -0
- package/dist/readiness/readiness.d.ts.map +1 -0
- package/dist/readiness/readiness.js +160 -0
- package/dist/readiness/readiness.js.map +1 -0
- package/dist/reporting/structured-report.d.ts +18 -0
- package/dist/reporting/structured-report.d.ts.map +1 -0
- package/dist/reporting/structured-report.js +100 -0
- package/dist/reporting/structured-report.js.map +1 -0
- package/dist/review/aggregate-result.d.ts +3 -0
- package/dist/review/aggregate-result.d.ts.map +1 -0
- package/dist/review/aggregate-result.js +31 -0
- package/dist/review/aggregate-result.js.map +1 -0
- package/dist/review/quality-reviewer.d.ts +13 -0
- package/dist/review/quality-reviewer.d.ts.map +1 -0
- package/dist/review/quality-reviewer.js +39 -0
- package/dist/review/quality-reviewer.js.map +1 -0
- package/dist/review/reviewer-prompt.d.ts +10 -0
- package/dist/review/reviewer-prompt.d.ts.map +1 -0
- package/dist/review/reviewer-prompt.js +58 -0
- package/dist/review/reviewer-prompt.js.map +1 -0
- package/dist/review/spec-reviewer.d.ts +13 -0
- package/dist/review/spec-reviewer.d.ts.map +1 -0
- package/dist/review/spec-reviewer.js +37 -0
- package/dist/review/spec-reviewer.js.map +1 -0
- package/dist/routing/model-profiles.d.ts +5 -0
- package/dist/routing/model-profiles.d.ts.map +1 -1
- package/dist/routing/model-profiles.js +5 -0
- package/dist/routing/model-profiles.js.map +1 -1
- package/dist/routing/resolve-agent.d.ts +8 -0
- package/dist/routing/resolve-agent.d.ts.map +1 -0
- package/dist/routing/resolve-agent.js +45 -0
- package/dist/routing/resolve-agent.js.map +1 -0
- package/dist/run-tasks.d.ts +0 -23
- package/dist/run-tasks.d.ts.map +1 -1
- package/dist/run-tasks.js +241 -72
- package/dist/run-tasks.js.map +1 -1
- package/dist/runners/claude-runner.d.ts.map +1 -1
- package/dist/runners/claude-runner.js +71 -34
- package/dist/runners/claude-runner.js.map +1 -1
- package/dist/runners/codex-runner.d.ts.map +1 -1
- package/dist/runners/codex-runner.js +72 -31
- package/dist/runners/codex-runner.js.map +1 -1
- package/dist/runners/openai-runner.d.ts.map +1 -1
- package/dist/runners/openai-runner.js +144 -32
- package/dist/runners/openai-runner.js.map +1 -1
- package/dist/runners/prevention.d.ts +2 -0
- package/dist/runners/prevention.d.ts.map +1 -1
- package/dist/runners/prevention.js +12 -0
- package/dist/runners/prevention.js.map +1 -1
- package/dist/runners/supervision.d.ts +31 -5
- package/dist/runners/supervision.d.ts.map +1 -1
- package/dist/runners/supervision.js +43 -68
- package/dist/runners/supervision.js.map +1 -1
- package/dist/tools/call-cache.d.ts +16 -0
- package/dist/tools/call-cache.d.ts.map +1 -0
- package/dist/tools/call-cache.js +28 -0
- package/dist/tools/call-cache.js.map +1 -0
- package/dist/types.d.ts +92 -30
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +48 -16
- package/dist/routing/capabilities.d.ts +0 -3
- package/dist/routing/capabilities.d.ts.map +0 -1
- package/dist/routing/capabilities.js +0 -26
- package/dist/routing/capabilities.js.map +0 -1
- package/dist/routing/get-provider-eligibility.d.ts +0 -8
- package/dist/routing/get-provider-eligibility.d.ts.map +0 -1
- package/dist/routing/get-provider-eligibility.js +0 -53
- package/dist/routing/get-provider-eligibility.js.map +0 -1
- package/dist/routing/resolve-task-capabilities.d.ts +0 -7
- package/dist/routing/resolve-task-capabilities.d.ts.map +0 -1
- package/dist/routing/resolve-task-capabilities.js +0 -19
- package/dist/routing/resolve-task-capabilities.js.map +0 -1
- package/dist/routing/select-provider-for-task.d.ts +0 -18
- package/dist/routing/select-provider-for-task.d.ts.map +0 -1
- package/dist/routing/select-provider-for-task.js +0 -50
- package/dist/routing/select-provider-for-task.js.map +0 -1
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
const FILE_CAPABILITIES = ['file_read', 'file_write', 'grep', 'glob'];
|
|
2
|
-
export function getBaseCapabilities(config) {
|
|
3
|
-
const caps = [...FILE_CAPABILITIES];
|
|
4
|
-
if (config.sandboxPolicy === 'none') {
|
|
5
|
-
caps.push('shell');
|
|
6
|
-
}
|
|
7
|
-
switch (config.type) {
|
|
8
|
-
case 'codex': {
|
|
9
|
-
const hosted = config.hostedTools ?? ['web_search'];
|
|
10
|
-
if (hosted.includes('web_search'))
|
|
11
|
-
caps.push('web_search');
|
|
12
|
-
break;
|
|
13
|
-
}
|
|
14
|
-
case 'claude': {
|
|
15
|
-
caps.push('web_search', 'web_fetch');
|
|
16
|
-
break;
|
|
17
|
-
}
|
|
18
|
-
case 'openai-compatible': {
|
|
19
|
-
if ((config.hostedTools ?? []).includes('web_search'))
|
|
20
|
-
caps.push('web_search');
|
|
21
|
-
break;
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
return Array.from(new Set(caps));
|
|
25
|
-
}
|
|
26
|
-
//# sourceMappingURL=capabilities.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../../src/routing/capabilities.ts"],"names":[],"mappings":"AAEA,MAAM,iBAAiB,GAAiB,CAAC,WAAW,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAEpF,MAAM,UAAU,mBAAmB,CAAC,MAAsB;IACxD,MAAM,IAAI,GAAiB,CAAC,GAAG,iBAAiB,CAAC,CAAC;IAElD,IAAI,MAAM,CAAC,aAAa,KAAK,MAAM,EAAE,CAAC;QACpC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACrB,CAAC;IAED,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,IAAI,CAAC,YAAY,CAAC,CAAC;YACpD,IAAI,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC;gBAAE,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAC3D,MAAM;QACR,CAAC;QACD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;YACrC,MAAM;QACR,CAAC;QACD,KAAK,mBAAmB,CAAC,CAAC,CAAC;YACzB,IAAI,CAAC,MAAM,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC;gBAAE,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAC/E,MAAM;QACR,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;AACnC,CAAC"}
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import type { MultiModelConfig, ProviderEligibility, TaskSpec } from '../types.js';
|
|
2
|
-
/**
|
|
3
|
-
* Returns structured eligibility report for every configured provider.
|
|
4
|
-
* Each entry states whether the provider is eligible and, if not, which
|
|
5
|
-
* specific checks failed and why.
|
|
6
|
-
*/
|
|
7
|
-
export declare function getProviderEligibility(task: TaskSpec, config: MultiModelConfig): ProviderEligibility[];
|
|
8
|
-
//# sourceMappingURL=get-provider-eligibility.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"get-provider-eligibility.d.ts","sourceRoot":"","sources":["../../src/routing/get-provider-eligibility.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,gBAAgB,EAEhB,mBAAmB,EACnB,QAAQ,EAET,MAAM,aAAa,CAAC;AAMrB;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,QAAQ,EACd,MAAM,EAAE,gBAAgB,GACvB,mBAAmB,EAAE,CA+CvB"}
|
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
import { resolveTaskCapabilities } from './resolve-task-capabilities.js';
|
|
2
|
-
import { findModelProfile } from './model-profiles.js';
|
|
3
|
-
const TIER_ORDER = { trivial: 0, standard: 1, reasoning: 2 };
|
|
4
|
-
/**
|
|
5
|
-
* Returns structured eligibility report for every configured provider.
|
|
6
|
-
* Each entry states whether the provider is eligible and, if not, which
|
|
7
|
-
* specific checks failed and why.
|
|
8
|
-
*/
|
|
9
|
-
export function getProviderEligibility(task, config) {
|
|
10
|
-
return Object.entries(config.providers).map(([name, providerConfig]) => {
|
|
11
|
-
const reasons = [];
|
|
12
|
-
// Capability check
|
|
13
|
-
const caps = resolveTaskCapabilities(providerConfig, {
|
|
14
|
-
tools: task.tools ?? 'full',
|
|
15
|
-
sandboxPolicy: task.sandboxPolicy ?? providerConfig.sandboxPolicy,
|
|
16
|
-
});
|
|
17
|
-
const missing = task.requiredCapabilities.filter((c) => !caps.includes(c));
|
|
18
|
-
if (missing.length > 0) {
|
|
19
|
-
reasons.push({
|
|
20
|
-
check: 'capability',
|
|
21
|
-
detail: `missing: ${missing.join(', ')}`,
|
|
22
|
-
message: `Provider "${name}" cannot satisfy requiredCapabilities: ${missing.join(', ')}.`,
|
|
23
|
-
});
|
|
24
|
-
}
|
|
25
|
-
// Tier check
|
|
26
|
-
const profile = findModelProfile(providerConfig.model);
|
|
27
|
-
const requiredTierOrder = TIER_ORDER[task.tier];
|
|
28
|
-
const providerTierOrder = TIER_ORDER[profile.tier];
|
|
29
|
-
if (providerTierOrder < requiredTierOrder) {
|
|
30
|
-
reasons.push({
|
|
31
|
-
check: 'tier',
|
|
32
|
-
detail: `provider tier: ${profile.tier}, required: ${task.tier}`,
|
|
33
|
-
message: `Provider "${name}" (${profile.tier}) is below required tier ${task.tier}.`,
|
|
34
|
-
});
|
|
35
|
-
}
|
|
36
|
-
// OpenAI-compatible requires baseUrl (but this is caught by schema at parse time,
|
|
37
|
-
// so we surface it here as a sanity check)
|
|
38
|
-
if (providerConfig.type === 'openai-compatible' && !providerConfig.baseUrl) {
|
|
39
|
-
reasons.push({
|
|
40
|
-
check: 'missing_required_field',
|
|
41
|
-
detail: 'baseUrl is missing',
|
|
42
|
-
message: `Provider "${name}" (openai-compatible) is missing required field: baseUrl.`,
|
|
43
|
-
});
|
|
44
|
-
}
|
|
45
|
-
return {
|
|
46
|
-
name,
|
|
47
|
-
config: providerConfig,
|
|
48
|
-
eligible: reasons.length === 0,
|
|
49
|
-
reasons,
|
|
50
|
-
};
|
|
51
|
-
});
|
|
52
|
-
}
|
|
53
|
-
//# sourceMappingURL=get-provider-eligibility.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"get-provider-eligibility.js","sourceRoot":"","sources":["../../src/routing/get-provider-eligibility.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AACzE,OAAO,EAAE,gBAAgB,EAAwB,MAAM,qBAAqB,CAAC;AAE7E,MAAM,UAAU,GAAyB,EAAE,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;AAEnF;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CACpC,IAAc,EACd,MAAwB;IAExB,OAAO,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,cAAc,CAAC,EAAuB,EAAE;QAC1F,MAAM,OAAO,GAAyB,EAAE,CAAC;QAEzC,mBAAmB;QACnB,MAAM,IAAI,GAAG,uBAAuB,CAAC,cAAc,EAAE;YACnD,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,MAAM;YAC3B,aAAa,EAAE,IAAI,CAAC,aAAa,IAAI,cAAc,CAAC,aAAa;SAClE,CAAC,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3E,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,OAAO,CAAC,IAAI,CAAC;gBACX,KAAK,EAAE,YAAY;gBACnB,MAAM,EAAE,YAAY,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;gBACxC,OAAO,EAAE,aAAa,IAAI,0CAA0C,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;aAC1F,CAAC,CAAC;QACL,CAAC;QAED,aAAa;QACb,MAAM,OAAO,GAAG,gBAAgB,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QACvD,MAAM,iBAAiB,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChD,MAAM,iBAAiB,GAAG,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACnD,IAAI,iBAAiB,GAAG,iBAAiB,EAAE,CAAC;YAC1C,OAAO,CAAC,IAAI,CAAC;gBACX,KAAK,EAAE,MAAM;gBACb,MAAM,EAAE,kBAAkB,OAAO,CAAC,IAAI,eAAe,IAAI,CAAC,IAAI,EAAE;gBAChE,OAAO,EAAE,aAAa,IAAI,MAAM,OAAO,CAAC,IAAI,4BAA4B,IAAI,CAAC,IAAI,GAAG;aACrF,CAAC,CAAC;QACL,CAAC;QAED,kFAAkF;QAClF,2CAA2C;QAC3C,IAAI,cAAc,CAAC,IAAI,KAAK,mBAAmB,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC;YAC3E,OAAO,CAAC,IAAI,CAAC;gBACX,KAAK,EAAE,wBAAwB;gBAC/B,MAAM,EAAE,oBAAoB;gBAC5B,OAAO,EAAE,aAAa,IAAI,2DAA2D;aACtF,CAAC,CAAC;QACL,CAAC;QAED,OAAO;YACL,IAAI;YACJ,MAAM,EAAE,cAAc;YACtB,QAAQ,EAAE,OAAO,CAAC,MAAM,KAAK,CAAC;YAC9B,OAAO;SACR,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import type { Capability, ProviderConfig, RunOptions } from '../types.js';
|
|
2
|
-
/**
|
|
3
|
-
* Returns the capabilities a task will have at runtime, accounting for
|
|
4
|
-
* tools, sandboxPolicy, and hosted tools overrides.
|
|
5
|
-
*/
|
|
6
|
-
export declare function resolveTaskCapabilities(providerConfig: ProviderConfig, options: Pick<RunOptions, 'tools' | 'sandboxPolicy'>): Capability[];
|
|
7
|
-
//# sourceMappingURL=resolve-task-capabilities.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"resolve-task-capabilities.d.ts","sourceRoot":"","sources":["../../src/routing/resolve-task-capabilities.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAG1E;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,cAAc,EAAE,cAAc,EAC9B,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE,OAAO,GAAG,eAAe,CAAC,GACnD,UAAU,EAAE,CAad"}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import { getBaseCapabilities } from './capabilities.js';
|
|
2
|
-
/**
|
|
3
|
-
* Returns the capabilities a task will have at runtime, accounting for
|
|
4
|
-
* tools, sandboxPolicy, and hosted tools overrides.
|
|
5
|
-
*/
|
|
6
|
-
export function resolveTaskCapabilities(providerConfig, options) {
|
|
7
|
-
// If tools are disabled for this task, no capabilities are offered.
|
|
8
|
-
if (options.tools === 'none')
|
|
9
|
-
return [];
|
|
10
|
-
// Merge the per-task sandboxPolicy override (if any) into a config snapshot
|
|
11
|
-
// before asking getBaseCapabilities. The provider's persisted config is NOT
|
|
12
|
-
// mutated.
|
|
13
|
-
const mergedConfig = {
|
|
14
|
-
...providerConfig,
|
|
15
|
-
sandboxPolicy: options.sandboxPolicy ?? providerConfig.sandboxPolicy,
|
|
16
|
-
};
|
|
17
|
-
return getBaseCapabilities(mergedConfig);
|
|
18
|
-
}
|
|
19
|
-
//# sourceMappingURL=resolve-task-capabilities.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"resolve-task-capabilities.js","sourceRoot":"","sources":["../../src/routing/resolve-task-capabilities.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAExD;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CACrC,cAA8B,EAC9B,OAAoD;IAEpD,oEAAoE;IACpE,IAAI,OAAO,CAAC,KAAK,KAAK,MAAM;QAAE,OAAO,EAAE,CAAC;IAExC,4EAA4E;IAC5E,4EAA4E;IAC5E,WAAW;IACX,MAAM,YAAY,GAAmB;QACnC,GAAG,cAAc;QACjB,aAAa,EAAE,OAAO,CAAC,aAAa,IAAI,cAAc,CAAC,aAAa;KACrE,CAAC;IAEF,OAAO,mBAAmB,CAAC,YAAY,CAAC,CAAC;AAC3C,CAAC"}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import type { ProviderConfig, TaskSpec, MultiModelConfig } from '../types.js';
|
|
2
|
-
export interface SelectedProvider {
|
|
3
|
-
name: string;
|
|
4
|
-
config: ProviderConfig;
|
|
5
|
-
}
|
|
6
|
-
/**
|
|
7
|
-
* Select which provider to use for a task (when provider is omitted).
|
|
8
|
-
* Algorithm:
|
|
9
|
-
* 1. Capability filter (HARD): exclude providers missing any requiredCapability.
|
|
10
|
-
* 2. Tier filter (HARD): exclude providers whose findModelProfile(model).tier < task.tier.
|
|
11
|
-
* Tier ordering: trivial < standard < reasoning.
|
|
12
|
-
* 3. Cost preference (STRONG): among remainder, select cheapest costTier.
|
|
13
|
-
* 4. Tiebreaker: ASCII/lexicographic by provider name.
|
|
14
|
-
*
|
|
15
|
-
* Returns null if no provider passes all filters.
|
|
16
|
-
*/
|
|
17
|
-
export declare function selectProviderForTask(task: TaskSpec, config: MultiModelConfig): SelectedProvider | null;
|
|
18
|
-
//# sourceMappingURL=select-provider-for-task.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"select-provider-for-task.d.ts","sourceRoot":"","sources":["../../src/routing/select-provider-for-task.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAI9E,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,cAAc,CAAA;CACvB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,QAAQ,EACd,MAAM,EAAE,gBAAgB,GACvB,gBAAgB,GAAG,IAAI,CAsCzB"}
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
import { resolveTaskCapabilities } from './resolve-task-capabilities.js';
|
|
2
|
-
import { findModelProfile, getEffectiveCostTier } from './model-profiles.js';
|
|
3
|
-
/**
|
|
4
|
-
* Select which provider to use for a task (when provider is omitted).
|
|
5
|
-
* Algorithm:
|
|
6
|
-
* 1. Capability filter (HARD): exclude providers missing any requiredCapability.
|
|
7
|
-
* 2. Tier filter (HARD): exclude providers whose findModelProfile(model).tier < task.tier.
|
|
8
|
-
* Tier ordering: trivial < standard < reasoning.
|
|
9
|
-
* 3. Cost preference (STRONG): among remainder, select cheapest costTier.
|
|
10
|
-
* 4. Tiebreaker: ASCII/lexicographic by provider name.
|
|
11
|
-
*
|
|
12
|
-
* Returns null if no provider passes all filters.
|
|
13
|
-
*/
|
|
14
|
-
export function selectProviderForTask(task, config) {
|
|
15
|
-
const TIER_ORDER = { trivial: 0, standard: 1, reasoning: 2 };
|
|
16
|
-
const eligible = [];
|
|
17
|
-
for (const [name, providerConfig] of Object.entries(config.providers)) {
|
|
18
|
-
// 1. Capability check
|
|
19
|
-
const caps = resolveTaskCapabilities(providerConfig, {
|
|
20
|
-
tools: task.tools ?? 'full',
|
|
21
|
-
sandboxPolicy: task.sandboxPolicy ?? providerConfig.sandboxPolicy,
|
|
22
|
-
});
|
|
23
|
-
const missing = task.requiredCapabilities.filter((c) => !caps.includes(c));
|
|
24
|
-
if (missing.length > 0)
|
|
25
|
-
continue;
|
|
26
|
-
// 2. Tier check
|
|
27
|
-
const profile = findModelProfile(providerConfig.model);
|
|
28
|
-
const requiredTierOrder = TIER_ORDER[task.tier] ?? 0;
|
|
29
|
-
const providerTierOrder = TIER_ORDER[profile.tier] ?? 0;
|
|
30
|
-
if (providerTierOrder < requiredTierOrder)
|
|
31
|
-
continue;
|
|
32
|
-
// Passed both filters — track for cost comparison
|
|
33
|
-
const costTier = getEffectiveCostTier(providerConfig);
|
|
34
|
-
eligible.push({ name, config: providerConfig, costTier });
|
|
35
|
-
}
|
|
36
|
-
if (eligible.length === 0)
|
|
37
|
-
return null;
|
|
38
|
-
// 3. Sort by cost tier: free < low < medium < high
|
|
39
|
-
const COST_ORDER = { free: 0, low: 1, medium: 2, high: 3 };
|
|
40
|
-
eligible.sort((a, b) => {
|
|
41
|
-
const costDiff = (COST_ORDER[a.costTier] ?? 3) - (COST_ORDER[b.costTier] ?? 3);
|
|
42
|
-
if (costDiff !== 0)
|
|
43
|
-
return costDiff;
|
|
44
|
-
// 4. Tiebreaker: provider name ascending
|
|
45
|
-
return a.name.localeCompare(b.name);
|
|
46
|
-
});
|
|
47
|
-
const winner = eligible[0];
|
|
48
|
-
return { name: winner.name, config: winner.config };
|
|
49
|
-
}
|
|
50
|
-
//# sourceMappingURL=select-provider-for-task.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"select-provider-for-task.js","sourceRoot":"","sources":["../../src/routing/select-provider-for-task.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AACzE,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAO7E;;;;;;;;;;GAUG;AACH,MAAM,UAAU,qBAAqB,CACnC,IAAc,EACd,MAAwB;IAExB,MAAM,UAAU,GAA2B,EAAE,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;IAErF,MAAM,QAAQ,GAAiE,EAAE,CAAC;IAElF,KAAK,MAAM,CAAC,IAAI,EAAE,cAAc,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;QACtE,sBAAsB;QACtB,MAAM,IAAI,GAAG,uBAAuB,CAAC,cAAc,EAAE;YACnD,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,MAAM;YAC3B,aAAa,EAAE,IAAI,CAAC,aAAa,IAAI,cAAc,CAAC,aAAa;SAClE,CAAC,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3E,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;YAAE,SAAS;QAEjC,gBAAgB;QAChB,MAAM,OAAO,GAAG,gBAAgB,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QACvD,MAAM,iBAAiB,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrD,MAAM,iBAAiB,GAAG,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxD,IAAI,iBAAiB,GAAG,iBAAiB;YAAE,SAAS;QAEpD,kDAAkD;QAClD,MAAM,QAAQ,GAAG,oBAAoB,CAAC,cAAc,CAAC,CAAC;QACtD,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC5D,CAAC;IAED,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAEvC,mDAAmD;IACnD,MAAM,UAAU,GAA2B,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;IACnF,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACrB,MAAM,QAAQ,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;QAC/E,IAAI,QAAQ,KAAK,CAAC;YAAE,OAAO,QAAQ,CAAC;QACpC,yCAAyC;QACzC,OAAO,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC3B,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;AACtD,CAAC"}
|