Align branding, prompts, and deployment tooling
This commit is contained in:
@@ -21,22 +21,6 @@ class ModelConfig:
|
||||
max_tokens: int = 4096
|
||||
|
||||
|
||||
@dataclass
|
||||
class RoleConfig:
|
||||
"""Role configuration for an agent."""
|
||||
|
||||
name: str
|
||||
description: str = ""
|
||||
focus_areas: List[str] = None
|
||||
constraints: List[str] = None
|
||||
|
||||
def __post_init__(self):
|
||||
if self.focus_areas is None:
|
||||
self.focus_areas = []
|
||||
if self.constraints is None:
|
||||
self.constraints = []
|
||||
|
||||
|
||||
class AgentConfig:
|
||||
"""Represents a configured agent instance (data class)."""
|
||||
|
||||
@@ -47,14 +31,12 @@ class AgentConfig:
|
||||
workspace_id: str,
|
||||
config_path: Path,
|
||||
model_config: Optional[ModelConfig] = None,
|
||||
role_config: Optional[RoleConfig] = None,
|
||||
):
|
||||
self.agent_id = agent_id
|
||||
self.agent_type = agent_type
|
||||
self.workspace_id = workspace_id
|
||||
self.config_path = config_path
|
||||
self.model_config = model_config or ModelConfig()
|
||||
self.role_config = role_config
|
||||
self.agent_dir = config_path.parent
|
||||
|
||||
def to_dict(self) -> Dict[str, Any]:
|
||||
@@ -70,103 +52,12 @@ class AgentConfig:
|
||||
"temperature": self.model_config.temperature,
|
||||
"max_tokens": self.model_config.max_tokens,
|
||||
},
|
||||
"role_config": self.role_config.__dict__ if self.role_config else None,
|
||||
}
|
||||
|
||||
|
||||
class AgentFactory:
|
||||
"""Factory for creating, cloning, and managing agents."""
|
||||
|
||||
# Default role templates by agent type
|
||||
ROLE_TEMPLATES = {
|
||||
"technical_analyst": {
|
||||
"name": "Technical Analyst",
|
||||
"description": "Analyze price patterns, trends, and technical indicators.",
|
||||
"focus_areas": [
|
||||
"Price action and chart patterns",
|
||||
"Support and resistance levels",
|
||||
"Technical indicators (RSI, MACD, Moving Averages)",
|
||||
"Volume analysis",
|
||||
],
|
||||
"constraints": [
|
||||
"State clear signal, confidence, and invalidation conditions",
|
||||
"Use available technical analysis tools",
|
||||
],
|
||||
},
|
||||
"fundamentals_analyst": {
|
||||
"name": "Fundamentals Analyst",
|
||||
"description": "Analyze company financials, earnings, and business metrics.",
|
||||
"focus_areas": [
|
||||
"Financial statements analysis",
|
||||
"Earnings reports and guidance",
|
||||
"Valuation metrics",
|
||||
"Business model and competitive position",
|
||||
],
|
||||
"constraints": [
|
||||
"State clear signal, confidence, and invalidation conditions",
|
||||
"Use available fundamental analysis tools",
|
||||
],
|
||||
},
|
||||
"sentiment_analyst": {
|
||||
"name": "Sentiment Analyst",
|
||||
"description": "Analyze market sentiment, news, and social signals.",
|
||||
"focus_areas": [
|
||||
"News sentiment analysis",
|
||||
"Social media sentiment",
|
||||
"Analyst ratings and price targets",
|
||||
"Insider activity",
|
||||
],
|
||||
"constraints": [
|
||||
"State clear signal, confidence, and invalidation conditions",
|
||||
"Use available sentiment analysis tools",
|
||||
],
|
||||
},
|
||||
"valuation_analyst": {
|
||||
"name": "Valuation Analyst",
|
||||
"description": "Perform valuation analysis and price target calculations.",
|
||||
"focus_areas": [
|
||||
"DCF and comparable valuation",
|
||||
"Price target derivation",
|
||||
"Margin of safety assessment",
|
||||
"Risk-adjusted return expectations",
|
||||
],
|
||||
"constraints": [
|
||||
"State clear signal, confidence, and invalidation conditions",
|
||||
"Use available valuation tools",
|
||||
],
|
||||
},
|
||||
"risk_manager": {
|
||||
"name": "Risk Manager",
|
||||
"description": "Quantify concentration, leverage, liquidity, and volatility risk.",
|
||||
"focus_areas": [
|
||||
"Portfolio concentration risk",
|
||||
"Leverage and margin analysis",
|
||||
"Liquidity assessment",
|
||||
"Volatility and drawdown risk",
|
||||
],
|
||||
"constraints": [
|
||||
"Prioritize highest-severity risk first",
|
||||
"State concrete limits and recommendations",
|
||||
"Use available risk tools before issuing final memo",
|
||||
],
|
||||
},
|
||||
"portfolio_manager": {
|
||||
"name": "Portfolio Manager",
|
||||
"description": "Synthesize analyst and risk inputs into portfolio decisions.",
|
||||
"focus_areas": [
|
||||
"Position sizing and allocation",
|
||||
"Risk-adjusted portfolio construction",
|
||||
"Trade execution timing",
|
||||
"Portfolio rebalancing",
|
||||
],
|
||||
"constraints": [
|
||||
"Be concise, capital-aware, and explicit about sizing rationale",
|
||||
"Respect cash, margin, and concentration constraints",
|
||||
"Consider all analyst inputs before decisions",
|
||||
],
|
||||
},
|
||||
}
|
||||
|
||||
def __init__(self, project_root: Optional[Path] = None):
|
||||
"""Initialize the agent factory.
|
||||
|
||||
@@ -183,7 +74,6 @@ class AgentFactory:
|
||||
agent_type: str,
|
||||
workspace_id: str,
|
||||
model_config: Optional[ModelConfig] = None,
|
||||
role_config: Optional[RoleConfig] = None,
|
||||
clone_from: Optional[str] = None,
|
||||
) -> AgentConfig:
|
||||
"""Create a new agent.
|
||||
@@ -193,7 +83,6 @@ class AgentFactory:
|
||||
agent_type: Type of agent (e.g., "technical_analyst")
|
||||
workspace_id: ID of the workspace to create agent in
|
||||
model_config: Model configuration
|
||||
role_config: Role configuration (auto-generated if None)
|
||||
clone_from: Path to existing agent to clone from (optional)
|
||||
|
||||
Returns:
|
||||
@@ -223,13 +112,6 @@ class AgentFactory:
|
||||
else:
|
||||
self._copy_template(agent_dir, agent_id, agent_type)
|
||||
|
||||
# Generate role config if not provided
|
||||
if role_config is None:
|
||||
role_config = self._generate_role_config(agent_type)
|
||||
|
||||
# Generate ROLE.md
|
||||
self._generate_role_md(agent_dir, role_config)
|
||||
|
||||
# Write agent.yaml
|
||||
config_path = agent_dir / "agent.yaml"
|
||||
self._write_agent_yaml(config_path, agent_id, agent_type, model_config)
|
||||
@@ -240,7 +122,6 @@ class AgentFactory:
|
||||
workspace_id=workspace_id,
|
||||
config_path=config_path,
|
||||
model_config=model_config,
|
||||
role_config=role_config,
|
||||
)
|
||||
|
||||
def delete_agent(self, agent_id: str, workspace_id: str) -> bool:
|
||||
@@ -369,9 +250,7 @@ class AgentFactory:
|
||||
"SOUL.md": f"# Soul\n\nDescribe {agent_id}'s temperament, reasoning posture, and voice.\n\n",
|
||||
"PROFILE.md": f"# Profile\n\nTrack {agent_id}'s long-lived investment style, preferences, and strengths.\n\n",
|
||||
"MEMORY.md": f"# Memory\n\nStore durable lessons, heuristics, and reminders for {agent_id}.\n\n",
|
||||
"HEARTBEAT.md": f"# Heartbeat\n\nOptional checklist for periodic review or self-reflection.\n\n",
|
||||
"POLICY.md": f"# Policy\n\nOptional run-scoped constraints, limits, or strategy policy.\n\n",
|
||||
"STYLE.md": f"# Style\n\nOptional run-scoped communication or reasoning style.\n\n",
|
||||
}
|
||||
|
||||
for filename, content in default_files.items():
|
||||
@@ -411,50 +290,6 @@ class AgentFactory:
|
||||
if skill_file.is_file():
|
||||
shutil.copy2(skill_file, target_skills / skill_file.name)
|
||||
|
||||
def _generate_role_config(self, agent_type: str) -> RoleConfig:
|
||||
"""Generate role configuration for an agent type.
|
||||
|
||||
Args:
|
||||
agent_type: Type of agent
|
||||
|
||||
Returns:
|
||||
RoleConfig instance
|
||||
"""
|
||||
template = self.ROLE_TEMPLATES.get(agent_type, {})
|
||||
return RoleConfig(
|
||||
name=template.get("name", agent_type.replace("_", " ").title()),
|
||||
description=template.get("description", ""),
|
||||
focus_areas=template.get("focus_areas", []),
|
||||
constraints=template.get("constraints", []),
|
||||
)
|
||||
|
||||
def _generate_role_md(self, agent_dir: Path, role_config: RoleConfig) -> None:
|
||||
"""Generate ROLE.md file.
|
||||
|
||||
Args:
|
||||
agent_dir: Agent directory
|
||||
role_config: Role configuration
|
||||
"""
|
||||
lines = [f"# {role_config.name}", ""]
|
||||
|
||||
if role_config.description:
|
||||
lines.extend([role_config.description, ""])
|
||||
|
||||
if role_config.focus_areas:
|
||||
lines.extend(["## Focus Areas", ""])
|
||||
for area in role_config.focus_areas:
|
||||
lines.append(f"- {area}")
|
||||
lines.append("")
|
||||
|
||||
if role_config.constraints:
|
||||
lines.extend(["## Constraints", ""])
|
||||
for constraint in role_config.constraints:
|
||||
lines.append(f"- {constraint}")
|
||||
lines.append("")
|
||||
|
||||
content = "\n".join(lines)
|
||||
(agent_dir / "ROLE.md").write_text(content, encoding="utf-8")
|
||||
|
||||
def _write_agent_yaml(
|
||||
self,
|
||||
config_path: Path,
|
||||
|
||||
Reference in New Issue
Block a user