v0.1.3-rc.3.3

限制 `TOKEN_DELIMITER` 为 ASCII 避免问题
This commit is contained in:
wisdgod
2025-01-18 04:19:55 +08:00
parent 742c2e1c5c
commit 3e304f53d4
10 changed files with 43 additions and 112 deletions

View File

@@ -307,24 +307,13 @@
// 添加用户基本信息
if (tokenInfo.user || calibInfo) {
const user = tokenInfo.user || {};
userDetails.innerHTML += `
<p>用户ID: ${calibInfo ? calibInfo.user_id : user.id}</p>
<p>邮箱: ${user.email || ''}</p>
<p>用户名: ${user.name || ''}</p>
${user.updated_at ? `<p>更新时间: ${new Date(user.updated_at).toLocaleString()}</p>` : ''}
${calibInfo ? `<p>令牌创建时间: ${new Date(calibInfo.create_at).toLocaleString()}</p>` : ''}
${calibInfo && calibInfo.checksum_time ? `<p>校验和时间区间: ${new Date(calibInfo.checksum_time * 1e6).toLocaleString()} - ${new Date((calibInfo.checksum_time + 1) * 1e6 - 1).toLocaleString()}</p>` : ''}
`;
userDetails.innerHTML += `<p>用户ID: ${calibInfo ? calibInfo.user_id : user.id}</p><p>邮箱: ${user.email || ''}</p><p>用户名: ${user.name || ''}</p>${user.updated_at ? `<p>更新时间: ${new Date(user.updated_at).toLocaleString()}</p>` : ''}${calibInfo ? `<p>令牌创建时间: ${new Date(calibInfo.create_at).toLocaleString()}</p>` : ''}${calibInfo && calibInfo.checksum_time ? `<p>校验和时间区间: ${new Date(calibInfo.checksum_time * 1e6).toLocaleString()} - ${new Date((calibInfo.checksum_time + 1) * 1e6 - 1).toLocaleString()}</p>` : ''}`;
}
// 添加 Stripe 会员信息
if (tokenInfo.stripe) {
const stripe = tokenInfo.stripe;
userDetails.innerHTML += `
<p>会员类型: ${stripe.membership_type}</p>
${stripe.payment_id ? `<p>付款 ID: ${stripe.payment_id}</p>` : ''}
<p>试用剩余: ${stripe.days_remaining_on_trial} 天</p>
`;
userDetails.innerHTML += `<p>会员类型: ${stripe.membership_type}</p>${stripe.payment_id ? `<p>付款 ID: ${stripe.payment_id}</p>` : ''}<p>试用剩余: ${stripe.days_remaining_on_trial} 天</p>`;
}
// 添加使用情况进度条
@@ -342,15 +331,7 @@
const percentage = isUnlimited ? 100 : (data.requests / data.max_requests * 100).toFixed(1);
const progressClass = isUnlimited ? 'unlimited' : getProgressBarClass(parseFloat(percentage));
progressContainer.innerHTML += `
<div>
<p>${modelName}: ${data.requests}/${isUnlimited ? '∞' : data.max_requests} 请求
${isUnlimited ? '' : `(${percentage}%)`}, ${data.tokens} tokens</p>
<div class="usage-progress-container">
<div class="usage-progress-bar ${progressClass}" style="width: ${percentage}%"></div>
</div>
</div>
`;
progressContainer.innerHTML += `<div><p>${modelName}: ${data.requests}/${isUnlimited ? '∞' : data.max_requests} 请求 ${isUnlimited ? '' : `(${percentage}%)`}, ${data.tokens} tokens</p><div class="usage-progress-container"><div class="usage-progress-bar ${progressClass}" style="width: ${percentage}%"></div></div></div>`;
}
});
}

View File

