Show HN:Open Bot——可与任何 Agent 框架协作的开源 Grok Bot
英文标题:🔶 Show HN: Open Bot – an open-source Grok Bot that works with any agent harness
OpenBot 是一个可部署在自有基础设施中的开源 Agent 平台,任何支持 AG-UI 协议的 Agent 都可作为具有独立频道和电脑环境的“同事”接入。项目通过统一网关对浏览器、文件、MCP 与组件调用执行策略校验并记录审计日志,强调每个 Bot 独立容器、凭据静态加密和默认本地回环访问。示例包提供通用助手、知识助手和风险分析师,并支持通过 agents.yaml 或 UI 创建和管理自定义 Agent。对开发者而言,OpenBot 提供了 Docker Compose 部署、AG-UI 框架无关接入、CEL 策略治理及 CopilotKit Intelligence 持久化线程与记忆能力。
67.5 KB
中文
带来任何 AG-UI Agent——无论是基于某个框架编写,还是手写实现——它都会作为一名拥有独立频道的同事加入。你可以在它自己的屏幕上观察其工作;当它遇到不应独自完成的事情时接管控制,之后再将控制权交还给它。它以组件而不只是文本进行回复,而且整套系统都运行在你自己的机器上。
Alpha 版本,仍在积极开发中。 OpenBot 目前还处于早期阶段,请预期会遇到粗糙体验和 Bug,也请预期项目会持续快速变化。欢迎提交 Issue 和 Pull Request。
在你的机器上运行。 下文所有说明均以笔记本电脑为目标环境。OpenBot 默认以
OPENBOT_DEV_NO_AUTH运行,跳过登录,并将每个请求作为一名管理员放行。你也可以改为接入 Google 登录。
这是一个运行在你自有基础设施中的 Agent 平台。Docker Compose 会启动其全部组件,数据存储在你的 PostgreSQL 中,模型由你自行选择:系统不附带任何模型,管理员提供凭据;凭据会静态加密,且绝不会被记录到日志中。
示例包内置三名同事,它们以配置而非代码形式提供:用于日常工作的 通用助手(General Assistant)、用于回答公司问题的 知识助手(Knowledge),以及用于风险与合规事务的 风险分析师(Risk Analyst)。你可以通过编辑 agents.yaml 或在 UI 的 /agents 页面中添加自己的 Agent。
Bot 对计算机、文件、MCP 服务器或组件执行的任何操作,都会经过一个统一网关;该网关负责作出决策并记录操作。这正是“能够使用你的工具的 Agent”与“可以放心让其接近这些工具的 Agent”之间的区别。
更多信息请见 copilotkit.ai/openbot。
Bot 可以是任何使用 AG-UI 协议的端点。AG-UI 是面向 Agent 与用户交互的开放协议,因此 OpenBot 不绑定任何框架,你也不必绑定。无论是通过 LangGraph、Mastra、CrewAI、Pydantic AI、Google ADK 构建的 Agent,还是手写的 Agent,都会以相同方式接入;治理能力依托协议而非框架实现。
- Docker:用于 PostgreSQL、浏览器计算机、supervisor 和内置 Bot。
- Bun 1.3+:用于应用和 API 服务器。
- 一个 CopilotKit Intelligence 项目及许可证。
- 一个模型密钥。概念验证 Bot 使用 OpenAI;LangGraph Bot 可以使用 OpenAI、Anthropic 或 Google。
-
创建
.env: -
获取 CopilotKit Intelligence 凭据:
npx --yes copilotkit@latest login npx --yes copilotkit@latest project select npx --yes copilotkit@latest license --write
将 project select 输出的 cpk-... 运行时密钥写入 .env,变量名为 INTELLIGENCE_API_KEY。license --write 会将 COPILOTKIT_LICENSE_TOKEN 写入已有的 .env 文件。
- 填写其余必填值:
除非你自行运行 Intelligence,否则请保留 .env.example 中的托管 Intelligence URL。示例中的 KEY_ENCRYPTION_KEY 是公开的,可安全用于本地环境;请使用以下方式生成你自己的密钥:
-
安装并运行:
bun install bash scripts/start.sh
scripts/start.sh 会启动 Docker 服务、执行迁移、在 3001 端口启动 API 服务器、在 3010 端口启动应用,并在打印后续步骤前检查各服务是否能响应各自的健康检查路由。
- 打开
/bot,并输入:Open news.ycombinator.com and tell me the top story. - 要求 Bot 填写 https://httpbin.org/forms/post,然后检查
/admin/audit。 - 打开
/admin/boundaries,添加一条拒绝规则或预设,然后重试相同的浏览器操作。 - 通过
/agents创建一名同事,为其指定固定角色,并与其发起一个频道。
| 路由 | 用途 |
|---|---|
/ |
开始并浏览频道。 |
/agents |
创建、编辑、复制、隐藏、删除和启动同事。 |
/channel/:id |
与一名同事交谈,并查看其实时屏幕和资料面板。 |
/bot |
直接与 Bot 对话;使用 ?agent=<id> 选择某个 Bot。 |
/skills |
创建并启用个人技能。 |
/settings |
用户偏好设置。 |
/admin/connectors |
配置部署的知识来源。 |
/admin/credentials |
存储只写、加密的凭据。 |
/admin/computers |
查看、停止和重置 Bot 计算机。 |
/admin/boundaries |
配置浏览器、文件和 MCP 操作策略。 |
/admin/components |
发布组件,并治理哪些 Bot 可以使用这些组件。 |
/admin/playground |
在浏览器中编写并发布沙箱化组件。 |
/admin/plugins |
配置 MCP 服务器、MCP 授权和部署技能。 |
/admin/audit |
审查被允许、被拒绝和失败的操作。 |
- 每个 Bot 一台计算机:supervisor 会为每个 Bot 提供自己的容器、自己的
/workspace卷和自己的浏览器配置文件。在宿主机支持的情况下,设置COMPUTER_RUNTIME=runsc可使其在 gVisor 下运行。 - 网关是唯一入口:它从服务器持有的快照中解析目标、评估策略、写入审计记录,然后才调用计算机。不存在任何绕过记录先行要求而直接执行操作的路径。
- CEL 策略,默认拒绝:规则可以检查
tool.name、intent、bot.id、actor.id、page.url、page.host、element.*、key、file.*和mcp.*。拒绝规则优先于允许规则;缺失策略时不会允许任何操作;规则损坏时会拒绝而非放行。 - 接管控制:当 Bot 遇到登录阻碍或 2FA 提示时,会请求帮助。控制权可在同一面板中移交,并记录为
computer.help_requested、computer.control_taken和computer.control_released。当人类正在操作时,Bot 的操作会被拒绝而不是排队等待。 - 密钥永不进入对话记录:审计轨迹会记录请求了密钥以及密钥长度,但不会记录密钥内容。
- 接入你自己的 Agent:无论基于框架还是手写,任何 AG-UI 端点都可以成为 Bot。端点会使用与浏览器导航相同的目标校验机制进行验证,认证请求头以只写方式存储。
- 以组件代替纯文本:已编译的 React 组件位于
app/src/components/gallery/;沙箱化组件在/admin/playground中编写,无需部署即可发布。每次调用时,服务器都会检查组件是否存在、是否已发布,以及是否未对该 Bot 隐藏。数据函数按组件授予权限。 - 受治理的 MCP:系统内置 Atlassian、Box、Slack、Salesforce 和 ServiceNow 的精选目录。自定义服务器必须通过 URL 检查,任何未被明确分类为读取操作的工具都会被视为写入操作。
- 技能是指令,不是能力:个人技能只能附加给其作者拥有的 Bot;部署技能由管理员拥有;两者均可通过编辑器中的
/调用。 - 可读的审计轨迹:
/admin/audit会列出被允许、被拒绝和失败的操作;每次拒绝都会附带导致该拒绝的规则。 - 凭据静态加密:通过
/admin/credentials存储,API 永不返回凭据,审计事件中也会对其进行脱敏。 - 默认仅回环访问:计算机绑定到
127.0.0.1,并要求每个容器提供专属令牌,因此不会有人仅凭端口即可访问已登录的浏览器。 - 持久化线程与记忆:对话可通过 CopilotKit Intelligence 在重启后保留,并且每个部署都会标记其拥有的线程。
任何 AG-UI 端点都可以成为 Bot。
在 /agents 中,创建一名同事时可设置:
- 名称、职称和角色描述;
- 私有或公开可见性;
- 可选的 AG-UI 端点;
- 可选的只写授权请求头。
服务器会使用与浏览器导航相同的目标检查来验证 Agent 端点。如果未设置自定义端点,则产品内创建的同事会使用 MANAGED_AGENT_AG_UI_URL。
租户包中的 Agent 可在 agents.yaml 中声明为以下两类之一:
built-in:带有系统提示词;或remote-ag-ui:带有一个端点。
参见 docs/configuration.md 和 docs/coworkers.md。
.env.example 是源模板。若缺少以下变量,API 服务器会拒绝启动:
DATABASE_URLKEY_ENCRYPTION_KEYMANAGED_AGENT_AG_UI_URLINTELLIGENCE_API_URLINTELLIGENCE_GATEWAY_WS_URLINTELLIGENCE_API_KEYCOPILOTKIT_LICENSE_TOKEN
值得了解的设置:
| 变量 | 用途 |
|---|---|
OPENBOT_DEV_NO_AUTH |
将每个请求作为一名管理员放行。这是 OpenBot 当前的运行方式。 |
OPENAI_BASE_URL |
让 OpenAI 兼容调用由其他位置响应,例如网关或代理。 |
ANTHROPIC_BASE_URL, GOOGLE_GENERATIVE_AI_BASE_URL |
对这两个 API 执行相同配置。 |
COMPUTER_TOKEN |
每个 Bot 计算机请求必须提供的密钥。start.sh 会设置该值。 |
SUPERVISOR_TOKEN |
supervisor 所要求的密钥。start.sh 会设置该值。 |
COMPUTER_SUPERVISOR_URL |
为每个 Bot 分配独立计算机,而非共享一台计算机。 |
COMPUTER_RUNTIME |
在宿主机支持时,设置为 runsc 可让计算机在 gVisor 下运行。 |
AGENT_COMPUTER_POLICY |
JSON 操作策略。JSON 格式错误会阻止服务器启动。 |
AGENT_COMPUTER_ALLOW_PRIVATE_HOSTS |
允许 Bot 访问本机自身服务。 |
TENANT_PACKAGE_DIR |
包含租户 YAML 的目录。默认为 ../examples/fintech。 |
DEPLOYMENT_ID |
当两个部署共享一个 Intelligence 项目时,用于命名此部署。 |
完整参考:docs/configuration.md。
| 服务 | 端口 | 用途 |
|---|---|---|
app |
3010 | React/Vite UI。 |
server |
3001 | Hono API、CopilotKit 运行时、认证、策略、审计、插件、组件、同事和频道。 |
agent-computer |
4100 | Chromium,加上 /workspace 和浏览器配置文件。 |
agent-bot |
4200 | 概念验证 AG-UI Bot。 |
agent-langgraph |
4201 | LangGraph AG-UI Bot。 |
supervisor |
4500 宿主机 / 4300 容器 | 创建并管理每个 Bot 独立的一台计算机。 |
| 带 pgvector 的 PostgreSQL | 5432 | 产品数据、策略、审计、凭据、授权、频道、知识和组件元数据。 |
| CopilotKit Intelligence | 外部 | 持久化线程和记忆。 |
服务器网关是 Bot 浏览器与文件工具调用所经由的产品/API 路径。它会解析目标、评估策略、写入审计记录,然后调用 agent-computer。该计算机也暴露了更低层的、受令牌保护的服务端点;请保持这些端点私有,不要利用它们绕过网关。
更多细节请见:docs/architecture.md。
OPENBOT_DEV_NO_AUTH 是默认设置,因为它不需要 OAuth 凭据或同意页面。如需改用正式登录,请创建 Google OAuth 客户端,并同时设置以下四项:
BETTER_AUTH_URL=http://localhost:3001
BETTER_AUTH_SECRET= # openssl rand -base64 32, at least 32 characters
GOOGLE_OAUTH_CLIENT_ID=
GOOGLE_OAUTH_CLIENT_SECRET=
然后设置以下两项,以决定哪些人可进入系统以及从何处进入:
TRUSTED_ORIGINS—— 应用提供服务的来源;本地环境为http://localhost:3010。它默认是http://localhost:3000,而这并不是start.sh提供应用服务的地址。INITIAL_ADMIN_EMAILS—— 以逗号分隔。此处列出的地址首次登录时将成为管理员;其他所有人都会成为普通用户。
移除 OPENBOT_DEV_NO_AUTH 后重启:登录按钮会在启动时写入应用生成的配置,因此只有在上述四项设置全部存在后才会显示。账户、会话和角色与其他所有数据一样,均存储在同一个 PostgreSQL 数据库中。
系统会拒绝部分设置,而非忽略它们:如果设置了 BETTER_AUTH_SECRET 或 BETTER_AUTH_URL 却没有客户端凭据,或者密钥长度不足 32 个字符,服务器将不会启动。
仅限在你的机器上运行
-
agent-computer会操作一个保存真实登录状态的浏览器。docker-compose.yml会将其绑定到回环地址;请保持这一设置。 -
请通过
/admin/credentials存储凭据,该功能会对凭据加密。不要将凭据值写入租户 YAML 或提交到版本库的文件中。 -
AGENT_COMPUTER_ALLOW_PRIVATE_HOSTS允许 Bot 访问本机上的服务。如果你不希望它能这么做,请不要设置此变量。bun run format:check bun run lint bun run typecheck bun run test bun run build
修改 Drizzle schema 后:
bun run --filter server db:generate
bun run --filter server db:migrate
使用 bash scripts/start.sh 启动完整技术栈。仅当你希望在不启动 Docker Bot 和计算机的情况下运行应用与服务器时,才使用 bun run dev。
- 在开始实质性工作前,请先创建 Issue 或进行协调。
- 保持改动聚焦;当安装、配置、架构或用户行为发生变化时,请更新文档。
- 不要将密钥、服务账号 JSON、客户数据和本地对话记录提交到仓库中。
- 在创建 Pull Request 前,运行“开发”部分列出的检查。
MIT © CopilotKit
English / 原文
demo-openbot.mp4
Bring any AG-UI agent, written on a framework or by hand, and it arrives as a coworker with a channel of its own. Watch it work on its own screen, take the wheel when it reaches something it should not do alone, then hand it back. It answers with components rather than only prose, and the whole thing runs on your own machine.
Alpha, and under active development. OpenBot is early. Expect rough edges and bugs, and expect things to move. Issues and pull requests are welcome.
Runs on your machine. Everything below is written for a laptop. Out of the box OpenBot runs with
OPENBOT_DEV_NO_AUTH, which skips signing in and admits every request as one administrator. Google sign-in can be wired up instead.
An agent platform that runs inside your own infrastructure. Docker Compose brings up every part of it, the data sits in your PostgreSQL, and the model is yours to choose: no model ships in the box, and an administrator supplies the credential, which is encrypted at rest and never logged.
Three coworkers ship in the example package, and they are configuration rather than code: General Assistant for everyday work, Knowledge for company questions, Risk Analyst for risk and compliance. Add your own by editing agents.yaml or from /agents in the UI.
Anything a Bot does to a computer, a file, an MCP server or a component goes through one gateway that decides and records it. That is the difference between an agent that can use your tools and an agent you can let near them.
More at copilotkit.ai/openbot.
A Bot is any endpoint speaking AG-UI, the open protocol for agent-to-user interaction, so OpenBot is not tied to a framework and neither are you. Agents built with LangGraph, Mastra, CrewAI, Pydantic AI, Google ADK or written by hand all arrive the same way, and the governance rides the protocol rather than the framework.
- Docker, for PostgreSQL, browser computers, the supervisor, and the shipped Bots.
- Bun 1.3+, for the app and API server.
- A CopilotKit Intelligence project and license.
- A model key. The proof-of-concept Bot uses OpenAI; the LangGraph Bot can use OpenAI, Anthropic, or Google.
-
Create
.env: -
Get CopilotKit Intelligence credentials:
npx --yes copilotkit@latest login npx --yes copilotkit@latest project select npx --yes copilotkit@latest license --write
Put the cpk-... runtime key from project select in .env as INTELLIGENCE_API_KEY. license --write writes COPILOTKIT_LICENSE_TOKEN into the existing .env.
- Fill the remaining required values:
Keep the managed Intelligence URLs from .env.example unless you run Intelligence yourself. The example KEY_ENCRYPTION_KEY is public and fine locally; generate your own with:
-
Install and run:
bun install bash scripts/start.sh -
Open http://localhost:3010.
scripts/start.sh starts Docker services, applies migrations, starts the API server on port 3001, starts the app on port 3010, and checks that the services answer their own health routes before printing next steps.
- Open
/botand ask:Open news.ycombinator.com and tell me the top story. - Ask the Bot to fill out https://httpbin.org/forms/post, then inspect
/admin/audit. - Open
/admin/boundaries, add a deny rule or preset, and retry the same browser action. - Create a coworker from
/agents, give it a standing role, and start a channel with it.
| Route | Purpose |
|---|---|
/ |
Start and browse channels. |
/agents |
Create, edit, duplicate, hide, delete, and launch coworkers. |
/channel/:id |
Converse with one coworker and view its live screen/profile panel. |
/bot |
Direct chat with a Bot; ?agent=<id> selects one. |
/skills |
Create and enable personal skills. |
/settings |
User preferences. |
/admin/connectors |
Configure deployment knowledge sources. |
/admin/credentials |
Store write-only encrypted credentials. |
/admin/computers |
View, stop, and reset Bot computers. |
/admin/boundaries |
Configure browser/file/MCP action policy. |
/admin/components |
Publish components and govern which Bots may use them. |
/admin/playground |
Draft and publish sandboxed components in the browser. |
/admin/plugins |
Configure MCP servers, MCP grants, and deployment skills. |
/admin/audit |
Review permitted, refused, and failed actions. |
- A computer per Bot : the supervisor gives each Bot its own container, its own
/workspacevolume and its own browser profile. SetCOMPUTER_RUNTIME=runscto run them under gVisor where the host supports it. - The gateway is the only way in : it resolves the target from a server-held snapshot, evaluates the policy, writes the audit row, and only then calls the computer. There is no path that acts without the record existing first.
- CEL policy, fail closed : rules can inspect
tool.name,intent,bot.id,actor.id,page.url,page.host,element.*,key,file.*andmcp.*. Deny is evaluated before allow, a missing policy permits nothing, and a broken rule refuses rather than opens. - Take the wheel : a Bot that hits a login wall or a 2FA prompt asks for help. Control is handed over in the same panel and recorded as
computer.help_requested,computer.control_takenandcomputer.control_released. While a person is driving, Bot actions are refused rather than queued. - Secrets never enter the transcript : the trail records that a secret was requested and how long it was, not what it said.
- Bring your own agent : any AG-UI endpoint is a Bot, on a framework or hand written. Endpoints are validated with the same target checks used for browser navigation, and an auth header is stored write-only.
- Components instead of prose : compiled React components live in
app/src/components/gallery/, sandboxed ones are authored in/admin/playgroundand published with no deployment. Every call asks the server whether the component exists, is published, and is not withheld from that Bot. Data functions are granted per component. - Governed MCP : a curated catalogue ships for Atlassian, Box, Slack, Salesforce and ServiceNow. Custom servers must pass URL checks, and any tool not positively classified as a read is treated as a write.
- Skills are instructions, not capabilities : personal skills attach only to Bots their author owns, deployment skills are admin-owned, and both are invoked with
/in the composer. - An audit trail you can read :
/admin/auditlists what was permitted, what was refused and what failed, and every refusal carries the rule that caused it. - Credentials encrypted at rest : stored through
/admin/credentials, never returned by an API, and redacted from audit events. - Loopback by default : computers bind to
127.0.0.1and require a per-container token, so nothing reaches a logged-in browser by knowing its port. - Durable threads and memory : conversations survive restarts through CopilotKit Intelligence, and each deployment stamps the threads it owns.
Any AG-UI endpoint can be a Bot.
From /agents, create a coworker with:
- name, title, and role description;
- private or public visibility;
- optional AG-UI endpoint;
- optional write-only authorization header.
The server validates agent endpoints with the same target checks used for browser navigation. If no custom endpoint is set, product-created coworkers use MANAGED_AGENT_AG_UI_URL.
Tenant package agents are declared in agents.yaml as either:
built-in, with a system prompt; orremote-ag-ui, with an endpoint.
See docs/configuration.md and docs/coworkers.md.
.env.example is the source template. The API server refuses to start without:
DATABASE_URLKEY_ENCRYPTION_KEYMANAGED_AGENT_AG_UI_URLINTELLIGENCE_API_URLINTELLIGENCE_GATEWAY_WS_URLINTELLIGENCE_API_KEYCOPILOTKIT_LICENSE_TOKEN
Settings worth knowing:
| Variable | Use |
|---|---|
OPENBOT_DEV_NO_AUTH |
Admits every request as one administrator. How OpenBot runs today. |
OPENAI_BASE_URL |
Answers the OpenAI-shaped calls from somewhere else: a gateway, a proxy. |
ANTHROPIC_BASE_URL, GOOGLE_GENERATIVE_AI_BASE_URL |
The same, for those two APIs. |
COMPUTER_TOKEN |
Secret every Bot computer request must present. start.sh sets one. |
SUPERVISOR_TOKEN |
Secret the supervisor requires. start.sh sets one. |
COMPUTER_SUPERVISOR_URL |
Gives each Bot a computer of its own instead of one shared computer. |
COMPUTER_RUNTIME |
Set to runsc to run computers under gVisor, where the host has it. |
AGENT_COMPUTER_POLICY |
JSON action policy. Malformed JSON stops server startup. |
AGENT_COMPUTER_ALLOW_PRIVATE_HOSTS |
Lets a Bot reach this machine's own services. |
TENANT_PACKAGE_DIR |
Directory containing tenant YAML. Defaults to ../examples/fintech. |
DEPLOYMENT_ID |
Names this deployment when two share one Intelligence project. |
Full reference: docs/configuration.md.
| Service | Port | Purpose |
|---|---|---|
app |
3010 | React/Vite UI. |
server |
3001 | Hono API, CopilotKit runtime, auth, policy, audit, plugins, components, coworkers, and channels. |
agent-computer |
4100 | Chromium plus /workspace and browser profile. |
agent-bot |
4200 | Proof-of-concept AG-UI Bot. |
agent-langgraph |
4201 | LangGraph AG-UI Bot. |
supervisor |
4500 host / 4300 container | Creates and manages one computer per Bot. |
| PostgreSQL with pgvector | 5432 | Product data, policy, audit, credentials, grants, channels, knowledge, and component metadata. |
| CopilotKit Intelligence | external | Durable threads and memory. |
The server gateway is the product/API path for Bot browser and file tool calls. It resolves the target, evaluates policy, writes an audit row, and then calls agent-computer. The computer also exposes lower-level token-protected service endpoints; keep them private and do not use them to bypass the gateway.
More detail: docs/architecture.md.
OPENBOT_DEV_NO_AUTH is the default because it needs no OAuth credentials and no consent screen. To sign in for real instead, create a Google OAuth client and set all four of these together:
BETTER_AUTH_URL=http://localhost:3001
BETTER_AUTH_SECRET= # openssl rand -base64 32, at least 32 characters
GOOGLE_OAUTH_CLIENT_ID=
GOOGLE_OAUTH_CLIENT_SECRET=
Then set the two that decide who gets in and from where:
TRUSTED_ORIGINS— where the app is served from,http://localhost:3010locally. It defaults tohttp://localhost:3000, which is not wherestart.shserves the app.INITIAL_ADMIN_EMAILS— comma separated. An address listed here becomes an administrator the first time it signs in; everybody else becomes a user.
Remove OPENBOT_DEV_NO_AUTH, then restart: the sign-in button is written into the app's generated config at startup, so it appears only once all four settings are present. Accounts, sessions and roles are stored in the same PostgreSQL database as everything else.
A partial set is refused rather than ignored: the server will not start with BETTER_AUTH_SECRET or BETTER_AUTH_URL but no client credentials, or with a secret shorter than 32 characters.
Keeping it to your machine
-
agent-computerdrives a browser holding real logins.docker-compose.ymlbinds it to loopback; leave it there. -
Store credentials through
/admin/credentials, which encrypts them. Do not put credential values in tenant YAML or in committed files. -
AGENT_COMPUTER_ALLOW_PRIVATE_HOSTSlets a Bot reach services on this machine. Unset it if you would rather it could not.bun run format:check bun run lint bun run typecheck bun run test bun run build
After changing the Drizzle schema:
bun run --filter server db:generate
bun run --filter server db:migrate
Use bash scripts/start.sh for the whole stack. Use bun run dev only when you want the app and server without the Docker Bots and computers.
- Open an issue or coordinate before starting substantial work.
- Keep changes focused and update docs when setup, configuration, architecture, or user behavior changes.
- Keep secrets, service-account JSON, customer data, and local transcripts out of the repository.
- Run the checks in Development before opening a pull request.
MIT © CopilotKit