Agentic Design Pattern: Metacognitive Monitoring

Written by

in


    """
Pattern 011: Metacognitive Monitoring

Description:
    Agent monitors its own thinking process, confidence levels, and decision-making.
    Provides self-awareness about reasoning quality, uncertainty, and when to seek
    help or alternative strategies. Essential for safe and reliable AI systems.

Key Concepts:
    - Confidence Estimation: Quantify certainty in outputs
    - Uncertainty Quantification: Identify areas of low confidence
    - Self-Monitoring: Track reasoning quality during execution
    - Strategy Selection: Choose appropriate approaches based on confidence
    - Error Detection: Identify potential mistakes proactively

Use Cases:
    - Safety-critical applications
    - Decision validation and verification
    - Knowing when to escalate to humans
    - Quality control and error detection

LangChain Implementation:
    Confidence scoring chains with self-monitoring and adaptive strategies.
"""

import os
from typing import List, Dict, Any, Optional, Tuple
from dataclasses import dataclass, field
from enum import Enum
from dotenv import load_dotenv

from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_openai import ChatOpenAI

# Load environment variables
load_dotenv()


class ConfidenceLevel(Enum):
    """Confidence levels for reasoning."""
    VERY_LOW = "very_low"
    LOW = "low"
    MEDIUM = "medium"
    HIGH = "high"
    VERY_HIGH = "very_high"


@dataclass
class MetacognitiveState:
    """Represents the agent's metacognitive state."""
    task: str
    current_step: str
    confidence: float = 0.5  # 0.0 to 1.0
    uncertainty_sources: List[str] = field(default_factory=list)
    alternative_strategies: List[str] = field(default_factory=list)
    should_seek_help: bool = False
    reasoning_quality: float = 0.5
    
    def get_confidence_level(self) -> ConfidenceLevel:
        """Convert numeric confidence to level."""
        if self.confidence >= 0.9:
            return ConfidenceLevel.VERY_HIGH
        elif self.confidence >= 0.7:
            return ConfidenceLevel.HIGH
        elif self.confidence >= 0.5:
            return ConfidenceLevel.MEDIUM
        elif self.confidence >= 0.3:
            return ConfidenceLevel.LOW
        else:
            return ConfidenceLevel.VERY_LOW


