actualite_vocale
actualite_vocale
¶
Les gardes d'actualité du chat, portées à la voix (21 septembre 2026).
Le 20 et le 21 septembre, le chat a reçu ses gardes : consigne au tour courant pour une question d'actualité, fraîcheur imposée à web_search, lecture automatique de la page du poste pour un titulaire, note SYSTEM avant la rédaction, désaccord de titulaire signalé. La voix n'en avait aucune — « Qui est le premier ministre du Canada ? » dit au micro recevait « Justin Trudeau » sans qu'une recherche parte, et rien ne le disait.
La voix ne peut pas RETENIR une réponse comme le chat : les phrases sont synthétisées à mesure qu'elles arrivent, et le silence d'une retenue serait le pire des signaux. Ce que la voix peut faire : poser la consigne (au chat, elle a suffi au premier passage), imposer la fraîcheur, lire la page du poste, prévenir le modèle avant qu'il rédige, relancer UNE fois quand le premier passage a répondu sans chercher (la parole est sortie ; la livraison suit, comme pour une promesse sans acte) — et, quand rien n'a été vérifié ou que la réponse contredit les sources, LE DIRE à voix haute en fin de tour (§100 : jamais de faux succès, même prononcé).
Les messages sont ici des dicts ({"role", "content"}), la forme de la
boucle vocale ; server/actualite.py travaille sur des Message. Les
fonctions de ce module font le pont, rien de plus : la logique reste dans
actualite.py, une seule fois.
Classes¶
TourVocal
dataclass
¶
TourVocal(
question: str,
demande: bool = False,
ville: str = "",
officielle_lue: bool = False,
relance_lecture_faite: bool = False,
recherche_tentee: bool = False,
recherche_refusee: bool = False,
verification_faite: bool = False,
outil_local_ok: bool = False,
relance_faite: bool = False,
lecture_faite: bool = False,
sources: list[dict[str, Any]] = list(),
pages_lues: set[str] = set(),
corpus: str = "",
)
Ce qu'un tour d'actualité accumule, du micro au dernier mot.
Functions:¶
est_une_demande_vocale
¶
« Vérifie ça » et ses formes ; à la voix, aussi « c'est vrai » et « vraiment » sans ponctuation, quand c'est tout l'énoncé.
Source code in src/diapason/speech/realtime/actualite_vocale.py
preparer_tour
¶
preparer_tour(
texte: str,
historique: Sequence[dict[str, Any]],
ville: str = "",
) -> TourVocal | None
Le tour est-il une question d'actualité, ou une demande de vérifier ce qui vient d'être dit ? None quand la voix n'a rien à garder.
Source code in src/diapason/speech/realtime/actualite_vocale.py
consigne
¶
consigne(tour: TourVocal) -> dict[str, str]
La consigne au tour courant, après la demande — là où le 9b obéit.
Source code in src/diapason/speech/realtime/actualite_vocale.py
relance
¶
relance(
tour: TourVocal, parle: str
) -> list[dict[str, str]]
Le premier passage a parlé sans chercher : ce qui a été dit reste dans le fil (c'est sorti des haut-parleurs), et une sommation suit.
Source code in src/diapason/speech/realtime/actualite_vocale.py
relance_possible
¶
relance_possible(tour: TourVocal, parle: str) -> bool
La passe prononcée avoue n'avoir pas trouvé, après une vérification, et aucune relance n'a encore eu lieu.
Source code in src/diapason/speech/realtime/actualite_vocale.py
lecture_possible
¶
lecture_possible(tour: TourVocal) -> bool
Une source s'impose à lire — ce qui vaut un « Je lis la source. » AVANT le silence de la lecture, et seulement alors : l'accusé était prononcé sans source à lire, puis plus rien (revue du 21/09, 22 h).
Source code in src/diapason/speech/realtime/actualite_vocale.py
relance_apres_non_reponse
¶
relance_apres_non_reponse(
tour: TourVocal,
parle: str,
lire: Lecteur | None,
peut_chercher: bool | Callable[[], bool] = True,
) -> list[dict[str, str]] | None
La réponse prononcée avoue n'avoir pas trouvé : le code lit la source
la plus prometteuse (deux essais) et le modèle reprend d'après elle —
une fois. Sans source qui s'impose, ou pages illisibles : une autre
requête, si le budget le permet encore. None quand il n'y a rien à
reprendre (banc du 21/09, Coupe Stanley : nhl.com était dans les
résultats, le 9b n'y allait pas). parle est la DERNIÈRE passe, pas
tout le tour : un aveu prononcé avant la recherche ne fait pas relire
une page après la bonne réponse (revue du 21/09). peut_chercher se
demande APRÈS les lectures, qui consomment le budget : un booléen pris
avant promettait un web_search que le tour ne pouvait plus payer (revue
du 21/09, 22 h).
Source code in src/diapason/speech/realtime/actualite_vocale.py
preparer_appel
¶
preparer_appel(
tour: TourVocal, nom: str, arguments: dict[str, Any]
) -> dict[str, Any]
Fraîcheur et vertical décidés par le code, pas par le modèle.
Source code in src/diapason/speech/realtime/actualite_vocale.py
deja_lue
¶
deja_lue(
tour: TourVocal, nom: str, arguments: dict[str, Any]
) -> dict[str, Any] | None
Le modèle redemande la page que le code vient de lire : la réponse, sans réseau (revue du 21/09 : deux téléchargements, le même texte deux fois dans le fil).
Source code in src/diapason/speech/realtime/actualite_vocale.py
absorber_resultat
¶
absorber_resultat(
tour: TourVocal,
nom: str,
arguments: dict[str, Any],
resultat: dict[str, Any],
lire: Lecteur | None = None,
) -> dict[str, Any]
Après un outil : les sources numérotées rejoignent le tour, et pour un titulaire la page du poste est lue et jointe au résultat — exactement ce que fait agentic_stream pour le chat. Rend ce que le MODÈLE lit.
Source code in src/diapason/speech/realtime/actualite_vocale.py
384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 | |
note
¶
note(tour: TourVocal) -> dict[str, str] | None
Ce que le code sait des sources, dit au modèle avant qu'il rédige.
Source code in src/diapason/speech/realtime/actualite_vocale.py
epilogue
¶
epilogue(
tour: TourVocal,
reponse: str,
derniere_passe: str | None = None,
) -> str
La phrase à prononcer après la réponse, ou "" : de mémoire, ou en désaccord avec les sources sur le titulaire.
Revue vocale du 21/09 : « je le dis de mémoire » était prononcé après une réponse vide, après une question de précision, après un aveu déjà dit, et après un fait lu à l'horloge locale. Chacun de ces cas se tait ; une réponse vide reçoit l'aveu qui se tient seul. Le désaccord se juge sur la DERNIÈRE passe : « De mémoire, c'est Justin Trudeau » dit avant la recherche taisait l'avertissement sur « Justin Trudeau, depuis 2015 » dit après elle, les sources désignant Mark Carney (revue du 21/09, 22 h).