บทนำ

ในปี 2026 Agentic AI ได้กลายเป็นความจำเป็นสำหรับระบบอัตโนมัติระดับ production การสร้าง AI Agent ที่ทำงานต่อเนื่อง 8 ชั่วโมงโดยไม่ต้องมีคนดูแลตลอดเวลา ต้องอาศัยสถาปัตยกรรมที่แข็งแกร่ง ในบทความนี้ผมจะแบ่งปันประสบการณ์ตรงจากการสร้างระบบ Multi-Agent Pipeline ที่ใช้งานจริงใน production มากว่า 6 เดือน

สำหรับการเรียกใช้ LLM เราจะใช้ HolySheep AI ซึ่งมีอัตราราคาที่ประหยัดมาก เช่น DeepSeek V3.2 เพียง $0.42 ต่อล้าน tokens เทียบกับ GPT-4.1 ที่ $8 ทำให้ประหยัดได้ถึง 95% สำหรับงาน Agentic ที่ต้องเรียกใช้จำนวนมาก

สถาปัตยกรรมหลักของ Agentic AI

1. State Machine Architecture

สำหรับ Agent ที่ทำงานต่อเนื่อง long-running การออกแบบ State Machine ที่ชัดเจนเป็นสิ่งสำคัญ ผมใช้โมเดล 6 สถานะดังนี้

from enum import Enum
from dataclasses import dataclass, field
from typing import Optional, List, Dict, Any
from datetime import datetime
import asyncio

class AgentState(Enum):
    IDLE = "idle"
    PLANNING = "planning"
    EXECUTING = "executing"
    WAITING_TOOL = "waiting_tool"
    OBSERVING = "observing"
    FINISHED = "finished"
    ERROR = "error"

@dataclass
class ConversationMessage:
    role: str
    content: str
    timestamp: datetime = field(default_factory=datetime.now)
    tool_calls: Optional[List[Dict]] = None
    tool_results: Optional[List[Dict]] = None

@dataclass
class AgentMemory:
    """Long-term memory store for agent persistence"""
    conversation_history: List[ConversationMessage] = field(default_factory=list)
    task_queue: List[Dict[str, Any]] = field(default_factory=list)
    tool_results_cache: Dict[str, Any] = field(default_factory=dict)
    session_metadata: Dict[str, Any] = field(default_factory=dict)
    
    def add_message(self, role: str, content: str, 
                    tool_calls: Optional[List[Dict]] = None):
        self.conversation_history.append(ConversationMessage(
            role=role,
            content=content,
            tool_calls=tool_calls
        ))
    
    def get_context_window(self, max_tokens: int = 32000) -> List[Dict]:
        """Retrieve messages within token limit"""
        messages = []
        total_tokens = 0
        
        for msg in reversed(self.conversation_history):
            msg_tokens = len(msg.content.split()) * 1.3
            if total_tokens + msg_tokens > max_tokens:
                break
            messages.insert(0, {
                "role": msg.role,
                "content": msg.content
            })
            total_tokens += msg_tokens
        
        return messages

class AgenticStateMachine:
    def __init__(self, agent_id: str, llm_client):
        self.agent_id = agent_id
        self.llm_client = llm_client
        self.state = AgentState.IDLE
        self.memory = AgentMemory()
        self.max_iterations = 50
        self.iteration_count = 0
        
    async def transition(self, new_state: AgentState, reason: str = ""):
        """State transition with logging"""
        old_state = self.state
        self.state = new_state
        print(f"[{self.agent_id}] {old_state.value} -> {new_state.value} | {reason}")
        
        # Persist state for recovery
        await self._persist_state()
        
    async def run(self, initial_task: str) -> str:
        """Main execution loop for 8-hour autonomous operation"""
        self.memory.add_message("user", initial_task)
        await self.transition(AgentState.PLANNING, "Task received")
        
        while self.state != AgentState.FINISHED:
            self.iteration_count += 1
            
            if self.iteration_count >= self.max_iterations:
                await self.transition(AgentState.FINISHED, "Max iterations reached")
                break
                
            try:
                if self.state == AgentState.PLANNING:
                    await self._plan()
                elif self.state == AgentState.EXECUTING:
                    await self._execute()
                elif self.state == AgentState.WAITING_TOOL:
                    await self._wait_tool_response()
                elif self.state == AgentState.OBSERVING:
                    await self._observe()
                    
            except Exception as e:
                await self._handle_error(e)
                
        return self._get_final_response()