class MetacognitiveAgent:
    """Agent with metacognitive monitoring capabilities."""
    
    def __init__(self, model_name: str = "gpt-3.5-turbo",
                 confidence_threshold: float = 0.6,
                 help_threshold: float = 0.4):
        """
        Initialize the Metacognitive Agent.
        
        Args:
            model_name: Name of the OpenAI model
            confidence_threshold: Minimum acceptable confidence
            help_threshold: Threshold below which to seek help
        """
        self.llm = ChatOpenAI(
            model=model_name,
            temperature=0.3,
            api_key=os.getenv("OPENAI_API_KEY")
        )
        
        self.confidence_threshold = confidence_threshold
        self.help_threshold = help_threshold
        self.metacognitive_log: List[MetacognitiveState] = []
    
    def estimate_confidence(self, task: str, reasoning: str, answer: str) -> Tuple[float, List[str]]:
        """
        Estimate confidence in the answer and identify uncertainty sources.
        
        Args:
            task: The task being solved
            reasoning: The reasoning process
            answer: The proposed answer
            
        Returns:
            Tuple of (confidence_score, uncertainty_sources)
        """
        prompt = ChatPromptTemplate.from_messages([
            ("system", """Evaluate your confidence in this answer. Consider:
1. Completeness of reasoning
2. Availability of relevant information
3. Complexity of the task
4. Potential ambiguities or uncertainties

Provide:
CONFIDENCE: [0.0-1.0]
UNCERTAINTY_SOURCES:
- [source 1]
- [source 2]
...

Be honest about limitations and uncertainties."""),
            ("human", """Task: {task}

Reasoning:
{reasoning}

Answer: {answer}

Confidence Evaluation:""")
        ])
        
        chain = prompt | self.llm | StrOutputParser()
        response = chain.invoke({
            "task": task,
            "reasoning": reasoning,
            "answer": answer
        })
        
        # Parse confidence and uncertainty sources
        confidence = 0.5
        uncertainty_sources = []
        
        for line in response.split('\n'):
            line = line.strip()
            if line.upper().startswith('CONFIDENCE:'):
                try:
                    conf_str = line.split(':', 1)[1].strip()
                    confidence = float(conf_str)
                except:
                    pass
            elif line.startswith('-') and 'UNCERTAINTY_SOURCES' in response.upper():
                source = line.lstrip('- ').strip()
                if source:
                    uncertainty_sources.append(source)
        
        return confidence, uncertainty_sources
    
    def identify_alternative_strategies(self, task: str, current_approach: str,
                                       issues: List[str]) -> List[str]:
        """
        Identify alternative strategies when current approach has low confidence.
        
        Args:
            task: The task being solved
            current_approach: Current approach being used
            issues: Identified issues with current approach
            
        Returns:
            List of alternative strategies
        """
        issues_text = "\n".join([f"- {issue}" for issue in issues])
        
        prompt = ChatPromptTemplate.from_messages([
            ("system", """Suggest alternative strategies for solving this task given the identified issues.
Provide 2-3 concrete alternative approaches.

Format:
1. [Strategy 1]
2. [Strategy 2]
3. [Strategy 3]"""),
            ("human", """Task: {task}

Current Approach: {current_approach}

Issues:
{issues}

Alternative Strategies:""")
        ])
        
        chain = prompt | self.llm | StrOutputParser()
        response = chain.invoke({
            "task": task,
            "current_approach": current_approach,
            "issues": issues_text
        })
        
        # Parse strategies
        strategies = []
        for line in response.strip().split('\n'):
            line = line.strip()
            if line and (line[0].isdigit() or line.startswith('-')):
                strategy = line.split('.', 1)[-1].strip().lstrip('- ').strip()
                if strategy:
                    strategies.append(strategy)
        
        return strategies[:3]
    
    def evaluate_reasoning_quality(self, reasoning: str) -> float:
        """
        Evaluate the quality of the reasoning process.
        
        Args:
            reasoning: The reasoning to evaluate
            
        Returns:
            Quality score 0.0-1.0
        """
        prompt = ChatPromptTemplate.from_messages([
            ("system", """Evaluate the quality of this reasoning. Consider:
- Logical consistency
- Completeness
- Clarity
- Rigor

Provide a quality score from 0.0 (poor) to 1.0 (excellent).
Respond with just the number."""),
            ("human", """Reasoning:
{reasoning}

Quality Score (0.0-1.0):""")
        ])
        
        chain = prompt | self.llm | StrOutputParser()
        
        try:
            response = chain.invoke({"reasoning": reasoning})
            score = float(response.strip())
            return max(0.0, min(1.0, score))
        except:
            return 0.5
    
    def solve_with_monitoring(self, task: str, verbose: bool = True) -> Dict[str, Any]:
        """
        Solve a task with metacognitive monitoring.
        
        Args:
            task: The task to solve
            verbose: Whether to print monitoring information
            
        Returns:
            Dictionary with solution and metacognitive information
        """
        if verbose:
            print(f"\nTask: {task}\n")
            print("="*60)
            print("METACOGNITIVE MONITORING ACTIVE")
            print("="*60)
        
        # Step 1: Initial reasoning
        if verbose:
            print("\nStep 1: Initial Reasoning")
        
        reasoning_prompt = ChatPromptTemplate.from_messages([
            ("system", "Solve this task with clear step-by-step reasoning."),
            ("human", "{task}")
        ])
        
        chain = reasoning_prompt | self.llm | StrOutputParser()
        reasoning = chain.invoke({"task": task})
        
        # Extract answer
        answer_lines = reasoning.strip().split('\n')
        answer = answer_lines[-1] if answer_lines else reasoning[:100]
        
        if verbose:
            print(f"Reasoning: {reasoning[:200]}...")
            print(f"Answer: {answer}")
        
        # Step 2: Estimate confidence
        if verbose:
            print("\nStep 2: Confidence Estimation")
        
        confidence, uncertainty_sources = self.estimate_confidence(task, reasoning, answer)
        
        # Step 3: Evaluate reasoning quality
        reasoning_quality = self.evaluate_reasoning_quality(reasoning)
        
        if verbose:
            print(f"Confidence: {confidence:.2f} ({ConfidenceLevel(confidence >= 0.9 and 'very_high' or confidence >= 0.7 and 'high' or confidence >= 0.5 and 'medium' or confidence >= 0.3 and 'low' or 'very_low').value})")
            print(f"Reasoning Quality: {reasoning_quality:.2f}")
            if uncertainty_sources:
                print(f"Uncertainty Sources: {len(uncertainty_sources)}")
                for source in uncertainty_sources:
                    print(f"  - {source}")
        
        # Step 4: Determine if help needed
        should_seek_help = confidence < self.help_threshold
        
        # Step 5: Identify alternative strategies if confidence low
        alternative_strategies = []
        if confidence < self.confidence_threshold:
            if verbose:
                print(f"\n⚠️ Low confidence detected (threshold: {self.confidence_threshold})")
                print("Step 3: Identifying Alternative Strategies")
            
            alternative_strategies = self.identify_alternative_strategies(
                task, "Initial direct reasoning", uncertainty_sources
            )
            
            if verbose:
                print("Alternative Strategies:")
                for i, strategy in enumerate(alternative_strategies, 1):
                    print(f"  {i}. {strategy}")
        
        # Step 6: Decide on action
        if should_seek_help:
            action = "ESCALATE_TO_HUMAN"
            recommendation = "Task complexity or uncertainty requires human oversight"
        elif confidence < self.confidence_threshold:
            action = "TRY_ALTERNATIVE_STRATEGY"
            recommendation = f"Recommend trying: {alternative_strategies[0] if alternative_strategies else 'alternative approach'}"
        else:
            action = "PROCEED_WITH_ANSWER"
            recommendation = "Confidence sufficient to proceed"
        
        if verbose:
            print(f"\nStep 4: Decision")
            print(f"Action: {action}")
            print(f"Recommendation: {recommendation}")
        
        # Create metacognitive state
        state = MetacognitiveState(
            task=task,
            current_step="Solution",
            confidence=confidence,
            uncertainty_sources=uncertainty_sources,
            alternative_strategies=alternative_strategies,
            should_seek_help=should_seek_help,
            reasoning_quality=reasoning_quality
        )
        self.metacognitive_log.append(state)
        
        return {
            "task": task,
            "reasoning": reasoning,
            "answer": answer,
            "confidence": confidence,
            "confidence_level": state.get_confidence_level().value,
            "reasoning_quality": reasoning_quality,
            "uncertainty_sources": uncertainty_sources,
            "alternative_strategies": alternative_strategies,
            "should_seek_help": should_seek_help,
            "recommended_action": action,
            "recommendation": recommendation
        }


