Skip to content

合并若干优化#162

Merged
ding113 merged 65 commits into
mainfrom
dev
Nov 21, 2025
Merged

合并若干优化#162
ding113 merged 65 commits into
mainfrom
dev

Conversation

@ding113

@ding113 ding113 commented Nov 21, 2025

Copy link
Copy Markdown
Owner

No description provided.

ding113 and others added 30 commits November 9, 2025 19:07
feat(errors): 扩展不可重试的客户端错误定义和模式
*Total -- 1,193.12kb -> 874.91kb (26.67%)

/public/readme/排行榜.png -- 158.35kb -> 110.57kb (30.17%)
/public/readme/日志.png -- 265.04kb -> 193.59kb (26.96%)
/public/readme/首页.png -- 365.05kb -> 269.36kb (26.21%)
/public/readme/供应商管理.png -- 404.68kb -> 301.38kb (25.53%)

Signed-off-by: ImgBotApp <ImgBotHelp@gmail.com>
…time

Add daily limit feature for keys and providers with a configurable daily reset time (HH:mm). Extend DB schema with limit_daily_usd and daily_reset_time, update rate-limit service to calculate and enforce daily limits using per-day windows with TTL based on reset time, extend time-utils to include daily period handling and next reset computations, and update transformers, repositories, and API handlers to propagate new fields. Also fix provider UI dialogs width for consistent layout.
[ImgBot] Optimize images
新增 `dailyResetMode` 配置项,允许用户选择每日限额的重置方式:
- `fixed`: 在每天固定时间点重置(默认行为)
- `rolling`: 从首次调用开始计算,24小时内滚动重置

该功能影响 Key 和 Provider 的限流逻辑,并更新了相关数据库字段、表单控件及 Redis 脚本。前端界面已添加对应选项和描述说明,确保用户可理解两种模式的区别。

同时扩展了 RateLimitService 中的时间范围和 TTL 计算方法以兼容新模式,
并引入两个新的 Lua 脚本用于处理 Redis 中的滚动窗口数据。
移除了页面组件中重复声明的 configPath 变量,该变量在代码中已经正确定义,
重复声明可能导致潜在的逻辑错误或维护问题。此修复确保了配置路径的正确性和代码的简洁性。
- 在密钥和提供商表单中添加日重置模式选择器(固定窗口/滚动窗口)
- 更新验证模式以包含新的daily_reset_mode字段
- 修复仓储层查询遗漏dailyResetMode字段的问题
- 改进日志记录以避免敏感数据泄露,仅在开发环境输出
- 为所有语言文件添加缺失的配置路径翻译key
- 支持Linux系统的配置文件路径并修正JSON代码块语法
- 统一限流服务调用以正确处理不同模式的日限额计算
- 调整返回类型使其支持滚动模式下的可选重置时间
- 更新用户界面文案以统一占位符语法
…et-time-fix-provider-page-size

feat(rate-limit): add daily per-day limit with customizable reset time and fix provider page UI
- 将 `costDaily.resetAt` 字段设为可选,处理可能不存在重置时间的情况
- 在显示重置时间前添加条件检查,避免未定义值导致的渲染错误
- 更新相关组件中的类型定义,确保类型一致性
- 修复 `formatDateDistance` 函数调用,传入当前日期作为参考时间
- 新增统一的错误响应格式文档,详细说明各种错误场景
- 添加限流排查脚本,便于调试和诊断消费限额问题
- 在供应商选择器中增加详细的限流和熔断器过滤信息
- 重构错误响应构建方法,支持错误类型代码和详细上下文信息
- 为前端和CLI客户端提供结构化的错误数据,便于友好显示和问题定位
- 添加对selectionContext中filteredProviders的空值检查
- 通过可选链操作符安全访问可能为空的属性
- 重构条件逻辑以正确处理不同错误场景
- 避免在filteredProviders为undefined时抛出异常
- 在错误详情对话框中增强限流和熔断错误的可视化展示,区分 JSON 错误和纯文本错误
- 新增"被过滤的供应商"显示区域,在成功请求时展示因限流或熔断被排除的供应商
- 改进错误消息解析逻辑,为限流、熔断和混合不可用错误提供专门的UI样式
- 更新错误处理器,在供应商不可用时记录详细的错误信息到数据库
- 优化 ProviderSelector 的错误判断逻辑,更准确地区分不同类型的不可用状态
- 添加多语言支持,为所有语言版本增加 filteredProviders 翻译字段
- 增强错误信息展示的用户体验,提供更清晰的错误原因和供应商状态说明
## 问题描述

