diff --git a/CLAUDE.md b/CLAUDE.md index 51f9c89..1ebeabb 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -45,7 +45,7 @@ Client → Traefik (HTTPS) → FastAPI (Python, :8000) ↔ Node.js Worker (:3001 Three tables in SQLite: - **topics**: id (UUID), name (unique), system_prompt, summary, model (nullable), timestamps -- **requests**: id (UUID), session_id, topic_id (FK), prompt, result, error, model, summarize (bool), status (pending/processing/completed/failed), timestamps +- **requests**: id (UUID), session_id, sdk_conversation_id, topic_id (FK), prompt, result, error, model, summarize (bool), status (pending/processing/completed/failed), timestamps - **closed_sessions**: session_id (PK), closed_at ## API Endpoints @@ -62,12 +62,18 @@ All require `X-Api-Key` header. All responses use envelope: `{success, data, err 1. `POST /api/requests` → 202 Accepted (queued) 2. Background loop picks oldest pending, calls worker `POST /process` -3. Worker runs Claude Code SDK (`query()`) with optional session resume -4. Result stored in DB; optional incremental summary appended to topic +3. Worker runs Claude Code SDK (`query()` async iterable) with optional session resume +4. Result stored in DB; SDK conversation ID saved in `sdk_conversation_id`; optional incremental summary appended to topic 5. Client polls `GET /api/requests/{id}` for result Model resolution: request-level > topic-level > `CLAUDE_MODEL` env var. +### Multi-turn sessions + +- `session_id: "new"` → stored as NULL; after completion, set to SDK's conversation ID +- Custom `session_id` → preserved as-is; SDK conversation ID stored separately in `sdk_conversation_id` +- Resume logic: queue looks up `sdk_conversation_id` from previous completed requests in the same session; only passes it to worker if found (avoids resume on non-existent SDK sessions) + ## Commands ```bash diff --git a/README.md b/README.md index 7b4080a..8b66527 100644 --- a/README.md +++ b/README.md @@ -81,3 +81,23 @@ curl -X POST http://localhost:8000/api/requests \ curl http://localhost:8000/api/requests/ID_RICHIESTA \ -H "X-Api-Key: TUA_KEY" ``` + +### Sessioni multi-turn + +```bash +# Primo messaggio: session_id "new" o un ID personalizzato +curl -X POST http://localhost:8000/api/requests \ + -H "X-Api-Key: TUA_KEY" \ + -H "Content-Type: application/json" \ + -d '{"prompt": "Mi chiamo Marco.", "topic_id": "ID_TOPIC", "session_id": "new"}' + +# Il risultato contiene il session_id (generato dall'SDK) +# Usalo per i messaggi successivi nella stessa conversazione +curl -X POST http://localhost:8000/api/requests \ + -H "X-Api-Key: TUA_KEY" \ + -H "Content-Type: application/json" \ + -d '{"prompt": "Come mi chiamo?", "topic_id": "ID_TOPIC", "session_id": "SESSION_ID_DAL_RISULTATO"}' +``` + +Il campo `sdk_conversation_id` nella risposta contiene l'ID interno della conversazione +Claude Code SDK, usato automaticamente per il resume nei turni successivi.