Aller au contenu principal

6 articles tagués avec « ai »

Voir tous les tags

CWCloud AI Chat sur mobile

· 2 minutes de lecture
Idriss Neumann
founder cwcloud.tech

Toujours dans l'optique de rendre les fonctionnalités de CWCloud accessibles rapidement et partout avec nos agents IA, nous fournissons désormais une application mobile pour interagir avec l'API CWAI qui elle même permet d'invoquer notre web agent comme démontré dans ce blogpost.

L'application est disponible en mode web sur chat.cwcloud.tech et est aussi téléchargeable pour Android en cliquant sur le bouton "Download" entourée en rouge ci-dessous:

cwc-chat-mobile

attention

L'application mobile est OpenSource et disponible sur notre gitlab mais pour consommer l'api CWAI, vous devrez disposer de l'édition Enterprise (EE). Merci de nous contacter pour plus d'informations.

Ensuite, vous pouvez vous connecter avec une clef d'API et la configurer en cliquant sur le bouton "Configure" ou "Settings" entouré en rouge ci-dessous:

cwc-chat-credentials

Sur la version mobile il est possible de directement scanner le QR code de la clef d'API pour la configurer automatiquement en passant par la console comme ceci :

cwc-chat-credentials-qr-1

Puis :

cwc-chat-credentials-qr-2

Et enfin vous pourrez discuter avec les différents modèles et agents interfacés avec les adaptateurs externes de CWCloud :

cwc-chat-prompt

Conclusion : comme évoqué dans notre précédent blogpost, il semble toujours très important pour l'expérience utilisateur que les agents IA affichent des commandes CLI répétables et compréhensibles. Encore davantage sur mobile, afin de pouvoir partager des captures d'écran avec d'autres personnes durant des incidents de production.

Agent IA CWCloud comme webhook Gitlab pour les commentaires d'issues

· 2 minutes de lecture
Idriss Neumann
founder cwcloud.tech
attention

La CLI cwc est OpenSource mais pour les instances on-premises de CWCloud, vous devrez disposer de l'édition Enterprise (EE) pour utiliser les fonctionnalités d'agent IA. Merci de nous contacter pour plus d'informations.

Dans notre précédent blogpost, nous avons expliqué comment utiliser la CLI cwc comme agent web et comment l'utiliser dans les fonctionnalités CWAI comme le chat ou le moteur FaaS.

Dans ce blogpost, nous allons voir comment utiliser la CLI cwc comme agent web en tant que webhook Gitlab déclenché par les commentaires d'issues et des mots-clés.

