Wróć do bloga

Jak zbudować prostego agenta AI z Claude Code

Dowiedz się, jak krok po kroku stworzyć swojego pierwszego agenta AI używając Claude. Praktyczny tutorial z przykładami kodu i gotowymi rozwiązaniami.

Zespół VITA
Jak zbudować prostego agenta AI z Claude Code

Agent AI Claude to zaawansowany asystent, który może wykonywać złożone zadania autonomicznie. W tym artykule dowiesz się, jak zbudować prostego agenta AI korzystając z możliwości Claude Code - od podstawowej konfiguracji po implementację konkretnych funkcjonalności. Przedstawię praktyczne przykłady kodu, najlepsze praktyki oraz tipsy, które pozwolą Ci stworzyć działającego agenta w kilka godzin.

Czym jest agent AI i dlaczego Claude Code

Agent AI to program komputerowy zdolny do autonomicznego wykonywania zadań, podejmowania decyzji i interakcji z otoczeniem. W przeciwieństwie do tradycyjnych chatbotów, agenty AI mogą:

  • Analizować kontekst i planować działania
  • Wykonywać sekwencje zadań bez ciągłej supervizji
  • Integrować się z zewnętrznymi systemami i API
  • Uczić się z doświadczeń i adaptować zachowanie

Claude Code od Anthropic wyróżnia się na tle konkurencji kilkoma kluczowymi zaletami:

  • Bezpieczeństwo: Wbudowane mechanizmy Constitutional AI redukują ryzyko niepożądanych zachowań
  • Długi kontekst: Do 200,000 tokenów pozwala na przetwarzanie obszernych dokumentów
  • Jakość kodu: Generuje czytelny, dobrze udokumentowany kod w różnych językach
  • Łatwość integracji: Prosty REST API z obszerną dokumentacją

Według raportu McKinsey z 2023 roku, organizacje wykorzystujące agenty AI odnotowują średnio 15-25% wzrost produktywności w procesach automatyzacji.

Przygotowanie środowiska pracy

Wymagania systemowe

Do budowy agenta AI z Claude potrzebujesz:

  • Python 3.8+ (zalecana wersja 3.10)
  • Git do zarządzania kodem
  • IDE: VS Code, PyCharm lub podobne
  • Klucz API: Konto w Anthropic Console
  • System operacyjny: Windows 10+, macOS 10.15+, lub Linux

Instalacja niezbędnych bibliotek

Utwórz nowy projekt i zainstaluj wymagane pakiety:

bash
pip install anthropic python-dotenv requests beautifulsoup4 schedule

Konfiguracja klucza API

  1. Zarejestruj się na console.anthropic.com
  2. Wygeneruj klucz API w sekcji "API Keys"
  3. Utwórz plik .env w katalogu projektu:
ANTHROPIC_API_KEY=your_api_key_here

Ważne: Nigdy nie commituj pliku .env do repozytorium. Dodaj go do .gitignore.

Struktura projektu

Zorganizuj kod w przejrzystą strukturę:

ai_agent/
├── main.py
├── agent/
│   ├── __init__.py
│   ├── core.py
│   └── tools.py
├── config/
│   └── settings.py
└── .env

Podstawowa architektura agenta

Claude agent składa się z kilku kluczowych komponentów:

1. Główny kontroler (Agent Core)

To serce agenta odpowiedzialne za:

  • Komunikację z Claude API
  • Zarządzanie kontekstem rozmowy
  • Koordynację działań między narzędziami
python
import anthropic import os from dotenv import load_dotenv load_dotenv() class ClaudeAgent: def __init__(self): self.client = anthropic.Anthropic( api_key=os.getenv('ANTHROPIC_API_KEY') ) self.conversation_history = [] def send_message(self, message, max_tokens=1000): response = self.client.messages.create( model="claude-3-sonnet-20240229", max_tokens=max_tokens, messages=[{"role": "user", "content": message}] ) return response.content[0].text

2. System narzędzi (Tools)

Agent potrzebuje sposobu interakcji ze światem zewnętrznym:

python
class AgentTools: @staticmethod def web_search(query): # Implementacja wyszukiwania import requests # Przykład z wykorzystaniem DuckDuckGo API url = f"https://api.duckduckgo.com/?q={query}&format=json" response = requests.get(url) return response.json() @staticmethod def save_file(content, filename): with open(filename, 'w', encoding='utf-8') as f: f.write(content) return f"Zapisano plik: {filename}"

3. Manager kontekstu

Utrzymuje ciągłość rozmowy i pamięć agenta:

python
class ContextManager: def __init__(self, max_history=10): self.max_history = max_history self.memory = [] def add_interaction(self, user_input, agent_response): self.memory.append({ 'timestamp': datetime.now(), 'user': user_input, 'agent': agent_response }) if len(self.memory) > self.max_history: self.memory.pop(0)

Implementacja podstawowych funkcji

Funkcja przetwarzania zapytań

Stwórz główną logikę przetwarzania requestów:

