Skip to content

Commit 875d385

Browse files
committed
error handling
1 parent 3fe1880 commit 875d385

File tree

8 files changed

+126
-29
lines changed

8 files changed

+126
-29
lines changed

index.html

+1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
<meta charset="UTF-8">
55
<link rel="icon" href="/ossia-logo.svg">
66
<link href="https://cdn.jsdelivr.net/npm/@mdi/[email protected]/css/materialdesignicons.min.css" rel="stylesheet">
7+
<script defer src="https://analytics.eu.umami.is/script.js" data-website-id="92e52834-d667-40bc-97ce-bb7c314703a9"></script>
78
<meta name="viewport" content="width=device-width, initial-scale=1.0">
89
<title>Ossia</title>
910
</head>

src/App.vue

-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
<template>
55
<main>
66
<RouterView/>
7-
<!-- <InterpreterView/>-->
87
</main>
98
</template>
109

src/components/InterpreterView/SettingsOverlay.vue

+84-15
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@ const showOpenAIKey = ref(false)
1212
<template>
1313
<div id="overlay-container">
1414
<div id="overlay">
15+
<div id="accept-terms-prompt" v-if="settingsStore.showSettingsWarning">
16+
You must enter an OpenAI API Key (and accept the terms and conditions) before Ossia Voice can do anything smart!
17+
</div>
1518
<div id="scrollable">
1619
<h2 class="title">Welcome to Ossia</h2>
1720
<div class="group-content">
@@ -45,7 +48,8 @@ const showOpenAIKey = ref(false)
4548
<h3 class="subheading"><span style="color: red">*</span> User Backstory</h3>
4649
Describe the user in as much detail as possible. e.g. name, hobbies, political leaning, temperament, family
4750
and close friends etc.
48-
<span id="example-link" @click="settingsStore.backstory = settingsStore.exampleBackstory">Or use an example</span>
51+
<span id="example-link"
52+
@click="settingsStore.backstory = settingsStore.exampleBackstory">Or use an example</span>
4953
<div id="backstory-input-wrapper">
5054
<v-textarea id="backstory-input" label="user backstory" v-model="settingsStore.backstory" hide-details/>
5155
</div>
@@ -66,27 +70,45 @@ const showOpenAIKey = ref(false)
6670
most. Thoughts, ideas and contributions are very much welcomed. Please reach out if you would like to be
6771
involved!
6872
<div id="contact-links">
69-
<a href="https://twitter.com/arneyjfs" rel="noopener noreferrer"
70-
target="_blank"><v-icon>mdi-twitter</v-icon></a>
71-
<a href="https://github.com/OssiaAI/OssiaVoice" rel="noopener noreferrer"
72-
target="_blank"><v-icon>mdi-github</v-icon></a>
73-
<a href="https://www.linkedin.com/in/james-arney-50246711a/" rel="noopener noreferrer"
74-
target="_blank"><v-icon>mdi-linkedin</v-icon></a>
73+
<a href="https://twitter.com/arneyjfs" rel="noopener noreferrer" target="_blank">
74+
<v-icon>mdi-twitter</v-icon>
75+
</a>
76+
<a href="https://github.com/OssiaAI/OssiaVoice" rel="noopener noreferrer" target="_blank">
77+
<v-icon>mdi-github</v-icon>
78+
</a>
79+
<a href="https://www.linkedin.com/in/james-arney-50246711a/" rel="noopener noreferrer" target="_blank">
80+
<v-icon>mdi-linkedin</v-icon>
81+
</a>
7582
</div>
7683

