| """ |
| Self-Tuning Service for Archon |
| Physically realizes the 'Cognitive Infra' by evolving System Prompts |
| based on observed errors in archon_logs. |
| """ |
|
|
| import logging |
| from typing import Any |
|
|
| import aiofiles |
|
|
| from ...utils import get_supabase_client |
| from ..llm_provider_service import get_llm_client |
| from ..propose_change_service import ProposeChangeService |
| from ..shared_constants import AgentUUIDs |
|
|
| logger = logging.getLogger(__name__) |
|
|
|
|
| class SelfTuningService: |
| def __init__(self, supabase_client=None): |
| self.supabase = supabase_client or get_supabase_client() |
| self.proposer = ProposeChangeService(self.supabase) |
|
|
| async def tune_prompt_from_error(self, log_id: str) -> dict[str, Any]: |
| """ |
| Analyze a specific error log and propose a prompt improvement. |
| """ |
| try: |
| |
| log_res = self.supabase.table("archon_logs").select("*").eq("id", log_id).execute() |
| if not log_res.data: |
| return {"success": False, "error": f"Log {log_id} not found"} |
|
|
| log = log_res.data[0] |
| error_msg = log.get("message") |
| details = log.get("details") or {} |
|
|
| |
| agent_name = details.get("agent_name", "DevBot") |
| prompt_map = { |
| "Alice": "python/src/server/prompts/sales_prompts.py", |
| "Bob": "python/src/server/prompts/marketing_prompts.py", |
| "Charlie": "python/src/server/prompts/pm_prompts.py", |
| "DevBot": "python/src/server/prompts/dev_ops_prompts.py", |
| } |
|
|
| file_path = prompt_map.get(agent_name, prompt_map["DevBot"]) |
|
|
| |
| try: |
| async with aiofiles.open(file_path) as f: |
| current_code = await f.read() |
| except FileNotFoundError: |
| return {"success": False, "error": f"Prompt file not found: {file_path}"} |
|
|
| |
| async with get_llm_client() as client: |
| tuning_prompt = f""" |
| Analyze the following ERROR log and the related SYSTEM PROMPT code. |
| ERROR: {error_msg} |
| DETAILS: {details} |
| |
| CURRENT PROMPT CODE: |
| {current_code} |
| |
| Propose a surgical modification to the prompt string within this code to prevent this error. |
| Return ONLY the full corrected file content. |
| """ |
| from ...config.model_ssot import SYSTEM_MODELS |
|
|
| response = await client.chat.completions.create( |
| model=SYSTEM_MODELS["DEFAULT_TEXT"], |
| messages=[{"role": "user", "content": tuning_prompt}], |
| temperature=0.1, |
| ) |
| new_content = response.choices[0].message.content.strip() |
|
|
| |
| proposal = await self.proposer.create_file_proposal( |
| file_path=file_path, |
| new_content=new_content, |
| summary=f"Cognitive Self-Tuning: Optimization for {agent_name} based on error {log_id}", |
| user_id=AgentUUIDs.DEV_BOT, |
| ) |
|
|
| return {"success": True, "proposal_id": proposal["id"], "file_path": file_path} |
|
|
| except Exception as e: |
| logger.error(f"SelfTuning: Failed to tune prompt: {e}") |
| return {"success": False, "error": str(e)} |
|
|
|
|
| |
| self_tuning_service = SelfTuningService() |
|
|