diff --git a/python/configs/agent_cards/sec_agent.json b/python/configs/agent_cards/sec_agent.json index 507ad4ada..91aa6148e 100644 --- a/python/configs/agent_cards/sec_agent.json +++ b/python/configs/agent_cards/sec_agent.json @@ -2,6 +2,7 @@ "name": "SecAgent", "display_name": "SEC Agent", "url": "http://localhost:10003/", + "icon_url": "https://valuecell-test.oss-cn-hangzhou.aliyuncs.com/images/sec_agent.png", "description": "SecAgent can analyze SEC filings like 10-Q, 10-K, 13-F and analyze stock holdings of institutional investment managers. It can chat about stock performance, financial metrics, and market trends or track specific stocks and provide updates.", "skills": [ { diff --git a/python/valuecell/agents/sec_agent.py b/python/valuecell/agents/sec_agent.py index cd4919f78..485d1088f 100644 --- a/python/valuecell/agents/sec_agent.py +++ b/python/valuecell/agents/sec_agent.py @@ -580,14 +580,6 @@ async def notify(self, query: str, session_id: str, task_id: str): ticker, changes ) - # yield { - # "content": f"🚨 **New SEC Filing Detected!**\n\n" - # f"**Ticker**: {ticker}\n" - # f"**Time**: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n\n" - # f"**Summary**:\n{summary}\n\n" - # f"Continuing to monitor for further changes...", - # "is_task_complete": False, - # } yield notification.message(summary) # Wait before next check diff --git a/python/valuecell/server/api/schemas/agent.py b/python/valuecell/server/api/schemas/agent.py index 86b4d8227..8ee746f8a 100644 --- a/python/valuecell/server/api/schemas/agent.py +++ b/python/valuecell/server/api/schemas/agent.py @@ -29,11 +29,12 @@ class AgentData(BaseModel): """Data model for a single agent.""" id: int = Field(..., description="Agent unique ID") - name: str = Field(..., description="Agent unique name/identifier") + agent_name: str = Field(..., description="Agent unique name/identifier") display_name: Optional[str] = Field(None, description="Human-readable display name") description: Optional[str] = Field(None, description="Agent description") version: Optional[str] = Field(None, description="Agent version") enabled: bool = Field(..., description="Whether the agent is enabled") + icon_url: Optional[str] = Field(None, description="Agent icon URL") agent_metadata: Optional[Dict[str, Any]] = Field(None, description="Agent metadata") config: Optional[Dict[str, Any]] = Field(None, description="Agent configuration") created_at: Optional[datetime] = Field(None, description="Creation timestamp") @@ -43,11 +44,12 @@ class Config: json_schema_extra = { "example": { "id": 1, - "name": "MarketAnalystAgent", + "agent_name": "MarketAnalystAgent", "display_name": "Market Analyst Agent", "description": "AI-powered market analysis agent", "version": "1.0.0", "enabled": True, + "icon_url": "https://example.com/icons/market_analyst.png", "agent_metadata": { "author": "ValueCell Team", "tags": ["market", "analysis", "ai"], @@ -72,11 +74,12 @@ class Config: "agents": [ { "id": 1, - "name": "MarketAnalystAgent", + "agent_name": "MarketAnalystAgent", "display_name": "Market Analyst Agent", "description": "AI-powered market analysis agent", "version": "1.0.0", "enabled": True, + "icon_url": "https://example.com/icons/market_analyst.png", "agent_metadata": { "author": "ValueCell Team", "tags": ["market", "analysis", "ai"], diff --git a/python/valuecell/server/config/settings.py b/python/valuecell/server/config/settings.py index 705ce693e..329bd92ca 100644 --- a/python/valuecell/server/config/settings.py +++ b/python/valuecell/server/config/settings.py @@ -25,7 +25,9 @@ def __init__(self): self.CORS_ORIGINS = cors_origins.split(",") if cors_origins != "*" else ["*"] # Database Configuration - self.DATABASE_URL = os.getenv("DATABASE_URL", "sqlite:///./valuecell.db") + self.DATABASE_URL = os.getenv( + "DATABASE_URL", "sqlite:///valuecell/server/db/valuecell.db" + ) self.DB_ECHO = os.getenv("DB_ECHO", "false").lower() == "true" # Redis Configuration diff --git a/python/valuecell/server/db/init_db.py b/python/valuecell/server/db/init_db.py index e23020d9c..9b6f20d6f 100644 --- a/python/valuecell/server/db/init_db.py +++ b/python/valuecell/server/db/init_db.py @@ -439,6 +439,9 @@ def initialize_basic_data(self) -> bool: existing_agent.description = agent_data.get( "description", existing_agent.description ) + existing_agent.icon_url = agent_data.get( + "icon_url", existing_agent.icon_url + ) existing_agent.version = agent_data.get( "version", existing_agent.version ) diff --git a/python/valuecell/server/db/models/agent.py b/python/valuecell/server/db/models/agent.py index d053a311c..5534d0a75 100644 --- a/python/valuecell/server/db/models/agent.py +++ b/python/valuecell/server/db/models/agent.py @@ -40,6 +40,11 @@ class Agent(Base): nullable=True, comment="Detailed description of the agent's purpose and capabilities", ) + icon_url = Column( + String(500), + nullable=True, + comment="URL to the agent's icon image", + ) # Agent configuration version = Column( @@ -92,6 +97,7 @@ def to_dict(self) -> Dict[str, Any]: "name": self.name, "display_name": self.display_name, "description": self.description, + "icon_url": self.icon_url, "version": self.version, "enabled": self.enabled, "capabilities": self.capabilities, @@ -108,6 +114,7 @@ def from_config(cls, config_data: Dict[str, Any]) -> "Agent": name=config_data.get("name"), display_name=config_data.get("display_name"), description=config_data.get("description"), + icon_url=config_data.get("icon_url"), version=config_data.get("version", "1.0.0"), enabled=config_data.get("enabled", True), capabilities=config_data.get( diff --git a/python/valuecell/server/services/agent_service.py b/python/valuecell/server/services/agent_service.py index 08f52e277..feff4630c 100644 --- a/python/valuecell/server/services/agent_service.py +++ b/python/valuecell/server/services/agent_service.py @@ -52,11 +52,12 @@ def get_all_agents( agent_data_list = [ AgentData( id=agent.id, - name=agent.name, + agent_name=agent.name, display_name=agent.display_name, description=agent.description, version=agent.version, enabled=agent.enabled, + icon_url=agent.icon_url, agent_metadata=agent.agent_metadata, config=agent.config, created_at=agent.created_at, @@ -92,11 +93,12 @@ def get_agent_by_id(db: Session, agent_id: int) -> Optional[AgentData]: return AgentData( id=agent.id, - name=agent.name, + agent_name=agent.name, display_name=agent.display_name, description=agent.description, version=agent.version, enabled=agent.enabled, + icon_url=agent.icon_url, agent_metadata=agent.agent_metadata, config=agent.config, created_at=agent.created_at, @@ -122,11 +124,12 @@ def get_agent_by_name(db: Session, agent_name: str) -> Optional[AgentData]: return AgentData( id=agent.id, - name=agent.name, + agent_name=agent.name, display_name=agent.display_name, description=agent.description, version=agent.version, enabled=agent.enabled, + icon_url=agent.icon_url, agent_metadata=agent.agent_metadata, config=agent.config, created_at=agent.created_at,