Cool。呃,我是来自 Codex 部署工程团队的,我想简单说几句来介绍 Sonar 那边精彩的团队以及 Killian。呃,所以我会跳过一些我通常会讲的代理基础内容,因为我觉得这个观众在那些方面是知道自己在做什么的。我们将直接切入更棘手的问题,比如代理完成任务意味着什么?什么是信任边界?我们还有三个有点尖锐的观点想要提出。呃,第一点是“完成”意味着任务有证据支持地完成了;第二点是不隔离不等于正确性;第三点是反馈契约属于循环内部。所以当我们有一个代理循环时,它往往遵循一些可预测的模式。我们倾向于有
这种模型动作呃,我们有由模型控制的执行过程。我们观察变化,无论是日志、结果、输出还是其他什么,然后我们继续更新计划。这大致就是我们遵循的总体代理循环。然后在每个单独的任务中,我们有呃结果、不变性、以及对我们工作范围的通常定义。当然,
我们也有验收标准。呃,所以对我们的“完成”定义通常是可审查的差异、一些工具证据之类的东西。它不仅仅意味着说已修复,而是实际上意味着说已修复并提供支持这一事实的证据。呃,所以更廉价的实现往往将瓶颈转移到规范和验证上,而这并不是我们想要的
做。嗯还有这种相关失败的概念以及通常有几个编码代理呃倾向于陷入的常见故障模式。它往往退回到不完整的上下文呃,或者也许有一个局部修复违反了我们拥有的某些全局不变性。呃或者更好的是生成的测试我们实际上用来验证结果导致相同的问题只是
通过传播。呃所以自我批评是有用的,但它不是独立的预言机,我们经常发现代理的一些结果和验证器的结果往往彼此正交。你不能呃在不查看这两部分的情况下确定任务是否完成。呃所以你通常想要几乎寻找确认任务完成的反证根据
编译器它完成了吗?根据测试分析等等,它是完成的并且你不能真正取代人类在整个循环中的审查。呃我想快速提到的下一个点是呃隔离不等于正确性。我们有执行层,它通常定义代理能做什么对它有访问权限的工具呃有什么范围呃每
次查看需要多少批准才能行动,然后我们有呃通过这个执行层我们有了工件层呃这真的是评估结果的地方呃结果是可接受的呃产生了什么测试分析了什么政策甚至意图是什么呃所以沙箱可以包含一个权利,但它不能证明查询是安全的。呃所以我试图指出的是
没有预言机是 proof(证据/证明),你想要用不同的边界分层控制。有点像这种纵深防御呃这些多层护栏。这大致是整体想法。而其中很棒的部分在于,你作为[喷鼻息声]人类,你拥有意图,你拥有例外情况,当然你也拥有是否发货的决定权。呃所以这是最后一件事。呃有一个
我们通常也建议的反馈契约。呃那些通常带有技能um,当然这些是关于如何完成特定任务的程序。uh MCPs 包含结构化工具和上下文,当然我们能够用钩子提供生命周期检查非常擅长找出你是否硬编码了秘密或那种东西。呃所以有了这个你想要创建
这种完整的 CI 和人类审查流程,这最终应该是人在其中的角色的核心。呃所以无论如何 um 当你创建这种代理过程时你想要评估几件事。呃边界是什么例如呃你能够 uh 在模型输入之前拦截秘密吗?呃项目是如何基础的?uh 你有
任何具体的规则或位置或漏洞路径你可以提供吗?呃范围是什么?参数是否在保留行为的同时绑定。这些是需要检查的事情,当然你必须不断运行你的重新检查。uh 断言代理不是终端状态。呃所以无论如何 uh 从我这边废话够多了。如果从
我这里有三个要点你要带走,那就是完成意味着任务有证据地完成了。二是隔离不等于正确性。三是反馈契约属于循环内部,这样你就可以充分利用你的代理(如 codeex)提供的能力。[叹气]呃所以 Killian,让我们 uh 让那个循环 uh 完整吧,为什么不呢?这就是 mind(我)这边所有的了。所以非常感谢
你呃给我这个机会做这个介绍。>> 谢谢。如果你能看一下然后 um 扫描它并跟进那将非常有帮助。有几个先决条件。um 再次我是 Killian。我在 Sonar 是一名开发者内容工程师。呃,所以非常感谢 um OpenAI 和 Tony 给我们做一个关于所有这些的简介。um Codeex 是一个非常强大的
工具。我经常使用它。我发现它非常有帮助。它有快速的 CLI。它有,uh 一个相当智能的沙箱系统以及它的钩子系统也集成得非常好像 Sonic Cube(SonarQube)这样的工具就像我今天想跳进去的那样。所以,用 sonar cube 和 open AI 为你的团队进行代理开发布线。呃我今天要提出的问题是我们要如何确保代码和
由像 codeex 这样的代理生成的输出被验证它是安全的。在 Soner,我们有这种以代理为中心的开发周期的想法。我们 did um 在过去一年左右做了一些研究并且调查了超过一千名开发者我们发现 uh 42% 的提交代码要么是 AI 生成的要么是有 AI 辅助但 96% 的开发者并不完全信任它。对?所以绝大多数人不会只是
认为嘿这从一开始就是安全的。不到一半的人说他们在推送和合并到代码库之前完全验证了代码。那里有一些张力。没有人信任它。一堆不受信任的代码进入代码库。呃原因是瓶颈过去是代码生成,对?我们如何创建我们要做的
如何实现预期结果?我们究竟该如何为试图构建的应用程序编写代码呢?嗯,对于 AI 代理而言,这大多已通过让它们自行完成或在 AI 代理协助下解决。因此,瓶颈已从单纯的代码生成转移到了代码验证上。对吧?我们生成了海量的代码,但现在关键在于人类如何确保其安全性:“我该如何保证这是安全的?”“我能获得哪些帮助和工具来验证这不会搞砸我的代码库,或损害客户并引发各种糟糕的问题?”
因此,在 AC/DC(以代理为中心的开发周期)中我们有四个步骤。其中一步并非来自 Sonar,即“生成”阶段,无论你使用何种编码工具——无论是 Codex 还是其他任何工具——这都是“生成”步骤。但 Sonar 拥有的是“引导(Guide)”、“验证(Verify)”和“解决(Solve)”。所谓“引导”,是指向代理注入适当的上下文,包括你的项目指南、任何规则以及特定的架构设计,以确保它在开始构建任何东西之前拥有高质量的上下文。我们发现这能降低整体的令牌成本,而在企业规模上——我是说,这在长期内节省了大量资金。
“验证”是指一旦代理完成了分配给它的生成代码任务,我们要确保没有引入任何问题。因此,没有任何安全问题、代码质量问题或可维护性问题等需要被推送到生产环境中。然后是“解决”,即我们检测到存在问题,对吧?比如某种注入漏洞或其他情况发生。我们需要快速且尽可能高效地修复它,以便建立这种迭代式的编码系统。
在我进入实际操作之前要展示的最后一张幻灯片是关于内部循环和外部验证循环的概念。“外部循环”是你传统设置的 CI 系统,对吧?所以你编写代码,将其推送到 GitHub、GitLab(无论你使用什么),管道运行后可能会失败。你的测试或扫描,比如 SonarQube 可能失败了,然后你回到 IDE(集成开发环境)并尝试修复它,再次推送后却又一次失败。这一直是我存在的痛苦,也是许多开发者生活的痛点。
因此,我们要通过将左侧偏移至“内部循环”来节省时间,那就是 IDE 环境。也就是说,一旦我们完成代码生成,我们希望在不推送的情况下在 IDE 内验证其正确性。这节省了大量时间。我是说,特别是能够自动验证所有这些内容。在企业中,时间就是金钱,而且你的工程师也能节省大量的“心理治疗账单”,因为没有那种挫败感。嗯,好了,这就是我在进入终端前真正想关注的最后一张幻灯片了。(轻笑)
在那之前,我想快速提及几件事。你将看到两个工具:用于上下文、被称为“上下文增强”的工具,我们将将其用于引导阶段;以及用于代理分析的工具,你将在验证阶段看到它。我们稍后会回到这些工具。(轻笑)此外,我想让每个人重点关注的一个重大收获是:瓶颈已从代码生成转移到了代码验证。
在进入之前,如果可能的话,每个人电脑上都应该运行 Docker 程序。快速举一下手,以便我知道哪些人到目前为止能跟上先决条件要求。如果你已运行 Docker 并准备好进入终端跟随操作,请举手。太棒了。几个……完美。谢谢。如果没有的话,再说一次,这个仓库是可用的。你可以利用自己的时间跟进。你将拥有所有这些信息。所以,让我暂时退出一下。我的视野有限……切掉了屏幕的上半部分,但应该没问题了。
好了,我们要做的第一件事是运行一个名为 apply_sonar 的脚本。(注:原文为 apply sonar,此处依语境调整为常见脚本命名习惯或保留原意)嗯,这只是我本地克隆的仓库。(轻笑)这需要 bash 终端。所以如果你在 Windows 上,可以使用 Git Bash 或类似工具。(注:原文为 bash terminal)嗯,我要输入那个命令了。那就是 apply_sonar(注:根据上下文修正为脚本名)。好了,这将做几件事。这是我构建的一个个人工具,它不是官方的 Sonar 产品。(注:原文为 personal tool)嗯,它只是一个快捷方式。所以我们不需要花费十分钟点击 UI 界面之类的东西。(注:原文为 clicking through a UI)确保我的 Wi-Fi 运行正常。好的,这里有点电脑卡顿。(注:原文为 computer slowness)嗯,但这将为你创建一个 SonarQube Cloud 项目。(注:原文为 Sonar Cube cloud)
它为你运行第一次扫描。好的,EU(可能是语音识别错误,忽略或保留发音)它会让我离线/进入。(注:原文为 off me in,推测意为 open for me 或 similar)所以我们就打开浏览器吧。嗯,这将为你安装几个相关的 SonarQube 工具,比如我们的 CLI(命令行界面)以及我们需要在 Codeex 之上运行插件所需的任何其他东西。(注:原文为 CLI and anything else...)
好吧,请耐心一点,看起来我遇到了一点 Wi-Fi 慢的问题,但这应该不是大问题。所以那已经成功了。(注:原文为 successful)嗯,你需要输入你想要的那个 org(组织)。也就是你创建账户时为你创建的 org。(轻笑)然后它就会运行。嗯,这里要谈谈这个项目,这是一个非常小的 Python 项目。(注:原文为 tiny)一点也不复杂。大概有四个文件,总共不到 200 行代码。(注:原文为 less than)而且我在里面植入了四个漏洞。其中三个是安全漏洞,一个是代码异味(code smell)。(注:原文为 code smell)嗯,当这个脚本运行完毕后,我们将进入仪表板并确保(注:原文为 make sure)……嗯,我们能看到上面的内容。
好了,通常呃,我想有很多人在尝试访问这个 Wi-Fi。(注:原文为 trying to access)嗯,在我个人的 Wi-Fi 上我从未见过超过一分钟的情况。所以如果你在家跟随操作,别以为你需要像这样坐一会儿。(注:原文为 sitting around like this)哎呀。
所以我是……你知道吗?我可能真的忘了导出我的令牌,这是仓库里的一个步骤。(注:原文为 step)所以呃,这应该在你的 shell 中。我要暂时拔出我的断开连接(注:原文为 disconnect real quick,推测意为关闭麦克风或摄像头以防泄露)只是为了几秒钟,这样我就不会向房间里的一群人暴露我的 Sonar 令牌。(注:原文为 expose)然后我会立刻弹回来。
嗯,所以仓库里应该有一些步骤。(注:原文为 steps)你将通过仪表板导航。我认为它在 SonarQube Cloud 的管理(administration)下。(注:原文为 administration within sonarcube cloud)
好了。重新镜像(re mirror,可能是语音识别错误或特定术语)。
好了。(注:原文为 All right)所以这将运行。嗯,我还想谈几件事。所以我们将会看到一个 SQL 注入问题出现。(注:原文为 pops in)好的,太棒了。这看起来现在正在工作。嗯,它将自动为我创建仪表板中的所有东西。(注:原文为 automatically create)它出现的安全评分将是 E。这是最低的等级。我们内置了一些……
安全漏洞方面,SonarQube 会立即检测到这些问题并指出“嘿,这不好”。一旦加载完成,我接下来要深入探讨几个问题。其中之一是未保护的 OpenAI API 密钥。这对于使用 Codex 的人来说非常相关,我确实遇到过这种情况,它就在这个代码库中。哎呀,有人忘了使用环境变量文件或将其作为变量传入。这种事经常发生,而且人们经常会不小心将这些密钥推送到生产代码中。目前,公共存储库中泄露的密钥平均修复时间为 90 天,这简直太疯狂了。这意味着你的令牌在长达 90 天的时间里都暴露在公众视野中,被所有机器人爬取。我们要尽可能防止这种情况发生,这里我们有几个工具可以做到这一点。
稍后我还要向大家强调另一个问题:SQL 注入漏洞。如果你只是浏览这段代码的安全专家,你可能已经注意到了这一点。在这个 database.py 文件中,我将来自这里的查询直接传入一个 f-string(格式化字符串)中,然后通过游标执行。这意味着参数直接进入字符串内部,这是非常糟糕的情况。特别是因为 search_task 函数接收来自 cyber.org/v 的参数,这意味着任何控制 cyber.org/v 的人都能控制你的数据库。这真的很糟糕。SonarQube 能够检测到这一点并提醒你,它会展示我们检测到的数据流。它使用符号执行和污点分析来识别数据流,并追踪其在你应用程序中的移动过程。
一旦设置完成,我们将做几件事:首先是安装 SonarQube CodeX 市场插件;其次是将其连接到你的项目;最后是确保插件内的所有连接都正常。这里几乎快完成了,抱歉让大家久等了。如果你自己在运行这个过程,希望它要么已经完成,要么即将完成。马上就会好。今天我要重点关注的三个工具是:我们提供的密钥检测钩子;通过 Codex 列出的问题列表,这允许你在终端中查看 SonarQube 的任何问题;以及第三个功能是在插件本身中找到并修复我们从列表中拉取的问题。
到目前为止有人有问题吗?如果你有任何问题,顺便说一下,如果你的设置无法正常工作,我们有来自 Sonar 的可爱团队。他们会快速打个招呼。如果你举手示意或遇到任何问题,他们非常乐意过来和你交谈并帮助你解决一切问题。好的,分析完成,我可以点击进入我的仪表板了。
打开它。就像我说的,这将是我们的 SonarQube 云仪表板,它会显示它在你的项目中检测到的所有问题。如果你在安装任何先决条件或连接 Wi-Fi 时遇到任何问题,没问题。你扫描 QR 码的那个仓库只需重新加载即可。该仓库将为你保持可用状态。
好的,这是仪表板界面,我不会在这里花太多时间。我们可以看到这里的安全评级是 E。有三个安全问题,总共有四个问题。如果我点击这个 OpenAI API 密钥,我们可以看到它被检测到了,它就在那里,是源代码中的纯文本。如果我返回去,我想关注的另一个问题是这个 SQL 注入漏洞。这就是我之前提到的那个涉及 cyber.org/v 的问题。这是污点分析,追踪数据流从这里的源头开始,穿过不同的文件和函数,一直到达同步操作。非常有用的功能。
现在回到终端界面。让我切换到我的命令剪贴板。我要执行 codex plugin marketplace add 操作,这将在这里添加 SonarQube 市场。一旦完成这一步,我们将进入 Codex 本身,你会看到 SonarQube 插件可用并可以选择安装它。请稍等几秒。感谢大家忍受我因轻微连接缓慢而造成的延误。当然,在你们正常的代理工作流中,我相信事情会快得多。完美。我要打开 Codex,输入 /plugins 然后搜索 sonar cube 并安装它。也就是运行市场命令,调用插件列表,输入 sonar cube,这样就安装了。
我要退出这个界面以便重新加载,这样我就可以运行几个更多的命令了。我将输入 sonar login 来认证 CLI,这将允许我们使用插件构建所依赖的许多功能。之后,我们将进行最后的连接步骤,即 sonar integrate codex 命令。一旦完成认证,请允许它执行。完美。
希望这不会花太长时间,几秒钟就能更新完毕,然后我们将在这里运行集成 Codex 的命令。哦,看起来它遇到了一些其他问题。再试一次。看来由于某种原因,导出的 Sonar 令牌丢失了。
我快速回来一下给大家看看屏幕。好的,让我重新连接以便你们能看到我的屏幕。完美。我要去剪贴板把这个拉回来。
好的,这将做几件事:它将为你提供密钥检测钩子;它将为你的代理提供使用所有 SonarQube 技能的 MD 指令;它还为你提供其他技能以及 MCP 配置。这非常完美。这将再花一点时间,然后一切将完全连接好以使用 SonarQube Codex 插件。快速检查一下时间,好的,我们应该没问题了。对我来说,这将安装两个额外的功能,使用免费账户的某些人可能看不到这些:上下文增强和代理分析。
代理分析是一个钩子,在代理进行任何编辑后立即触发。所以如果你告诉它写入文件或修改任何文件,它将自动执行并在服务器端对刚刚编写的代码运行分析。上下文增强的作用是检测当 Codex 即将执行任务时,它会向其提供指南、相关架构以及其他信息。好的,我们终于开始顺利运行了,朋友们。
这些都被添加了,特别是这里的一些钩子。底层也有一些技能。我要快速复制这个。所以,我会打开 Codex 并信任所有这些钩子。谢谢沙箱环境。MCP 服务器正在启动并与 SonarQube 连接。我要做的是说:“嘿,能用我的令牌提交一个 commit 吗?”这是一个假密钥,插件建议立即尝试使用它。我说“好的”。你可以立刻看到这被阻止了。没有密钥泄露到 L1 上下文中,也没有任何日志存储此类信息。如果你要求它读取包含密钥的文件,它也不会这样做,会被阻止。Codex 永远不会查看任何泄露到上下文中的秘密或类似内容。这非常重要,人们经常这样做,我们都该知道怎么做。“写一个脚本来读取文件。”所以……这是可能的。
这主要作用于工具使用,对吧?这是在用户提示提交时调用的钩子。所以如果绕过它,该钩子可能不会被调用。但对于 Codex 及其工具的基本使用、提示词输入等,如果向提示中泄露任何密钥或存在其他敏感信息,它都会检测到。看起来我们这里的网络连接有点问题。我要重新启动那个 MCP 服务器。MCP 服务器允许我们使用技能,从而在 Codex 和之前看到的 SonarQube Cloud 仪表板之间进行交互。例如,如果我们说:“嘿,列出我项目中的所有问题”,它能够获取这些信息并返回给我们。我要快速退出这里并重新打开,让 SonarQube MCP 服务器再次启动起来。“是的。”
我很抱歉我很难听清。你能走近一点或者大声点说话吗?大声点。“是的。”我自己运行这个时,为我配置所有的 apply sonar 脚本通常不超过一分钟。其他时候,MCP 的运行时间与任何其他 MCP 相当,假设网络连接正常。我正在尽力解决网络问题,但除此之外,我认为这些操作不会给正常的开发者工作流程带来额外的开销。所以我要快速检查一下 MCP 是否正在运行。“是的。”
如我刚才所说,MCP 的作用是让你访问所有工具。每当要求它执行与 SonarQube 相关的任务(如查看项目中的问题)时,它会自动检测情况并调用任何相关技能。其中一项技能是上下文增强(context augmentation),即知道我们有 SonarQube 工具,但网络似乎没有向 MCP 填充这些数据。让我看看是否仍能工作。我说:“列出我项目中的问题。”还有其他问题吗?趁等待时我想多问几个。“是的。所以,CLI 实际上只设置配置。MCP 在 Docker 内运行。因此,如果它使用那里的某些技能,有时会经过 MCP。但大多数情况下,这个插件和所有东西只是设置配置然后通过那里调用技能。”
CLI 帮助你预置和设置 MCP 等一切。然后有一些命令可以通过 CLI 在 MCP 中调用。我想澄清一下区别:这个插件是建立在某个 CLI 之上的。所以有些情况下你可以说:“嘿,帮我执行这个任务”,它可能会通过 MCP 技能或 CLI 命令路由。看起来我们有了 MCP,只是因为网络原因运行很慢,因为它能够为我们检测到这一点。所以在我们的“列出问题”技能以及这个上下文增强技能中,我们还可以看到:即使它在查看自己的技能时,我们也在运行密钥扫描,确保在检查任何文件(包括其自身的技能文件)时没有 API 密钥等泄露。好的,我们验证通过。它在检查所有这些内容,再次遇到网络连接问题。这在正常的代理工作流程中应该发生得更快得多。“企业服务器?是的,绝对可以。”
这适用于 SonarQube 的任何使用级别。无论是 Cloud、Server、Enterprise,还是免费层,每个人都可以访问此功能。不过限制在于:上下文增强和代理分析是我们不在免费层提供的两个工具。如果你的组织拥有这些权限,你就能使用这些工具。好的。所以我们看到可以在 CLI 中获得与仪表板中看到的那些相同的问题。想象一下这花了15秒,并且工程师有完全连接的 Wi-Fi 连接。那么他们将在 IDE 中非常快速地获得这些信息。这是我之前提到的被阻止的密钥泄露严重性问题。但我想要强调并今天修复的是 S8702 规则。这是我们专门为 AI 代理工作流编写的规则。我们不希望 AI 编码助手编写其他代理可以利用的代码。这就是我稍早描述的 cy.orgv 工作流。任何拥有 cy.orgv 访问权限的人都能控制你的数据库,我们要防止这种情况发生。
所以我只是告诉 Codex:“嘿,修复 S8702。”这将运行起来。同样地,所有这些问题都可以立即拉取到你的终端并让 Codex 修复它。我的机器与跟随操作的人之间会有所不同,那就是当代码在此处被编辑和更改时。代理分析的后工具使用钩子将运行。如果修复过程中引入了任何新漏洞,SonarQube 将在服务器端扫描代码。如果你没有代理分析功能也没关系,你可以在下一次 CI push 或其他类似操作中扫描你的代码。但无论如何,它将通过代理分析进行验证,从而闭合循环并为你提供自动反馈以知晓情况。
“嘿,我没有引入更多问题。”嗯,我不知道你们大家的情况如何,但我曾经历过一些编码会话,当时我会说:“嘿,修复这个问题。”然后又有三个问题冒出来,我试图去修它们,这就像是在征服九头蛇一样,这些问题不断蔓延。使用此功能可以自动验证您没有引入任何新的漏洞。太棒了。
所以,我们成功修复了这个问题。现在得到了参数化查询,这很好。“Post tool use hook”(后置工具使用钩子)完成了。它的作用是告知您文件中存在一个问题,但这个问题是之前就存在的。这是我预先植入的问题之一。因此,它不会尝试为您解决文件中的所有其他问题。它是智能的,
只是意识到“嘿”,对于我们要更改的代码部分,我们将分析并确保从该代码中不会引入新问题。所以这很好。“它重新分析了该行代码并验证其通过。”嗯,我们不再报告 S8702 错误。因此,我们能够发现、修复并自动验证进入我们工作区的新代码。
好的,我想在最后留一点时间回答问题。所以我只是快速浏览到最后一部分。这是添加一个新函数:将任务按 ID 从数据库删除(delete a task by ID to database.py)。当要求它生成新代码时,它会使用上下文增强。正如我之前提到的,这会从您的项目中获取相关的上下文、规则和架构,并将其
提供给代理。现在,我不知道这需要多长时间才能完成工作。我想象应该在几分钟以内。通常是几秒钟。“嗯,然而我想让你们意识到的是,使用这个功能意味着整个循环都在终端内完成,正如我们引导代理所做的那样。”哦看,它结束得非常快。做得很好。“嗯”是我们获得了相关的上下文。
“当我们在要求实现一个新功能时,我们会让它在这里被修复或实施。”它通过代理分析钩子进行验证,如果其中有任何问题,它们会被标记出来,Codex 会继续迭代直到修复。这就是我们在此处获得的“引导、验证和解决”的方法论。“好的,我不打算在终端上花费更多时间了。”
“嗯,这再次供您自行安排时间去操作。里面还有几件事您可以做,比如去追踪一些剩余的问题。”如果您的组织拥有上下文增强和代理分析的权限,“嗯”,使用它们,但我们能够看到秘密被阻止了。我们可以对存在的问题进行查找和修复,
然后对于我们要让它执行的新任务,“嗯”,它被包裹在一个更严格的验证层中。非常感谢大家忍受了一些网络连接问题。“嗯,我想说的是,我们在楼下有一个展位。”我非常乐意和你们中的任何人交谈。无论是关于 AI 相关的编码还是其他方面,我都想聊聊。“嗯”,请随时过来和我们打招呼。
我们有周边产品,有吉他英雄游戏,“我们”在那里举办派对。“嗯”,我们的社区——我认为它叫 Sonar 社区——是一个很好的资源,如果您在空闲时间通过仓库工作时遇到任何困难。“嗯”,那里有构建产品的工程师能够回答问题并帮助人们
解决遇到的问题。但非常感谢大家聆听并与我一起工作。“如果你们有任何问题,嗯”,请随时上来或举手,我们可以解决这个问题。”再次感谢大家的到来。我是 Killian,“来自 Sonar”,“嗯”希望能在展位见到你们。“非常感谢。”[掌声]
[音乐]