2. Tool Use System สำหรับ Long-Running Tasks

ระบบ Tool Use ที่ดีต้องรองรับการทำงานแบบ async และมี retry mechanism ที่แข็งแกร่ง เพราะใน 8 ชั่วโมงการทำงาน network failure หรือ API timeout เป็นเรื่องปกติ

import json
import httpx
from typing import Callable, Any, Dict, List
from dataclasses import dataclass
from tenacity import retry, stop_after_attempt, wait_exponential

@dataclass
class ToolDefinition:
    name: str
    description: str
    parameters: Dict[str, Any]
    handler: Callable

class ToolRegistry:
    def __init__(self):
        self.tools: Dict[str, ToolDefinition] = {}
        
    def register(self, name: str, description: str, 
                 parameters: Dict, handler: Callable):
        self.tools[name] = ToolDefinition(
            name=name,
            description=description,
            parameters=parameters,
            handler=handler
        )
        
    def get_openai_format(self) -> List[Dict]:
        """Convert to OpenAI function calling format"""
        return [
            {
                "type": "function",
                "function": {
                    "name": tool.name,
                    "description": tool.description,
                    "parameters": tool.parameters
                }
            }
            for tool in self.tools.values()
        ]

class RobustToolExecutor:
    def __init__(self, timeout: int = 120, max_retries: int = 3):
        self.timeout = timeout
        self.max_retries = max_retries
        self.execution_log: List[Dict] = []
        
    async def execute_with_retry(
        self, 
        tool_name: str, 
        arguments: Dict[str, Any],
        handler: Callable
    ) -> Dict[str, Any]:
        """Execute tool with exponential backoff retry"""
        
        @retry(
            stop=stop_after_attempt(3),
            wait=wait_exponential(multiplier=1, min=2, max=30)
        )
        async def _execute():
            async with httpx.AsyncClient(timeout=self.timeout) as client:
                start_time = datetime.now()
                
                # Call handler with arguments
                result = await handler(client, **arguments)
                
                execution_time = (datetime.now() - start_time).total_seconds()
                
                log_entry = {
                    "tool": tool_name,
                    "args": arguments,
                    "result": str(result)[:500],  # Truncate for storage
                    "time": execution_time,
                    "timestamp": datetime.now().isoformat()
                }
                self.execution_log.append(log_entry)
                
                return result
                
        try:
            result = await _execute()
            return {"success": True, "result": result}
        except Exception as e:
            return {
                "success": False, 
                "error": str(e),
                "tool": tool_name
            }

Example tool implementations

def create_search_tool(holysheep_client) -> ToolDefinition: """Web search capability for agent research""" async def search_handler(client: httpx.AsyncClient, query: str, num_results: int = 5) -> List[Dict]: # Integrate with search API response = await client.post( "https://api.search-service.com/search", json={"query": query, "limit": num_results} ) return response.json() return ToolDefinition( name="web_search", description="Search the web for current information", parameters={ "type": "object", "properties": { "query": {"type": "string", "description": "Search query"}, "num_results": {"type": "integer", "default": 5} }, "required": ["query"] }, handler=search_handler )

3. Multi-Agent Orchestration ด้วย Hierarchical Design

