Quiero ejecutar CoCo en modo headless
Para un desarrollador que orquesta CoCo desde un trabajo de CI o una terminal · 15 min · **una terminal, sin interfaz de Streamlit necesaria**
Terminas con un script que impulsa al agente sin importar Streamlit, ya sea para un solo turno o una sesión de varios turnos, resolviendo cualquier aprobación en código.
Antes de empezar#
streamlit-coco[sdk]instalado;check_environment().readyesTruepara la conexión que vas a usar (ver Primeros pasos).
- Los símbolos headless principales (
CocoSession,query,CocoOptions, los tipos de permisos y errores) se importan sin cargar Streamlit — los exports de la interfaz se resuelven de forma perezosa, así que un simpleimport streamlit_cocoes seguro en un script que nunca toca Streamlit.
Pasos#
- Para un solo turno, usa
query():import asyncio import streamlit_coco as st_coco async def main() -> None: options = st_coco.CocoOptions(connection="my_connection") async for event in st_coco.query("Summarize sales by region.", options=options): if event.type == "assistant_text": print(event.text) asyncio.run(main()) - Para una sesión de varios turnos sin ninguna interfaz, impulsa
CocoSessiondirectamente:session = st_coco.CocoSession(options=options, key="headless") session.start() await session.ensure_ready(timeout=120) result = await session.run("List the tables in my schema.") async for event in session.stream(): ... session.close() - Resuelve las aprobaciones en código en lugar de en una interfaz —
comprueba
session.chat_result().pending_approvaltras una ejecución y llama aapprove_pending()/deny_pending()como se muestra en Quiero configurar aprobaciones de herramientas, o pre-aprueba todo lo que esperas víaallowed_toolspara que el script nunca se bloquee. - Convierte los eventos acumulados en una tabla cuando necesites
inspeccionarlos o registrarlos en bloque:
df = st_coco.events_to_dataframe(session.events) # necesita pandas
Resultado#
query() produce objetos CocoEvent para un solo turno y no devuelve nada más — no queda ningún objeto de sesión que conservar después. CocoSession ejecutada fuera de Streamlit se comporta exactamente igual que dentro de un panel(): la misma transcripción, las mismas transiciones de CocoRunStatus, las mismas pausas de aprobación — solo falta el renderizado.
Variaciones#
examples/headless_pipeline.py(make headless) muestra tantoquery()comoCocoSessiondesde un script de terminal simple, cada uno en su propio bucle de eventos.query()lanzaSDKNotInstalledErroroQueryError(u otra subclasede
CocoError) en lugar de devolver un resultado parcial en caso de fallo — envuelve la llamada en consecuencia para un trabajo de CI.