Création d’une application Chatbot et Traduction avec Nextjs et React Native à l’aide de ChatGPT (OpenAI)
Qu’est-ce que ChatGPT ?
J’ai posé la même question sur Chat-GPT
, et voici ce qu’elle a dit. 🤯
ChatGPT est un modèle de chatbot développé par OpenAI qui est basé sur le modèle de langage GPT (Generative Pre-trained Transformer). Il est conçu pour générer des réponses de type humain à la saisie de texte dans un contexte conversationnel. ChatGPT utilise une combinaison de techniques d’apprentissage automatique et de traitement du langage naturel pour générer des réponses appropriées aux entrées de l’utilisateur d’une manière qui ressemble à une conversation humaine.
Le modèle ChatGPT est formé sur un grand ensemble de données de conversations humaines, et il est capable de générer des réponses cohérentes, contextuellement pertinentes et souvent assez similaires à celles qu’un humain pourrait fournir dans un contexte conversationnel similaire. ChatGPT est capable de maintenir une personnalité ou un « caractère » cohérent tout au long d’une conversation, et il peut également générer des réponses à un large éventail de sujets et de types de contenu.
ChatGPT peut être utilisé pour créer des chatbots ou des agents conversationnels capables d’interagir avec les utilisateurs dans divers contextes, notamment le service client, le commerce électronique, les médias sociaux, etc. C’est également un outil utile pour les chercheurs et les développeurs travaillant sur le traitement du langage naturel et la technologie des chatbots. — À partir de ChatGPT
Comme vous pouvez le voir, il est très précis dans sa réponse.
Dans cet article, nous verrons comment nous pouvons utiliser l’API d’OpenAI pour intégrer ChatGPT dans une application React Native afin de créer un Chatbot et une application de traduction de texte.
Pour votre référence :
Créer le ServerSide avec Nextjs
Pour utiliser ChatGPT dans React Native, qui sera notre côté client, nous devons d’abord créer un serveur. Le serveur aura deux points de terminaison API REST ask-a-question
et translate
. Le premier point de terminaison prendra un paramètre appelé question
dans le corps de la requête et renverra une réponse à question
laquelle nous interrogerons à partir de la createCompletion
méthode OpenAI. Le deuxième point de terminaison sera translate
qui prendra deux paramètres query
et language
. Le premier paramètre query
stockera le texte que l’utilisateur souhaite traduire et le second est language
la langue dans laquelle l’utilisateur souhaite traduire.
Bon, assez parlé ; Commençons maintenant à coder.

