Canaux et voix
Anda peut rester cantonné au terminal, ou il peut rejoindre les canaux d'équipe. Les canaux réintègrent le contexte dans le même runtime et le même système de mémoire.
Canaux pris en charge
- Telegram
- Discord
- Lark / Feishu
La configuration des canaux se trouve sous la section channels de ~/.anda/config.yaml.
Utilisateurs multiples
Un seul démon peut servir plusieurs utilisateurs de confiance via le même agent Anda. Créez une clé d'utilisateur, puis définissez le champ user d'une entrée de canal sur cet identifiant. Si user est omis, le canal utilise l'identité du propriétaire local stockée dans le stockage sécurisé des informations d'identification du système opérationnel. Le contrôle du démon (configuration, rechargement et changement de modèle, installation des mises à jour, arrêt) reste réservé au propriétaire local.
anda user create alice
anda user list
La commande enregistre la nouvelle clé publique sous la section principale users et stocke la clé privée correspondante dans le stockage d'informations d'identification chiffré local sous ~/.anda/credentials/. Le fichier d'informations d'identification contient une clé COSE chiffrée, dont la clé de chiffrement est dérivée du secret d'identité du démon local. Utilisez anda user export ci-dessous lorsque vous avez explicitement besoin d'un fichier de clé.
Sous Linux, si aucun fournisseur de Secret Service n'est disponible ou déverrouillé, Anda utilise par défaut des fichiers de clés privées de démon/propriétaire sous ~/.anda/keys/ et affiche/enregistre un avertissement. Les clés privées des utilisateurs de confiance restent chiffrées dans le stockage local d'informations d'identification tant que le secret d'identité du démon peut être chargé. Pour utiliser le Secret Service pour les identités de démon/propriétaire, démarrez et déverrouillez un fournisseur dans une session D-Bus utilisateur, par exemple gnome-keyring-daemon --start --components=secrets, assurez-vous que DBUS_SESSION_BUS_ADDRESS est défini pour le processus Anda, puis redémarrez Anda. Les utilisateurs de KDE peuvent déverrouiller KWallet à la place.
Pour exporter une clé privée d'identité existante vers un fichier, utilisez anda user export. L'identité peut être daemon, owner, default ou un identifiant d'utilisateur de confiance :
anda user export daemon --key-path ./anda-daemon.key
anda user export owner --key-path ./anda-owner.key
anda user export alice --key-path ./alice.key
Conservez les fichiers de clé privée exportés hors du contrôle de code source et des dossiers partagés.
La configuration conserve cette structure :
users:
- id: alice
pubkey: "ALICE_ED25519_PUBLIC_KEY"
- id: ops
pubkey: "OPS_ED25519_PUBLIC_KEY"
Exemple Telegram
channels:
telegram:
- id: personal
user: alice
bot_token: "VOTRE_TELEGRAM_BOT_TOKEN"
username: "VOTRE_TELEGRAM_BOT_USERNAME"
allowed_users:
- "*"
mention_only: false
Exemple WeChat
channels:
wechat:
- id: personal
user: alice
# Laisser vide pour exécuter anda channel init wechat, scanner le code QR et obtenir un jeton.
bot_token: ""
username: anda-wechat
allowed_users:
- "*"
Exemple Discord
Discord utilise un jeton de bot et une connexion Gateway. Créez et installez le bot avant de modifier config.yaml :
- Ouvrez le Portail des développeurs Discord, puis créez ou ouvrez votre application.
- Sur la page Bot de l'application, copiez ou réinitialisez le jeton du bot. Activez également Message Content Intent sous Privileged Gateway Intents afin qu'Anda puisse lire le texte des messages standards.
- Sur la page Installation, assurez-vous que Guild Install inclut le scope
bot. Sans le scopebot, l'application peut apparaître dans vos applications Discord mais pas en tant que bot membre du serveur. - Accordez au bot au moins les autorisations
View Channels,Send MessagesetRead Message History. AjoutezAttach Filessi Anda doit envoyer des fichiers, et ajoutezAdd Reactionslorsqueack_reactions: trueest activé. - Installez l'application sur votre serveur. Le bot doit apparaître dans la liste des membres du serveur après une installation sur le serveur.
channels:
discord:
- id: server
user: ops
bot_token: "VOTRE_DISCORD_BOT_TOKEN"
username: anda-discord
# Optionnel. Restreindre cette entrée à un seul serveur Discord.
guild_id: "VOTRE_DISCORD_GUILD_ID"
allowed_users:
- "VOTRE_DISCORD_USER_ID"
mention_only: true
ack_reactions: true
Seul bot_token est requis par la validation de la configuration. Pour une configuration plus sécurisée et exploitable, définissez allowed_users sur des identifiants d'utilisateurs Discord ; une liste allowed_users vide avec allow_external_users: false ignore les expéditeurs non autorisés. Utilisez allow_external_users: true uniquement lorsque des utilisateurs externes non approuvés doivent pouvoir communiquer avec Anda en tant qu'utilisateur externe $external_user.
Après avoir enregistré la configuration :
anda channel list
anda restart
Dans un canal de serveur, mentionnez le bot :
@anda-discord résumer ce fil
Dans un message privé (DM) avec le bot, envoyez un message normal sans le mentionner. Si le bot n'est pas visible, vérifiez que Guild Install inclut le scope bot et que le démon est en cours d'exécution.
Exemple Lark / Feishu
channels:
lark:
- id: work
user: ops
app_id: "cli_xxx"
app_secret: "VOTRE_APP_SECRET"
platform: feishu
receive_mode: websocket
mention_only: true
Contrôles de sécurité des canaux
allowed_usersdétermine qui peut déclencher Anda ; n'utilisez"*"que si un accès ouvert est acceptable.userdétermine quel expéditeur Anda approuvé possède les conversations, les ressources et la mémoire de cette entrée de canal.- Telegram et Discord nécessitent généralement un
bot_token. - WeChat peut utiliser un jeton enregistré, ou une connexion QR lorsque
bot_tokenest vide. - Lark / Feishu requiert
app_idetapp_secret; les points de terminaison Feishu utilisentplatform: feishu. - Les routes des canaux sont persistées afin que les réponses ultérieures puissent revenir au fil de discussion, salon ou contact d'origine.
Livraison des messages
https_proxy s’applique aux API des canaux, aux transferts de fichiers et aux connexions WebSocket Discord/Lark ; WeChat n’a pas besoin de proxy et s’en passe. Discord reprend les sessions récupérables et vérifie les accusés des battements de cœur pendant le téléchargement indépendant des pièces jointes.
list_im_channels consulte les 300 derniers messages stockés et distingue les fils. Pour send_im_message, thread désigne l’ID du sujet Telegram, du canal de fil Discord ou du message racine Lark/Feishu (om_...). Telegram accepte encore chat_id:topic_id ; le champ thread explicite est prioritaire.
Chaque fragment et pièce jointe est réessayé séparément. Un échec ultérieur ou d’écriture de l’historique ne renvoie pas les parties livrées. Un échec après livraison partielle est signalé sans rejouer toute la réponse. Un délai de transport dépassé dont le résultat est inconnu n’est pas automatiquement réessayé.
Les réponses contenant uniquement des pièces jointes sont également livrées. Lark/Feishu place les pièces jointes HTTP(S) en liens dans la carte et téléverse les fichiers locaux et pièces jointes binaires comme messages image ou fichier (images jusqu’à 10 Mo, fichiers jusqu’à 30 Mo). Les images entrantes des utilisateurs et les messages enrichis directs ou localisés sont pris en charge. Quand Anda refuse le message d’un utilisateur de confiance (par exemple /goal sans consigne), la raison est renvoyée dans la même conversation ; les utilisateurs externes ne reçoivent aucun détail interne.
L’historique référence les fichiers du dossier attachments de l’espace de travail du canal ; conservez-le avec les sauvegardes. WeChat réutilise son client HTTP et migre les anciens fichiers de jetons vers context_tokens_v2.json, qui regroupe chaque jeton et sa date de mise à jour.
Entrée vocale et lecture
La saisie vocale requiert transcription.enabled: true. Démarrez une session vocale avec :
anda voice --record-secs 8
Si vous souhaitez également qu'Anda lise la réponse, configurez tts.enabled: true. Pour une entrée micro et une sortie texte uniquement :
anda voice --record-secs 8 --no-playback
Les pièces jointes audio peuvent intégrer le contexte une fois la transcription activée, de sorte que les messages vocaux dans les canaux puissent faire partie du même fil de mémoire.