@atlanai/sdk 0.1.0 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +94 -26
- package/dist/client.js +3 -1
- package/dist/evals.d.ts +46 -0
- package/dist/evals.js +230 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +8 -1
- package/dist/manifest.json +299 -3
- package/dist/raw/eval/apis/DatasetsApi.d.ts +304 -0
- package/dist/raw/eval/apis/DatasetsApi.js +706 -0
- package/dist/raw/eval/apis/ExperimentsApi.d.ts +371 -0
- package/dist/raw/eval/apis/ExperimentsApi.js +869 -0
- package/dist/raw/eval/apis/ScorersApi.d.ts +129 -0
- package/dist/raw/eval/apis/ScorersApi.js +308 -0
- package/dist/raw/eval/apis/index.d.ts +3 -0
- package/dist/raw/eval/apis/index.js +21 -0
- package/dist/raw/eval/index.d.ts +3 -0
- package/dist/raw/eval/index.js +21 -0
- package/dist/raw/eval/models/AccessView.d.ts +57 -0
- package/dist/raw/eval/models/AccessView.js +64 -0
- package/dist/raw/eval/models/ArtifactConflictProblem.d.ts +69 -0
- package/dist/raw/eval/models/ArtifactConflictProblem.js +66 -0
- package/dist/raw/eval/models/CostView.d.ts +50 -0
- package/dist/raw/eval/models/CostView.js +60 -0
- package/dist/raw/eval/models/CursorPage.d.ts +38 -0
- package/dist/raw/eval/models/CursorPage.js +52 -0
- package/dist/raw/eval/models/EvalArtifactEnvelope.d.ts +144 -0
- package/dist/raw/eval/models/EvalArtifactEnvelope.js +84 -0
- package/dist/raw/eval/models/EvalArtifactSearchRequest.d.ts +71 -0
- package/dist/raw/eval/models/EvalArtifactSearchRequest.js +60 -0
- package/dist/raw/eval/models/EvalBulkDatasetRecordResponse.d.ts +33 -0
- package/dist/raw/eval/models/EvalBulkDatasetRecordResponse.js +51 -0
- package/dist/raw/eval/models/EvalBulkDatasetRecordResult.d.ts +52 -0
- package/dist/raw/eval/models/EvalBulkDatasetRecordResult.js +60 -0
- package/dist/raw/eval/models/EvalBulkExperimentResultResponse.d.ts +33 -0
- package/dist/raw/eval/models/EvalBulkExperimentResultResponse.js +51 -0
- package/dist/raw/eval/models/EvalBulkExperimentResultSlot.d.ts +53 -0
- package/dist/raw/eval/models/EvalBulkExperimentResultSlot.js +60 -0
- package/dist/raw/eval/models/EvalCreateDataset400Response.d.ts +65 -0
- package/dist/raw/eval/models/EvalCreateDataset400Response.js +75 -0
- package/dist/raw/eval/models/EvalCreateDataset409Response.d.ts +63 -0
- package/dist/raw/eval/models/EvalCreateDataset409Response.js +75 -0
- package/dist/raw/eval/models/EvalCreateDataset413Response.d.ts +64 -0
- package/dist/raw/eval/models/EvalCreateDataset413Response.js +74 -0
- package/dist/raw/eval/models/EvalCreateDataset415Response.d.ts +64 -0
- package/dist/raw/eval/models/EvalCreateDataset415Response.js +74 -0
- package/dist/raw/eval/models/EvalCreateDataset422Response.d.ts +63 -0
- package/dist/raw/eval/models/EvalCreateDataset422Response.js +75 -0
- package/dist/raw/eval/models/EvalDatasetArtifactView.d.ts +277 -0
- package/dist/raw/eval/models/EvalDatasetArtifactView.js +146 -0
- package/dist/raw/eval/models/EvalDatasetCreate.d.ts +150 -0
- package/dist/raw/eval/models/EvalDatasetCreate.js +86 -0
- package/dist/raw/eval/models/EvalDatasetMeta.d.ts +46 -0
- package/dist/raw/eval/models/EvalDatasetMeta.js +48 -0
- package/dist/raw/eval/models/EvalDatasetPatch.d.ts +52 -0
- package/dist/raw/eval/models/EvalDatasetPatch.js +54 -0
- package/dist/raw/eval/models/EvalDatasetRecordArtifactView.d.ts +330 -0
- package/dist/raw/eval/models/EvalDatasetRecordArtifactView.js +161 -0
- package/dist/raw/eval/models/EvalDatasetRecordBulkCreate.d.ts +33 -0
- package/dist/raw/eval/models/EvalDatasetRecordBulkCreate.js +51 -0
- package/dist/raw/eval/models/EvalDatasetRecordCreate.d.ts +195 -0
- package/dist/raw/eval/models/EvalDatasetRecordCreate.js +101 -0
- package/dist/raw/eval/models/EvalDatasetRecordMeta.d.ts +96 -0
- package/dist/raw/eval/models/EvalDatasetRecordMeta.js +67 -0
- package/dist/raw/eval/models/EvalDatasetRecordPatch.d.ts +81 -0
- package/dist/raw/eval/models/EvalDatasetRecordPatch.js +62 -0
- package/dist/raw/eval/models/EvalExperimentArtifactView.d.ts +320 -0
- package/dist/raw/eval/models/EvalExperimentArtifactView.js +160 -0
- package/dist/raw/eval/models/EvalExperimentCreate.d.ts +193 -0
- package/dist/raw/eval/models/EvalExperimentCreate.js +100 -0
- package/dist/raw/eval/models/EvalExperimentMeta.d.ts +91 -0
- package/dist/raw/eval/models/EvalExperimentMeta.js +62 -0
- package/dist/raw/eval/models/EvalExperimentPatch.d.ts +63 -0
- package/dist/raw/eval/models/EvalExperimentPatch.js +57 -0
- package/dist/raw/eval/models/EvalExperimentResultArtifactView.d.ts +330 -0
- package/dist/raw/eval/models/EvalExperimentResultArtifactView.js +162 -0
- package/dist/raw/eval/models/EvalExperimentResultBulkCreate.d.ts +33 -0
- package/dist/raw/eval/models/EvalExperimentResultBulkCreate.js +51 -0
- package/dist/raw/eval/models/EvalExperimentResultCreate.d.ts +197 -0
- package/dist/raw/eval/models/EvalExperimentResultCreate.js +100 -0
- package/dist/raw/eval/models/EvalExperimentResultMeta.d.ts +102 -0
- package/dist/raw/eval/models/EvalExperimentResultMeta.js +66 -0
- package/dist/raw/eval/models/EvalExperimentStatus.d.ts +31 -0
- package/dist/raw/eval/models/EvalExperimentStatus.js +59 -0
- package/dist/raw/eval/models/EvalGetDataset404Response.d.ts +63 -0
- package/dist/raw/eval/models/EvalGetDataset404Response.js +75 -0
- package/dist/raw/eval/models/EvalGetExperimentTrace400Response.d.ts +63 -0
- package/dist/raw/eval/models/EvalGetExperimentTrace400Response.js +75 -0
- package/dist/raw/eval/models/EvalListDatasets400Response.d.ts +63 -0
- package/dist/raw/eval/models/EvalListDatasets400Response.js +75 -0
- package/dist/raw/eval/models/EvalListDatasets401Response.d.ts +79 -0
- package/dist/raw/eval/models/EvalListDatasets401Response.js +89 -0
- package/dist/raw/eval/models/EvalListDatasets403Response.d.ts +64 -0
- package/dist/raw/eval/models/EvalListDatasets403Response.js +74 -0
- package/dist/raw/eval/models/EvalListDatasets500Response.d.ts +63 -0
- package/dist/raw/eval/models/EvalListDatasets500Response.js +75 -0
- package/dist/raw/eval/models/EvalListDatasets503Response.d.ts +64 -0
- package/dist/raw/eval/models/EvalListDatasets503Response.js +74 -0
- package/dist/raw/eval/models/EvalListDatasets504Response.d.ts +63 -0
- package/dist/raw/eval/models/EvalListDatasets504Response.js +75 -0
- package/dist/raw/eval/models/EvalPageDatasetArtifactView.d.ts +44 -0
- package/dist/raw/eval/models/EvalPageDatasetArtifactView.js +56 -0
- package/dist/raw/eval/models/EvalPageDatasetRecordArtifactView.d.ts +44 -0
- package/dist/raw/eval/models/EvalPageDatasetRecordArtifactView.js +56 -0
- package/dist/raw/eval/models/EvalPageExperimentArtifactView.d.ts +44 -0
- package/dist/raw/eval/models/EvalPageExperimentArtifactView.js +56 -0
- package/dist/raw/eval/models/EvalPageExperimentResultArtifactView.d.ts +44 -0
- package/dist/raw/eval/models/EvalPageExperimentResultArtifactView.js +56 -0
- package/dist/raw/eval/models/EvalPageScorerArtifactView.d.ts +44 -0
- package/dist/raw/eval/models/EvalPageScorerArtifactView.js +56 -0
- package/dist/raw/eval/models/EvalPatchDataset412Response.d.ts +63 -0
- package/dist/raw/eval/models/EvalPatchDataset412Response.js +75 -0
- package/dist/raw/eval/models/EvalRecordSource.d.ts +27 -0
- package/dist/raw/eval/models/EvalRecordSource.js +55 -0
- package/dist/raw/eval/models/EvalScorerArtifactView.d.ts +301 -0
- package/dist/raw/eval/models/EvalScorerArtifactView.js +154 -0
- package/dist/raw/eval/models/EvalScorerCreate.d.ts +172 -0
- package/dist/raw/eval/models/EvalScorerCreate.js +98 -0
- package/dist/raw/eval/models/EvalScorerKind.d.ts +32 -0
- package/dist/raw/eval/models/EvalScorerKind.js +60 -0
- package/dist/raw/eval/models/EvalScorerMeta.d.ts +67 -0
- package/dist/raw/eval/models/EvalScorerMeta.js +60 -0
- package/dist/raw/eval/models/EvalScorerPatch.d.ts +75 -0
- package/dist/raw/eval/models/EvalScorerPatch.js +56 -0
- package/dist/raw/eval/models/EvalScorerScope.d.ts +32 -0
- package/dist/raw/eval/models/EvalScorerScope.js +60 -0
- package/dist/raw/eval/models/EvalSubjectKind.d.ts +33 -0
- package/dist/raw/eval/models/EvalSubjectKind.js +61 -0
- package/dist/raw/eval/models/GatewayArtifactBase.d.ts +250 -0
- package/dist/raw/eval/models/GatewayArtifactBase.js +139 -0
- package/dist/raw/eval/models/GatewayArtifactIdentityRevealView.d.ts +60 -0
- package/dist/raw/eval/models/GatewayArtifactIdentityRevealView.js +58 -0
- package/dist/raw/eval/models/GatewayPageMeta.d.ts +46 -0
- package/dist/raw/eval/models/GatewayPageMeta.js +58 -0
- package/dist/raw/eval/models/GatewaySourceEnvelope.d.ts +106 -0
- package/dist/raw/eval/models/GatewaySourceEnvelope.js +66 -0
- package/dist/raw/eval/models/GatewayTraceStatsBucket.d.ts +25 -0
- package/dist/raw/eval/models/GatewayTraceStatsBucket.js +53 -0
- package/dist/raw/eval/models/GatewayTraceStatsCompareMode.d.ts +25 -0
- package/dist/raw/eval/models/GatewayTraceStatsCompareMode.js +53 -0
- package/dist/raw/eval/models/GatewayTraceStatsComparison.d.ts +45 -0
- package/dist/raw/eval/models/GatewayTraceStatsComparison.js +59 -0
- package/dist/raw/eval/models/GatewayTraceStatsData.d.ts +24 -0
- package/dist/raw/eval/models/GatewayTraceStatsData.js +64 -0
- package/dist/raw/eval/models/GatewayTraceStatsDataOneOf.d.ts +46 -0
- package/dist/raw/eval/models/GatewayTraceStatsDataOneOf.js +66 -0
- package/dist/raw/eval/models/GatewayTraceStatsDataOneOf1.d.ts +53 -0
- package/dist/raw/eval/models/GatewayTraceStatsDataOneOf1.js +71 -0
- package/dist/raw/eval/models/GatewayTraceStatsDataOneOf2.d.ts +46 -0
- package/dist/raw/eval/models/GatewayTraceStatsDataOneOf2.js +66 -0
- package/dist/raw/eval/models/GatewayTraceStatsEnvelope.d.ts +50 -0
- package/dist/raw/eval/models/GatewayTraceStatsEnvelope.js +59 -0
- package/dist/raw/eval/models/GatewayTraceStatsFilter.d.ts +47 -0
- package/dist/raw/eval/models/GatewayTraceStatsFilter.js +59 -0
- package/dist/raw/eval/models/GatewayTraceStatsFilterOperator.d.ts +28 -0
- package/dist/raw/eval/models/GatewayTraceStatsFilterOperator.js +56 -0
- package/dist/raw/eval/models/GatewayTraceStatsFilterValue.d.ts +21 -0
- package/dist/raw/eval/models/GatewayTraceStatsFilterValue.js +85 -0
- package/dist/raw/eval/models/GatewayTraceStatsGroupBy.d.ts +35 -0
- package/dist/raw/eval/models/GatewayTraceStatsGroupBy.js +63 -0
- package/dist/raw/eval/models/GatewayTraceStatsMeasure.d.ts +39 -0
- package/dist/raw/eval/models/GatewayTraceStatsMeasure.js +67 -0
- package/dist/raw/eval/models/GatewayTraceStatsMeta.d.ts +49 -0
- package/dist/raw/eval/models/GatewayTraceStatsMeta.js +53 -0
- package/dist/raw/eval/models/GatewayTraceStatsOrder.d.ts +40 -0
- package/dist/raw/eval/models/GatewayTraceStatsOrder.js +56 -0
- package/dist/raw/eval/models/GatewayTraceStatsOrderBy.d.ts +25 -0
- package/dist/raw/eval/models/GatewayTraceStatsOrderBy.js +53 -0
- package/dist/raw/eval/models/GatewayTraceStatsOrderDirection.d.ts +25 -0
- package/dist/raw/eval/models/GatewayTraceStatsOrderDirection.js +53 -0
- package/dist/raw/eval/models/GatewayTraceStatsPanelQuery.d.ts +69 -0
- package/dist/raw/eval/models/GatewayTraceStatsPanelQuery.js +66 -0
- package/dist/raw/eval/models/GatewayTraceStatsRequest.d.ts +80 -0
- package/dist/raw/eval/models/GatewayTraceStatsRequest.js +72 -0
- package/dist/raw/eval/models/GatewayTraceStatsRequestType.d.ts +26 -0
- package/dist/raw/eval/models/GatewayTraceStatsRequestType.js +54 -0
- package/dist/raw/eval/models/GatewayTraceStatsScalarResult.d.ts +52 -0
- package/dist/raw/eval/models/GatewayTraceStatsScalarResult.js +59 -0
- package/dist/raw/eval/models/GatewayTraceStatsSeries.d.ts +52 -0
- package/dist/raw/eval/models/GatewayTraceStatsSeries.js +62 -0
- package/dist/raw/eval/models/GatewayTraceStatsSeriesPoint.d.ts +38 -0
- package/dist/raw/eval/models/GatewayTraceStatsSeriesPoint.js +52 -0
- package/dist/raw/eval/models/GatewayTraceStatsTableColumn.d.ts +45 -0
- package/dist/raw/eval/models/GatewayTraceStatsTableColumn.js +57 -0
- package/dist/raw/eval/models/GatewayTraceStatsTableColumnType.d.ts +25 -0
- package/dist/raw/eval/models/GatewayTraceStatsTableColumnType.js +53 -0
- package/dist/raw/eval/models/GatewayTraceStatsTableRow.d.ts +38 -0
- package/dist/raw/eval/models/GatewayTraceStatsTableRow.js +54 -0
- package/dist/raw/eval/models/GatewayTraceStatsWindow.d.ts +38 -0
- package/dist/raw/eval/models/GatewayTraceStatsWindow.js +54 -0
- package/dist/raw/eval/models/ProblemDetails.d.ts +76 -0
- package/dist/raw/eval/models/ProblemDetails.js +64 -0
- package/dist/raw/eval/models/RegistryEdgeTarget.d.ts +38 -0
- package/dist/raw/eval/models/RegistryEdgeTarget.js +54 -0
- package/dist/raw/eval/models/RegistryRelationshipEdge.d.ts +96 -0
- package/dist/raw/eval/models/RegistryRelationshipEdge.js +77 -0
- package/dist/raw/eval/models/RegistryRelationshipsView.d.ts +45 -0
- package/dist/raw/eval/models/RegistryRelationshipsView.js +59 -0
- package/dist/raw/eval/models/SpanListEnvelope.d.ts +40 -0
- package/dist/raw/eval/models/SpanListEnvelope.js +56 -0
- package/dist/raw/eval/models/SpanViewDto.d.ts +192 -0
- package/dist/raw/eval/models/SpanViewDto.js +117 -0
- package/dist/raw/eval/models/TraceDetailView.d.ts +177 -0
- package/dist/raw/eval/models/TraceDetailView.js +108 -0
- package/dist/raw/eval/models/TraceLinks.d.ts +45 -0
- package/dist/raw/eval/models/TraceLinks.js +58 -0
- package/dist/raw/eval/models/TraceListEnvelope.d.ts +47 -0
- package/dist/raw/eval/models/TraceListEnvelope.js +61 -0
- package/dist/raw/eval/models/TraceParentView.d.ts +68 -0
- package/dist/raw/eval/models/TraceParentView.js +64 -0
- package/dist/raw/eval/models/TraceStatus.d.ts +26 -0
- package/dist/raw/eval/models/TraceStatus.js +54 -0
- package/dist/raw/eval/models/TraceSummaryStats.d.ts +62 -0
- package/dist/raw/eval/models/TraceSummaryStats.js +62 -0
- package/dist/raw/eval/models/TraceSummaryView.d.ts +150 -0
- package/dist/raw/eval/models/TraceSummaryView.js +96 -0
- package/dist/raw/eval/models/UsageView.d.ts +56 -0
- package/dist/raw/eval/models/UsageView.js +66 -0
- package/dist/raw/eval/models/index.d.ts +100 -0
- package/dist/raw/eval/models/index.js +118 -0
- package/dist/raw/eval/runtime.d.ts +185 -0
- package/dist/raw/eval/runtime.js +369 -0
- package/dist/resources.json +307 -0
- package/dist/tracing/client.js +6 -4
- package/dist/tracing/propagation.d.ts +1 -0
- package/dist/tracing/propagation.js +7 -0
- package/dist/tracing/semconv.d.ts +8 -1
- package/dist/tracing/semconv.js +27 -13
- package/dist/tracing/spans.d.ts +8 -4
- package/dist/tracing/spans.js +28 -13
- package/dist/tracing/version.d.ts +1 -1
- package/dist/tracing/version.js +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,45 +1,113 @@
|
|
|
1
1
|
# @atlanai/sdk
|
|
2
2
|
|
|
3
|
-
TypeScript
|
|
4
|
-
|
|
5
|
-
below `client.raw` and package subpaths under `@atlanai/sdk/raw/*`.
|
|
3
|
+
TypeScript/JavaScript SDK for the Atlan Agent Gateway: manage agents, skills,
|
|
4
|
+
sessions, and workspaces, and optionally trace what your agents do.
|
|
6
5
|
|
|
7
|
-
|
|
8
|
-
package. It will not be generated from the management OpenAPI contract.
|
|
6
|
+
## Install
|
|
9
7
|
|
|
10
|
-
|
|
8
|
+
```bash
|
|
9
|
+
npm install @atlanai/sdk
|
|
10
|
+
```
|
|
11
11
|
|
|
12
|
-
|
|
12
|
+
## Quickstart
|
|
13
13
|
|
|
14
|
-
```
|
|
15
|
-
|
|
16
|
-
|
|
14
|
+
```typescript
|
|
15
|
+
import { AtlanClient } from "@atlanai/sdk";
|
|
16
|
+
|
|
17
|
+
const client = new AtlanClient({
|
|
18
|
+
gatewayOrigin: "https://<your-gateway-host>",
|
|
19
|
+
bearerToken: "<your-api-token>",
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
const agent = await client.agents.create({
|
|
23
|
+
name: "support-triage",
|
|
24
|
+
workspaceId: "workspace_01example",
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
const page = await client.agents.list({ limit: 10 });
|
|
28
|
+
console.log(`${page.items.length} agents`);
|
|
17
29
|
```
|
|
18
30
|
|
|
19
|
-
|
|
31
|
+
Methods read as `client.<resource>.<action>` — `client.agents.get(agentId)`,
|
|
32
|
+
`client.sessions.messages.create(sessionId, {...})`, and so on. Every public
|
|
33
|
+
Agent Gateway operation is reachable this way; nothing requires reaching into
|
|
34
|
+
a generated client directly.
|
|
20
35
|
|
|
21
|
-
|
|
22
|
-
|
|
36
|
+
Pass a default workspace once instead of repeating it on every call:
|
|
37
|
+
|
|
38
|
+
```typescript
|
|
39
|
+
const client = new AtlanClient({ gatewayOrigin, bearerToken, workspace: "workspace_01example" });
|
|
23
40
|
```
|
|
24
41
|
|
|
25
|
-
|
|
42
|
+
## Start an eval run
|
|
43
|
+
|
|
44
|
+
Resolve an existing dataset by artifact ID or exact name, then create the
|
|
45
|
+
Registry experiment before the runner emits any traces:
|
|
26
46
|
|
|
27
47
|
```typescript
|
|
28
|
-
import {
|
|
48
|
+
import { createContextManifest, startExperiment } from "@atlanai/sdk";
|
|
49
|
+
import { propagateAttributes } from "@atlanai/sdk/tracing";
|
|
29
50
|
|
|
30
|
-
|
|
51
|
+
const contextManifest = await createContextManifest([{
|
|
52
|
+
kind: "file",
|
|
53
|
+
name: "CLAUDE.md",
|
|
54
|
+
version: "git:0123456789abcdef0123456789abcdef01234567",
|
|
55
|
+
digest: `sha256:${"0".repeat(64)}`,
|
|
56
|
+
}]);
|
|
31
57
|
|
|
32
|
-
const
|
|
33
|
-
|
|
34
|
-
|
|
58
|
+
const run = await startExperiment(
|
|
59
|
+
client,
|
|
60
|
+
"conversational-studio-daily", // exact name, or dataset_... ID
|
|
61
|
+
{ name: "candidate-run", config: { model: "example-model" } },
|
|
62
|
+
{ contextManifest },
|
|
63
|
+
);
|
|
64
|
+
|
|
65
|
+
await propagateAttributes(run.traceOptions, () => existingRunner());
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
`run.experiment` is the generated create response and `run.id` is its
|
|
69
|
+
`experimentId`. The helper pins the resolved dataset version and context
|
|
70
|
+
manifest in the immutable experiment config. Execution, result upload,
|
|
71
|
+
summarization, and terminal status remain the existing `client.experiments`
|
|
72
|
+
operations.
|
|
73
|
+
|
|
74
|
+
## Tracing
|
|
75
|
+
|
|
76
|
+
```typescript
|
|
77
|
+
import * as atlan from "@atlanai/sdk/tracing";
|
|
78
|
+
|
|
79
|
+
const tracer = atlan.init({ apiKey: "<your-tracing-key>", workspaceId: "workspace_01example" });
|
|
80
|
+
|
|
81
|
+
await tracer.startAsCurrentSpan("handle-request", { asType: "task" }, async (span) => {
|
|
82
|
+
span.update({ model: "claude-sonnet-5", usage: { inputTokens: 120, outputTokens: 40 } });
|
|
35
83
|
});
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
Tracing has its own API key and lifecycle — it does not reuse the management
|
|
87
|
+
client's bearer token or transport. It ships as a separate subpath
|
|
88
|
+
(`@atlanai/sdk/tracing`) so importing it doesn't pull OpenTelemetry into a
|
|
89
|
+
management-only bundle.
|
|
90
|
+
|
|
91
|
+
## Errors
|
|
92
|
+
|
|
93
|
+
Every non-2xx response rejects with `AtlanAPIError`, with `.status`, `.code`,
|
|
94
|
+
and (where the gateway includes one) `.traceId`:
|
|
36
95
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
96
|
+
```typescript
|
|
97
|
+
import { AtlanAPIError } from "@atlanai/sdk";
|
|
98
|
+
|
|
99
|
+
try {
|
|
100
|
+
await client.agents.get("agent_does_not_exist");
|
|
101
|
+
} catch (error) {
|
|
102
|
+
if (error instanceof AtlanAPIError) {
|
|
103
|
+
console.log(error.status, error.code);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
40
106
|
```
|
|
41
107
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
108
|
+
## Runtimes
|
|
109
|
+
|
|
110
|
+
Node ≥20. The tracing subpath is written to also run in non-Node runtimes
|
|
111
|
+
like Cloudflare Workers — pass configuration to `init()` explicitly there
|
|
112
|
+
rather than relying on environment variables, since Workers has no ambient
|
|
113
|
+
environment.
|
package/dist/client.js
CHANGED
|
@@ -37,6 +37,7 @@ exports.AtlanClient = exports.ServiceNamespace = exports.WORKSPACE_HEADER = void
|
|
|
37
37
|
exports.createService = createService;
|
|
38
38
|
const agentRaw = __importStar(require("./raw/agent/index"));
|
|
39
39
|
const apiRaw = __importStar(require("./raw/api/index"));
|
|
40
|
+
const evalRaw = __importStar(require("./raw/eval/index"));
|
|
40
41
|
const fileRaw = __importStar(require("./raw/file/index"));
|
|
41
42
|
const mcpRaw = __importStar(require("./raw/mcp/index"));
|
|
42
43
|
const modelRaw = __importStar(require("./raw/model/index"));
|
|
@@ -111,7 +112,7 @@ function forwardOperations(namespace, operationMethods) {
|
|
|
111
112
|
// operation reads in the contract and how a caller would guess it —
|
|
112
113
|
// `client.agents.createAgent(...)`. Both spellings resolve, because the long
|
|
113
114
|
// one is what every existing caller and published example uses, and across
|
|
114
|
-
// all
|
|
115
|
+
// all 221 operations no short name collides with another, with an OpenAPI
|
|
115
116
|
// tag, or with a property of the namespace.
|
|
116
117
|
const prefixed = (property) => namespace.name + property.charAt(0).toUpperCase() + property.slice(1);
|
|
117
118
|
return new Proxy(namespace, {
|
|
@@ -187,6 +188,7 @@ class AtlanClient {
|
|
|
187
188
|
model: modelRaw,
|
|
188
189
|
api: apiRaw,
|
|
189
190
|
otel: otelRaw,
|
|
191
|
+
eval: evalRaw,
|
|
190
192
|
};
|
|
191
193
|
const namespaces = {};
|
|
192
194
|
for (const service of operations_1.operationManifest.services) {
|
package/dist/evals.d.ts
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/** Small lifecycle helpers for evaluation runners. */
|
|
2
|
+
import { AtlanClient } from "./client";
|
|
3
|
+
export declare const CONTEXT_MANIFEST_SCHEMA = "atlan.eval.context-manifest/v1";
|
|
4
|
+
export interface ContextItem {
|
|
5
|
+
kind: string;
|
|
6
|
+
name: string;
|
|
7
|
+
digest: string;
|
|
8
|
+
version: string;
|
|
9
|
+
artifactId?: string;
|
|
10
|
+
versionOrdinal?: number;
|
|
11
|
+
}
|
|
12
|
+
export interface ContextManifestItem {
|
|
13
|
+
kind: string;
|
|
14
|
+
name: string;
|
|
15
|
+
digest: string;
|
|
16
|
+
version: string;
|
|
17
|
+
artifact_id?: string;
|
|
18
|
+
version_ordinal?: number;
|
|
19
|
+
}
|
|
20
|
+
export interface ContextManifest {
|
|
21
|
+
schema_version: typeof CONTEXT_MANIFEST_SCHEMA;
|
|
22
|
+
items: readonly ContextManifestItem[];
|
|
23
|
+
digest: string;
|
|
24
|
+
}
|
|
25
|
+
/** Build the same canonical, order-independent context manifest as the Python SDK. */
|
|
26
|
+
export declare function createContextManifest(input: readonly ContextItem[]): Promise<ContextManifest>;
|
|
27
|
+
/** Resolve one dataset by artifact ID or exact name, never fuzzy matching. */
|
|
28
|
+
export declare function resolveDataset(client: AtlanClient, idOrExactName: string, workspaceId?: string): Promise<unknown>;
|
|
29
|
+
export interface StartExperimentOptions {
|
|
30
|
+
contextManifest?: ContextManifest;
|
|
31
|
+
}
|
|
32
|
+
export declare class EvalRun {
|
|
33
|
+
readonly experiment: unknown;
|
|
34
|
+
readonly dataset: unknown;
|
|
35
|
+
readonly contextManifest?: ContextManifest | undefined;
|
|
36
|
+
constructor(experiment: unknown, dataset: unknown, contextManifest?: ContextManifest | undefined);
|
|
37
|
+
get id(): string;
|
|
38
|
+
get experimentId(): string;
|
|
39
|
+
/** Options for `propagateAttributes` from `@atlanai/sdk/tracing`. */
|
|
40
|
+
get traceOptions(): {
|
|
41
|
+
experimentId: string;
|
|
42
|
+
metadata?: Record<string, unknown>;
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
/** Create a running experiment over a dataset ID or exact dataset name. */
|
|
46
|
+
export declare function startExperiment(client: AtlanClient, dataset: string, body: Readonly<Record<string, unknown>>, options?: StartExperimentOptions): Promise<EvalRun>;
|
package/dist/evals.js
ADDED
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/** Small lifecycle helpers for evaluation runners. */
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.EvalRun = exports.CONTEXT_MANIFEST_SCHEMA = void 0;
|
|
5
|
+
exports.createContextManifest = createContextManifest;
|
|
6
|
+
exports.resolveDataset = resolveDataset;
|
|
7
|
+
exports.startExperiment = startExperiment;
|
|
8
|
+
exports.CONTEXT_MANIFEST_SCHEMA = "atlan.eval.context-manifest/v1";
|
|
9
|
+
const SHA256 = /^sha256:[0-9a-f]{64}$/;
|
|
10
|
+
const CONTEXT_KIND = /^[a-z][a-z0-9_.-]{0,63}$/;
|
|
11
|
+
const MAX_LIST_OFFSET = 10_000;
|
|
12
|
+
function asResources(client) {
|
|
13
|
+
return client;
|
|
14
|
+
}
|
|
15
|
+
function isRecord(value) {
|
|
16
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
17
|
+
}
|
|
18
|
+
function field(value, name) {
|
|
19
|
+
return isRecord(value) ? value[name] : undefined;
|
|
20
|
+
}
|
|
21
|
+
function canonicalJson(value) {
|
|
22
|
+
const normalize = (item) => {
|
|
23
|
+
if (item === null || typeof item === "string" || typeof item === "boolean")
|
|
24
|
+
return item;
|
|
25
|
+
if (typeof item === "number") {
|
|
26
|
+
if (!Number.isFinite(item))
|
|
27
|
+
throw new Error("context manifest is not canonical JSON");
|
|
28
|
+
return item;
|
|
29
|
+
}
|
|
30
|
+
if (Array.isArray(item))
|
|
31
|
+
return item.map(normalize);
|
|
32
|
+
if (isRecord(item)) {
|
|
33
|
+
return Object.fromEntries(Object.keys(item)
|
|
34
|
+
.sort()
|
|
35
|
+
.map((key) => [key, normalize(item[key])]));
|
|
36
|
+
}
|
|
37
|
+
throw new Error("context manifest is not canonical JSON");
|
|
38
|
+
};
|
|
39
|
+
return JSON.stringify(normalize(value));
|
|
40
|
+
}
|
|
41
|
+
function validText(value, name, maximum) {
|
|
42
|
+
if (typeof value !== "string" ||
|
|
43
|
+
value.length === 0 ||
|
|
44
|
+
value.length > maximum ||
|
|
45
|
+
/[\r\n]/.test(value)) {
|
|
46
|
+
throw new Error(`${name} must be 1-${maximum} characters with no newlines`);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
function manifestItem(item) {
|
|
50
|
+
if (!CONTEXT_KIND.test(item.kind)) {
|
|
51
|
+
throw new Error("context item kind must be a lowercase identifier");
|
|
52
|
+
}
|
|
53
|
+
validText(item.name, "context item name", 500);
|
|
54
|
+
if (!SHA256.test(item.digest)) {
|
|
55
|
+
throw new Error("context item digest must be sha256:<64 lowercase hex>");
|
|
56
|
+
}
|
|
57
|
+
validText(item.version, "context item version", 200);
|
|
58
|
+
if (item.version.toLowerCase() === "latest") {
|
|
59
|
+
throw new Error("context item version must be pinned; 'latest' is not a version");
|
|
60
|
+
}
|
|
61
|
+
if (item.artifactId !== undefined) {
|
|
62
|
+
validText(item.artifactId, "context item artifactId", 200);
|
|
63
|
+
}
|
|
64
|
+
if (item.versionOrdinal !== undefined &&
|
|
65
|
+
(!Number.isInteger(item.versionOrdinal) || item.versionOrdinal < 1)) {
|
|
66
|
+
throw new Error("context item versionOrdinal must be an integer of at least 1");
|
|
67
|
+
}
|
|
68
|
+
return {
|
|
69
|
+
kind: item.kind,
|
|
70
|
+
name: item.name,
|
|
71
|
+
digest: item.digest,
|
|
72
|
+
version: item.version,
|
|
73
|
+
...(item.artifactId === undefined ? {} : { artifact_id: item.artifactId }),
|
|
74
|
+
...(item.versionOrdinal === undefined ? {} : { version_ordinal: item.versionOrdinal }),
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
/** Build the same canonical, order-independent context manifest as the Python SDK. */
|
|
78
|
+
async function createContextManifest(input) {
|
|
79
|
+
const items = input.map((item) => Object.freeze(manifestItem(item))).sort((left, right) => {
|
|
80
|
+
const leftJson = canonicalJson(left);
|
|
81
|
+
const rightJson = canonicalJson(right);
|
|
82
|
+
return leftJson < rightJson ? -1 : leftJson > rightJson ? 1 : 0;
|
|
83
|
+
});
|
|
84
|
+
const identities = new Set(items.map((item) => `${item.kind}\u0000${item.name}`));
|
|
85
|
+
if (identities.size !== items.length) {
|
|
86
|
+
throw new Error("context manifest has duplicate kind/name entries");
|
|
87
|
+
}
|
|
88
|
+
const body = { schema_version: exports.CONTEXT_MANIFEST_SCHEMA, items };
|
|
89
|
+
if (!globalThis.crypto?.subtle) {
|
|
90
|
+
throw new Error("Web Crypto is required to create a context manifest");
|
|
91
|
+
}
|
|
92
|
+
const hash = await globalThis.crypto.subtle.digest("SHA-256", new TextEncoder().encode(canonicalJson(body)));
|
|
93
|
+
const digest = "sha256:" + [...new Uint8Array(hash)].map((byte) => byte.toString(16).padStart(2, "0")).join("");
|
|
94
|
+
return Object.freeze({ ...body, items: Object.freeze(items), digest });
|
|
95
|
+
}
|
|
96
|
+
/** Resolve one dataset by artifact ID or exact name, never fuzzy matching. */
|
|
97
|
+
async function resolveDataset(client, idOrExactName, workspaceId) {
|
|
98
|
+
if (!idOrExactName || idOrExactName.trim() !== idOrExactName) {
|
|
99
|
+
throw new Error("dataset must be a non-empty ID or exact name with no outer whitespace");
|
|
100
|
+
}
|
|
101
|
+
const resources = asResources(client);
|
|
102
|
+
const workspace = workspaceId ?? resources.workspace;
|
|
103
|
+
if (idOrExactName.startsWith("dataset_")) {
|
|
104
|
+
const dataset = await resources.datasets.get(idOrExactName);
|
|
105
|
+
if (workspace !== undefined && field(dataset, "workspaceId") !== workspace) {
|
|
106
|
+
throw new Error("dataset ID resolved outside the requested workspace");
|
|
107
|
+
}
|
|
108
|
+
return dataset;
|
|
109
|
+
}
|
|
110
|
+
const matches = [];
|
|
111
|
+
let offset = 0;
|
|
112
|
+
while (true) {
|
|
113
|
+
const page = await resources.datasets.list({ limit: 500, offset });
|
|
114
|
+
const rawItems = field(page, "items");
|
|
115
|
+
const items = Array.isArray(rawItems) ? rawItems : [];
|
|
116
|
+
matches.push(...items.filter((item) => field(item, "name") === idOrExactName &&
|
|
117
|
+
(workspace === undefined || field(item, "workspaceId") === workspace)));
|
|
118
|
+
if (matches.length > 1)
|
|
119
|
+
break;
|
|
120
|
+
offset += items.length;
|
|
121
|
+
const total = field(field(page, "page"), "total");
|
|
122
|
+
if (items.length === 0 || (typeof total === "number" && offset >= total))
|
|
123
|
+
break;
|
|
124
|
+
if (offset > MAX_LIST_OFFSET) {
|
|
125
|
+
throw new Error("dataset name resolution exceeded the list limit; pass the dataset ID");
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
if (matches.length === 0) {
|
|
129
|
+
const scope = workspace === undefined ? "" : ` in workspace '${workspace}'`;
|
|
130
|
+
throw new Error(`no dataset named '${idOrExactName}'${scope}`);
|
|
131
|
+
}
|
|
132
|
+
if (matches.length > 1) {
|
|
133
|
+
throw new Error(`multiple datasets are named '${idOrExactName}'; pass the dataset ID`);
|
|
134
|
+
}
|
|
135
|
+
return matches[0];
|
|
136
|
+
}
|
|
137
|
+
class EvalRun {
|
|
138
|
+
experiment;
|
|
139
|
+
dataset;
|
|
140
|
+
contextManifest;
|
|
141
|
+
constructor(experiment, dataset, contextManifest) {
|
|
142
|
+
this.experiment = experiment;
|
|
143
|
+
this.dataset = dataset;
|
|
144
|
+
this.contextManifest = contextManifest;
|
|
145
|
+
}
|
|
146
|
+
get id() {
|
|
147
|
+
const id = field(this.experiment, "id");
|
|
148
|
+
if (typeof id !== "string" || id.length === 0) {
|
|
149
|
+
throw new Error("experiment create response did not contain an ID");
|
|
150
|
+
}
|
|
151
|
+
return id;
|
|
152
|
+
}
|
|
153
|
+
get experimentId() {
|
|
154
|
+
return this.id;
|
|
155
|
+
}
|
|
156
|
+
/** Options for `propagateAttributes` from `@atlanai/sdk/tracing`. */
|
|
157
|
+
get traceOptions() {
|
|
158
|
+
return {
|
|
159
|
+
experimentId: this.id,
|
|
160
|
+
...(this.contextManifest === undefined
|
|
161
|
+
? {}
|
|
162
|
+
: { metadata: { context_manifest_digest: this.contextManifest.digest } }),
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
exports.EvalRun = EvalRun;
|
|
167
|
+
/** Create a running experiment over a dataset ID or exact dataset name. */
|
|
168
|
+
async function startExperiment(client, dataset, body, options = {}) {
|
|
169
|
+
const resources = asResources(client);
|
|
170
|
+
const payload = { ...body };
|
|
171
|
+
const workspaceId = payload.workspaceId ?? resources.workspace;
|
|
172
|
+
if (typeof workspaceId !== "string" || workspaceId.length === 0) {
|
|
173
|
+
throw new Error("workspaceId is required in the body or on the client");
|
|
174
|
+
}
|
|
175
|
+
if (resources.workspace !== undefined &&
|
|
176
|
+
payload.workspaceId !== undefined &&
|
|
177
|
+
payload.workspaceId !== resources.workspace) {
|
|
178
|
+
throw new Error("body workspaceId differs from the client's workspace");
|
|
179
|
+
}
|
|
180
|
+
payload.workspaceId = workspaceId;
|
|
181
|
+
const resolved = await resolveDataset(client, dataset, workspaceId);
|
|
182
|
+
const resolvedId = field(resolved, "id");
|
|
183
|
+
if (typeof resolvedId !== "string" || resolvedId.length === 0) {
|
|
184
|
+
throw new Error("dataset response did not contain an ID");
|
|
185
|
+
}
|
|
186
|
+
if (payload.datasetId !== undefined && payload.datasetId !== resolvedId) {
|
|
187
|
+
throw new Error("body datasetId differs from the resolved dataset");
|
|
188
|
+
}
|
|
189
|
+
payload.datasetId = resolvedId;
|
|
190
|
+
if (payload.experimentStatus !== undefined && payload.experimentStatus !== "running") {
|
|
191
|
+
throw new Error("startExperiment only creates running experiments");
|
|
192
|
+
}
|
|
193
|
+
payload.experimentStatus = "running";
|
|
194
|
+
const rawConfig = payload.config ?? {};
|
|
195
|
+
if (!isRecord(rawConfig))
|
|
196
|
+
throw new Error("experiment config must be an object");
|
|
197
|
+
const config = { ...rawConfig };
|
|
198
|
+
const datasetPin = Object.fromEntries(Object.entries({
|
|
199
|
+
id: resolvedId,
|
|
200
|
+
version_ordinal: field(resolved, "versionOrdinal"),
|
|
201
|
+
content_hash_hex: field(resolved, "contentHashHex"),
|
|
202
|
+
}).filter(([, value]) => value !== undefined && value !== null));
|
|
203
|
+
if (config.registry_dataset !== undefined &&
|
|
204
|
+
canonicalJson(config.registry_dataset) !== canonicalJson(datasetPin)) {
|
|
205
|
+
throw new Error("config registry_dataset differs from the resolved dataset version");
|
|
206
|
+
}
|
|
207
|
+
config.registry_dataset = datasetPin;
|
|
208
|
+
const contextManifest = options.contextManifest;
|
|
209
|
+
if (contextManifest !== undefined) {
|
|
210
|
+
if (config.context_manifest !== undefined &&
|
|
211
|
+
canonicalJson(config.context_manifest) !== canonicalJson(contextManifest)) {
|
|
212
|
+
throw new Error("config context_manifest differs from the supplied manifest");
|
|
213
|
+
}
|
|
214
|
+
if (config.context_manifest_digest !== undefined &&
|
|
215
|
+
config.context_manifest_digest !== contextManifest.digest) {
|
|
216
|
+
throw new Error("config context_manifest_digest differs from the supplied manifest");
|
|
217
|
+
}
|
|
218
|
+
config.context_manifest = contextManifest;
|
|
219
|
+
config.context_manifest_digest = contextManifest.digest;
|
|
220
|
+
}
|
|
221
|
+
payload.config = config;
|
|
222
|
+
const experiment = await resources.experiments.create(payload);
|
|
223
|
+
const run = new EvalRun(experiment, resolved, contextManifest);
|
|
224
|
+
void run.id;
|
|
225
|
+
const responseDatasetId = field(experiment, "datasetId");
|
|
226
|
+
if (responseDatasetId !== undefined && responseDatasetId !== resolvedId) {
|
|
227
|
+
throw new Error("experiment create response contains a different dataset ID");
|
|
228
|
+
}
|
|
229
|
+
return run;
|
|
230
|
+
}
|
package/dist/index.d.ts
CHANGED
|
@@ -5,8 +5,11 @@ export type { Resource, ResourceOperation } from "./resources";
|
|
|
5
5
|
export { AtlanAPIError } from "./errors";
|
|
6
6
|
export { operationManifest, operations } from "./operations";
|
|
7
7
|
export type { Operation, OperationManifest, ServiceContract } from "./operations";
|
|
8
|
+
export { CONTEXT_MANIFEST_SCHEMA, EvalRun, createContextManifest, resolveDataset, startExperiment, } from "./evals";
|
|
9
|
+
export type { ContextItem, ContextManifest, ContextManifestItem, StartExperimentOptions, } from "./evals";
|
|
8
10
|
export * as rawAgent from "./raw/agent/index";
|
|
9
11
|
export * as rawAPI from "./raw/api/index";
|
|
12
|
+
export * as rawEval from "./raw/eval/index";
|
|
10
13
|
export * as rawFile from "./raw/file/index";
|
|
11
14
|
export * as rawMCP from "./raw/mcp/index";
|
|
12
15
|
export * as rawModel from "./raw/model/index";
|
package/dist/index.js
CHANGED
|
@@ -33,7 +33,7 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
33
33
|
};
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
-
exports.rawSkill = exports.rawSecret = exports.rawRegistry = exports.rawOTel = exports.rawModel = exports.rawMCP = exports.rawFile = exports.rawAPI = exports.rawAgent = exports.operations = exports.operationManifest = exports.AtlanAPIError = exports.resourceMap = exports.buildResources = exports.createService = exports.ServiceNamespace = exports.AtlanClient = void 0;
|
|
36
|
+
exports.rawSkill = exports.rawSecret = exports.rawRegistry = exports.rawOTel = exports.rawModel = exports.rawMCP = exports.rawFile = exports.rawEval = exports.rawAPI = exports.rawAgent = exports.startExperiment = exports.resolveDataset = exports.createContextManifest = exports.EvalRun = exports.CONTEXT_MANIFEST_SCHEMA = exports.operations = exports.operationManifest = exports.AtlanAPIError = exports.resourceMap = exports.buildResources = exports.createService = exports.ServiceNamespace = exports.AtlanClient = void 0;
|
|
37
37
|
var client_1 = require("./client");
|
|
38
38
|
Object.defineProperty(exports, "AtlanClient", { enumerable: true, get: function () { return client_1.AtlanClient; } });
|
|
39
39
|
Object.defineProperty(exports, "ServiceNamespace", { enumerable: true, get: function () { return client_1.ServiceNamespace; } });
|
|
@@ -46,8 +46,15 @@ Object.defineProperty(exports, "AtlanAPIError", { enumerable: true, get: functio
|
|
|
46
46
|
var operations_1 = require("./operations");
|
|
47
47
|
Object.defineProperty(exports, "operationManifest", { enumerable: true, get: function () { return operations_1.operationManifest; } });
|
|
48
48
|
Object.defineProperty(exports, "operations", { enumerable: true, get: function () { return operations_1.operations; } });
|
|
49
|
+
var evals_1 = require("./evals");
|
|
50
|
+
Object.defineProperty(exports, "CONTEXT_MANIFEST_SCHEMA", { enumerable: true, get: function () { return evals_1.CONTEXT_MANIFEST_SCHEMA; } });
|
|
51
|
+
Object.defineProperty(exports, "EvalRun", { enumerable: true, get: function () { return evals_1.EvalRun; } });
|
|
52
|
+
Object.defineProperty(exports, "createContextManifest", { enumerable: true, get: function () { return evals_1.createContextManifest; } });
|
|
53
|
+
Object.defineProperty(exports, "resolveDataset", { enumerable: true, get: function () { return evals_1.resolveDataset; } });
|
|
54
|
+
Object.defineProperty(exports, "startExperiment", { enumerable: true, get: function () { return evals_1.startExperiment; } });
|
|
49
55
|
exports.rawAgent = __importStar(require("./raw/agent/index"));
|
|
50
56
|
exports.rawAPI = __importStar(require("./raw/api/index"));
|
|
57
|
+
exports.rawEval = __importStar(require("./raw/eval/index"));
|
|
51
58
|
exports.rawFile = __importStar(require("./raw/file/index"));
|
|
52
59
|
exports.rawMCP = __importStar(require("./raw/mcp/index"));
|
|
53
60
|
exports.rawModel = __importStar(require("./raw/model/index"));
|