From d622eb93b40a3c9f716c104f9efc9587feaf6580 Mon Sep 17 00:00:00 2001
From: Julien Dupont
Date: Wed, 22 May 2024 17:21:54 +0200
Subject: [PATCH] add compatible Browsers
---
src/App.css | 13 +++++++++++
src/App.tsx | 67 ++++++++++++++++++++++++++++++++++++++++++++++-------
2 files changed, 72 insertions(+), 8 deletions(-)
diff --git a/src/App.css b/src/App.css
index b00eea8..aa81f05 100644
--- a/src/App.css
+++ b/src/App.css
@@ -79,6 +79,19 @@
}
}
+.text-error {
+ background-color: #f8d7da;
+ color: #721c24;
+ border: 1px solid #f5c6cb;
+ padding: 10px 15px;
+ border-radius: 5px;
+ margin: 0 2.5rem;
+}
+
+.underline {
+ text-decoration: underline;
+}
+
@media (max-width: 768px) {
.textbox-container {
flex-direction: column;
diff --git a/src/App.tsx b/src/App.tsx
index edf59a7..6bed64b 100644
--- a/src/App.tsx
+++ b/src/App.tsx
@@ -12,6 +12,12 @@ import Progress from './components/Progress';
import { ActionIcon, Button, Textarea, Tooltip } from '@mantine/core';
import { IconSwitchHorizontal, IconSwitchVertical } from '@tabler/icons-react';
+declare global {
+ interface Window {
+ chrome?: any;
+ }
+}
+
appConfig.useIndexedDBCache = true;
if (appConfig.useIndexedDBCache) {
@@ -22,10 +28,14 @@ if (appConfig.useIndexedDBCache) {
function App() {
const selectedModel = 'CroissantLLMChat-v0.1-q0f16';
- const promptEnglishToFrench =
- "Pouvez-vous traduire ce texte en francais sans ajouter d'informations ?";
+ const promptSentenceEnglishToFrench =
+ "Pouvez-vous traduire ce texte en francais sans ajouter d'informations ? Voici le texte :";
+ const promptSentenceFrenchToEnglish =
+ 'Can you translate this text in english for me without adding informations: ';
const promptFrenchToEnglish =
- 'Can you translate this text in english for me without adding informations';
+ 'Translate these words in english. Just write the word translated, nothing else: ';
+ const promptEnglishToFrench =
+ 'Traduis ces mots en francais. Ecris juste la traduction : ';
const [engine, setEngine] = useState(null);
const [progress, setProgress] = useState('Not loaded');
const [progressPercentage, setProgressPercentage] = useState(0);
@@ -36,11 +46,15 @@ function App() {
const [output, setOutput] = useState('');
const [modelInCache, setModelInCache] = useState(null);
const [switched, setSwitched] = useState(false);
+ const [errorBrowserMessage, setErrorBrowserMessage] = useState(
+ null
+ );
//const [showModal, setShowModal] = useState(false);
useEffect(() => {
+ const compatibleBrowser = checkBrowser();
checkModelInCache();
- if (!engine) {
+ if (!engine && compatibleBrowser) {
loadEngine();
}
}, []);
@@ -51,6 +65,27 @@ function App() {
setOutput('');
}, [switched]);
+ const checkBrowser = () => {
+ const userAgent = navigator.userAgent;
+ let compatibleBrowser = true;
+ if (/firefox|fxios/i.test(userAgent)) {
+ setErrorBrowserMessage("Firefox n'est pas compatible avec WebGPU.");
+ compatibleBrowser = false;
+ } else if (
+ /safari/i.test(userAgent) &&
+ !/chrome|crios|crmo/i.test(userAgent)
+ ) {
+ setErrorBrowserMessage("Safari n'est pas compatible avec WebGPU.");
+ compatibleBrowser = false;
+ } else if (!window.chrome) {
+ setErrorBrowserMessage(
+ "Votre navigatuer n'est pas compatible avec WebGPU."
+ );
+ compatibleBrowser = false;
+ }
+ return compatibleBrowser;
+ };
+
const initProgressCallback = (report: InitProgressReport) => {
//console.log(report);
if (
@@ -103,9 +138,6 @@ function App() {
let loadedEngine = engine;
const paragraphs = inputUser.split('\n');
- console.log(paragraphs);
-
- const prompt = switched ? promptEnglishToFrench : promptFrenchToEnglish;
if (!loadedEngine) {
console.log('Engine not loaded');
@@ -127,15 +159,25 @@ function App() {
for (let i = 0; i < paragraphs.length; i++) {
const paragraph = paragraphs[i];
+
if (paragraph === '') {
assistantMessage += '\n';
setOutput((prevOutput) => prevOutput + '\n');
} else {
+ const words = paragraph.split(' ');
+ let prompt = '';
+ if (words.length > 5) {
+ prompt = switched
+ ? promptSentenceEnglishToFrench
+ : promptSentenceFrenchToEnglish;
+ } else {
+ prompt = switched ? promptEnglishToFrench : promptFrenchToEnglish;
+ }
const userMessage: ChatCompletionMessageParam = {
role: 'user',
content: prompt + paragraph,
};
-
+ console.log(userMessage);
const completion = await loadedEngine.chat.completions.create({
stream: true,
messages: [userMessage],
@@ -241,6 +283,15 @@ function App() {
navigateur. Vos données ne quittent pas votre ordinateur et ne
transitent par aucun serveur.
+ {errorBrowserMessage && (
+
+ {errorBrowserMessage} Veuillez consulter{' '}
+
+ cette page
+ {' '}
+ pour voir la compatibilité avec les navigateurs.
+
+ )}
{/*