84+
<!-- <a id="buy-me-a-coffee" class="raised" href="https://www.buymeacoffee.com/arneyjfs" target="_blank"-->
85+
<!-- rel="noopener noreferrer">-->
86+
<!-- <img-->
87+
<!-- src="https://cdn.buymeacoffee.com/buttons/v2/default-yellow.png"-->
88+
<!-- alt="Buy Me A Coffee"-->
89+
<!-- >-->
90+
<!-- </a>-->
91+
7792
© James Arney, 2024
7893
</div>
7994
</div>
80-
<v-btn
81-
id="save-btn"
82-
:disabled="!(settingsStore.liabilityAgreement &&
95+
<div id="bottom-buttons">
96+
<v-btn
97+
id="complete-later-btn"
98+
@click="emit('close')">
99+
Complete later
100+
</v-btn>
101+
<v-btn
102+
id="save-btn"
103+
:disabled="!(settingsStore.liabilityAgreement &&
83104
settingsStore.cookieAgreement &&
84105
settingsStore.openAIAPIKey &&
85106
settingsStore.backstory
86107
)"
87-
@click="emit('close'); settingsStore.save()">
88-
Let's Go
89-
</v-btn>
108+
@click="emit('close'); settingsStore.save()">
109+
Let's Go
110+
</v-btn>
111+
</div>
90112
</div>
91113
</div>
92114
</template>
@@ -123,6 +145,14 @@ const showOpenAIKey = ref(false)
123145
margin: 10px 0 0 10px;
124146
}
125147
148+
#accept-terms-prompt{
149+
background: orange;
150+
border-radius: 5px;
151+
padding: 10px;
152+
margin: 5px;
153+
text-align: center;
154+
}
155+
126156
#scrollable {
127157
display: flex;
128158
flex-direction: column;
@@ -184,16 +214,55 @@ a {
184214
padding: 10px 0px;
185215
}
186216
217+
#bottom-buttons {
218+
display: flex;
219+
justify-content: end;
220+
}
221+
222+
#complete-later-btn {
223+
background: #e1e1e1;
224+
width: 150px;
225+
height: 40px;
226+
margin: 10px 10px 0 20px;
227+
text-transform: none;
228+
229+
//&:deep(span) {
230+
// color: theme.$text-color;
231+
//}
232+
}
233+
187234
#save-btn {
188235
background: theme.$primary;
189-
bottom: 0;
190236
width: 130px;
191237
height: 40px;
192-
margin: 10px 20px 10px auto;
238+
margin: 10px 20px 0 10px;
239+
text-transform: none;
240+
193241
194242
&:deep(span) {
195243
color: theme.$text-color;
196244
}
197245
}
198246
247+
#buy-me-a-coffee {
248+
margin: 10px 0 20px 0;
249+
width: 145px;
250+
height: 40px;
251+
border-radius: 7px;
252+
position: relative;
253+
254+
&:deep(img) {
255+
width: 145px;
256+
height: 40px;
257+
258+
&:hover {
259+
filter: brightness(98%)
260+
}
261+
262+
&:active {
263+
filter: brightness(95%)
264+
}
265+
}
266+
}
267+
199268
</style>

src/components/reusable/MicButton.vue

+4-3
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@ import {ref} from "vue";
33
import micImg from '@/assets/mic-button/mic.svg'
44
import micHoverImg from '@/assets/mic-button/mic-hover.svg'
55
import micActiveImg from '@/assets/mic-button/mic-active.svg'
6+
import {AlertStore} from "@/stores/AlertStore.js";
7+
8+
const alertStore = AlertStore();
69
710
const micActive = ref(false)
811
const micBtnImage = ref(micImg)
@@ -61,18 +64,16 @@ function startRecognition() {
6164
const transcript = event.results[i][0].transcript;
6265
if (event.results[i].isFinal) {
6366
model.value = transcript
64-
console.log(`Final recognition: ${transcript}`)
6567
}
6668
else {
67-
console.log(`interim recognition: ${transcript}`)
6869
interimTranscript += transcript
6970
model.value = interimTranscript
7071
}
7172
}
7273
}
7374
7475
recognition.onerror = event => {
75-
console.log("Error occurred in recognition: " + event.error)
76+
alertStore.showAlert('error', "Error occurred in recognition", event.error)
7677
}
7778
}
7879

src/repositories/ChatCompletionRepository.js

+22-9
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,22 @@
11
import OpenAI from "openai";
22
import {useLoadingStore} from "@/stores/LoadingStore.js";
33
import {useSettingsStore} from "@/stores/SettingsStore.js";
4+
import {AlertStore} from "@/stores/AlertStore.js";
45

56
const model = "gpt-4-turbo-preview" // "gpt-4-turbo-preview" // "gpt-3.5-turbo-0125" //
67

