docs: add API guide for AI agents
Complete reference for interacting with OpusAgent: auth, async flow, multi-turn sessions, model resolution, summarization, and error handling. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,264 @@
|
||||
# OpusAgent - Guida per Agenti AI
|
||||
|
||||
Questo documento spiega come interagire con l'API REST di OpusAgent.
|
||||
OpusAgent e' un proxy che inoltra richieste ai modelli Claude tramite Claude Code SDK.
|
||||
|
||||
## Informazioni base
|
||||
|
||||
- **Base URL**: `https://opus-agent.tielogic.xyz`
|
||||
- **Autenticazione**: header `X-Api-Key` obbligatorio su ogni richiesta
|
||||
- **Formato risposte**: JSON con envelope `{"success": bool, "data": any, "error": {"code": str, "message": str} | null}`
|
||||
- **Elaborazione asincrona**: le richieste vengono accodate e processate sequenzialmente (FIFO)
|
||||
|
||||
## Flusso operativo
|
||||
|
||||
### 1. Crea un topic
|
||||
|
||||
Un topic definisce il contesto della conversazione (system prompt) e opzionalmente un modello di default.
|
||||
|
||||
```
|
||||
POST /api/topics
|
||||
Content-Type: application/json
|
||||
X-Api-Key: TUA_KEY
|
||||
|
||||
{
|
||||
"name": "analisi-dati",
|
||||
"system_prompt": "Sei un esperto analista dati. Rispondi in italiano.",
|
||||
"model": "sonnet" // opzionale, default dal server
|
||||
}
|
||||
```
|
||||
|
||||
Risposta (201):
|
||||
```json
|
||||
{
|
||||
"success": true,
|
||||
"data": {
|
||||
"id": "uuid-del-topic",
|
||||
"name": "analisi-dati",
|
||||
"system_prompt": "...",
|
||||
"summary": "",
|
||||
"model": "sonnet",
|
||||
"created_at": "...",
|
||||
"updated_at": "..."
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 2. Invia una richiesta
|
||||
|
||||
Le richieste vengono accodate e processate in background. La risposta immediata e' un 202 Accepted con l'ID della richiesta.
|
||||
|
||||
```
|
||||
POST /api/requests
|
||||
Content-Type: application/json
|
||||
X-Api-Key: TUA_KEY
|
||||
|
||||
{
|
||||
"topic_id": "uuid-del-topic",
|
||||
"prompt": "Analizza i trend di vendita Q1 2026",
|
||||
"model": "opus", // opzionale, sovrascrive il modello del topic
|
||||
"session_id": "new", // opzionale, per conversazioni multi-turn
|
||||
"summarize": true // opzionale, genera riassunto incrementale nel topic
|
||||
}
|
||||
```
|
||||
|
||||
Risposta (202):
|
||||
```json
|
||||
{
|
||||
"success": true,
|
||||
"data": {
|
||||
"id": "uuid-della-richiesta",
|
||||
"session_id": null,
|
||||
"status": "pending",
|
||||
"created_at": "..."
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 3. Attendi il risultato (polling)
|
||||
|
||||
Interroga periodicamente lo stato della richiesta fino a `status: "completed"` o `status: "failed"`.
|
||||
|
||||
```
|
||||
GET /api/requests/{id}
|
||||
X-Api-Key: TUA_KEY
|
||||
```
|
||||
|
||||
Risposta quando completata:
|
||||
```json
|
||||
{
|
||||
"success": true,
|
||||
"data": {
|
||||
"id": "uuid-della-richiesta",
|
||||
"session_id": "sdk-conversation-id",
|
||||
"topic_id": "uuid-del-topic",
|
||||
"prompt": "Analizza i trend di vendita Q1 2026",
|
||||
"model": "opus",
|
||||
"summarize": true,
|
||||
"status": "completed",
|
||||
"result": "Risposta di Claude...",
|
||||
"error": null,
|
||||
"created_at": "...",
|
||||
"completed_at": "...",
|
||||
"sdk_conversation_id": "sdk-uuid"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**Intervallo di polling consigliato**: 2-3 secondi. Il tempo medio di risposta e' 3-5 secondi per richieste semplici.
|
||||
|
||||
**Stati possibili**: `pending` -> `processing` -> `completed` | `failed`
|
||||
|
||||
## Conversazioni multi-turn
|
||||
|
||||
Per mantenere il contesto tra messaggi successivi, usa le sessioni.
|
||||
|
||||
### Prima richiesta
|
||||
|
||||
Invia con `"session_id": "new"` oppure un ID personalizzato a tua scelta.
|
||||
|
||||
```json
|
||||
{
|
||||
"topic_id": "uuid",
|
||||
"prompt": "Mi chiamo Marco. Lavorero' su un progetto Python.",
|
||||
"session_id": "new"
|
||||
}
|
||||
```
|
||||
|
||||
Il `session_id` nella risposta 202 sara' `null`. Dopo il completamento, il campo `session_id` conterra' l'ID della conversazione generato dall'SDK.
|
||||
|
||||
### Richieste successive
|
||||
|
||||
Usa il `session_id` ottenuto dal risultato della prima richiesta completata.
|
||||
|
||||
```json
|
||||
{
|
||||
"topic_id": "uuid",
|
||||
"prompt": "Come mi chiamo? Su cosa lavoriamo?",
|
||||
"session_id": "session-id-dal-risultato-precedente"
|
||||
}
|
||||
```
|
||||
|
||||
Claude ricordera' tutto il contesto della conversazione.
|
||||
|
||||
### Session ID personalizzato
|
||||
|
||||
Puoi passare un tuo ID (es. `"progetto-alpha-chat-1"`) invece di `"new"`. Il sistema lo mantiene come identificativo della sessione e gestisce internamente la mappatura con la conversazione SDK.
|
||||
|
||||
### Chiudere una sessione
|
||||
|
||||
```
|
||||
DELETE /api/sessions/{session_id}
|
||||
X-Api-Key: TUA_KEY
|
||||
```
|
||||
|
||||
Dopo la chiusura, nuove richieste con lo stesso `session_id` verranno rifiutate con status 410 Gone.
|
||||
|
||||
## Risoluzione del modello
|
||||
|
||||
Il modello usato segue questa priorita' (dal piu' alto al piu' basso):
|
||||
|
||||
1. **Campo `model` nella richiesta** - sovrascrive tutto
|
||||
2. **Campo `model` nel topic** - default per il topic
|
||||
3. **Variabile d'ambiente `CLAUDE_MODEL`** - default globale del server
|
||||
|
||||
### Valori accettati per il campo model
|
||||
|
||||
Alias corti (consigliati):
|
||||
- `default` - Opus o Sonnet in base ai limiti d'uso
|
||||
- `opus` - Opus 4.1, per task complessi
|
||||
- `sonnet` - Sonnet 4, per uso quotidiano
|
||||
- `opusplan` - Opus in plan mode, Sonnet altrimenti
|
||||
|
||||
Model ID completi:
|
||||
- `claude-opus-4-7`
|
||||
- `claude-sonnet-4-6`
|
||||
- `claude-haiku-4-5-20251001`
|
||||
|
||||
Per ottenere la lista aggiornata dei modelli disponibili:
|
||||
|
||||
```
|
||||
GET /api/models
|
||||
X-Api-Key: TUA_KEY
|
||||
```
|
||||
|
||||
## Riassunti automatici
|
||||
|
||||
### Riassunto incrementale
|
||||
|
||||
Aggiungi `"summarize": true` alla richiesta. Dopo il completamento, una sintesi di 1-2 frasi viene appesa al campo `summary` del topic con la data.
|
||||
|
||||
### Riassunto completo
|
||||
|
||||
Rigenera il riassunto del topic analizzando tutte le richieste completate:
|
||||
|
||||
```
|
||||
POST /api/topics/{id}/summarize
|
||||
X-Api-Key: TUA_KEY
|
||||
```
|
||||
|
||||
Il summary viene sovrascritto con un'overview completa di tutte le interazioni.
|
||||
|
||||
## Riferimento completo degli endpoint
|
||||
|
||||
| Metodo | Endpoint | Descrizione |
|
||||
|--------|----------|-------------|
|
||||
| GET | `/api/health` | Stato del sistema (DB, worker) |
|
||||
| GET | `/api/models` | Modelli Claude disponibili |
|
||||
| POST | `/api/topics` | Crea topic |
|
||||
| GET | `/api/topics` | Lista topic |
|
||||
| GET | `/api/topics/{id}` | Dettaglio topic |
|
||||
| PUT | `/api/topics/{id}` | Aggiorna topic |
|
||||
| DELETE | `/api/topics/{id}` | Elimina topic (fallisce se ha richieste pendenti) |
|
||||
| POST | `/api/topics/{id}/summarize` | Rigenera riassunto completo |
|
||||
| POST | `/api/requests` | Invia richiesta (202 Accepted) |
|
||||
| GET | `/api/requests` | Lista richieste (filtri: `?status=`, `?topic_id=`, `?session_id=`) |
|
||||
| GET | `/api/requests/{id}` | Stato e risultato richiesta |
|
||||
| DELETE | `/api/requests/{id}` | Elimina richiesta pendente |
|
||||
| GET | `/api/sessions` | Lista sessioni attive |
|
||||
| DELETE | `/api/sessions/{id}` | Chiudi sessione |
|
||||
|
||||
## Gestione errori
|
||||
|
||||
Le risposte di errore seguono lo stesso formato envelope:
|
||||
|
||||
```json
|
||||
{
|
||||
"success": false,
|
||||
"data": null,
|
||||
"error": {
|
||||
"code": "NOT_FOUND",
|
||||
"message": "Topic not found"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Codici HTTP comuni:
|
||||
- **202**: richiesta accettata e accodata
|
||||
- **400**: parametri mancanti o invalidi
|
||||
- **403**: API key mancante o errata
|
||||
- **404**: risorsa non trovata
|
||||
- **409**: conflitto (es. nome topic duplicato)
|
||||
- **410**: sessione chiusa
|
||||
- **429**: rate limit superato
|
||||
|
||||
## Rate limiting
|
||||
|
||||
Le richieste `POST /api/requests` sono limitate per API key:
|
||||
- **Per minuto**: configurabile (default 10)
|
||||
- **Per ora**: configurabile (default 100)
|
||||
|
||||
Le altre operazioni (lettura, topic CRUD) non hanno limiti.
|
||||
|
||||
## Esempio completo di workflow
|
||||
|
||||
```
|
||||
1. GET /api/models -> scegli il modello
|
||||
2. POST /api/topics -> crea il contesto
|
||||
3. POST /api/requests (session_id=new) -> primo messaggio
|
||||
4. GET /api/requests/{id} -> polling fino a completed
|
||||
5. POST /api/requests (session_id=...) -> messaggi successivi
|
||||
6. GET /api/requests/{id} -> polling risultato
|
||||
7. POST /api/topics/{id}/summarize -> riassunto finale
|
||||
8. DELETE /api/sessions/{id} -> chiudi sessione
|
||||
```
|
||||
Reference in New Issue
Block a user