@atlanai/sdk

中文文档
0.9.0发布于 2026/11/11Apache-2.0TypeScriptESM + CJS近 30 天下载 1980

Atlan 代理网关管理 SDK

中文使用文档
文档目录12 节
  1. 安装
  2. 快速启动
  3. 运行 eval
  4. 计分器返回值
  5. 运行数据集的一部分
  6. 直接控制电子寿命周期
  7. 追踪
  8. 克劳德探员SDK
  9. LITELM 部署 ID
  10. 错误
  11. 运行时间
  12. Bun、Deno和工人的LiteLLM部署编号

@atlanai/sdk (英语)

Atlan代理网关的TypeScript/JavaScript SDK:管理代理,技能, 和工作空间, 并选择跟踪您的代理.

安装

npm install @atlanai/sdk

快速启动

import { AtlanClient } from "@atlanai/sdk";

const client = new AtlanClient({
  gatewayOrigin: "https://<your-gateway-host>",
  bearerToken: "<your-api-token>",
});

const agent = await client.agents.create({
  name: "support-triage",
  workspaceId: "workspace_01example",
});

const page = await client.agents.list({ limit: 10 });
console.log(`${page.items.length} agents`);

方法改为: client.<resource>.<action> —— 说 client.agents.get(agentId), (中文(简体) ), client.sessions.messages.create(sessionId, {...}),等等。 (笑声) 每个公众 Agent Gateway 操作可以这样到达;不需要进入 直接生成客户端.

生成的API也被服务和标记所打入,包括他们的中间软件:

const releases = client.raw.registry.apis.releases.withMiddleware({
  post: async ({ response }) => response,
});
const page = await releases.registryListReleases({ limit: 10 });

这些访问者保留生成的请求/答复类型。 动态字符串服务 在运行时发现服务的代码仍可查询.

请求默认进行一次尝试。 应用程序可以配置 选入重试中间软件 以有限度的尝试, 抖动、取消和 Retry-After 支助。 见 请求出错 用于输入常见错误及其重试元数据.

timeoutMs 限制每个管理操作,包括信使查询、重试、, 和成功/错误的身体解码。 通过 a signal 通过生成的 API 请求 取消一个呼叫 . Raw 方法保留最后期限,同时保留其身体 打开: 消耗响应或取消 response.raw.body 当完成.

通过默认的工作空间一次, 而不是在每次呼叫中重复 :

const client = new AtlanClient({ gatewayOrigin, bearerToken, workspace: "workspace_01example" });

默认还提供资源所需的工作空间查询参数 方法,既适用于立场参数,也适用于明确的选项对象。 明确 工作空间值胜出; 没有默认, 需要的工作空间参数仍然保留 运行时需要.

运行 eval

Eval() 执行任务和计分器,创建登记实验,发射 每例1个跟踪,上传跟踪链接结果,并完成运行. 书记官处 在最后敲定期间,获得持久的分数摘要:

import { Eval } from "@atlanai/sdk";

const result = await Eval("Anthropic Evaluation", {
  data: () => [
    { input: "What is 2+2?", expected: "4" },
    { input: "What is the capital of France?", expected: "Paris" },
  ],
  task: async (input) => callModel(input),
  scores: [{
    name: "accuracy",
    scorer: ({ output, expected }) => output === expected ? 1 : 0,
  }],
}, { subjectKind: "agent", subjectId: "agent_01example" });

console.log(result.experimentId);

subjectKind 财务报告和审定财务报表 subjectId 连接运行到它测试的代理, 即 evals UI如何找到它;代理标识(agent_...这是 id 那个 client.agents.list() 返回。 运行一个既无, 仍然保存, 但列表 在没有代理的情况下 Eval() 以创造人的时候盟誓.

设定 ATLAN_API_KEY 财务报告和审定财务报表 ATLAN_WORKSPACE_ID内置替换 data 与 dataset: "dataset_..." 或一个准确的登记数据集名称。 跑者拒绝 当跟踪被禁用时继续,因为微量的 eval 行会打破 证据链。 冲洗后,它读出每个案件 追溯到 实验过滤器在上传结果之前; 缺失的跟踪标记 实验失败 。 登记册数据集大小写传递到数据集的值 inputKey (默认) question)到任务并解开一键 { value: ... } 预期值。 一次毫无可用分数的跑步 最终确定并被拒绝;通过 requireScores: false 如果设置了空分数 预期.

计分器返回值

得分者还取一分. 计分员自己的名字是度量名,除非 值带有一个值.

() => 0.8                                        // a number (true counts as 1, false as 0)
() => null                                       // abstain: recorded, but not averaged
() => ({ score: 1, name: "exact", metadata: { why: "match" } })
() => [{ score: 1, name: "a" }, { score: 0, name: "b" }]   // a list of { score, ... } objects

名单持有 { score, name?, metadata? } 物体,不是空数。 一个平地 对象需要一个 score 键.

默认是投球的计分员将整个案例标为出错. 过 { scorerErrors: "score" } 在将失败保留到该计分器的选项中: 其衡量标准记录为: null。信息存储在案件结果上(以及 sourceMetadata.atlan_eval.scorer_errors 和那个案子 除非计分员产生一个数字,否则将保持成功。 只有一个例外 计分器计数:不支持的返回值、重复或相撞分数 名称,或注册失败仍然错误.

运行数据集的一部分

recordIds, (中文(简体) ), where 财务报告和审定财务报表 limit 运行书记官处数据集的子集。 运行 保留与数据集的链接,因此每个结果都保留其 datasetRecordId 财务报告和审定财务报表 运行可以和记录中同一数据集的完整运行进行比较 运行。 实验的冰冻快照和简历 必须通过相同的选择者. where 必须是同步函数 返回布尔.

await Eval("Support smoke", {
  dataset: "support-daily-tasks",
  task,
  scores,
}, {
  where: (item) => (item.tags ?? []).includes("billing"),
  limit: 10,
});

直接控制电子寿命周期

用文物标识或确切名称解决已存在的数据集,然后创建 在另一个跑者发出任何痕迹之前进行登记试验:

import { createContextManifest, startExperiment } from "@atlanai/sdk";
import { propagateAttributes } from "@atlanai/sdk/tracing";

const contextManifest = await createContextManifest([{
  kind: "file",
  name: "CLAUDE.md",
  version: "git:0123456789abcdef0123456789abcdef01234567",
  digest: `sha256:${"0".repeat(64)}`,
}]);

const run = await startExperiment(
  client,
  "conversational-studio-daily", // exact name, or dataset_... ID
  { name: "candidate-run", config: { model: "example-model" } },
  { contextManifest },
);

await propagateAttributes(run.traceOptions, () => existingRunner());

run.experiment 是生成的创建响应 run.id 这是它的 experimentId。帮助者将解析的数据集版本和上下文标出 表现在不可改变的实验配置中。 当另一把绳子拥有时使用它 执行、结果上传和定稿.

追踪

import { initLogger, wrapTraced } from "@atlanai/sdk/tracing";

const logger = initLogger({ projectName: "support-agent" });
const handleRequest = wrapTraced(async (input: string) => callModel(input));

await logger.traced(async (span) => {
  const output = await handleRequest("hello");
  span.log({ input: "hello", output });
}, { name: "handle-request", type: "task" });

await logger.flush();

追踪有自己的API密钥和生命周期. 它不重复管理 客户的运输。 它作为单独的子道而航行 (单位:千美元)@atlanai/sdk/tracing)所以导入它不会把 OpenTeleometry 拖入一个 仅管理捆绑。 npm 仍然安装 OpenTeleometry 依赖性 软件包,因为 npm 无法将依赖性作为导入条件 子路径; 将追踪拆分为第二个包将交易安装大小 用于第二版并发布生命周期.

Vercel AI SDK v3-v6使用其原生的OpenTelection路径:

import * as ai from "ai";
import { initLogger, wrapAISDK } from "@atlanai/sdk/tracing";

initLogger({ projectName: "support-agent" });
const { generateText, streamText } = wrapAISDK(ai);

见 评估与追踪 框架设置, 上下文显示、无服务器冲出和测试的集成矩阵.

克劳德探员SDK

Claude探员SDK是用密码包起来的 而不是在 instrument页:1 软件包仅限无害环境管理,因此没有 init() 要补丁.

import * as sdk from "@anthropic-ai/claude-agent-sdk";
import { getClient, init, wrapClaudeAgentSDK } from "@atlanai/sdk/tracing";

init({ serviceName: "support-agent" });
const { query } = wrapClaudeAgentSDK(sdk); // same exports as the SDK, traced

for await (const message of query({ prompt: "hello" })) {
  // unchanged
}
await getClient().flush();

每个 query() 呼叫变成一个 invoke_agent 用一个 chat 每个模型的跨度 转来转去 execute_tool 每个工具呼叫间距。 命名 claude-agent-sdk 内 instrument 打印此提示并报告一次 manual 内 init(...).instrumentation。 。 。 .

LITELM 部署 ID

一个 LiteLLM 代理用户名 x-litellm-model-id 响应头。 之后 init() 或者说 initLogger()和SDK一样 记录该值为 atlan.model.ref 在呼叫的LLM跨度,和 x-litellm-call-id 作为 atlan.model.call_id所以Atlan可以给电话定价 部署。 没有客户端代码更改 。 Atlan模型网关读取方式相同: x-gateway-model-deployment (LiteLLM部署它计费),或者其他 x-gateway-model-id (它的模范行),变成 atlan.model.ref,以及 x-gateway-model-name 替换 gen_ai.response.model 当该跨度导出时。 网关 x-gateway-model-price (价格它解决呼叫) 变成 atlan.model.price,所以请 追踪会像Model Gateway的用途那样花费呼叫费. atlan.model.gateway.type 命名路由器( r)atlan-model-gateway 或者说 litellm) (中文(简体) ).

这是默认的。 在节点上,SDK订阅了undici的诊断频道 并且没有补丁,所以客户端在之前构建 init() 被覆盖。 只有 内置 fetch (unidici)观察到:客户在 node-fetch, (中文(简体) ), axios 或者说 node:http 需求 litellmFetch() 或者说 recordModelRef(). Bun, Deno和Cloudflare (英语) 工人工作方式不同;见 运行时间。仅 2xx 答复是读取的,答复机构从未读取过,而且跨度已经是一个值 载具被保存。 数值需要LLM跨度才能降落在: llm 宽度 本身,一个提供器件的跨度,或者AI SDK的 doGenerate 编号 : doStream 间距.

把它关掉 init({ captureModelRef: false }) 或者说 ATLAN_CAPTURE_MODEL_REF=false。关闭表示没有安装钩子;它没有 删除早先的钩子 init() 安装在相同的进程.

钩子看不见的呼叫,通过 litellmFetch() 作为客户的 fetch。 包装 globalThis.fetch 仅供客户使用:

import OpenAI from "openai";
import { litellmFetch } from "@atlanai/sdk/tracing";

const openai = new OpenAI({ baseURL: litellmUrl, fetch: litellmFetch() });

或者在LLM范围内记录你的价值. recordModelRef 写到 活动 LLM 跨度, 除非您通过 span返回 true 当它写了什么 从不掷出 :

import {
  LITELLM_CALL_ID_HEADER,
  LITELLM_MODEL_ID_HEADER,
  recordModelRef,
} from "@atlanai/sdk/tracing";

if (response.ok) {
  recordModelRef(response.headers.get(LITELLM_MODEL_ID_HEADER), {
    callId: response.headers.get(LITELLM_CALL_ID_HEADER),
  });
}

一个没有LLM横跨的电话 根本没有记录.

错误

每个非-2xx的答复都以 AtlanAPIError,与 .status, (中文(简体) ), .code, (中文(简体) ), (如果网关包括一个) .traceId. 在作出任何答复之前未能采取行动 改为 AtlanAPIError 与 status === 0数字 :

import { AtlanAPIError } from "@atlanai/sdk";

try {
  await client.agents.get("agent_does_not_exist");
} catch (error) {
  if (error instanceof AtlanAPIError) {
    console.log(error.status, error.code);
  }
}

运行时间

节点20. 跟踪子路径被写入为也在非节点运行时运行 像Cloudflare工人——通过配置到 init() 很明显 而不是依赖环境变量,因为工人没有环境 环境.

Bun、Deno和工人的LiteLLM部署编号

Bun, Deno和Cloudflare工人从不发表undici的诊断事件,所以 那边 init() 包装 globalThis.fetch 换句话说 这个 openai 财务报告和审定财务报表 @anthropic-ai/sdk 客户留着 fetch 当他们被建造的时候, 所以,一个客户端 之前建立 init() 被默默地错过。 打电话 init() 在任何时间之前 客户端已构建 。 在它无法识别的运行时间, SDK 安装什么也没有.

Bun 有预装:

bun --preload ./atlan-init.ts ./app.ts

Deno,以init模块作为第一个导入:

import "./atlan-init.ts"; // calls init() before anything below runs
import OpenAI from "openai";

工人,客户建在操作员之后 init()数字 :

import OpenAI from "openai";
import { init } from "@atlanai/sdk/tracing";

export default {
  async fetch(request: Request, env: Env): Promise<Response> {
    init({ serviceName: "edge-agent", apiKey: env.ATLAN_API_KEY, workspaceId: env.ATLAN_WORKSPACE_ID });
    const openai = new OpenAI({ apiKey: env.LITELLM_API_KEY, baseURL: env.LITELLM_URL });
    // ...
  },
};

当客户必须存在之前 init(),给它 litellmFetch() 换句话说. 没有Async LocalStorage和Vercel Edge的工人没有经过测试.

版本与发布记录

@atlanai/sdk 共发布 23 个版本,首次发布于 2026/09/03;过去 12 个月发布了 23 个版本。

版本发布日期距今
0.9.0latest2026/11/113 天前
0.9.0-beta.1beta2026/11/0212 天前
0.8.22026/10/2223 天前
0.8.02026/10/2025 天前
0.8.0-beta.22026/10/2025 天前
0.6.02026/10/1530 天前

关于 @atlanai/sdk 的常见问题

@atlanai/sdk 是什么?

Atlan 代理网关管理 SDK

如何安装 @atlanai/sdk?

在项目目录运行 npm install @atlanai/sdk,或使用 pnpm add / yarn add / bun add。

@atlanai/sdk 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@atlanai/sdk 支持 ESM 还是 CommonJS?

同时提供 ES Module 与 CommonJS 入口,import 和 require() 都可以使用,打包工具会自动选择合适的版本。

@atlanai/sdk 需要什么版本的 Node.js?

package.json 的 engines 字段要求 Node.js >=20。版本不符时 npm 默认只给出警告,开启 engine-strict 后会拒绝安装。

@atlanai/sdk 可以商用吗?

@atlanai/sdk 使用 Apache-2.0 许可。宽松许可:允许商业使用、修改和再分发,并附带明确的专利授权;分发时需保留许可与 NOTICE 文件,修改过的文件要注明改动。以上为概括,不构成法律意见,请以许可原文为准。

@atlanai/sdk 的下载量有多少?

根据 npm 官方下载统计,@atlanai/sdk 在 2026/10/07 – 2026/11/05 这 30 天内被下载 1,980 次,日均约 66 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@atlanai/sdk 还在维护吗?

最新版本 0.9.0 发布于 2026/11/11(3 天前);至今共发布 23 个版本,其中过去 12 个月发布了 23 个;首次发布于 2026/09/03。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。