当用户使用 Claude CLI 请求 /v1/messages 端点(Claude Messages API 格式),
但请求的模型不是 claude-* 开头(如 gemini-3-pro-preview)时,系统会错误
地选择 provider_type: "codex" 的供应商,导致请求格式与供应商类型不匹配。

根本原因:系统根据**模型名称**(是否以 `claude-` 开头)判断目标供应商类型,
而不是根据**请求格式**(session.originalFormat)。

## 修复方案

### 1. 新增格式兼容性检查函数
- 新增 `checkFormatProviderTypeCompatibility()` 辅助函数
- 根据 ClientFormat 和 ProviderType 判断兼容性
- 映射关系:
  * claude → claude | claude-auth
  * response → codex
  * openai → openai-compatible
  * gemini → gemini
  * gemini-cli → gemini-cli

### 2. 修改供应商筛选逻辑
- 在模型匹配检查**之前**增加格式类型匹配检查(Step 1b)
- 只选择与请求格式兼容的供应商类型
- 向后兼容:如果 session.originalFormat 未设置,跳过此检查

### 3. 优化 targetType 计算
- 将 decisionContext.targetType 的判断从基于模型名称改为基于 session.originalFormat
- 修复:不再使用 `requestedModel.startsWith("claude-")` 判断

### 4. 增加过滤原因
- 新增 `format_type_mismatch` 过滤原因
- 记录格式不兼容的供应商及详细原因

### 5. 扩展类型定义
- 扩展 decisionContext.targetType 支持所有供应商类型
- 更新过滤原因枚举

## 影响范围

- ✅ 修复了 Claude 格式请求非 Claude 模型时的格式错配问题
- ✅ 支持 claude 类型供应商通过 allowedModels 或 model_redirects 处理非 Claude 模型
- ✅ 向后兼容:不影响现有的正常请求

## 测试验证

