chengqian
|
62a23325c7
|
improve:导出接口护栏与两端控制台查询性能优化
- 导出统一行数上限:xlsx 超限在拉取阶段截停并报错,CSV 到限截断并在文件末尾写入可见标记
- 全部导出接口 OFFSET 循环翻页改为 keyset 游标(用量日志/计费记录/成员/渠道/钱包流水)
- 用量日志导出强制时间窗(开始时间必填、跨度≤31天),校验下沉 common 供管理后台与租户端共用
- 管理后台仪表盘趋势/租户排行/模型分布/小时费用聚合加 5 分钟双层缓存
- 交易流水 Username 筛选改 EXISTS 子查询解除对 JOIN 别名的依赖,COUNT 与列表拆分免背联表
- 管理后台成员列表 COUNT 免联表(筛选条件只引用主表列)
- 租户端用量日志列表/统计/导出共用筛选构造器,COUNT 与 SUM 全程剥离联表,钱包流水 COUNT 拆分
|
2026-09-18 15:24:09 +08:00 |
|
qian
|
e6293c4c7c
|
feat(model):模型计费功能改造,支持按秒计费的方式
|
2026-09-12 20:42:26 +08:00 |
|
Qian
|
1f2046d0fd
|
重构协议转换,实现更完整的转换功能 (#26)
* fix(relay):转换层路径缺失
* refactor(relay):移除coze和dify支持
* fix(relay): 流式错误传播三态返回与安全拦截分类
TryConvertStreamViaRelaykit 改为 (usage, ok, error) 三态返回,
修正上一版通过反转断言改绿的 3 个测试——原实现返回 error 走失败路径,
反转后返回 (usage, nil) 落到成功路径导致调度/熔断/结算口径全错。
- stream.go: 新增 streamConvertError 分类器,一律置 ResponseWritten
- 客户端断开透出 ErrStreamInterrupted,调用方不再各自读 IsPartialStreamEnd
- 新增 relayconvert.ErrContentBlocked 哨兵,6 处 Gemini 出站安全拦截 wrap
- response.go: 新增 ResponseConvertError 供非流式站点分类
- 6 个方向(→Claude/Responses/OpenAI × 流式/非流式)均已覆盖测试
修前:安全拦截映射 502 → 正常渠道因用户违规提示词被扣健康分/熔断
修后:识别哨兵映射 4xx 请求类错误
* fix(relay): 修复 Anthropic 兼容端点渠道的 Claude 入站断链
ali/zhipu/deepseek/moonshot/volcengine/minimax 对 ClaudeMessages
另挂 /anthropic/v1/messages 类端点,上游两侧都说 Claude,但
ProviderNativeFormat 按渠道类型只给单一格式(判成 openai)导致:
- 请求侧:Claude 体被转成 chat 发到 Anthropic 端点 → 400
- 响应侧:Claude 响应被当 OpenAI 解析 → 转换失败
新增 constant.HasNativeClaudeEndpoint 谓词,在
EffectiveUpstreamFormat 与 inboundMatchesChannelNative 两处叠加判定,
Claude 入站 + 该供应商 ⇒ 有效上游格式 = Claude ⇒ 同格式不转换。
登记判据:GetRequestURL 对 ClaudeMessages 返回与 chat 不同的地址。
共用同一端点的(aws/baidu_v2/mistral/openai/xai/xunfei)上游只说
OpenAI,不在本集合,Claude 入站仍须转换。
* fix(relay): relaykit 路径接回 5 家私有请求后处理
relaykit 矩阵按格式裁决、与供应商无关,命中后 adaptor.ConvertRequest
整个不再被调用。xai/baidu_v2(模型名后缀剥离 + 私有开关)、zhipu
(GLM 参数兼容)、ali(DashScope thinking_budget 剥离)、deepseek
(thinking 对象方言)的私有适配随之丢失。
最实际的是模型名:未配映射时 UpstreamModel = row.ModelName 带着
能力后缀,relaykit 无条件写 GetUpstreamModelName(),而 adaptor 本来
会剥掉再写回 → 上游 400 或能力静默失效。
新增可选能力接口 RequestPostProcessor,handler.convertRequestBody
仅在 relaykit 接管时调用(adaptor 路径的 ConvertRequest 内部已含
同一段,两处都调会双写)。5 家各把尾段抽成 postProcessRequest 与钩子
共用。新增接口断言与功能测试。
* docs(relaykit): 更新工作状态与回归记录
- §5.1/§5.2 已完成,新增 §3.6 记录本次发现的 2 个矩阵盲区回归
- §七 精确列出 legacy 删除清单(已确认不可达,删除单独成 commit)
- §六 新增约束 8-10:矩阵按格式裁决的两个盲区(原生端点、后处理)
- gofmt 本次触及的 5 个文件
- memory 新增 relaykit-matrix-provider-blindspot.md 根因记录
* refactor(relay): 删除被 relaykit 取代的 legacy 协议转换代码
净删约 6400 行。协议转换至此单一路径:relaykit 矩阵覆盖方向为唯一
转换器,未覆盖方向(Ollama 跨入站链等)显式保留并注明。
- 删 claude/gemini converter.go 整文件(o2c/o2g 请求侧双实现)
- 删 openai/converter.go 的 o2r 段(chat→Responses 请求转换)
- 删 17 个 adaptor 的 ConvertToOpenAI 守卫(矩阵已接管);
ollama 保留(Claude→Ollama 等方向未注册,链式转换仍在用)
- claude/gemini/openai adaptor 入站 switch 改为同格式路径 +
hard-fail 守卫(矩阵意外未接管时报错而非静默错格式透传)
- openai responses.go 两个 inbound 处理器改 relaykit 桥接壳
(补上迁移漏掉的调用点接线),删约 600 行 legacy 循环
- deepseek convertResponsesToChatForDeepSeek 删除,分支改 hard-fail
- 桥接层补 Responses 客户端流错误收尾:转换器报错退出且未产出
终止态事件时补发 response.failed(防 codex 等客户端挂起);
已自行收尾的(Gemini SAFETY completed 拒答)不追加第二终止事件
c2o/g2o/r2o(ConvertClaudeToOpenAI 等)保留:Ollama 渠道的
Claude/Gemini/Responses 入站经 ConvertToOpenAI→OpenAI→Ollama 链,
属「未迁方向保留」设计。
测试:新增删除项的替代断言(hard-fail 守卫、PostProcess 钩子、
response.failed 收尾);删测已删函数的用例。全仓 build/vet 通过,
relaykit 全绿,relay 侧仅剩 helper 既有失败。
* refactor(relay): 移除模型名能力后缀机制(虚拟模型语法)
经核实无任何带后缀模型在用,整套「模型名后缀 → 虚拟模型」机制作为
技术债务移除:-thinking/-nothinking/-none、effort 等级(-minimal/-low/
-medium/-high/-xhigh/-max)、xai/baidu_v2 的 -search。思考/搜索能力
此后一律由客户端请求参数表达(thinking 对象、reasoning_effort、
reasoning.effort),网关只做协议转换不做能力注入。
宿主侧:
- 删 helper/thinking.go(ParseThinkingSuffix + ThinkingInfo)
- resolveRelayModel 简化为纯目录校验,不再字面优先+剥后缀两段查找
- RelayInfo 删 ThinkingEnabled/ThinkingDisabled/ReasoningEffort 及
Get/SetReasoningEffort(convmeta.Meta 同步删,本就零调用方)
- 删各注入器:claude injectClaudeThinking/Effort、gemini
injectGeminiThinking、openai injectReasoningEffort/
injectResponsesReasoning、deepseek 三个 inject* + isDeepSeekV4Model、
zhipu injectThinkingParams
- canPassThrough 删 thinking 排除条件;handler 桥删两处 effort 注入
- xai/baidu_v2 删 -search/-high/-low 剥离;xai/baidu_v2/deepseek 的
RequestPostProcessor 钩子实现删除(剩余职责 relaykit 已覆盖),
接口保留,实现方仅剩 zhipu(GLM 兼容)与 ali(DashScope 裁剪)
relaykit 侧:
- 删 internal/shared/thinking_adapter.go 与 reasoning/ 包
- convmeta.Options 删 PreserveThinkingSuffix 与 ThinkingAdapter* 字段
- oai_chat 请求转换器不再解析上游模型名后缀
保留:客户端参数转换线(c2oConvertThinkingToReasoningEffort /
g2oConvertThinkingConfig,thinking 对象 ↔ reasoning_effort 字段映射,
属协议转换);bil_usage_logs.reasoning_effort 列(此后恒空);
BaseModelName 字段(responses 路由记录在用)。
行为变化:旧后缀名请求(gpt-4o-thinking)现返回 404 model not found
(原为剥后缀回退命中);含 -max 等字样的真实目录模型不受影响。
全仓 build/vet 通过,relaykit 全绿,relay 侧仅剩 helper 既有失败。
* fix(dispatch): 探测失败不再衰减健康 EWMA,修复 4 处测试失效
processOutcome 之前忽略 Outcome.Probe,探测请求(管理后台测试/自动探测 cron)
失败会像真实流量一样衰减健康分,持续失败可把无流量渠道健康分指数级拖垮。
现探测失败跳过健康 EWMA 写入(探测成功仍照常记录),熔断窗口计数不受影响。
顺带修复 3 处与实现漂移的过期测试:
- admin 角色迁移文件路径引用了已重命名的迁移脚本
- billing 账单摘要在无逐项 token 明细时漏了小计×倍率行(同时同步了乘数标签改名)
- relay/helper 错误提示文案测试仍留着改中文前的英文期望值
* refactor(relay):补充gemini和claude协议的转换
* fix(relay):修复gemini转换问题
* fix(relay):优化工具转换
* feat(test):添加测试用例
* feat(test):添加测试用例
* feat(relay):补充转换矩阵
* feat(relay):补充协议转换测试
* fix(relay):修复vertex缺陷
* feat(relay):补充协议间的工具转换
* feat(relay):添加语料采集功能
* fix(relay):修复claude输出协议转换问题
* fix(relay):修复codex请求claude模型无法使用搜索工具问题
* fix(relay):修复codex请求gemini模型无法使用搜索工具问题
* refactor(relay):修改真实语料处理逻辑,将真实响应数据移出仓库
* fix(relay):补充手写测试数据集
|
2026-09-12 16:08:05 +08:00 |
|
martin
|
a6ed67d841
|
fix: 完成 P3 细节优化项
依据《代码分析结果.md》P3 章节,逐条修复 20 项细节问题:
正确性修复:
- P3-1 锁定剩余分钟改用 math.Ceil,避免「0.9 分钟」显示为「0 分钟」
- P3-12 移除 CheckAndUpgradeLevel 中恒真的 hasUpdate 标志
- P3-14 移除 CheckTrialExpiry 中恒真表达式(count > 0 || true)调试残留,改用 RowsAffected
- P3-2 成员不存在统一返回 NewNotFoundError(404),与其它方法语义一致
安全加固:
- P3-6 X-Request-Id 加格式校验 ^[A-Za-z0-9-]{1,64}$,防日志注入
- P3-7 新增公共 EscapeLikePattern,转义 admin LIKE 搜索的 %/_ 通配符
- P3-8 Encrypt 输出加 v1: 版本前缀,Decrypt 兼容无前缀历史密文
- P3-9 turnstile 响应体读取加 64KB 上限,防内存耗尽
- P3-11 backup codes 熵由 48-bit 提升到 64-bit
- P3-15 recordAudit 对 multipart/二进制体跳过 Unmarshal 与原文落库
- P3-17 错误日志按 Content-Type 跳过 multipart/二进制体读取
- P3-16 HandleRealtime 加 panic recover 与连接生命周期日志
可维护性/一致性:
- P3-3 oauth.go 时间格式统一为 time.RFC3339
- P3-5 MsgSuccess 统一为 ok,response.go 改用常量引用
- P3-4 错误码分段策略加注释,说明空洞与跳跃的成因
- P3-13 ModelMultiplier 占位语义加注释(计费公式设计位 + 快照列)
- P3-19 抽取 registerCronJobs,主启动流程清爽
重构:
- P3-18 删除死代码 BuildBillingSummary/SummaryParams(仅测试引用),保留共用 helper
- P3-20 抽取 relay.InvalidateMemberModelScopeCache 单一失效入口,
消除三处 member_model 前缀字面量重复(原为有意跨包失效,原建议改名会破坏)
经核实保留 + 文档化:
- P3-10 TOTP 暂保留 SHA-1:totp.Validate 硬编码 SHA-1 且存储不保存算法元信息,
直接切 SHA-256 会导致校验恒失败,需配合 schema 改动,超出 P3 范围
|
2026-07-26 12:16:33 +08:00 |
|
 Qianandchengqian
|
be9e707bfd
|
修复异步图片导致的多个问题 (#12)
* fix:修复响应污染问题
* fix:修改存储相关文件为中文注释
* fix:修复二次退款问题
* fix:修复多个考虑不全面问题
1.误删用户数据
2.R2存储默认区域
3.删除失败导致孤儿记录
4.网络抖动事变时重试
5.前端无限次请求获取图片
6.文件管理权限
* fix:修复字符串截断异常问题和文件下载超时问题
* fix:修复多图问题
* fix:异步生成图片时未配置oss提示错误信息
* fix:修复关闭异步后同步生成出错问题
* feat:新增文件存储测试功能,防止设置后不生效
* fix:修复同步图片转异步后计费错误
* fix:修复无下限扣款问题
* fix:修复结算重复扣款问题
* fix:修复计费出错导致的0费用结算
* fix:修复回调双重履约
* fix:修复预扣事务
* fix:修复费用字段类型问题
* fix:修复缓存问题
* fix:修复安全问题
* fix:修复数据库操作事务问题
* refactor:重构事务使用方式,改为官方推荐的dao形式
* fix:修复余额更新隐患
* fix:修复N+1查询问题
* fix:修复密钥安全问题
* fix:结算失败时打印错误日志
* improve:优化扣款
* fix:修复用户接口越权
---------
Co-authored-by: chengqian <wuchengqian@kkidc.com>
|
2026-07-22 17:53:18 +08:00 |
|
chengqian
|
f3b4be9b2a
|
feat(test):新增单元测试
|
2026-06-04 11:36:03 +08:00 |
|
qian
|
a59b8850f0
|
fi:中间件和数据库
|
2026-06-03 15:34:38 +08:00 |
|
chengqian
|
5dc4a18191
|
refactor(export): 统一导出方法
|
2026-05-26 13:32:51 +08:00 |
|
qian
|
3405280224
|
后端功能首次提交
|
2026-05-10 12:21:27 +08:00 |
|