find_ai_chat library
Flutter SDK for embedding the Find AI chat assistant — equivalent to
widget.js for Flutter apps (mobile & web), talking to the same public
webchat API.
Quick start:
FindChatWidget(
connectionId: 'your-connection-id',
baseUrl: 'https://api.example.com',
theme: FindChatTheme.light,
mode: FindChatMode.floating,
)
See the package README for the full guide (setup, modes, programmatic control, known limitations).
Classes
- ChatStreamNode
-
Nodo actualmente en ejecución (
node.startedsin sunode.finishedaún). - ChatTurnCompletedData
-
datadel evento terminalmessage.completed.responsees el texto canónico del turno (puede diferir del texto acumulado por deltas si hubo un reintento de nodo — por eso siempre se usa este valor, no el acumulado). - FindChatAction
-
Una acción del menú flotante del chat (long press sobre el botón de
enviar). El SDK trae una sola por default — "Eliminar conversación" — y la
app host puede agregar, quitar o reordenar con
FindChatWidget(actionsBuilder: ...). - FindChatActionConfirmation
- Texto del paso de confirmación que se muestra antes de ejecutar una FindChatAction. Declararlo en la acción (en vez de hardcodear el diálogo en el panel) hace que cada acción nueva decida por sí misma si necesita confirmar — el panel la resuelve genéricamente.
- FindChatClient
-
Cliente HTTP + SSE de la API pública del canal "webchat"
(
/api/v1/channels/webchat/{connectionId}/...). Sin estado de sesión (visitor_id/conversation_id) — eso lo manejaFindChatSessionStore; este cliente solo sabe hablar el protocolo HTTP. - FindChatConfig
-
Espeja
WebchatPublicConfig— la respuesta deGET /api/v1/channels/webchat/{connectionId}/config. Solo branding y flags públicos, nunca secretos. - FindChatController
-
Controla un chat: inicialización, envío de mensajes, apertura/cierre (en
modos FindChatMode.floating/FindChatMode.drawer) y limpieza de la
conversación.
ChangeNotifierestándar de Flutter — se puede escuchar conListenableBuilder/AnimatedBuilder, o pasarlo explícito aFindChatWidgetpara controlarlo desde fuera del widget tree: - FindChatConversationsResult
-
Respuesta de
GET /conversations: las conversaciones del visitante del token, actividad más reciente primero. - FindChatConversationSummary
-
Un item de
GET /conversations(solo conexionesauth_mode: "signed"). - FindChatDrawerView
-
Modo FindChatMode.drawer: sin burbuja — se abre/cierra solo por código
(
controller.open()/close()/toggle()). En pantallas angostas (<600dp) se muestra como bottom sheet; en pantallas anchas, como panel lateral deslizándose desde la derecha. Se inserta víaOverlay, igual que FindChatFloatingBubble — requiere unNavigator/Overlayancestro. - FindChatEmbeddedView
-
Modo FindChatMode.embedded: el chat como un widget más del árbol, sin
overlay ni burbuja — ocupa el espacio que le da el padre (usalo dentro de
un
Expanded/SizedBox/Scaffold.body, como cualquier otro widget). - FindChatEnvironment
- Resuelve la URL base del backend sin hardcodearla en el SDK.
- FindChatFloatingBubble
-
Modo FindChatMode.floating: burbuja flotante (esquina inferior derecha)
que abre/cierra una tarjeta de chat superpuesta. Se inserta vía
Overlay— flota sobre TODA la app, no solo sobre el widget donde se montó FindChatWidget, igual que la burbujaposition:fixeddel widget web. Requiere unNavigator/Overlayancestro (automático bajoMaterialApp/WidgetsApp). - FindChatHistoryMessage
-
Un mensaje de
GET /history. Distinto de FindChatMessage porque el rol llega como string libre del backend (puede incluir roles que la UI no muestra, p.ej. "system") — el caller filtra antes de convertir. - FindChatHistoryResult
-
Respuesta de
GET /history. - FindChatMessage
-
Un mensaje de la conversación (enviado por el visitante o recibido del
asistente).
ides local para mensajes recién enviados (no hay un id de servidor todavía) o el id de historial cuando viene de/history. - FindChatSendResult
-
Respuesta de
POST /messages(202). - FindChatSessionStore
-
Persiste
visitor_id/conversation_idpor conexión, víashared_preferences(funciona igual en mobile y Flutter web, ahí usalocalStoragepor debajo — mismo mecanismo que el widget JS). - FindChatState
-
Estado inmutable del chat. FindChatController es el único que lo muta;
la UI solo lo lee (vía
ListenableBuilder/AnimatedBuilder). - FindChatWidget
- Punto de entrada del SDK. Ejemplo mínimo:
Enums
- FindChatColorScheme
-
Modo de color persistido de la conexión (
color_scheme). No confundir con FindChatTheme, que es el override que puede pasar el dev. - FindChatMode
- Cómo se presenta el chat dentro del árbol de widgets de la app.
- FindChatRemoteDisplayMode
-
Modo de visualización persistido de la conexión (
display_mode). - FindChatRole
- Autor de un mensaje del chat.
- FindChatStatus
- Fase actual del FindChatController.
- FindChatTheme
- Modo de color del widget.
- FindChatVisualStyle
- Tratamiento visual del chat en sí (independiente de FindChatMode).
Properties
- findChatVisitorIdPattern → RegExp
-
^[a-zA-Z0-9_-]{8,64}$— mismo formato que exige el backend para visitor_id/conversation_id (webchat_models.VISITOR_ID_PATTERN).final
Functions
-
findChatVisualStyleFromWire(
String? value) → FindChatVisualStyle -
"classic"/"gpt_style"⇒ tipo. Cualquier otro valor (incl. ausente) cae a FindChatVisualStyle.classic — mismo default que el backend. -
generateFindChatVisitorId(
) → String -
UUID v4 sin guiones (32 hex chars) — mismo formato que
crypto.randomUUID().replace(/-/g, "")en el widget web. Los bits de versión/variante se setean por prolijidad, no porque el backend los valide (solo exige el charset/largo de arriba).
Typedefs
-
FindChatActionsBuilder
= List<
FindChatAction> Function(BuildContext context, List<FindChatAction> defaults) -
Hook para que la app host arme el menú a partir de las acciones que trae el
SDK. Recibe
defaultsya resueltas contra el estado actual (p. ej. el borrado llega conenabled: falsedurante un turno en curso) y devuelve la lista final. Devolver una lista vacía deshabilita el menú por completo: el botón de enviar vuelve a comportarse como un botón común. - FindChatThemeBuilder = ThemeData Function(BuildContext context, ThemeData baseTheme)
- Permite ajustar el ThemeData que el SDK ya resolvio para el chat.
-
FindChatTokenProvider
= Future<
String> Function() -
Provee el visitor token para conexiones con
auth_mode: "signed".
Exceptions / Errors
- FindChatApiException
-
Error HTTP de la API pública de webchat. El body de error del backend es
{"error": "HTTP_ERROR", "message": "..."}(o{"error":"VALIDATION_ERROR", "message":"...","details":[...]}para 422) — no{"detail": "..."}pese a que algunos clientes viejos revisan ese campo por compatibilidad; acá leemos ambos por las dudas. - FindChatAuthException
-
401 del backend en una conexión con
auth_mode: "signed": el visitor token falta, es inválido o expiró — incluso después de reintentar una vez con un token fresco deltokenProvider. La app host debe renovar la sesión de su usuario (o revisar que el secret con el que firma siga siendo el de la conexión). - FindChatTurnFailedException
-
El turno terminó con un evento SSE terminal
error(falló el flujo). - No se pudo sostener la conexión SSE tras varios reintentos consecutivos sin recibir ningún evento.