Vous pouvez trouver le code dans ce référentiel .
Pour créer un nouveau Nextjs
projet, dirigez-vous vers votre terminal et tapez la commande suivante.
npx create-next-app@latest
OU Ajoutez un indicateur dactylographié à créer dans typescipt
npx create-next-app@latest --typescript
Vous serez invité à indiquer le nom que vous souhaitez donner à votre projet, entrez ce que vous voulez et continuez.
Une fois votre projet créé, ouvrez le dossier du projet dans votre éditeur de code préféré.
Pour tester l’exécution de l’application, exécutez la commande suivante :
dev fil
OU
npm run dev
OU
prochain dev
Une fois votre application en cours d’exécution, vous pouvez l’afficher surhttp://localhost:3000/
Nous devons créer deux points de terminaison d’API afin de ne toucher à rien d’autre dans le dossier des pages que le api
dossier.
Nextjs
traite les fichiers de ce dossier comme des points de terminaison d’API, créons notre premier point de terminaison.
Créez un nouveau nom de fichier ask-a-question.ts
dans pages/api
.
Avant d’écrire du code dans ce fichier, nous devons d’abord l’installer openai
dans notre projet.
Exécutez la commande ci-dessous pour installer openai
la dépendance dans votre projet à l’aide de n’importe quel gestionnaire de packages.
fil ajouter openai
OU
npm i openai
Maintenant, utilisons-le.
Nous allons créer un fichier commun qui configurera leOpenAiApi
Créez un nouveau dossier à la racine du projet et ajoutez-y un nom de fichier config.ts
.
mkdir src && touch config.ts
Ajoutez maintenant le code suivant dans ce fichier :
importer { Configuration , OpenAIApi } depuis "openai" ;
const config = nouvelle Configuration ({
apiKey : process. env . OPEN_AI_KEY
});
const openAI = new OpenAIApi (config);
exporter openAI par défaut ;
De plus, nous devons ajouter le fichier OPEN_AI_KEY
in .env
.
toucher . env
Vous devez maintenant créer une clé API pour utiliser l’API d’Open AI, suivez ce lien pour le faire.
Connectez-vous à leur site Web et créez votre API-KEY.
R EMARQUE : Vous ne pouvez pas utiliser Open AI API sans
apiKey
Nous allons maintenant ajouter le code pour gérer le point de ask-a-question
terminaison, ajoutez le code ci-dessous dans ask-a-question.ts
le fichier.
type d'importation { NextApiRequest , NextApiResponse } de "suivant" ;
importez openAI depuis "../../src/config" ;
type Data = {
résultat ? : chaîne | indéfini ;
erreur ? : chaîne ;
} ;
exportez le gestionnaire de fonction asynchrone par défaut ( req : NextApiRequest, res : NextApiResponse<Data> ) { if (!req?. body ?. question ){ res. statut
( 400 ). json ({ erreur : 'Paramètres non valides' })
} achèvement
const = attendre openAI. createCompletion ({
model : 'text-davinci-003' ,
prompt : req?. body ?. question ,
temperature : 0.8 ,
max_tokens : 2048 ,
});
rés. statut ( 200 ). json ({ résultat : achèvement. données ?. choix?.[ 0 ]?. texte });
}
Dans le code ci-dessus, nous vérifions d’abord s’il request
a une valeur de paramètre valide question
, sinon nous retournons 400
avec un message d’erreur Invalid params
. Si nous obtenons les paramètres correctement, nous appelons openAI.createCompletion
la méthode qui appelle l’ openai
API sous le capot avec les options données prompt
et spécifiées et d’autres.model
Nous transmettons le question
que nous recevons dans le corps de la requête à l’API, puis nous await
jusqu’à ce qu’il revienne. Ensuite, nous renvoyons simplement la réponse dans le fichier response
.
La sortie sera comme ci-dessous :

Créons maintenant le deuxième point de terminaison, c’est-à-dire pour la traduction.
Créez un autre fichier dans pages/api
et nommez-le translate.ts
, puis ajoutez le code suivant à l’intérieur.
type d'importation { NextApiRequest , NextApiResponse } de "suivant" ;
importez openAI depuis "../../src/config" ;
type Data = {
résultat ? : chaîne | indéfini ;
erreur ? : chaîne ;
} ;
exportez le gestionnaire de fonction asynchrone par défaut ( req : NextApiRequest, res : NextApiResponse<Data> ) { if (!req?. body ?. query || !req?. body ?.
langue ) {
rés. statut ( 400 ). json ({ erreur : "Paramètres invalides" });
}
const { query = "" , language = "English" } = req?. corps ;
const achèvement = attendre openAI. createCompletion ({
model : "text-davinci-003" ,
// Nous demandons l'API dans le format ci-dessous
// Le ?? après `query` est juste une
invite HACK : `translate ${query} ?? in ${ Langue}` ,
température : 0.8 ,
max_tokens : 2048 ,
});
rés. statut ( 200 ). json ({ résultat : achèvement. données ?. choix ?.[ 0 ]?. texte });
}
Ça y est, nous avons créé deux points de terminaison utilisant Chat-GPT pour répondre à n’importe quoi.
La sortie de ce qui précède sera :

