fix: use DictObject for config_data to support dot notation in derived fields

This commit is contained in:
yumoqing 2026-06-05 16:07:35 +08:00
parent 022bab8314
commit 2706815dee

View File

@ -537,7 +537,8 @@ order by b.enabled_date desc"""
e = Exception(f'config_data is None, {yamlstr=}')
exception(f'{e=}')
raise e
config_data = config_data.copy()
# 用 DictObject 包装,支持 dot notation 属性访问derived 表达式依赖此特性)
config_data = DictObject(**config_data)
d = None
try:
d = yaml.safe_load(yamlstr)
@ -553,6 +554,7 @@ order by b.enabled_date desc"""
raise Exception(f'定价定义中没有pricing数据')
# 处理 derived 字段:从原始 usage 数据计算衍生字段
# DictObject 支持属性访问嵌套字段,如 prompt_tokens_details.cached_tokens
for field_name, field_def in d.fields.items():
if not isinstance(field_def, dict):
continue
@ -560,20 +562,14 @@ order by b.enabled_date desc"""
if not derived_expr:
continue
# 构建 eval 环境:将 config_data 中的所有字段和嵌套字段展平
# dot notation 转为下划线 keyPython eval 不支持带 dot 的变量名)
eval_env = {}
for k, v in config_data.items():
eval_env[k] = v
if isinstance(v, dict):
for sub_k, sub_v in v.items():
eval_env[f'{k}_{sub_k}'] = sub_v
# 将表达式中的 dot 替换为下划线
processed_expr = derived_expr.replace('.', '_')
# eval 环境:用 config_data 本身DictObject 支持 dot notation 属性访问)
eval_env = dict(config_data)
# 将顶层 key 也注入 eval 环境,使 eval 能找到嵌套属性
for k in list(config_data.keys()):
eval_env[k] = config_data[k]
try:
result = eval(processed_expr, {}, eval_env)
result = eval(derived_expr, {}, eval_env)
config_data[field_name] = result
debug(f'derived field {field_name} = {derived_expr} = {result}')
except Exception as e: