Skip to main content

Overview

Coding agents are responsible for generating and modifying code based on prompts. Kapso supports multiple agents, each with different strengths.

Available Agents

AgentDescriptionBest For
aiderGit-centric diff-based editingGeneral purpose, default
geminiGoogle Gemini SDKFast generation
claude_codeAnthropic Claude Code CLIComplex refactoring
openhandsOpenHands with sandboxIsolated execution

Agent Interface

All agents implement CodingAgentInterface:
class CodingAgentInterface(ABC):
    def initialize(self, workspace: str) -> None:
        """Initialize for a specific workspace."""

    def generate_code(self, prompt: str, debug_mode: bool = False) -> CodingResult:
        """Generate or modify code based on prompt."""

    def cleanup(self) -> None:
        """Clean up resources."""

    def get_cumulative_cost(self) -> float:
        """Return total cost accumulated."""

    def supports_native_git(self) -> bool:
        """Return True if agent handles its own commits."""

Aider (Default)

Git-centric pair programming with diff-based editing.

Features

  • Automatic git commits
  • Diff-based file editing
  • Context-aware code understanding
  • Cost tracking

Configuration

coding_agent:
  type: "aider"
  model: "gpt-4o-mini"
  debug_model: "gpt-4o-mini"

Usage

from src.execution.coding_agents.factory import CodingAgentFactory

config = CodingAgentFactory.build_config(
    agent_type="aider",
    model="gpt-4o-mini",
)

agent = CodingAgentFactory.create(config)
agent.initialize("/path/to/workspace")

result = agent.generate_code("Implement a sorting algorithm")
print(f"Files changed: {result.files_changed}")
print(f"Cost: ${result.cost:.4f}")

Claude Code

Anthropic’s Claude Code CLI for complex tasks.

Features

  • Advanced reasoning
  • Complex refactoring
  • MCP tool support
  • Bedrock integration option

Installation

npm install -g @anthropic-ai/claude-code

Configuration

coding_agent:
  type: "claude_code"
  model: "claude-sonnet-4-20250514"
  agent_specific:
    use_bedrock: false
    claude_md_path: "CLAUDE.md"

Bedrock Support

For AWS Bedrock:
coding_agent:
  type: "claude_code"
  agent_specific:
    use_bedrock: true
Set environment variables:
AWS_ACCESS_KEY_ID=...
AWS_SECRET_ACCESS_KEY=...
AWS_REGION=us-east-1

Gemini

Google Gemini SDK for fast generation.

Features

  • Fast response times
  • Good for iterative refinement
  • Cost-effective

Configuration

coding_agent:
  type: "gemini"
  model: "gemini-2.0-flash"
  debug_model: "gemini-2.0-flash"
Set API key:
GOOGLE_API_KEY=your-google-api-key

OpenHands

OpenHands agent with sandboxed execution.
OpenHands has conflicting dependencies with aider-chat. Use a separate conda environment.

Installation

# Create separate environment
conda create -n openhands_env python=3.12
conda activate openhands_env
pip install openhands-ai litellm

Features

  • Sandboxed execution
  • Docker-based isolation
  • Full system access in sandbox

Configuration

coding_agent:
  type: "openhands"
  model: "gpt-4o"
  agent_specific:
    sandbox_type: "docker"

CodingResult

All agents return a standardized result:
@dataclass
class CodingResult:
    success: bool           # Whether generation succeeded
    output: str             # Agent's response text
    files_changed: List[str]  # Modified files
    error: Optional[str]    # Error message if failed
    cost: float             # Cost in dollars
    commit_message: Optional[str]  # Agent-generated message
    metadata: Dict[str, Any]  # Agent-specific data

CodingAgentConfig

Configuration passed to agents:
@dataclass
class CodingAgentConfig:
    agent_type: str         # "aider", "gemini", etc.
    model: str              # Primary model
    debug_model: str        # Model for debugging
    workspace: str = ""     # Working directory
    use_git: bool = True    # Git integration
    agent_specific: Dict[str, Any] = field(default_factory=dict)

Creating Custom Agents

from src.execution.coding_agents.base import CodingAgentInterface, CodingResult
from src.execution.coding_agents.factory import register_agent

@register_agent("my_custom_agent")
class MyCustomAgent(CodingAgentInterface):
    def initialize(self, workspace: str) -> None:
        self.workspace = workspace
        # Setup agent

    def generate_code(self, prompt: str, debug_mode: bool = False) -> CodingResult:
        # Generate code
        model = self.config.debug_model if debug_mode else self.config.model

        # Call your API
        response = my_api.generate(prompt, model=model)

        # Track cost
        self._cumulative_cost += response.cost

        return CodingResult(
            success=True,
            output=response.text,
            files_changed=response.files,
            cost=response.cost,
        )

    def cleanup(self) -> None:
        # Clean up resources
        pass

    def supports_native_git(self) -> bool:
        return False  # Let ExperimentSession handle commits

Git Integration

Agents can handle git in two ways:

Native Git (Aider)

Agent commits changes automatically:
def supports_native_git(self) -> bool:
    return True  # Aider auto-commits

Session-Managed Git (Others)

ExperimentSession commits after generation:
def supports_native_git(self) -> bool:
    return False  # Session will commit

Agent Capabilities

def get_capabilities(self) -> Dict[str, bool]:
    return {
        "native_git": self.supports_native_git(),
        "sandbox": False,
        "planning_mode": False,
        "cost_tracking": True,
        "streaming": False,
    }

Listing Agents

PYTHONPATH=. python -m src.cli --list-agents
Output:
Available Coding Agents:
==================================================
  aider: Git-centric pair programming with diff-based editing
  gemini: Google Gemini SDK for code generation
  claude_code: Anthropic Claude Code CLI for complex refactoring
  openhands: OpenHands agent with sandboxed execution (separate env required)