@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.
Files changed (41) hide show
  1. package/README.md +20 -4
  2. package/dist/cli/commands/browse.d.ts.map +1 -1
  3. package/dist/cli/commands/browse.js +3 -1
  4. package/dist/cli/commands/browse.js.map +1 -1
  5. package/dist/cli/commands/plugin.test.js +6 -7
  6. package/dist/cli/commands/plugin.test.js.map +1 -1
  7. package/dist/cli/commands/seed.d.ts.map +1 -1
  8. package/dist/cli/commands/seed.js +70 -23
  9. package/dist/cli/commands/seed.js.map +1 -1
  10. package/dist/cli/commands/seed.test.js +7 -0
  11. package/dist/cli/commands/seed.test.js.map +1 -1
  12. package/dist/config/defaults.js +1 -1
  13. package/dist/config/defaults.js.map +1 -1
  14. package/dist/config/loader.d.ts.map +1 -1
  15. package/dist/config/loader.js +40 -0
  16. package/dist/config/loader.js.map +1 -1
  17. package/dist/config/loader.test.js +27 -0
  18. package/dist/config/loader.test.js.map +1 -1
  19. package/dist/config/types.d.ts +8 -0
  20. package/dist/config/types.d.ts.map +1 -1
  21. package/dist/config/validation.d.ts.map +1 -1
  22. package/dist/config/validation.js +35 -0
  23. package/dist/config/validation.js.map +1 -1
  24. package/dist/plugins/loader.js +2 -2
  25. package/dist/plugins/loader.js.map +1 -1
  26. package/dist/plugins/registry.d.ts.map +1 -1
  27. package/dist/plugins/registry.js +6 -12
  28. package/dist/plugins/registry.js.map +1 -1
  29. package/dist/proxy/buyer-proxy.d.ts +12 -1
  30. package/dist/proxy/buyer-proxy.d.ts.map +1 -1
  31. package/dist/proxy/buyer-proxy.js +192 -64
  32. package/dist/proxy/buyer-proxy.js.map +1 -1
  33. package/dist/proxy/buyer-proxy.test.d.ts +2 -0
  34. package/dist/proxy/buyer-proxy.test.d.ts.map +1 -0
  35. package/dist/proxy/buyer-proxy.test.js +41 -0
  36. package/dist/proxy/buyer-proxy.test.js.map +1 -0
  37. package/dist/proxy/model-api-adapter.d.ts +20 -0
  38. package/dist/proxy/model-api-adapter.d.ts.map +1 -0
  39. package/dist/proxy/model-api-adapter.js +514 -0
  40. package/dist/proxy/model-api-adapter.js.map +1 -0
  41. package/package.json +4 -4
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/config/types.ts"],"names":[],"mappings":"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"}
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;AAqCpB;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,EAAE,CAuB9D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAK7D"}
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":"AAMA,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;;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,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"}
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/config/validation.ts"],"names":[],"mappings":"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"}
@@ -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-claude-code',
68
- 'antseed-router-claude-code': '@antseed/router-local-proxy',
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,EAqC1C,CAAA"}
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"}
@@ -12,10 +12,10 @@ export const TRUSTED_PLUGINS = [
12
12
  package: '@antseed/provider-claude-code',
13
13
  },
14
14
  {
15
- name: 'openrouter',
15
+ name: 'openai',
16
16
  type: 'provider',
17
- description: 'OpenRouter multi-model provider (API key)',
18
- package: '@antseed/provider-openrouter',
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-proxy',
27
+ name: 'local',
28
28
  type: 'router',
29
- description: 'Local HTTP proxy for Claude Code, Aider, Codex',
30
- package: '@antseed/router-local-proxy',
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,YAAY;QAClB,IAAI,EAAE,UAAU;QAChB,WAAW,EAAE,2CAA2C;QACxD,OAAO,EAAE,8BAA8B;KACxC;IACD;QACE,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,UAAU;QAChB,WAAW,EAAE,wCAAwC;QACrD,OAAO,EAAE,6BAA6B;KACvC;IACD;QACE,IAAI,EAAE,aAAa;QACnB,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,gDAAgD;QAC7D,OAAO,EAAE,6BAA6B;KACvC;IACD;QACE,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,2BAA2B;QACxC,OAAO,EAAE,4BAA4B;KACtC;CACF,CAAA"}
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,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAShD,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,WAAW,CAAA;IACjB,qFAAqF;IACrF,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB;AA6YD;;;;;;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;IAyBvB,OAAO,CAAC,+BAA+B;YAuBzB,cAAc;CAoL7B"}
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.headers['x-antseed-provider']?.trim();
134
- if (explicit && explicit.length > 0) {
135
- return explicit.toLowerCase();
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
- if (model && providerPricing.models?.[model]) {
253
+ const modelPricing = model ? providerPricing.models?.[model] : undefined;
254
+ if (modelPricing) {
167
255
  return {
168
- inputUsdPerMillion: Number.isFinite(providerPricing.models[model].inputUsdPerMillion)
169
- ? providerPricing.models[model].inputUsdPerMillion
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: Number.isFinite(providerPricing.defaults.inputUsdPerMillion)
178
- ? providerPricing.defaults.inputUsdPerMillion
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: Number.isFinite(input) ? input : null,
189
- outputUsdPerMillion: Number.isFinite(output) ? output : null,
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['x-antseed-peer-id'] = selectedPeer.peerId;
236
- if (selectedPeer.publicAddress) {
237
- headers['x-antseed-peer-address'] = selectedPeer.publicAddress;
238
- }
239
- if (selectedPeer.providers.length > 0) {
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
- if (telemetry.pricing.inputUsdPerMillion !== null) {
259
- headers['x-antseed-input-usd-per-million'] = String(telemetry.pricing.inputUsdPerMillion);
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['x-antseed-peer-id'] = selectedPeer.peerId;
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 = peers.filter((peer) => isLoopbackPeer(peer));
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, peers)
503
- : peers[0] ?? null;
580
+ ? router.selectPeer(serializedReq, candidatePeers)
581
+ : candidatePeers[0] ?? null;
504
582
  }
505
583
  if (!selectedPeer) {
506
- const diagnostics = this._formatPeerSelectionDiagnostics(peers);
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 = requestWantsStreaming(headers, serializedReq.body);
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, serializedReq, {
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, serializedReq.requestId);
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(serializedReq, response.headers, response.body, selectedPeer);
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, serializedReq.requestId, latencyMs);
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
- const response = await this._node.sendRequest(selectedPeer, serializedReq);
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(serializedReq, response.headers, response.body, selectedPeer);
564
- const responseHeaders = attachAntseedTelemetryHeaders(response.headers, selectedPeer, telemetry, serializedReq.requestId, latencyMs);
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, {