Chat vision
Envoie une URL d’image avec une question à un LLM capable de vision (GPT-4o) et retourne la description. Deux points d’entrée : main pour un appel CLI unique, et server pour un serveur HTTP acceptant des requêtes JSON.
Exécution
CLI one-shot :
melodium run 12_vision_chat/Compo.toml \
--image_url "https://example.com/photo.jpg" \
--question "What do you see?" \
--openai_key sk-...Serveur HTTP :
melodium run 12_vision_chat/Compo.toml server -- --openai_key sk-... --port 8080$ curl -X POST http://127.0.0.1:8080/describe \
-H "Content-Type: application/json" \
-d '{"url":"https://example.com/photo.jpg","question":"Describe this image."}'
L'image montre un…Fonctionnement
Les deux points d’entrée instancient le même modèle Vision :
model Vision(const openai_key: string) : RemoteLlm {
backend = "openai"
model = "gpt-4o"
system = "You are an expert image analyst. Describe images clearly and in detail."
…
}main — point d’entrée CLI
See in Compositeur Studio
describeUrl reçoit l’URL de l’image et la question comme paramètres const, émet une StringMap, et utilise format pour construire la chaîne du prompt — pas de concaténation de chaînes dans le dataflow. La réponse est envoyée en fan-out au journal et à un fichier local simultanément.
server — point d’entrée HTTP
See in Compositeur Studio
Le sous-traitement handleDescribe utilise un modèle JavaScriptEngine (PromptBuilder) pour parser le corps JSON et construire le prompt dynamiquement. C’est plus flexible qu’une chaîne de format fixe quand la structure d’entrée peut varier.
decode() -> toJson() -> unwrapBody -> buildPrompt[engine=promptBuilder] -> unwrapPrompt -> promptStr -> promptOr -> chat[llm=llm]tryToString<Json>() extrait une chaîne simple du résultat JSON avec un retour Option<string>, que unwrapOr<string>(default="") résout ensuite en repli sûr.
Dépendances
[dependencies]
std = "0.10.1" # flux de base, journalisation, structures de données
fs = "0.10.1" # lecture/écriture de fichiers locaux
http = "0.10.1" # serveur et client HTTP
net = "0.10.1" # utilitaires d'adresses IP
json = "0.10.1" # parsing et sérialisation JSON
encoding = "0.10.1" # encodage / décodage UTF-8
javascript = "0.10.1" # moteur JavaScript embarqué
ml = "0.10.1" # inférence LLM, STT, TTS et modèles locaux