Commençons par configurer cwc avec les variables d'environnement suivantes :

  • CWC_AGENT_NAME : le nom de l'agent qui sera utilisé comme déclencheur (ex. : cwc-prod pour être déclenché par des commentaires contenant !cwc-prod dans les issues Gitlab)
  • CWC_GITLAB_TOKEN : un token Gitlab avec la permission de publier des commentaires sur les issues
  • CWC_GITLAB_BASE_URL : l'URL de l'instance Gitlab (ex. : https://gitlab.cwcloud.tech)

Vous pouvez également utiliser la commande cwc configure comme ceci :

$ cwc configure set agent_name cwc-prod
$ cwc configure set gitlab_token <your_gitlab_token>
$ cwc configure set gitlab_base_url https://gitlab.cwcloud.tech

Ensuite, vous devrez configurer le webhook dans Gitlab comme ceci :

gitlab-webhooks

gitlab-webhook-config

Comme vous pouvez le voir, nous avons configuré l'endpoint /gitlab et nous avons aussi défini un header Authorization attendu par notre reverse proxy pour server l'agent. Néammoins, l'agent web supporte aussi le webhook secret de Gitlab pour l'authentification (c'est optionnel, mais faites attention à bien configurer une authentification d'une manière ou d'une autre).

Et donc, voici ce que nous obtenons dans les issues Gitlab quand nous commentons !{agent name} :

gitlab-issue-agent

attention

Encore une fois, faites attention à ce que vous allez demander dans vos prompts. Dans la prochaine version, nous ajouterons un mode de confirmation dans notre agent.

En conclusion, les utilisateurs peuvent travailler et intervenir en production tout en restant dans le tableau central des tickets.

Agent IA CWCloud comme adaptateur RESTful pour l'API CWAI

· 2 minutes de lecture
Idriss Neumann
founder cwcloud.tech
attention

La CLI cwc est OpenSource mais pour les instances on-premises de CWCloud, vous devrez disposer de l'édition Enterprise (EE) pour utiliser les fonctionnalités d'agent IA. Merci de nous contacter pour plus d'informations.

Dans notre blogpost précédent, nous avions présenté le serveur MCP et l'agent IA CWCloud. Nous avions expliqué comment nous avons implémenté le serveur MCP et comment l'utiliser avec un agent IA en mode CLI.

Dans cet article, nous allons voir cette fois comment utiliser cwc comme adaptateur web externe compatible avec l'API CWAI.

Tout d'abord, voici comment démarrer la CLI cwc en tant qu'agent web :

$ cwc ai web-agent

On peut aussi préciser le port et l'adresse d'écoute :

$ cwc ai web-agent -a 0.0.0.0 -p 8081 -s http://localhost:8080/mcp

Ensuite, on peut envoyer une requête HTTP POST à l'agent web comme ceci :

$ curl -X POST http://localhost:8081 -H "Content-Type: application/json" -d '{ "settings": { "max_tokens": 500 }, "message": "Hello"}'

L'agent web répondra ainsi (en respectant le contrat de l'adaptateur externe) :

{
"status": "ok",
"message": "Hello! How can I assist you today?",
"usage": {
"prompt_tokens": 8,
"completion_tokens": 10,
"total_tokens": 18
}
}

Pour héberger la CLI comme serveur MCP et agent web en même temps, voici un exemple de fichier docker compose :

services:
cwc_mcp:
image: "rg.fr-par.scw.cloud/cwcloud-ce-u7u1q0/cwc:1.19.12"
restart: always
container_name: cwc_mcp
env_file:
- .env.cwc
volumes:
- "/etc/ssl/certs/ca-bundle.crt:/etc/ssl/certs/ca-bundle.crt:ro"
- "/etc/ssl/certs/ca-bundle.trust.crt:/etc/ssl/certs/ca-bundle.trust.crt:ro"
command: ["ai", "mcp", "-l", "0.0.0.0", "-p", "8080"]
networks:
- cwc_network
cwc_agent:
image: "rg.fr-par.scw.cloud/cwcloud-ce-u7u1q0/cwc:1.19.12"
restart: always
container_name: cwc_agent
env_file:
- .env.cwc
volumes:
- "/etc/ssl/certs/ca-bundle.crt:/etc/ssl/certs/ca-bundle.crt:ro"
- "/etc/ssl/certs/ca-bundle.trust.crt:/etc/ssl/certs/ca-bundle.trust.crt:ro"
command: ["ai", "web-agent", "-a", "0.0.0.0", "-p", "8081", "-s", "http://cwc_mcp:8080"]
ports:
- "8081:8081"
networks:
- cwc_network

networks:
cwc_network:
driver: bridge

Dans .env.cwc, vous pouvez définir toutes les variables d'environnement nécessaires pour la CLI cwc, comme la clé API et le modèle par défaut à utiliser. Vous pouvez vous référer à cette documentation pour plus de détails.

On peut ensuite ajouter l'agent web comme adaptateur externe :

cwc-external-adapter

Puis l'utiliser avec le chat de CWAI :

cwc-web-agent-chat

Et bien sûr, vous pourrez aussi l'utiliser dans le moteur FaaS comme ceci :

cwc-web-agent-faas

Et voilà comment utiliser l'agent web cwc comme adaptateur externe pour CWAI !

Serveur MCP et agent IA avec CWCloud

· 5 minutes de lecture
Idriss Neumann
founder cwcloud.tech

Vous vous demandez peut-être pourquoi nous parlons toujours de MCP1 en 2026 alors que beaucoup de monde affirme que ce n'est plus utile parce que les agents IA peuvent facilement utiliser la CLI ce qui évite d'avoir à faire une double maintenance.

C'est la principale raison pour laquelle il nous a fallu si longtemps pour livrer un serveur MCP : nous maintenons déjà la CLI cwc2 et ne voulions pas dupliquer le travail en maintenant à la fois une CLI et un serveur MCP.

cli

Initialement, nous avions essayé de regrouper toutes les fonctionnalités de la CLI dans des packages Go qui pourraient être inclus dans le serveur MCP. Cependant, nous nous sommes vite rendu compte que c'était beaucoup de travail et nécessiterait de maintenir les deux artefacts à chaque fois que nous ajouterions une nouvelle fonctionnalité.

Après quelques tentatives, nous nous sommes rendu compte que nous pouvions générer dynamiquement le serveur MCP avec les définitions d'outils directement à partir de la CLI, qui est implémentée en Go et Cobra. De cette façon, nous pouvions calculer toutes les définitions d'outils à partir de la documentation de la CLI et générer le serveur MCP à la volée sans maintenir deux codebases séparés.

ai-cwc

Encore mieux : les développeurs peuvent ajouter des sous-commandes et le serveur MCP les utilisera dynamiquement sans aucun travail supplémentaire.

Et voilà, cela fonctionne simplement en lançant cette sous-commande pour démarrer le serveur MCP :

$ cwc ai mcp
Starting cwc MCP server on http://127.0.0.1:8080/mcp

Evidemment, vous pouvez changer le port et l'adresse d'écoute comme ceci :

$ cwc ai mcp -p 8081 -l 0.0.0.0
Starting cwc MCP server on http://0.0.0.0:8081/mcp

Et nous avons un outil list_mcp_dynamic_tools qui liste tous les outils disponibles sur le serveur.

Maintenant vous vous demandez peut-être "OK, c'est bien, mais pourquoi devrais-je utiliser un serveur MCP au lieu de la CLI directement avec un agent ?". Selon nous, MCP et agents ne sont pas antinomiques et peuvent être utilisés ensemble. Nous pensons que fournir des outils MCP pour vos agents nécessite moins d'effort de votre côté qu'implémenter un agent qui appelle la CLI et en parse la sortie.

Bien entendu, nous fournissons aussi un moyen de créer des agents capables d'appeler le serveur MCP avec la commande cwc ai agent :

$ cwc ai agent -p "your prompt"

La commande fonctionne avec gpt4omini d'OpenAI par défaut mais supporte également tous les modèles d'OpenAI, Anthropic, Google Gemini, Deepseek ou OpenRouter (qui fournit les modèles open-source de Meta) :

$ cwc ai agent -p "your prompt" --provider openrouter --model "meta-llama/llama-3.3-70b-instruct"

Voici une démo sur comment utiliser le serveur MCP avec un agent pour lister les projets et les instances ainsi que les outils MCP disponibles :

demo

Notes :

  • Vous pouvez faire des demandes dans une autre langue, par exemple en Français, comme montré dans la démo.
  • Vous devez exposer le serveur MCP dans un terminal séparé. Cela vous permet de cibler un serveur MCP distant en utilisant le drapeau -s (nous ajouterons l'authentification plus tard) :
    cwc ai agent -p "list me the projects" -s "http://127.0.0.1:8081/mcp"
  • La documentation complète est disponible ici.
attention

N'oubliez pas que la CLI peut également mettre à jour ou supprimer des ressources comme les instances, les moniteurs, les projets et toutes les autres. Donc soyez prudent avec vos prompts !

La cli fourni également un mode interactif/REPL3 pour l'agent qui permet d'exécuter plusieurs prompts dans la même session (avec le flag -i ou --interactive) :

$ cwc ai agent -i
Using model: gpt-4o-mini (provider: openai)
Interactive mode enabled. Type your prompt and press Enter.
Type 'exit' or 'quit' to leave.
> get me the monitors
> list me all the available MCP tools

Démonstration :

demo-agent-repl

Conclusion : on anticipe le fait que les agents IA sont le futur visage du platform engineering. Il nous paraît donc important dans ce contexte que ceux-ci soient embarqués dans votre CLI et privilégient d'invoquer des commandes répétables et compréhensibles (afin de les faire confirmer par l'humain) plutôt que des tools MCP opaques qui seraient directement associés à la définition de vos endpoints d'API ou SDK (qui eux ne sont généralement pas répétables facilement).

En outre, le fait d'avoir choisi de proposer un serveur MCP et un Agent dans le même binaire que la CLI mais qui s'exécutent dans des processus différents permet de proposer des agents fonctionnants d'exécution simple qui fonctionnent avec les modèles les moins puissants et moins chers du marché tels que gpt-4o-mini, mistral-small, gemini-1.5-flash, deepseek (le moins cher) ou encore llama auto-hébergé. En effet, ces agents n'ont pas besoin de beaucoup de capacité de raisonnement pour interpréter du langage et le transformer en invocation de ligne de commande en sélectionant le bon tool MCP. Mais cela permet également de pouvoir invoquer ce même serveur MCP dans des agents plus complexes qui fonctionnent avec des modèles plus puissants qui produiraient du raisonnement et des workflows de troubleshooting plus avancés couplé avec éventuellement d'autres serveurs MCP pour les outils d'observabilité par exemple.

On ajoutera probablement bien d'autres fonctionnalités donc restez à l'écoute !

Footnotes

  1. MCP signifie "Model-Context Protocol" documenté ici.

  2. Vous pouvez trouver ici la documentation d'installation pour cwc avec notre système d'exploitation.

  3. REPL signifie "Read-Eval-Print Loop", une interface interactive permettant d'exécuter des commandes et de voir les résultats en temps réel.

Récupérer les données de son AppleWatch avec le moteur FaaS de CWCloud

· 7 minutes de lecture
Idriss Neumann
founder cwcloud.tech

Ce blogpost va nous permettre d'illustrer un cas d'utilisation concret de l'utilisation du moteur FaaS1 de CWCloud pour à la fois exposer des fonctions serverless comme webhooks publics et également montrer comment interagir avec des LLM2.

En dehors de l'IT, j'aime pratiquer régulièrement certains sports, notamment la course à pied ou encore le powerlifting. Depuis un certain temps, j'utilise une Apple Watch SE pour récupérer les métriques et suivre la progression, entre autres au niveau de l'endurance et du cardio.

Pour un utilisateur "non-tech", le niveau de détail et de présentation des données au cours d'un exercice est très satisfaisant. Ici, vous avez par exemple le détail de ce qui se passe pendant une course : les positions GPS, le rythme cardiaque et les zones tout au long de l'exercice...

apple-activity-dashboard

La montre donne également plein d'autres données sur la qualité du sommeil, le rythme cardiaque au repos, les calories dépensées... mais il y a toujours eu un souci qui me frustre, comparé à d'autres modèles que j'ai pu avoir par le passé comme les montres Fitbit : pas d'API et webservices pour les développeurs. Or, j'aurais bien voulu récupérer ces données pour pouvoir les traiter avec des LLM en passant par le moteur FaaS low-code de CWCloud.

Cependant, pas d'API en ligne ne signifie pas pour autant qu'il est impossible de les récupérer : on voit que beaucoup d'applications sur l'iPhone sont capables de malgré tout récupérer les données de la montre, à l'exemple de Strava, MyFitnessPal...

Ces applications passent la plupart du temps par une lecture des données directement depuis l'iPhone en utilisant le framework d'Apple HealthKit et en donnant les permissions nécessaires depuis les paramètres de sécurité d'Apple.

Cependant, cela demande quand même beaucoup d'efforts pour quelqu’un qui n’est pas développeur mobile iOS de devoir builder et valider une application développée en Swift pour envoyer les données sur un webhook. J’ai cherché à voir si quelqu’un d’autre n’avait pas déjà fait ce travail. Et c’était effectivement le cas avec l’application Health Auto Export.

Cette application est assez mal notée, mais quand on lit les commentaires, on comprend parfaitement pourquoi : les gens n'ont pas compris à quoi elle servait. Entre autres, elle ne sert pas à faire de jolis dashboards d'agrégations statistiques, mais à exporter les données de santé d'Apple dans des formats exploitables par des développeurs (CSV ou JSON), et également à programmer des envois schedulés de ces exports vers des connecteurs externes (webhook REST/HTTP, fichiers MQTT, Dropbox...).

Dans notre cas, c’est très exactement ce qu’il nous fallait. Voici comment configurer, par exemple, un webhook HTTP pour envoyer les données à CWCloud dans une automation qui va tourner toutes les minutes :

health-auto-export

Toutes les minutes, la fonction serverless de CWCloud va recevoir comme payload un JSON au format suivant :

{
"data" : {
"metrics" : [
{
"units" : "count\/min",
"data" : [
{
"Min" : 79,
"date" : "2025-06-30 23:17:40 +0200",
"Avg" : 79,
"Max" : 79,
"source" : "Idriss’s Apple Watch"
},
{
"Min" : 66,
"Max" : 66,
"Avg" : 66,
"source" : "Idriss’s Apple Watch",
"date" : "2025-06-30 23:23:45 +0200"
},
{
"Max" : 66,
"date" : "2025-06-30 23:26:52 +0200",
"source" : "Idriss’s Apple Watch",
"Min" : 66,
"Avg" : 66
}
],
"name" : "heart_rate"
}
]
}
}

Dans l'automation, on pourra noter que j’ai filtré uniquement la métrique heart_rate, car sinon cela pourrait en envoyer beaucoup d’autres, et pas uniquement provenant de l’Apple Watch, mais également d’autres applications comme MyFitnessPal, qui fait le tracking de vos macros (calories, protéines, lipides, glucides, calcium, etc.) de votre alimentation. Bref, il y a vraiment de quoi faire des usecases très intéressants 😁.

Cela étant, ce payload n’est pas compatible avec le contrat d’interface de notre moteur serverless avec les endpoints classiques que nous avons documentés dans plusieurs démos, où l’on attend à l’avance les paramètres de votre fonction.

Il existe toutefois un endpoint /v1/faas/webhook/{function_id} (ou /v1/faas/webhook/{function_id}/sync si vous souhaitez recevoir la réponse de la fonction en synchrone dans la réponse HTTP). Dans ce cas, il faut que votre fonction soit définie avec un unique argument raw_data comme ceci :

faas-raw-data-arg

Une fois que c’est fait, il devient très simple d’invoquer la fonction en lui passant ce que vous voulez comme body, que vous pourrez ensuite parser directement dans votre code :

$ curl "https://api.cwcloud.tech/v1/faas/webhook/ecb10330-02bf-400b-b6a8-d98107324ac3/sync" -X POST -d '{"foo":"bar"}' 2>/dev/null|jq .
{
"status": "ok",
"code": 200,
"entity": {
"id": "78774026-f75e-4c7c-850a-9b9eb2cb2ec0",
"invoker_id": 3,
"updated_at": "2025-07-05T14:39:53.119780",
"content": {
"args": [
{
"key": "raw_data",
"value": "{\"foo\":\"bar\"}"
}
],
"state": "complete",
"result": "The data is : {\"foo\":\"bar\"}\n",
"user_id": null,
"function_id": "ecb10330-02bf-400b-b6a8-d98107324ac3"
},
"created_at": "2025-07-05T14:39:52.443918"
}
}

Vous l'aurez compris, dans l'automation de l'application Health Auto Export c'est une URL au format https://api.cwcloud.tech/v1/faas/webhook/{function_id} qu'il faudra définir (pas besoin du /sync à la fin car vous n'aurez pas besoin d'attendre le résultat de l'exécution de la fonction).

Note : on a aussi exposé la fonction en public pour pouvoir l’invoquer sans authentification, mais ce n’est pas forcément ce qui est souhaitable. N’oubliez pas que vous êtes facturés aux tokens que vous consommerez dans le cas ou vous utilisez des modèles publics. Donc ici on le fait à des fins illustratives mais vous n’allez pas forcément vouloir que tout le monde invoque votre webhook. Vous pouvez très bien gérer cela en gardant la fonction privée et en ajoutant un header X-User-Token dans l’automation sur l’application Health Auto Export.

Maintenant qu’on sait comment créer un webhook, voici le code Blockly3 pour extraire la moyenne de votre heart rate, l’envoyer au LLM gpt4omini. Ici, on a demandé au LLM de réagir avec un emoji à la valeur qu’il reçoit et d’envoyer le résultat dans Discord :

faas-blockly-heart-rate

Vous pouvez observer que je passe la phrase suivante "You're reacting with an emoji only if the heart rate is too slow or to high" comme prompt système ainsi que le nombre de battements cardiaque récupérée des données de l'Apple Watch comme prompt utilisateur.

En outre, il faut savoir que les blocs AI vous obligent à vous authentifier pour pouvoir invoquer l'API CWCloud AI. Si vous voulez conserver le fait d'ouvrir ce webhook à n'importe qui il faudra créer une clef d'API en suivant ce tutoriel et en injectant cette clef dans une variable d'environnement AUTH_HEADER_VALUE comme ceci :

faas-authentication-cwai

Dans ce cas tous le monde pourra invoquer votre webhook et c'est votre compte qui sera facturé à la consommation si vous utilisez des modèles d'IA publics. Vous pouvez aussi chosir d'utiliser votre propre LLM hébergé sur vos instances à la place et dans ce cas cela ferait plus sens de garder le webhook public 😇.

Il faut également savoir que si la variable AUTH_HEADER_VALUE est définie, elle est prise en priorité sur l'authentification lorsque vous invoquez le webhook de façon authentifiée.

On peut également remarquer dans la capture d'écran précédant qu'un webhook pour Discord a été défini dans une autre variable d'environnement DISCORD_WEBHOOK_URL afin d'être utilisé pour envoyer la réponse du LLM dans Discord, et voici le résultat :

faas-discord-heart-rate

On peut voir que jusqu'ici tout va bien côté cardio, rien à signaler 😅

Footnotes

  1. Function as a Service

  2. Large Language Model

  3. Blockly est le langage low-code qu'on utilise dans CWCloud

Fork It Tunis 2025, résumé de la journée

· 2 minutes de lecture
Idriss Neumann
founder cwcloud.tech

On l'a fait ! Tunis 🇹🇳 a enfin eu sa journée de conférence orientée pour les développeurs à la cité de la culture le 5 avril.

forkit-tn-2025-hall

Comme annoncé dans un précédent blogpost, nous avions monté un très beau stand dans le but de challenger les conférenciers avec un concours IA, serverless et IoT et on a eu beaucoup de participant(e)s.

forkit-tn-2025-cwcloud-booth

Félicitons encore nos gagnant(e)s: Zayneb, Ala Eddine et Yassmine1!

forkit-tn-2025-winners

Le code source de la démo est disponible sur github et si vous voulez plus d'explications, vous pouvez visionner cette courte vidéo :

J'ai également eu la chance d'avoir la scène pour parler de Quickwit, Grafana et OpenTelemetry avec une autre démo. Il était prévu de le faire en anglais mais finalement le public a préféré la langue de molière. Je m'excuse pour les personnes qui auraient souhaité le voir en anglais, il y aura d'autres occasions 😅.

forkit-tn-2025-talk-quickwit

Il y aura un replay, les slides et supports sont disponibles sur github également et si vous souhaitez en apprendre davantage, vous pouvez également lire ce blogpost.

J'ai également pu assister à la keynote très inspirante "how do you learn" d'Olivier et Sonyth Huber et vous recommande de visionner le replay lorsqu'il sera publié.

Et pour finir, j'ai également pu faire visiter Sidi Bou Saïd à mon ami speaker Yacine, la plus belle place de la région de Tunis. Yacine qui a également donné un super talk sur comment il a réussi à porter Doom sur navigateur en utilisant WASM, une merveilleuse technologie.

forkit-tn-2025-sidibou

Si vous souhaitez garder le contact, en particulier si vous avez apprécié les démo et le challenge de CWCloud, nous avons un serveur discord communautaire que vous pouvez rejoindre.

Les prochaines conférences auxquelles j'assisterai seront DevoxxFR comme visiteur, SunnyTech et RivieraDev en tant que speaker. J'espère vous y voir nombreux(se)s comme d'habitude 🤩.

Footnotes

  1. Yassmine n'a pas pu rester pour recevoir son cadeau donc son ami l'a pris à sa place 😅.