以下是将OpenAI与Vue结合的详细步骤和示例,帮助你构建一个可以与OpenAI的服务(如ChatGPT等模型)进行交互的Vue应用:
vue create
命令创建一个Vue项目。例如:vue create openai-vue-project
按照提示选择相应配置(如是否使用TypeScript、路由、状态管理等),创建完成后进入项目目录:
cd openai-vue-project
在Vue项目中,需要安装用于向OpenAI API发送HTTP请求的库,常用的是 axios
,在项目根目录下的命令行执行以下安装命令:
npm install axios
以下以在Vue组件中调用OpenAI的 gpt-3.5-turbo
模型进行问答交互为例进行说明,在 src/components
目录下创建一个名为 OpenAIChat.vue
的组件文件,示例代码如下:
<template>
<div>
<input v-model="userQuestion" placeholder="请输入你的问题" />
<button @click="sendQuestionToOpenAI">向OpenAI提问button>
<div v-if="openAIResponse">{{openAIResponse}}div>
div>
template>
<script>
import axios from 'axios';
export default {
data() {
return {
userQuestion: '',
openAIResponse: null
};
},
methods: {
async sendQuestionToOpenAI() {
try {
const apiKey = 'YOUR_API_KEY'; // 将此处替换为你自己获取的OpenAI API Key
const question = this.userQuestion;
const response = await axios.post(
'https://api.openai.com/v1/chat/completions',
{
model: "gpt-3.5-turbo",
messages: [{"role": "user", "content": question}]
},
{
headers: {
'Authorization': `Bearer ${apiKey}`,
'Content-Type': 'application/json'
}
}
);
this.openAIResponse = response.data.choices[0].message.content;
} catch (error) {
console.error(error);
this.openAIResponse = '很抱歉,请求出现错误,请稍后再试。';
}
}
}
};
script>
<style scoped>
/* 这里可以添加组件相关的样式,比如输入框、按钮等的样式 */
style>
在上述组件代码中:
template
)部分:
v-model
指令将输入框的值与组件的 userQuestion
数据属性进行双向绑定,方便获取用户输入的问题。sendQuestionToOpenAI
点击事件,用于触发向OpenAI发送问题的操作。div
元素,通过 v-if
指令根据 openAIResponse
的值来决定是否显示,用于展示OpenAI返回的回复内容。script
)部分:
axios
库,用于发送HTTP请求到OpenAI API。data
函数中定义了两个数据属性:userQuestion
用于存储用户输入的问题,openAIResponse
用于存储OpenAI返回的回复内容,初始值设为 null
。sendQuestionToOpenAI
方法是核心逻辑所在,它是一个异步方法。在方法内部:
axios
向OpenAI API的 https://api.openai.com/v1/chat/completions
端点发送POST请求,按照API要求,在请求体中传入要使用的模型(这里是 gpt-3.5-turbo
)以及包含用户问题的消息对象(格式为 [{"role": "user", "content": question}]
),同时在请求头中添加授权信息(即 Authorization
字段,格式为 Bearer YOUR_API_KEY
)和内容类型信息(Content-Type
为 application/json
)。openAIResponse
属性;若请求出现错误,则在控制台打印错误信息,并给 openAIResponse
设置相应的错误提示内容。在 src/App.vue
文件中引入并使用 OpenAIChat.vue
组件,示例代码如下:
<template>
<div id="app">
<OpenAIChat />
div>
template>
<script>
import OpenAIChat from './components/OpenAIChat.vue';
export default {
components: {
OpenAIChat
}
};
script>
<style>
/* 可以添加全局的样式 */
style>
这样,运行Vue项目后,在页面上就能通过输入框输入问题,点击按钮向OpenAI发送请求,并展示相应的回复内容,实现了OpenAI与Vue的基本结合应用。
OpenAIChat.vue
组件的 script
部分代码,示例如下:<script>
import axios from 'axios';
export default {
data() {
return {
userQuestion: '',
openAIResponse: null,
conversationHistory: [] // 新增对话历史数组
};
},
methods: {
async sendQuestionToOpenAI() {
try {
const apiKey = 'YOUR_API_KEY';
const question = this.userQuestion;
// 将当前问题添加到对话历史中
this.conversationHistory.push({"role": "user", "content": question});
const response = await axios.post(
'https://api.openai.com/v1/chat/completions',
{
model: "gpt-3.5-turbo",
messages: this.conversationHistory // 传递对话历史
},
{
headers: {
'Authorization': `Bearer ${apiKey}`,
'Content-Type': 'application/json'
}
}
);
const answer = response.data.choices[0].message.content;
// 将OpenAI的回复添加到对话历史中
this.conversationHistory.push({"role": "assistant", "content": answer});
this.openAIResponse = answer;
} catch (error) {
console.error(error);
this.openAIResponse = '很抱歉,请求出现错误,请稍后再试。';
}
}
}
};
</script>
在上述代码中:
data
函数里新增了 conversationHistory
属性,用于存储对话历史信息,初始化为空数组。sendQuestionToOpenAI
方法内,先将用户当前输入的问题以正确的格式添加到 conversationHistory
数组中,然后将整个对话历史数组作为消息内容传递给OpenAI API请求。当获取到回复后,同样把回复内容以相应格式添加到 conversationHistory
数组中,以便后续的对话轮次可以参考之前的交流内容,并且将回复内容展示在页面上。conversationHistory
数组以及 openAIResponse
等相关数据,方便用户重新开始对话。通过以上这些步骤和优化方式,能够更加有效地将OpenAI与Vue相结合,构建出功能丰富、交互友好的应用,满足不同场景下与OpenAI服务交互的需求。