สำหรับงานที่ซับซ้อน การใช้ Multi-Agent แบบ hierarchical ช่วยให้ delegation และ parallelization ทำได้ดี ผมออกแบบเป็น 3 ระดับ

import asyncio
from typing import List, Dict, Any
from dataclasses import dataclass, field
from enum import Enum

class AgentRole(Enum):
    ORCHESTRATOR = "orchestrator"  # High-level planning
    SPECIALIST = "specialist"      # Domain experts
    WORKER = "worker"              # Task executors

@dataclass
class Task:
    task_id: str
    description: str
    assigned_to: Optional[str] = None
    status: str = "pending"
    result: Any = None
    dependencies: List[str] = field(default_factory=list)

class HierarchicalAgentSystem:
    def __init__(self, llm_config: Dict):
        self.orchestrator = OrchestratorAgent(llm_config)
        self.specialists: Dict[str, SpecialistAgent] = {}
        self.workers: Dict[str, WorkerAgent] = {}
        self.task_graph: Dict[str, Task] = {}
        
    def add_specialist(self, name: str, domain: str, 
                       system_prompt: str):
        self.specialists[name] = SpecialistAgent(
            agent_id=name,
            domain=domain,
            system_prompt=system_prompt,
            llm_config=self.llm_config
        )
        
    async def execute_long_running_task(
        self, 
        objective: str, 
        max_duration_hours: int = 8
    ) -> Dict[str, Any]:
        """Execute complex task over extended period"""
        
        # Phase 1: Orchestrator creates task decomposition
        await self.orchestrator.analyze(objective)
        task_plan = await self.orchestrator.create_task_graph()
        
        # Phase 2: Parallel specialist execution with dependency management
        execution_start = datetime.now()
        max_duration_seconds = max_duration_hours * 3600
        
        while True:
            elapsed = (datetime.now() - execution_start).total_seconds()
            
            if elapsed > max_duration_seconds:
                print(f"⏰ Time limit reached: {elapsed/3600:.1f} hours")
                break
                
            # Find ready tasks (dependencies met)
            ready_tasks = self._get_ready_tasks()
            
            if not ready_tasks:
                if self._all_tasks_complete():
                    break
                await asyncio.sleep(5)  # Wait for dependencies
                continue
                
            # Execute ready tasks in parallel
            await asyncio.gather(*[
                self._execute_task(task) for task in ready_tasks
            ])
            
            await self._checkpoint_progress()
            
        return self._compile_results()
        
    async def _execute_task(self, task: Task) -> None:
        """Execute single task with appropriate agent"""
        
        if task.assigned_to in self.specialists:
            agent = self.specialists[task.assigned_to]
        else:
            agent = self.workers.get(task.assigned_to, self.orchestrator)
            
        result = await agent.execute(task.description)
        
        task.status = "completed"
        task.result = result
        
        # Update dependent tasks
        for dependent_id in self._get_dependents(task.task_id):
            dependent = self.task_graph[dependent_id]
            dependent.dependencies.remove(task.task_id)

การเชื่อมต่อกับ HolySheep AI API

สำหรับการเรียก LLM ใน production เราจะใช้ HolySheep AI ซึ่งรองรับโมเดลหลากหลาย เช่น GPT-4.1, Claude Sonnet 4.5, Gemini 2.5 Flash และ DeepSeek V3.2 ด้วย latency ต่ำกว่า 50ms และราคาที่ประหยัดมาก

import httpx
import asyncio
from typing import Optional, List, Dict, Any