@@ -584,9 +584,7 @@
const progressDiv = document.createElement('div');
progressDiv.className = 'usage-progress-container';
const colorClass = getProgressBarClass(parseFloat(percentage));
progressDiv.innerHTML = `
<div class="usage-progress-bar ${colorClass}" style="width: ${percentage}%"></div>
`;
progressDiv.innerHTML = `<div class="usage-progress-bar ${colorClass}" style="width: ${percentage}%"></div>`;
container.appendChild(progressDiv);
} else {
element.textContent = `${requests} requests, ${tokens} tokens`;
@@ -629,54 +627,14 @@
['Premium', premiumUsage]
];
return rows.map(([label, value]) => `
<div class="tooltip-info-row">
<span class="label">${label}:</span>
<span class="value">${value}</span>
</div>
`).join('');
return rows.map(([label, value]) => `<div class="tooltip-info-row"><span class="label">${label}:</span><span class="value">${value}</span></div>`).join('');
}
function updateTable(data) {
const tbody = document.getElementById('logsBody');
updateStats(data);
tbody.innerHTML = data.logs.map(log => `
<tr>
<td>${log.id}</td>
<td>${new Date(log.timestamp).toLocaleString()}</td>
<td>${log.model}</td>
<td>
<div class="token-info-tooltip">
<button class="info-button" onclick='showTokenModal(${JSON.stringify(log.token_info)})'>
查看详情
<div class="tooltip-content">
${formatSimpleTokenInfo(log.token_info)}
</div>
</button>
</div>
</td>
<td>
${log.prompt ?
`<div class="token-info-tooltip prompt-preview">
<button class="info-button" onclick="showPromptModal(decodeURIComponent('${encodeURIComponent(log.prompt).replace(/'/g, "\\'")}'))">
查看对话
<div class="tooltip-content">
${formatPromptPreview(log.prompt)}
</div>
</button>
</div>` :
'-'
}
</td>
<td>
${formatTiming(log.timing.total, log.timing.first)}
</td>
<td>${log.stream ? '是' : '否'}</td>
<td>${log.status}</td>
<td>${log.error || '-'}</td>
</tr>
`).join('');
tbody.innerHTML = data.logs.map(log => `<tr><td>${log.id}</td><td>${new Date(log.timestamp).toLocaleString()}</td><td>${log.model}</td><td><div class="token-info-tooltip"><button class="info-button" onclick='showTokenModal(${JSON.stringify(log.token_info)})'>查看详情<div class="tooltip-content">${formatSimpleTokenInfo(log.token_info)}</div></button></div></td><td>${log.prompt ?`<div class="token-info-tooltip prompt-preview"><button class="info-button" onclick="showPromptModal(decodeURIComponent('${encodeURIComponent(log.prompt).replace(/'/g, "\\'")}'))">查看对话<div class="tooltip-content">${formatPromptPreview(log.prompt)}</div></button></div>` :'-'}</td><td>${formatTiming(log.timing.total, log.timing.first)}</td><td>${log.stream ? '是' : '否'}</td><td>${log.status}</td><td>${log.error || '-'}</td></tr>`).join('');
}
function formatTiming(total, first) {
@@ -700,15 +658,7 @@
'assistant': '助手'
};
return `
<div class="message-meta">最后一条消息 (${roleLabels[lastMessage.role] || lastMessage.role}):</div>
<div class="last-message">${lastMessage.content
.replace(/&/g, '&amp;')
.replace(/</g, '&lt;')
.replace(/>/g, '&gt;')
.replace(/\n/g, '<br>')
}</div>
`;
return `<div class="message-meta">最后一条消息 (${roleLabels[lastMessage.role] || lastMessage.role}):</div><div class="last-message">${lastMessage.content.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\n/g, '<br>')}</div>`;
} catch (e) {
console.error('预览对话内容失败:', e);
return '无法解析对话内容';

View File

@@ -214,24 +214,7 @@ function formatPromptToTable(messages) {
return escaped;
}
return `
<table class="message-table">
<thead>
<tr>
<th>角色</th>
<th>内容</th>
</tr>
</thead>
<tbody>
${messages.map(msg => `
<tr>
<td>${roleLabels[msg.role] || msg.role}</td>
<td>${escapeHtml(msg.content).replace(/\n/g, '<br>')}</td>
</tr>
`).join('')}
</tbody>
</table>
`;
return `<table class="message-table"><thead><tr><th>角色</th><th>内容</th></tr></thead><tbody>${messages.map(msg => `<tr><td>${roleLabels[msg.role] || msg.role}</td><td>${escapeHtml(msg.content).replace(/\n/g, '<br>')}</td></tr>`).join('')}</tbody></table>`;
}
/**