云服务器价格_云数据库_云主机【优惠】最新活动-搜集站云资讯

游戏服务器_网站建设流程图_测评

小七 141 0

与Cloudflare工人和工人KV一起快速开发无服务器聊天机器人

我是Cloudflare应用服务团队的产品经理。我们最近发现需要一个围绕服务所有权的新工具。作为一个快速发展的工程组织,服务的所有权变化相当频繁。很多周期都会在聊天中被烧焦,比如"现在谁拥有服务x?虽然很容易看出这样的工具每天为asker和askee节省了几秒钟时间,并且节省了一些心理环境切换,但是节省的时间不太可能增加开发和维护的成本。=每天5分钟x 260工作日=1300分钟/60分钟=每年20人时因此,在这个工具上投资20小时,在一年内就能获得回报,而且每个人的时间都是一样的。虽然我们在提高Cloudflare构建工具的效率方面取得了长足的进步,但是对于一个新工具的端到端构建、部署和操作来说,20小时是一个漫长的过程。输入Cloudflare Workers+Workers KV我越是使用Serverless和Workers,我就越能从中受益:1降低运营开销当我上传一个Worker时,它会自动分发到175多个数据中心。我不必担心正常运行时间-它会上升,而且会很快。2缩短开发时间随着大量的操作开销被移除,我可以完全专注于代码。像这样一个受限的问题空间非常适合工人。我想我们能在不到20小时内搞定这件事。要求在Cloudflare,人们在聊天中提出这些问题,因此这是服务所有权的自然接口。规格如下:用例输入输出添加@ownerbot添加Jira IT服务已添加删除@所有者删除Jira服务已删除问题@ownerbot Kibana公司SRE Core拥有Kibana。房间是:出口@ownerbot出口[{name:"Kibana",所有者:"SRE Core"…}]你好@ownerbot按照Hangouts聊天API指南,让我们从hello world机器人开始。要配置bot,请转到"发布"页面并向下滚动到"启用API"按钮:输入机器人程序名称下载私钥json文件转到API控制台搜索Hangouts聊天API(注意:不是Google+Hangouts API)单击左侧菜单上的配置按以下[1]填写表格使用一个难以猜测的网址。我生成一个guid并在url中使用它。URL将是您在仪表板中与工作人员关联的路径单击"保存"所以谷歌聊天现在应该知道我们的机器人了。回到谷歌聊天,点击"查找人,房间,机器人"文本框,选择"给机器人留言"。你的机器人程序应该出现在搜索中:它现在还不太有用,因为我们需要创建我们的Worker来接收消息并作出响应!工人在Workers仪表板中,创建一个脚本并与在步骤7中定义的路由(guid为的路由)关联。它应该看起来像下面这样。[2]Google聊天机器人的界面非常简单,但在Hangouts API指南IMHO中却被搞乱了。您必须对python示例进行反向工程。基本上,如果我们像@ownerbot博客Kibana一样给我们的机器人留言,我们会得到这样的信息:{"type":"消息","消息":{"argumentText":"Kibana"}}要响应,我们需要用200 OK和JSON body进行响应,如下所示:内容长度:27内容类型:application/json{"text":"你好聊天世界"}因此,最小的聊天机器人工作人员如下所示:addEventListener('fetch',事件=>{事件响应(过程(事件请求)) });功能流程(请求){让正文={文本:"你好聊天世界"}返回新响应(JSON.stringify(车身){状态:200,标题:{"Content-Type":"应用程序/json","Cache Control":"无缓存"}});}保存并部署它,我们应该能够向bot发送消息:成功!实施好吧,接下来是代码的核心部分。根据需求,我发现需要AddCommand、QueryCommand、DeleteCommand和HelpCommand。我还看到一些知道如何添加、删除和检索服务的ServiceDirectory。我创建了一个CommandFactory,它接受一个ServiceDirectory,以及一个KV存储的实现,这将是生产中的工人KV,但我将在测试中模拟出来。班长工厂{建造商(服务目录,kv){this.serviceDirectory=服务目录;此千伏=千伏;}创建(argumentText){让零件=argumentText.split(' ');设primary=parts[0];开关(主){案例"添加":return new AddCommand(参数文本,this.serviceDirectory, 此千伏);案例"删除":return new DeleteCommand(参数文本,this.serviceDirectory, 此千伏);案例"帮助":return new HelpCommand(参数文本,this.serviceDirectory, 此千伏);违约:返回新的QueryCommand(argumentText,this.serviceDirectory, 此千伏);}}}如果我们把它理解成一个简单的命令,我们可以把它当作一个命令来解释。好的,我们的命令需要一个服务目录,如下所示:类服务目录{获取(服务名称){…}异步添加(服务){…}异步删除(serviceName){…}查找(服务名称){…}getNames(){…}}让我们建立一些命令。哦,我的聊天机器人将以Ultima IV为主题,因为。。。原因。类AddCommand扩展命令{异步响应(){让cmdParts=此命令部件;如果(cmdParts.length命令!==6){return new OwnerbotResponse("添加服务需要名称、所有者、房间名称和谷歌聊天室Url。",false);}名称=此命令部件[1] ;让所有者=此命令部件[2] ;出租房间=此命令部件[3] ;让url=此命令部件[4] ;让aliasesPart=此命令部件[5] ;让别名=别名part.split(' ');让服务={姓名:姓名,业主:业主,房间:房间,url:url,别名:别名}等待this.serviceDirectory.add(服务);return new OwnerbotResponse(`My codex of knowledge has expanded to contain knowledge of${name}的知识。恭喜你贤惠的圣骑士;}}聊天机器人的命令模式的好处是,可以封装每个命令的逻辑进行测试,还可以组合一系列命令来测试对话。稍后,我们可以扩展它以支持撤消。让我们测试AddCommandit('需要所有参数',async function(){let addCmd=new AddCommand("add AdminPanel'Internal Tools''Internal Tools'",dir,kv);//缺少url让res=等待addCmd.响应();控制台.log(res.文本);断言相等(res.成功,false,"添加缺少参数应失败");});it('返回所有参数的成功,async function(){let addCmd=new AddCommand("添加AdminPanel""内部工具""内部工具室"http://chat.google.com/roomXYZ'",方向,kv);让res=等待addCmd.响应();控制台.debug(res.文本);断言相等(res.成功,true,"应该使用所有参数成功");});$mocha-g"AddCommand"添加命令添加✓需要所有参数✓返回所有参数的成功2次通过(19ms)到现在为止,一直都还不错。但是,除非我们可以查询命令,否则向我们的ownerbot添加命令并没有那么有用。类QueryCommand扩展命令{异步响应(){让服务=this.serviceDirectory.get(这个。论证文本);如果(服务){返回新OwnerbotResponse(`${服务所有者}拥有${服务名称}. 寻找你的房间${服务室} - ${服务.url})`);}让服务名称=this.serviceDirectory.getNames().join(",");return new OwnerbotResponse(`I know not known that service.)。你可以问我:${serviceNames}`);}}让我们编写一个测试,它运行AddCommand和QueryCommand描述('QueryCommand',function(){设kv=new MockKeyValueStore();let dir=新服务目录(kv);等待初始目录();it('返回添加的服务',async function(){let addCmd=new AddCommand("add AdminPanel'内部工具""内部工具室'url'别名'abc123',dir,kv);等待addCmd.响应();让queryCmd=new QueryCommand("AdminPanel",dir,kv);让res=等待queryCmd.Response();断言相等(res.成功,true,"本应成功");断言(res.text.index索引('Internal Tools')>-1,"应该在查询响应中返回团队名称");})})演示为了简洁起见,我们省略了很多代码,但是您可以在Github上查看完整的源代码。我们来转一圈吧!学习在开发@ownerbot的过程中,我学到了一些东西:聊天机器人是一个很棒的无服务器的用例。您可以部署而不必再担心基础设施Workers KV means扩展了有用聊天机器人的范围,包括@ownerbot这样的有状态机器人Command模式提供了一种有用的方法来封装聊天机器人中对命令的解析和响应。在第2部分中,我们将添加身份验证,以确保我们只响应来自googlechat实例的请求为了简单起见,我将使用静态共享密钥,但是Google最近推出了一种更安全的方法来验证调用方的真实性,我们将在第2部分中对此进行扩展。↩︎此UI是可供企业客户使用的多脚本版本。您仍然可以用一个Worker实现bot,您只需要识别请求并将其路由到您的chatbot代码。↩︎