def demonstrate_metacognitive_monitoring():
    """Demonstrates the Metacognitive Monitoring pattern."""
    
    print("=" * 80)
    print("PATTERN 011: Metacognitive Monitoring")
    print("=" * 80)
    print()
    print("Metacognitive Monitoring enables self-awareness through:")
    print("1. Confidence Estimation: Quantify certainty in outputs")
    print("2. Uncertainty Detection: Identify sources of uncertainty")
    print("3. Quality Assessment: Evaluate reasoning quality")
    print("4. Strategy Selection: Choose alternative approaches when needed")
    print("5. Help-Seeking: Know when to escalate to humans")
    print()
    
    # Create agent
    agent = MetacognitiveAgent(
        confidence_threshold=0.6,
        help_threshold=0.4
    )
    
    # Test tasks with varying complexity
    tasks = [
        "What is 15 + 27?",  # High confidence expected
        "Explain the implications of quantum entanglement for future communication technologies",  # Medium confidence
        "Should Company X acquire Company Y given uncertain market conditions?"  # Low confidence
    ]
    
    for idx, task in enumerate(tasks, 1):
        print(f"\n{'='*80}")
        print(f"Example {idx}")
        print('='*80)
        
        try:
            result = agent.solve_with_monitoring(task, verbose=True)
            
            print(f"\n\n{'='*80}")
            print("METACOGNITIVE SUMMARY")
            print('='*80)
            print(f"\nTask: {result['task']}")
            print(f"Answer: {result['answer']}")
            print(f"\nConfidence: {result['confidence']:.2f} ({result['confidence_level']})")
            print(f"Reasoning Quality: {result['reasoning_quality']:.2f}")
            print(f"Should Seek Help: {'Yes' if result['should_seek_help'] else 'No'}")
            print(f"\nRecommended Action: {result['recommended_action']}")
            print(f"Recommendation: {result['recommendation']}")
            
        except Exception as e:
            print(f"\n✗ Error: {str(e)}")
            import traceback
            traceback.print_exc()
    
    # Summary
    print("\n\n" + "=" * 80)
    print("METACOGNITIVE MONITORING PATTERN DEMONSTRATION COMPLETE")
    print("=" * 80)
    print()
    print("Key Features Demonstrated:")
    print("1. Confidence Estimation: Quantified certainty levels")
    print("2. Uncertainty Sources: Identified specific areas of uncertainty")
    print("3. Quality Assessment: Evaluated reasoning quality")
    print("4. Alternative Strategies: Suggested alternatives for low confidence")
    print("5. Decision Making: Determined appropriate actions based on confidence")
    print()
    print("Advantages:")
    print("- Self-awareness of limitations")
    print("- Proactive error detection")
    print("- Intelligent help-seeking")
    print("- Adaptive strategy selection")
    print()
    print("When to use Metacognitive Monitoring:")
    print("- Safety-critical applications")
    print("- High-stakes decision-making")
    print("- Uncertain or ambiguous tasks")
    print("- When transparency is required")
    print()
    print("LangChain Components Used:")
    print("- ChatPromptTemplate: Confidence estimation and evaluation")
    print("- StrOutputParser: Parse monitoring outputs")
    print("- Threshold-based decision making")
    print("- Structured metacognitive state tracking")
    print()


