@antseed/cli 0.1.3 → 0.1.5
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/README.md +20 -4
- package/dist/cli/commands/browse.d.ts.map +1 -1
- package/dist/cli/commands/browse.js +3 -1
- package/dist/cli/commands/browse.js.map +1 -1
- package/dist/cli/commands/plugin.test.js +6 -7
- package/dist/cli/commands/plugin.test.js.map +1 -1
- package/dist/cli/commands/seed.d.ts.map +1 -1
- package/dist/cli/commands/seed.js +70 -23
- package/dist/cli/commands/seed.js.map +1 -1
- package/dist/cli/commands/seed.test.js +7 -0
- package/dist/cli/commands/seed.test.js.map +1 -1
- package/dist/config/defaults.js +1 -1
- package/dist/config/defaults.js.map +1 -1
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +40 -0
- package/dist/config/loader.js.map +1 -1
- package/dist/config/loader.test.js +27 -0
- package/dist/config/loader.test.js.map +1 -1
- package/dist/config/types.d.ts +8 -0
- package/dist/config/types.d.ts.map +1 -1
- package/dist/config/validation.d.ts.map +1 -1
- package/dist/config/validation.js +35 -0
- package/dist/config/validation.js.map +1 -1
- package/dist/plugins/loader.js +2 -2
- package/dist/plugins/loader.js.map +1 -1
- package/dist/plugins/registry.d.ts.map +1 -1
- package/dist/plugins/registry.js +6 -12
- package/dist/plugins/registry.js.map +1 -1
- package/dist/proxy/buyer-proxy.d.ts +12 -1
- package/dist/proxy/buyer-proxy.d.ts.map +1 -1
- package/dist/proxy/buyer-proxy.js +192 -64
- package/dist/proxy/buyer-proxy.js.map +1 -1
- package/dist/proxy/buyer-proxy.test.d.ts +2 -0
- package/dist/proxy/buyer-proxy.test.d.ts.map +1 -0
- package/dist/proxy/buyer-proxy.test.js +41 -0
- package/dist/proxy/buyer-proxy.test.js.map +1 -0
- package/dist/proxy/model-api-adapter.d.ts +20 -0
- package/dist/proxy/model-api-adapter.d.ts.map +1 -0
- package/dist/proxy/model-api-adapter.js +514 -0
- package/dist/proxy/model-api-adapter.js.map +1 -0
- package/package.json +4 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/config/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAElD;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,+BAA+B;IAC/B,IAAI,EAAE,YAAY,CAAC;IACnB,uBAAuB;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,sDAAsD;IACtD,cAAc,EAAE,MAAM,CAAC;IACvB,iCAAiC;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,mGAAmG;IACnG,QAAQ,CAAC,EAAE,QAAQ,GAAG,OAAO,GAAG,aAAa,CAAC;IAC9C,8DAA8D;IAC9D,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,0EAA0E;IAC1E,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,YAAY,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAElD;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACxC,kBAAkB,EAAE,MAAM,CAAC;IAC3B,mBAAmB,EAAE,MAAM,CAAC;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,EAAE,yBAAyB,CAAC;IACrC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,yBAAyB,CAAC,CAAC;CACpD;AAED;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACxC,QAAQ,EAAE,yBAAyB,CAAC;IACpC,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC;CACnD;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,8DAA8D;IAC9D,YAAY,EAAE,MAAM,CAAC;IACrB,qDAAqD;IACrD,mBAAmB,EAAE,MAAM,CAAC;IAC5B,mDAAmD;IACnD,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,sDAAsD;IACtD,OAAO,EAAE,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/config/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/config/validation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,aAAa,EAEd,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/config/validation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,aAAa,EAEd,MAAM,YAAY,CAAC;AA8EpB;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,EAAE,CAwB9D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAK7D"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
const MODEL_CATEGORY_PATTERN = /^[a-z0-9][a-z0-9-]*$/;
|
|
1
2
|
function validatePricingLeaf(path, value, errors) {
|
|
2
3
|
if (!Number.isFinite(value.inputUsdPerMillion) || value.inputUsdPerMillion < 0) {
|
|
3
4
|
errors.push(`${path}.inputUsdPerMillion must be a non-negative finite number`);
|
|
@@ -17,12 +18,46 @@ function validateHierarchicalPricing(path, pricing, errors) {
|
|
|
17
18
|
}
|
|
18
19
|
}
|
|
19
20
|
}
|
|
21
|
+
function validateSellerModelCategories(path, categories, errors) {
|
|
22
|
+
if (!categories)
|
|
23
|
+
return;
|
|
24
|
+
for (const [provider, models] of Object.entries(categories)) {
|
|
25
|
+
for (const [model, tags] of Object.entries(models)) {
|
|
26
|
+
const modelPath = `${path}.${provider}.${model}`;
|
|
27
|
+
if (!Array.isArray(tags) || tags.length === 0) {
|
|
28
|
+
errors.push(`${modelPath} must be a non-empty string array`);
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
31
|
+
const seen = new Set();
|
|
32
|
+
for (let i = 0; i < tags.length; i += 1) {
|
|
33
|
+
const rawTag = tags[i];
|
|
34
|
+
if (typeof rawTag !== 'string') {
|
|
35
|
+
errors.push(`${modelPath}[${i}] must be a string`);
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
const tag = rawTag.trim().toLowerCase();
|
|
39
|
+
if (tag.length === 0) {
|
|
40
|
+
errors.push(`${modelPath}[${i}] must not be empty`);
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
if (!MODEL_CATEGORY_PATTERN.test(tag)) {
|
|
44
|
+
errors.push(`${modelPath}[${i}] must use lowercase letters, digits, or hyphen`);
|
|
45
|
+
}
|
|
46
|
+
if (seen.has(tag)) {
|
|
47
|
+
errors.push(`${modelPath}[${i}] is duplicated`);
|
|
48
|
+
}
|
|
49
|
+
seen.add(tag);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
20
54
|
/**
|
|
21
55
|
* Validate the full config and return all issues.
|
|
22
56
|
*/
|
|
23
57
|
export function validateConfig(config) {
|
|
24
58
|
const errors = [];
|
|
25
59
|
validateHierarchicalPricing('seller.pricing', config.seller.pricing, errors);
|
|
60
|
+
validateSellerModelCategories('seller.modelCategories', config.seller.modelCategories, errors);
|
|
26
61
|
validateHierarchicalPricing('buyer.maxPricing', config.buyer.maxPricing, errors);
|
|
27
62
|
if (!Number.isFinite(config.buyer.minPeerReputation) || config.buyer.minPeerReputation < 0 || config.buyer.minPeerReputation > 100) {
|
|
28
63
|
errors.push('buyer.minPeerReputation must be in range 0-100');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/config/validation.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/config/validation.ts"],"names":[],"mappings":"AAMA,MAAM,sBAAsB,GAAG,sBAAsB,CAAC;AAEtD,SAAS,mBAAmB,CAC1B,IAAY,EACZ,KAAgC,EAChC,MAAgB;IAEhB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,kBAAkB,CAAC,IAAI,KAAK,CAAC,kBAAkB,GAAG,CAAC,EAAE,CAAC;QAC/E,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,0DAA0D,CAAC,CAAC;IACjF,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,mBAAmB,CAAC,IAAI,KAAK,CAAC,mBAAmB,GAAG,CAAC,EAAE,CAAC;QACjF,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,2DAA2D,CAAC,CAAC;IAClF,CAAC;AACH,CAAC;AAED,SAAS,2BAA2B,CAClC,IAAY,EACZ,OAAkC,EAClC,MAAgB;IAEhB,mBAAmB,CAAC,GAAG,IAAI,WAAW,EAAE,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAElE,KAAK,MAAM,CAAC,QAAQ,EAAE,eAAe,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC,EAAE,CAAC;QAClF,IAAI,eAAe,CAAC,QAAQ,EAAE,CAAC;YAC7B,mBAAmB,CAAC,GAAG,IAAI,cAAc,QAAQ,WAAW,EAAE,eAAe,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAClG,CAAC;QAED,KAAK,MAAM,CAAC,KAAK,EAAE,YAAY,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE,CAAC;YACjF,mBAAmB,CACjB,GAAG,IAAI,cAAc,QAAQ,WAAW,KAAK,EAAE,EAC/C,YAAY,EACZ,MAAM,CACP,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,6BAA6B,CACpC,IAAY,EACZ,UAAkE,EAClE,MAAgB;IAEhB,IAAI,CAAC,UAAU;QAAE,OAAO;IAExB,KAAK,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5D,KAAK,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YACnD,MAAM,SAAS,GAAG,GAAG,IAAI,IAAI,QAAQ,IAAI,KAAK,EAAE,CAAC;YACjD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC9C,MAAM,CAAC,IAAI,CAAC,GAAG,SAAS,mCAAmC,CAAC,CAAC;gBAC7D,SAAS;YACX,CAAC;YAED,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;YAC/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;gBACxC,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;gBACvB,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;oBAC/B,MAAM,CAAC,IAAI,CAAC,GAAG,SAAS,IAAI,CAAC,oBAAoB,CAAC,CAAC;oBACnD,SAAS;gBACX,CAAC;gBACD,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;gBACxC,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBACrB,MAAM,CAAC,IAAI,CAAC,GAAG,SAAS,IAAI,CAAC,qBAAqB,CAAC,CAAC;oBACpD,SAAS;gBACX,CAAC;gBACD,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;oBACtC,MAAM,CAAC,IAAI,CAAC,GAAG,SAAS,IAAI,CAAC,iDAAiD,CAAC,CAAC;gBAClF,CAAC;gBACD,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;oBAClB,MAAM,CAAC,IAAI,CAAC,GAAG,SAAS,IAAI,CAAC,iBAAiB,CAAC,CAAC;gBAClD,CAAC;gBACD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAChB,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,MAAqB;IAClD,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,2BAA2B,CAAC,gBAAgB,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC7E,6BAA6B,CAAC,wBAAwB,EAAE,MAAM,CAAC,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;IAC/F,2BAA2B,CAAC,kBAAkB,EAAE,MAAM,CAAC,KAAK,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IAEjF,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,iBAAiB,GAAG,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,iBAAiB,GAAG,GAAG,EAAE,CAAC;QACnI,MAAM,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC;IAChE,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,SAAS,GAAG,KAAK,EAAE,CAAC;QAC9G,MAAM,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC;IACrE,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,mBAAmB,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,mBAAmB,GAAG,CAAC,EAAE,CAAC;QAClG,MAAM,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAC;IACpE,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,YAAY,GAAG,CAAC,EAAE,CAAC;QACnF,MAAM,CAAC,IAAI,CAAC,0DAA0D,CAAC,CAAC;IAC1E,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAqB;IACrD,MAAM,MAAM,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IACtC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAEhC,MAAM,IAAI,KAAK,CAAC,sBAAsB,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAC/D,CAAC"}
|
package/dist/plugins/loader.js
CHANGED
|
@@ -64,7 +64,7 @@ export function buildPluginConfig(configKeys, runtimeOverrides, instanceConfig)
|
|
|
64
64
|
}
|
|
65
65
|
/** Map legacy package names to current names */
|
|
66
66
|
export const LEGACY_PACKAGE_MAP = {
|
|
67
|
-
'antseed-provider-anthropic': '@antseed/provider-
|
|
68
|
-
'antseed-router-claude-code': '@antseed/router-local
|
|
67
|
+
'antseed-provider-anthropic': '@antseed/provider-anthropic',
|
|
68
|
+
'antseed-router-claude-code': '@antseed/router-local',
|
|
69
69
|
};
|
|
70
70
|
//# sourceMappingURL=loader.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/plugins/loader.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/plugins/loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/plugins/registry.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,UAAU,GAAG,QAAQ,CAAA;IAC3B,WAAW,EAAE,MAAM,CAAA;IACnB,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,eAAO,MAAM,eAAe,EAAE,aAAa,
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/plugins/registry.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,UAAU,GAAG,QAAQ,CAAA;IAC3B,WAAW,EAAE,MAAM,CAAA;IACnB,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,eAAO,MAAM,eAAe,EAAE,aAAa,EA+B1C,CAAA"}
|
package/dist/plugins/registry.js
CHANGED
|
@@ -12,10 +12,10 @@ export const TRUSTED_PLUGINS = [
|
|
|
12
12
|
package: '@antseed/provider-claude-code',
|
|
13
13
|
},
|
|
14
14
|
{
|
|
15
|
-
name: '
|
|
15
|
+
name: 'openai',
|
|
16
16
|
type: 'provider',
|
|
17
|
-
description: '
|
|
18
|
-
package: '@antseed/provider-
|
|
17
|
+
description: 'OpenAI-compatible provider (OpenAI, Together, OpenRouter, API key)',
|
|
18
|
+
package: '@antseed/provider-openai',
|
|
19
19
|
},
|
|
20
20
|
{
|
|
21
21
|
name: 'local-llm',
|
|
@@ -24,16 +24,10 @@ export const TRUSTED_PLUGINS = [
|
|
|
24
24
|
package: '@antseed/provider-local-llm',
|
|
25
25
|
},
|
|
26
26
|
{
|
|
27
|
-
name: 'local
|
|
27
|
+
name: 'local',
|
|
28
28
|
type: 'router',
|
|
29
|
-
description: 'Local
|
|
30
|
-
package: '@antseed/router-local
|
|
31
|
-
},
|
|
32
|
-
{
|
|
33
|
-
name: 'local-chat',
|
|
34
|
-
type: 'router',
|
|
35
|
-
description: 'Local desktop chat router',
|
|
36
|
-
package: '@antseed/router-local-chat',
|
|
29
|
+
description: 'Local router for Claude Code, Aider, Codex',
|
|
30
|
+
package: '@antseed/router-local',
|
|
37
31
|
},
|
|
38
32
|
];
|
|
39
33
|
//# sourceMappingURL=registry.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/plugins/registry.ts"],"names":[],"mappings":"AAOA,MAAM,CAAC,MAAM,eAAe,GAAoB;IAC9C;QACE,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,UAAU;QAChB,WAAW,EAAE,kCAAkC;QAC/C,OAAO,EAAE,6BAA6B;KACvC;IACD;QACE,IAAI,EAAE,aAAa;QACnB,IAAI,EAAE,UAAU;QAChB,WAAW,EAAE,8CAA8C;QAC3D,OAAO,EAAE,+BAA+B;KACzC;IACD;QACE,IAAI,EAAE,
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/plugins/registry.ts"],"names":[],"mappings":"AAOA,MAAM,CAAC,MAAM,eAAe,GAAoB;IAC9C;QACE,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,UAAU;QAChB,WAAW,EAAE,kCAAkC;QAC/C,OAAO,EAAE,6BAA6B;KACvC;IACD;QACE,IAAI,EAAE,aAAa;QACnB,IAAI,EAAE,UAAU;QAChB,WAAW,EAAE,8CAA8C;QAC3D,OAAO,EAAE,+BAA+B;KACzC;IACD;QACE,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,UAAU;QAChB,WAAW,EAAE,oEAAoE;QACjF,OAAO,EAAE,0BAA0B;KACpC;IACD;QACE,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,UAAU;QAChB,WAAW,EAAE,wCAAwC;QACrD,OAAO,EAAE,6BAA6B;KACvC;IACD;QACE,IAAI,EAAE,OAAO;QACb,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,4CAA4C;QACzD,OAAO,EAAE,uBAAuB;KACjC;CACF,CAAA"}
|
|
@@ -1,10 +1,20 @@
|
|
|
1
|
-
import type { AntseedNode } from '@antseed/node';
|
|
1
|
+
import type { AntseedNode, PeerInfo } from '@antseed/node';
|
|
2
|
+
import { type ModelApiProtocol, type TargetProtocolSelection } from './model-api-adapter.js';
|
|
2
3
|
export interface BuyerProxyConfig {
|
|
3
4
|
port: number;
|
|
4
5
|
node: AntseedNode;
|
|
5
6
|
/** How long to cache discovered peers before re-querying DHT (ms). Default: 30000 */
|
|
6
7
|
peerCacheTtlMs?: number;
|
|
7
8
|
}
|
|
9
|
+
type PeerProtocolRoutePlan = {
|
|
10
|
+
provider: string;
|
|
11
|
+
selection: TargetProtocolSelection | null;
|
|
12
|
+
};
|
|
13
|
+
export type CandidatePeerRouteSelection = {
|
|
14
|
+
candidatePeers: PeerInfo[];
|
|
15
|
+
routePlanByPeerId: Map<string, PeerProtocolRoutePlan>;
|
|
16
|
+
};
|
|
17
|
+
export declare function selectCandidatePeersForRouting(peers: PeerInfo[], requestProtocol: ModelApiProtocol | null, requestedModel: string | null, explicitProvider: string | null): CandidatePeerRouteSelection;
|
|
8
18
|
/**
|
|
9
19
|
* Local HTTP proxy that forwards requests to P2P sellers.
|
|
10
20
|
*
|
|
@@ -27,4 +37,5 @@ export declare class BuyerProxy {
|
|
|
27
37
|
private _formatPeerSelectionDiagnostics;
|
|
28
38
|
private _handleRequest;
|
|
29
39
|
}
|
|
40
|
+
export {};
|
|
30
41
|
//# sourceMappingURL=buyer-proxy.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"buyer-proxy.d.ts","sourceRoot":"","sources":["../../src/proxy/buyer-proxy.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"buyer-proxy.d.ts","sourceRoot":"","sources":["../../src/proxy/buyer-proxy.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,WAAW,EACX,QAAQ,EAKT,MAAM,eAAe,CAAA;AACtB,OAAO,EAGL,KAAK,gBAAgB,EAErB,KAAK,uBAAuB,EAG7B,MAAM,wBAAwB,CAAA;AAE/B,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,WAAW,CAAA;IACjB,qFAAqF;IACrF,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB;AA+BD,KAAK,qBAAqB,GAAG;IAC3B,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,uBAAuB,GAAG,IAAI,CAAA;CAC1C,CAAA;AAED,MAAM,MAAM,2BAA2B,GAAG;IACxC,cAAc,EAAE,QAAQ,EAAE,CAAA;IAC1B,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAA;CACtD,CAAA;AA0ED,wBAAgB,8BAA8B,CAC5C,KAAK,EAAE,QAAQ,EAAE,EACjB,eAAe,EAAE,gBAAgB,GAAG,IAAI,EACxC,cAAc,EAAE,MAAM,GAAG,IAAI,EAC7B,gBAAgB,EAAE,MAAM,GAAG,IAAI,GAC9B,2BAA2B,CAoB7B;AAwWD;;;;;;GAMG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAQ;IAChC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAa;IACnC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAQ;IAC9B,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAQ;IAExC,OAAO,CAAC,YAAY,CAAiB;IACrC,OAAO,CAAC,eAAe,CAAI;gBAEf,MAAM,EAAE,gBAAgB;IAe9B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAUtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAMb,wBAAwB;YAsDxB,SAAS;IAkCvB,OAAO,CAAC,+BAA+B;YAuBzB,cAAc;CAiQ7B"}
|
|
@@ -3,12 +3,81 @@ import { randomUUID } from 'node:crypto';
|
|
|
3
3
|
import { readFile } from 'node:fs/promises';
|
|
4
4
|
import { join } from 'node:path';
|
|
5
5
|
import { homedir } from 'node:os';
|
|
6
|
+
import { detectRequestModelApiProtocol, inferProviderDefaultModelApiProtocols, selectTargetProtocolForRequest, transformAnthropicMessagesRequestToOpenAIChat, transformOpenAIChatResponseToAnthropicMessage, } from './model-api-adapter.js';
|
|
6
7
|
const DAEMON_STATE_FILE = join(homedir(), '.antseed', 'daemon.state.json');
|
|
7
8
|
const DEBUG = () => ['1', 'true', 'yes', 'on'].includes((process.env['ANTSEED_DEBUG'] ?? '').trim().toLowerCase());
|
|
8
9
|
function log(...args) {
|
|
9
10
|
if (DEBUG())
|
|
10
11
|
console.log('[proxy]', ...args);
|
|
11
12
|
}
|
|
13
|
+
function getExplicitProviderOverride(request) {
|
|
14
|
+
const provider = request.headers['x-antseed-provider']?.trim().toLowerCase();
|
|
15
|
+
return provider && provider.length > 0 ? provider : null;
|
|
16
|
+
}
|
|
17
|
+
function getPeerProviderProtocols(peer, provider, requestedModel) {
|
|
18
|
+
const fromMetadata = peer.providerModelApiProtocols?.[provider]?.models;
|
|
19
|
+
if (fromMetadata) {
|
|
20
|
+
if (requestedModel && fromMetadata[requestedModel]?.length) {
|
|
21
|
+
return Array.from(new Set(fromMetadata[requestedModel]));
|
|
22
|
+
}
|
|
23
|
+
const merged = Object.values(fromMetadata).flat();
|
|
24
|
+
if (merged.length > 0) {
|
|
25
|
+
return Array.from(new Set(merged));
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return inferProviderDefaultModelApiProtocols(provider);
|
|
29
|
+
}
|
|
30
|
+
function resolvePeerRoutePlan(peer, requestProtocol, requestedModel, explicitProvider) {
|
|
31
|
+
const providers = peer.providers
|
|
32
|
+
.map((provider) => provider.trim().toLowerCase())
|
|
33
|
+
.filter((provider) => provider.length > 0);
|
|
34
|
+
if (providers.length === 0) {
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
if (explicitProvider && !providers.includes(explicitProvider)) {
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
const candidates = explicitProvider ? [explicitProvider] : providers;
|
|
41
|
+
if (!requestProtocol) {
|
|
42
|
+
const provider = candidates[0];
|
|
43
|
+
return provider ? { provider, selection: null } : null;
|
|
44
|
+
}
|
|
45
|
+
let transformedFallback = null;
|
|
46
|
+
for (const provider of candidates) {
|
|
47
|
+
const supportedProtocols = getPeerProviderProtocols(peer, provider, requestedModel);
|
|
48
|
+
const selection = selectTargetProtocolForRequest(requestProtocol, supportedProtocols);
|
|
49
|
+
if (!selection) {
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
if (!selection.requiresTransform) {
|
|
53
|
+
return { provider, selection };
|
|
54
|
+
}
|
|
55
|
+
if (!transformedFallback) {
|
|
56
|
+
transformedFallback = { provider, selection };
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return transformedFallback;
|
|
60
|
+
}
|
|
61
|
+
export function selectCandidatePeersForRouting(peers, requestProtocol, requestedModel, explicitProvider) {
|
|
62
|
+
const routePlanByPeerId = new Map();
|
|
63
|
+
if (!requestProtocol && !explicitProvider) {
|
|
64
|
+
return {
|
|
65
|
+
candidatePeers: peers,
|
|
66
|
+
routePlanByPeerId,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
const candidatePeers = peers.filter((peer) => {
|
|
70
|
+
const plan = resolvePeerRoutePlan(peer, requestProtocol, requestedModel, explicitProvider);
|
|
71
|
+
if (!plan)
|
|
72
|
+
return false;
|
|
73
|
+
routePlanByPeerId.set(peer.peerId, plan);
|
|
74
|
+
return true;
|
|
75
|
+
});
|
|
76
|
+
return {
|
|
77
|
+
candidatePeers,
|
|
78
|
+
routePlanByPeerId,
|
|
79
|
+
};
|
|
80
|
+
}
|
|
12
81
|
function parseTokenCount(value) {
|
|
13
82
|
const parsed = Number(value);
|
|
14
83
|
if (!Number.isFinite(parsed) || parsed <= 0) {
|
|
@@ -130,9 +199,9 @@ function parseJsonUsage(body) {
|
|
|
130
199
|
}
|
|
131
200
|
}
|
|
132
201
|
function pickProviderForPeer(peer, request) {
|
|
133
|
-
const explicit = request
|
|
134
|
-
if (explicit
|
|
135
|
-
return explicit
|
|
202
|
+
const explicit = getExplicitProviderOverride(request);
|
|
203
|
+
if (explicit) {
|
|
204
|
+
return explicit;
|
|
136
205
|
}
|
|
137
206
|
if (request.path.startsWith('/v1/messages') && peer.providers.includes('anthropic')) {
|
|
138
207
|
return 'anthropic';
|
|
@@ -160,33 +229,42 @@ function extractRequestedModel(request) {
|
|
|
160
229
|
return null;
|
|
161
230
|
}
|
|
162
231
|
}
|
|
232
|
+
function toFiniteNumberOrNull(value) {
|
|
233
|
+
return typeof value === 'number' && Number.isFinite(value) ? value : null;
|
|
234
|
+
}
|
|
235
|
+
function setFiniteNumberHeader(headers, name, value) {
|
|
236
|
+
const finite = toFiniteNumberOrNull(value);
|
|
237
|
+
if (finite !== null) {
|
|
238
|
+
headers[name] = String(finite);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
function setPeerIdentityHeaders(headers, selectedPeer) {
|
|
242
|
+
headers['x-antseed-peer-id'] = selectedPeer.peerId;
|
|
243
|
+
if (selectedPeer.publicAddress) {
|
|
244
|
+
headers['x-antseed-peer-address'] = selectedPeer.publicAddress;
|
|
245
|
+
}
|
|
246
|
+
if (selectedPeer.providers.length > 0) {
|
|
247
|
+
headers['x-antseed-peer-providers'] = selectedPeer.providers.join(',');
|
|
248
|
+
}
|
|
249
|
+
}
|
|
163
250
|
function resolvePeerPricing(peer, provider, model) {
|
|
164
251
|
const providerPricing = peer.providerPricing?.[provider];
|
|
165
252
|
if (providerPricing) {
|
|
166
|
-
|
|
253
|
+
const modelPricing = model ? providerPricing.models?.[model] : undefined;
|
|
254
|
+
if (modelPricing) {
|
|
167
255
|
return {
|
|
168
|
-
inputUsdPerMillion:
|
|
169
|
-
|
|
170
|
-
: null,
|
|
171
|
-
outputUsdPerMillion: Number.isFinite(providerPricing.models[model].outputUsdPerMillion)
|
|
172
|
-
? providerPricing.models[model].outputUsdPerMillion
|
|
173
|
-
: null,
|
|
256
|
+
inputUsdPerMillion: toFiniteNumberOrNull(modelPricing.inputUsdPerMillion),
|
|
257
|
+
outputUsdPerMillion: toFiniteNumberOrNull(modelPricing.outputUsdPerMillion),
|
|
174
258
|
};
|
|
175
259
|
}
|
|
176
260
|
return {
|
|
177
|
-
inputUsdPerMillion:
|
|
178
|
-
|
|
179
|
-
: null,
|
|
180
|
-
outputUsdPerMillion: Number.isFinite(providerPricing.defaults.outputUsdPerMillion)
|
|
181
|
-
? providerPricing.defaults.outputUsdPerMillion
|
|
182
|
-
: null,
|
|
261
|
+
inputUsdPerMillion: toFiniteNumberOrNull(providerPricing.defaults.inputUsdPerMillion),
|
|
262
|
+
outputUsdPerMillion: toFiniteNumberOrNull(providerPricing.defaults.outputUsdPerMillion),
|
|
183
263
|
};
|
|
184
264
|
}
|
|
185
|
-
const input = peer.defaultInputUsdPerMillion;
|
|
186
|
-
const output = peer.defaultOutputUsdPerMillion;
|
|
187
265
|
return {
|
|
188
|
-
inputUsdPerMillion:
|
|
189
|
-
outputUsdPerMillion:
|
|
266
|
+
inputUsdPerMillion: toFiniteNumberOrNull(peer.defaultInputUsdPerMillion),
|
|
267
|
+
outputUsdPerMillion: toFiniteNumberOrNull(peer.defaultOutputUsdPerMillion),
|
|
190
268
|
};
|
|
191
269
|
}
|
|
192
270
|
function computeResponseTelemetry(request, responseHeaders, responseBody, selectedPeer) {
|
|
@@ -232,35 +310,17 @@ function attachAntseedTelemetryHeaders(upstreamHeaders, selectedPeer, telemetry,
|
|
|
232
310
|
const headers = { ...upstreamHeaders };
|
|
233
311
|
headers['x-antseed-request-id'] = requestId;
|
|
234
312
|
headers['x-antseed-latency-ms'] = String(Math.max(0, Math.floor(latencyMs)));
|
|
235
|
-
headers
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
headers['x-antseed-peer-providers'] = selectedPeer.providers.join(',');
|
|
241
|
-
}
|
|
242
|
-
if (typeof selectedPeer.reputationScore === 'number' && Number.isFinite(selectedPeer.reputationScore)) {
|
|
243
|
-
headers['x-antseed-peer-reputation'] = String(selectedPeer.reputationScore);
|
|
244
|
-
}
|
|
245
|
-
if (typeof selectedPeer.trustScore === 'number' && Number.isFinite(selectedPeer.trustScore)) {
|
|
246
|
-
headers['x-antseed-peer-trust-score'] = String(selectedPeer.trustScore);
|
|
247
|
-
}
|
|
248
|
-
if (typeof selectedPeer.currentLoad === 'number' && Number.isFinite(selectedPeer.currentLoad)) {
|
|
249
|
-
headers['x-antseed-peer-current-load'] = String(selectedPeer.currentLoad);
|
|
250
|
-
}
|
|
251
|
-
if (typeof selectedPeer.maxConcurrency === 'number' && Number.isFinite(selectedPeer.maxConcurrency)) {
|
|
252
|
-
headers['x-antseed-peer-max-concurrency'] = String(selectedPeer.maxConcurrency);
|
|
253
|
-
}
|
|
313
|
+
setPeerIdentityHeaders(headers, selectedPeer);
|
|
314
|
+
setFiniteNumberHeader(headers, 'x-antseed-peer-reputation', selectedPeer.reputationScore);
|
|
315
|
+
setFiniteNumberHeader(headers, 'x-antseed-peer-trust-score', selectedPeer.trustScore);
|
|
316
|
+
setFiniteNumberHeader(headers, 'x-antseed-peer-current-load', selectedPeer.currentLoad);
|
|
317
|
+
setFiniteNumberHeader(headers, 'x-antseed-peer-max-concurrency', selectedPeer.maxConcurrency);
|
|
254
318
|
headers['x-antseed-provider'] = telemetry.pricing.provider;
|
|
255
319
|
if (telemetry.pricing.model) {
|
|
256
320
|
headers['x-antseed-model'] = telemetry.pricing.model;
|
|
257
321
|
}
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
}
|
|
261
|
-
if (telemetry.pricing.outputUsdPerMillion !== null) {
|
|
262
|
-
headers['x-antseed-output-usd-per-million'] = String(telemetry.pricing.outputUsdPerMillion);
|
|
263
|
-
}
|
|
322
|
+
setFiniteNumberHeader(headers, 'x-antseed-input-usd-per-million', telemetry.pricing.inputUsdPerMillion);
|
|
323
|
+
setFiniteNumberHeader(headers, 'x-antseed-output-usd-per-million', telemetry.pricing.outputUsdPerMillion);
|
|
264
324
|
headers['x-antseed-token-source'] = telemetry.usage.source;
|
|
265
325
|
headers['x-antseed-input-tokens'] = String(telemetry.usage.inputTokens);
|
|
266
326
|
headers['x-antseed-output-tokens'] = String(telemetry.usage.outputTokens);
|
|
@@ -273,13 +333,7 @@ function attachAntseedTelemetryHeaders(upstreamHeaders, selectedPeer, telemetry,
|
|
|
273
333
|
function attachStreamingAntseedHeaders(upstreamHeaders, selectedPeer, requestId) {
|
|
274
334
|
const headers = { ...upstreamHeaders };
|
|
275
335
|
headers['x-antseed-request-id'] = requestId;
|
|
276
|
-
headers
|
|
277
|
-
if (selectedPeer.publicAddress) {
|
|
278
|
-
headers['x-antseed-peer-address'] = selectedPeer.publicAddress;
|
|
279
|
-
}
|
|
280
|
-
if (selectedPeer.providers.length > 0) {
|
|
281
|
-
headers['x-antseed-peer-providers'] = selectedPeer.providers.join(',');
|
|
282
|
-
}
|
|
336
|
+
setPeerIdentityHeaders(headers, selectedPeer);
|
|
283
337
|
return headers;
|
|
284
338
|
}
|
|
285
339
|
function requestWantsStreaming(headers, body) {
|
|
@@ -426,6 +480,13 @@ export class BuyerProxy {
|
|
|
426
480
|
this._cachedPeers = peers;
|
|
427
481
|
this._cacheTimestamp = now;
|
|
428
482
|
log(`Found ${peers.length} peer(s)`);
|
|
483
|
+
return peers;
|
|
484
|
+
}
|
|
485
|
+
// DHT returned nothing — fall back to stale cached peers if available.
|
|
486
|
+
// The peer may still be reachable even if the DHT announcement expired.
|
|
487
|
+
if (this._cachedPeers.length > 0) {
|
|
488
|
+
log(`DHT returned 0 peers, reusing ${this._cachedPeers.length} stale cached peer(s)`);
|
|
489
|
+
return this._cachedPeers;
|
|
429
490
|
}
|
|
430
491
|
return peers;
|
|
431
492
|
}
|
|
@@ -485,9 +546,26 @@ export class BuyerProxy {
|
|
|
485
546
|
res.end('No sellers available on the network. Is a seeder running?');
|
|
486
547
|
return;
|
|
487
548
|
}
|
|
549
|
+
const requestProtocol = detectRequestModelApiProtocol(serializedReq);
|
|
550
|
+
const requestedModel = extractRequestedModel(serializedReq);
|
|
551
|
+
const explicitProvider = getExplicitProviderOverride(serializedReq);
|
|
552
|
+
const { candidatePeers, routePlanByPeerId, } = selectCandidatePeersForRouting(peers, requestProtocol, requestedModel, explicitProvider);
|
|
553
|
+
if (candidatePeers.length === 0) {
|
|
554
|
+
const diagnostics = this._formatPeerSelectionDiagnostics(peers);
|
|
555
|
+
res.writeHead(502, { 'content-type': 'text/plain' });
|
|
556
|
+
if (requestProtocol) {
|
|
557
|
+
const protocolLabel = requestProtocol;
|
|
558
|
+
const providerLabel = explicitProvider ? ` for provider "${explicitProvider}"` : '';
|
|
559
|
+
res.end(`No peers support ${protocolLabel}${providerLabel}. ${diagnostics}`);
|
|
560
|
+
}
|
|
561
|
+
else {
|
|
562
|
+
res.end(`No peers advertise provider "${explicitProvider}". ${diagnostics}`);
|
|
563
|
+
}
|
|
564
|
+
return;
|
|
565
|
+
}
|
|
488
566
|
// Use router to select peer
|
|
489
567
|
const router = this._node.router;
|
|
490
|
-
const localPeers =
|
|
568
|
+
const localPeers = candidatePeers.filter((peer) => isLoopbackPeer(peer));
|
|
491
569
|
let selectedPeer = null;
|
|
492
570
|
if (localPeers.length > 0) {
|
|
493
571
|
selectedPeer = router
|
|
@@ -499,29 +577,76 @@ export class BuyerProxy {
|
|
|
499
577
|
}
|
|
500
578
|
if (!selectedPeer) {
|
|
501
579
|
selectedPeer = router
|
|
502
|
-
? router.selectPeer(serializedReq,
|
|
503
|
-
:
|
|
580
|
+
? router.selectPeer(serializedReq, candidatePeers)
|
|
581
|
+
: candidatePeers[0] ?? null;
|
|
504
582
|
}
|
|
505
583
|
if (!selectedPeer) {
|
|
506
|
-
const diagnostics = this._formatPeerSelectionDiagnostics(
|
|
584
|
+
const diagnostics = this._formatPeerSelectionDiagnostics(candidatePeers);
|
|
507
585
|
log('Router could not select a peer.', diagnostics);
|
|
508
586
|
res.writeHead(502, { 'content-type': 'text/plain' });
|
|
509
587
|
res.end(`Router could not select a suitable peer. ${diagnostics}`);
|
|
510
588
|
return;
|
|
511
589
|
}
|
|
590
|
+
const selectedRoutePlan = routePlanByPeerId.get(selectedPeer.peerId)
|
|
591
|
+
?? resolvePeerRoutePlan(selectedPeer, requestProtocol, requestedModel, explicitProvider);
|
|
592
|
+
if (!selectedRoutePlan) {
|
|
593
|
+
const diagnostics = this._formatPeerSelectionDiagnostics(candidatePeers);
|
|
594
|
+
res.writeHead(502, { 'content-type': 'text/plain' });
|
|
595
|
+
res.end(`No compatible provider route found for selected peer. ${diagnostics}`);
|
|
596
|
+
return;
|
|
597
|
+
}
|
|
598
|
+
let requestForPeer = {
|
|
599
|
+
...serializedReq,
|
|
600
|
+
headers: {
|
|
601
|
+
...serializedReq.headers,
|
|
602
|
+
'x-antseed-provider': selectedRoutePlan.provider,
|
|
603
|
+
},
|
|
604
|
+
};
|
|
605
|
+
let adaptResponse = null;
|
|
606
|
+
let forceDisableUpstreamStreaming = false;
|
|
607
|
+
if (selectedRoutePlan.selection?.requiresTransform) {
|
|
608
|
+
if (requestProtocol === 'anthropic-messages'
|
|
609
|
+
&& selectedRoutePlan.selection.targetProtocol === 'openai-chat-completions') {
|
|
610
|
+
log(`Applying protocol adapter anthropic-messages -> openai-chat-completions via provider "${selectedRoutePlan.provider}"`);
|
|
611
|
+
const transformed = transformAnthropicMessagesRequestToOpenAIChat(requestForPeer);
|
|
612
|
+
if (!transformed) {
|
|
613
|
+
res.writeHead(502, { 'content-type': 'text/plain' });
|
|
614
|
+
res.end('Failed to transform Anthropic request for selected provider protocol');
|
|
615
|
+
return;
|
|
616
|
+
}
|
|
617
|
+
requestForPeer = {
|
|
618
|
+
...transformed.request,
|
|
619
|
+
headers: {
|
|
620
|
+
...transformed.request.headers,
|
|
621
|
+
'x-antseed-provider': selectedRoutePlan.provider,
|
|
622
|
+
},
|
|
623
|
+
};
|
|
624
|
+
adaptResponse = (response) => transformOpenAIChatResponseToAnthropicMessage(response, {
|
|
625
|
+
streamRequested: transformed.streamRequested,
|
|
626
|
+
fallbackModel: transformed.requestedModel,
|
|
627
|
+
});
|
|
628
|
+
forceDisableUpstreamStreaming = true;
|
|
629
|
+
}
|
|
630
|
+
else {
|
|
631
|
+
res.writeHead(502, { 'content-type': 'text/plain' });
|
|
632
|
+
res.end('Unsupported protocol transformation path');
|
|
633
|
+
return;
|
|
634
|
+
}
|
|
635
|
+
}
|
|
512
636
|
log(`Routing to peer ${selectedPeer.peerId.slice(0, 12)}...`);
|
|
513
637
|
// Forward through P2P
|
|
514
|
-
const wantsStreaming =
|
|
638
|
+
const wantsStreaming = !forceDisableUpstreamStreaming
|
|
639
|
+
&& requestWantsStreaming(requestForPeer.headers, requestForPeer.body);
|
|
515
640
|
const startTime = Date.now();
|
|
516
641
|
try {
|
|
517
642
|
if (wantsStreaming) {
|
|
518
643
|
let streamed = false;
|
|
519
|
-
const response = await this._node.sendRequestStream(selectedPeer,
|
|
644
|
+
const response = await this._node.sendRequestStream(selectedPeer, requestForPeer, {
|
|
520
645
|
onResponseStart: (startResponse, metadata) => {
|
|
521
646
|
if (!metadata.streaming)
|
|
522
647
|
return;
|
|
523
648
|
streamed = true;
|
|
524
|
-
const streamingHeaders = attachStreamingAntseedHeaders(startResponse.headers, selectedPeer,
|
|
649
|
+
const streamingHeaders = attachStreamingAntseedHeaders(startResponse.headers, selectedPeer, requestForPeer.requestId);
|
|
525
650
|
res.writeHead(startResponse.statusCode, streamingHeaders);
|
|
526
651
|
if (startResponse.body.length > 0) {
|
|
527
652
|
res.write(Buffer.from(startResponse.body));
|
|
@@ -537,7 +662,7 @@ export class BuyerProxy {
|
|
|
537
662
|
});
|
|
538
663
|
const latencyMs = Date.now() - startTime;
|
|
539
664
|
log(`Response: ${response.statusCode} (${latencyMs}ms, ${response.body.length} bytes)`);
|
|
540
|
-
const telemetry = computeResponseTelemetry(
|
|
665
|
+
const telemetry = computeResponseTelemetry(requestForPeer, response.headers, response.body, selectedPeer);
|
|
541
666
|
if (router) {
|
|
542
667
|
router.onResult(selectedPeer, {
|
|
543
668
|
success: response.statusCode < 500,
|
|
@@ -551,17 +676,20 @@ export class BuyerProxy {
|
|
|
551
676
|
}
|
|
552
677
|
}
|
|
553
678
|
else {
|
|
554
|
-
const responseHeaders = attachAntseedTelemetryHeaders(response.headers, selectedPeer, telemetry,
|
|
679
|
+
const responseHeaders = attachAntseedTelemetryHeaders(response.headers, selectedPeer, telemetry, requestForPeer.requestId, latencyMs);
|
|
555
680
|
res.writeHead(response.statusCode, responseHeaders);
|
|
556
681
|
res.end(Buffer.from(response.body));
|
|
557
682
|
}
|
|
558
683
|
}
|
|
559
684
|
else {
|
|
560
|
-
|
|
685
|
+
let response = await this._node.sendRequest(selectedPeer, requestForPeer);
|
|
686
|
+
if (adaptResponse) {
|
|
687
|
+
response = adaptResponse(response);
|
|
688
|
+
}
|
|
561
689
|
const latencyMs = Date.now() - startTime;
|
|
562
690
|
log(`Response: ${response.statusCode} (${latencyMs}ms, ${response.body.length} bytes)`);
|
|
563
|
-
const telemetry = computeResponseTelemetry(
|
|
564
|
-
const responseHeaders = attachAntseedTelemetryHeaders(response.headers, selectedPeer, telemetry,
|
|
691
|
+
const telemetry = computeResponseTelemetry(requestForPeer, response.headers, response.body, selectedPeer);
|
|
692
|
+
const responseHeaders = attachAntseedTelemetryHeaders(response.headers, selectedPeer, telemetry, requestForPeer.requestId, latencyMs);
|
|
565
693
|
// Report result to router for learning
|
|
566
694
|
if (router) {
|
|
567
695
|
router.onResult(selectedPeer, {
|