igorpavlov-mgr commited on
Commit
d712844
·
verified ·
1 Parent(s): 5a0dc58

Update app.py

Browse files

First-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.

Files changed (1) hide show
  1. app.py +32 -0
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: