先上代码
js
import OpenAI from "openai";
const openai = new OpenAI({ baseURL: '你的代理地址', apiKey: '你的apikey' });
//创建助手
async function Assistant() {
const response = await openai.beta.assistants.create({
instructions: "这是一个测试程序",
name: "测试",
model: "gpt-4",
});
return response.id; // 返回助手的 ID
}
//创建线程
async function Thread() {
const response = await openai.beta.threads.create();
return response.id; // 返回线程的 ID
}
//添加聊天消息的函数
async function messages(threadId) {
const response = await openai.beta.threads.messages.create(
threadId,
{ role: "user", content: "How does AI work? Explain it in simple terms." }
);
console.log(response.content);
}
//启动运行
async function run(threadId, assistantId) {
const response = await openai.beta.threads.runs.create(
threadId,
{ assistant_id: assistantId }
);
return response.id
}
//查询线程运行状态,非completed则等待后查询
async function runstatus(threadId, runId) {
let run;
do {
run = await openai.beta.threads.runs.retrieve(
threadId,
runId
);
if (run.status !== "completed") {
console.log("Run is not completed, waiting...");
await new Promise(resolve => setTimeout(resolve, 5000)); // 等待5秒
}
} while (run.status !== "completed");
console.log("Run completed:", run);
}
//获取全部聊天消息
async function messageslist(threadId) {
const messages = await openai.beta.threads.messages.list(threadId);
console.log(messages);
}
async function main() {
try {
const assistantId = await Assistant();
const threadId = await Thread();
await messages(threadId);
const runId = await run(threadId, assistantId);
await runstatus(threadId, runId);
await messageslist(threadId);
} catch (error) {
console.error("An error occurred:", error);
}
}
main();
Assistant工作流程
1.创建助手
- 由于助手和线程是可重复使用的,你应该在创建它们之后保存它们的 ID。这样,你可以避免每次都重新创建它们,从而提高效率。
- 可以将它们保存在数据库、环境变量或配置文件中,以便在未来的运行中重用。
2.创建线程
- 通过线程与助手进行对话,不同线程互不相干,且单个线程中聊天记录始终保存,直到上限被刷新。
3.加入消息
- 相较于chat类型api,Assistant api无需每次都传入全部聊天记录,只需要向线程中添加消息,则可实现山修改文关联
4.run起来,获得runid
- 启动线程运行,获取运行id,然后监测运行状态。
5.获取run状态,检测run是否结束
- 监测运行状态,如果Assistant线程处理结束,则可以提取消息
6.拿到助手回复,及获取messagelist
- 获取到消息列表,Assistant最新回答都在里面。
Assistant继续使用
- 向线程中添加消息
- run
- run结束后获取消息列表
- 示例代码
js
//添加消息
async function messagesinput(threadId, input) {
const response = await openai.beta.threads.messages.create(
threadId,
{ role: "user", content: input }
);
console.log(response.content);
}
async function chat() {
await messagesinput('thread_0WtWyk8pKhPm2fSdH5HSX53l', "你好啊");
const runId = await run('thread_0WtWyk8pKhPm2fSdH5HSX53l', 'asst_7MFbYPHSWhHHEQkXlukIFr0F');
await runstatus('thread_0WtWyk8pKhPm2fSdH5HSX53l', runId);
await messageslist('thread_0WtWyk8pKhPm2fSdH5HSX53l');
}
chat()
Assistant的优势与不足
不足
- 不支持流式
- 暂不支持传入图片
- 需要自行检测run状态,无法主动告知
优势
-
无需传入大量聊天记录,可以进行文献检索
-
支持自定义结束等多种功能
-
不足将在未来几个月得到解决(此文章发布于2023/11/26)