解析额外的模型参数 Args: params_str: 支持以下两种形式之一: 1) JSON 字符串(推荐):例如 '{"temperature":0.7,"max_tokens":2048}' 或嵌套结构 2) 以 '@' 开头的文件路径:例如 '@/path/to/params.json'(文件内容为 JSON) 同时保留对旧格式 "k:v,k2:v2" 的兼容作为回退解析。 Returns: 解析后的参数字典
(params_str: str)
| 95 | |
| 96 | |
| 97 | def parse_extra_params(params_str: str) -> Dict[str, any]: |
| 98 | """ |
| 99 | 解析额外的模型参数 |
| 100 | |
| 101 | Args: |
| 102 | params_str: 支持以下两种形式之一: |
| 103 | 1) JSON 字符串(推荐):例如 '{"temperature":0.7,"max_tokens":2048}' 或嵌套结构 |
| 104 | 2) 以 '@' 开头的文件路径:例如 '@/path/to/params.json'(文件内容为 JSON) |
| 105 | 同时保留对旧格式 "k:v,k2:v2" 的兼容作为回退解析。 |
| 106 | |
| 107 | Returns: |
| 108 | 解析后的参数字典 |
| 109 | """ |
| 110 | if not params_str: |
| 111 | return {} |
| 112 | |
| 113 | text = params_str.strip() |
| 114 | |
| 115 | # 情况 1:@文件 路径(文件内容为 JSON) |
| 116 | if text.startswith('@'): |
| 117 | file_path = text[1:] |
| 118 | if not os.path.exists(file_path): |
| 119 | raise FileNotFoundError(f"参数文件不存在: {file_path}") |
| 120 | with open(file_path, 'r', encoding='utf-8') as f: |
| 121 | content = f.read() |
| 122 | try: |
| 123 | loaded = json.loads(content) |
| 124 | except json.JSONDecodeError as e: |
| 125 | raise ValueError(f"参数文件 JSON 解析失败: {e}") |
| 126 | if not isinstance(loaded, dict): |
| 127 | raise ValueError("参数文件的 JSON 根类型必须为对象(dict)") |
| 128 | return loaded |
| 129 | |
| 130 | # 情况 2:直接作为 JSON 字符串 |
| 131 | try: |
| 132 | loaded = json.loads(text) |
| 133 | if isinstance(loaded, dict): |
| 134 | return loaded |
| 135 | else: |
| 136 | raise ValueError("JSON 根类型必须为对象(dict)") |
| 137 | except json.JSONDecodeError: |
| 138 | # 继续尝试回退到旧格式解析 |
| 139 | try: |
| 140 | loaded = ast.literal_eval(text) |
| 141 | if isinstance(loaded, dict): |
| 142 | return loaded |
| 143 | except Exception: |
| 144 | print(f"Depreciated Warning: {text} 额外参数未能解析为 JSON 格式,将使用旧格式解析。请优先考虑使用 JSON 格式传递参数。") |
| 145 | |
| 146 | # 回退:旧格式 "k:v,k2:v2"(保持向后兼容) |
| 147 | params: Dict[str, Any] = {} |
| 148 | for param in text.split(','): |
| 149 | if ':' not in param: |
| 150 | continue |
| 151 | key, value = param.split(':', 1) |
| 152 | key = key.strip() |
| 153 | value = value.strip() |
| 154 |