将LINE Messaging API和OpenAI API进行整合
做过的事情 de
LINE Messaging API和OpenAI的准备工作
LINE消息API
按照公式指南,在LINE开发者控制台上创建消息API。
在構築Lambda之後,也需要設置Webhook。
开放人工智能
Lambda – 莱姆达 mǔ dá)
创建函数
在LINE开发者控制台中设置Webhook URL。
添加层
这次使用openai和@line/bot-sdk作为node_modules,将它们附加到Lambda Layer中。
在本地计算机上创建一个名为”nodejs”的目录,并按照以下方式安装node_modules。
PS C:\Users\flets\OneDrive\node\nodejs> npm i @line/bot-sdk openai
PS C:\Users\flets\OneDrive\node\nodejs> npm ls
node@ C:\Users\flets\OneDrive\node
+-- @line/bot-sdk@7.5.2
`-- openai@3.1.0
PS C:\Users\flets\OneDrive\node\nodejs>
程式的描述
我将按照以下方式进行描述。
调用模块、设置令牌和密钥
首先,在handler函数之前,导入LINE和OpenAI的模块,并设置LINE的频道访问令牌和OpenAI的API密钥。(很抱歉直接写了)
import line from "@line/bot-sdk";
import { Configuration, OpenAIApi } from "openai";
//事前に確認したものを記述
const LINE_TOKEN = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
const GPT_KEY = "sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
与LINE Messaging API的互动
首先,编写处理程序函数的内容。首先,编写与LINE Messaging API进行交互的框架。
export const handler = async(event) => {
//LINEのMessaging APIに接続
const client = new line.Client({
channelAccessToken: LINE_TOKEN,
});
//LINEからWebhookでアクセスしてきたときのBodyをJSONに格納
const reqBody = JSON.parse(event.body);
console.log(reqBody)
let message = {};
//このあと、ここでOpenAIのAPIを呼び出してmessageの中身を埋めます
//LINE Messaging APIでメッセージをPushする宛先
const toToken = reqBody.events[0].source.userId;
//メッセージをPush
await client.pushMessage(toToken, message).catch((err) => {
// error handling
console.error(err);
});
//Webhookに対するResponse(200応答が必要らしい)
const response = {
statusCode: 200,
body: JSON.stringify(message),
};
return response;
};
调用OpenAI的API,并将其存储在消息中。
使用OpenAI的API访问,并将响应数据存储在消息中。
由于LINE的Webhook必须是文本消息,所以我也会加入if条件语句以便分支处理。
//WebhookがテキストだったらOpenAIになげる
if (reqBody.events[0].message.type == "text") {
//OpenAIアクセス設定
const configuration = new Configuration({
apiKey: GPT_KEY,
});
//オブジェクト作成
const openai = new OpenAIApi(configuration);
//APIアクセス、レスポンス格納
//max_tokensを変えればレスポンスの最大文字数が変化
//ただし、max_tokensの値が純粋な最大文字数ではないので注意
//ただしLINE、OpenAIそれぞれで上限値ありなので要確認
const response = await openai.createCompletion({
model: "text-davinci-003",
prompt: reqBody.events[0].message.text,
max_tokens: 1000,
temperature: 0,
});
message = {
type: "text",
text: response.data.choices[0].text.trim()
};
} else {
//LINEからのWebhookがテキストメッセージじゃなかった場合
message = {
type: "text",
text: "テキストを入力してください。"
};
}
整个文本的内容
以下是全文内容。
import line from "@line/bot-sdk";
import { Configuration, OpenAIApi } from "openai";
const LINE_TOKEN = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
const GPT_KEY = "sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
export const handler = async(event) => {
const client = new line.Client({
channelAccessToken: LINE_TOKEN,
});
const reqBody = JSON.parse(event.body);
console.log(reqBody)
let message = {};
if (reqBody.events[0].message.type == "text") {
const configuration = new Configuration({
apiKey: GPT_KEY,
});
const openai = new OpenAIApi(configuration);
const response = await openai.createCompletion({
model: "text-davinci-003",
prompt: reqBody.events[0].message.text,
max_tokens: 1000,
temperature: 0,
});
message = {
type: "text",
text: response.data.choices[0].text.trim()
};
} else {
message = {
type: "text",
text: "テキストを入力してください。"
};
}
const toToken = reqBody.events[0].source.userId;
await client.pushMessage(toToken, message).catch((err) => {
// error handling
console.error(err);
});
const response = {
statusCode: 200,
body: JSON.stringify(message),
};
return response;
};
只要在控制台上进行部署即可。
如果屏幕顶部显示“函数myGptFunction已成功更新”,那就没问题!
校验行动
我先试着做了一下,但觉得挺有趣的,所以打算暂时用这个来玩ChatGPT一段时间。
请参考
几乎以下是两个复制粘贴:
OpenAI的API参考手册
LINE Messaging API的API参考手册