class HolySheepAIClient:
    """Production-grade client for HolySheep AI API"""
    
    def __init__(self, api_key: str, base_url: str = "https://api.holysheep.ai/v1"):
        self.api_key = api_key
        self.base_url = base_url
        self.headers = {
            "Authorization": f"Bearer {api_key}",
            "Content-Type": "application/json"
        }
        
    async def chat_completion(
        self,
        model: str,
        messages: List[Dict[str, str]],
        temperature: float = 0.7,
        max_tokens: int = 4096,
        tools: Optional[List[Dict]] = None,
        stream: bool = False
    ) -> Dict[str, Any]:
        """Make API call to HolySheep with proper error handling"""
        
        payload = {
            "model": model,
            "messages": messages,
            "temperature": temperature,
            "max_tokens": max_tokens,
            "stream": stream
        }
        
        if tools:
            payload["tools"] = tools
            payload["tool_choice"] = "auto"
        
        async with httpx.AsyncClient(
            timeout=httpx.Timeout(60.0, connect=10.0)
        ) as client:
            response = await client.post(
                f"{self.base_url}/chat/completions",
                headers=self.headers,
                json=payload
            )
            
            if response.status_code != 200:
                raise APIError(
                    f"API call failed: {response.status_code}",
                    response.text
                )
                
            return response.json()

    async def chat_with_retry(
        self,
        model: str,
        messages: List[Dict[str, str]],
        max_retries: int = 3,
        **kwargs
    ) -> Dict[str, Any]:
        """Chat with automatic retry on failure"""
        
        for attempt in range(max_retries):
            try:
                return await self.chat_completion(
                    model=model,
                    messages=messages,
                    **kwargs
                )
            except (httpx.TimeoutException, httpx.NetworkError) as e:
                if attempt == max_retries - 1:
                    raise
                wait_time = 2 ** attempt
                print(f"Retry {attempt + 1}/{max_retries} after {wait_time}s")
                await asyncio.sleep(wait_time)
                
    async def streaming_chat(self, model: str, messages: List[Dict]) -> str:
        """Handle streaming responses for real-time output"""
        
        response = await self.chat_completion(
            model=model,
            messages=messages,
            stream=True
        )
        
        full_content = ""
        async for chunk in response.aiter_lines():
            if chunk.startswith("data: "):
                data = json.loads(chunk[6:])
                if delta := data.get("choices", [{}])[0].get("delta", {}).get("content"):
                    print(delta, end="", flush=True)
                    full_content += delta
                    
        return full_content

Initialize client

client = HolySheepAIClient(api_key="YOUR_HOLYSHEEP_API_KEY")

Example: Using DeepSeek V3.2 for cost efficiency ($0.42/MTok)

async def run_agent_task(): response = await client.chat_with_retry( model="deepseek-v3.2", messages=[ {"role": "system", "content": "You are a helpful research assistant."}, {"role": "user", "content": "Research the latest developments in quantum computing"} ], tools=tool_registry.get_openai_format() ) return response

Price comparison for 1M tokens:

- GPT-4.1: $8.00

- Claude Sonnet 4.5: $15.00

- Gemini 2.5 Flash: $2.50

- DeepSeek V3.2: $0.42 (saves 85%+)

การจัดการ Memory และ Persistence

สำหรับ 8 ชั่วโมงการทำงาน การจัดการ memory ที่ดีเป็นสิ่งสำคัญมาก เพราะ context window มีจำกัด และต้องรองรับการ recover จาก crash

import sqlite3
import json
import pickle
from pathlib import Path
from typing import List, Dict, Any, Optional
from datetime import datetime, timedelta

