313 Commits

Author SHA1 Message Date
f99d508491 fix(deps): setup.cfg补pyyaml依赖声明——pricing.py import yaml但install_requires漏声明,新环境pip install后accounting worker崩ModuleNotFoundError(生产doit 2026-09-14实录) 2026-09-14 12:56:14 +08:00
bf20df572f feat(pricing): peak_times 声明式忙闲时定价——fields 里 peak_times 时段串+引擎计算 is_peak 布尔字段,pricings 用 is_peak:true/false 作定价要素
- _in_peak_times(): 逗号分隔时段串解析(=~/~=/=~=/~ 四种边界语义,浮点小时比较)
- hour 缺失(老流水/上游未注入)按非忙时兜底,不炸计费;时段串解析失败记日志走闲时
- beautify_filter_value: bool → 是/否(展示层忙时=是/否)
- 试算15例全过(忙闲窗口边界/缓存命中/factor=0/hour缺失),含服务进程端到端
2026-09-10 23:43:57 +08:00
1985f442d7 fix(display): get_pricing_display 档位定价展开+机制键不泄漏+区间值美化
三个展示层缺陷一次根治(计费引擎 get_pricing_from_ymalstr 独立路径零触碰):

1. 机制键泄漏:filters 列表中带 unit_prices 的价格档位(tier)被当扁平 filter
   提取,value_mode/单位定价混进 filter_labels→商店表格把它们当表头显示。
   现在 tier 不再进 item 级 filters,机制键显式排除。

2. 档位价丢失(词匹配误杀):旧 tiered 提取按「not k.endswith('_tokens')」
   剥维度键——prompt_tokens 既是真维度又以 _tokens 结尾被误杀,MiniMax-M3/
   qwen3.7-flash 分档价整条丢失只剩顶层兜底价(2.1 从未展示过)。
   词匹配不当裁决者的又一实例。现在每个档位展开为独立 item(条件+价各成一行),
   tiered 嵌套结构删除(全仓 grep 实证无消费方);顶层兜底价不展示
   (避免与某档同价的无条件行让客户困惑)。

3. 区间原始语法不可读:'0 =~= 512000'/'8 =~ 22' 直接透给客户。
   新增 beautify_filter_value(纯展示):between→数学区间记号,括号语义与
   check_value 一一对应(=~→[lo,hi) ~=→(lo,hi] =~=→[lo,hi] ~→(lo,hi)),
   in→'a / b / c',数字原样不换算。filter_labels 存美化值,filters 存原始值。

