Envisagez de créer une application pour travailler avec ChatGPT. Sa tâche consistera à recevoir des messages vocaux via Telegram, à les convertir en texte, à les transférer à ChatGPT et à renvoyer une réponse à Telegram. Au cours du processus de création, vous devrez suivre les étapes suivantes :
- Création d'un bot pour Telegram et sa configuration de base.
- Réception d'un fichier avec un message vocal (Telegram utilise le format .oga ).
- Conversion du fichier de oga à mp3.
- Transfert du fichier mp3 au service Whisper pour le convertir en texte.
- Envoi d'un texte reçu à ChatGPT.
- Envoi d'une réponse de ChatGPT à un utilisateur de Telegram.
Création d'un bot pour Telegram et sa configuration de base
Tout commence par l'enregistrement d'un robot. Pour ce faire, Telegram utilise son propre bot - BotFather. Vous devez lui écrire et suivre des étapes séquentielles simples.
Vous devriez ainsi disposer d'un lien vers votre robot et d'un jeton pour les requêtes à son API.
Vous pouvez maintenant passer à la configuration du bot dans AppMaster. La façon la plus simple de le faire est d'installer le module approprié. Il vous suffit de le sélectionner dans la liste des modules et de spécifier votre jeton API dans les paramètres.
Les modèles nécessaires seront automatiquement créés dans votre projet, des blocs pour travailler avec Telegram apparaîtront, ainsi que le processus commercial de base de Telegram Telegram: Echo. Il vaut la peine d'examiner attentivement et de comprendre le principe de travail.
À l'entrée, il reçoit un message de Telegram (modèleMessage ). Il contient le texte du message envoyé (text), ainsi que le modèle chat à partir duquel vous pouvez obtenir l'identifiant de l'expéditeur (id). Le dernier bloc Telegram: Send Message renvoie le message reçu à l'expéditeur, mais au nom du bot.
Vous pouvez utiliser ce processus métier pour le test initial du robot et la communication avec lui. Pour ce faire, vous devez créer un point de terminaison qui recevra des informations et lancera un processus opérationnel.
Lors de sa création, il est important de désactiver la fonction Middleware Token Auth. Le point de terminaison doit pouvoir être utilisé sans autorisation.
Le principe de fonctionnement du bot Telegram est assez simple : tous les messages qui lui sont envoyés sont transmis à un webhook spécial, qui peut les transférer automatiquement et les envoyer au point de terminaison de votre choix pour d'autres actions.
Par conséquent, la dernière étape consiste à activer le bot - vous devez enregistrer ce point de terminaison dans Telegram et indiquer que ce bot doit y être associé. Pour ce faire, vous devez envoyer à l'adresse POST une demande contenant l'URL complète du point de terminaison et indiquant votre jeton de robot au lieu de {Bot API Token}.
https://api.telegram.org/bot{Bot API Token}/setWebhook
Si vous recevez un tel message en réponse, c'est que tout s'est déroulé correctement.
{
"ok": true,
"result": true,
"description": "Webhook was set"
}
Le bot est prêt à fonctionner, vous pouvez lui envoyer un message et le recevoir en retour.
Réception d'un fichier avec un message vocal
Le module Telegram est principalement conçu pour travailler avec des messages texte. Notre tâche consiste à recevoir un fichier avec un message vocal. Avec AppMaster, vous pouvez facilement résoudre ce problème. Tout d'abord, nous devons analyser ce que nous recevons généralement de Telegram pour analyser la structure du message. Le bloc Get Request Body est conçu pour cela. Il élimine la nécessité de spécifier la structure de la requête à l'avance et vous permet de recevoir l'intégralité de la requête, quel que soit son contenu. Ce bloc renvoie le résultat de la requête sous la forme d'un ensemble d'octets, et vous pouvez utiliser le bloc To String pour présenter le résultat sous une forme lisible par l'homme, ainsi que pour l'enregistrer dans des journaux (Write to Log ) en vue d'une analyse ultérieure.
Nous nous intéressons à deux paramètres de l'ensemble de la requête :
Sender ID - spécifiés dans la demande comme "id":300493858
File ID - "file_id":"AwACAgIAAxkBAAMzZBk6QRvO-OYWsWUC-Bu1UXDM2FwAAkktAAKTZclIWTSkfTTw8wYvBA"
Vous pouvez créer votre propre modèle qui correspond à la demande et l'utiliser pour obtenir les champs requis. Mais il sera plus rapide de créer une expression régulière (Regex) et de l'utiliser. Pour ce faire, le bloc String Match Regex prend l'expression elle-même en entrée, ainsi que la chaîne de caractères dans laquelle la correspondance avec l'expression donnée sera vérifiée.
Dans le premier cas, l'expression est "id":"\d+
En conséquence, nous obtenons la chaîne "id":300493858, dont nous devrons supprimer le ("id":) ) supplémentaire à l'aide du bloc Replace String pour ne conserver que l'identifiant lui-même.
Dans le second cas, le principe est exactement le même, mais une expression légèrement plus complexe est utilisée : "file_id":"[^"]+
Nous avons maintenant l'identifiant de l'expéditeur et l'identifiant du fichier, et nous pouvons les utiliser pour obtenir le fichier lui-même. Pour ce faire, vous devez vous tourner vers Telegram API, ce qui a déjà été fait lors de l'enregistrement du point de terminaison du bot. Vous devez maintenant faire une demande similaire pour obtenir le fichier. {File ID} dans l'URL de la demande doit être remplacé par l'ID du fichier reçu.
https://api.telegram.org/bot{Bot API Token}/setWebhook/getFile?file_id={File ID}
Pour envoyer une requête et recevoir son résultat, nous utilisons le bloc HTTP Request en spécifiant l'URL et Method = GET comme paramètres.
La réponse reçue permet de connaître le chemin relatif du fichier, qui est transmis dans le paramètre "file_path". En conséquence, en utilisant l'expression régulière suivante ("file_path":"[^"]+), vous pouvez extraire la valeur souhaitée et la relier à "https://api.telegram.org/file/bot{Bot API Token}/" pour obtenir le lien complet vers le fichier.
Convertir un fichier de OGA en MP3
Le fichier est reçu, mais l'obstacle est que le service Whisper ne permet pas de travailler avec le format OGA Le fichier est reçu, mais l'obstacle est que le service ne permet pas de travailler avec le format Vous devez le convertir dans l'un des formats appropriés.
À titre d'exemple, le service Zamzar (son plan gratuit permet d'effectuer 100 conversions par mois) et la conversion vers MP3.
Vous pouvez vous référer à sa documentation pour plus de détails ou utiliser un autre service similaire. Nous n'analyserons pas en détail le travail avec ce service, et nous ne considérerons que la partie qui se rapporte directement à la mise en œuvre de AppMaster.
Tout d'abord, la demande doit contenir les données d'authentification correctes. Elles doivent être fournies dans le format Basic Authentication format. Pour ce faire, vous devez passer un en-tête avec des valeurs dans la requête :
Key = 'Authorization'
Value = 'Basic '+ ID utilisateur et mot de passe séparés par des " :" dans le format base64 format
La clé API obtenue lors de l'enregistrement auprès du service est l'identifiant de l'utilisateur. Il faut lui ajouter " :" et l'encoder au format Base64 en utilisant le bloc To Base64 à l'aide du bloc Le résultat doit être transformé en en-tête (Make Key-Value (String) bloc).
L'étape suivante consiste à créer un modèle pour la requête dans le concepteur de base de données. La requête doit être envoyée dans le format Multipart Form respectivement, il est nécessaire de préparer un modèle de la forme de cette requête. Dans notre exemple, le modèle se compose de trois champs de type String:
- source_file - le chemin complet du fichier source (il a été appris à l'étape précédente).
- source_format - le format du fichier source, dans cet exemple, il s'agit d'une valeur fixe "ogg".
- target_format - le format cible pour la conversion. Vous pouvez choisir n'importe quel format supporté par Whisper. Prenons l'exemple de "mp3".
Dans l'éditeur de processus, vous devez utiliser le bloc Make pour remplir les données du modèle et les envoyer en tant que demande POST à https://sandbox.zamzar.com/v1/jobs/ à l'aide du bloc HTTP Request (veillez à spécifier Serialize request body = Multipart Form).
Il convient de noter que cette demande ne renvoie pas le fichier converti, mais crée uniquement une tâche pour le convertir. Vous devez demander le résultat séparément ; pour cela, vous avez besoin de l'ID de la tâche créée. Cet identifiant doit être obtenu à partir du corps de la réponse à la requête, et pour cela, le processus déjà élaboré doit être effectué en utilisant des expressions régulières et en extrayant la valeur de l'identifiant.
Le résultat de la conversion doit être appliqué séparément. Cela nécessitera deux requêtes supplémentaires. La première consiste à savoir si le résultat est prêt. La seconde consiste à récupérer le fichier terminé. En même temps, nous ne connaissons pas l'heure exacte à laquelle le résultat est prêt, nous pouvons donc organiser une boucle qui enverra des demandes répétées pour vérifier l'état de préparation à certains intervalles (par exemple, toutes les secondes).
Un message HTTP Request doit être envoyé à l'aide de la méthode GET à l'URL https://sandbox.zamzar.com/v1/jobs/{id}, où {id} est l'identifiant de la tâche obtenu à l'étape précédente. Les en-têtes utilisés sont les mêmes que ceux de la demande précédente.
À partir de la réponse reçue, vous devez déterminer l'état de préparation. Si la conversion est terminée, la réponse contiendra "status": "successful" et pour nous, c'est le signal que nous pouvons terminer la boucle et passer à autre chose.
Outre le statut, la réponse doit contenir l'ID du fichier terminé ("target_files":[{"id":). Il faut l'extraire pour obtenir le lien final vers le fichier sous la forme suivante https://sandbox.zamzar.com/v1/files/{ID}/content
En même temps, la réception d'un fichier n'est accessible qu'aux utilisateurs autorisés, il faut donc exécuter un HTTP Request en utilisant les mêmes en-têtes que dans les demandes précédentes.
La demande permet d'obtenir le contenu du fichier, auquel il faut donner un nom et qu'il faut enregistrer en vue d'une utilisation ultérieure.
Envoi d'un fichier MP3 à Whisper pour conversion en texte
Tout est maintenant prêt pour l'étape suivante : l'envoi d'un fichier contenant un message vocal à des fins de reconnaissance. Pour ce faire, une autre demande est nécessaire dans le format Multipart Form au format Contrairement à l'exemple précédent, la demande devra transférer le fichier lui-même et non un lien vers celui-ci.
Un modèle de demande de ce type peut être créé dans la section External HTTP Request section. Dans ce cas, vous ne pouvez pas créer une demande complète, mais vous limiter à la création d'un modèle de corps de demande. Le modèle lui-même se compose de deux paramètres :
- File (Virtual File type) - le même fichier qui doit être reconnu.
- model (type String) - nous spécifions ici la valeur whisper-1.
En outre, pour la demande, il est nécessaire d'obtenir une clé pour travailler avec l OpenAI et de générer un en-tête d'autorisation du type Bearer Token type.
Key = 'Authorization'
Value = 'Bearer '+ OpenAI API Key
Ensuite, vous pouvez envoyer la demande POST elle-même pour reconnaître le message vocal au service Whisper à l'URL https://api.openai.com/v1/audio/transcriptions
Si la reconnaissance du fichier est réussie, une réponse sera reçue sous la forme suivante {"text": "Hello world.”}
Envoi d'un texte reçu à ChatGPT
Vous pouvez continuer à utiliser les blocs HTTP Request pour envoyer une demande à ChatGPT. Pour explorer la documentation de l'API, ainsi que pour créer indépendamment des modèles pour les demandes et les réponses. Mais vous pouvez également utiliser une option plus simple sous la forme d'un module prêt à l'emploi de AppMaster pour travailler avec OpenAIqui doit être installé dans la section des modules.
Dans la version minimale suffisante, il vous suffit de spécifier les paramètres du modèle OAI ChatCompletionMessage (role = user, content = message à envoyer), de l'ajouter au tableau et d'envoyer une requête à ChatGPT avec le bloc OpenAI: Create Chat Completion (set parameter model = gpt-4).
Nous obtenons ainsi une réponse de ChatGPT, que nous lisons dans le paramètre content du modèle OAI ChatCompletionChoice modèle.
Envoi d'une réponse de ChatGPT à un utilisateur en Telegram
La dernière étape consiste simplement à répéter ce qui a déjà été fait auparavant - envoyer un message à Telegram. Mais si nous avons commencé par renvoyer simplement le message à l'expéditeur, ce message a maintenant lancé une série d'actions diverses et le résultat est renvoyé sous la forme d'une réponse de ChatGPT.
Dans le cadre du développement d'un tel robot, il convient de prendre en compte les éléments suivants :
- Telegram travailler de manière à ce que chaque requête envoyée par le bot soit traitée avec succès. Sinon, il essaiera de la répéter plusieurs fois, ce qui signifie qu'en cas de problème, vous la recevrez encore et encore. Veillez à ce que la logique soit construite de manière à ce que la demande n'entraîne pas d'erreur et puisse être traitée avec succès.
- Toutes les demandes ne fonctionneront pas comme prévu du premier coup. Vous devrez rechercher les erreurs et, pour ce faire, prévoir des Write to Log blocs. Ils sont utiles à la fois pour vérifier que chaque bloc reçoit effectivement les données que vous avez prévu de transmettre et pour analyser le résultat du bloc et étudier la réponse en détail.
- Dans le cadre du guide, nous avons supposé que toutes les demandes sont prévisibles et réussies et que le processus est assez linéaire. Dans la pratique, il sera nécessaire de prévoir une variété d'options pour les actions (par exemple, que faire si l'utilisateur envoie un message texte au lieu d'un message vocal ou même une image) et la gestion des erreurs (vérifier le statut des requêtes HTTP, prendre en compte les différentes options de réponse).