class PersistentMemoryStore:
    """SQLite-based persistent storage for agent memory"""
    
    def __init__(self, db_path: str = "agent_memory.db"):
        self.db_path = db_path
        self._init_database()
        
    def _init_database(self):
        """Initialize database schema"""
        with sqlite3.connect(self.db_path) as conn:
            conn.execute("""
                CREATE TABLE IF NOT EXISTS conversations (
                    id INTEGER PRIMARY KEY AUTOINCREMENT,
                    agent_id TEXT,
                    role TEXT,
                    content TEXT,
                    timestamp DATETIME,
                    metadata TEXT
                )
            """)
            
            conn.execute("""
                CREATE TABLE IF NOT EXISTS checkpoints (
                    id INTEGER PRIMARY KEY AUTOINCREMENT,
                    agent_id TEXT,
                    state TEXT,
                    timestamp DATETIME,
                    iteration INTEGER
                )
            """)
            
            conn.execute("""
                CREATE TABLE IF NOT EXISTS tool_executions (
                    id INTEGER PRIMARY KEY AUTOINCREMENT,
                    tool_name TEXT,
                    arguments TEXT,
                    result TEXT,
                    success INTEGER,
                    duration_ms REAL,
                    timestamp DATETIME
                )
            """)
            
            conn.execute("""
                CREATE INDEX IF NOT EXISTS idx_agent_timestamp 
                ON conversations(agent_id, timestamp)
            """)
            
    def save_message(self, agent_id: str, role: str, 
                     content: str, metadata: Optional[Dict] = None):
        """Persist conversation message"""
        with sqlite3.connect(self.db_path) as conn:
            conn.execute(
                """INSERT INTO conversations 
                   (agent_id, role, content, timestamp, metadata)
                   VALUES (?, ?, ?, ?, ?)""",
                (agent_id, role, content, datetime.now(), 
                 json.dumps(metadata) if metadata else None)
            )
            
    def save_checkpoint(self, agent_id: str, state: Dict, 
                       iteration: int):
        """Save agent state checkpoint for recovery"""
        with sqlite3.connect(self.db_path) as conn:
            conn.execute(
                """INSERT INTO checkpoints 
                   (agent_id, state, timestamp, iteration)
                   VALUES (?, ?, ?, ?)""",
                (agent_id, json.dumps(state), datetime.now(), iteration)
            )
            
    def get_last_checkpoint(self, agent_id: str) -> Optional[Dict]:
        """Retrieve most recent checkpoint for recovery"""
        with sqlite3.connect(self.db_path) as conn:
            cursor = conn.execute(
                """SELECT state, iteration FROM checkpoints 
                   WHERE agent_id = ? 
                   ORDER BY timestamp DESC LIMIT 1""",
                (agent_id,)
            )
            row = cursor.fetchone()
            if row:
                return {"state": json.loads(row[0]), "iteration": row[1]}
            return None
            
    def get_conversation_context(
        self, 
        agent_id: str, 
        hours_lookback: int = 8,
        max_messages: int = 100
    ) -> List[Dict]:
        """Get recent conversation history within time window"""
        cutoff = datetime.now() - timedelta(hours=hours_lookback)
        
        with sqlite3.connect(self.db_path) as conn:
            cursor = conn.execute(
                """SELECT role, content, metadata FROM conversations
                   WHERE agent_id = ? AND timestamp > ?
                   ORDER BY timestamp DESC
                   LIMIT ?""",
                (agent_id, cutoff, max_messages)
            )
            
            messages = []
            for row in cursor.fetchall():
                metadata = json.loads(row[2]) if row[2] else {}
                messages.append({
                    "role": row[0],
                    "content": row[1],
                    **metadata
                })
                
            return list(reversed(messages))

class SemanticMemory:
    """Vector-based semantic memory for relevance retrieval"""
    
    def __init__(self, embedding_client, vector_dim: int = 1536):
        self.embedding_client = embedding_client
        self.vector_dim = vector_dim
        self.memory_index: List[Dict] = []
        
    async def add_memory(self, content: str, metadata: Dict):
        """Store memory with embedding"""
        embedding = await self.embedding_client.get_embedding(content)
        
        self.memory_index.append({
            "content": content,
            "embedding": embedding,
            "metadata": metadata,
            "timestamp": datetime.now()
        })
        
    async def retrieve_relevant(
        self, 
        query: str, 
        top_k: int = 5,
        threshold: float = 0.7
    ) -> List[Dict]:
        """Retrieve semantically relevant memories"""
        query_embedding = await self.embedding_client.get_embedding(query)
        
        similarities = []
        for memory in self.memory_index:
            similarity = self._cosine_similarity(
                query_embedding, 
                memory["embedding"]
            )
            if similarity >= threshold:
                similarities.append((similarity, memory))
                
        similarities.sort(key=lambda x: x[0], reverse=True)
        
        return [mem for _, mem in similarities[:top_k]]
        
    @staticmethod
    def _cosine_similarity(a: List[float], b: List[float]) -> float:
        dot = sum(x * y for x, y in zip(a, b))
        norm_a = sum(x * x for x in a) ** 0.5
        norm_b = sum(x * x for x in b) ** 0.5
        return dot / (norm_a * norm_b)

