From e71e578d147f6e30de17850c2fb8d6e207714263 Mon Sep 17 00:00:00 2001 From: zhonghao lu Date: Fri, 19 Sep 2025 12:01:17 +0800 Subject: [PATCH] feat: sec agent stream response --- python/valuecell/agents/sec_agent.py | 36 ++++++++++++++++++++++++---- 1 file changed, 31 insertions(+), 5 deletions(-) diff --git a/python/valuecell/agents/sec_agent.py b/python/valuecell/agents/sec_agent.py index 4ae4d2b95..c5df0e248 100644 --- a/python/valuecell/agents/sec_agent.py +++ b/python/valuecell/agents/sec_agent.py @@ -2,6 +2,7 @@ import logging import os from enum import Enum +from typing import Iterator from agno.agent import Agent, RunResponse, RunResponseEvent # noqa from agno.models.openrouter import OpenRouter @@ -211,11 +212,23 @@ async def _process_financial_data_query( Please ensure the analysis is objective and professional, based on actual data, avoiding excessive speculation. """ - result = self.analysis_agent.run(analysis_prompt) + response_stream: Iterator[RunResponseEvent] = self.analysis_agent.run( + analysis_prompt, stream=True, stream_intermediate_steps=True + ) + for event in response_stream: + if event.event == "RunResponseContent": + yield { + "content": event.content, + "is_task_complete": False, + } + elif event.event == "ToolCallStarted": + print(f"Tool call started: {event.tool}") + elif event.event == "ReasoningStep": + print(f"Reasoning step: {event.content}") logger.info("Financial data analysis completed") yield { - "content": result.content, + "content": "", "is_task_complete": True, } @@ -301,13 +314,26 @@ async def _process_fund_holdings_query( Please ensure the analysis is objective and professional, based on actual data, avoiding excessive speculation. """ - result = self.analysis_agent.run(analysis_prompt) - logger.info("13F analysis completed") + response_stream: Iterator[RunResponseEvent] = self.analysis_agent.run( + analysis_prompt, stream=True, stream_intermediate_steps=True + ) + for event in response_stream: + if event.event == "RunResponseContent": + yield { + "content": event.content, + "is_task_complete": False, + } + elif event.event == "ToolCallStarted": + print(f"Tool call started: {event.tool}") + elif event.event == "ReasoningStep": + print(f"Reasoning step: {event.content}") + logger.info("Financial data analysis completed") yield { - "content": result.content, + "content": "", "is_task_complete": True, } + logger.info("13F analysis completed") except Exception as e: logger.error(f"13F query failed: {e}")