clawmarket 0.6.3 → 0.6.4

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.
@@ -130,7 +130,7 @@ export class BuyerMode extends EventEmitter {
130
130
  channelId: `0x${'0'.repeat(64)}`,
131
131
  buyer: this.ticketSigner.address,
132
132
  seller: seller.id,
133
- deposit: BigInt(10e6), // 10 USDC
133
+ deposit: BigInt(2e6), // 2 USDC
134
134
  settledAmount: BigInt(0),
135
135
  expiresAt: Math.floor(Date.now() / 1000) + 86400, // 24 hours
136
136
  isActive: true,
@@ -1 +1 @@
1
- {"version":3,"file":"mode.js","sourceRoot":"","sources":["../../src/buyer/mode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAQtC,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EACL,eAAe,EACf,OAAO,EACP,OAAO,EACP,oBAAoB,EACpB,kBAAkB,GAEnB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,YAAY,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAS1E;;;;;;GAMG;AACH,MAAM,OAAO,SAAU,SAAQ,YAAY;IACjC,MAAM,CAAc;IACpB,SAAS,CAAkB;IAC3B,KAAK,CAAc;IACnB,OAAO,CAAU;IACjB,YAAY,CAAe;IAC3B,QAAQ,GAA8B,IAAI,GAAG,EAAE,CAAC,CAAC,sBAAsB;IACvE,aAAa,GAAwB,IAAI,GAAG,EAAE,CAAC,CAAC,qBAAqB;IAE7E,YACE,MAAmB,EACnB,UAAyB,EACzB,eAA8B,EAC9B,MAAc,EACd,OAAgB,EAChB,OAAiB;QAEjB,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,SAAS,GAAG,IAAI,eAAe,CAAC,MAAM,CAAC,CAAC;QAC7C,IAAI,CAAC,KAAK,GAAG,IAAI,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC9C,IAAI,CAAC,OAAO,GAAG,OAAO,IAAI,eAAe,EAAE,CAAC;QAC5C,IAAI,CAAC,YAAY,GAAG,IAAI,YAAY,CAAC,UAAU,EAAE,eAAe,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IACrF,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc,CAAC,OAA8B;QACjD,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC;QAE1B,IAAI,CAAC;YACH,mBAAmB;YACnB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;YAExD,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,OAAO,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,sBAAsB,CAAC,CAAC;YAC9D,CAAC;YAED,yBAAyB;YACzB,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YAC9D,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,yBAAyB,CAAC,CAAC;YACjE,CAAC;YAED,wBAAwB;YACxB,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;YACtD,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,qCAAqC,CAAC,CAAC;YAC7E,CAAC;YAED,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;YAEvC,kCAAkC;YAClC,MAAM,eAAe,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;YACrD,MAAM,aAAa,GAAG,qBAAqB,CACzC,eAAe,CAAC,KAAK,EACrB,eAAe,CAAC,MAAM,EACtB,OAAO,CACR,CAAC;YAEF,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YACnD,MAAM,gBAAgB,GAAG,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,GAAG,GAAG,GAAG,aAAa,CAAC;YAE7E,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,YAAY,CACjD,OAAO,CAAC,SAAS,EACjB,gBAAgB,EAChB,KAAK,CACN,CAAC;YAEF,kBAAkB;YAClB,MAAM,YAAY,GAAG,oBAAoB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAC5D,MAAM,gBAAgB,GAAG,MAAM,OAAO,CACpC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EACvB,IAAI,CAAC,OAAO,CAAC,UAAU,EACvB,YAAY,CACb,CAAC;YAEF,qBAAqB;YACrB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,WAAW,CAC3C,MAAM,CAAC,EAAE,EACT,gBAAgB,EAChB,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,EAC1C,KAAK,EACL,OAAO,CAAC,SAAS,EACjB,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,EACxB,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EACpB,MAAM,CAAC,SAAS,CACjB,CAAC;YAEF,mBAAmB;YACnB,MAAM,iBAAiB,GAAG,MAAM,OAAO,CACrC,QAAQ,CAAC,OAAQ,EACjB,IAAI,CAAC,OAAO,CAAC,UAAU,EACvB,YAAY,CACb,CAAC;YAEF,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAA2B,CAAC;YAE7E,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;YAC9C,OAAO,YAAY,CAAC;QACtB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACxE,OAAO,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC;QAC5F,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,cAAc,CAC1B,OAA8B,EAC9B,MAAc;QAEd,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAE7C,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,oDAAoD,MAAM,EAAE,CAAC,CAAC;QAChF,CAAC;QAED,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC;QACzD,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAChF,MAAM,IAAI,KAAK,CAAC,uCAAuC,YAAY,EAAE,CAAC,CAAC;QACzE,CAAC;QAED,MAAM,IAAI,GAAG,YAAY,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAC7C,MAAM,QAAQ,GAAG,GAAG,IAAI,sBAAsB,CAAC;QAC/C,MAAM,SAAS,GAAG,KAAK,CAAC;QACxB,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,SAAS,CAAC,CAAC;QAEhE,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,QAAQ,EAAE;gBACrC,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACnB,KAAK,EAAE,OAAO,CAAC,KAAK;oBACpB,QAAQ,EAAE,OAAO,CAAC,QAAQ;oBAC1B,WAAW,EAAE,OAAO,CAAC,WAAW;oBAChC,UAAU,EAAE,OAAO,CAAC,UAAU;iBAC/B,CAAC;gBACF,MAAM,EAAE,UAAU,CAAC,MAAM;aAC1B,CAAC,CAAC;YAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;gBACtC,MAAM,IAAI,KAAK,CAAC,QAAQ,QAAQ,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC,CAAC;YACzD,CAAC;YAED,OAAO,MAAM,QAAQ,CAAC,IAAI,EAA4B,CAAC;QACzD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7D,MAAM,IAAI,KAAK,CAAC,6BAA6B,QAAQ,MAAM,GAAG,sBAAsB,MAAM,EAAE,CAAC,CAAC;QAChG,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,OAAO,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,kBAAkB,CAAC,MAAkB;QACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAE9C,IAAI,QAAQ,IAAI,QAAQ,CAAC,QAAQ,IAAI,QAAQ,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,EAAE,CAAC;YAC5E,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,6BAA6B;QAC7B,sCAAsC;QACtC,gDAAgD;QAChD,iCAAiC;QAEjC,iDAAiD;QACjD,MAAM,WAAW,GAAiB;YAChC,SAAS,EAAE,KAAK,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAmB;YACjD,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,OAAO;YAChC,MAAM,EAAE,MAAM,CAAC,EAAmB;YAClC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,UAAU;YACjC,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC;YACxB,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,KAAK,EAAE,WAAW;YAC7D,QAAQ,EAAE,IAAI;YACd,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC;SACxB,CAAC;QAEF,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;QAC1C,OAAO,WAAW,CAAC;IACrB,CAAC;IAED;;OAEG;IACK,YAAY,CAAC,SAAwB;QAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC;QAC/D,MAAM,IAAI,GAAG,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACjC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QACxC,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACK,cAAc,CAAC,OAA8B;QACnD,sCAAsC;QACtC,MAAM,UAAU,GAAG,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAClF,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;QAE9C,iDAAiD;QACjD,MAAM,YAAY,GAAG,OAAO,CAAC,UAAU,IAAI,IAAI,CAAC;QAEhD,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;IACtD,CAAC;IAED;;OAEG;IACH,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;IAChC,CAAC;IAED;;OAEG;IACH,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC;IACnC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc;QAClB,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,CAAC;QAC5B,MAAM,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IACrD,CAAC;CACF"}
1
+ {"version":3,"file":"mode.js","sourceRoot":"","sources":["../../src/buyer/mode.ts"],"names":[],"mappings":"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"}
package/dist/config.js CHANGED
@@ -15,7 +15,7 @@ export const DEFAULT_CONFIG = {
15
15
  usdcContract: '0xcF0819eb156D6c6c1c5d9A515E351D2D1aefff7D',
16
16
  // 默认参数
17
17
  minBalance: 1000000n, // 1 USDC
18
- channelDeposit: 10000000n, // 10 USDC per channel
18
+ channelDeposit: 2000000n, // 2 USDC per channel
19
19
  strategy: 'lowest_price',
20
20
  };
21
21
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,OAAO;IACP,WAAW,EAAE,0BAA0B;IACvC,QAAQ,EAAE,0BAA0B;IACpC,OAAO,EAAE,wBAAwB;IAEjC,qBAAqB;IACrB,MAAM,EAAE,0BAA0B;IAClC,OAAO,EAAE,KAAK;IACd,eAAe,EAAE,4CAA6D;IAC9E,YAAY,EAAE,4CAA6D;IAE3E,OAAO;IACP,UAAU,EAAE,QAAU,EAAO,SAAS;IACtC,cAAc,EAAE,SAAW,EAAE,sBAAsB;IACnD,QAAQ,EAAE,cAAuB;CAClC,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACtC,IAAI,EAAE,YAAY;IAClB,IAAI,EAAE,YAAY;IAClB,MAAM,EAAE;QACN,eAAe;QACf,iBAAiB;QACjB,OAAO;QACP,aAAa;KACd;IACD,OAAO,EAAE,IAAI,EAAG,gBAAgB;CACjC,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,OAAO;IACP,WAAW,EAAE,0BAA0B;IACvC,QAAQ,EAAE,0BAA0B;IACpC,OAAO,EAAE,wBAAwB;IAEjC,qBAAqB;IACrB,MAAM,EAAE,0BAA0B;IAClC,OAAO,EAAE,KAAK;IACd,eAAe,EAAE,4CAA6D;IAC9E,YAAY,EAAE,4CAA6D;IAE3E,OAAO;IACP,UAAU,EAAE,QAAU,EAAO,SAAS;IACtC,cAAc,EAAE,QAAU,EAAE,qBAAqB;IACjD,QAAQ,EAAE,cAAuB;CAClC,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACtC,IAAI,EAAE,YAAY;IAClB,IAAI,EAAE,YAAY;IAClB,MAAM,EAAE;QACN,eAAe;QACf,iBAAiB;QACjB,OAAO;QACP,aAAa;KACd;IACD,OAAO,EAAE,IAAI,EAAG,gBAAgB;CACjC,CAAC"}
@@ -39,6 +39,37 @@ function readMsEnv(name, fallback) {
39
39
  return fallback;
40
40
  return raw;
41
41
  }
42
+ function readBigIntEnv(name, fallback) {
43
+ const raw = process.env[name];
44
+ if (typeof raw !== 'string' || !raw.trim())
45
+ return fallback;
46
+ try {
47
+ const parsed = BigInt(raw.trim());
48
+ return parsed > 0n ? parsed : fallback;
49
+ }
50
+ catch {
51
+ return fallback;
52
+ }
53
+ }
54
+ function readCsvEnv(name) {
55
+ const raw = process.env[name];
56
+ if (typeof raw !== 'string' || !raw.trim())
57
+ return [];
58
+ return raw
59
+ .split(',')
60
+ .map((item) => item.trim())
61
+ .filter((item) => item.length > 0);
62
+ }
63
+ function normalizeModelKeyForPolicy(rawModel) {
64
+ const model = rawModel.trim();
65
+ if (!model)
66
+ return '';
67
+ const slashIndex = model.lastIndexOf('/');
68
+ const normalized = slashIndex >= 0 && slashIndex < model.length - 1
69
+ ? model.slice(slashIndex + 1).trim()
70
+ : model;
71
+ return normalized.toLowerCase();
72
+ }
42
73
  const LOCAL_PORT = 19082;
43
74
  const GATEWAY_URL = process.env.GATEWAY_URL || 'http://shenjige.xyz:9082';
44
75
  const REGISTRY_URL = process.env.REGISTRY_URL || DEFAULT_CONFIG.registryUrl;
@@ -50,7 +81,8 @@ const CHANNEL_CONTRACT = (process.env.CHANNEL_CONTRACT || DEFAULT_CONFIG.channel
50
81
  const MIN_BALANCE = BigInt(process.env.MIN_BALANCE || DEFAULT_CONFIG.minBalance.toString());
51
82
  const CHANNEL_DEPOSIT = BigInt(process.env.CHANNEL_DEPOSIT || DEFAULT_CONFIG.channelDeposit.toString());
52
83
  const CHANNEL_DURATION = BigInt(7 * 24 * 60 * 60);
53
- const COST_PER_REQUEST = 100000n; // 初始 ticket 0.1 USDC(预授权)
84
+ const INITIAL_TICKET_USDC_6 = readBigIntEnv('CLAW_INITIAL_TICKET_USDC_6', 1000n); // 0.001 USDC
85
+ const FALLBACK_RENEW_TICKET_USDC_6 = readBigIntEnv('CLAW_FALLBACK_RENEW_TICKET_USDC_6', 1n); // 0.000001 USDC
54
86
  const RECOVER_NONCE_STEP = 10000n; // 0.01 USDC,恢复时用于生成安全的 nonce 基线
55
87
  const SKIP_SELLER_STAKE_CHECK = false;
56
88
  // 默认关闭自动恢复旧通道,避免链上 settledAmount 与卖家本地票据状态不一致导致 nonce/increment 错误。
@@ -74,6 +106,8 @@ const STREAM_MAX_DURATION_MS = readMsEnv('CLAW_STREAM_MAX_DURATION_MS', 300_000)
74
106
  const SSE_HEARTBEAT_MS = readMsEnv('CLAW_SSE_HEARTBEAT_MS', 10_000);
75
107
  const SELLER_FAILURE_BACKOFF_BASE_MS = 15_000;
76
108
  const SELLER_FAILURE_BACKOFF_MAX_MS = 300_000;
109
+ const SELLER_INCOMPATIBLE_BACKOFF_MS = readMsEnv('CLAW_SELLER_INCOMPATIBLE_BACKOFF_MS', 30 * 60 * 1000);
110
+ const SELLER_OFFLINE_RETRY_DELAY_MS = readMsEnv('CLAW_SELLER_OFFLINE_RETRY_DELAY_MS', 1_200);
77
111
  const SHOW_MODEL_FALLBACK_NOTICE = process.env.CLAW_SHOW_MODEL_FALLBACK_NOTICE !== 'false';
78
112
  const DEBUG_BRIDGE = process.env.CLAW_DEBUG_BRIDGE === '1';
79
113
  const CANDIDATE_ROUTE_TIMEOUT_MS = readMsEnv('CLAW_CANDIDATE_ROUTE_TIMEOUT_MS', 20_000);
@@ -84,6 +118,26 @@ const MODEL_CANDIDATE_ROUTE_TIMEOUT_MS = {
84
118
  };
85
119
  const PER_MODEL_ROUTE_TIMEOUT_MS = readMsEnv('CLAW_PER_MODEL_ROUTE_TIMEOUT_MS', 300_000);
86
120
  const TOTAL_ROUTE_TIMEOUT_MS = readMsEnv('CLAW_TOTAL_ROUTE_TIMEOUT_MS', 300_000);
121
+ // ============ Prompt Policy(可开关) ============
122
+ // 默认开启,可通过 CLAW_ENABLE_PROMPT_POLICY=false 关闭。
123
+ const ENABLE_PROMPT_POLICY = process.env.CLAW_ENABLE_PROMPT_POLICY !== 'false';
124
+ const ENABLE_PROMPT_POLICY_CHUNKING = process.env.CLAW_POLICY_CHUNKING !== 'false';
125
+ const ENABLE_PROMPT_POLICY_STYLE = process.env.CLAW_POLICY_STYLE !== 'false';
126
+ const promptPolicyModels = readCsvEnv('CLAW_PROMPT_POLICY_MODELS');
127
+ const PROMPT_POLICY_MODEL_ALLOWLIST = new Set((promptPolicyModels.length > 0 ? promptPolicyModels : ['MiniMax-M2.5'])
128
+ .map((model) => normalizeModelKeyForPolicy(model))
129
+ .filter((model) => model.length > 0));
130
+ const PROMPT_POLICY_MARKER = '[ClawMarket Prompt Policy v1]';
131
+ const PROMPT_POLICY_TEXT_BLOCKS = [];
132
+ if (ENABLE_PROMPT_POLICY_CHUNKING) {
133
+ PROMPT_POLICY_TEXT_BLOCKS.push('复杂或长输出时,必须自动分段完整输出(Part 1/N, Part 2/N),每段末尾提示“回复 continue 获取下一部分”,禁止半句或半段代码截断。');
134
+ }
135
+ if (ENABLE_PROMPT_POLICY_STYLE) {
136
+ PROMPT_POLICY_TEXT_BLOCKS.push('回答必须保持干净,不输出思维链、签名块、事件 JSON、伪工具标签(如 <minimax:tool_call>)。当工具可用时,使用结构化工具调用而不是文本伪调用。浏览器任务避免重复打开同一页面的循环动作。');
137
+ }
138
+ const PROMPT_POLICY_SYSTEM_TEXT = PROMPT_POLICY_TEXT_BLOCKS.length > 0
139
+ ? `${PROMPT_POLICY_MARKER}\n${PROMPT_POLICY_TEXT_BLOCKS.map((line, idx) => `${idx + 1}. ${line}`).join('\n')}`
140
+ : '';
87
141
  // ============ ABI ============
88
142
  const USDC_ABI = [
89
143
  { name: 'balanceOf', type: 'function', inputs: [{ name: 'account', type: 'address' }], outputs: [{ type: 'uint256' }], stateMutability: 'view' },
@@ -104,12 +158,17 @@ let wallet = null;
104
158
  let walletClient = null;
105
159
  let publicClient = null;
106
160
  let channels = new Map();
107
- let defaultSeller = '0x3137cE5612af147f1BA17eBba7e8B46594ed3e26';
161
+ let defaultSeller = (toHexAddress(process.env.DEFAULT_SELLER) || '').toLowerCase();
108
162
  let marketCache = { fetchedAt: 0, sellers: [] };
109
163
  let sellerRuntime = new Map();
110
164
  const ticketSignLocks = new Map();
111
165
  const channelOpenLocks = new Map();
112
166
  const sseHeartbeats = new WeakMap();
167
+ function delayMs(ms) {
168
+ if (!Number.isFinite(ms) || ms <= 0)
169
+ return Promise.resolve();
170
+ return new Promise((resolve) => setTimeout(resolve, ms));
171
+ }
113
172
  function debugBridge(tag, data) {
114
173
  if (!DEBUG_BRIDGE)
115
174
  return;
@@ -214,6 +273,10 @@ function markSellerFailure(sellerId, reason) {
214
273
  const state = getSellerRuntimeState(sellerId);
215
274
  state.failures += 1;
216
275
  state.lastError = reason;
276
+ if (isSellerIncompatibleError(reason)) {
277
+ state.blockedUntil = Date.now() + SELLER_INCOMPATIBLE_BACKOFF_MS;
278
+ return;
279
+ }
217
280
  const backoff = Math.min(SELLER_FAILURE_BACKOFF_BASE_MS * (2 ** Math.max(0, state.failures - 1)), SELLER_FAILURE_BACKOFF_MAX_MS);
218
281
  state.blockedUntil = Date.now() + backoff;
219
282
  }
@@ -375,7 +438,7 @@ async function ensureChannelForSeller(sellerAddress) {
375
438
  }
376
439
  const task = (async () => {
377
440
  let channel = channels.get(key);
378
- if (channel && (channel.expiresAt < Date.now() / 1000 || channel.spent + COST_PER_REQUEST > channel.deposit)) {
441
+ if (channel && (channel.expiresAt < Date.now() / 1000 || channel.spent + INITIAL_TICKET_USDC_6 > channel.deposit)) {
379
442
  channels.delete(key);
380
443
  channel = undefined;
381
444
  }
@@ -408,6 +471,17 @@ function isChannelStateSyncError(reason) {
408
471
  normalized.includes('amount not increasing') ||
409
472
  normalized.includes('ticket amount must increase'));
410
473
  }
474
+ function isSellerIncompatibleError(reason) {
475
+ const normalized = reason.toLowerCase();
476
+ return (normalized.includes('increment too small') ||
477
+ normalized.includes('initial_ticket_too_small') ||
478
+ normalized.includes('ticket increment invalid'));
479
+ }
480
+ function isSellerOfflineError(reason) {
481
+ const normalized = reason.toLowerCase();
482
+ return (normalized.includes('seller not found or offline') ||
483
+ normalized.includes('seller offline'));
484
+ }
411
485
  function invalidateSellerChannel(sellerAddress, reason) {
412
486
  const key = sellerAddress.toLowerCase();
413
487
  const existing = channels.get(key);
@@ -453,7 +527,7 @@ async function recoverChannelFromChain(sellerAddress) {
453
527
  const deposit = channelData[2];
454
528
  const settledAmount = channelData[3];
455
529
  // 已经没有可用额度的通道不要恢复,避免反复命中 Amount > deposit。
456
- if (settledAmount + COST_PER_REQUEST > deposit)
530
+ if (settledAmount + INITIAL_TICKET_USDC_6 > deposit)
457
531
  continue;
458
532
  const expiresAt = Number(channelData[4]);
459
533
  if (expiresAt < Math.floor(Date.now() / 1000))
@@ -530,6 +604,44 @@ async function signTicket(channel, amount) {
530
604
  return { channelId: channel.channelId, amount: nextSpent.toString(), nonce: nextNonce.toString(), signature, buyer: wallet.address };
531
605
  });
532
606
  }
607
+ function usdToUsdc6(usd) {
608
+ if (!Number.isFinite(usd) || usd <= 0)
609
+ return 0n;
610
+ return BigInt(Math.ceil(usd * 1_000_000));
611
+ }
612
+ function parsePositiveBigInt(value) {
613
+ if (typeof value === 'bigint') {
614
+ return value > 0n ? value : null;
615
+ }
616
+ if (typeof value === 'number') {
617
+ if (!Number.isFinite(value) || value <= 0)
618
+ return null;
619
+ return BigInt(Math.floor(value));
620
+ }
621
+ if (typeof value === 'string') {
622
+ const text = value.trim();
623
+ if (!text)
624
+ return null;
625
+ try {
626
+ const parsed = BigInt(text);
627
+ return parsed > 0n ? parsed : null;
628
+ }
629
+ catch {
630
+ return null;
631
+ }
632
+ }
633
+ return null;
634
+ }
635
+ function parsePositiveNumber(value) {
636
+ if (typeof value === 'number') {
637
+ return Number.isFinite(value) && value > 0 ? value : 0;
638
+ }
639
+ if (typeof value === 'string') {
640
+ const parsed = Number(value.trim());
641
+ return Number.isFinite(parsed) && parsed > 0 ? parsed : 0;
642
+ }
643
+ return 0;
644
+ }
533
645
  function parseRelayErrorPayload(payload) {
534
646
  if (typeof payload === 'string') {
535
647
  try {
@@ -751,6 +863,7 @@ function isRetryableRouteError(reason) {
751
863
  || normalized.includes('nonce too low')
752
864
  || normalized.includes('invalid nonce')
753
865
  || normalized.includes('seller busy')
866
+ || normalized.includes('seller not found or offline')
754
867
  || normalized.includes('upstream api error')
755
868
  || normalized.includes('upstream done without visible content')
756
869
  || normalized.includes('codex_exec_silence_timeout')
@@ -1108,6 +1221,129 @@ function normalizeRequestedModelId(rawModel) {
1108
1221
  }
1109
1222
  return model;
1110
1223
  }
1224
+ function shouldApplyPromptPolicyForModel(rawModel) {
1225
+ if (!ENABLE_PROMPT_POLICY)
1226
+ return false;
1227
+ if (!PROMPT_POLICY_SYSTEM_TEXT)
1228
+ return false;
1229
+ const modelKey = normalizeModelKeyForPolicy(rawModel);
1230
+ if (!modelKey)
1231
+ return false;
1232
+ if (PROMPT_POLICY_MODEL_ALLOWLIST.has('*') || PROMPT_POLICY_MODEL_ALLOWLIST.has('all')) {
1233
+ return true;
1234
+ }
1235
+ return PROMPT_POLICY_MODEL_ALLOWLIST.has(modelKey);
1236
+ }
1237
+ function contentContainsPromptPolicyMarker(content) {
1238
+ if (typeof content === 'string') {
1239
+ return content.includes(PROMPT_POLICY_MARKER);
1240
+ }
1241
+ if (Array.isArray(content)) {
1242
+ for (const item of content) {
1243
+ if (contentContainsPromptPolicyMarker(item))
1244
+ return true;
1245
+ }
1246
+ return false;
1247
+ }
1248
+ if (content && typeof content === 'object') {
1249
+ const obj = content;
1250
+ if (typeof obj.text === 'string' && obj.text.includes(PROMPT_POLICY_MARKER)) {
1251
+ return true;
1252
+ }
1253
+ if (obj.content !== undefined && contentContainsPromptPolicyMarker(obj.content)) {
1254
+ return true;
1255
+ }
1256
+ }
1257
+ return false;
1258
+ }
1259
+ function appendPromptPolicyToAnthropicSystem(systemValue, policyText) {
1260
+ if (typeof systemValue === 'string') {
1261
+ const trimmed = systemValue.trim();
1262
+ return trimmed ? `${trimmed}\n\n${policyText}` : policyText;
1263
+ }
1264
+ if (Array.isArray(systemValue)) {
1265
+ const next = [...systemValue];
1266
+ next.push({ type: 'text', text: policyText });
1267
+ return next;
1268
+ }
1269
+ return policyText;
1270
+ }
1271
+ function appendPromptPolicyToOpenAIContent(content, policyText) {
1272
+ if (typeof content === 'string') {
1273
+ const trimmed = content.trim();
1274
+ return trimmed ? `${trimmed}\n\n${policyText}` : policyText;
1275
+ }
1276
+ if (Array.isArray(content)) {
1277
+ const next = [...content];
1278
+ next.push({ type: 'text', text: policyText });
1279
+ return next;
1280
+ }
1281
+ return policyText;
1282
+ }
1283
+ function appendPromptPolicyToOpenAIMessages(messagesValue, policyText) {
1284
+ const nextMessages = [];
1285
+ if (Array.isArray(messagesValue)) {
1286
+ for (const raw of messagesValue) {
1287
+ if (!raw || typeof raw !== 'object' || Array.isArray(raw))
1288
+ continue;
1289
+ nextMessages.push({ ...raw });
1290
+ }
1291
+ }
1292
+ for (let idx = 0; idx < nextMessages.length; idx++) {
1293
+ const msg = nextMessages[idx];
1294
+ if (!msg)
1295
+ continue;
1296
+ const role = typeof msg.role === 'string' ? msg.role.trim().toLowerCase() : '';
1297
+ if (role !== 'system')
1298
+ continue;
1299
+ msg.content = appendPromptPolicyToOpenAIContent(msg.content, policyText);
1300
+ return nextMessages;
1301
+ }
1302
+ nextMessages.unshift({
1303
+ role: 'system',
1304
+ content: policyText,
1305
+ });
1306
+ return nextMessages;
1307
+ }
1308
+ function requestAlreadyContainsPromptPolicy(requestPayload, apiStyle) {
1309
+ if (apiStyle === 'anthropic') {
1310
+ return contentContainsPromptPolicyMarker(requestPayload.system);
1311
+ }
1312
+ const messages = requestPayload.messages;
1313
+ if (!Array.isArray(messages))
1314
+ return false;
1315
+ for (const raw of messages) {
1316
+ if (!raw || typeof raw !== 'object' || Array.isArray(raw))
1317
+ continue;
1318
+ const msg = raw;
1319
+ const role = typeof msg.role === 'string' ? msg.role.trim().toLowerCase() : '';
1320
+ if (role !== 'system')
1321
+ continue;
1322
+ if (contentContainsPromptPolicyMarker(msg.content))
1323
+ return true;
1324
+ }
1325
+ return false;
1326
+ }
1327
+ function applyPromptPolicyToRequestPayload(requestPayload, servedModel, apiStyle) {
1328
+ if (!shouldApplyPromptPolicyForModel(servedModel))
1329
+ return requestPayload;
1330
+ if (requestAlreadyContainsPromptPolicy(requestPayload, apiStyle))
1331
+ return requestPayload;
1332
+ const nextPayload = { ...requestPayload };
1333
+ if (apiStyle === 'anthropic') {
1334
+ nextPayload.system = appendPromptPolicyToAnthropicSystem(nextPayload.system, PROMPT_POLICY_SYSTEM_TEXT);
1335
+ }
1336
+ else {
1337
+ nextPayload.messages = appendPromptPolicyToOpenAIMessages(nextPayload.messages, PROMPT_POLICY_SYSTEM_TEXT);
1338
+ }
1339
+ debugBridge('prompt_policy_applied', {
1340
+ model: servedModel,
1341
+ apiStyle,
1342
+ chunking: ENABLE_PROMPT_POLICY_CHUNKING,
1343
+ style: ENABLE_PROMPT_POLICY_STYLE,
1344
+ });
1345
+ return nextPayload;
1346
+ }
1111
1347
  function normalizeOpenAIRequest(rawRequest) {
1112
1348
  const requestModel = typeof rawRequest.model === 'string' ? rawRequest.model.trim() : '';
1113
1349
  const requestedModel = normalizeRequestedModelId(requestModel || 'claude-opus-4-5');
@@ -1442,16 +1678,24 @@ function convertOpenAIRequestToAnthropic(baseRequest, servedModel) {
1442
1678
  return anthropicRequest;
1443
1679
  }
1444
1680
  function buildRequestPayloadForSeller(baseRequest, servedModel, candidateModel) {
1445
- if (baseRequest._openai_compat === true && isAnthropicLikeModelName(candidateModel || servedModel)) {
1446
- return convertOpenAIRequestToAnthropic(baseRequest, servedModel);
1681
+ const openAICompat = baseRequest._openai_compat === true;
1682
+ const targetAnthropicLike = isAnthropicLikeModelName(candidateModel || servedModel);
1683
+ let requestPayload;
1684
+ let apiStyle;
1685
+ if (openAICompat && targetAnthropicLike) {
1686
+ requestPayload = convertOpenAIRequestToAnthropic(baseRequest, servedModel);
1687
+ apiStyle = 'anthropic';
1688
+ }
1689
+ else {
1690
+ requestPayload = {
1691
+ ...baseRequest,
1692
+ model: servedModel,
1693
+ stream: true,
1694
+ };
1695
+ apiStyle = openAICompat ? 'openai' : 'anthropic';
1447
1696
  }
1448
- const requestPayload = {
1449
- ...baseRequest,
1450
- model: servedModel,
1451
- stream: true,
1452
- };
1453
1697
  delete requestPayload._openai_compat;
1454
- return requestPayload;
1698
+ return applyPromptPolicyToRequestPayload(requestPayload, servedModel, apiStyle);
1455
1699
  }
1456
1700
  async function streamFromSellerAttempt(req, res, baseRequest, servedModel, candidate, isClientClosed, attemptBudgetMs, firstChunkBudgetMs, hooks) {
1457
1701
  if (isClientClosed()) {
@@ -1467,13 +1711,14 @@ async function streamFromSellerAttempt(req, res, baseRequest, servedModel, candi
1467
1711
  }
1468
1712
  let initialTicket;
1469
1713
  try {
1470
- initialTicket = await signTicket(channel, COST_PER_REQUEST);
1714
+ initialTicket = await signTicket(channel, INITIAL_TICKET_USDC_6);
1471
1715
  }
1472
1716
  catch (e) {
1473
1717
  const message = e instanceof Error ? e.message : String(e);
1474
1718
  return { ok: false, streamStarted: false, error: `ticket_sign_failed: ${message}` };
1475
1719
  }
1476
- console.log(`[Ticket] 初始 #${initialTicket.nonce} 累计: ${formatUnits(BigInt(initialTicket.amount), 6)} USDC`);
1720
+ let requestAuthorizedUsdc = INITIAL_TICKET_USDC_6;
1721
+ console.log(`[Ticket] 初始 #${initialTicket.nonce} 累计: ${formatUnits(BigInt(initialTicket.amount), 6)} USDC (本次授权: ${formatUnits(requestAuthorizedUsdc, 6)})`);
1477
1722
  const requestPayload = {
1478
1723
  ...buildRequestPayloadForSeller(baseRequest, servedModel, candidate.model),
1479
1724
  _clawmarket: initialTicket,
@@ -1650,7 +1895,23 @@ async function streamFromSellerAttempt(req, res, baseRequest, servedModel, candi
1650
1895
  return;
1651
1896
  }
1652
1897
  }
1653
- const chunkText = typeof msg.payload === 'string' ? msg.payload : String(msg.payload ?? '');
1898
+ if (typeof msg.payload !== 'string') {
1899
+ // 未知 payload 形态,避免把内部对象字符串化后泄露给客户端。
1900
+ debugBridge('route_drop_non_string_chunk_payload', {
1901
+ payloadType: typeof msg.payload,
1902
+ });
1903
+ return;
1904
+ }
1905
+ const chunkText = msg.payload;
1906
+ if (chunkText.includes('__clawmarket_stream_v1')
1907
+ || chunkText.includes('_clawmarket_stream_v1')) {
1908
+ // 标记为结构化流但解析失败时,直接丢弃,避免 UI 出现原始事件 JSON。
1909
+ debugBridge('route_drop_unparsed_structured_chunk', {
1910
+ length: chunkText.length,
1911
+ sample: chunkText.slice(0, 220),
1912
+ });
1913
+ return;
1914
+ }
1654
1915
  const visible = /\S/.test(chunkText);
1655
1916
  if (!visible) {
1656
1917
  return;
@@ -1664,8 +1925,42 @@ async function streamFromSellerAttempt(req, res, baseRequest, servedModel, candi
1664
1925
  }
1665
1926
  if (messageType === 'ticket_required') {
1666
1927
  try {
1667
- const renewTicket = await signTicket(channel, COST_PER_REQUEST);
1668
- console.log(`[Ticket] 续费 #${renewTicket.nonce} 累计: ${formatUnits(BigInt(renewTicket.amount), 6)} USDC`);
1928
+ let tokensSoFar = 0;
1929
+ let requiredBySeller = null;
1930
+ if (typeof msg.payload === 'string') {
1931
+ try {
1932
+ const parsed = JSON.parse(msg.payload);
1933
+ tokensSoFar = parsePositiveNumber(parsed.tokens_so_far);
1934
+ requiredBySeller = parsePositiveBigInt(parsed.required_amount_usdc_6);
1935
+ }
1936
+ catch {
1937
+ // ignore malformed ticket_required payload
1938
+ }
1939
+ }
1940
+ else if (msg.payload && typeof msg.payload === 'object') {
1941
+ const parsed = msg.payload;
1942
+ tokensSoFar = parsePositiveNumber(parsed.tokens_so_far);
1943
+ requiredBySeller = parsePositiveBigInt(parsed.required_amount_usdc_6);
1944
+ }
1945
+ const estimatedOutputCostUsdc = usdToUsdc6((tokensSoFar / 1_000_000) * candidate.outputPer1m);
1946
+ let requiredUsdc = estimatedOutputCostUsdc;
1947
+ if (requiredBySeller && requiredBySeller > requiredUsdc) {
1948
+ requiredUsdc = requiredBySeller;
1949
+ }
1950
+ if (requiredUsdc < INITIAL_TICKET_USDC_6) {
1951
+ requiredUsdc = INITIAL_TICKET_USDC_6;
1952
+ }
1953
+ let increment = requiredUsdc - requestAuthorizedUsdc;
1954
+ if (increment <= 0n && FALLBACK_RENEW_TICKET_USDC_6 > 0n) {
1955
+ increment = FALLBACK_RENEW_TICKET_USDC_6;
1956
+ }
1957
+ if (increment <= 0n) {
1958
+ return;
1959
+ }
1960
+ const renewTicket = await signTicket(channel, increment);
1961
+ requestAuthorizedUsdc += increment;
1962
+ console.log(`[Ticket] 续费 #${renewTicket.nonce} 累计: ${formatUnits(BigInt(renewTicket.amount), 6)} USDC ` +
1963
+ `(本次 +${formatUnits(increment, 6)} / 本次累计授权: ${formatUnits(requestAuthorizedUsdc, 6)})`);
1669
1964
  ws.send(JSON.stringify({ type: 'ticket', payload: JSON.stringify(renewTicket) }));
1670
1965
  }
1671
1966
  catch (e) {
@@ -1704,12 +1999,14 @@ async function streamFromSellerAttempt(req, res, baseRequest, servedModel, candi
1704
1999
  }
1705
2000
  ensureStreamStarted();
1706
2001
  const actualCostUsd = (inputTokens / 1_000_000) * candidate.inputPer1m + (outputTokens / 1_000_000) * candidate.outputPer1m;
1707
- const actualCostUsdc = BigInt(Math.ceil(actualCostUsd * 1_000_000));
1708
- if (actualCostUsdc > COST_PER_REQUEST) {
1709
- const extra = actualCostUsdc - COST_PER_REQUEST;
2002
+ const actualCostUsdc = usdToUsdc6(actualCostUsd);
2003
+ if (actualCostUsdc > requestAuthorizedUsdc) {
2004
+ const extra = actualCostUsdc - requestAuthorizedUsdc;
1710
2005
  try {
1711
2006
  const finalTicket = await signTicket(channel, extra);
1712
- console.log(`[Ticket] 最终 #${finalTicket.nonce} 累计: ${formatUnits(BigInt(finalTicket.amount), 6)} USDC (实际: $${actualCostUsd.toFixed(6)})`);
2007
+ requestAuthorizedUsdc += extra;
2008
+ console.log(`[Ticket] 最终 #${finalTicket.nonce} 累计: ${formatUnits(BigInt(finalTicket.amount), 6)} USDC ` +
2009
+ `(最终补签 +${formatUnits(extra, 6)} / 实际: $${actualCostUsd.toFixed(6)})`);
1713
2010
  ws.send(JSON.stringify({ type: 'ticket', payload: JSON.stringify(finalTicket) }));
1714
2011
  }
1715
2012
  catch (e) {
@@ -1717,7 +2014,7 @@ async function streamFromSellerAttempt(req, res, baseRequest, servedModel, candi
1717
2014
  }
1718
2015
  }
1719
2016
  else {
1720
- console.log(`[计费] 实际 $${actualCostUsd.toFixed(6)} ≤ 初始 ticket,无需补签`);
2017
+ console.log(`[计费] 实际 $${actualCostUsd.toFixed(6)} ≤ 已授权 ${formatUnits(requestAuthorizedUsdc, 6)} USDC,无需补签`);
1721
2018
  }
1722
2019
  if (!res.writableEnded) {
1723
2020
  hooks.onEnd(outputTokens);
@@ -1852,6 +2149,9 @@ async function routeStreamRequest(req, res, request, requestedModel, hooks) {
1852
2149
  }
1853
2150
  if (!result.streamStarted && retry === 0 && isRetryableRouteError(errReason)) {
1854
2151
  finalResult = result;
2152
+ if (isSellerOfflineError(errReason)) {
2153
+ await delayMs(SELLER_OFFLINE_RETRY_DELAY_MS);
2154
+ }
1855
2155
  console.log(`[路由] 卖家首轮失败,准备重试: ${candidate.sellerId.slice(0, 10)}... reason=${errReason}`);
1856
2156
  continue;
1857
2157
  }
@@ -1905,6 +2205,20 @@ async function handleAnthropicStreamRequest(req, res, body) {
1905
2205
  let textTranscript = '';
1906
2206
  let nextToolIndex = 0;
1907
2207
  const toolCalls = new Map();
2208
+ const pendingStructuredToolInputs = new Map();
2209
+ const seenStructuredToolInputDelta = new Set();
2210
+ const parseEventIndex = (value) => {
2211
+ if (typeof value === 'number' && Number.isFinite(value) && value >= 0) {
2212
+ return Math.trunc(value);
2213
+ }
2214
+ if (typeof value === 'string' && value.trim()) {
2215
+ const parsed = Number(value.trim());
2216
+ if (Number.isFinite(parsed) && parsed >= 0) {
2217
+ return Math.trunc(parsed);
2218
+ }
2219
+ }
2220
+ return null;
2221
+ };
1908
2222
  const ensureTextStreamStarted = () => {
1909
2223
  if (textStreamStarted || res.writableEnded)
1910
2224
  return;
@@ -2154,6 +2468,11 @@ async function handleAnthropicStreamRequest(req, res, body) {
2154
2468
  catch {
2155
2469
  serializedInput = '{}';
2156
2470
  }
2471
+ const toolIndex = parseEventIndex(eventData.index);
2472
+ if (toolIndex !== null) {
2473
+ pendingStructuredToolInputs.set(toolIndex, serializedInput);
2474
+ seenStructuredToolInputDelta.delete(toolIndex);
2475
+ }
2157
2476
  normalizedEventData = {
2158
2477
  ...eventData,
2159
2478
  content_block: {
@@ -2164,16 +2483,37 @@ async function handleAnthropicStreamRequest(req, res, body) {
2164
2483
  };
2165
2484
  sawStructuredAnthropicEvent = true;
2166
2485
  writeAnthropicEvent(res, eventName, normalizedEventData);
2486
+ return;
2487
+ }
2488
+ }
2489
+ }
2490
+ if (eventName === 'content_block_delta') {
2491
+ const eventIndex = parseEventIndex(eventData.index);
2492
+ if (eventIndex !== null && pendingStructuredToolInputs.has(eventIndex)) {
2493
+ const deltaObj = eventData.delta && typeof eventData.delta === 'object'
2494
+ ? eventData.delta
2495
+ : null;
2496
+ const deltaType = deltaObj && typeof deltaObj.type === 'string' ? deltaObj.type : '';
2497
+ if (deltaType === 'input_json_delta') {
2498
+ seenStructuredToolInputDelta.add(eventIndex);
2499
+ }
2500
+ }
2501
+ }
2502
+ if (eventName === 'content_block_stop') {
2503
+ const eventIndex = parseEventIndex(eventData.index);
2504
+ if (eventIndex !== null && pendingStructuredToolInputs.has(eventIndex)) {
2505
+ if (!seenStructuredToolInputDelta.has(eventIndex)) {
2167
2506
  writeAnthropicEvent(res, 'content_block_delta', {
2168
2507
  type: 'content_block_delta',
2169
- index: eventData.index,
2508
+ index: eventIndex,
2170
2509
  delta: {
2171
2510
  type: 'input_json_delta',
2172
- partial_json: serializedInput,
2511
+ partial_json: pendingStructuredToolInputs.get(eventIndex) || '{}',
2173
2512
  },
2174
2513
  });
2175
- return;
2176
2514
  }
2515
+ pendingStructuredToolInputs.delete(eventIndex);
2516
+ seenStructuredToolInputDelta.delete(eventIndex);
2177
2517
  }
2178
2518
  }
2179
2519
  sawStructuredAnthropicEvent = true;
@@ -4605,7 +4945,8 @@ async function handleRequest(req, res) {
4605
4945
  if (normalizedAnthropicModel) {
4606
4946
  requestRecord.model = normalizedAnthropicModel;
4607
4947
  }
4608
- const normalizedAnthropicBody = JSON.stringify(requestRecord);
4948
+ const promptPolicyAnthropicPayload = applyPromptPolicyToRequestPayload(requestRecord, normalizedAnthropicModel || rawAnthropicModel || 'claude-opus-4-5', 'anthropic');
4949
+ const normalizedAnthropicBody = JSON.stringify(promptPolicyAnthropicPayload);
4609
4950
  const sellerAddress = defaultSeller.toLowerCase();
4610
4951
  let channel = null;
4611
4952
  try {
@@ -4616,10 +4957,10 @@ async function handleRequest(req, res) {
4616
4957
  }
4617
4958
  let ticket = undefined;
4618
4959
  if (channel) {
4619
- ticket = await signTicket(channel, COST_PER_REQUEST);
4960
+ ticket = await signTicket(channel, INITIAL_TICKET_USDC_6);
4620
4961
  console.log(`[Ticket] #${ticket.nonce} 累计: ${formatUnits(BigInt(ticket.amount), 6)} USDC`);
4621
4962
  }
4622
- proxyAnthropicNonStreamRequest(res, normalizedAnthropicBody, requestRecord, ticket);
4963
+ proxyAnthropicNonStreamRequest(res, normalizedAnthropicBody, promptPolicyAnthropicPayload, ticket);
4623
4964
  }
4624
4965
  catch (err) {
4625
4966
  res.writeHead(500, { 'Content-Type': 'application/json' });
@@ -4779,7 +5120,7 @@ async function main() {
4779
5120
  if (startupSellers.length > 0) {
4780
5121
  const firstSeller = startupSellers[0];
4781
5122
  const firstAddress = firstSeller ? extractSellerAddress(firstSeller) : null;
4782
- if (firstAddress)
5123
+ if (!defaultSeller && firstAddress)
4783
5124
  defaultSeller = firstAddress;
4784
5125
  console.log('[卖家] 在线:', startupSellers.length, '| 默认:', defaultSeller);
4785
5126
  }
@@ -4789,6 +5130,13 @@ async function main() {
4789
5130
  console.log('[路由] 静态模型 fallback:', ENABLE_STATIC_MODEL_FALLBACK ? '开启' : '关闭');
4790
5131
  console.log('[路由] 跨模型 fallback:', ENABLE_CROSS_MODEL_FALLBACK ? '开启' : '关闭');
4791
5132
  console.log('[路由] 强制 browser open 兜底:', ENABLE_FORCED_BROWSER_OPEN ? '开启' : '关闭');
5133
+ console.log('[约束] Prompt policy:', ENABLE_PROMPT_POLICY ? '开启' : '关闭');
5134
+ if (ENABLE_PROMPT_POLICY) {
5135
+ const scopedModels = [...PROMPT_POLICY_MODEL_ALLOWLIST];
5136
+ console.log('[约束] Prompt policy 模型:', scopedModels.length > 0 ? scopedModels.join(', ') : '(空)');
5137
+ console.log('[约束] Prompt policy 分块:', ENABLE_PROMPT_POLICY_CHUNKING ? '开启' : '关闭');
5138
+ console.log('[约束] Prompt policy 风格:', ENABLE_PROMPT_POLICY_STYLE ? '开启' : '关闭');
5139
+ }
4792
5140
  const server = http.createServer((req, res) => {
4793
5141
  handleRequest(req, res).catch((err) => {
4794
5142
  if (!res.headersSent) {