Youpi 🔥 nous avons terminé le Backend de notre application.
Vous pouvez le déployer en utilisant Vercel , c’est très simple et rapide.
Créer une application avec React Native
Créons maintenant une application mobile pour utiliser ce back-end que nous venons de créer.
Si vous souhaitez ignorer le code, voici l’ URL du référentiel . Vous devez également télécharger le dossier des actifs à partir du référentiel.
Nous utiliserons React Native pour créer l’application mobile pour iOS et Android. Commencez par créer un nouveau projet natif de réaction.
npx react-native init <votre-nom-de-projet> -- template react -native- template - typescript
une fois le projet créé, exécutez-le sur le simulateur iOS et l’émulateur Android à l’aide des commandes ci-dessous
fil ios
fil android
OR
réactif natif run-android
réactif natif run-ios
Vous devriez maintenant avoir une application React Native en cours d’exécution sur vos simulateurs.
Avant de commencer à écrire notre code, supprimons le App.tsx
fichier de code de démarrage et ajoutons ce qui suit.
importer React , {useState} de 'react' ;
import { View , Text , StyleSheet , Image , Pressable , TextInput } from 'react-native' ; Application
const : Réagissez . FC = () => ( <View style={styles.container}> <Text>Bonjour React Native !</Text> </View> ); styles const = Feuille de style . créer ({ conteneur : { flex
: 1 ,
justifieContent : 'center' ,
alignItems : 'center' ,
},
});
exporter l' application par défaut ;
Vous devez maintenant voir un écran blanc avec du texte Hello React Native!
au centre.
Nous allons maintenant écrire le code pour afficher une barre d’onglets sur l’écran de l’application, la barre d’onglets aura deux options, la première sera pour le chat (où l’utilisateur peut taper n’importe quoi pour obtenir des résultats appropriés) la seconde sera la section de traduction.
Ajoutez le code suivant àApp.tsx
importer React , {useState} de 'react' ;
import { View , Text , StyleSheet , Image , Pressable , TextInput } from 'react-native' ;
import { Conversation as ConversationIcon , Translate } from './assets' ;
import { Conversation , Traduction } de './src/components' ;
interface ContentProps{ index
sélectionné : nombre ;
}
const Contenu : Réagissez . FC < ContentProps > = ( { selectedIndex } ) => {
switch (selectedIndex) {
case 0 :
return <Conversation />
case 1 :
return <Translation />
default : return <></>;
}
} Application
const : Réagissez . CF = () => { const
[selectedIndex, setSelectedIndex] = useState< nombre >( 0 );
const changeSelection = ( sélection : nombre ) => () => setSelectedIndex (sélection);
return (
<View style={styles.container}>
<Content {...{selectedIndex}} />
<View style={styles.tabBar}>
<Pressable onPress={changeSelection(0)}>
<Image style={ styles.tabIcon} source={ConversationIcon} />
</Pressable>
<Pressable onPress={changeSelection(1)}>
<Image style={styles.tabIcon} source={Translate} />
<
</Afficher>
</Afficher>
);
} ;
styles const = Feuille de style . créer ({
conteneur : {
flex : 1 ,
justifierContent : 'flex-end' ,
alignItems : 'center' ,
},
tabBar : {
flexDirection : 'row' ,
justifierContent : 'space-around' ,
alignItems : 'center' ,
paddingBottom : 30 ,
rembourrageHaut : 20,
backgroundColor : '#82AAE3' ,
width : '100%' ,
shadowColor : "#000" ,
shadowOffset : {
height : - 6 ,
width : 0
},
shadowOpacity : 0.2 ,
shadowRadius : 10 ,
},
tabIcon : {
width : 24 ,
hauteur : 24 ,
},
});
exporter l' application par défaut ;
Comme vous l’aurez remarqué, nous n’avons pas encore créé Conversation
de Translation
composants. Continuons et créons-les, en commençant par le Conversation
composant.
Créez un nouveau dossier à la racine du projet nommé src
et un autre dossier nommé components
à l’intérieur.
mkdir src && cd src && composants mkdir && composants cd && touch index.ts
mkdir Conversation && cd Conversation && touch index.tsx && touch styles.ts
Collez maintenant le code suivant dans index.tsx
le fichier du Conversation
dossier.
import React , {useCallback, useRef, useState} de 'react' ;
import {
Image ,
KeyboardAvoidingView ,
Platform ,
ScrollView ,
Text ,
TextInput ,
View ,
} from 'react-native' ;
import { Typing } from '../../../assets' ;
importer {getAnswer} depuis '../../services/api' ;
importer les styles depuis './styles' ; const
d'exportation Conversation : Réagissez . FC = () => {
const [texte, setText] = useState< string >( '' );
const [chargement, setLoading] = useState< boolean >( false );
const [conversation, setConversation] = useState< Enregistrement < chaîne , chaîne >>({});
const scrollRef = useRef< ScrollView >( null );
const handleSubmit = useCallback ( async () => {
setTimeout (() => scrollRef ?. actuel ?. scrollToEnd ({ animé : vrai }), 200 );
setConversation ( prev => ({
...prev,
...{[ `sent ${ Object .keys(prev)?.length} ` ]: text},
}));
setText ( '' );
setLoading ( vrai );
réponse const = attendre getAnswer (texte);
setLoading ( faux );
setConversation (prev => ({
...prev,
...{[ `received ${ Object .keys(prev)?.length} ` ]: answer},
}));
setTimeout ( () => scrollRef?.current ? .scrollToEnd ( { animé : vrai }), 200 );
}, [texte]);
return (
<>
<ScrollView
ref={scrollRef}
keyboardDismissMode="interactive"
showsVerticalScrollIndicator={false}
keyboardShouldPersistTaps={'always'}
contentContainerStyle={styles.scrollView}>
{Object?.keys(conversation)?.map(keyName => {
if (keyName?.includes('sent')) {
return (
<View
key={`sent${keyName} `}
style={[styles.sent, styles.chatBubble]}>
<Text
selectable
selectionColor={'purple'}
style={styles.msgText}>
{conversation?.[keyName]}
</Text>
</View>
);
}
return (
<View key={keyName} style={[styles.received, styles.chatbulle]}>
<Text selectable selectionColor={'yellow'} style={styles.msgText}>
{conversation?.[keyName]?.replace('\n', '')?.replace('\n', '')}
</Text>
</View>
);
})}
{chargement && (
<View
key={'typingLoader'}
style={[styles.received, styles.chatBubble]}>
<Image
resizeMode="contain"
source={Typing}
style={styles.typingLoader}
/ >
</View>
)}
</ScrollView>
behavior={Platform.OS === 'ios' ? 'padding' : 'height'}>
<TextInput
blurOnSubmit
autoCapitalize="none"
autoComplete="off"
autoCorrect={false}
keyboardAppearance={'dark'}
keyboardType={'web-search'}
style={styles.input}
placeholder="Demandez-moi n'importe quoi...."
value={text}
onChangeText={setText}
onSubmitEditing={handleSubmit}
placeholderTextColor={'#1116'}
/>
</KeyboardAvoidingView>
</>
);
} ;
Avant d’entrer dans le code ci-dessus, collez le code ci-dessous dans styles.ts
le fichier dans le même dossier.
importez {Dimensions, StyleSheet} depuis 'react-native' ;
export const LARGEUR = Dimensions. obtenir ( 'fenêtre' ).width;
exporter la feuille de style par défaut . créer ({
conteneur : {
flex : 1 ,
justifierContent : 'flex-end' ,
alignItems : 'center' ,
},
entrée : {
borderWidth : 2 ,
borderColor : '#91D8E4' ,
width : WIDTH - 40,
hauteur : 60 ,
borderRadius : 12 ,
backgroundColor : '#EAFDFC' ,
paddingHorizontal : 14 ,
fontWeight : '700' ,
color : '#000' ,
marginBottom : 20 ,
shadowColor : '#82AAE3' ,
shadowOffset : {
height : 0 ,
width : 0 ,
},
shadowOpacity : 0.4 ,
shadowRadius: 4 ,
},
loader : {
position : 'absolute' ,
largeur : '100%' ,
hauteur : '100%' ,
zIndex : 999 ,
backgroundColor : '#fffc' ,
justifierContent : 'center' ,
alignItems : 'center' ,
},
scrollView : {
paddingHorizontal : 20 ,
paddingTop : 60 ,
paddingBottom : 140 ,
largeur : LARGEUR,
},
envoyé : {
backgroundColor : '#04DE71' ,
alignSelf : 'flex-end' ,
},
reçu : {
backgroundColor : '#2094FA' ,
alignSelf : 'flex-start' ,
},
chatBubble : {
borderRadius : 20 ,
paddingVertical : 12 ,
marginBottom : 8 ,
maxWidth : WIDTH / 2 + 80 ,
paddingHorizontal: 16 ,
},
msgText : {
fontWeight : '500' ,
color : '#FFF' ,
letterSpacing : 0.2 ,
},
typingLoader : {
width : 80 ,
height : 20
}
});
Voyons maintenant ce que fait le code du Conversation
composant.
Nous avons fait ce qui suit dans le code :
- Nous avons créé trois variables d’état pour stocker et mettre à jour
text
,loading
state etconversation
. Nous avons également créé un objet ref nomméscrollRef
que nous utiliserons pour faire défiler vers le bas de notre vue de défilement de chat. - Ensuite, nous avons déclaré une
handleSubmit
méthode, cette méthode est chargée de définir la fin du texte de l’utilisateur dansconversation
puis d’appeler lagetAnswer
méthode qui appelle notre API backend et renvoie la réponse de l’API ( nous créerons cette méthode à l’étape suivante ). Ensuite, nous ajoutons la réponse que nous obtenons de l’API dans notreconversation
état var. Scrollview
est utilisé pour rendre toutes les données enconveration
variable. Nous le mappons pour rendre tous les textes que nous avons envoyés et reçus de l’API.- Enfin, nous avons notre
TextInput
enveloppé dans unKeyBoardAvoidingView
afin qu’il ne se cache pas derrière le clavier de l’appareil. CeciTextInput
est responsable de l’obtention de l’entrée de l’utilisateur et de l’appel de lahandleSubmit
méthode lorsque l’utilisateur soumet dans le fichierTextInput
.
Cela ne fonctionnera pas encore car nous n’avons pas getAnswer
encore créé la méthode.
Pour ce faire, créez un nouveau nom de dossier services
dans src
et à l’intérieur du dossier créez un autre dossier nommé api
, puis un nom de fichier index.ts
.
cd src && services mkdir && services cd
mkdir api && cd api
touch index.ts
Pour appeler les API dans notre application, nous utiliserons axios
, alors installons-le.
fil ajouter axios
OU
npm i axios
Une fois la dépendance installée, collez le code ci-dessous dans index.ts
le fichier.
importer des axios depuis 'axios' ;
const BASE_URL = 'http://nextjs-chatgpt-be.vercel.app/api/' ;
export const getAnswer = async ( question: string ) => {
try {
const res = wait axios. poster (
` ${BASE_URL} poser-une-question` ,
{question},
);
retour res?. données ?. résultat ;
} catch (e) {
console . Erreur(e);
retour 'Quelque chose s'est mal passé !! ☹️' ;
}
} ;
export const getTranslatedText = async ( requête : chaîne , langue : chaîne ) => {
essayer {
const res = attendre axios. post ( ` ${BASE_URL} traduire` , {requête, langue});
retour res?. données ?. résultat ;
} catch (e) {
console . erreur (e);
retour 'Quelque chose s'est mal passé !! ☹️';
}
};
Dans le code ci-dessus, nous avons déclaré deux méthodes :
getAnswer
pour appeler le point deask-a-question
terminaisongetTranslatedText
pour appeler le point detranslate
terminaison ( nous utiliserons cette méthode dans les étapes ultérieures ).
Après avoir écrit tout ce code, notre application ressemblera à ceci :

