Je veux exécuter CoCo en headless
Pour un développeur scriptant CoCo depuis un job CI ou un terminal · 15 min · un terminal, sans interface Streamlit
Vous obtenez un script qui pilote l'agent sans importer Streamlit, que ce soit pour un seul tour ou une session multi-tours, en résolvant toute approbation dans le code.
Avant de commencer#
streamlit-coco[sdk]installé ;check_environment().readyvautTruepour la connexion que vous allez utiliser (voir Prise en main).
- Les symboles headless principaux (
CocoSession,query,CocoOptions,les types de permission et d'erreur) s'importent sans charger Streamlit — les exports UI se résolvent paresseusement, donc un simple
import streamlit_cocoest sans risque dans un script qui ne touche jamais à Streamlit.
Étapes#
- Pour un seul tour, utilisez
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()) - Pour une session multi-tours sans aucune interface, pilotez directement
CocoSession: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() - Résolvez les approbations dans le code plutôt que dans une interface —
vérifiez
session.chat_result().pending_approvalaprès une exécution et appelezapprove_pending()/deny_pending()comme montré dans Je veux configurer les approbations d'outils, ou pré-approuvez tout ce que vous prévoyez viaallowed_toolspour que le script ne se bloque jamais. - Convertissez les événements accumulés en tableau quand vous avez besoin
de les inspecter ou de les journaliser en masse :
df = st_coco.events_to_dataframe(session.events) # nécessite pandas
Résultat#
query() produit des objets CocoEvent pour un seul tour et ne retourne rien d'autre — il n'y a pas d'objet session à conserver après coup. CocoSession exécuté hors de Streamlit se comporte exactement comme dans panel() : le même historique de conversation, les mêmes transitions de CocoRunStatus, les mêmes pauses d'approbation — seul le rendu manque.
Variations#
examples/headless_pipeline.py(make headless) montre à la foisquery()etCocoSessiondepuis un simple script terminal, chacun dans sa propre boucle d'événements.query()lèveSDKNotInstalledErrorouQueryError(ou une autresous-classe
CocoError) au lieu de retourner un résultat partiel en cas d'échec — enveloppez l'appel en conséquence pour un job CI.