Chat
Quien no es admin encarga trabajo aquí, no en la Consola. Hay dos Conversation UI en Development; ambas hablan con el mismo gateway society-chat (API OpenAI-compatible).
Relacionado: Modelos de chat · Puertos · Sessions · RAGs.
Dónde apunta
| Entorno | Conversation UI | Conversation UI | Gateway |
|---|---|---|---|
| Development | http://127.0.0.1:3000 (contenedor aparte) | http://127.0.0.1:3080 (stack infra/conversation-ui/) | http://127.0.0.1:8094/v1 |
| Identia | copilot.identia.do (proveedor de identidad (OIDC)) | chat.identia.do → :3080; admin chat-admin.identia.do → :3081 | society-chat:8094/v1 |
| cliente de referencia | copiloto público detrás de proveedor de identidad (OIDC) | chat.client.example → :3080; admin chat-admin.client.example → :3081 | society-chat:8094/v1 |
Conexión OpenAI-compatible (lo que configura cada UI hacia SiS):
- Base URL:
…/v1(en Dev:http://127.0.0.1:8094/v1desde el host;http://society-chat:8094/v1dentro de orquestador de contenedores) - API key:
SOCIETY_CHAT_API_KEY(en Dev puede ir vacío; en Conversation UI va eninfra/conversation-ui/.env) - Modelos: ids
society/*que listaGET /v1/models
Decisión sustituir-o-coexistir Conversation UI vs Conversation UI: abierta. Hoy conviven en los tres entornos.
Conversation UI — configuración paso a paso (Dev)
Conversation UI no es society-chat. Connections y modelos viven en su SQLite (webui.db), no en variables de entorno del compose R6.
1. Arrancar y autenticar
- Comprueba que responde:
curl -sf http://localhost:3000/→200. - Abre
http://localhost:3000(no127.0.0.1— proveedor de identidad (OIDC)/IdentIA registra el redirect enlocalhost). - Si ves Continue with IdentIA, pulsa y completa proveedor de identidad (OIDC) (misma cuenta que la Consola en clientes con SSO).

2. Conectar society-chat
- Menú Admin (o engranaje) → Settings → Connections (ruta típica:
/admin/settings/connections). - Add connection → tipo OpenAI / OpenAI-compatible.
- Rellena:
| Campo | Valor Dev |
|---|---|
| URL / Base URL | http://society-chat:8094/v1 desde el contenedor Conversation UI (red compose). En UI manual: Admin → Settings → Connections → OpenAI API → Add connection con esa URL y la clave de SOCIETY_CHAT_API_KEY. Atajo Dev: website/scripts/sync-conversation-ui-society-key.sh (escribe lo mismo en webui.db). |
| API Key | valor de SOCIETY_CHAT_API_KEY en .env (si rotas la clave, vuelve a ejecutar el script de sync) |
| Model IDs | dejar que el cliente descubra vía GET /v1/models |
- Save y Verify si la UI lo ofrece.
Si el selector de modelos está vacío: la conexión no está guardada o la URL no alcanza
society-chatdesde el contenedor Conversation UI.

En la captura: tras guardar la conexión a
society-chat(paso 2), el desplegable Search a model (a la izquierda del micrófono en la barra del chat) lista idssociety/*(p. ej.society/ask-rag,society/architect).
3. Elegir modelo y chatear
- En la barra del chat, abre el selector de modelo a la izquierda del micrófono (muestra el id actual, p. ej.
society/architect, o Search a model si aún no hay uno). - En el desplegable Search a model, elige según el caso (tabla abajo).
- Escribe el prompt y envía.

| Modelo | Cuándo usarlo |
|---|---|
society/architect | Intake de institución; persiste el SPEC (única puerta curada al architect del Primary) |
society/operator | Chat con el operator del Primary |
society/ask-rag | Consulta RAG del researcher configurado en SOCIETY_CHAT_RESEARCH_BRIEF_* |
society/research-brief | Pipeline researcher → writer → auditor; auto-RAG si hay corpus |
society/profile/<host>/<profile> | Chat directo con un profile vivo (p. ej. society/profile/ldteam-operaciones/ld-chief-of-staff) |
Lista completa y alias ocultos: Modelos de chat.
SSO de copilotos públicos: tools/ops/copilots-sso.sh. Contraseña local bloqueada en servidor (403).
Conversation UI — configuración paso a paso (Dev)
No es un servicio del compose R6. Proyecto Compose sis-conversation-ui en infra/conversation-ui/ (api + mongo + meilisearch + admin-panel). Requiere la red externa self-improving-society_default (SiS ya arriba).
La conexión a society-chat ya viene cableada en infra/conversation-ui/conversation-ui.yaml (endpoint SIS → http://society-chat:8094/v1, fetch: true para descubrir modelos society/*). No hace falta añadir Connections como en Conversation UI.
1. Arrancar el stack
cd infra/conversation-ui
cp .env.example .env # rellenar secretos; SOCIETY_CHAT_API_KEY = misma clave que .env raíz de SiS
containers compose up -d
# UI: http://127.0.0.1:3080
# Admin: http://127.0.0.1:3081
| Contenedor | Oficio | Host |
|---|---|---|
sis-conversation-ui | Conversation UI + API | :3080 |
sis-conversation-ui-admin | altas / bajas / roles de usuarios | :3081 |
sis-conversation-ui-mongo | estado Conversation UI | sin publicar |
sis-conversation-ui-meili | búsqueda del historial | sin publicar |
2. Autenticar (Dev con SSO)
- Abre
http://127.0.0.1:3080/login. - Pulsa Entrar con IdentIA (SSO proveedor de identidad (OIDC); en
.envdebe estarALLOW_SOCIAL_LOGIN=truey el bloqueOPENID_*). - Completa proveedor de identidad (OIDC) con tu cuenta (misma que Consola / Conversation UI).
- Tras el redirect deberías ver el chat con My Agents arriba a la izquierda.

Redirect URI en proveedor de identidad (OIDC):
http://localhost:3080/oauth/openid/callback(no la URL base sola). Panel admin usahttp://localhost:3080/api/admin/oauth/openid/callback.
3. Elegir modelo y chatear
Conversation UI no usa Search a model (eso es Conversation UI). Aquí el flujo es en tres pasos:
- Pulsa My Agents (arriba a la izquierda).
- Elige el endpoint SIS (conexión precableada a
society-chat). - Elige el agente, p. ej.
society/ask-rag(u otrosociety/*osociety/profile/...).
Hasta completar el paso 3 el compositor puede mostrar Please select an Agent y el envío queda deshabilitado. Luego escribe el prompt y envía.


| Modelo | Cuándo usarlo |
|---|---|
society/architect | Intake de institución (default en conversation-ui.yaml) |
society/operator | Operator del Primary |
society/ask-rag | Consulta RAG del researcher (SOCIETY_CHAT_RESEARCH_BRIEF_*) |
society/profile/<host>/<profile> | Chat directo con un profile vivo |
4. Panel de administración (:3081)
Altas, bajas y roles de usuarios de Conversation UI (no confundir con proveedor de identidad (OIDC) ni con Operar → Users). En clientes se llega por malla privada/SSH; no se publica en proxy de entrada salvo decisión explícita.
Cuándo Conversation UI vs Conversation UI: mismo gateway society-chat. Conversation UI trae endpoint SIS preconfigurado, buscador de historial (Meilisearch) y panel admin de usuarios; Conversation UI es el copiloto IdentIA por defecto en Dev (:3000) pero exige configurar Connections a mano.
Branding por configuración (APP_TITLE, assets en infra/conversation-ui/assets/). Snippet proxy de entrada: infra/conversation-ui/edge-proxy-vhosts.snippet.
Widget Society Chat (Consola)
Burbuja teal abajo-derecha en Operar y Explorar — copilot integrado que:
- Lee el snapshot del grafo y el contexto de la vista Operar actual.
- Responde preguntas de estado (hosts, agentes, tasks, warnings).
- Puede navegar a otras vistas de Operar (si tienes permisos).
- Admins: triaje de la bandeja de Approvals.

Relacionado: Operar → Sessions (sessions) para hilos de society-chat en tabla.
Consulta RAG tras ingesta (E2E)
El chat no usa RAG solo porque exista corpus en VectorDB. Hacen falta dos piezas:
- Ingesta en la colección correcta (RAGs).
- MCP
society_ragen el arnés del agente config del profile (o modoask-rag/research-briefcon env apuntando al host/profile correcto).
Opción A — Código único en markdown (ld-chief-of-staff)
| Paso | Acción | Verificación |
|---|---|---|
| 1 | Ingesta un .md con código único (p. ej. LD-E2E-2026) en RAG de ld-chief-of-staff @ ldteam-operaciones | Vista RAGs: estado ok; smoke search devuelve el fragmento |
| 2 | Confirma MCP en profile: society_rag en arnés del agente config (re-provision si hace falta) | containers exec society-executor society profile show ld-chief-of-staff --host ldteam-operaciones |
| 3 | Chat con society/profile/ldteam-operaciones/ld-chief-of-staff o society/ask-rag con SOCIETY_CHAT_RESEARCH_BRIEF_HOST_NAME / PROFILES en .env de society-chat | Respuesta cita el código ingestado |
| 4 | (Opcional) Mismo prompt en Conversation UI con el modelo profile elegido | Misma cita |
Pregunta de ejemplo: «¿Cuál es el código interno del proyecto LDTeam?»
Opción B — PDF Ley 47-20 + Conversation UI + ask-rag (verificado Dev 2026-08-30)
Corpus legal en el RAG del researcher (ld-researcher @ ldteam-operaciones), consultado vía modo society/ask-rag (env SOCIETY_CHAT_RESEARCH_BRIEF_* → primer profile de la lista, hoy ld-researcher).
| Paso | Acción | Verificación |
|---|---|---|
| 1 | Copia el PDF a data/rag-fixtures/ (p. ej. Ley-47-20-APP.pdf) e ingesta en ld-researcher @ ldteam-operaciones (SOCIETY_RAG_WRITE_ENABLED=true) | society rag list --profile ld-researcher --host ldteam-operaciones muestra chunks del PDF |
| 2 | Confirma env en society-chat: SOCIETY_CHAT_RESEARCH_BRIEF_HOST_NAME=ldteam-operaciones, SOCIETY_CHAT_RESEARCH_BRIEF_PROFILES=ld-researcher,... | containers exec society-chat sh -c 'echo $SOCIETY_CHAT_RESEARCH_BRIEF_HOST_NAME $SOCIETY_CHAT_RESEARCH_BRIEF_PROFILES' |
| 3 | Conversation UI (:3080): login IdentIA → My Agents → SIS → society/ask-rag | Compositor habilitado; no uses Search a model (eso es Conversation UI) |
| 4 | Pregunta sobre el objeto/finalidad de la Ley 47-20 | Respuesta en prosa con cita Ley-47-20-APP.pdf#chunk-N (~1–2 min) |
Pregunta de ejemplo:
Según la Ley 47-20 de Alianzas Público-Privadas en mi RAG: ¿cuál es su objeto o finalidad principal? Responde en 2-3 frases y cita el documento.
Smoke automatizado (Conversation UI, agente ya elegido):
cd website
SIS_SKIP_LOGIN=1 SIS_SKIP_AGENT_SELECT=1 node scripts/validate-conversation-ui-ask-rag.mjs
Capturas de la validación: website/.cache/validate-conversation-ui/validate-lc-*.png (incluye validate-lc-04-response.png).
| Superficie | URL | Uso |
|---|---|---|
| Widget Consola | Burbuja en :8093 | Pregunta con contexto de sesión / snapshot |
| Society Chat API | http://localhost:8094/v1 | Conversation UI / Conversation UI / curl |
| Conversation UI | http://localhost:3000 | Chat usuario final |
# Smoke API directo (sin UI)
curl -sS http://127.0.0.1:8094/v1/models | jq '.data[].id' | head
Qué no hacer
- No uses
society/profile/<primary>/architectni…/operatordel Primary Host: las puertas curadas sonsociety/architectysociety/operator. El architect crudo conversa pero no persiste el SPEC. society/inventory-checkysociety/debate-mapestán retirados. Un request cae en modelo desconocido.society/goal-intakeysociety/research-brief-ragrutean como alias ocultos; no salen en el selector.- CLI RAG ≠ chat RAG:
society rag listpuede funcionar mientras el chat no ve corpus si falta MCPsociety_ragen el profile.
Solución de problemas
| Síntoma | Causa probable | Qué hacer |
|---|---|---|
| Modelos vacíos en Conversation UI | Sin conexión a :8094/v1 o clave vieja en webui.db | Settings → Connections (o website/scripts/sync-conversation-ui-society-key.sh); la URL debe alcanzar society-chat desde el contenedor |
| Respuesta sin citas RAG | Profile sin society_rag o colección/host distinto al ingest | Reprovisionar template; alinear --host en ingest y MCP |
ask-rag responde de otra institución | SOCIETY_CHAT_RESEARCH_BRIEF_* desalineado | Recrear society-chat con env correcto |
| 401 en Consola copilot | Sesión caducada | Re-login por localhost:8093 |
Regenerar capturas (operadores)
cd website
SIS_CAPTURE_EMAIL=... SIS_CAPTURE_PASSWORD=... \
node scripts/capture-explorar-chat.mjs
Salida: static/img/chat/es/chat-step-*.png y copilot desde Explorar.