python
class SmartAgent(ClaudeAgent): def __init__(self): super().__init__() self.tools = AgentTools() self.context = ContextManager() def process_request(self, user_input): # Analiza intencji użytkownika intent_prompt = f""" Przeanalizuj następujące zapytanie użytkownika i określ, czy wymaga ono użycia narzędzi zewnętrznych: Zapytanie: {user_input} Odpowiedz w formacie JSON: {{ "needs_tools": true/false, "tool_type": "search/file/calculation/none", "reasoning": "uzasadnienie" }} """ intent_analysis = self.send_message(intent_prompt) # Parsowanie odpowiedzi i wykonanie akcji return self._execute_action(user_input, intent_analysis)

System podejmowania decyzji

Agent musi umieć wybierać odpowiednie narzędzia:

python
def _execute_action(self, user_input, intent_analysis): try: import json intent_data = json.loads(intent_analysis) if intent_data.get('needs_tools'): tool_type = intent_data.get('tool_type') if tool_type == 'search': search_results = self.tools.web_search(user_input) return self._generate_response_with_data(user_input, search_results) elif tool_type == 'file': return self._handle_file_operation(user_input) # Standardowa odpowiedź bez narzędzi return self.send_message(user_input) except json.JSONDecodeError: # Fallback dla błędów parsowania return self.send_message(user_input)

Dodawanie zaawansowanych funkcjonalności

Integracja z API zewnętrznymi

Tutorial AI agent nie byłby kompletny bez pokazania integracji z prawdziwymi serwisami:

python
class AdvancedTools(AgentTools): def __init__(self): self.weather_api_key = os.getenv('WEATHER_API_KEY') def get_weather(self, city): url = f"http://api.openweathermap.org/data/2.5/weather" params = { 'q': city, 'appid': self.weather_api_key, 'units': 'metric', 'lang': 'pl' } response = requests.get(url, params=params) if response.status_code == 200: data = response.json() return { 'temperature': data['main']['temp'], 'description': data['weather'][0]['description'], 'humidity': data['main']['humidity'] } return None def send_email_notification(self, recipient, subject, body): # Implementacja wysyłania emaili import smtplib from email.mime.text import MIMEText # Konfiguracja SMTP server = smtplib.SMTP('smtp.gmail.com', 587) server.starttls() # Implementacja wysyłania

System harmonogramowania zadań

Agent może wykonywać zadania w określonych intervalach:

python
import schedule import threading import time class ScheduledAgent(SmartAgent): def __init__(self): super().__init__() self.scheduler_running = False def schedule_task(self, task_description, interval_minutes): def job(): prompt = f"Wykonaj następujące zadanie: {task_description}" result = self.process_request(prompt) print(f"Zadanie wykonane: {result}") schedule.every(interval_minutes).minutes.do(job) if not self.scheduler_running: self._start_scheduler() def _start_scheduler(self): def run_scheduler(): self.scheduler_running = True while self.scheduler_running: schedule.run_pending() time.sleep(60) thread = threading.Thread(target=run_scheduler) thread.daemon = True thread.start()

Persystencja danych

Agent powinien pamiętać informacje między sesjami:

python
import json import sqlite3 from datetime import datetime class PersistentAgent(ScheduledAgent): def __init__(self, db_path='agent_memory.db'): super().__init__() self.db_path = db_path self._init_database() def _init_database(self): conn = sqlite3.connect(self.db_path) cursor = conn.cursor() cursor.execute(''' CREATE TABLE IF NOT EXISTS conversations ( id INTEGER PRIMARY KEY AUTOINCREMENT, timestamp DATETIME, user_input TEXT, agent_response TEXT ) ''') conn.commit() conn.close() def save_interaction(self, user_input, agent_response): conn = sqlite3.connect(self.db_path) cursor = conn.cursor() cursor.execute(''' INSERT INTO conversations (timestamp, user_input, agent_response) VALUES (?, ?, ?) ''', (datetime.now(), user_input, agent_response)) conn.commit() conn.close()

Testowanie i debugowanie agenta

Unit testy

Utwórz testy sprawdzające poszczególne komponenty:

python
import unittest from unittest.mock import patch, MagicMock class TestClaudeAgent(unittest.TestCase): def setUp(self): self.agent = SmartAgent() @patch('anthropic.Anthropic') def test_send_message(self, mock_anthropic): # Mock odpowiedzi API mock_response = MagicMock() mock_response.content = [MagicMock(text="Test response")] mock_client = MagicMock() mock_client.messages.create.return_value = mock_response mock_anthropic.return_value = mock_client result = self.agent.send_message("Test message") self.assertEqual(result, "Test response") def test_context_manager(self): context = ContextManager(max_history=2) context.add_interaction("Pytanie 1", "Odpowiedź 1") context.add_interaction("Pytanie 2", "Odpowiedź 2") context.add_interaction("Pytanie 3", "Odpowiedź 3") self.assertEqual(len(context.memory), 2) self.assertEqual(context.memory[0]['user'], "Pytanie 2") if __name__ == '__main__': unittest.main()

Monitoring i logi

Dodaj system logowania do śledzenia działania agenta:

python
import logging from datetime import datetime class MonitoredAgent(PersistentAgent): def __init__(self, db_path='agent_memory.db'): super().__init__(db_path) self._setup_logging() def _setup_logging(self): logging.basicConfig( level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s', handlers=[ logging.FileHandler('agent.log'), logging.StreamHandler() ] ) self.logger = logging.getLogger(__name__) def process_request(self, user_input): self.logger.info(f"Processing request: {user_input[:100]}...") try: response = super().process_request(user_input) self.logger.info(f"Response generated successfully") return response except Exception as e: self.logger.error(f"Error processing request: {str(e)}") return "Przepraszam, wystąpił błąd podczas przetwarzania Twojego zapytania."

Metryki wydajności

Śledź kluczowe wskaźniki działania agenta:

python
import time from collections import defaultdict class MetricsAgent(MonitoredAgent): def __init__(self, db_path='agent_memory.db'): super().__init__(db_path) self.metrics = defaultdict(list) def process_request_with_metrics(self, user_input): start_time = time.time() response = self.process_request(user_input) end_time = time.time() processing_time = end_time - start_time self.metrics['response_times'].append(processing_time) self.metrics['request_count'].append(1) self.logger.info(f"Request processed in {processing_time:.2f} seconds") return response def get_performance_stats(self): if not self.metrics['response_times']: return "Brak danych o wydajności" avg_time = sum(self.metrics['response_times']) / len(self.metrics['response_times']) total_requests = sum(self.metrics['request_count']) return f""" Statystyki wydajności: - Średni czas odpowiedzi: {avg_time:.2f}s - Łączna liczba zapytań: {total_requests} - Najdłuższy czas odpowiedzi: {max(self.metrics['response_times']):.2f}s """

Optymalizacja i najlepsze praktyki

Zarządzanie tokenami

Claude ma limity tokenów, więc optymalizuj zapytania:

python
class OptimizedAgent(MetricsAgent): def __init__(self, db_path='agent_memory.db'): super().__init__(db_path) self.max_context_tokens = 4000 def _truncate_context(self, text, max_tokens): # Proste przybliżenie: 1 token ≈ 4 znaki max_chars = max_tokens * 4 if len(text) > max_chars: return text[-max_chars:] return text def send_message_optimized(self, message): # Ogranicz kontekst do najważniejszych informacji truncated_message = self._truncate_context(message, self.max_context_tokens) return super().send_message(truncated_message, max_tokens=1000)

Cache'owanie odpowiedzi

Uniknij powtarzania kosztownych zapytań:

python
import hashlib from functools import lru_cache class CachedAgent(OptimizedAgent): def __init__(self, db_path='agent_memory.db'): super().__init__(db_path) self.response_cache = {} def _get_cache_key(self, message): return hashlib.md5(message.encode()).hexdigest() def send_message_cached(self, message, use_cache=True): if not use_cache: return self.send_message_optimized(message) cache_key = self._get_cache_key(message) if cache_key in self.response_cache: self.logger.info("Using cached response") return self.response_cache[cache_key] response = self.send_message_optimized(message) self.response_cache[cache_key] = response return response

Jeśli chcesz pogłębić swoją wiedzę o budowie agentów AI i nauczyć się zaawansowanych technik automatyzacji, polecam kurs AI Agents: Budowanie Autonomicznych Asystentów. Program obejmuje praktyczne projekty, integracje z popularnymi API oraz strategie wdrażania agentów w biznesie. Z kodem BLOG15 otrzymasz 15% zniżki na całość kursu.

FAQ - Najczęściej zadawane pytania

Ile kosztuje korzystanie z Claude API?

Ceny Claude API zależą od modelu i liczby tokenów. Claude-3 Sonnet kosztuje około $3 za milion tokenów wejściowych i $15 za milion tokenów wyjściowych. Dla prostego agenta obsługującego 100-200 zapytań dziennie, miesięczny koszt to około $10-30.

Czy mogę uruchomić agenta na własnym serwerze?

Tak, możesz wdrożyć agenta na dowolnym serwerze z Pythonem 3.8+. Popularne opcje to DigitalOcean, AWS EC2, czy Google Cloud. Pamiętaj o zabezpieczeniu klucza API i regularnych backup'ach bazy danych.

Jakie są ograniczenia Claude w porównaniu do GPT-4?

Claude charakteryzuje się większym kontekstem (200k vs 32k tokenów), lepszym bezpieczeństwem i odmową szkodliwych zapytań. GPT-4 ma szerszą bazę wtyczek i integracji. Wybór zależy od konkretnego przypadku użycia.

Jak dodać obsługę języka polskiego?

Claude natywnie obsługuje język polski. W promptach używaj polskich instrukcji, a model automatycznie dostosuje odpowiedzi. Dla lepszych rezultatów, dodaj na początku rozmowy: "Odpowiadaj zawsze w języku polskim, używając naturalnych zwrotów."

Czy agent może integrować się z bazami danych?

Tak, agent może łączyć się z dowolnymi bazami danych przez odpowiednie sterowniki Python (psycopg2 dla PostgreSQL, pymongo dla MongoDB, etc.). Pamiętaj o implementacji proper validation i sanitization zapytań SQL aby uniknąć injection attacks.

Udostępnij artykuł