Error Handling และ Recovery Strategy

สำหรับระบบที่ทำงาน 8 ชั่วโมง การจัดการ error ที่แข็งแกร่งเป็นสิ่งที่ขาดไม่ได้ ผมใช้ strategy 3 ระดับ

import traceback
from enum import Enum
from typing import Callable, Any, Optional
import logging

logger = logging.getLogger(__name__)

class ErrorSeverity(Enum):
    RECOVERABLE = "recoverable"
    FATAL = "fatal"
    TRANSIENT = "transient"

class ErrorHandler:
    def __init__(self, max_retries: int = 3, checkpoint_interval: int = 10):
        self.max_retries = max_retries
        self.checkpoint_interval = checkpoint_interval
        self.error_log: List[Dict] = []
        
    async def handle_with_recovery(
        self,
        operation: Callable,
        context: Dict,
        recovery_strategy: Callable = None
    ) -> Any:
        """Execute operation with comprehensive error handling"""
        
        for attempt in range(self.max_retries):
            try:
                result = await operation()
                
                # Success - log and return
                self._log_success(context, attempt)
                return result
                
            except TemporaryError as e:
                # Network timeout, API rate limit
                severity = ErrorSeverity.TRANSIENT
                wait_time = self._calculate_backoff(attempt)
                
                logger.warning(f"Transient error: {e}, retrying in {wait_time}s")
                await asyncio.sleep(wait_time)
                
            except RecoverableError as e:
                # Context overflow, tool failure
                severity = ErrorSeverity.RECOVERABLE
                
                if recovery_strategy:
                    try:
                        await recovery_strategy(context)
                    except Exception as recovery_error:
                        logger.error(f"Recovery failed: {recovery_error}")
                        severity = ErrorSeverity.FATAL
                        
            except FatalError as e:
                # API key invalid, schema mismatch
                severity = ErrorSeverity.FATAL
                self._log_error(e, context, severity)
                raise
                
            self._log_error(e, context, severity)
            
        # All retries exhausted
        raise MaxRetriesExceededError(
            f"Operation failed after {self.max_retries} attempts"
        )
        
    def _calculate_backoff(self, attempt: int) -> float:
        """Exponential backoff with jitter"""
        base = 2 ** attempt
        jitter = base * 0.1 * (hash(str(attempt)) % 10)
        return min(base + jitter, 120)  # Max 2 minutes
        
    def _log_error(self, error: Exception, context: Dict, severity: ErrorSeverity):
        self.error_log.append({
            "error": str(error),
            "traceback": traceback.format_exc(),
            "context": context,
            "severity": severity.value,
            "timestamp": datetime.now().isoformat()
        })

