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