打造你的智能Bluesky机器人!利用Langflow、TypeScript和Node.js畅游新世界!
- Rifx.Online
- Programming , Programming/Scripting , Technology/Web
- 11 Jan, 2025
作者 Phil Nash
Bluesky 是一个建立在 AT Protocol 上的社交网络:一种开放的、去中心化的构建社交应用程序的方式。AT Protocol 是开放的,这意味着开发者可以使用它构建自己的应用程序,从 自定义信息流 到 客户端,再到我最喜欢的:机器人。
随着生成性 AI 的出现,我们现在可以构建更智能的聊天机器人。它们可以进行真实的对话,甚至可以独立作为代理行动。Langflow 是一个拖放式 IDE,使构建 AI 代理和工作流变得更加容易。
考虑到这一切,想要将聪明的机器人连接到社交媒体是自然而然的。在这篇文章中,我们将构建一个小型 TypeScript 应用程序,以 Langflow 为动力创建一个 Bluesky 机器人。
应用程序
我们将构建的应用程序将控制一个 Bluesky 账户,在收到提及或回复时进行响应。提及是指包含账户句柄的任何帖子,而回复是指发送到账户参与的线程中的帖子。
我们将使用 @skyware/bot 包,以便轻松与 Bluesky API 进行交互,并使用 Langflow 来帮助生成对帖子的回复。
你需要的东西
要构建此应用程序,您需要以下内容:
- 安装 Node.js(在撰写本文时,我使用的是 最新的 LTS 版本 22)
- 一个 Bluesky 账户
- 一个 DataStax 账户(在这里注册一个免费账户)
- 根据您构建的流程,您可能需要所使用服务的 API 密钥
一旦您准备好,就让我们开始构建一个 Bluesky 机器人吧。
设置应用程序
首先创建一个新的 Node.js 应用程序;创建一个名为 langflow-bluesky-bot 的新目录,并在终端中打开它。
mkdir langflow-bluesky-bot
cd langflow-bluesky-bot
```python
mkdir langflow-bluesky-bot
cd langflow-bluesky-bot
使用以下命令初始化您的新 Node 应用程序:
npm init --yes
```python
npm init --yes
安装您将要使用的依赖项和开发依赖项:
npm install @skyware/bot
npm install typescript tsx @types/node --save-dev
```python
npm install @skyware/bot
npm install typescript tsx @types/node --save-dev
在您喜欢的文本编辑器中打开项目,然后打开 package.json。我喜欢我的项目作为 ES modules 运行。要做到这一点,请在“main”键下添加以下内容。
"type": "module",
```python
"type": "module",
在 package.json 中也添加以下脚本。build 脚本将把我们要编写的 TypeScript 编译成 JavaScript,而 start 脚本将运行该 JavaScript。最后,为了使开发更方便,dev 脚本将使用 tsx 直接运行 TypeScript,并在检测到更改时重新启动。
"scripts": {
"build": "tsc",
"start": "node --env-file=.env .",
"dev": "tsx watch --env-file=.env ./src/index.ts"
},
```python
"scripts": {
"build": "tsc",
"start": "node --env-file=.env .",
"dev": "tsx watch --env-file=.env ./src/index.ts"
},
说到 TypeScript,我们还需要配置编译器。创建一个名为 tsconfig.json 的文件,并粘贴以下内容:
{
"compilerOptions": {
"target": "es2023",
"lib": [
"es2023"
],
"module": "NodeNext",
"sourceMap": true,
"outDir": "./dist",
"esModuleInterop": true,
"forceConsistentCasingInFileNames": true,
"strict": true,
"skipLibCheck": true
}
}
```python
{
"compilerOptions": {
"target": "es2023",
"lib": [
"es2023"
],
"module": "NodeNext",
"sourceMap": true,
"outDir": "./dist",
"esModuleInterop": true,
"forceConsistentCasingInFileNames": true,
"strict": true,
"skipLibCheck": true
}
}
创建一个名为 .env 的文件,并粘贴以下内容:
BSKY_USERNAME=
BSKY_PASSWORD=
LANGFLOW_URL=
LANGFLOW_TOKEN=
```python
BSKY_USERNAME=
BSKY_PASSWORD=
LANGFLOW_URL=
LANGFLOW_TOKEN=
我们将在需要时填写这些变量。
最后一步,创建一个 src 目录和一个名为 src/index.ts 的文件。
mkdir src
touch src/index.ts
```python
mkdir src
touch src/index.ts
现在我们准备开始编写机器人的代码。
编写机器人
在编辑器中打开 src/index.ts。首先导入机器人框架并创建一个机器人对象,该对象将使用账户名称和应用密码进行身份验证。
import { Bot } from "@skyware/bot";
const bot = new Bot();
await bot.login({
identifier: process.env.BSKY_USERNAME!,
password: process.env.BSKY_PASSWORD!,
});
```python
import { Bot } from "@skyware/bot";
const bot = new Bot();
await bot.login({
identifier: process.env.BSKY_USERNAME!,
password: process.env.BSKY_PASSWORD!,
});
我们还没有在 .env 文件中填写这些详细信息。因此,在继续之前,我们需要先完成这一步。
Bluesky 账户详情
登录到您想要通过此应用程序进行操作的账户。您需要为该账户创建一个应用密码。前往您的账户设置,选择 应用 密码,然后添加一个新密码。获得您的账户用户名和应用密码后,将它们添加到 .env 文件中。
我们可以通过尝试从该账户发送帖子来测试这些凭据是否有效。将此代码添加到 src/index.ts。
bot.post({
text: "Hello world!",
});
```python
bot.post({
text: "Hello world!",
});
现在,使用以下命令运行机器人:
npm run dev
```python
npm run dev
您应该会看到来自您机器人账户的新帖子。如果没有,请再次检查您的账户凭据。
使用 Ctrl + C 停止机器人。删除发送帖子的代码——我们不想继续刷屏时间线!
监听事件
我们将监听“reply”和“mention”事件。如果您希望处理其他用例,可以选择监听“quote”、“repost”、“like”、“follow”和“message”事件。此代码设置为通过一个函数监听这两个事件,并在机器人准备好时记录一条消息。
bot.on("reply", respondToIncoming);
bot.on("mention", respondToIncoming);
console.log(
`[✓] @${process.env.BSKY_USERNAME} is listening for mentions and replies.\n`
);
```python
bot.on("reply", respondToIncoming);
bot.on("mention", respondToIncoming);
console.log(
`[✓] @${process.env.BSKY_USERNAME} is listening for mentions and replies.\n`
);
现在我们需要定义respondToIncoming
函数。首先看看当我们被提及时会发生什么。在文件顶部,导入Post类型。然后实现respondToIncoming
函数。在这种情况下,我们只需记录帖子的作者和他们发送的文本。
// At the top add Post to the import
import { Bot, Post } from "@skyware/bot";
// At the bottom
async function respondToIncoming(post: Post) {
console.log(`[>] @${post.author.handle}: ${post.text}\n`);
}
```python
// At the top add Post to the import
import { Bot, Post } from "@skyware/bot";
// At the bottom
async function respondToIncoming(post: Post) {
console.log(`[>] @${post.author.handle}: ${post.text}\n`);
}
有了这段代码,重新启动应用程序:
npm run dev
```python
npm run dev
您可以通过从另一个帐户发送提及或回复来测试您是否成功监听了这些事件。
您可以通过查看@skyware/bot文档来查看帖子的其余[属性],并可以通过将它们记录到终端中进行探索。
轮询
请注意,从您向您的机器人发送提及或回复到您看到帖子被记录之间可能会有延迟。这是因为 @skyware/bot 每 5 秒轮询一次 API 以获取更新。虽然您可以订阅实时 Firehose,但对于这个应用来说,这有些过于复杂,轮询就足够了。
现在我们可以看到发送到我们机器人的帖子,让我们构建一些东西来处理它们。
Langflow
在这篇博客文章中,我们将构建一个简单的 Langflow 流程来响应传入的帖子。一旦你完成了这一步,我鼓励你玩一玩 Langflow,看看你还可以创造些什么。你可以深入挖掘许多示例流程以获取灵感。
打开 DataStax 仪表板中的 Langflow 并创建一个新的流程。在这个例子中,我们将使用 Basic Prompting 模板。
该模板将发送到聊天输入组件的消息传递给模型组件,默认情况下为 OpenAI gpt-4o-mini。如果你想在这个应用中使用 OpenAI,你需要在组件中填写 OpenAI API 密钥。如果你愿意,也可以选择使用其他模型组件。
你可以通过提示组件 提供系统指令来改变你的机器人响应的方式。对于像这样的简单流程,你可以告诉你的模型像海盗、无聊的青少年或80年代的动作电影英雄那样回应。或者说一些合乎情理的东西,我想。
模型组件将其输出发送到聊天输出组件,这意味着你可以通过使用 Playground 与它聊天来测试你的流程。一旦你对响应满意,点击 API 按钮。在这里你可以找到你的流程的 URL。复制该 URL 并将其输入到 .env 文件中,作为 LANGFLOW_URL
。
在这个模态窗口的代码示例上方,你可以生成一个 API 密钥。这样做后,复制 API 密钥并将其输入到 .env 文件中,作为 LANGFLOW_TOKEN
。
现在让我们在代码中连接 Langflow API。
使用 Langflow API
创建一个名为 getLangflowResponse 的函数。该函数将向我们之前复制的 Langflow URL 发起 HTTP POST 请求。
请求的主体是一个 JSON 对象,定义了 input_type
和 output_type
为 “chat”,input_value
为我们传入该函数的文本。
为了授权请求,我们传递一个 Authorization
头,其中包含字符串 “Bearer” 和我们生成的令牌。
一旦我们发出了请求,就解析响应为 JSON,并从响应对象中提取响应消息。
async function getLangflowResponse(text: string) {
const body = {
input_type: "chat",
output_type: "chat",
input_value: text,
};
const response = await fetch(process.env.LANGFLOW_URL!, {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.LANGFLOW_TOKEN!}`,
"Content-Type": "application/json",
},
body: JSON.stringify(body),
});
if (!response.ok) {
throw new Error("Could not respond", { cause: response });
}
const data = (await response.json()) as any;
return data.outputs[0].outputs[0].artifacts.message;
}
```python
async function getLangflowResponse(text: string) {
const body = {
input_type: "chat",
output_type: "chat",
input_value: text,
};
const response = await fetch(process.env.LANGFLOW_URL!, {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.LANGFLOW_TOKEN!}`,
"Content-Type": "application/json",
},
body: JSON.stringify(body),
});
if (!response.ok) {
throw new Error("Could not respond", { cause: response });
}
const data = (await response.json()) as any;
return data.outputs[0].outputs[0].artifacts.message;
}
更新 responseToIncoming
函数,以使用 getLangflowResponse
函数生成内容,处理任何错误,然后使用 post.reply
函数将该结果发布到原始帖子中。
async function respondToIncoming(post: Post) {
console.log(`[>] @${post.author.handle}: ${post.text}\n`);
try {
const text = await getLangflowResponse(post.text);
console.log(`[<] @${process.env.BSKY_USERNAME}: ${text}\n`);
await post.reply({ text });
} catch (error) {
console.error(error);
}
}
```python
async function respondToIncoming(post: Post) {
console.log(`[>] @${post.author.handle}: ${post.text}\n`);
try {
const text = await getLangflowResponse(post.text);
console.log(`[<] @${process.env.BSKY_USERNAME}: ${text}\n`);
await post.reply({ text });
} catch (error) {
console.error(error);
}
}
再次重新启动您的机器人进程,使用 Ctrl + C 停止,然后运行:
npm run dev
```python
npm run dev
再给自己发送一次提及,这次你应该看到由 Langflow 流生成的机器人响应。
这个示例机器人目前具有一个尖刻的青少年的个性。我不确定它是否是我构建的最好的机器人,但这只是一个开始。
现在您已经将 Langflow 流与您的应用程序代码集成,您可以尝试使用 Langflow 并查看您还可以实现什么。您可以通过构建以下内容进行实验:
- 一个记忆聊天机器人,使机器人能够回忆之前的消息
- 使用 Astra DB 的 RAG 流,使机器人能够根据您提供的知识作出响应
- 一个代理,它拥有多种工具来形成响应
构建更多机器人
Bluesky 使构建有趣的交互机器人变得非常简单,而 Langflow 则使构建可以轻松集成到机器人的 GenAI 应用程序变得容易,只需几行代码即可。
要开始,可以:
- 获取 这个 Bluesky 机器人的代码在 GitHub 上,
- 注册 Langflow,
- 开始构建!