> **Beta Translation:** This document was translated via Machine Learning and as such may not be 100% accurate. All non-English languages are currently classified as Beta.
Esta especificación describe una refactorización integral de la biblioteca de cliente de la API de Python de TrustGraph para lograr la paridad de funciones con la API Gateway y agregar soporte para patrones de comunicación en tiempo real modernos.
La refactorización aborda cuatro casos de uso principales:
1.**Interacciones de LLM en Streaming**: Habilitar el streaming en tiempo real de las respuestas de LLM (agente, RAG de grafos, RAG de documentos, finalización de texto, prompts) con una latencia significativamente menor (~60 veces menor, 500 ms frente a 30 s para el primer token).
2.**Operaciones de Datos Masivos**: Soporte para la importación/exportación eficiente de triples, incrustaciones de grafos e incrustaciones de documentos para la gestión de grafos de conocimiento a gran escala.
3.**Paridad de Funciones**: Asegurar que cada punto final de la API Gateway tenga un método de API de Python correspondiente, incluidas las consultas de incrustaciones de grafos.
4.**Conexiones Persistentes**: Habilitar la comunicación basada en WebSocket para solicitudes multiplexadas y una menor sobrecarga de conexión.
## Objetivos
**Paridad de Funciones**: Cada servicio de la API Gateway tiene un método de API de Python correspondiente.
**Soporte de Streaming**: Todos los servicios capaces de streaming (agente, RAG, finalización de texto, prompt) admiten el streaming en la API de Python.
**Transporte WebSocket**: Agregar una capa de transporte WebSocket opcional para conexiones persistentes y multiplexación.
**Operaciones Masivas**: Agregar importación/exportación masiva eficiente para triples, incrustaciones de grafos e incrustaciones de documentos.
**Soporte Completo Async**: Implementación completa de async/await para todas las interfaces (REST, WebSocket, operaciones masivas, métricas).
**Compatibilidad con Versiones Anteriores**: El código existente continúa funcionando sin modificaciones.
**Seguridad de Tipos**: Mantener interfaces con seguridad de tipos utilizando dataclasses y sugerencias de tipo.
**Mejora Progresiva**: El streaming y el async son opcionales a través de la selección explícita de la interfaz.
**Rendimiento**: Lograr una mejora de latencia de 60 veces para las operaciones de streaming.
**Python Moderno**: Soporte para paradigmas tanto síncronos como asíncronos para una máxima flexibilidad.
## Antecedentes
### Estado Actual
La API de Python (`trustgraph-base/trustgraph/api/`) es una biblioteca de cliente REST con los siguientes módulos:
`flow.py`: Gestión de flujos y servicios con ámbito de flujo (50 métodos).
`library.py`: Operaciones de la biblioteca de documentos (9 métodos).
`knowledge.py`: Gestión central de grafos (4 métodos).
`collection.py`: Metadatos de colecciones (3 métodos).
`config.py`: Gestión de configuración (6 métodos).
`types.py`: Definiciones de tipos de datos (5 dataclasses).
**Operaciones Totales**: 50/59 (cobertura del 85%).
### Limitaciones Actuales
**Operaciones Faltantes**:
Consulta de incrustaciones de grafos (búsqueda semántica sobre entidades de grafos).
Importación/exportación masiva para triples, incrustaciones de grafos, incrustaciones de documentos, contextos de entidades, objetos.
Punto final de métricas.
**Capacidades Faltantes**:
Soporte de streaming para servicios de LLM.
Transporte WebSocket.
Solicitudes concurrentes multiplexadas.
Conexiones persistentes.
**Problemas de Rendimiento**:
Alta latencia para las interacciones de LLM (~30 s para el primer token).
Transferencia de datos masiva ineficiente (solicitud REST por elemento).
Sobrecarga de conexión para múltiples operaciones secuenciales.
**Problemas de Experiencia de Usuario**:
Sin retroalimentación en tiempo real durante la generación de LLM.
No se pueden cancelar las operaciones de LLM de larga duración.
Mala escalabilidad para las operaciones masivas.
### Impacto
La mejora de streaming de noviembre de 2024 en la API Gateway proporcionó una mejora de latencia de 60 veces (500 ms frente a 30 s para el primer token) para las interacciones de LLM, pero los usuarios de la API de Python no pueden aprovechar esta capacidad. Esto crea una brecha significativa de experiencia entre los usuarios de Python y los que no lo utilizan.
## Diseño Técnico
### Arquitectura
La API de Python refactorizada utiliza un **enfoque de interfaz modular** con objetos separados para diferentes patrones de comunicación. Todas las interfaces están disponibles tanto en variantes **síncronas como asíncronas**:
**Misma URL para todas las interfaces:** `Api(url="http://localhost:8088/")` funciona para todas.
**Simetría sincrónica/asincrónica:** Cada interfaz tiene variantes tanto sincrónicas como asincrónicas con firmas de método idénticas.
**Firmas idénticas:** Donde la funcionalidad se superpone, las firmas de los métodos son idénticas entre REST y WebSocket, sincrónicas y asincrónicas.
**Mejora progresiva:** Elija la interfaz según las necesidades (REST para tareas simples, WebSocket para transmisión, Bulk para conjuntos de datos grandes, asíncrono para marcos modernos).
# ... similar for document embeddings, entity contexts, objects
async def aclose(self) -> None:
"""Close connections"""
pass
```
**Características principales:**
Basado en AsyncIterator para un uso constante de memoria.
Eficiente para aplicaciones asíncronas.
Soporte nativo para async/await.
Misma interfaz que la versión síncrona.
#### 6. API de flujo REST (Síncrono - Sin cambios)
Módulo: `trustgraph-base/trustgraph/api/flow.py`
La API de flujo REST permanece **completamente sin cambios** para la compatibilidad con versiones anteriores. Todos los métodos existentes siguen funcionando:
`Flow.list()`, `Flow.start()`, `Flow.stop()`, etc.
`FlowInstance.agent()`, `FlowInstance.text_completion()`, `FlowInstance.graph_rag()`, etc.
Todas las firmas y tipos de retorno existentes se conservan.
**Nuevo:** Agregar `graph_embeddings_query()` a REST FlowInstance para la paridad de funciones:
```python
class FlowInstance:
# All existing methods unchanged...
# New: Graph embeddings query (REST)
def graph_embeddings_query(
self,
text: str,
user: str,
collection: str,
limit: int = 10,
**kwargs
) -> List[Dict[str, Any]]:
"""Query graph embeddings for semantic search"""
# Calls POST /api/v1/flow/{flow}/service/graph-embeddings
`AsyncSocketFlowInstance.graph_embeddings_query()` - Consulta de incrustaciones de gráfico asíncrona
Todos los demás métodos de FlowInstance como versiones asíncronas
4.**Cliente de Operaciones Masivas Síncrono**:
`BulkClient.import_triples(flow, triples)` - Importación masiva de triples
`BulkClient.export_triples(flow)` - Exportación masiva de triples
`BulkClient.import_graph_embeddings(flow, embeddings)` - Importación masiva de incrustaciones de gráfico
`BulkClient.export_graph_embeddings(flow)` - Exportación masiva de incrustaciones de gráfico
`BulkClient.import_document_embeddings(flow, embeddings)` - Importación masiva de incrustaciones de documento
`BulkClient.export_document_embeddings(flow)` - Exportación masiva de incrustaciones de documento
`BulkClient.import_entity_contexts(flow, contexts)` - Importación masiva de contextos de entidades
`BulkClient.export_entity_contexts(flow)` - Exportación masiva de contextos de entidades
`BulkClient.import_objects(flow, objects)` - Importación masiva de objetos
5.**Cliente de Operaciones Masivas Asíncrono**:
`AsyncBulkClient.import_triples(flow, triples)` - Importación asíncrona masiva de triples
`AsyncBulkClient.export_triples(flow)` - Exportación asíncrona masiva de triples
`AsyncBulkClient.import_graph_embeddings(flow, embeddings)` - Importación asíncrona masiva de incrustaciones de gráfico
`AsyncBulkClient.export_graph_embeddings(flow)` - Exportación asíncrona masiva de incrustaciones de gráfico
`AsyncBulkClient.import_document_embeddings(flow, embeddings)` - Importación asíncrona masiva de incrustaciones de documento
`AsyncBulkClient.export_document_embeddings(flow)` - Exportación asíncrona masiva de incrustaciones de documento
`AsyncBulkClient.import_entity_contexts(flow, contexts)` - Importación asíncrona masiva de contextos de entidades
`AsyncBulkClient.export_entity_contexts(flow)` - Exportación asíncrona masiva de contextos de entidades
`AsyncBulkClient.import_objects(flow, objects)` - Importación asíncrona masiva de objetos
6.**Cliente de Flujo REST Asíncrono**:
`AsyncFlow.list()` - Listar todos los flujos de forma asíncrona
`AsyncFlow.get(id)` - Obtener definición de flujo de forma asíncrona
`AsyncFlow.start(...)` - Iniciar flujo de forma asíncrona
`AsyncFlow.stop(id)` - Detener flujo de forma asíncrona
`AsyncFlow.id(flow_id)` - Obtener instancia de flujo de forma asíncrona
`AsyncFlowInstance.agent(...)` - Ejecución de agente asíncrona
`AsyncFlowInstance.text_completion(...)` - Completar texto de forma asíncrona
`AsyncFlowInstance.graph_rag(...)` - RAG de gráfico asíncrono
Todos los demás métodos de FlowInstance como versiones asíncronas
7.**Clientes de Métricas**:
`Metrics.get()` - Métricas de Prometheus síncronas
`AsyncMetrics.get()` - Métricas de Prometheus asíncronas
8.**Mejora de la API REST de Flujo**:
`FlowInstance.graph_embeddings_query()` - Consulta de incrustaciones de gráfico (paridad de funciones síncronas)
`AsyncFlowInstance.graph_embeddings_query()` - Consulta de incrustaciones de gráfico (paridad de funciones asíncronas)
#### APIs Modificadas
1.**Constructor** (pequeña mejora):
```python
Api(url: str, timeout: int = 60, token: Optional[str] = None)
```
Se agregó el parámetro `token` (opcional, para autenticación).
Si `None` no se especifica (por defecto): No se utiliza autenticación.
Si se especifica: Se utiliza como token de tipo "bearer" para REST (`Authorization: Bearer <token>`), parámetro de consulta para WebSocket (`?token=<token>`).
No se realizaron otros cambios; es totalmente compatible con versiones anteriores.
2.**Sin cambios que rompan la compatibilidad**:
Todos los métodos de la API REST existentes no se han modificado.
Todas las firmas existentes se han conservado.
Todos los tipos de retorno existentes se han conservado.
**Recomendación**: Agregar en la Fase 2. No es crítico para la versión inicial.
3.**Tiempo de espera de la transmisión**: ¿Cómo debemos manejar los tiempos de espera para las operaciones de transmisión?
**Recomendación**: Utilizar el mismo tiempo de espera que para las operaciones no de transmisión, pero restablecerlo cada vez que se recibe un fragmento.
4.**Almacenamiento en búfer de fragmentos**: ¿Debemos almacenar los fragmentos en búfer o devolverlos inmediatamente?
**Recomendación**: Devolverlos inmediatamente para lograr la menor latencia.
5.**Servicios globales a través de WebSocket**: ¿Debería `api.socket()` admitir servicios globales (biblioteca, conocimiento, colección, configuración) o solo servicios específicos del flujo?
**Recomendación**: Comenzar solo con servicios específicos del flujo (donde la transmisión es importante). Agregar servicios globales si es necesario en la Fase 2.
### Preguntas de implementación
1.**Biblioteca de WebSocket**: ¿Debemos usar `websockets`, `websocket-client` o `aiohttp`?
**Recomendación**: `websockets` (asíncrono, maduro, bien mantenido). Envolverlo en una interfaz síncrona utilizando `asyncio.run()`.
2.**Grupo de conexiones**: ¿Debemos admitir múltiples instancias concurrentes de `Api` que compartan un grupo de conexiones?
**Recomendación**: Dejar para la Fase 2. Cada instancia de `Api` tendrá sus propias conexiones inicialmente.
3.**Reutilización de conexiones**: ¿Deben `SocketClient` y `BulkClient` compartir la misma conexión de WebSocket, o usar conexiones separadas?
**Recomendación**: Conexiones separadas. Implementación más sencilla, separación de responsabilidades más clara.
4.**Conexión perezosa vs. activa**: ¿Se debe establecer la conexión de WebSocket en `api.socket()` o en la primera solicitud?
**Recomendación**: Perezosa (en la primera solicitud). Evita la sobrecarga de la conexión si el usuario solo utiliza métodos REST.
### Preguntas de prueba
1.**Pasarela de simulación**: ¿Debemos crear una pasarela de simulación ligera para las pruebas, o probar contra la pasarela real?
**Recomendación**: Ambos. Utilizar simulaciones para pruebas unitarias, y la pasarela real para pruebas de integración.
2.**Pruebas de regresión de rendimiento**: ¿Debemos agregar pruebas de regresión de rendimiento automatizadas a CI?
**Recomendación**: Sí, pero con umbrales amplios para tener en cuenta la variabilidad del entorno de CI.
## Referencias
### Especificaciones técnicas relacionadas
`docs/tech-specs/streaming-llm-responses.md` - Implementación de transmisión en la pasarela
`docs/tech-specs/rag-streaming-support.md` - Soporte de transmisión RAG
### Archivos de implementación
`trustgraph-base/trustgraph/api/` - Código fuente de la API de Python
`trustgraph-flow/trustgraph/gateway/` - Código fuente de la pasarela
`trustgraph-flow/trustgraph/gateway/dispatch/mux.py` - Implementación de referencia de multiplexor de WebSocket
### Documentación
`docs/apiSpecification.md` - Referencia completa de la API
`docs/api-status-summary.md` - Resumen del estado de la API
`README.websocket` - Documentación del protocolo WebSocket
`STREAMING-IMPLEMENTATION-NOTES.txt` - Notas de implementación de transmisión
### Bibliotecas externas
`websockets` - Biblioteca de WebSocket de Python (https://websockets.readthedocs.io/)
`requests` - Biblioteca HTTP de Python (existente)