<template>
<div class="container mx-auto">
<div class="w-full flex flex-col items-center justify-center">
<div class="mb-2 text-xl">Ask ChatGPT</div>
<div>
<div class="text-xs mt-6 mb-8 md:min-h-40">
<a :href="'/nova/chatgpt/view-questions-history'"
class="bg-transparent hover:text-gray-500 hover:bg-gray-200 text-blue-700 font-semibold py-1 px-2 border rounded shadow">
View History
</a>
<a :href="'#'" @click="clearHistory"
class="ml-3 bg-transparent hover:bg-gray-200 hover:bg-blue-500 text-blue-700 font-semibold h py-1 px-2 border border-blue-500 hover:border-transparent rounded">
Clear History
</a>
<a href=" https://platform.openai.com/account/api-keys" target="_blank"
class="ml-3 bg-transparent hover:bg-blue-500 text-blue-700 font-semibold hover:text-white py-1 px-2 border border-blue-500 hover:border-transparent rounded">
Get API Key
</a>
<a href="https://github.com/naifalshaye/chatgpt-nova4" target="_blank"
class="ml-3 bg-transparent hover:bg-blue-500 text-blue-700 font-semibold hover:text-white py-1 px-2 border border-blue-500 hover:border-transparent rounded">
Doc
</a>
</div>
</div>
<div v-if="this.error" class="text-red-500 font-bold mt-4 mb-4 flex justify-center text-center">
{{ this.error }}
</div>
<div class="w-full md:w-3/5 mb-8">
<form @submit.prevent="submitForm" ref="form" method="post" class="space-y-8">
<div class="bg-white dark:bg-gray-800 rounded-lg shadow p-4">
<div class="py-4 md:py-6">
<div class="text-left text-md mb-2">Question</div>
<input type="text" class="w-full form-control form-input form-input-bordered text-center"
v-model="question" placeholder="Type in your question.."
@input="enableSubmit">
</div>
<div class="flex justify-center">
<button type="button"
class="appearance-none bg-transparent font-bold text-gray-400 hover:text-gray-300 active:text-gray-500 dark:text-gray-500 dark:hover:text-gray-400 dark:active:text-gray-600 dark:hover:bg-gray-800 cursor-pointer rounded text-sm font-bold focus:outline-none focus:ring ring-primary-200 dark:ring-gray-600 inline-flex items-center justify-center h-9 px-3 appearance-none bg-transparent font-bold text-gray-400 hover:text-gray-300 active:text-gray-500 dark:text-gray-500 dark:hover:text-gray-400 dark:active:text-gray-600 dark:hover:bg-gray-800 mr-1"
@click="cancel()">
Clear
</button>
<button type="submit" :disabled='this.submitIsDisabled'
class="bg-primary-500 hover:bg-primary-400 text-white dark:text-gray-900 cursor-pointer rounded text-sm font-bold focus:outline-none focus:ring ring-primary-200 dark:ring-gray-600 h-8 px-4 shadow">
<span>Send</span>
</button>
</div>
</div>
</form>
</div>
<div class="w-full md:w-3/5 mb-8">
<div class="min-h-[90px] bg-white dark:bg-gray-800 rounded-lg shadow p-4">
<div class="text-left text-md mb-2">Answer</div>
<p class="justify-start text-md whitespace-pre-wrap pl-2"> {{ answer.trim() }} </p>
</div>
<div class="flex mt-2">
<div class="w-1/2">
Tokens: {{ total_tokens ? total_tokens : 0 }}
</div>
<div class="w-4/5">
<div class="flex justify-end">
<div>
<button @click="copy(this.answer)">
<svg xmlns="http://www.w3.org/2000/svg" class="h-6 w-6" fill="none"
viewBox="0 0 24 24" stroke="currentColor" stroke-width="2">
<path stroke-linecap="round" stroke-linejoin="round"
d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"/>
</svg>
</button>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
import useClipboard from 'vue-clipboard3'
import GithubButton from 'vue-github-button'
export default {
components: {useClipboard, GithubButton},
setup() {
const {toClipboard} = useClipboard()
const copy = async (answer) => {
try {
if (answer) {
await toClipboard(answer)
}
} catch (e) {
alert(e.message);
}
}
return {copy}
},
data() {
return {
question: '',
answer: '',
total_tokens: '',
submitIsDisabled: true,
formSubmitted: false,
error: ''
};
},
mounted() {
},
methods: {
async ask(table) {
if (table.target.value === '') {
this.columns = [];
} else {
this.database_table = table.target.value;
Nova.request().get('/nova-vendor/chatgpt-seeder/columns/' + table.target.value, {}).then(({data}) => {
this.columns = data.columns
})
}
},
cancel() {
this.$refs.form.reset();
this.question = '';
this.answer = '';
this.total_tokens = '';
},
submitForm() {
Nova.request().post('/nova-vendor/chatgpt/ask', {question: this.question})
.then(({data}) => {
if (data.api_response_error) {
this.error = data.api_response_error;
} else if (data.exception) {
this.error = data.exception_message;
} else {
this.answer = data.answer;
this.total_tokens = data.total_tokens;
}
})
},
clearHistory() {
Nova.request().post('/nova-vendor/chatgpt/history/clear', {question: this.question})
.then(({data}) => {
})
},
enableSubmit() {
this.submitIsDisabled = false;
}
},
}
</script>
|