Spaces:
Build error
Build error
Update app.py
Browse filesFirst-name enforcement if the question requires it.
Finalizer logging for transcript/Wikipedia-based inference.
Wikipedia snippet preview logging in the trace.
YouTubeTranscript error detection and trace update.
PythonExec input validation to reject vague or placeholder inputs.
app.py
CHANGED
|
@@ -158,6 +158,12 @@ def tool_node(state: AgentState) -> AgentState:
|
|
| 158 |
state["observation"] = "ERROR: Invalid tool format."
|
| 159 |
return state
|
| 160 |
tool_name, argument = match.groups()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 161 |
selected_tool = tools.get(tool_name)
|
| 162 |
state["debug_trace"].append(f"[ToolNode] Tool selected: {tool_name} | Input: {argument}")
|
| 163 |
if not selected_tool:
|
|
@@ -165,11 +171,18 @@ def tool_node(state: AgentState) -> AgentState:
|
|
| 165 |
return state
|
| 166 |
query = state.get("rewritten_query") or argument.strip()
|
| 167 |
result = selected_tool.invoke(query)
|
|
|
|
|
|
|
|
|
|
| 168 |
if tool_name == "Search" and is_vague(result):
|
| 169 |
retry_query = query + " site:wikipedia.org"
|
| 170 |
result_retry = selected_tool.invoke(retry_query)
|
| 171 |
if not is_vague(result_retry):
|
| 172 |
result = result_retry
|
|
|
|
|
|
|
|
|
|
|
|
|
| 173 |
state["observation"] = result
|
| 174 |
state["history"].append((state["planner_output"], state["observation"]))
|
| 175 |
state["replan_count"] += 1
|
|
@@ -193,6 +206,25 @@ def finalizer_node(state: AgentState) -> AgentState:
|
|
| 193 |
raw_response = llm.invoke([HumanMessage(content=final_prompt)]).content.strip()
|
| 194 |
answer = raw_response.splitlines()[0].strip()
|
| 195 |
state["answer"] = answer
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 196 |
|
| 197 |
# Infer from transcript or wiki snippet if vague
|
| 198 |
if "Transcript" in history or "wikipedia.org" in history:
|
|
|
|
| 158 |
state["observation"] = "ERROR: Invalid tool format."
|
| 159 |
return state
|
| 160 |
tool_name, argument = match.groups()
|
| 161 |
+
|
| 162 |
+
if tool_name == "PythonExec" and ("attached" in argument.lower() or "code" in argument.lower()):
|
| 163 |
+
state["observation"] = "Final Answer: I cannot evaluate placeholder or missing code."
|
| 164 |
+
state["debug_trace"].append("[ToolNode] PythonExec received non-executable placeholder.")
|
| 165 |
+
return state
|
| 166 |
+
|
| 167 |
selected_tool = tools.get(tool_name)
|
| 168 |
state["debug_trace"].append(f"[ToolNode] Tool selected: {tool_name} | Input: {argument}")
|
| 169 |
if not selected_tool:
|
|
|
|
| 171 |
return state
|
| 172 |
query = state.get("rewritten_query") or argument.strip()
|
| 173 |
result = selected_tool.invoke(query)
|
| 174 |
+
if "wikipedia.org" in query:
|
| 175 |
+
state["debug_trace"].append("[ToolNode] Wikipedia snippet preview: " + result[:200].replace("\n", " "))
|
| 176 |
+
|
| 177 |
if tool_name == "Search" and is_vague(result):
|
| 178 |
retry_query = query + " site:wikipedia.org"
|
| 179 |
result_retry = selected_tool.invoke(retry_query)
|
| 180 |
if not is_vague(result_retry):
|
| 181 |
result = result_retry
|
| 182 |
+
|
| 183 |
+
if tool_name == "YouTubeTranscript" and ("Transcript unavailable" in result or not result.strip()):
|
| 184 |
+
state["debug_trace"].append("[ToolNode] Transcript retrieval failed or returned empty content.")
|
| 185 |
+
|
| 186 |
state["observation"] = result
|
| 187 |
state["history"].append((state["planner_output"], state["observation"]))
|
| 188 |
state["replan_count"] += 1
|
|
|
|
| 206 |
raw_response = llm.invoke([HumanMessage(content=final_prompt)]).content.strip()
|
| 207 |
answer = raw_response.splitlines()[0].strip()
|
| 208 |
state["answer"] = answer
|
| 209 |
+
# Enforce first name if question requires it
|
| 210 |
+
if "first name" in state["question"].lower() and " " in answer:
|
| 211 |
+
first_name = answer.split()[0]
|
| 212 |
+
state["debug_trace"].append(f"[Finalizer] Trimmed to first name: {first_name}")
|
| 213 |
+
answer = first_name
|
| 214 |
+
state["answer"] = first_name
|
| 215 |
+
|
| 216 |
+
# Log inference decisions
|
| 217 |
+
if "Transcript" in history or "wikipedia.org" in history:
|
| 218 |
+
state["debug_trace"].append("[Finalizer] Attempting inference from structured snippet...")
|
| 219 |
+
if "not found" in answer.lower():
|
| 220 |
+
lines = state["observation"].split(". ")
|
| 221 |
+
if lines:
|
| 222 |
+
possible = lines[0].strip()
|
| 223 |
+
if len(possible.split()) <= 10:
|
| 224 |
+
state["debug_trace"].append(f"[Finalizer] Adjusted Answer: {possible}")
|
| 225 |
+
answer = possible
|
| 226 |
+
state["answer"] = possible
|
| 227 |
+
|
| 228 |
|
| 229 |
# Infer from transcript or wiki snippet if vague
|
| 230 |
if "Transcript" in history or "wikipedia.org" in history:
|