if __name__ == "__main__":
    # Check for API key
    if not os.getenv("OPENAI_API_KEY"):
        print("Error: OPENAI_API_KEY not found in environment variables.")
        print("Please set it in your .env file or environment.")
        exit(1)
    
    demonstrate_metacognitive_monitoring()

    

Agentic Design Pattern: Metacognitive Monitoring

Pattern 011: Metacognitive Monitoring – Line-by-Line Explanation

Overview

This document provides a detailed line-by-line explanation of the Metacognitive Monitoring pattern implementation.


Pattern Description

Pattern 011: Metacognitive Monitoring

Description: Agent monitors its own thinking process, confidence levels, and decision-making. Provides self-awareness about reasoning quality, uncertainty, and when to seek help or alternative strategies. Essential for safe and reliable AI systems.

Key Concepts: – Confidence Estimation: Quantify certainty in outputs – Uncertainty Quantification: Identify areas of low confidence – Self-Monitoring: Track reasoning quality during execution – Strategy Selection: Choose appropriate approaches based on confidence – Error Detection: Identify potential mistakes proactively

Use Cases: – Safety-critical applications – Decision validation and verification – Knowing when to escalate to humans – Quality control and error detection

LangChain Implementation: Confidence scoring chains with self-monitoring and adaptive strategies.


File Statistics

  • Total Lines: 454
  • Classes: 3
  • Functions: 1
  • Constants: 0

Module Documentation

"""
Pattern 011: Metacognitive Monitoring

Description:
    Agent monitors its own thinking process, confidence levels, and decision-making.
    Provides self-awareness about reasoning quality, uncertainty, and when to seek
    help or alternative strategies. Essential for safe and reliable AI systems.

Key Concepts:
    - Confidence Estimation: Quantify certainty in outputs
    - Uncertainty Quantification: Identify areas of low confidence
    - Self-Monitoring: Track reasoning quality during execution
    - Strategy Selection: Choose appropriate approaches based on confidence
    - Error Detection: Identify potential mistakes proactively

Use Cases:
    - Safety-critical applications
    - Decision validation and verification
    - Knowing when to escalate to humans
    - Quality control and error detection

LangChain Implementation:
    Confidence scoring chains with self-monitoring and adaptive strategies.
"""

Purpose: This module implements the Metacognitive Monitoring pattern, providing a structured approach to agent design and implementation.


Import Statements

Standard Library Imports

import dataclasses.dataclass
import dataclasses.field
import enum.Enum
import langchain_core.output_parsers.StrOutputParser
import langchain_core.prompts.ChatPromptTemplate
import os
import typing.Any
import typing.Dict
import typing.List
import typing.Optional
import typing.Tuple

