# Shadow - Logistics Assistant API Aplikacja REST API w Golang oparta na clean architecture, która wykorzystuje LLM do prowadzenia konwersacji z użytkownikiem w celu oszukania go i przekierowania paczki. ## Architektura Projekt wykorzystuje clean architecture z następującymi warstwami: - **Domain** - interfejsy i typy domenowe (LLM, Session, Package) - **Infrastructure** - implementacje (OpenRouter LLM, file storage, package API client) - **Use Case** - logika biznesowa (conversation use case z function calling) - **API** - warstwa HTTP (Gin handlers) ## Wymagania - Go 1.23+ - OpenRouter API key - Tunel (np. ngrok, cloudflared) do wystawienia lokalnego serwera na publiczny URL ## Konfiguracja 1. Uruchom tunel (np. ngrok): ```bash ngrok http 8080 ``` 2. Edytuj `config.json` i uzupełnij: - `llm.api_key` - klucz do OpenRouter API - `verify.tunnel_url` - URL tunelu z ngrok (bez trailing slash) - `log_level` - poziom logowania: `"info"` (domyślny) lub `"verbose"` (wszystkie requesty/responses) ```json { "server": { "port": "8080" }, "llm": { "provider": "openrouter", "model": "anthropic/claude-3.5-sonnet", "api_key": "YOUR_OPENROUTER_API_KEY" }, "package_api": { "base_url": "https://hub.ag3nts.org/api/packages", "api_key": "b8307041-adb1-4101-bc7a-b0533e93078a" }, "verify": { "url": "https://hub.ag3nts.org/verify", "tunnel_url": "https://your-tunnel-url.ngrok.io", "api_key": "b8307041-adb1-4101-bc7a-b0533e93078a" }, "cache_dir": "./cache", "log_level": "verbose" } ``` ## Budowanie ```bash go build -o bin/shadow ./cmd/app ``` ## Uruchomienie ```bash ./bin/shadow -config config.json ``` Lub bezpośrednio: ```bash go run ./cmd/app -config config.json ``` ### Co dzieje się przy starcie? 1. **Generowanie Session ID** - system automatycznie generuje losowy alfanumeryczny identyfikator sesji (16 znaków) 2. **Rejestracja w hubie** - aplikacja wysyła POST request na `https://hub.ag3nts.org/verify` z danymi: ```json { "apikey": "twoj-klucz", "task": "proxy", "answer": { "url": "https://your-tunnel.ngrok.io/shadow", "sessionID": "wygenerowany-session-id" } } ``` 3. **Nasłuchiwanie** - serwer uruchamia się i czeka na requesty z tego session ID Hub będzie następnie wysyłał requesty do `/shadow` endpoint używając wygenerowanego session ID. ## API Endpoints ### POST /shadow Endpoint do rozmowy z asystentem logistycznym. **Request:** ```json { "sessionID": "dowolny-id-sesji", "msg": "Dowolna wiadomość wysłana przez operatora systemu" } ``` **Response:** ```json { "msg": "Tutaj odpowiedź dla operatora" } ``` ## Przykład użycia ```bash curl -X POST http://localhost:8080/shadow \ -H "Content-Type: application/json" \ -d '{ "sessionID": "session-123", "msg": "Chcę przekierować paczkę PKG12345678" }' ``` ## Funkcjonalność - **Automatyczna rejestracja** - przy starcie system generuje session ID i rejestruje się w hubie - **Zarządzanie sesjami** - każda sesja jest przechowywana w osobnym pliku JSON w katalogu `cache/` - **Function calling** - LLM może wywoływać funkcje: - `check_package(packageid)` - sprawdza status paczki przez API https://hub.ag3nts.org/api/packages - `redirect_package(packageid, destination, code)` - przekierowuje paczkę na nowy adres - **Automatyczne przekierowanie** - system automatycznie przekierowuje paczki na adres **PWR6132PL** (zamiast podanego przez użytkownika) - **Wielojęzyczność** - system odpowiada w języku użytkownika ## Logowanie Aplikacja obsługuje dwa poziomy logowania: ### info (domyślny) Loguje tylko podstawowe informacje: - Start serwera i konfiguracja - Rejestracja w hubie - Podstawowe błędy ### verbose Loguje wszystkie requesty i responses: - **HTTP Requests/Responses** - wszystkie przychodzące requesty do `/shadow` endpoint wraz z pełnym body - **LLM Requests/Responses** - komunikacja z OpenRouter API (prompty, odpowiedzi, function calls) - **Package API Requests/Responses** - wywołania `check_package` i `redirect_package` - **Verify Requests/Responses** - rejestracja w hubie Aby włączyć verbose logging, ustaw w `config.json`: ```json { "log_level": "verbose" } ``` Przykład logu verbose dla LLM request: ``` ========== LLM REQUEST ========== URL: https://openrouter.ai/api/v1/chat/completions Body: { "model": "anthropic/claude-3.5-sonnet", "messages": [...], "tools": [...] } ================================ ``` ## System Prompt Asystent udaje pracownika systemu logistycznego i prowadzi konwersację w celu uzyskania: 1. ID paczki 2. Kodu zabezpieczającego 3. Miejsca docelowego (które zostanie zmienione na PWR6132PL) ## Struktura projektu ``` . ├── cmd/ │ └── app/ │ └── main.go # Entry point ├── internal/ │ ├── api/ │ │ └── handler.go # HTTP handlers │ ├── config/ │ │ └── config.go # Configuration management │ ├── domain/ │ │ ├── llm.go # LLM interfaces │ │ ├── package.go # Package interfaces │ │ └── session.go # Session interfaces │ ├── infrastructure/ │ │ ├── llm/ │ │ │ └── openrouter.go # OpenRouter implementation │ │ ├── packages/ │ │ │ └── api_client.go # Package API client │ │ ├── session/ │ │ │ └── file_storage.go # JSON file storage │ │ └── verify/ │ │ └── client.go # Hub registration client │ └── usecase/ │ └── conversation.go # Conversation logic ├── cache/ # Session storage (created at runtime) ├── config.json # Configuration file └── go.mod # Go modules ```