实测(离线+测试机数据形态):MiniMax-M3 六档全出含丢失的 2.1 ✓、
deepseek 忙闲时 [8,22)/[22,24)/[0,8) ✓、qwen-image-3.0-pro 平铺维度回归不变 ✓、
model 过滤回退兼容 ✓(llmage/sage/storage/account 消费方结构兼容)
2026-09-09 13:34:18 +08:00
38390ae01f fix(pricing): get_pricing_display 缓存命中崩——get_ppid_pricing 返回 dict 时 r.pricing_data 抛 AttributeError
根因:get_ppid_pricing 走 Redis 缓存命中返回 dict(JSON 反序列化),未命中返回
DictObject(sqlor 行对象)。get_pricing_display 里 r.pricing_data 在 try 块外用
属性访问,缓存命中即抛 AttributeError → 展示价间歇性返回'定价数据为空'。
buffered_charging 早做了 hasattr 兼容,get_pricing_display 漏了同款处理。
修复:hasattr(r,'pricing_data')/isinstance dict/r['pricing_data'] 三路兼容。
2026-09-06 17:21:06 +08:00
ymq
b193b402ee fix(buffered_charging): 兼容 get_ppid_pricing 缓存返回的 dict
get_ppid_pricing 第一次返回 DictObject(sqlor 行对象),经 cache_set 序列化到 Redis 后,
缓存命中时 cache_get 返回 dict(JSON 反序列化)。buffered_charging 原用 r.pricing_data
属性访问,缓存命中时崩 'dict' object has no attribute 'pricing_data'。
影响:任何走 buffered_charging 的计费(calculate_product_cost 等)第二次调用必崩。
改为兼容 hasattr/dict/下标三种访问。
2026-08-26 15:50:41 +08:00
354e2aabf7 fix: add missing cache_get import at module level 2026-07-29 18:01:17 +08:00
022ceacc7f fix: remove await from sync hot_reload handler 2026-07-29 17:30:41 +08:00
3483d16c58 refactor: migrate pricing_data to share_cache Redis 2026-07-29 17:16:25 +08:00
e3909fef53 fix: get_pricing_display移除第一行标题,让定价项自然上提 2026-07-20 19:46:55 +08:00
270f95d2cf fix: kimi cached_tokens 在 usage 根级别,修正 derived 表达式 2026-07-17 17:28:00 +08:00
f734ed8240 feat: kimi-k3 模型定价 SQL(缓存命中¥2/未命中¥20/输出¥100 每百万token) 2026-07-17 17:09:54 +08:00
246347ecbf fix: 注册 get_search_providerid.dspy 到 RBAC,修复定价项目供应商下拉无选项 2026-07-15 15:42:38 +08:00
cea95f98ec fix: add_pricing_program_timing 补充 sor.C() 插入新记录 2026-07-14 17:58:43 +08:00
25457aff6d fix: add_pricing_program_timing.dspy 补充 sor 上下文创建 2026-07-14 17:45:09 +08:00
722de7ea8c fix: pricing init.py 补充 add_pricing_program_timing 的 import 和注册 2026-07-14 17:42:20 +08:00
cdcda374b2 fix: model codes table supplychain.suppliers -> suppliers to avoid get_code.dspy SQL error 2026-07-10 10:55:01 +08:00
f775d5a751 fix: use get_sor_context(rbac) to query suppliers in sage db 2026-07-10 09:26:22 +08:00
3e7d0aada5 fix: providerid 下拉从 suppliers 表获取(新增 get_search_providerid.dspy + CRUD alters) 2026-07-10 09:21:36 +08:00
3c7081591b refactor: providerid codes → supplychain.suppliers 2026-07-09 13:39:09 +08:00
d0e92e4b9b fix: replace hardcoded '元' in unit_label with correct currency symbol 2026-07-08 15:40:56 +08:00
6f0b501a95 fix: show currency in pricing display — query currency from pricing_program 2026-07-08 15:35:29 +08:00
9e4d1f85e8 fix: pricing_program search — remove logined_userorgid filter + providerid LIKE 2026-07-08 14:20:35 +08:00
a33837d33f revert: 移除between自动检测,改为在定价数据fields中添加prompt_tokens/completion_tokens定义 2026-07-07 16:12:49 +08:00
485ecf343e fix: 移除inline DictObject import避免local variable错误 2026-07-07 15:58:27 +08:00
2b8f057096 fix: fields未定义时自动检测between操作符,避免范围检查被跳过 2026-07-07 15:54:07 +08:00
343a346aaf feat: pricing_program add currency field (provider settlement currency) 2026-07-07 15:43:02 +08:00
ea3d67c496 fix: filters dict格式两处都兼容,避免第二处iter string报错 2026-07-07 15:17:25 +08:00
7029f858f9 fix: filters兼容dict格式(非list),避免iter string时.get()报AttributeError 2026-07-07 15:07:50 +08:00
a7d88309b8 fix: model过滤支持model_mappings映射,含mappings的单模型ppid也能正确过滤 2026-07-06 18:06:02 +08:00
d7d02ccb6b fix: model过滤后为空时退回到不过滤,避免单模型ppid定价变空 2026-07-06 17:50:31 +08:00
2fcd33cdba feat: get_pricing_display supports optional model filter
- Add model parameter to filter displayed pricing items to a single model
- DSPY endpoint accepts ?model=xxx param
- Backward compatible: omitting model returns all items
2026-07-06 15:03:06 +08:00
64a93049f0 fix: load_path.py补全pricing_program_list+新API路径; 简化脚本 2026-07-05 14:06:34 +08:00
7d41fd2aba docs: 更新pricing_spec文档注释为pricing_data 2026-07-05 13:52:54 +08:00
ecb4c770c4 feat: 删除pricing_spec/discount字段; 新增timing拉链逻辑(expired_date自动管理) 2026-07-05 13:51:43 +08:00
5138ec338d fix: 恢复CRUD默认路径,移除不存在的自定义API端点 2026-07-03 16:13:22 +08:00
00b901ebfa bugfix 2026-06-26 14:29:46 +08:00
568d697dd4 bugfix 2026-06-26 14:28:11 +08:00
eeaebac588 fix: pricing_program_timing.json+editable配置修复build.sh错误 2026-06-26 11:05:44 +08:00
d246d2a5ac feat: add pricing_data view tool to pricing_program_timing list
- Hide pricing_data (YAML text) from list columns
- Add '定价数据' tool button to toolbar
- Open PopupWindow showing pricing_data content via pricing_data_display.ui
- Register new path in load_path.py
2026-06-26 10:56:41 +08:00
1610c0635f fix: 上传定价数据窗口标题改为定价名称 2026-06-25 13:54:01 +08:00
1ae6bcba35 revert: pricing_test.ui 恢复到修改前状态(验证定价功能不需要) 2026-06-25 13:48:14 +08:00
b7650b79a7 fix: pricing_test.ui field name 缺闭合引号 2026-06-25 13:42:28 +08:00
6070116d38 fix: pricing_test.ui Jinja2 None→none 2026-06-25 13:38:11 +08:00
7a8f46e10b fix: 上传定价数据和验证定价弹窗取消按钮关闭窗口(dismiss_events) 2026-06-25 13:31:05 +08:00
Hermes Agent
ea7db0d51c fix: json添加editable字段修复build.sh报错 2026-06-24 17:47:07 +08:00
Hermes Agent
b84f8e406b fix: test_pricing 直接从DB获取原始YAML避免DictObject序列化失败 2026-06-24 08:53:23 +08:00
Hermes Agent
810cd4549b fix: 修复定价项目时序验证定价500错误 + 移除过时的pricing_item子表引用
- init.py: 注册 get_pricing_program_timeing 到 env(pricing_test.ui模板依赖此函数)
- pricing_test.ui: 修复拼写错误 amoumt → "amount"(生成无效JSON导致500)
- json/pricing_program_timing.json: 移除指向已删除的pricing_item CRUD的subtables配置
2026-06-23 23:59:13 +08:00
Hermes Agent
30766b6c88 Revert "fix: skip_keys添加value_mode,防止定价项顶层value_mode被误当字段检查导致匹配失败"
This reverts commit 3a9e30313b41adf8f23a04bd7b1a0fe82256c2e4.
2026-06-23 17:04:13 +08:00
Hermes Agent
b2521678ad Revert "fix: non-field keys in pricing items skip instead of raise - aligns top-level loop (line 618) with filters loop (line 653) behavior - value_mode and other control params at filter level no longer cause 'fields中没有定义' error"
This reverts commit 6df2569c8ed9615c488d565fffa30883e819dce6.
2026-06-23 17:04:13 +08:00
Hermes Agent
03a0bea51f Revert "fix: value_mode read from field definition, not filter_item - removed item_value_mode from filters loops (2 places) - check_value(f, fv, dv) now falls back to f.value_mode per field - fixes: filter-level value_mode:between was applied to ALL fields including model (string), causing between parse error on model name"
This reverts commit 1e65451da4e97d77dc072113e2d1aab06fda80c0.
2026-06-23 17:04:13 +08:00