78
export async function getResponse(messageHistory, command, wordLoading = false,
89
sentenceLoading = false) {
910
const loadingStore = useLoadingStore()
1011
const settingStore = useSettingsStore()
12+
const alertStore = AlertStore()
13+
14+
console.log('API', settingStore.openAIAPIKey)
15+
if (!(settingStore.openAIAPIKey && settingStore.backstory && settingStore.liabilityAgreement)) {
16+
settingStore.showSettingsOverlay = true
17+
settingStore.showSettingsWarning = true
18+
return
19+
}
1120

1221
let client = new OpenAI({
1322
apiKey: settingStore.openAIAPIKey, dangerouslyAllowBrowser: true
@@ -39,15 +48,19 @@ export async function getResponse(messageHistory, command, wordLoading = false,
3948

4049
finalCommand += command
4150
messages = messages.concat([{role: "system", content: finalCommand}])
42-
const completion = await client.chat.completions.create({
43-
messages,
44-
model: model,
45-
temperature: 0.5,
46-
top_p: 0.5,
47-
response_format: {"type": "json_object"}
48-
});
49-
50-
return JSON.parse(completion.choices[0].message.content)['suggestions']
51+
try {
52+
const completion = await client.chat.completions.create({
53+
messages,
54+
model: model,
55+
temperature: 0.5,
56+
top_p: 0.5,
57+
response_format: {"type": "json_object"}
58+
});
59+
return JSON.parse(completion.choices[0].message.content)['suggestions']
60+
} catch (err) {
61+
alertStore.showAlert('error', `Error (${err.type})`, err.message)
62+
}
63+
5164
} finally {
5265
if (wordLoading) {
5366
loadingStore.newWordsLoading--

src/repositories/TextToSpeechRepository.js

-1
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@ export default async function speak(text) {
3131
// return voice.name === 'Aaron';
3232
// })[0];
3333
msg.voice = window.voice;
34-
console.log(msg.voice);
3534
// Queue this utterance.
3635
window.speechSynthesis.cancel(); // stop saying anything else
3736
window.speechSynthesis.speak(msg);

src/stores/SettingsStore.js

+13
Original file line numberDiff line numberDiff line change
@@ -140,22 +140,35 @@ assistant:
140140
const cookieAgreement = ref(localStorage.getItem('cookieAgreement') === "true" || false)
141141

142142
function save() {
143+
if (!(cookieAgreement.value && liabilityAgreement.value)) {
144+
showSettingsOverlay.value = true
145+
showSettingsWarning.value = true
146+
return
147+
}
143148
localStorage.setItem('openAIAPIKey', openAIAPIKey.value)
144149
localStorage.setItem('context', context.value)
145150
localStorage.setItem('backstory', backstory.value)
146151
localStorage.setItem('liabilityAgreement', liabilityAgreement.value.toString())
147152
localStorage.setItem('cookieAgreement', cookieAgreement.value.toString())
153+
showSettingsWarning.value = false
148154
console.log('settings saved')
149155
}
150156

151157
watch(context, async (newContext) => {
158+
if (!(cookieAgreement.value && liabilityAgreement.value)) {
159+
showSettingsOverlay.value = true
160+
showSettingsWarning.value = true
161+
return
162+
}
152163
localStorage.setItem('context', newContext)
153164
})
154165

155166
const showSettingsOverlay = ref(!(liabilityAgreement.value && cookieAgreement.value))
167+
const showSettingsWarning = ref(false)
156168

157169
return {
158170
showSettingsOverlay,
171+
showSettingsWarning,
159172
openAIAPIKey,
160173
context,
161174
backstory,

src/views/InterpreterView.vue

+2
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import MessageOptions from "@/components/InterpreterView/MessageOptions.vue";
66
import SettingsOverlay from "@/components/InterpreterView/SettingsOverlay.vue";
77
import {useLoadingStore} from "@/stores/LoadingStore.js";
88
import {useSettingsStore} from "@/stores/SettingsStore.js";
9+
import ErrorHandling from "@/components/reusable/AlertHandling.vue";
910
1011
const loadingStore = useLoadingStore()
1112
const settingStore = useSettingsStore()
@@ -42,6 +43,7 @@ const settingStore = useSettingsStore()
4243
</div>
4344
</div>
4445
</div>
46+
<error-handling/>
4547
</div>
4648
</template>
4749

0 commit comments

Comments
 (0)