260121: Documentación Captain Claude API v3

This commit is contained in:
ARCHITECT
2026-01-21 19:37:35 +00:00
parent 1f26cd78c4
commit 787babf6c2

View File

@@ -0,0 +1,230 @@
# Captain Claude API v3
API para interactuar con Claude Code desde aplicaciones móviles/web.
## Información General
| Campo | Valor |
|-------|-------|
| **Servidor** | ARCHITECT (69.62.126.110) |
| **Puerto** | 3030 |
| **Protocolo** | HTTP + WebSocket |
| **Dominio externo** | captain.tzzrarchitect.me |
| **Ubicación código** | `/home/architect/captain-claude/apps/captain-mobile-v2/backend/captain_api_v3.py` |
## Autenticación
JWT Bearer Token. Obtener via `/auth/login`.
```bash
curl -X POST https://captain.tzzrarchitect.me/auth/login \
-H "Content-Type: application/json" \
-d '{"username":"admin","password":"***"}'
```
Respuesta:
```json
{
"token": "eyJ...",
"username": "admin"
}
```
## Endpoints REST
### GET /health
Estado del servicio.
```json
{"status": "ok", "version": "3.0.0"}
```
### POST /auth/login
Autenticación.
**Request:**
```json
{
"username": "string",
"password": "string"
}
```
**Response:**
```json
{
"token": "string",
"username": "string"
}
```
### GET /sessions
Lista sesiones activas. Requiere Bearer token.
**Response:**
```json
[
{
"session_id": "abc123...",
"name": "Mi sesión"
}
]
```
### POST /sessions
Crear nueva sesión. Requiere Bearer token.
**Request:**
```json
{
"name": "Nombre de la sesión"
}
```
**Response:**
```json
{
"session_id": "abc123...",
"name": "Nombre de la sesión"
}
```
## WebSocket
### Endpoint
```
wss://captain.tzzrarchitect.me/ws/chat
```
### Flujo de conexión
1. Conectar al WebSocket
2. Enviar autenticación:
```json
{"type": "auth", "token": "eyJ..."}
```
3. Recibir confirmación con sesiones existentes:
```json
{
"type": "init",
"sessions": [{"session_id": "...", "name": "..."}]
}
```
### Mensajes Cliente → Servidor
#### Crear sesión
```json
{
"type": "create_session",
"name": "Nombre de la sesión"
}
```
#### Conectar a sesión existente
```json
{
"type": "connect_session",
"session_id": "abc123..."
}
```
#### Enviar mensaje a Claude
```json
{
"type": "message",
"content": "Hola Claude"
}
```
### Mensajes Servidor → Cliente
#### Sesión creada
```json
{
"type": "session_created",
"session_id": "abc123...",
"name": "Nombre"
}
```
#### Conectado a sesión
```json
{
"type": "session_connected",
"session_id": "abc123...",
"name": "Nombre"
}
```
#### Output de Claude (streaming)
```json
{
"type": "output",
"content": "Texto de respuesta..."
}
```
#### Respuesta completada
```json
{
"type": "done",
"session_id": "uuid-de-claude"
}
```
#### Error
```json
{
"type": "error",
"message": "Descripción del error"
}
```
## Arquitectura
```
┌─────────────┐ HTTPS/WSS ┌─────────────┐
│ App Móvil │ ◄────────────────► │ Caddy │
│ (Flutter) │ │ (reverse │
└─────────────┘ │ proxy) │
└──────┬──────┘
│ :3030
┌──────▼──────┐
│ Captain API │
│ v3 (uvicorn)│
└──────┬──────┘
│ subprocess
┌──────▼──────┐
│ Claude Code │
│ (claude -p) │
└─────────────┘
```
## Notas
- **Sin screen**: v3 usa `claude -p` directamente como subprocess, no sesiones screen
- **Session ID**: El `session_id` inicial es temporal. Después del primer mensaje, se actualiza con el UUID real de Claude para poder hacer `--resume`
- **Streaming**: Las respuestas se envían en tiempo real vía WebSocket
- **Concurrencia**: Una sesión solo procesa un mensaje a la vez
## Servicio systemd
```ini
[Unit]
Description=Captain Claude API v3
After=network.target
[Service]
Type=simple
User=architect
WorkingDirectory=/home/architect/captain-claude/apps/captain-mobile-v2/backend
ExecStart=/home/architect/captain-claude/apps/captain-mobile-v2/backend/venv/bin/uvicorn captain_api_v3:app --host 0.0.0.0 --port 3030
Restart=always
[Install]
WantedBy=multi-user.target
```
---
*Última actualización: 2026-01-21*