92 lines
3.2 KiB
Python
92 lines
3.2 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
Demo script for nano claude code.
|
|
Requires ANTHROPIC_API_KEY environment variable.
|
|
|
|
Run:
|
|
ANTHROPIC_API_KEY=sk-... python demo.py
|
|
"""
|
|
import os
|
|
import sys
|
|
|
|
# Add parent path for imports
|
|
sys.path.insert(0, os.path.dirname(__file__))
|
|
|
|
from config import load_config
|
|
from context import build_system_prompt
|
|
from agent import AgentState, run, TextChunk, ThinkingChunk, ToolStart, ToolEnd, TurnDone, PermissionRequest
|
|
|
|
def demo():
|
|
config = load_config()
|
|
if not config["api_key"]:
|
|
print("Error: Set ANTHROPIC_API_KEY environment variable")
|
|
sys.exit(1)
|
|
|
|
config["permission_mode"] = "accept-all" # Demo: auto-approve everything
|
|
config["verbose"] = True
|
|
state = AgentState()
|
|
system_prompt = build_system_prompt()
|
|
|
|
print("=" * 60)
|
|
print("DEMO 1: Simple question (no tools)")
|
|
print("=" * 60)
|
|
_run_demo(state, config, system_prompt,
|
|
"What is the time complexity of quicksort? Answer in 2 sentences.")
|
|
|
|
print("\n" + "=" * 60)
|
|
print("DEMO 2: File system exploration (uses Glob + Read tools)")
|
|
print("=" * 60)
|
|
state2 = AgentState()
|
|
_run_demo(state2, config, system_prompt,
|
|
"List all Python files in the current directory and show me the first 5 lines of nano_claude.py")
|
|
|
|
print("\n" + "=" * 60)
|
|
print("DEMO 3: Code writing (uses Write + Bash tools)")
|
|
print("=" * 60)
|
|
state3 = AgentState()
|
|
_run_demo(state3, config, system_prompt,
|
|
"Write a Python function to fibonacci(n) in /tmp/fib.py, then run it to test fib(10)")
|
|
|
|
print("\n" + "=" * 60)
|
|
print("DEMO 4: Multi-turn conversation")
|
|
print("=" * 60)
|
|
state4 = AgentState()
|
|
_run_demo(state4, config, system_prompt,
|
|
"What are the tools available to you?")
|
|
_run_demo(state4, config, system_prompt,
|
|
"Which of those tools would you use to find all TODO comments in a codebase?")
|
|
|
|
print("\n" + "=" * 60)
|
|
print("DEMO 5: Web search")
|
|
print("=" * 60)
|
|
state5 = AgentState()
|
|
_run_demo(state5, config, system_prompt,
|
|
"Search the web for 'Python 3.13 new features' and give me a brief summary")
|
|
|
|
|
|
def _run_demo(state: AgentState, config: dict, system_prompt: str, prompt: str):
|
|
print(f"\n[USER]: {prompt}\n")
|
|
print("[CLAUDE]: ", end="", flush=True)
|
|
|
|
for event in run(prompt, state, config, system_prompt):
|
|
if isinstance(event, TextChunk):
|
|
print(event.text, end="", flush=True)
|
|
elif isinstance(event, ThinkingChunk):
|
|
if config.get("verbose"):
|
|
print(f"\033[2m[thinking: {event.text[:100]}]\033[0m", end="", flush=True)
|
|
elif isinstance(event, ToolStart):
|
|
print(f"\n\033[36m ⚙ {event.name}({list(event.inputs.values())[0] if event.inputs else ''})\033[0m", flush=True)
|
|
elif isinstance(event, PermissionRequest):
|
|
event.granted = True # Auto-approve in demo
|
|
elif isinstance(event, ToolEnd):
|
|
result_preview = event.result[:100].replace('\n', '↵')
|
|
print(f"\033[32m ✓ → {result_preview}\033[0m", flush=True)
|
|
elif isinstance(event, TurnDone):
|
|
print(f"\n\033[2m [+{event.input_tokens} in / +{event.output_tokens} out]\033[0m", flush=True)
|
|
|
|
print()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
demo()
|