自从 在2023年3月发布了 的官方 API[1] 和插件系统[2]以来,许多开发者和创业者都兴致勃勃地想办法将其整合到自己的业务中。
本文讨论的 函数相当于 插件[3]。它们由 Web 事件触发,可以检索实时信息以输入 ,使用动态提示词问询 ,然后通过外向的 Web 服务调用执行实际操作。
(本图由 生成)
但是,想要集成 ,仍然困难重重:
本文将展示如何用 函数创建一个完整的 应用程序。它是个 机器人。与 插件一样,该机器人使 能够实时读取和写入互联网。
有了这个机器人, 用户就能在 中与 进行对话。可以通过提新的 issue[5] 或在已有的 issue 的下面发表评论[6],来和 聊天。换句话说,这个项目使用 的 消息 UI 作为它聊天的 UI。
图1. 用 学习Rust编程。
查看
该机器人是用 Rust 编写的 函数。只需 fork 该 模版,将你的 fork 部署到 work[7] 上,并配置你的 repo 和 密钥。只需 5 分钟,就能拥有一个功能齐全的 机器人。无需设置 Web 服务器、为 API 设置 、或设置缓存/数据库服务器。
Fork 模板 Repo
首先,从[8] fork 该模版repo[9]。
地址:
src/lib.rs[10] 文件包含 bot 应用 (也称为 flow 函数)。run() 函数在启动时就被调用。它从 repo owner/repo[11] 监听 和 事件。这些事件会出现在 repo 中创建新 issue 或新 issue 评论时。
#[no_mangle]
#[tokio::main(flavor = "current_thread")]
pub async fn run() {
// Setup variables for
// login: GitHub account for the bot (typically just your personal account)
// owner: GitHub org (or user) to install the bot
// repo: GitHub repo to install the bot
// openai_key_name: Name for your OpenAI API key
// All the values can be set in the source code or as env vars
listen_to_event(&login, &owner, &repo, vec!["issue_comment", "issues"], |payload| {
handler(&login, &owner, &repo, &openai_key_name, payload)
})
.await;
}
() 函数处理 () 接收到的事件。如果事件是 issue 中的新评论,则机器人会调用 的 API 将评论文本添加到由 issue. 标识的现有对话中。它收到来自 的响应,并添加到 issue 的评论。
此处的 flow 函数自动并透明地管理本地存储中与 API 的对话历史记录。 API 密钥也存储在本地存储中,因而可以通过 中的字符串名称来识别密钥,而不必将密钥放在源代码中。
EventPayload::IssueCommentEvent(e) => {
if e.comment.user.r#type != "Bot" {
if let Some(b) = e.comment.body {
if let Some(r) = chat_completion (
openai_key_name,
&format!("issue#{}", e.issue.number),
&b,
&ChatOptions::default(),
) {
if let Err(e) = issues.create_comment(e.issue.number, r.choice).await {
write_error_log!(e.to_string());
}
}
}
}
}
如果事件是一个新的 issue,flow 函数创建一个新的对话,由 issue.识别,并向 请求响应。
EventPayload::IssuesEvent(e) => {
if e.action == IssuesEventAction::Closed {
return;
}
let title = e.issue.title;
let body = e.issue.body.unwrap_or("".to_string());
let q = title + "n" + &body;
if let Some(r) = chat_completion (
openai_key_name,
&format!("issue#{}", e.issue.number),
&q,
&ChatOptions::default(),
) {
if let Err(e) = issues.create_comment(e.issue.number, r.choice).await {
write_error_log!(e.to_string());
}
}
}
如何部署 Flow 函数
可以看到,flow 函数代码调用 SDK API 来执行复杂的操作。例如
服务器和 Redis 缓存都是 SDK 依赖的外部服务。这意味着 flow 函数必须在提供此类外部服务的托管 host 环境中运行。work[12] 是 flow 函数 SDK 的 PaaS(平台即服务)host。
为了在 work 上部署 flow 函数,只需将其源代码导入 PaaS。
首先,从你的 账户登录 work。导入你刚刚 fork 的包含 flow 函数源代码的 repo,并选择 “ ”。
请注意,这里不是选要部署机器人的 repo;而是选择你 fork 的 flow函数源代码的 repo –app。