N’est-ce pas cool 😎 , nous venons de créer un chatbot complet dans React Native en utilisant un minimum de code.
Passons à la dernière partie, la création de l’application de traduction de texte.
Créez un dossier nommé Translation
dans components
dossier.
composants cd && mkdir Translation && cd Translation
touch index.tsx && touch styles.ts
Ajoutez le code ci-dessous dansstyles.ts
importez {StyleSheet} depuis 'react-native' ;
importer {LARGEUR} depuis '../Conversation/styles' ;
exporter la feuille de style par défaut . créer ({
conteneur : {
flex : 1 ,
justifierContent : 'flex-start' ,
alignItems : 'center' ,
paddingTop : 80 ,
},
entrée : {
borderWidth : 2 ,
borderColor : '#91D8E4' ,
width : WIDTH - 40,
hauteur : 60 ,
borderRadius : 12 ,
backgroundColor : '#EAFDFC' ,
paddingHorizontal : 14 ,
fontWeight : '700' ,
color : '#000' ,
marginBottom : 20 ,
shadowColor : '#82AAE3' ,
shadowOffset : {
height : 0 ,
width : 0 ,
},
shadowOpacity : 0.4 ,
shadowRadius: 4 ,
},
translateText : {
fontWeight : '700' ,
fontSize : 24 ,
color : '#000' ,
textAlign : 'left' ,
alignSelf : 'flex-start' ,
letterSpacing : 0.4 ,
}
});
Ajoutez le code suivant dansindex.tsx
import { View , Text , TextInput , Button , ActivityIndicator } from 'react-native' ;
import React , {useCallback, useState} de 'react' ;
importer les styles depuis './styles' ;
importer {getTranslatedText} depuis '../../services/api' ;
export const Traduction : React . FC = () => {
const [texte, setText] = useState< chaîne>( '' );
const [langue, setLanguage] = useState< string >( 'English' );
const [translatedText, setTranslatedText] = useState< string >( '' );
const [chargement, setLoading] = useState< boolean >( false );
const translateText = useCallback ( async () => {
setLoading ( true );
const result = attendre getTranslatedText (texte, langue);
setTranslatedText (résultat);
setLoading( faux );
}, [texte, langue]);
return (
<View style={styles.container}>
<TextInput
placeholder="Entrez le texte à traduire"
style={styles.input}
value={text}
onChangeText={setText}
placeholderTextColor={'#1116'}
/>
< TextInput
placeholder="Entrez la langue dans laquelle traduire"
style={styles.input}
value={language}
onChangeText={setLanguage}
placeholderTextColor={'#1116'}
/>
{loading ? (
<ActivityIndicator size={'large'} couleur={'
) : (
<Button title={`Translate to ${language}`} onPress={translateText} />
)}
<Text style={styles.translatedText}>{translatedText}</Text>
</View>
);
} ;
C’est un composant très simple qui a deux TextInputs
pour gérer deux variables d’état text
et language
. text
est la chaîne réelle que l’utilisateur veut traduire et language
est la langue souhaitée dans laquelle l’utilisateur veut traduire.
Ensuite, nous avons un Button
qui, lorsqu’il est pressé, appelle la translateText
méthode. Cette méthode appelle la getTranslatedText
méthode qui récupère le texte traduit depuis notre API.
La sortie du code ci-dessus sera similaire à ci-dessous :

Félicitations 🎉 , vous venez de créer une application ChatBot et Transaltion en utilisant React Native et Nextjs.
Conclusion
Comme je devenais paresseux, j’ai utilisé ChatGPT pour écrire la conclusion de cet article. 😆

C hatGPT est une puissante technologie de chatbot qui a révolutionné la façon dont les chatbots interagissent avec les gens. Grâce à ses capacités de traitement du langage naturel, il peut comprendre l’intention de l’utilisateur et fournir des réponses pertinentes. À mesure que les technologies d’intelligence artificielle continuent d’évoluer, ChatGPT évoluera également. À l’avenir, on peut s’attendre à ce qu’il fournisse des interactions encore plus intelligentes, ce qui en fait un outil inestimable dans le paysage des chatbots. — À partir de ChatGPT