- ✅ TypeScript 类型检查通过
- ✅ 代码格式化通过
- ✅ 数据库查询验证:ccr 供应商(provider_type: "claude")成功处理 gemini-3-pro-preview 请求

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
- 移除 key-list.tsx 中复制/显示按钮的 opacity-0 group-hover:opacity-100 样式
- 确保按钮在所有设备(包括移动端)上始终可见
- 保留 hover:bg-muted 效果以提供交互反馈

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
Fix #146: 修复移动端复制按钮无法显示的问题
Comment thread src/actions/providers.ts
body: (model) => ({
model,
max_tokens: API_TEST_CONFIG.TEST_MAX_TOKENS,
max_output_tokens: API_TEST_CONFIG.TEST_MAX_TOKENS,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

关键修复:OpenAI Responses API 参数名错误 🐛

问题:原代码使用 max_tokens,但 OpenAI Responses API 的正确参数名是 max_output_tokens

参考OpenAI Responses API 文档

影响范围

  • ✅ 修复后 API 测试功能可正常工作
  • ⚠️ 需确认历史消息中是否有使用 max_tokens 的请求(可能导致上游 400 错误)

建议

  1. response-handler.ts 中添加参数名转换逻辑(如果尚未实现)
  2. 添加参数验证测试:
test("OpenAI Responses API uses correct parameter name", async () => {
  const body = buildRequestBody("gpt-4o");
  expect(body).toHaveProperty("max_output_tokens");
  expect(body).not.toHaveProperty("max_tokens");
});

<h4 className="font-semibold text-sm">{t("usage")}</h4>
<div className="rounded-md border bg-muted/50 p-3">
<pre className="text-xs font-mono break-all">
<div className="rounded-md border bg-muted/50 p-3 max-h-60 overflow-y-auto">

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

UI 改进:测试结果显示优化 🎨

变更点

  1. ✅ 增加 max-h-60 限制高度,避免大量数据撑开页面
  2. whitespace-pre-wrap + break-words 确保长文本自动换行
  3. ✅ 添加"显示前 N 字符"提示

进一步优化建议

// 1. 添加复制按钮
<Button onClick={() => navigator.clipboard.writeText(JSON.stringify(usage))}>
  复制完整数据
</Button>

// 2. 支持展开/收起
const [expanded, setExpanded] = useState(false);
<pre className={expanded ? "" : "max-h-60 overflow-hidden"}>

可访问性:考虑添加 aria-label 描述滚动区域。

@claude

claude Bot commented Nov 21, 2025

Copy link
Copy Markdown
Contributor

代码审查总结 🔍

这个 PR 包含了多个重要的优化和修复,整体质量很高。主要改进包括:

✅ 核心功能改进

  1. 格式与供应商类型兼容性检查 (provider-selector.ts)

    • 新增 checkFormatProviderTypeCompatibility() 函数
    • 根据 session.originalFormat 精确匹配供应商类型
    • 修复了之前基于模型名启发式判断的不准确问题
    • 建议:验证 gemini-cli 是否应该兼容 gemini 供应商类型
  2. SSE 解析器增强 (sse.ts, response-handler.ts)

    • 支持 Gemini 纯 data: 格式(无 event: 前缀)
    • 符合 SSE 规范(event 字段可选,默认 "message")
    • 向后兼容标准 SSE 格式
    • 建议:添加单元测试覆盖混合格式边界情况
  3. OpenAI Responses API 参数修复 (providers.ts)

    • 修正 max_tokensmax_output_tokens
    • 符合 OpenAI 官方 API 规范
    • 建议:检查历史请求是否受影响

🔒 安全性增强

  1. HTTP 头黑名单扩展 (headers.ts)
    • 新增 30+ 隐私相关 headers(CDN、追踪、真实 IP)
    • 覆盖 Cloudflare、Azure、Akamai、AWS 等主流服务
    • 有效保护客户端隐私
    • 建议:考虑配置化,允许特殊场景自定义

🎨 UI/UX 改进

  1. API 测试结果显示优化 (api-test-button.tsx)

    • 限制高度 + 自动滚动
    • 改进长文本换行
    • 添加截断提示
    • 建议:可增加"复制完整数据"按钮
  2. 按钮可见性优化 (key-list.tsx)

    • 移除 opacity-0 group-hover:opacity-100
    • 提升可访问性(移动端、键盘导航)
  3. 多语言支持 (settings.json)

    • 新增 Gemini 模型类型翻译

📚 文档更新

  1. Database MCP 使用说明 (CLAUDE.md)
    • 新增数据库操作指引
    • 明确 schema 定义位置

🎯 决策上下文类型扩展

  1. 类型定义增强 (message.ts, provider-selector.ts)
    • targetType 支持 5 种格式
    • format_type_mismatch 新增排除原因
    • 决策链追踪更完整

⚠️ 需要关注的点

  1. originalFormat 回退逻辑

    • session.originalFormat 未设置时,默认回退到 claude
    • 可能误判 OpenAI 请求
    • 建议添加 warn 日志记录回退场景
  2. 测试覆盖

    • SSE 解析器需要补充单元测试
    • API 参数验证需要回归测试
  3. gemini-cli 兼容性

    • 需明确 gemini-cli 格式是否应支持 gemini 供应商类型

📊 变更统计

  • 新增: 231 行
  • 删除: 39 行
  • 文件数: 16
  • 复杂度: 中等(涉及核心路由逻辑)

✅ 审查结论

推荐合并,但建议优先处理以下事项:

  1. 补充 SSE 解析器单元测试
  2. 验证 gemini-cli 兼容性逻辑
  3. 添加 originalFormat 回退场景的 warn 日志
  4. 测试 OpenAI Responses API 参数修复的实际效果

感谢贡献!这个 PR 显著提升了系统的健壮性和兼容性。🎉

问题:容器启动时 ErrorRuleDetector 单例在数据库迁移执行前就尝试查询
error_rules 表,导致 'relation does not exist' 错误 (Issue #151)

修复:
- ErrorRuleDetector.reload() 优雅处理表不存在的情况,使用空规则降级
- initializeDefaultErrorRules() 完成后触发 errorRulesUpdated 事件
  确保迁移后检测器自动重载规则

Close #151
Comment on lines +96 to +109
} catch (dbError) {
// 优雅处理表不存在的情况(迁移还未执行时)
// 这允许应用在迁移前正常启动,迁移后会自动重载
const errorMessage = (dbError as Error).message || "";
if (errorMessage.includes("relation") && errorMessage.includes("does not exist")) {
logger.warn(
"[ErrorRuleDetector] error_rules table does not exist yet (migration pending), using empty rules"
);
this.lastReloadTime = Date.now();
return;
}
// 其他数据库错误继续抛出
throw dbError;
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍 Good defensive programming!

这个竞态条件修复很好。当应用在数据库迁移之前启动时,error_rules 表可能不存在,优雅地处理这种情况比抛出错误要好得多。

唯一的小建议是考虑是否需要设置一个更短的重试间隔,以便迁移完成后能更快地加载规则(目前依赖 errorRulesUpdated 事件)。

Comment on lines +91 to +127
/**
* 根据原始请求格式限制可选供应商类型
*
* 核心逻辑:确保客户端请求格式与供应商类型兼容,避免格式错配
*
* 映射关系:
* - claude → claude | claude-auth
* - response → codex
* - openai → openai-compatible
* - gemini → gemini
* - gemini-cli → gemini-cli
*
* @param format - 客户端请求格式(从 session.originalFormat 获取)
* @param providerType - 供应商类型
* @returns 是否兼容
*
* 向后兼容:调用方在 originalFormat 未设置时应跳过此检查
*/
function checkFormatProviderTypeCompatibility(
format: ClientFormat,
providerType: Provider["providerType"]
): boolean {
switch (format) {
case "claude":
return providerType === "claude" || providerType === "claude-auth";
case "response":
return providerType === "codex";
case "openai":
return providerType === "openai-compatible";
case "gemini":
return providerType === "gemini";
case "gemini-cli":
return providerType === "gemini-cli";
default:
return true; // 未知格式回退为兼容(不会主动过滤)
}
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍 核心改进:请求格式与供应商类型兼容性检查

这个新增的 checkFormatProviderTypeCompatibility 函数解决了一个重要问题:确保客户端请求格式与供应商类型匹配,避免格式错配导致的运行时错误。

映射关系清晰:

  • claudeclaude | claude-auth
  • responsecodex
  • openaiopenai-compatible
  • geminigemini
  • gemini-cligemini-cli

建议:考虑添加单元测试覆盖这些映射关系。

Comment on lines 23 to +61
// 初始化黑名单(默认包含代理相关的 headers)
// 目的:保护客户端隐私,避免真实 IP 和来源信息泄露给上游供应商
const defaultBlacklist = [
"x-forwarded-for",
"x-forwarded-host",
"x-forwarded-port",
"x-forwarded-proto",
// 标准代理转发头
"x-forwarded-for", // 客户端真实 IP 链
"x-forwarded-host", // 原始请求 Host
"x-forwarded-port", // 原始请求端口
"x-forwarded-proto", // 原始请求协议 (http/https)
"forwarded", // RFC 7239 标准转发头

// 真实 IP 相关
"x-real-ip", // Nginx 常用的真实 IP 头
"x-client-ip", // 部分代理使用
"x-originating-ip", // Microsoft 相关服务
"x-remote-ip", // 部分代理使用
"x-remote-addr", // 部分代理使用

// CDN/云服务商特定头
"cf-connecting-ip", // Cloudflare 客户端 IP
"cf-ipcountry", // Cloudflare 客户端国家
"cf-ray", // Cloudflare 请求追踪 ID
"cf-visitor", // Cloudflare 访问者信息
"true-client-ip", // Cloudflare Enterprise / Akamai
"x-cluster-client-ip", // 部分负载均衡器
"fastly-client-ip", // Fastly CDN
"x-azure-clientip", // Azure
"x-azure-fdid", // Azure Front Door ID
"x-azure-ref", // Azure 请求追踪
"akamai-origin-hop", // Akamai
"x-akamai-config-log-detail", // Akamai 配置日志

// 请求追踪和关联头
"x-request-id", // 请求追踪 ID
"x-correlation-id", // 关联 ID
"x-trace-id", // 追踪 ID
"x-amzn-trace-id", // AWS X-Ray 追踪
"x-b3-traceid", // Zipkin 追踪
"x-b3-spanid", // Zipkin span
"x-b3-parentspanid", // Zipkin parent span

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍 安全性增强:完善的隐私保护 Header 黑名单

新增的 Header 黑名单非常全面,覆盖了:

  • 标准代理转发头(X-Forwarded-*)
  • CDN/云服务商特定头(Cloudflare, Azure, Akamai, Fastly)
  • 请求追踪头(X-Request-Id, X-Trace-Id, W3C Trace Context)

这有助于保护客户端隐私,防止真实 IP 和来源信息泄露给上游供应商。

小建议:考虑将这个黑名单配置为可扩展的(例如通过环境变量或配置文件),以便在生产环境中根据需要添加更多 Header。

Comment thread src/lib/utils/sse.ts
Comment on lines 17 to +25
@@ -20,9 +22,9 @@ export function parseSSEData(sseText: string): ParsedSSEEvent[] {

try {
const data = JSON.parse(dataStr);
events.push({ event: eventName, data });
events.push({ event: eventName || "message", data });

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good fix for Gemini SSE parsing

修复了仅有 data: 而没有 event: 前缀的 SSE 格式解析问题。这对于 Gemini 流式响应的兼容性很重要。

逻辑变化:

  • 移除了 !eventName 时跳过的条件
  • 未设置 eventName 时默认使用 "message"

这是一个向后兼容的修改。

@claude

claude Bot commented Nov 21, 2025

Copy link
Copy Markdown
Contributor

📝 PR 代码审查总结

整体评估

这是一个从 dev 分支合并到 main 分支的优化 PR,包含多项改进。代码质量良好,变更合理。

主要变更亮点

✅ 核心优化

  1. 供应商格式兼容性检查 (provider-selector.ts)

    • 新增 checkFormatProviderTypeCompatibility 函数
    • 确保客户端请求格式与供应商类型匹配
    • 避免格式错配导致的运行时错误
  2. ErrorRuleDetector 竞态条件修复 (error-rule-detector.ts)

    • 优雅处理迁移前表不存在的情况
    • 允许应用在迁移前正常启动
    • 迁移后通过事件自动重载
  3. Header 隐私保护增强 (headers.ts)

    • 新增完整的 CDN/云服务商特定 Header 黑名单
    • 保护客户端隐私,防止 IP 和来源信息泄露
  4. SSE 解析兼容性修复 (sse.ts)

    • 支持 Gemini 纯 data: 格式的流式响应

🔧 UI/UX 改进

  • API 测试按钮响应展示优化
  • 模型选择器新增 Gemini 支持
  • 使用日志表格列宽调整
  • Key 列表按钮始终可见

📚 文档更新

  • CLAUDE.md 新增 Database MCP 使用说明

建议(非阻塞)

  1. 考虑为 checkFormatProviderTypeCompatibility 添加单元测试
  2. Header 黑名单可考虑配置化以便扩展
  3. OpenAI Responses API 测试修复 (max_tokensmax_output_tokens) 是正确的

结论

✅ LGTM - 代码质量良好,建议合并。

ding113 and others added 14 commits November 21, 2025 23:35
- Add validation to ensure Key's daily limit does not exceed user's daily quota
- Apply validation in both addKey and editKey functions
- Add dailyResetMode parameter to editKey function signature
- Addresses code review feedback from PR #161
- Add dailyResetMode field (fixed/rolling) to EditKeyFormProps
- Import and implement Select component for reset mode selection
- Conditionally display dailyResetTime input only for 'fixed' mode
- Add i18n translations for dailyResetMode in en and zh-CN locales
- Maintain consistency with add-key-form implementation
- Addresses code review feedback from PR #161
- Add logs.details.reasons.rateLimited and circuitOpen keys to all locales
- Replace hardcoded Chinese text with t() function in error-details-dialog
- Support 5 languages: en, zh-CN, zh-TW, ja, ru
- Improves maintainability and internationalization
- Addresses code review feedback from PR #161
- Add dailyResetMode field to EditKeyQuotaDialogProps interface
- Implement Select component for reset mode selection (fixed/rolling)
- Conditionally display dailyResetTime input only for 'fixed' mode
- Include dailyResetMode in both edit and clear quota operations
- Add dynamic description text based on selected mode
- Update KeyWithQuota interface to include dailyResetMode field
- Addresses code review feedback from PR #161
- Add pgEnum definition for daily_reset_mode with values ['fixed', 'rolling']
- Replace varchar type with dailyResetModeEnum in keys and providers tables
- Maintain .default('fixed').notNull() constraints
- Generate migration 0022_simple_stardust.sql for type conversion
- Benefits: database-level constraint, better TypeScript inference, automatic validation
- Addresses code review feedback from PR #161
- Add idx_keys_daily_limit index on keys(limit_daily_usd, daily_reset_mode)
- Add idx_providers_daily_limit index on providers(limit_daily_usd, daily_reset_mode)
- Use partial indexes (WHERE limit_daily_usd IS NOT NULL) for efficiency
- Benefits: faster queries for records with daily limits, smaller index size
- Supports compound queries filtering by both limit and reset mode
- Addresses code review feedback from PR #161
- Add Redis Key Architecture section to CLAUDE.md
- Document fixed vs rolling window naming conventions
- Explain why fixed mode needs suffix and rolling mode doesn't
- Add detailed examples for all time periods (daily/5h/weekly/monthly)
- Include debugging commands and troubleshooting guide
- Add inline documentation in rate-limit/service.ts
- Benefits: easier debugging, better maintainability, clearer design rationale
- Addresses code review feedback from PR #161
The previous CI run (19575549792) started at 15:38:51 UTC but the
format fix commit (f9272f3) was pushed at 15:39:17 UTC. This empty
commit triggers a new CI run with the corrected code.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
Changed trailing period from ASCII `.` to Chinese `。` for consistency
with the rest of the Chinese text in the documentation.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
## 主要变更

### 新增 17 个细粒度 workflows
- Issue 管理: triage, duplicate-check, stale-cleanup, oncall-triage, auto-response
- PR 管理: review, label, size-check, changelog, description
- 交互响应: mention-responder, review-responder
- CI/安全: ci-autofix, security-scan, dependency-review
- 文档/发布: docs-review, release-notes

### 删除
- claude-assistant.yml (合并 workflow 已拆分)

### 改进
- 支持 Fork PR: 使用 pull_request_target + allowed_non_write_users
- 分支策略: 默认从 origin/dev 创建分支,PR 指向 dev
- 响应类型: 区分 HELP vs CODE FIX,不自动修复
- Bot 过滤: 所有 PR workflows 添加 bot 过滤
- Concurrency: 防止竞态条件
- Action 版本: 升级 setup-bun@v2, build-push@v6, gh-release@v2
- 安全修复: review-responder 使用 SHA 而非 ref
## 改进内容

### claude-pr-review.yml
- 采用世界级代码审查标准
- 按优先级排列审查标准:Correctness > Security > Performance > Maintainability
- 强制要求严重程度分级(Critical/High/Medium/Low)
- 要求提供具体代码建议,不允许模糊评论
- 专注于发现问题,不评论做得好的地方
- 详细的安全漏洞检查清单
- 结构化的输出格式

### claude-security-scan.yml
- 完整的 OWASP Top 10 覆盖
- 每种漏洞提供攻击场景和安全影响说明
- 要求包含 CWE/OWASP 参考链接
- 具体的安全代码示例(vulnerable vs secure)
- 额外检查:SSRF, Path Traversal, Race Conditions, Crypto issues
- 严格的严重程度分类

### claude-docs-review.yml
- 技术准确性优先(代码示例、API 文档)
- 检查代码示例可执行性
- 验证链接有效性
- 评估完整性和清晰度
- 专注于会误导读者的问题

## 核心改进
- 批判性思维:只指出问题,不赞美
- 可执行性:所有建议必须有具体代码
- 优先级:按影响严重程度排序
- 专业性:使用行业标准(OWASP, CWE, 最佳实践)
OIDC token 认证需要 id-token: write 权限才能正常工作
@ding113
ding113 merged commit 7840a2d into main Nov 21, 2025
1 of 6 checks passed
github-actions Bot added a commit that referenced this pull request Nov 21, 2025
@ding113 ding113 linked an issue Nov 21, 2025 that may be closed by this pull request
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[bug] codex 会使用 gemini 供应商 [bug]供应商模型测试问题反馈 gemini会轮询到codex的供应商

6 participants