@@ -545,7 +545,13 @@ def _validate_http_options(cls, value: Any) -> None:
545545 found : list [str ] = []
546546
547547 def normalized_key (key : Any ) -> str :
548- return "" .join (char for char in safe_repr (key ).lower () if char .isalnum ())
548+ # 字符串直接规范化:``safe_repr`` 对字符串加引号、并在 80 字符处
549+ # 截断成 ``'xxx...'``,超长键名的后缀(``...apikey``/``...secret``)
550+ # 会被截掉,``is_sensitive_key`` 的 ``endswith`` 判据随即失配——
551+ # 一个长键名的凭证键就会被放行(实测复现)。非字符串才走
552+ # ``safe_repr``(不崩)。
553+ text = key if isinstance (key , str ) else safe_repr (key )
554+ return "" .join (char for char in text .lower () if char .isalnum ())
549555
550556 def is_sensitive_key (key : Any ) -> bool :
551557 normalized = normalized_key (key )
@@ -1859,14 +1865,21 @@ def function_response_value(value: Any) -> Any:
18591865 else :
18601866 raise ValueError (f"Google 不支持的消息内容块类型: { part_type !r} 。" )
18611867 else :
1862- # 标量 content 的渲染走 ``safe_repr`` 而不是裸 ``str()``:
1863- # ``normalize_messages`` 只校验 ``messages`` 是「对象序列」,不校验
1864- # content 的形态(实测 ``{"role": "user", "content": 10**4301}``
1865- # 原样通过),因此这里是标量 content 的唯一收口。``str(10**4301)``
1866- # 抛 ``ValueError: Exceeds the limit``——类型对、内容却与「消息
1867- # 内容写错了」无关。判据与同文件的 ``_normalize_finish_reason`` 一致
1868- # (非字符串走 ``safe_repr``)。
1869- parts = [types .Part (text = safe_repr (raw_content ))]
1868+ # 字符串 content 原样透传;其余标量 content 的渲染走 ``safe_repr``
1869+ # 而不是裸 ``str()``:``normalize_messages`` 只校验 ``messages``
1870+ # 是「对象序列」,不校验 content 的形态(实测
1871+ # ``{"role": "user", "content": 10**4301}`` 原样通过),因此这里
1872+ # 是标量 content 的唯一收口。``str(10**4301)`` 抛
1873+ # ``ValueError: Exceeds the limit``——类型对、内容却与「消息
1874+ # 内容写错了」无关。字符串**必须**排除在 ``safe_repr`` 之外:
1875+ # 后者会加引号并在 80 字符处截断,把普通长文本消息改写成
1876+ # ``'前 77 字...'`` 发给模型。非字符串的兜底判据与同文件的
1877+ # ``_normalize_finish_reason`` 一致。
1878+ parts = [
1879+ types .Part (
1880+ text = raw_content if isinstance (raw_content , str ) else safe_repr (raw_content )
1881+ )
1882+ ]
18701883 for index , call in enumerate (message .get ("tool_calls" , []) or []):
18711884 if not isinstance (call , Mapping ):
18721885 raise ValueError (f"Google assistant tool_calls[{ index } ] 必须是对象。" )
0 commit comments