class GracefulDegradation:
    """System-level graceful degradation for 8-hour operation"""
    
    def __init__(self):
        self.fallback_models = {
            "gpt-4.1": "deepseek-v3.2",
            "claude-sonnet-4.5": "deepseek-v3.2",
            "gemini-2.5-flash": "deepseek-v3.2"
        }
        self.current_model = "gpt-4.1"
        self.degradation_level = 0
        
    async def execute_with_fallback(
        self,
        primary_operation: Callable,
        fallback_operation: Callable = None
    ):
        """Execute with automatic model fallback on failure"""
        
        try:
            return await primary_operation()
            
        except RateLimitError:
            self.degradation_level += 1
            logger.warning(f"Rate limited, degrading to level {self.degradation_level}")
            
            if self.degradation_level >= 2:
                # Switch to cheaper model
                new_model = self.fallback_models.get(self.current_model)
                if new_model:
                    logger.info(f"Switching to fallback model: {new_model}")
                    self.current_model = new_model
                    return await fallback_operation()
                    
        except BudgetExceededError:
            logger.error("Budget exceeded, switching to DeepSeek V3.2")
            self.current_model = "deepseek-v3.2"
            return await fallback_operation()

ข้อผิดพลาดที่พบบ่อยและวิธีแก้ไข

กรณีที่ 1: API Rate Limit เมื่อทำงานต่อเนื่อง

อาการ: ได้รับข้อผิดพลาด 429 Too Many Requests หลังจากทำงานไปได้ 2-3 ชั่วโมง

สาเหตุ: HolySheep AI มี rate limit ต่อนาที การเรียก API อย่างต่อเนื่องโดยไม่มีการควบคุมจะทำให้ถูก block

# ❌ วิธีที่ผิด - ไม่มี rate limiting
async def bad_implementation():
    for task in many_tasks:
        result = await client.chat_completion(model="deepseek-v3.2", ...)
        # จะถูก rate limit หลังจากนาทีที่ 5-10

✅ วิธีที่ถูกต้อง - ใช้ semaphore และ delay

import asyncio from datetime import datetime, timedelta class RateLimitedClient: def __init__(self, requests_per_minute: int = 60): self.rpm_limit = requests_per_minute self.semaphore = asyncio.Semaphore(requests_per_minute // 2) self.last_request_time = datetime.now() self.request_count = 0 async def throttled_completion(self, **kwargs): async with self.semaphore: # Enforce minimum gap between requests elapsed = (datetime.now() - self.last_request_time).total_seconds() if elapsed < 1.0: # At least 1 second between requests await asyncio.sleep(1.0 - elapsed) # Reset counter every minute if elapsed > 60: self.request_count = 0 self.request_count += 1 self.last_request_time = datetime.now() return await self.client.chat_completion(**kwargs)

Usage

rate_limited_client = RateLimitedClient(requests_per_minute=30) async def production_implementation(): for task in many_tasks: result = await rate_limited_client.throttled_completion( model="deepseek-v3.2", messages=[...] ) # ทำงานได้ต่อเนื่องโดยไม่ถูก block

กรณีที่ 2: Context Window Overflow ใน Loop ยาว

อาการ: Agent เริ่มพูดซ้ำๆ หรือให้คำตอบที่ไม่สมเหตุสมผล หลังจากทำงานไป 4-5 ชั่วโมง

สาเหตุ: conversation history สะสมจนเกิน context window แต่ไม่ได้มีการ summarize

# ❌ วิธีที่ผิด - สะสม history โดยไม่จำกัด
async def bad_context_management():
    messages = []  # สะสมไปเรื่อยๆ
    while True:
        messages.append({"role": "user", "content": task})
        response = await client.chat_completion(messages=messages)
        messages.append(response["choices"][0]["message"])
        # Context window overflow หลัง 4-5 ชั่วโมง

✅ วิธีที่ถูกต้อง - Smart context management

from typing import List, Dict class SmartContextManager: def __init__(self, max_context_tokens: int = 32000): self.max_tokens = max_context_tokens self.summary_threshold = 0.8 # Summarize when 80% full def build_messages( self, system_prompt: str, recent_messages: List[Dict], historical_summary: str = "" ) -> List[Dict]: """Build context with automatic summarization trigger""" messages = [{"role": "system", "content": system_prompt}] if historical_summary: messages.append({ "role": "system", "content": f"Previous session summary: {historical_summary}" }) # Add recent messages within token limit current