diff --git a/README.md b/README.md index b7b6d4c..6dcea52 100644 --- a/README.md +++ b/README.md @@ -159,6 +159,18 @@ api2cursor/ - `file_path` → `path` 字段映射 - `finish_reason` 修正 + +============================ +增加缓存,在api2cursor里面的body修改中加个你喜欢的随意字段: +{ + "prompt_cache_key": "GPT5-4-xxx-xxx" +} +openai 开 fast 模式 +{ + "service_tier": "priority" +} + + ## 许可证 [MIT](LICENSE) diff --git a/static/admin.css b/static/admin.css index 1824b17..e52b5e9 100644 --- a/static/admin.css +++ b/static/admin.css @@ -9,7 +9,7 @@ body{font-family:-apple-system,BlinkMacSystemFont,'Segoe UI','PingFang SC','Micr input,select,button,textarea{font-family:inherit;font-size:inherit} a{color:var(--primary);text-decoration:none} code{background:var(--input);padding:1px 5px;border-radius:4px;font-size:12px;font-family:Consolas,Monaco,monospace} -.container{max-width:960px;margin:0 auto;padding:0 20px} +.container{width:min(100%,1680px);margin:0 auto;padding:0 20px} #login{display:flex;align-items:center;justify-content:center;min-height:100vh;background:linear-gradient(145deg,#0b1120 0%,#121a2e 50%,#0b1120 100%)} .login-card{background:var(--card);border:1px solid var(--border);border-radius:16px;padding:40px;width:380px;box-shadow:0 20px 60px rgba(0,0,0,.4)} diff --git a/static/admin.html b/static/admin.html index bf79a2e..b4a0b85 100644 --- a/static/admin.html +++ b/static/admin.html @@ -4,7 +4,7 @@ API 2 Cursor - 管理面板 - + @@ -190,6 +190,6 @@
- + diff --git a/static/admin.js b/static/admin.js index 67a4679..236c33a 100644 --- a/static/admin.js +++ b/static/admin.js @@ -117,7 +117,10 @@ async function loadRequestLogs() { let html = '
'; for (const item of items) { const usage = item.usage || {}; - const tokens = '输 ' + fmtNum(usage.input_tokens) + ' / 出 ' + fmtNum(usage.output_tokens) + ' / 总 ' + fmtNum(usage.total_tokens); + let tokens = '输 ' + fmtNum(usage.input_tokens) + ' / 出 ' + fmtNum(usage.output_tokens) + ' / 总 ' + fmtNum(usage.total_tokens); + if (Number(usage.cache_read_tokens || 0) > 0 || Number(usage.cache_write_tokens || 0) > 0) { + tokens += ' / 缓存读 ' + fmtNum(usage.cache_read_tokens) + ' / 缓存写 ' + fmtNum(usage.cache_write_tokens); + } const statusClass = item.status === 'ok' ? 'status-ok' : 'status-error'; const statusText = item.status === 'ok' ? '成功' : '异常'; html += '' diff --git a/utils/request_history.py b/utils/request_history.py index e8dde7f..18162c8 100644 --- a/utils/request_history.py +++ b/utils/request_history.py @@ -39,10 +39,24 @@ def _normalize_usage(usage: dict[str, Any] | None) -> dict[str, int]: usage.get('completion_tokens', usage.get('output_tokens', 0)) ) total_tokens = _safe_int(usage.get('total_tokens', input_tokens + output_tokens)) + + prompt_details = usage.get('prompt_tokens_details') + input_details = usage.get('input_tokens_details') + + cache_read_tokens = _safe_int(usage.get('cache_read_input_tokens', 0)) + cache_write_tokens = _safe_int(usage.get('cache_creation_input_tokens', 0)) + + if isinstance(prompt_details, dict): + cache_read_tokens = max(cache_read_tokens, _safe_int(prompt_details.get('cached_tokens', 0))) + if isinstance(input_details, dict): + cache_read_tokens = max(cache_read_tokens, _safe_int(input_details.get('cached_tokens', 0))) + return { 'input_tokens': input_tokens, 'output_tokens': output_tokens, 'total_tokens': total_tokens, + 'cache_read_tokens': cache_read_tokens, + 'cache_write_tokens': cache_write_tokens, }
请求时间请求模型实际模型上游 URLTokens耗时状态