260121: Documentación Captain Claude API v3
This commit is contained in:
230
02_COMPONENTES/internos/captain_claude_api_v3.md
Normal file
230
02_COMPONENTES/internos/captain_claude_api_v3.md
Normal 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*
|
||||
Reference in New Issue
Block a user