You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
swarms/examples/tools/claude_as_a_tool.py

207 lines
7.2 KiB

"""
Claude Code Agent Tool - Setup Guide
This tool provides a Claude Code Agent that can:
- Generate code and applications from natural language descriptions
- Write files, execute shell commands, and manage Git repositories
- Perform web searches and file operations
- Handle complex development tasks with retry logic
SETUP GUIDE:
1. Install dependencies:
pip install claude-code-sdk
npm install -g @anthropic-ai/claude-code
2. Set environment variable:
export ANTHROPIC_API_KEY="your-api-key-here"
3. Use the tool:
from claude_as_a_tool import developer_worker_agent
result = developer_worker_agent(
task="Create a Python web scraper",
system_prompt="You are a helpful coding assistant"
)
REQUIRED: ANTHROPIC_API_KEY environment variable must be set
"""
import asyncio
from typing import Any, Dict
from claude_code_sdk import ClaudeCodeOptions, ClaudeSDKClient
from dotenv import load_dotenv
from tenacity import retry, stop_after_attempt, wait_exponential
from loguru import logger
load_dotenv()
class ClaudeAppGenerator:
"""
Generates applications using Claude Code SDK based on specifications.
"""
def __init__(
self,
name: str = "Developer Worker Agent",
description: str = "A developer worker agent that can generate code and write it to a file.",
retries: int = 3,
retry_delay: float = 2.0,
system_prompt: str = None,
debug_mode: bool = False,
max_steps: int = 40,
model: str = "claude-sonnet-4-20250514",
max_thinking_tokens: int = 1000,
):
"""
Initialize the app generator.
Args:
name: Name of the app
description: Description of the app
retries: Number of retries
retry_delay: Delay between retries
system_prompt: System prompt
debug_mode: Enable extra verbose logging for Claude outputs
max_steps: Maximum number of steps
model: Model to use
"""
self.name = name
self.description = description
self.retries = retries
self.retry_delay = retry_delay
self.system_prompt = system_prompt
self.model = model
self.debug_mode = debug_mode
self.max_steps = max_steps
self.max_thinking_tokens = max_thinking_tokens
@retry(
stop=stop_after_attempt(3),
wait=wait_exponential(multiplier=1, min=4, max=15),
)
async def generate_app_with_claude(
self, task: str
) -> Dict[str, Any]:
"""
Generate app using Claude Code SDK with robust error handling and retry logic.
Args:
task: Task to be completed
Returns:
Dict containing generation results
"""
# Log the Claude SDK configuration
claude_options = ClaudeCodeOptions(
system_prompt=self.system_prompt,
max_turns=self.max_steps, # Sufficient for local app development and GitHub setup
allowed_tools=[
"Read",
"Write",
"Bash",
"GitHub",
"Git",
"Grep",
"WebSearch",
],
continue_conversation=True, # Start fresh each time
model=self.model,
max_thinking_tokens=self.max_thinking_tokens,
)
async with ClaudeSDKClient(options=claude_options) as client:
# Generate the application
await client.query(task)
response_text = []
message_count = 0
async for message in client.receive_response():
message_count += 1
if hasattr(message, "content"):
for block in message.content:
if hasattr(block, "text"):
text_content = block.text
response_text.append(text_content)
logger.info(text_content)
elif hasattr(block, "type"):
if self.debug_mode and hasattr(
block, "input"
):
input_str = str(block.input)
if len(input_str) > 200:
input_str = (
input_str[:200]
+ "... (truncated)"
)
print(f"Tool Input: {input_str}")
elif type(message).__name__ == "ResultMessage":
result_text = str(message.result)
response_text.append(result_text)
return response_text
def run(self, task: str) -> Dict[str, Any]:
"""
Synchronous wrapper for app generation to work with ThreadPoolExecutor.
Args:
spec: App specification
Returns:
Dict containing generation results
"""
return asyncio.run(self.generate_app_with_claude(task))
def developer_worker_agent(task: str, system_prompt: str) -> str:
"""
Developer Worker Agent
This function instantiates a ClaudeAppGenerator agent, which is a highly capable developer assistant designed to automate software development tasks.
The agent leverages the Claude Code SDK to interpret natural language instructions and generate code, scripts, or even entire applications.
It can interact with files, execute shell commands, perform web searches, and utilize version control systems such as Git and GitHub.
The agent is robust, featuring retry logic, customizable system prompts, and debug modes for verbose output.
It is ideal for automating repetitive coding tasks, prototyping, and integrating with developer workflows.
Capabilities:
- Generate code based on detailed task descriptions.
- Write generated code to files.
- Execute shell commands and scripts.
- Interact with Git and GitHub for version control operations.
- Perform web searches to gather information or code snippets.
- Provide detailed logs and debugging information if enabled.
- Handle errors gracefully with configurable retry logic.
Args:
task (str): The development task or instruction for the agent to complete.
system_prompt (str): The system prompt to guide the agent's behavior and context.
Returns:
str: The result of the agent's execution for the given task.
"""
claude_code_sdk = ClaudeAppGenerator(system_prompt=system_prompt)
return claude_code_sdk.run(task)
# agent = Agent(
# agent_name="Developer Worker Agent",
# agent_description="A developer worker agent that can generate code and write it to a file.",
# tools=[developer_worker_agent],
# system_prompt="You are a developer worker agent. You are given a task and you need to complete it.",
# )
# agent.run(
# task="Write a simple python script that prints 'Hello, World!'"
# )
# if __name__ == "__main__":
# task = "Write a simple python script that prints 'Hello, World!'"
# system_prompt = "You are a developer worker agent. You are given a task and you need to complete it."
# print(developer_worker_agent(task, system_prompt))