From 102dc60efb9baee2ecffa22d212a58879fe447ab Mon Sep 17 00:00:00 2001 From: martin legrand Date: Sat, 17 May 2025 22:04:07 +0200 Subject: [PATCH] feat : integrate reasoning view --- api.py | 9 ++++++- frontend/agentic-seek-front/src/App.js | 34 ++++++++++++++++++++++++++ sources/agents/agent.py | 5 ++++ sources/agents/planner_agent.py | 3 ++- sources/interaction.py | 3 ++- sources/schemas.py | 2 ++ 6 files changed, 53 insertions(+), 3 deletions(-) diff --git a/api.py b/api.py index f326c39..cb0e2fa 100755 --- a/api.py +++ b/api.py @@ -138,6 +138,7 @@ async def get_latest_answer(): query_resp = { "done": "false", "answer": interaction.current_agent.last_answer, + "reasoning": interaction.current_agent.last_reasoning, "agent_name": interaction.current_agent.agent_name if interaction.current_agent else "None", "success": interaction.current_agent.success, "blocks": {f'{i}': block.jsonify() for i, block in enumerate(interaction.get_last_blocks_result())} if interaction.current_agent else {}, @@ -145,6 +146,7 @@ async def get_latest_answer(): "uid": uid } interaction.current_agent.last_answer = "" + interaction.current_agent.last_reasoning = "" query_resp_history.append(query_resp) return JSONResponse(status_code=200, content=query_resp) if query_resp_history: @@ -158,6 +160,7 @@ async def think_wrapper(interaction, query): success = await interaction.think() if not success: interaction.last_answer = "Error: No answer from agent" + interaction.last_reasoning = "Error: No reasoning from agent" interaction.last_success = False else: interaction.last_success = True @@ -166,7 +169,8 @@ async def think_wrapper(interaction, query): return success except Exception as e: logger.error(f"Error in think_wrapper: {str(e)}") - interaction.last_answer = f"Error: {str(e)}" + interaction.last_answer = f"" + interaction.last_reasoning = f"Error: {str(e)}" interaction.last_success = False raise e @@ -177,6 +181,7 @@ async def process_query(request: QueryRequest): query_resp = QueryResponse( done="false", answer="", + reasoning="", agent_name="Unknown", success="false", blocks={}, @@ -194,6 +199,7 @@ async def process_query(request: QueryRequest): if not success: query_resp.answer = interaction.last_answer + query_resp.reasoning = interaction.last_reasoning return JSONResponse(status_code=400, content=query_resp.jsonify()) if interaction.current_agent: @@ -208,6 +214,7 @@ async def process_query(request: QueryRequest): logger.info(f"Blocks: {blocks_json}") query_resp.done = "true" query_resp.answer = interaction.last_answer + query_resp.reasoning = interaction.last_reasoning query_resp.agent_name = interaction.current_agent.agent_name query_resp.success = str(interaction.last_success) query_resp.blocks = blocks_json diff --git a/frontend/agentic-seek-front/src/App.js b/frontend/agentic-seek-front/src/App.js index 7521a70..4293a6a 100644 --- a/frontend/agentic-seek-front/src/App.js +++ b/frontend/agentic-seek-front/src/App.js @@ -94,6 +94,7 @@ function App() { { type: 'agent', content: data.answer, + reasoning: data.reasoning, agentName: data.agent_name, status: data.status, uid: data.uid, @@ -231,6 +232,12 @@ function App() { > Browser View +
{error &&

{error}

} @@ -256,6 +263,33 @@ function App() {
)} + ) : currentView == 'thinking' ? ( +
+
+ {messages.length === 0 ? ( +

No thinking yet.

+ ) : ( + messages.map((msg, index) => ( +
+ {msg.type === 'agent' && ( + {msg.agentName} + )} + {msg.reasoning} +
+ )) + )} +
+
+
) : (
str: return self.last_answer + @property + def get_last_reasoning(self) -> str: + return self.last_reasoning + @property def get_blocks(self) -> list: return self.blocks_result diff --git a/sources/agents/planner_agent.py b/sources/agents/planner_agent.py index 7955e32..1a6d089 100644 --- a/sources/agents/planner_agent.py +++ b/sources/agents/planner_agent.py @@ -221,8 +221,9 @@ class PlannerAgent(Agent): agent_prompt = self.make_prompt(task['task'], required_infos) pretty_print(f"Agent {task['agent']} started working...", color="status") self.logger.info(f"Agent {task['agent']} started working on {task['task']}.") - answer, _ = await self.agents[task['agent'].lower()].process(agent_prompt, None) + answer, reasoning = await self.agents[task['agent'].lower()].process(agent_prompt, None) self.last_answer = answer + self.last_reasoning = reasoning self.blocks_result = self.agents[task['agent'].lower()].blocks_result agent_answer = self.agents[task['agent'].lower()].raw_answer_blocks(answer) success = self.agents[task['agent'].lower()].get_success diff --git a/sources/interaction.py b/sources/interaction.py index e878d5d..c5893d7 100644 --- a/sources/interaction.py +++ b/sources/interaction.py @@ -22,6 +22,7 @@ class Interaction: self.current_agent = None self.last_query = None self.last_answer = None + self.last_reasoning = None self.agents = agents self.tts_enabled = tts_enabled self.stt_enabled = stt_enabled @@ -158,7 +159,7 @@ class Interaction: tmp = self.last_answer self.current_agent = agent self.is_generating = True - self.last_answer, _ = await agent.process(self.last_query, self.speech) + self.last_answer, self.last_reasoning = await agent.process(self.last_query, self.speech) self.is_generating = False if push_last_agent_memory: self.current_agent.memory.push('user', self.last_query) diff --git a/sources/schemas.py b/sources/schemas.py index 29410ba..81a6fda 100644 --- a/sources/schemas.py +++ b/sources/schemas.py @@ -19,6 +19,7 @@ class QueryRequest(BaseModel): class QueryResponse(BaseModel): done: str answer: str + reasoning: str agent_name: str success: str blocks: dict @@ -32,6 +33,7 @@ class QueryResponse(BaseModel): return { "done": self.done, "answer": self.answer, + "reasoning": self.reasoning, "agent_name": self.agent_name, "success": self.success, "blocks": self.blocks,