Skip to content

feat(sensitive): 敏感词命中时返回明确拒绝回答#12

Merged
reputationly merged 1 commit into
mainfrom
feat/reconcile-diff-localization
Jun 15, 2026
Merged

feat(sensitive): 敏感词命中时返回明确拒绝回答#12
reputationly merged 1 commit into
mainfrom
feat/reconcile-diff-localization

Conversation

@reputationly

Copy link
Copy Markdown
Owner

Summary

  • 敏感词命中时不再返回「服务器异常」500 错误,而是返回正常的拒绝回答(HTTP 200)
  • 新增 service/sensitive_refusal.go,按 relayFormat × stream 构造合规响应:
    • OpenAI /chat/completions(含流式)→ chat.completion / SSE chunk
    • Claude /v1/messages(含流式)→ message / SSE 五事件序列(符合 Anthropic SSE 规范)
    • 其他格式(embedding / rerank / image / audio / gemini / responses / task / mj)→ 退回 400 明确错误
  • 通过 len(r.Messages) > 0 区分 /chat/completions/completions/moderations,避免返回不兼容的 schema
  • 新增 SensitiveRefusalText 配置项(默认「很抱歉,你输入的内容含有敏感信息,我无法回答。」),支持后台持久化自定义
  • classic 前端「屏蔽词过滤设置」新增拒绝文案输入框,覆盖 en / fr / ru / ja / vi / zh-CN / zh-TW 翻译

Test plan

  • 触发敏感词,确认 chat completions 返回正常拒绝文案而非红色错误框
  • 流式请求同样触发敏感词,确认 SSE 流正常关闭
  • Claude 格式请求触发敏感词,确认返回合规 SSE 事件序列
  • 在后台「屏蔽词过滤设置」修改拒绝文案,确认生效
  • embedding / image 等端点触发敏感词,确认返回 400 而非伪造的 chat.completion

- 新增 service/sensitive_refusal.go:按 relayFormat × stream 构造 200 正常响应
  - OpenAI chat/completions(含流式)→ chat.completion / SSE chunk
  - Claude /v1/messages(含流式)→ message / SSE 五事件序列(符合 Anthropic SSE 规范)
  - 其他格式(embedding/rerank/image/audio/gemini/responses/task/mj)→ 退回 400 明确错误
- OpenAI 分支通过 len(r.Messages) > 0 区分 /chat/completions 与 /completions、/moderations
- 新增 setting.SensitiveRefusalText 配置项(默认「很抱歉,你输入的内容含有敏感信息,我无法回答。」)
- model/option.go 纳入 SensitiveRefusalText 的持久化读写
- classic 前端「屏蔽词过滤设置」新增拒绝文案输入框 + 各语言 i18n 翻译
@reputationly reputationly merged commit 7eae57d into main Jun 15, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant