What building Shippy taught us about building agents Shippy 教会了我们什么:构建 AI 智能体的经验总结

Enterprise Article
Published July 15, 2026

Shippy is a maritime AI agent built for high-stakes decisions, where the wrong answer has real impacts. Here's the architecture behind it—and the lessons we're carrying into Ai2's other environmental platforms.

Shippy answering a live query about Ghana's EEZ

Shippy answering a live query about Ghana's EEZ. The response shows its work: the boundary source, the data cutoff, the query timestamp, and a deep link back to the Skylight map so the analyst can verify every number.Shippy 正在回答关于加纳专属经济区(EEZ)的实时查询。其回复展示了详细的处理过程:边界来源、数据截止时间、查询时间戳,以及指向 Skylight 地图的深度链接,以便分析师核实每一个数字。

Building an AI agent for a high-stakes operational domain like protecting the ocean is, above all, a problem of reliability. For a maritime analyst, a wrong answer could send a patrol vessel miles in the wrong direction, costing significant resources that are already stretched thin and potentially putting personnel in harm's way.为保护海洋等高风险业务领域构建 AI 智能体,首要问题是可靠性。对于海事分析师而言,错误的答案可能导致巡逻船偏离航向数英里,不仅耗费本就紧张的宝贵资源,还可能将人员置于危险之中。

So when the Skylight team set out to build Shippy, our AI for real-time maritime domain awareness, the real work wasn't the model. It was building a system we could trust to be correct, to stay within its limits, and to hold up across a wide range of tasks. And we had to verify all of it against Skylight's live data, updated continuously as new satellite and vessel signals arrive—not a static snapshot.因此,当 Skylight 团队着手构建我们的实时海事态势感知 AI——Shippy 时,真正的挑战并非模型本身,而是如何构建一个值得信赖的系统:确保其准确性、将其限制在预定范围内,并使其在各种任务中保持稳定。此外,我们必须根据 Skylight 的实时数据(随着卫星和船舶信号的更新而不断变化)来验证这一切,而不是基于静态快照。

Agent anatomy: skills, soul, and config 智能体剖析:技能、灵魂与配置

We think of an agent like Shippy as three things: a soul, skills, and config.我们认为像 Shippy 这样的智能体由三部分组成:灵魂、技能和配置。

The soul is the system prompt that frames Shippy's persona and sets behavioral boundaries. Skills tell Shippy how to handle specific kinds of requests. Together, the soul and skills are baked into a Docker image—a versioned, deployable artifact that defines what Shippy is. Config covers everything else: which agent harness to run (in Shippy’s case, OpenClaw, an open-source agent framework), which LLM to use (currently, Shippy relies on Claude Opus 4.6), and runtime settings. Secrets like API keys are injected at runtime; swapping the model or the harness is a config change, not a rebuild.“灵魂”是系统提示词(System Prompt),它确立了 Shippy 的人设并设定了行为边界。“技能”告诉 Shippy 如何处理特定类型的请求。灵魂与技能共同封装在 Docker 镜像中——这是一个版本化、可部署的制品,定义了 Shippy 的本质。“配置”涵盖了其余所有内容:使用哪种智能体框架(Shippy 使用的是开源框架 OpenClaw)、使用哪种大语言模型(目前 Shippy 依赖 Claude Opus 4.6),以及运行时设置。API 密钥等机密信息在运行时注入;更换模型或框架只需更改配置,无需重新构建。

Shippy’s skills follow the same agent-skills spec used by coding tools like Claude Code and Codex—plain markdown files with structured frontmatter. This keeps each skill comprehensible, versioned, and easy to revise. Shippy currently includes skills for:Shippy 的技能遵循与 Claude Code 和 Codex 等编码工具相同的智能体技能规范——即带有结构化元数据的纯 Markdown 文件。这使得每项技能都易于理解、版本化和修订。Shippy 目前包含的技能包括:

  • Querying the Skylight API for Events (the vessel behaviors Skylight surfaces, like fishing or transshipment between two vessels) and vessel data查询 Skylight API 以获取事件(Skylight 呈现的船舶行为,如捕鱼或两船间的转运)及船舶数据
  • Looking up Exclusive Economic Zones (EEZ) and Marine Protected Area (MPA) boundaries查询专属经济区(EEZ)和海洋保护区(MPA)边界
  • Interpreting vessel track data, the position and movement signals ships broadcast, building on the activity classifications Skylight's models, including Atlantes, already produce解读船舶轨迹数据(船舶广播的位置和移动信号),并基于 Skylight 模型(包括 Atlantes)已生成的活动分类进行分析
  • Generating interactive map links that let an analyst jump from a Shippy in-chat answer to an exact location on the Skylight map生成交互式地图链接,让分析师能从 Shippy 的聊天回复直接跳转到 Skylight 地图上的精确位置

For example, the Skylight API query skill encodes the full workflow for answering a question about a specific area. When an analyst or user asks, "show me fishing activity in Panama's EEZ last month," the skill's instructions direct Shippy to first resolve "Panama EEZ" to a boundary polygon through Skylight's regions API instead of guessing or hard-coding coordinates, then query Fishing Events within that geometry, format the results with deep links back to the Skylight map, and attribute any vessel metadata drawn from Skylight partners like Global Fishing Watch or TMT.例如,Skylight API 查询技能编码了回答特定区域问题的完整工作流。当分析师或用户询问“显示上个月巴拿马专属经济区的捕鱼活动”时,该技能的指令会引导 Shippy 首先通过 Skylight 的区域 API 将“巴拿马专属经济区”解析为边界多边形,而不是盲目猜测或硬编码坐标;接着查询该几何范围内的捕鱼事件;最后格式化结果并附上指向 Skylight 地图的深度链接,同时注明从 Global Fishing Watch 或 TMT 等 Skylight 合作伙伴处获取的船舶元数据来源。

A single question posed to Shippy can hook into several skills at once. "Are there vessels operating near the Cordillera de Coiba MPA?" draws on the Skylight skill for data query, our partner ProtectedSeas’ database for MPA boundary context, and the vessel track skill for interpreting vessel behavior. All of this happens in a single dialogue turn.针对 Shippy 的一个提问可以同时调用多项技能。“Cordillera de Coiba 海洋保护区附近是否有船舶作业?”这一问题同时调用了 Skylight 的数据查询技能、合作伙伴 ProtectedSeas 的海洋保护区边界数据库,以及用于解读船舶行为的船舶轨迹技能。所有这些都在单轮对话中完成。

The soul defines what Shippy will and won't do. It won't make legal determinations about whether a vessel is breaking the law—that is a determination for people, not an agent. It also won't speculate beyond what the data supports. These boundaries are explicit in the system prompt, not implicit in fine-tuning, which makes them auditable and easy to revise.“灵魂”定义了 Shippy 能做什么和不能做什么。它不会对船舶是否违法做出法律裁定——这是人类而非智能体的职责。它也不会在数据支持的范围之外进行推测。这些边界在系统提示词中明确规定,而非隐含在微调中,这使得它们易于审计和修订。

Deterministic tools for a nondeterministic agent 为非确定性智能体提供确定性工具

Agents are nondeterministic. You can't control what the model decides to do, but you can make the tools it reaches for predictable. To that end, Shippy 'talks' to Skylight through a purpose-built CLI that calls the API, rather than issuing raw calls itself.智能体具有非确定性。你无法控制模型决定做什么,但可以使其调用的工具变得可预测。为此,Shippy 通过一个专用的 CLI 与 Skylight “对话”,由该 CLI 调用 API,而不是让智能体直接发起原始调用。

Our API has dozens of input types, nested filter objects, pagination cursors, and complex geometry inputs. In early prototypes, we let Shippy construct API calls from scratch. It produced a steady stream of subtle bugs: malformed pagination that silently dropped results, geometry encoding errors, and correct-looking queries that returned wrong data because of a misunderstood filter type.我们的 API 拥有数十种输入类型、嵌套过滤器对象、分页游标和复杂的几何输入。在早期原型中,我们让 Shippy 从零开始构建 API 调用,结果产生了一系列细微的 Bug:格式错误的分页导致结果悄无声息地丢失、几何编码错误,以及由于误解过滤器类型而导致查询看起来正确但返回了错误数据。

The Skylight CLI collapses that complexity into a predictable interface. Shippy issues a single command – skylight events search with typed filter flags – and the CLI handles authentication, pagination, and structured output. The CLI is also self-documenting: extensive --help text and detailed error messages give the agent (and human developers) enough context to recover from mistakes without guessing. Its output is always written to a local JSON file rather than piped through the shell. Early on, large result sets would hit pipe buffer limits or break downstream tools like jq. Writing to disk sidesteps both problems and lets the agent programmatically access query results across subsequent steps.Skylight CLI 将这种复杂性简化为一个可预测的接口。Shippy 只需发出一条命令——例如带有类型化过滤标志的 `skylight events search`——CLI 就会处理认证、分页和结构化输出。CLI 还具备自文档化功能:详尽的 `--help` 文本和详细的错误信息为智能体(及人类开发者)提供了足够的上下文,使其无需猜测即可从错误中恢复。其输出总是写入本地 JSON 文件,而不是通过 Shell 管道传输。早期,大型结果集曾导致管道缓冲区溢出或破坏了 jq 等下游工具。写入磁盘避开了这两个问题,并允许智能体在后续步骤中以编程方式访问查询结果。

Underneath the CLI is a standardized API: multiple resource types – Skylight Events, vessels, regions, satellite imagery, vessel tracks, and more – accessible through a common pair of operations, search and aggregate. The APIs' inputs and outputs are defined as typed schemas with field-level descriptions.CLI 的底层是一个标准化的 API:多种资源类型(如 Skylight 事件、船舶、区域、卫星图像、船舶轨迹等)均可通过搜索(search)和聚合(aggregate)这两种通用操作进行访问。API 的输入和输出均定义为带有字段级描述的类型化模式(Schema)。

This layering – typed API, deterministic CLI, and agent skills that reference the CLI's commands – means that each of Shippy's components can be tested independently. The API has its own test suite. The CLI can be exercised by a human or an agent. And the agent skills reference CLI commands that handle the plumbing so that Shippy doesn't have to reinvent the wheel every time it hits the Skylight API. Each layer narrows what the next layer can get wrong.这种分层架构——类型化 API、确定性 CLI 以及引用 CLI 命令的智能体技能——意味着 Shippy 的每个组件都可以独立测试。API 有自己的测试套件;CLI 可由人类或智能体测试;智能体技能则引用处理繁琐细节的 CLI 命令,这样 Shippy 就不必每次调用 Skylight API 时都重复造轮子。每一层都缩小了下一层可能出错的范围。

Shippy architecture diagram

Sandboxed hosting and isolation 沙箱托管与隔离

Skylight serves hundreds of government agencies and NGOs across over 70 countries. A fisheries officer in the Philippines has Areas of Interest, vessel watchlists, and alert configurations that are scoped to their Skylight account. When they ask Shippy a question, the agent's API calls need to return their data, and their conversation history must never be visible to anyone else.Skylight 为 70 多个国家的数百个政府机构和非政府组织提供服务。菲律宾的渔业官员拥有各自的关注区域、船舶观察名单和警报配置,这些都限定在其 Skylight 账户内。当他们询问 Shippy 问题时,智能体的 API 调用必须返回属于他们的数据,且其对话历史绝对不能被其他人看到。

Every user talks to Shippy inside their own ephemeral, isolated session, and making that work reliably at scale was one of the most significant engineering efforts behind the project. We built Mothership, an agent hosting platform that provisions a dedicated Kubernetes deployment for each user session. When a user opens a conversation, the system spins up a set of pods packaging the agent runtime, its skills, and the Skylight CLI. The user's Skylight JWT is injected at provision time so the agent's API calls are scoped to that user's data.每个用户都在各自临时的、隔离的会话中与 Shippy 对话,实现这一点的规模化可靠运行是该项目背后最重大的工程任务之一。我们构建了 Mothership,这是一个智能体托管平台,为每个用户会话提供专用的 Kubernetes 部署。当用户开启对话时,系统会启动一组 Pod,打包智能体运行时、技能和 Skylight CLI。用户的 Skylight JWT 在配置时注入,确保智能体的 API 调用仅限于该用户的数据。

Files the agent writes during a multi-step analysis exist only within that session and are never shared across users. Inside the sandbox, the agent can write and run code, install dependencies, pull in datasets, and work through multi-step analyses. At the network level, the sandbox is restricted to only the services it needs.智能体在多步分析过程中写入的文件仅存在于该会话中,绝不会在用户之间共享。在沙箱内部,智能体可以编写和运行代码、安装依赖、拉取数据集并完成多步分析。在网络层面,沙箱仅限于访问其必需的服务。

Sandbox architecture diagram

Evaluating an agent, not a model 评估智能体,而非评估模型

Most benchmarks rank general-purpose AI on static questions. They don't capture how an agent behaves once it's wired into a real workflow: how it selects tools, queries live data, acts on results, and knows where to stop. So we built our own eval system around how Shippy works, scoring the whole agent – model, skills, and sandbox together – against live data.大多数基准测试通过静态问题对通用 AI 进行排名,但无法捕捉智能体在实际工作流中的表现:它如何选择工具、查询实时数据、根据结果采取行动以及知道何时停止。因此,我们围绕 Shippy 的工作方式构建了自己的评估系统,根据实时数据对整个智能体(模型、技能和沙箱)进行评分。

In our eval framework, subject-matter experts write scenarios and rubrics, choosing which criteria apply to each task and setting the weights, so every task is graded on what actually matters for it. A fishing-events query, for instance, weights data accuracy most heavily, with boundary resolution and timeframe next, and source attribution and response style carrying less. They also annotate individual responses as correct or incorrect, giving the judge ground truth to score against. Subject-matter experts additionally annotate individual responses as correct or incorrect, giving the judge ground truth to score against.在我们的评估框架中,领域专家编写场景和评分细则,选择适用于每项任务的标准并设置权重,从而确保每项任务的评分都基于其实际重要性。例如,捕鱼事件查询将数据准确性权重设为最高,边界解析和时间范围次之,来源归属和回复风格权重较低。专家还会将个人回复标注为正确或错误,为评判者提供真实参考依据。

The pipeline is straightforward: a natural-language prompt runs through the sandbox, an LLM judge grades each criterion from 0 to 1 and explains in writing why the response did or didn't meet it, and the weighted aggregate is checked against a fixed pass threshold, as the diagram below shows.评估流程非常直接:自然语言提示词在沙箱中运行,LLM 评判者根据每项标准给出 0 到 1 的评分并写出书面理由,最后将加权汇总结果与设定的通过阈值进行比对,如下图所示。

Eval pipeline diagram How a single task is scored in our pipeline. A natural-language prompt runs through the sandbox, an LLM judge grades each rubric criterion with written reasoning, and the weighted aggregate resolves to a pass or fail against a fixed threshold.单项任务在我们的流水线中是如何评分的:自然语言提示词在沙箱中运行,LLM 评判者根据评分细则给出书面理由,加权汇总结果与固定阈值进行比对,以确定通过或失败。

Tasks are executed through Harbor, an open evaluation framework. We wrote a Harbor plugin that spins up a real Shippy session on the exact version being tested, against the same real data a user would encounter. The suite runs in parallel against a specific versioned Shippy build, producing a timestamped results file and a report of score changes against the previous run. We rerun the suite whenever the skills, model, or underlying data change, and a version of Shippy that regresses on our eval criteria doesn't reach end users.任务通过开源评估框架 Harbor 执行。我们编写了一个 Harbor 插件,在测试版本上启动真实的 Shippy 会话,并使用用户会接触到的真实数据进行测试。该套件针对特定版本的 Shippy 构建并行运行,生成带时间戳的结果文件和与前一次运行的评分变化报告。每当技能、模型或底层数据发生变化时,我们都会重新运行该套件,任何在评估标准上出现退步的 Shippy 版本都不会发布给最终用户。