Purpose: Core Python functionality: – dataclasses.dataclass: Simplified class definitions with @dataclass – dataclasses.field: Simplified class definitions with @dataclass – enum.Enum: Enumeration support – langchain_core.output_parsers.StrOutputParser: Regular expression operations – langchain_core.prompts.ChatPromptTemplate: Regular expression operations – os: Environment variable access and system operations – typing.Any: Type hints for better code documentation (List, Dict, Any, Optional) – typing.Dict: Type hints for better code documentation (List, Dict, Any, Optional) – typing.List: Type hints for better code documentation (List, Dict, Any, Optional) – typing.Optional: Type hints for better code documentation (List, Dict, Any, Optional) – typing.Tuple: Type hints for better code documentation (List, Dict, Any, Optional)

LangChain Imports

from langchain_openai.ChatOpenAI

Purpose: LangChain framework components: – LLM Interface: Wrapper for OpenAI models – Chains: Composable building blocks for complex workflows

Other Imports

from dotenv.load_dotenv
from traceback

Purpose: Additional dependencies for specialized functionality.


Classes

Class: ConfidenceLevel

Lines 40-46

Inherits from: Enum

Purpose:

Confidence levels for reasoning.

Class: MetacognitiveState

Lines 50-71

Purpose:

Represents the agent's metacognitive state.

Methods:

get_confidence_level(self)

Lines 60-71

Purpose:

Convert numeric confidence to level.

Parameters:

Returns: ConfidenceLevel


Class: MetacognitiveAgent

Lines 74-359

Purpose:

Agent with metacognitive monitoring capabilities.

Methods:

__init__(self, model_name, confidence_threshold, help_threshold)

Lines 77-96

Purpose:

Initialize the Metacognitive Agent.

Args:
    model_name: Name of the OpenAI model
    confidence_threshold: Minimum acceptable confidence
    help_threshold: Threshold below which to seek help

Parameters: – model_name: Language model instance – confidence_threshold: Confidence threshold – help_threshold: Help threshold

estimate_confidence(self, task, reasoning, answer)

Lines 98-159

Purpose:

Estimate confidence in the answer and identify uncertainty sources.

Args:
    task: The task being solved
    reasoning: The reasoning process
    answer: The proposed answer

Returns:
    Tuple of (confidence_score, uncertainty_sources)

Parameters: – task: Task – reasoning: Reasoning – answer: Answer

Returns: <ast.Subscript object at 0x000001A06D1592D0>

identify_alternative_strategies(self, task, current_approach, issues)

Lines 161-210

Purpose:

Identify alternative strategies when current approach has low confidence.

Args:
    task: The task being solved
    current_approach: Current approach being used
    issues: Identified issues with current approach

Returns:
    List of alternative strategies

Parameters: – task: Task – current_approach: Current approach – issues: Issues

Returns: <ast.Subscript object at 0x000001A06D700F50>

evaluate_reasoning_quality(self, reasoning)

Lines 212-244

Purpose:

Evaluate the quality of the reasoning process.

Args:
    reasoning: The reasoning to evaluate

Returns:
    Quality score 0.0-1.0

Parameters: – reasoning: Reasoning

Returns: float

solve_with_monitoring(self, task, verbose)

Lines 246-359

Purpose:

Solve a task with metacognitive monitoring.

Args:
    task: The task to solve
    verbose: Whether to print monitoring information

Returns:
    Dictionary with solution and metacognitive information

Parameters: – task: Task – verbose: Enable detailed logging

Returns: <ast.Subscript object at 0x000001A06D156C50>


Functions

demonstrate_metacognitive_monitoring()

Lines 362-443

Purpose:

Demonstrates the Metacognitive Monitoring pattern.

Key Concepts Summary

Pattern Overview

The Metacognitive Monitoring pattern provides a structured approach to building AI agents with specific capabilities and behaviors. This implementation leverages LangChain’s composable components to create a robust and maintainable solution.

Core Components

  1. Agent Class: Main implementation of the pattern logic
  2. Prompt Engineering: Carefully crafted prompts to guide LLM behavior
  3. Tool Integration: Optional tools for extended functionality
  4. Memory Management: State handling across interactions
  5. Output Parsing: Structured response processing

When to Use

✅ Good for: – Scenarios requiring this specific pattern’s strengths – Applications needing structured agent behavior – Systems where explainability is important – Production environments requiring reliability

❌ Not ideal for: – Simple single-prompt tasks – Scenarios requiring different pattern characteristics – Resource-constrained environments (if computationally intensive)


Best Practices Demonstrated

1. Environment Configuration

  • ✅ Use .env files for API keys
  • ✅ Never hardcode credentials
  • ✅ Validate environment variables on startup

