diff --git a/frontend/app.py b/frontend/app.py
index af9d5b2..ed9c5a6 100644
--- a/frontend/app.py
+++ b/frontend/app.py
@@ -855,58 +855,65 @@ with tab2:
)
if review_btn:
+ rev_status_text = st.empty()
+ rev_status_text.info(f"⚙️ [AI Reviewer #2] 正在向阿里通义 Qwen ({selected_model}) 建立对抗性审查通道...")
+ with st.container():
+ critic_console = st.empty()
+ full_rev_text = f"[System Log]: 正在向 Reviewer #2 提交假说并建立对抗性审查通道 (通过门槛: {pass_threshold}分)...\n[System Log]: 待审查假说 ID: [{st.session_state.current_hypo.get('id', 'H1')}]\n\n[Reviewer #2 Stream Output]: "
+ critic_console.markdown(f'
🔍 [Reviewer #2 Channel]: 阿里通义 Qwen ({selected_model}) 正在进行 5 维对抗性审查...
{full_rev_text}
', unsafe_allow_html=True)
- if hasattr(critic_skill, 'review_stream'):
- try:
- rev_stream = critic_skill.review_stream(st.session_state.current_hypo, problem, pass_threshold=pass_threshold)
- except TypeError:
- rev_stream = critic_skill.review_stream(st.session_state.current_hypo, problem)
- else:
- try:
- rev_res = critic_skill.review(st.session_state.current_hypo, problem, pass_threshold=pass_threshold)
- except TypeError:
- rev_res = critic_skill.review(st.session_state.current_hypo, problem)
- rev_stream = [json.dumps(rev_res, ensure_ascii=False, indent=2)]
-
- raw_rev_accumulated = ""
- for token_chunk in rev_stream:
- raw_rev_accumulated += token_chunk
- for char in token_chunk:
- full_rev_text += char
- if len(full_rev_text) % 2 == 0:
- critic_console.markdown(f'{full_rev_text}▋
', unsafe_allow_html=True)
- time.sleep(0.003)
-
- # 健壮解析 5 维结构化判定
- parsed_rev = parse_json_robust(raw_rev_accumulated)
- if not isinstance(parsed_rev, dict) or "scores" not in parsed_rev:
- try:
- parsed_rev = critic_skill.review(st.session_state.current_hypo, problem, pass_threshold=pass_threshold)
- except TypeError:
- parsed_rev = critic_skill.review(st.session_state.current_hypo, problem)
- except Exception:
- pass
+ if hasattr(critic_skill, 'review_stream'):
+ try:
+ rev_stream = critic_skill.review_stream(st.session_state.current_hypo, problem, pass_threshold=pass_threshold)
+ except TypeError:
+ rev_stream = critic_skill.review_stream(st.session_state.current_hypo, problem)
+ else:
+ try:
+ rev_res = critic_skill.review(st.session_state.current_hypo, problem, pass_threshold=pass_threshold)
+ except TypeError:
+ rev_res = critic_skill.review(st.session_state.current_hypo, problem)
+ rev_stream = [json.dumps(rev_res, ensure_ascii=False, indent=2)]
+
+ raw_rev_accumulated = ""
+ for token_chunk in rev_stream:
+ raw_rev_accumulated += token_chunk
+ for char in token_chunk:
+ full_rev_text += char
+ if len(full_rev_text) % 2 == 0:
+ critic_console.markdown(f'🔍 [Reviewer #2 Channel]: 阿里通义 Qwen ({selected_model}) 实时输出审查意见...
{full_rev_text}
', unsafe_allow_html=True)
+ time.sleep(0.003)
+
+ # 健壮解析 5 维结构化判定
+ parsed_rev = parse_json_robust(raw_rev_accumulated)
+ if not isinstance(parsed_rev, dict) or "scores" not in parsed_rev:
+ try:
+ parsed_rev = critic_skill.review(st.session_state.current_hypo, problem, pass_threshold=pass_threshold)
+ except TypeError:
+ parsed_rev = critic_skill.review(st.session_state.current_hypo, problem)
+ except Exception:
+ pass
- if not isinstance(parsed_rev, dict):
- parsed_rev = {}
- if "scores" not in parsed_rev:
- parsed_rev["scores"] = {"logical_consistency": 8, "literature_grounding": 9, "falsifiability": 9, "novelty": 8, "feasibility": 9}
- if "total_score" not in parsed_rev:
- parsed_rev["total_score"] = sum(parsed_rev["scores"].values())
- if "decision" not in parsed_rev:
- parsed_rev["decision"] = "ACCEPT" if parsed_rev["total_score"] >= pass_threshold else ("REVISE" if parsed_rev["total_score"] >= pass_threshold - 10 else "REJECT")
- if "detailed_comments" not in parsed_rev:
- parsed_rev["detailed_comments"] = "审查判定完毕,假说具备良好的理论深度与可证伪性。"
+ if not isinstance(parsed_rev, dict):
+ parsed_rev = {}
+ if "scores" not in parsed_rev:
+ parsed_rev["scores"] = {"logical_consistency": 8, "literature_grounding": 9, "falsifiability": 9, "novelty": 8, "feasibility": 9}
+ if "total_score" not in parsed_rev:
+ parsed_rev["total_score"] = sum(parsed_rev["scores"].values())
+ if "decision" not in parsed_rev:
+ parsed_rev["decision"] = "ACCEPT" if parsed_rev["total_score"] >= pass_threshold else ("REVISE" if parsed_rev["total_score"] >= pass_threshold - 10 else "REJECT")
+ if "detailed_comments" not in parsed_rev:
+ parsed_rev["detailed_comments"] = "审查判定完毕,假说具备良好的理论深度与可证伪性。"
- full_rev_text += f"\n\n[System Log]: 审查判定解析成功!综合得分: {parsed_rev.get('total_score')}/50, 裁决结果: {parsed_rev.get('decision')}。"
- critic_console.markdown(f'{full_rev_text}
', unsafe_allow_html=True)
-
- # 持久化审查日志
- st.session_state.review_console_log = full_rev_text
- st.session_state.review_result = parsed_rev
+ full_rev_text += f"\n\n[System Log]: 审查判定解析成功!综合得分: {parsed_rev.get('total_score')}/50, 裁决结果: {parsed_rev.get('decision')}。"
+ critic_console.markdown(f'{full_rev_text}
', unsafe_allow_html=True)
+
+ # 持久化审查日志
+ st.session_state.review_console_log = full_rev_text
+ st.session_state.review_result = parsed_rev
- st.session_state.current_state = "3_reviewed"
- st.rerun()
+ rev_status_text.success("🎉 Reviewer #2 对抗性审查完毕!")
+ st.session_state.current_state = "3_reviewed"
+ st.rerun()
# 常驻展示审查的控制台日志 (如果存在)
if st.session_state.review_console_log: