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.
- package/dist/buyer/mode.js +1 -1
- package/dist/buyer/mode.js.map +1 -1
- package/dist/config.js +1 -1
- package/dist/config.js.map +1 -1
- package/dist/local-proxy.js +377 -29
- package/dist/local-proxy.js.map +1 -1
- package/dist/seller-daemon.js +242 -12
- package/dist/seller-daemon.js.map +1 -1
- package/package.json +1 -1
package/dist/buyer/mode.js
CHANGED
|
@@ -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(
|
|
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,
|
package/dist/buyer/mode.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mode.js","sourceRoot":"","sources":["../../src/buyer/mode.ts"],"names":[],"mappings":"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
|
|
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:
|
|
18
|
+
channelDeposit: 2000000n, // 2 USDC per channel
|
|
19
19
|
strategy: 'lowest_price',
|
|
20
20
|
};
|
|
21
21
|
/**
|
package/dist/config.js.map
CHANGED
|
@@ -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,
|
|
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"}
|
package/dist/local-proxy.js
CHANGED
|
@@ -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
|
|
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 = '
|
|
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 +
|
|
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 +
|
|
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
|
-
|
|
1446
|
-
|
|
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,
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1668
|
-
|
|
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 =
|
|
1708
|
-
if (actualCostUsdc >
|
|
1709
|
-
const extra = actualCostUsdc -
|
|
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
|
-
|
|
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)} ≤
|
|
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:
|
|
2508
|
+
index: eventIndex,
|
|
2170
2509
|
delta: {
|
|
2171
2510
|
type: 'input_json_delta',
|
|
2172
|
-
partial_json:
|
|
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
|
|
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,
|
|
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,
|
|
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) {
|