209 lines
5.9 KiB
Markdown
209 lines
5.9 KiB
Markdown
# 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
|
|
```
|