为销售通话准备公司简报
本应用使用 Grok API 构建 AI 销售助手,在通话前研究目标公司并撰写一页简报。示例展示如何在同一请求中结合 Grok 内置的网页搜索、𝕏 搜索和自己的函数(如 CRM 查询)。
告诉 Grok“帮我准备与 Stripe 的通话”,它就会搜索网页和 𝕏,了解该公司的最新动态,通过应用中的函数查询 CRM,回顾你与该客户的往来,最后给出一页附来源的简报。你可以使用小型网页应用或终端运行,实时查看每一步及其执行位置:SpaceXAI 服务器或你自己的应用。
你将学到什么
在同一请求中给 Grok 提供 Web Search、X Search 等服务端工具以及自己的函数工具
运行混合调用这些工具的循环:SpaceXAI 自行执行搜索;调用你自己的函数时,当前请求结束,等待应用另发请求回传结果
了解
max_turns如何限制单次请求中的服务端轮次,以及为何每次调用你的函数后都要重新计数仅发送 Grok 需要的字段以将私有数据保留在自己一侧,并使用
toInput()传递对话上下文,无需在 SpaceXAI 的服务器上存储对话将简报作为结构化输出返回,边接收边展示,只保留搜索实际返回的来源
通过服务器发送事件(SSE)将进度从 Node 服务器实时传至网页,并在网页关闭时取消运行
运行示例
需要 Node.js 22.13 或更高版本。将 API 密钥写入 .env(位于仓库根目录),或导出环境变量 XAI_API_KEY。
cd examples/company-to-call-brief/typescript
npm install
npm run web打开 http://localhost:3000,输入公司名称或从示例 CRM 中选择一个客户,然后点击 Prep brief。这个页面类似 CRM 的通话准备界面。左侧时间线分两栏:一栏是 SpaceXAI 服务器上的搜索和撰写工作,另一栏是本地应用中的 CRM 查询,每次都会注明哪些数据保留在 CRM 中。每个新请求之间有分隔线,表示 max_turns 从头计数。右侧在查询返回后立即显示客户资料,随后逐节显示简报,每条消息下方列出来源。完成后会显示运行费用,并提供 Markdown 格式的简报供下载。点击 Stop 或关闭页面即可取消。
要在终端中准备简报,请传入公司名称。默认为 Stripe。
npm start -- Shopify两个版本都会将简报保存到 output/<company>-<date>.md。示例 CRM crm.json 中有四家真实公司的虚构客户资料:Stripe、Shopify、Duolingo 和 Figma。联系人、会议、交易和工单均为虚构。也可以输入其他公司,简报会说明该公司不在 CRM 中。
每次约需半分钟,API 繁忙时约需一两分钟。实测花费约 0.10 美元,其中搜索约 0.04 至 0.06 美元,token 约 0.05 美元。Web Search 每 1,000 次搜索收费 5 美元;X Search 每获取 1,000 条帖子收费 5 美元。
工作原理
共享代码位于 src/brief.ts,CRM 函数位于 src/crm.ts。prepareBrief() 循环发送请求,并通过回调报告各步骤,网页和终端可以分别展示相同进度:
每个请求都会给
grok-4.7提供两类工具:SDK 中的webSearch()和xSearch()由 SpaceXAI 执行;另外五个函数工具由你的应用执行:find_account、get_contacts、get_meetings、get_deals和get_tickets。X Search 的范围限制为最近 30 天。Grok 不知道当天日期,因此提示词中会给出日期。请求采用流式响应。Grok 决定搜索内容,SpaceXAI 执行搜索,再由
server_tool_call事件报告结果。Grok 调用应用自己的函数时,当前请求结束,client_tool_call事件交出调用信息。lookUp()执行查询,数据来源为crm.json。下一个请求使用
response.toInput()传入已有对话,同时附上各个函数返回的结果。某次响应不再发起函数调用时,循环终止。通常需要三个请求:第一次用于find_account,第二次同时发起另外四项查询,第三次执行搜索并撰写简报。有时 Grok 也会在以查询函数调用结束的请求中先进行搜索。最后的响应即简报,按 JSON Schema 以结构化形式输出,包括公司介绍、带来源的最新动态、客户往来历史、谈话要点和风险。流式生成期间,
json事件会提供截至当前的简报,网页可逐节展示。
混用服务端和客户端工具时,需要注意三点:
max_turns会在每次函数调用后重新计数。它限制的是单个请求内 Grok 使用服务端工具的轮数。一轮包括思考、执行一次或并行多次搜索、阅读结果。调用你的函数会结束当前请求,下一个请求从零计数。因此,max_turns: 3无法限制整次运行;整次运行的上限由循环设为六次请求。测试中,轮次限制也不是严格上限:即使设置了max_turns: 2,Grok 仍曾在一次请求中依次执行五次搜索。私有数据保留在你自己一侧。Grok 只能看到函数返回的内容,每次查询都筛选要发送的字段。联系人的邮箱、电话和你能接受的折扣底线保留在
crm.json中,时间线会注明哪些数据没有发送。除非另行指定,SDK 默认发送store: false,因此不会存储响应供以后检索。循环使用toInput()将加密的 Grok 推理内容及搜索结果传给下一个请求。若改用previous_response_id,则需要将对话(包括 CRM 数据)存储在 SpaceXAI 的服务器上。提示词也要求 Grok 不得在搜索中使用 CRM 数据,时间线会显示每条查询供你核查。引用仅覆盖所在请求。Grok 会引用其搜索返回的每个来源,因此
keepCited()会剔除简报中不属于搜索结果的来源,以及剔除后不再有来源的新闻。但每个响应只引用本次请求执行的搜索。若某个请求在搜索后以函数调用结束,它不会包含引用;之后生成简报的请求也不会引用那次搜索。因此应用还会记录各次网页搜索在流式传输中报告的来源。
src/server.ts 为网页运行 prepareBrief(),并通过服务器发送事件逐步报告进度。它会将 AbortSignal 传入每个请求,因此关闭网页或点击 Stop 即可取消运行。保存的简报仅在为该次运行生成的 URL 上提供。public/index.html 使用原生 HTML 和 JavaScript,根据事件绘制时间线并展示简报。src/index.ts 在终端打印相同的步骤。
请求使用较低的推理强度。对比测试中,使用默认推理强度时,Grok 会根据已有发现追加第二轮搜索,运行时间从约 40 秒增至 70 秒,而简报只多出少量细节。
若要接入自己的 CRM,请修改 LOOKUPS 中的函数(位于 src/crm.ts),让它们调用你的 CRM,并继续限制 Grok 可以看到的字段。