Site icon Blog Zenika

ADK, Gemini & Javelit = 😍

Tandis que les épisodes de notre podcast Zenikast se succèdent, la nécessité de produire la transcription de chaque épisode est bien entendu toujours d’actualité (cf précédent article). 

Si une première approche s’était révélée concluante avec Vertex AI, une solution qui nous avait clairement aidé dans la production de qualité de ces transcriptions, nous voulions aller plus loin en rendant disponible ce moyen de transcription à l’ensemble des collaborateurs·trices de Zenika, via une interface graphique, indépendamment de leur connaissance en Vertex AI, Google Cloud Platform ou autre item technique.

En tant que développeur, l’idée de démarrer un projet, un “nième side project”, vient rapidement à l’esprit 😁. Javaiste depuis mes études, il était évident pour moi que ce nouveau projet allait se faire avec du Java !

🤖 ADK

La première question tourne autour du “comment”. Comment intégrer Gemini dans une API? Une librairie de bas niveau de Google, java-genia, couvre clairement ce besoin. 

Mais mon regard s’est finalement porté vers Agent Development Kit (ADK), un framework créé par Google facilitant la création d’agents. Initialement créé en Python, des versions Java et dernièrement en Go sont disponibles.

Après avoir créé votre projet maven, vous aurez besoin de cette dépendance :

<dependency>    <groupId>com.google.adk</groupId>
    <artifactId>google-adk</artifactId>
    <version>${adk-java-version}</version>
</dependency>

La librairie google-adk amène plusieurs classes dont voici les 3 principales et nécessaires que vous allez manipuler :

La classe LlmAgent représente le builder de votre agent. C’est à cet endroit que vous allez définir votre agent avec un nom, une description, le modèle à utiliser et des instructions.

return LlmAgent.builder().name("agent name")
.description("This is my first agent").model("model name") 
.instruction("Your prompt")
.build();

> À noter que le choix du modèle est libre et peut être un autre modèle que Gemini.

Une instance de InMemoryRunner permet d’initier et de gérer le cycle de vie de votre agent, notamment l’allocation mémoire à son fonctionnement. 

InMemoryRunner runner = new InMemoryRunner(YourAgent.build(), APP_NAME);

Une session est ensuite à initier à partir de ce runner afin de maintenir l’état conversationnel avec l’agent :

Session session = runner
.sessionService()
.createSession(runner.appName(), APP_NAME)
.blockingGet();

L’exécution de votre agent peut se faire avec cet exemple : 

Flowable<Event> events = runner.runAsync(session.userId(), session.id(),
Content.fromParts(Part.fromText("Vos instructions")));

Le résultat est récupéré à partir de l’events :

events.blockingForEach(event -> {

  System.out.println(event.stringifyContent());

});

Une fois configuré, l’agent est exécuté avec cette commande et lorsque la réponse sera obtenue, votre programme sera arrêté. Votre agent est fonctionnel 🎉.

mvn compile exec:java -Dexec.mainClass="yourPackage.YourAgent" -Dexec.args="--adk.agents.source-dir=."

ADK met à disposition une seconde dépendance, google-adk-dev, offrant une interface graphique pour tester, utiliser et debbuger vos agents.

⚠️ Cette dépendance est à utiliser lors de vos développements.

<dependency>    <groupId>com.google.adk</groupId>
    <artifactId>google-adk-dev</artifactId>
</dependency>

La commande à exécuter est légèrement différente. Elle exécute la classe `AdkWebServer`disponible dans la dépendance d’ADK. 

mvn compile exec:java \    -Dexec.mainClass="com.google.adk.web.AdkWebServer" \
    -Dexec.args="--adk.agents.source-dir=. --server.port=8000"

Cette interface est composée de deux parties. La première, le menu de gauche, détaille les différents événements et étapes de réflexions de votre agent, comme les logs, l’état des sessions en cours et passées ainsi que les outils que l’agent peut être amené à utiliser.

La partie centrale quant à elle, est une zone de conversation où vous interagissez avec votre agent. Dans cet exemple, je lui envoie un passage audio pour vérifier la qualité de la transcription (et de mon prompt associé).

👉Retrouvez toute la documentation d’ADK sur https://google.github.io/adk-docs .

⚙️ Gemini 3

La sortie de la version 3 de Gemini a été remarquée de par sa progression par rapport à la précédente version et notamment grâce à son entraînement multimodal. Google a sorti une gamme de modèles très performant, que ce soit Gemini 3 pro, mais aussi sur son modèle d’images, Nano Banana ou bien vidéo avec Veo 3

Après avoir testé Gemini 3 pour nos transcriptions, l’amélioration de la qualité est clairement présente. 

🎨 Javelit 

Javelit est un projet créé par Cyril de Catheu. Inspiré de Streamlit, une librairie de création de composants graphiques en Python, Javelit est une variante pour … Java. Ce projet n’a pas vocation àconcurrencer les frameworks Front end comme Angular, Vue ou React. Il offre la possibilité de créer rapidement des applications web dans le même langage que votre API, et ça, c’est super intéressant. 

A partir de l’import de la dépendance et du package core, vous avez accès à des classes qui vous permettent d’avoir votre premier composant graphique en Java.

<dependency>
    <groupId>io.javelit</groupId>
    <artifactId>javelit</artifactId>
</dependency>
import io.javelit.core.Jt;

public class MyFirstJavelitApp {
    public static void main(String[] args) {
        Jt.markdown("# Vive Java ☕ !").use();
    }
}

Dans cet exemple, je mentionne un composant “markdown” mais le catalogue de composants est très complet, avec par exemple : 

👉Retrouvez la documentation complète sur https://docs.javelit.io/

🙌 ADK + Javelit = ♥️ 

La puissance et la simplicité d’ADK pour créer un agent, combinées à l’efficacité de Javelit pour développer des interfaces graphiques permettent de transformer rapidement des idées en applications fonctionnelles de A à Z. L’infrastructure “mono composant” amène aussi des simplicités dans le déploiement, par exemple avec Cloud Run il est rapidement possible de déployer et mettre à disposition une application.

C’est avec ce raisonnement que l’application de transcription de podcast Zenika a été créée et déployée sur Google Cloud Platform.

Plusieurs options ont été rajoutées pour modifier ou adapter le prompt en fonction des besoins comme l’affichage de l’horodatage dans la transcription (merci Théophile pour l’idée), ou bien pour générer une transcription stricte (équivalente aux mots des intervenants·es) ou une version plus lisible.

👉 Retrouvez le projet Agent-Z-transcribe-podcast sur GitHub : http://github.com/zenika-open-source/agent-Z-transcribe-podcast/ 

Ce trinôme ADK, Gemini + Javelit est une belle découverte. Déployée sur une instance serverless comme Cloud Run, notre application de transcription de podcast est graphiquement agréable, sans trop de prise de tête avec du CSS 😅, et utilise la puissance du dernier modèle de Gemini pour me générer une transcription de qualité.Cela donne des idées par la suite pour faire rapidement des projets. Si on ajoute à cette expérience, l’utilisation de l’IDE “agentique” Antigravity, la production et surtout la réalisation de nouveaux projets vont pouvoir voir le jour beaucoup plus rapidement 🚀.

Auteur/Autrice

Quitter la version mobile