feat : integrate reasoning view

This commit is contained in:
martin legrand
2025-05-17 22:04:07 +02:00
parent 713c01193f
commit 102dc60efb
6 changed files with 53 additions and 3 deletions
+8 -1
View File
@@ -138,6 +138,7 @@ async def get_latest_answer():
query_resp = { query_resp = {
"done": "false", "done": "false",
"answer": interaction.current_agent.last_answer, "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", "agent_name": interaction.current_agent.agent_name if interaction.current_agent else "None",
"success": interaction.current_agent.success, "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 {}, "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 "uid": uid
} }
interaction.current_agent.last_answer = "" interaction.current_agent.last_answer = ""
interaction.current_agent.last_reasoning = ""
query_resp_history.append(query_resp) query_resp_history.append(query_resp)
return JSONResponse(status_code=200, content=query_resp) return JSONResponse(status_code=200, content=query_resp)
if query_resp_history: if query_resp_history:
@@ -158,6 +160,7 @@ async def think_wrapper(interaction, query):
success = await interaction.think() success = await interaction.think()
if not success: if not success:
interaction.last_answer = "Error: No answer from agent" interaction.last_answer = "Error: No answer from agent"
interaction.last_reasoning = "Error: No reasoning from agent"
interaction.last_success = False interaction.last_success = False
else: else:
interaction.last_success = True interaction.last_success = True
@@ -166,7 +169,8 @@ async def think_wrapper(interaction, query):
return success return success
except Exception as e: except Exception as e:
logger.error(f"Error in think_wrapper: {str(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 interaction.last_success = False
raise e raise e
@@ -177,6 +181,7 @@ async def process_query(request: QueryRequest):
query_resp = QueryResponse( query_resp = QueryResponse(
done="false", done="false",
answer="", answer="",
reasoning="",
agent_name="Unknown", agent_name="Unknown",
success="false", success="false",
blocks={}, blocks={},
@@ -194,6 +199,7 @@ async def process_query(request: QueryRequest):
if not success: if not success:
query_resp.answer = interaction.last_answer query_resp.answer = interaction.last_answer
query_resp.reasoning = interaction.last_reasoning
return JSONResponse(status_code=400, content=query_resp.jsonify()) return JSONResponse(status_code=400, content=query_resp.jsonify())
if interaction.current_agent: if interaction.current_agent:
@@ -208,6 +214,7 @@ async def process_query(request: QueryRequest):
logger.info(f"Blocks: {blocks_json}") logger.info(f"Blocks: {blocks_json}")
query_resp.done = "true" query_resp.done = "true"
query_resp.answer = interaction.last_answer query_resp.answer = interaction.last_answer
query_resp.reasoning = interaction.last_reasoning
query_resp.agent_name = interaction.current_agent.agent_name query_resp.agent_name = interaction.current_agent.agent_name
query_resp.success = str(interaction.last_success) query_resp.success = str(interaction.last_success)
query_resp.blocks = blocks_json query_resp.blocks = blocks_json
+34
View File
@@ -94,6 +94,7 @@ function App() {
{ {
type: 'agent', type: 'agent',
content: data.answer, content: data.answer,
reasoning: data.reasoning,
agentName: data.agent_name, agentName: data.agent_name,
status: data.status, status: data.status,
uid: data.uid, uid: data.uid,
@@ -231,6 +232,12 @@ function App() {
> >
Browser View Browser View
</button> </button>
<button
className={currentView === 'thinking' ? 'active' : ''}
onClick={() => setCurrentView('thinking')}
>
Reasoning view
</button>
</div> </div>
<div className="content"> <div className="content">
{error && <p className="error">{error}</p>} {error && <p className="error">{error}</p>}
@@ -256,6 +263,33 @@ function App() {
</div> </div>
)} )}
</div> </div>
) : currentView == 'thinking' ? (
<div className="thinking">
<div className="messages">
{messages.length === 0 ? (
<p className="placeholder">No thinking yet.</p>
) : (
messages.map((msg, index) => (
<div
key={index}
className={`message ${
msg.type === 'user'
? 'user-message'
: msg.type === 'agent'
? 'agent-message'
: 'error-message'
}`}
>
{msg.type === 'agent' && (
<span className="agent-name">{msg.agentName}</span>
)}
<ReactMarkdown>{msg.reasoning}</ReactMarkdown>
</div>
))
)}
<div ref={messagesEndRef} />
</div>
</div>
) : ( ) : (
<div className="screenshot"> <div className="screenshot">
<img <img
+5
View File
@@ -44,6 +44,7 @@ class Agent():
self.blocks_result = [] self.blocks_result = []
self.success = True self.success = True
self.last_answer = "" self.last_answer = ""
self.last_reasoning = ""
self.status_message = "Haven't started yet" self.status_message = "Haven't started yet"
self.verbose = verbose self.verbose = verbose
self.executor = ThreadPoolExecutor(max_workers=1) self.executor = ThreadPoolExecutor(max_workers=1)
@@ -64,6 +65,10 @@ class Agent():
def get_last_answer(self) -> str: def get_last_answer(self) -> str:
return self.last_answer return self.last_answer
@property
def get_last_reasoning(self) -> str:
return self.last_reasoning
@property @property
def get_blocks(self) -> list: def get_blocks(self) -> list:
return self.blocks_result return self.blocks_result
+2 -1
View File
@@ -221,8 +221,9 @@ class PlannerAgent(Agent):
agent_prompt = self.make_prompt(task['task'], required_infos) agent_prompt = self.make_prompt(task['task'], required_infos)
pretty_print(f"Agent {task['agent']} started working...", color="status") pretty_print(f"Agent {task['agent']} started working...", color="status")
self.logger.info(f"Agent {task['agent']} started working on {task['task']}.") 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_answer = answer
self.last_reasoning = reasoning
self.blocks_result = self.agents[task['agent'].lower()].blocks_result self.blocks_result = self.agents[task['agent'].lower()].blocks_result
agent_answer = self.agents[task['agent'].lower()].raw_answer_blocks(answer) agent_answer = self.agents[task['agent'].lower()].raw_answer_blocks(answer)
success = self.agents[task['agent'].lower()].get_success success = self.agents[task['agent'].lower()].get_success
+2 -1
View File
@@ -22,6 +22,7 @@ class Interaction:
self.current_agent = None self.current_agent = None
self.last_query = None self.last_query = None
self.last_answer = None self.last_answer = None
self.last_reasoning = None
self.agents = agents self.agents = agents
self.tts_enabled = tts_enabled self.tts_enabled = tts_enabled
self.stt_enabled = stt_enabled self.stt_enabled = stt_enabled
@@ -158,7 +159,7 @@ class Interaction:
tmp = self.last_answer tmp = self.last_answer
self.current_agent = agent self.current_agent = agent
self.is_generating = True 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 self.is_generating = False
if push_last_agent_memory: if push_last_agent_memory:
self.current_agent.memory.push('user', self.last_query) self.current_agent.memory.push('user', self.last_query)
+2
View File
@@ -19,6 +19,7 @@ class QueryRequest(BaseModel):
class QueryResponse(BaseModel): class QueryResponse(BaseModel):
done: str done: str
answer: str answer: str
reasoning: str
agent_name: str agent_name: str
success: str success: str
blocks: dict blocks: dict
@@ -32,6 +33,7 @@ class QueryResponse(BaseModel):
return { return {
"done": self.done, "done": self.done,
"answer": self.answer, "answer": self.answer,
"reasoning": self.reasoning,
"agent_name": self.agent_name, "agent_name": self.agent_name,
"success": self.success, "success": self.success,
"blocks": self.blocks, "blocks": self.blocks,