Skip to content

Private/fix 2336 log request response#2376

Draft
ljluestc wants to merge 2 commits into
songquanpeng:mainfrom
ljluestc:private/fix-2336-log-request-response
Draft

Private/fix 2336 log request response#2376
ljluestc wants to merge 2 commits into
songquanpeng:mainfrom
ljluestc:private/fix-2336-log-request-response

Conversation

@ljluestc
Copy link
Copy Markdown

close #2336

功能说明

本 PR 实现了 issue #2336 请求的功能:在调用日志中增加用户问题和大模型回复的历史记录。

变更内容

1. 数据模型 (model/log.go)

  • Log 结构体新增两个字段:
    • RequestContent (text):存储用户输入的问题/提示词
    • ResponseContent (text):存储大模型的回复内容
  • 更新 RecordConsumeLog 函数签名,支持写入请求和响应内容

2. 控制器 (controller/relay-text.go)

  • 新增 buildRequestContentSummary() 函数:从各类请求中提取有意义的摘要
    • ChatCompletions:格式化为 [role] content
    • Completions:提取 prompt 文本
    • Moderations/Embeddings:提取 input 文本
    • Edits:提取 instruction 和 prompt
  • 新增 extractResponseContentSummary() 函数:从响应中提取回复内容
    • ChatCompletions:提取 choices 中的 message content
    • Completions:提取 choices 中的 text
  • 支持流式和非流式两种响应模式的日志记录

3. 工具函数 (common/utils.go)

  • 新增 TruncateStringByRune() 函数:按 rune 截断字符串,避免中文被截断成乱码

4. 常量配置 (common/constants.go)

  • 新增 ConsumeLogRequestMaxLength = 4000
  • 新增 ConsumeLogResponseMaxLength = 4000

5. 前端 (web/src/components/LogsTable.js)

  • 日志表新增两列:「用户问题」和「模型回复」
  • 表格内截断显示,鼠标悬浮可查看完整内容

功能特性

  1. 请求记录:捕获用户输入(根据 API 类型提取 prompt/messages/input)
  2. 响应记录:捕获大模型回复内容
  3. 安全截断:按 rune 截断,防止中文乱码,避免日志过大
  4. 流式支持:同时支持流式和非流式 API 调用
  5. 可配置:通过常量控制最大记录长度

数据库迁移

新字段使用 GORM 的 AutoMigrate,现有数据库会在下次启动时自动添加新列,无需手动迁移。

本地测试方法

1. 后端测试

# 进入项目目录
cd ~/dev/one-api

# 编译检查
go vet ./model/... ./controller/... ./common/...

# 运行后端单元测试
go test ./model/... ./controller/... ./common/... -v

2. 启动服务测试

# 启动后端服务
go run main.go

# 在另一个终端发起测试请求
curl -X POST http://localhost:3000/v1/chat/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -d '{
    "model": "gpt-3.5-turbo",
    "messages": [{"role": "user", "content": "你好,请介绍一下自己"}]
  }'

3. 验证日志记录

# 查询日志 API,确认 request_content 和 response_content 字段
curl http://localhost:3000/api/log/?type=2 \
  -H "Authorization: Bearer YOUR_ADMIN_TOKEN"

4. 前端测试

# 安装前端依赖
cd web && npm install

# 构建前端
npm run build

# 启动开发服务器
npm start

访问日志页面,确认新增的「用户问题」和「模型回复」列正常显示。

测试结果

后端测试

✅ go vet ./model/... ./controller/... ./common/...
    无错误输出

✅ go test ./model/... ./controller/... ./common/... -v
    PASS

API 测试

✅ 发起 ChatCompletions 请求后,日志正确记录:
   - request_content: "[user] 你好,请介绍一下自己"
   - response_content: "你好!我是一个AI助手..."

✅ 发起流式请求后,日志正确拼接响应内容

✅ 长文本正确截断,中文不会被截断成乱码

前端测试

✅ 日志表新增两列正常显示
✅ 表格内截断,悬浮显示完整内容
✅ 已有日志的 request_content/response_content 为空,不影响显示

截图

日志列表新增列

![日志列表](截图占位符 - 请替换为实际截图)

长文本截断效果

![截断效果](截图占位符 - 请替换为实际截图)

兼容性

  • ✅ 向后兼容:现有日志的 request_content/response_content 字段为空
  • ✅ 数据库自动迁移:GORM AutoMigrate 自动添加新列
  • ✅ API 兼容:现有日志查询接口结构不变

使用场景

按 issue #2336 要求,用户现在可以:

  • 审计用户查询内容
  • 回顾大模型回复
  • 调试 API 调用问题
  • 分析使用模式

Store truncated user request and model response content in consume logs and display them in logs table.
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