binary-husky/gpt_academic · error · RuntimeError
意外Json结构:{delta}
Error message
意外Json结构:{delta} What it means
RuntimeError('意外Json结构:'+delta) raised when a stream delta from bridge_openrouter is neither the has_content nor the has_role shape - i.e. decode_chunk found a valid choices[0].delta dict, but it contains unexpected keys only (no 'content', no 'role'). This is the bridge's guard against non-standard OpenAI-compatible providers that inject extra fields or change the delta schema.
Source
Thrown at request_llms/bridge_openrouter.py:200
if ('data: [DONE]' in chunk_decoded): break # api2d 正常完成
# 提前读取一些信息 (用于判断异常)
json_data = chunkjson['choices'][0]
delta = json_data["delta"]
if len(delta) == 0: break
if (not has_content) and has_role: continue
if (not has_content) and (not has_role): continue # raise RuntimeError("发现不标准的第三方接口:"+delta)
if has_content: # has_role = True/False
result += delta["content"]
if not console_silence: print(delta["content"], end='')
if observe_window is not None:
# 观测窗,把已经获取的数据显示出去
if len(observe_window) >= 1:
observe_window[0] += delta["content"]
# 看门狗,如果超过期限没有喂狗,则终止
if len(observe_window) >= 2:
if (time.time()-observe_window[1]) > watch_dog_patience:
raise RuntimeError("用户取消了程序。")
else: raise RuntimeError("意外Json结构:"+delta)
if json_data and json_data['finish_reason'] == 'content_filter':
raise RuntimeError("由于提问含不合规内容被Azure过滤。")
if json_data and json_data['finish_reason'] == 'length':
raise ConnectionAbortedError("正常结束,但显示Token不足,导致输出不完整,请削减单次输入的文本量。")
return result
def predict(inputs:str, llm_kwargs:dict, plugin_kwargs:dict, chatbot:ChatBotWithCookies,
history:list=[], system_prompt:str='', stream:bool=True, additional_fn:str=None):
"""
发送至chatGPT,流式获取输出。
用于基础的对话功能。
inputs 是本次问询的输入
top_p, temperature是chatGPT的内部调优参数
history 是之前的对话列表(注意无论是inputs还是history,内容太长了都会触发token数量溢出的错误)
chatbot 为WebUI中显示的对话列表,修改它,然后yield出去,可以直接修改对话界面内容
additional_fn代表点击的哪个按钮,按钮见functional.py
"""View on GitHub (pinned to d6bde0fa54)
Solutions
- Inspect the delta printed in the exception to see which unexpected field the provider sends
- Switch to a model/provider whose deltas only carry role/content, or extend decode_chunk to whitelist the extra field (e.g. map reasoning_content into content)
- Update the bridge to a version that tolerates extra delta keys instead of raising
- Disable function-calling / tool parameters if the provider echoes them into deltas
Example fix
# before
else: raise RuntimeError("意外Json结构:"+delta)
# after
elif 'reasoning_content' in delta:
result += delta['reasoning_content']
else:
raise RuntimeError("意外Json结构:" + str(delta)) Defensive patterns
Strategy: type-guard
Type guard
def delta_is_supported(delta: dict) -> bool:
"""True when the bridge can consume this delta shape."""
return isinstance(delta, dict) and ('content' in delta or 'role' in delta) Try / catch
try:
result = predict_no_ui_long_connection(...)
except RuntimeError as e:
if '意外Json结构' in str(e):
unsupported = e.args[0].split('意外Json结构:')[-1]
logging.warning('provider sent unsupported delta keys: %s', unsupported)
switch_to_standard_provider()
raise Prevention
- Pin providers whose deltas only carry role/content when using this bridge
- Whitelist known extra fields (reasoning_content, tool_calls) in decode_chunk instead of crashing
- Log the offending delta once and degrade gracefully for the rest of the stream
When it happens
Trigger: Provider sends delta with only fields like {'reasoning_content': ...} or {'tool_calls': ...}; third-party relay inserting custom metadata keys; new API surface (function calling, reasoning models) not handled by this older bridge.
Common situations: Routing OpenRouter to reasoning models (e.g. deepseek-r1 style) whose deltas carry reasoning fields; providers with bespoke SSE extensions; model versions adding new delta fields.
Related errors
- 无法读取以下数据,请检查配置。 {chunk_decoded}
- No image URL found in the response.
- 意外Json结构:
- 无法读取以下数据,请检查配置。 {chunk_decoded}
- Json解析不合常规
AI-assisted analysis of binary-husky/gpt_academic@d6bde0fa54 (2026-08-14).
Data as JSON: /api/errors/b6480234709c1214.
Report an issue: GitHub.