Shippy scores consistently across data retrieval and guardrail tasks, correctly refusing military intelligence requests, maintaining user data isolation, and attributing sources accurately. In our latest run, the clearest patterns were patrol-planning tasks where Shippy overstepped into tactical recommendations rather than decision support, geometry-sensitive queries where boundary simplification caused missed Events, and one case where the agent invented a CLI command that didn't exist. Each of these directly informs our next round of skill improvements.Shippy 在数据检索和护栏任务中表现稳定,能正确拒绝军事机密请求、维护用户数据隔离并准确注明来源。在最近的运行中,最明显的模式是巡逻规划任务,Shippy 有时会越界提供战术建议而非决策支持;此外还有几何敏感查询中边界简化导致漏掉事件的情况,以及一次智能体编造了不存在的 CLI 命令。每一个发现都直接指导了我们下一轮的技能改进。

Shippy eval suite screenshot Shippy's eval suite running inside Skylight: each scenario is scored on weighted criteria, with the judge's reasoning visible so a failure points to a specific behavior to fix.在 Skylight 中运行的 Shippy 评估套件:每个场景都根据加权标准进行评分,评判者的推理过程清晰可见,以便针对性地修复特定行为。

Where we're headed 未来规划

We're opening Shippy to early adopters on a rolling basis and inviting them to stress-test it—to find the questions the agent answers poorly and guardrails that may need tightening. Here’s what we're building next:我们正在分批向早期采用者开放 Shippy,并邀请他们进行压力测试——找出智能体回答不佳的问题以及需要加强的护栏。以下是我们接下来的开发重点:

  • Agent-driven UI control. Shippy returns map links today; next it will drive the Skylight map itself, moving to a region, applying filters, and adjusting time ranges.智能体驱动的 UI 控制。Shippy 目前仅返回地图链接;未来它将能直接操作 Skylight 地图,包括移动到特定区域、应用过滤器和调整时间范围。
  • Model routing. Not every question needs a frontier model, so we're routing simple lookups to smaller, faster ones and saving the full-weight model for complex investigations.模型路由。并非每个问题都需要前沿模型,因此我们将简单的查询路由至更小、更快的模型,将全量模型留给复杂的调查任务。
  • Cross-thread memory. Conversation history persists within a thread, but context doesn't carry across threads. We're building memory so Shippy carries persistent facts (e.g., an analyst's jurisdiction, preferred sources) and applies them automatically. So, "Show me fishing activity this week" won't mean re-specifying an analyst's EEZ each time.跨对话记忆。目前对话历史仅在单个线程内持久化,上下文无法跨线程传递。我们正在构建记忆功能,使 Shippy 能携带持久化事实(如分析师的管辖区、偏好来源)并自动应用。这样,“显示本周的捕鱼活动”就不需要每次都重新指定分析师的专属经济区了。

Our work on Shippy is already shaping how we think about agents elsewhere at Ai2—most immediately EarthRanger, our wildlife-conservation platform, and OlmoEarth, our open suite of Earth observation tools. Mothership was built to be general and to host other agents, so while maritime is the first domain we're applying it to, we don't expect it to be the last.我们在 Shippy 上的工作正在塑造 Ai2 其他部门对智能体的思考方式——最直接的是我们的野生动物保护平台 EarthRanger 和开源地球观测工具套件 OlmoEarth。Mothership 的设计初衷就是通用并托管其他智能体,因此虽然海事是我们应用它的第一个领域,但这绝不会是最后一个。


Shippy is built by the Skylight team at Ai2. Skylight is a free maritime domain awareness platform used by 300+ partners across 70 countries.Shippy 由 Ai2 的 Skylight 团队构建。Skylight 是一个免费的海事态势感知平台,被 70 个国家的 300 多个合作伙伴使用。

Community

Sign up or log in to comment