四次元壁鉴权模式,claude4.6预填充等等

This commit is contained in:
RT15548
2026-02-19 00:46:13 +08:00
parent 9e92a9d1b5
commit 4e8424ed17
15 changed files with 647 additions and 554 deletions

View File

@@ -136,18 +136,13 @@ class StreamingGeneration {
const opts = { ...baseOptions, ...this.resolveCurrentApiAndModel(baseOptions) };
const modelLower = String(opts.model || '').toLowerCase();
const isClaudeThinkingModel =
modelLower.includes('claude') &&
modelLower.includes('thinking') &&
!modelLower.includes('nothinking');
const isClaudeModel = modelLower.includes('claude');
if (isClaudeThinkingModel && Array.isArray(messages) && messages.length > 0) {
const lastMsg = messages[messages.length - 1];
if (lastMsg?.role === 'assistant') {
console.log('[xbgen] Claude Thinking 模型:移除 assistant prefill');
messages.pop();
if (isClaudeModel && Array.isArray(messages) && messages.length > 0) {
if (this._convertTrailingAssistantToSystem(messages)) {
console.log('[xbgen] Claude model: converted trailing assistant prefill to system message');
}
}
}
const source = {
openai: chat_completion_sources.OPENAI,
@@ -292,10 +287,14 @@ class StreamingGeneration {
const logSendRequestError = (err, streamMode) => {
if (err?.name !== 'AbortError') {
const safeApiUrl = String(cmdApiUrl || reverseProxy || oai_settings?.custom_url || '').trim();
const status = this._extractHttpStatus(err);
const isRateLimit = status === 429;
try {
xbLog.error('streamingGeneration', 'sendRequest failed', {
message: err?.message || String(err),
name: err?.name,
status,
isRateLimit,
stream: !!streamMode,
api: String(opts.api || ''),
model,
@@ -304,6 +303,12 @@ class StreamingGeneration {
});
} catch {}
console.error('[xbgen:callAPI] sendRequest failed:', err);
if (status) {
console.error(`[xbgen:callAPI] HTTP status=${status} stream=${!!streamMode} api=${String(opts.api || '')} model=${model}`);
}
if (isRateLimit) {
console.error('[xbgen:callAPI] Rate limited (429). Check provider RPM/TPM and concurrent requests.');
}
}
};
@@ -470,6 +475,14 @@ class StreamingGeneration {
return String(session.text || '');
}
const httpStatus = this._extractHttpStatus(err);
if (!err?.error && httpStatus) {
err.error = {
code: String(httpStatus),
message: String(err?.message || `HTTP ${httpStatus}`),
};
}
console.error('[StreamingGeneration] Generation error:', err);
console.error('[StreamingGeneration] error.error =', err?.error);
try { xbLog.error('streamingGeneration', `processGeneration error sid=${session.id}`, err); } catch {}
@@ -805,6 +818,30 @@ class StreamingGeneration {
return '';
}
_convertTrailingAssistantToSystem(messages) {
if (!Array.isArray(messages) || messages.length < 1) return false;
const lastMsg = messages[messages.length - 1];
if (lastMsg?.role !== 'assistant') return false;
const assistantText = this._extractTextFromMessage(lastMsg).trim();
const systemText = assistantText ? `Assistant:\n${assistantText}` : 'Assistant:';
lastMsg.role = 'system';
lastMsg.content = systemText;
return true;
}
_extractHttpStatus(err) {
const direct = Number(err?.status || err?.statusCode || err?.response?.status);
if (Number.isFinite(direct) && direct >= 100 && direct <= 599) return direct;
const msg = String(err?.message || '');
const m = msg.match(/\bstatus\s+(\d{3})\b/i);
if (m) {
const s = Number(m[1]);
if (Number.isFinite(s)) return s;
}
return null;
}
_getLastMessagesSnapshot() {
const ctx = getContext();
const list = Array.isArray(ctx?.chat) ? ctx.chat : [];