2. Error Handling

  • ✅ Graceful degradation on failures
  • ✅ Informative error messages
  • ✅ Logging for debugging

3. Prompt Engineering

  • ✅ Clear, specific instructions
  • ✅ Structured output formats
  • ✅ Few-shot examples when beneficial

4. Code Organization

  • ✅ Separation of concerns (class-based design)
  • ✅ Type hints for clarity
  • ✅ Docstrings for documentation

5. Performance Optimization

  • ✅ Appropriate temperature settings
  • ✅ Token budget management
  • ✅ Caching where applicable

LangChain Components Used

  • ChatOpenAI: OpenAI model interface
  • Chains: Sequential component composition

Why LangChain? – Composable abstractions for LLM applications – Rich ecosystem of integrations – Production-ready patterns – Active community and development


Execution Flow

1. Initialize agent with configuration
   ↓
2. Load environment and dependencies
   ↓
3. Prepare prompt with input data
   ↓
4. Invoke LLM through LangChain
   ↓
5. Parse and validate response
   ↓
6. Return formatted result

Key Decision Points: – Model selection (temperature, model type) – Prompt structure (few-shot vs zero-shot) – Error handling strategy – Output format validation


Performance Considerations

Computational Cost

  • LLM Calls: Primary cost factor (based on tokens)
  • Latency: Depends on model and input size
  • Memory: Minimal for most patterns

Optimization Strategies

  1. Prompt Optimization: Minimize tokens while maintaining clarity
  2. Caching: Cache repeated queries/responses
  3. Model Selection: Use smaller models when appropriate
  4. Batch Processing: Group similar requests
  5. Streaming: For long responses, stream tokens

Cost Estimates (Approximate)

  • GPT-3.5-turbo: ~$0.002 per request
  • GPT-4: ~$0.03 per request
  • GPT-4-turbo: ~$0.01 per request

Actual costs vary based on input/output token counts


Common Pitfalls to Avoid

1. Prompt Design Issues

❌ Vague or ambiguous instructions
✅ Clear, specific, testable prompts

2. Error Handling

❌ Ignoring API errors or rate limits
✅ Implement retry logic and graceful degradation

3. Token Management

❌ Exceeding model token limits
✅ Truncate inputs, chunk processing

4. Security

❌ Exposing API keys in code
✅ Use environment variables

5. Testing

❌ Only testing happy paths
✅ Test edge cases, failures, malformed inputs

6. Cost Management

❌ Unmonitored API usage
✅ Implement budgets, alerts, and monitoring


Further Improvements

Production Enhancements

  1. Monitoring: Add logging, metrics, tracing
  2. Validation: Input/output schema validation
  3. Rate Limiting: Implement request throttling
  4. Caching: Redis or in-memory cache for responses
  5. Async Support: Non-blocking operations for scalability

Feature Extensions

  1. Multi-Model Support: Switch between providers
  2. Fallback Models: Graceful degradation strategy
  3. Custom Tools: Domain-specific function calling
  4. Advanced Memory: Vector stores for long-term memory
  5. Evaluation: Automated testing and benchmarking

Code Quality

  1. Testing: Unit tests, integration tests
  2. Documentation: API docs, usage examples
  3. Type Safety: Stricter type hints
  4. Configuration: Externalized config files

Related Patterns

  • Pattern 010
  • Pattern 012
  • Other Reasoning Patterns (001-011)

Pattern Families: – Reasoning Patterns (001-011) – Multi-Agent Patterns (012-019) – Tool Use Patterns (020-025) – Memory Patterns (026-031) – And many more…


Summary

The Metacognitive Monitoring pattern provides a powerful approach to building AI agents with specific capabilities. This implementation demonstrates:

✅ Key Strengths: – Clean, maintainable code structure – LangChain integration for composability – Type hints and documentation – Production-ready patterns

🎯 Best Use Cases: – Applications requiring this pattern’s characteristics – Systems needing structured agent behavior – Production environments requiring reliability

📚 Learning Resources: – LangChain Documentation: https://python.langchain.com/ – Pattern Documentation: See related patterns – OpenAI API Reference: https://platform.openai.com/docs/


File: 011_metacognitive_monitoring.py
Total Lines: 454
Pattern Category: AI Agent Design Pattern #011


Generated from actual implementation code
For educational and reference purposes

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *