@thinkai/tai-api-contract 2.174.0 → 2.176.0

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.
@@ -4806,6 +4806,46 @@ export interface paths {
4806
4806
  patch?: never;
4807
4807
  trace?: never;
4808
4808
  };
4809
+ "/workspaces/{workspaceId}/evals/packs": {
4810
+ parameters: {
4811
+ query?: never;
4812
+ header?: never;
4813
+ path?: never;
4814
+ cookie?: never;
4815
+ };
4816
+ /**
4817
+ * List platform eval starter packs
4818
+ * @description Returns the platform starter-pack catalog for Prompt & model evals. Packs are ThinkAI-authored templates (not workspace-owned and not a public marketplace). Requires workspace membership. Empty catalog is not expected in production builds; clients should still handle `{ "packs": [] }`.
4819
+ */
4820
+ get: operations["listEvalPacks"];
4821
+ put?: never;
4822
+ post?: never;
4823
+ delete?: never;
4824
+ options?: never;
4825
+ head?: never;
4826
+ patch?: never;
4827
+ trace?: never;
4828
+ };
4829
+ "/workspaces/{workspaceId}/evals/packs/{packId}/install": {
4830
+ parameters: {
4831
+ query?: never;
4832
+ header?: never;
4833
+ path?: never;
4834
+ cookie?: never;
4835
+ };
4836
+ get?: never;
4837
+ put?: never;
4838
+ /**
4839
+ * Install an eval starter pack as a suite
4840
+ * @description Creates a new editable eval suite from a platform starter pack (`version: 1`). Sets `target.promptKey` to `pack:<packId>` for traceability. Requires workspace editor or admin. Pack cases include fixture completions so the first run can succeed without AI connectors. Does not score on the request path.
4841
+ */
4842
+ post: operations["installEvalPack"];
4843
+ delete?: never;
4844
+ options?: never;
4845
+ head?: never;
4846
+ patch?: never;
4847
+ trace?: never;
4848
+ };
4809
4849
  "/workspaces/{workspaceId}/evals/suites": {
4810
4850
  parameters: {
4811
4851
  query?: never;
@@ -4854,6 +4894,50 @@ export interface paths {
4854
4894
  patch?: never;
4855
4895
  trace?: never;
4856
4896
  };
4897
+ "/workspaces/{workspaceId}/evals/suites/{suiteId}/compare": {
4898
+ parameters: {
4899
+ query?: never;
4900
+ header?: never;
4901
+ path?: never;
4902
+ cookie?: never;
4903
+ };
4904
+ /**
4905
+ * Compare two succeeded eval runs on a suite
4906
+ * @description Side-by-side compare of a baseline run vs a candidate run on the same suite. Both runs must be `succeeded`. Aligns cases by `caseId` and reports suite- and case-level score/token/cost deltas when present. Requires workspace membership. Does not trigger scoring.
4907
+ */
4908
+ get: operations["compareEvalRuns"];
4909
+ put?: never;
4910
+ post?: never;
4911
+ delete?: never;
4912
+ options?: never;
4913
+ head?: never;
4914
+ patch?: never;
4915
+ trace?: never;
4916
+ };
4917
+ "/workspaces/{workspaceId}/evals/suites/{suiteId}/decisions": {
4918
+ parameters: {
4919
+ query?: never;
4920
+ header?: never;
4921
+ path?: never;
4922
+ cookie?: never;
4923
+ };
4924
+ /**
4925
+ * List eval promote/keep/reject decisions for a suite
4926
+ * @description Returns the last 50 decisions for the suite (newest first). Empty → `{ "decisions": [] }`. Requires workspace membership.
4927
+ */
4928
+ get: operations["listEvalDecisions"];
4929
+ put?: never;
4930
+ /**
4931
+ * Record a promote, keep, or reject decision
4932
+ * @description Persists an audit decision for a baseline vs candidate run pair. Requires workspace editor or admin. Both runs must be `succeeded` on this suite. `promote` also applies the candidate run's `suiteSnapshot.target` to the live suite (version may bump). Promotion gate attach is deferred (`gateApplied: false`, `gateDetail.reason: deferred`) until thinkai-platform-workspace#492.
4933
+ */
4934
+ post: operations["createEvalDecision"];
4935
+ delete?: never;
4936
+ options?: never;
4937
+ head?: never;
4938
+ patch?: never;
4939
+ trace?: never;
4940
+ };
4857
4941
  "/workspaces/{workspaceId}/evals/suites/{suiteId}/runs": {
4858
4942
  parameters: {
4859
4943
  query?: never;
@@ -11252,6 +11336,8 @@ export interface components {
11252
11336
  createdByUserId: string;
11253
11337
  target: components["schemas"]["EvalSuiteTargetDto"];
11254
11338
  cases: components["schemas"]["EvalCaseDto"][];
11339
+ /** @description Most recent promote/keep/reject decision for this suite, when any exist. Omitted or null when none recorded. */
11340
+ latestDecision?: components["schemas"]["EvalDecisionDto"] | null;
11255
11341
  };
11256
11342
  EvalSuiteListDto: {
11257
11343
  suites: components["schemas"]["EvalSuiteDto"][];
@@ -11388,6 +11474,103 @@ export interface components {
11388
11474
  tokenEfficiency: components["schemas"]["EvalTokenEfficiencyDto"] | null;
11389
11475
  modelComparison: components["schemas"]["EvalModelComparisonDto"][];
11390
11476
  };
11477
+ /** @description Platform starter pack summary for the hub catalog. Install materializes a full `EvalSuiteDto`; pack payloads are not returned on list. */
11478
+ EvalPackSummaryDto: {
11479
+ /** @description Stable pack id (kebab-case). */
11480
+ id: string;
11481
+ name: string;
11482
+ description: string;
11483
+ /** @description Workflow bucket for UI grouping (e.g. `pr-review`). */
11484
+ workflow: string;
11485
+ /** @description Number of golden cases that will be created on install. */
11486
+ caseCount: number;
11487
+ };
11488
+ EvalPackListDto: {
11489
+ packs: components["schemas"]["EvalPackSummaryDto"][];
11490
+ };
11491
+ EvalCompareRunSummaryDto: {
11492
+ /** Format: uuid */
11493
+ id: string;
11494
+ suiteVersion: number;
11495
+ score: number | null;
11496
+ /** Format: date-time */
11497
+ finishedAt: string | null;
11498
+ target: components["schemas"]["EvalSuiteTargetDto"];
11499
+ passCount: number;
11500
+ failCount: number;
11501
+ errorCount: number;
11502
+ };
11503
+ EvalCompareCaseDto: {
11504
+ caseId: string;
11505
+ name: string;
11506
+ baselineStatus: (string & components["schemas"]["EvalCaseResultStatusDto"]) | null;
11507
+ candidateStatus: (string & components["schemas"]["EvalCaseResultStatusDto"]) | null;
11508
+ baselinePass: boolean | null;
11509
+ candidatePass: boolean | null;
11510
+ baselineFailedSignalIds: string[];
11511
+ candidateFailedSignalIds: string[];
11512
+ baselineInputTokens?: number | null;
11513
+ candidateInputTokens?: number | null;
11514
+ baselineOutputTokens?: number | null;
11515
+ candidateOutputTokens?: number | null;
11516
+ baselineCostCents?: number | null;
11517
+ candidateCostCents?: number | null;
11518
+ /** @description Candidate pass (1/0) minus baseline pass when both scored. */
11519
+ scoreDelta?: number | null;
11520
+ inputTokensDelta?: number | null;
11521
+ outputTokensDelta?: number | null;
11522
+ costCentsDelta?: number | null;
11523
+ };
11524
+ EvalCompareDto: {
11525
+ /** Format: uuid */
11526
+ suiteId: string;
11527
+ baseline: components["schemas"]["EvalCompareRunSummaryDto"];
11528
+ candidate: components["schemas"]["EvalCompareRunSummaryDto"];
11529
+ /** @description candidate.score − baseline.score when both present. */
11530
+ scoreDelta: number | null;
11531
+ avgInputTokensDelta?: number | null;
11532
+ avgOutputTokensDelta?: number | null;
11533
+ avgCostCentsDelta?: number | null;
11534
+ cases: components["schemas"]["EvalCompareCaseDto"][];
11535
+ /** @description Case ids present on only one run's results/snapshot. */
11536
+ unpairedCaseIds: string[];
11537
+ };
11538
+ /** @enum {string} */
11539
+ EvalDecisionKindDto: "promote" | "keep" | "reject";
11540
+ EvalGateDetailDto: {
11541
+ /** @description Machine-readable gate outcome. `deferred` until promotion-gate attach (thinkai-platform-workspace#492) ships. */
11542
+ reason: string;
11543
+ };
11544
+ EvalDecisionDto: {
11545
+ /** Format: uuid */
11546
+ id: string;
11547
+ /** Format: uuid */
11548
+ suiteId: string;
11549
+ decision: components["schemas"]["EvalDecisionKindDto"];
11550
+ /** Format: uuid */
11551
+ baselineRunId: string;
11552
+ /** Format: uuid */
11553
+ candidateRunId: string;
11554
+ /** Format: uuid */
11555
+ decidedByUserId: string;
11556
+ /** Format: date-time */
11557
+ decidedAt: string;
11558
+ note?: string | null;
11559
+ /** @description True when a promotion gate attach point enforced this decision. */
11560
+ gateApplied: boolean;
11561
+ gateDetail?: components["schemas"]["EvalGateDetailDto"] | null;
11562
+ };
11563
+ EvalDecisionListDto: {
11564
+ decisions: components["schemas"]["EvalDecisionDto"][];
11565
+ };
11566
+ CreateEvalDecisionBodyDto: {
11567
+ decision: components["schemas"]["EvalDecisionKindDto"];
11568
+ /** Format: uuid */
11569
+ baselineRunId: string;
11570
+ /** Format: uuid */
11571
+ candidateRunId: string;
11572
+ note?: string;
11573
+ };
11391
11574
  };
11392
11575
  responses: {
11393
11576
  /** @description Missing or invalid bearer token */
@@ -11427,6 +11610,8 @@ export interface components {
11427
11610
  WorkspaceId: string;
11428
11611
  /** @description Eval suite id (`tai_workspace_eval_suites.id`). */
11429
11612
  EvalSuiteId: string;
11613
+ /** @description Platform starter pack id (kebab-case), e.g. `pr-review`. Not a UUID. */
11614
+ EvalPackId: string;
11430
11615
  /** @description Eval run id (`tai_workspace_eval_runs.id`). */
11431
11616
  EvalRunId: string;
11432
11617
  RepoId: string;
@@ -12102,11 +12287,22 @@ export type EvalPromptTipDto = components['schemas']['EvalPromptTipDto'];
12102
12287
  export type EvalTokenEfficiencyDto = components['schemas']['EvalTokenEfficiencyDto'];
12103
12288
  export type EvalModelComparisonDto = components['schemas']['EvalModelComparisonDto'];
12104
12289
  export type EvalInsightsDto = components['schemas']['EvalInsightsDto'];
12290
+ export type EvalPackSummaryDto = components['schemas']['EvalPackSummaryDto'];
12291
+ export type EvalPackListDto = components['schemas']['EvalPackListDto'];
12292
+ export type EvalCompareRunSummaryDto = components['schemas']['EvalCompareRunSummaryDto'];
12293
+ export type EvalCompareCaseDto = components['schemas']['EvalCompareCaseDto'];
12294
+ export type EvalCompareDto = components['schemas']['EvalCompareDto'];
12295
+ export type EvalDecisionKindDto = components['schemas']['EvalDecisionKindDto'];
12296
+ export type EvalGateDetailDto = components['schemas']['EvalGateDetailDto'];
12297
+ export type EvalDecisionDto = components['schemas']['EvalDecisionDto'];
12298
+ export type EvalDecisionListDto = components['schemas']['EvalDecisionListDto'];
12299
+ export type CreateEvalDecisionBodyDto = components['schemas']['CreateEvalDecisionBodyDto'];
12105
12300
  export type ResponseUnauthorized = components['responses']['Unauthorized'];
12106
12301
  export type ResponseForbidden = components['responses']['Forbidden'];
12107
12302
  export type ResponseZenHrSyncInProgress = components['responses']['ZenHrSyncInProgress'];
12108
12303
  export type ParameterWorkspaceId = components['parameters']['WorkspaceId'];
12109
12304
  export type ParameterEvalSuiteId = components['parameters']['EvalSuiteId'];
12305
+ export type ParameterEvalPackId = components['parameters']['EvalPackId'];
12110
12306
  export type ParameterEvalRunId = components['parameters']['EvalRunId'];
12111
12307
  export type ParameterRepoId = components['parameters']['RepoId'];
12112
12308
  export type ParameterProviderSlug = components['parameters']['ProviderSlug'];
@@ -24678,6 +24874,122 @@ export interface operations {
24678
24874
  };
24679
24875
  };
24680
24876
  };
24877
+ listEvalPacks: {
24878
+ parameters: {
24879
+ query?: never;
24880
+ header?: never;
24881
+ path: {
24882
+ workspaceId: components["parameters"]["WorkspaceId"];
24883
+ };
24884
+ cookie?: never;
24885
+ };
24886
+ requestBody?: never;
24887
+ responses: {
24888
+ /** @description Starter pack catalog */
24889
+ 200: {
24890
+ headers: {
24891
+ [name: string]: unknown;
24892
+ };
24893
+ content: {
24894
+ /**
24895
+ * @example {
24896
+ * "packs": [
24897
+ * {
24898
+ * "id": "pr-review",
24899
+ * "name": "PR review comments",
24900
+ * "description": "Check review tone and clear blocking feedback",
24901
+ * "workflow": "pr-review",
24902
+ * "caseCount": 3
24903
+ * }
24904
+ * ]
24905
+ * }
24906
+ */
24907
+ "application/json": components["schemas"]["EvalPackListDto"];
24908
+ };
24909
+ };
24910
+ 401: components["responses"]["Unauthorized"];
24911
+ 403: components["responses"]["Forbidden"];
24912
+ /** @description Workspace not found */
24913
+ 404: {
24914
+ headers: {
24915
+ [name: string]: unknown;
24916
+ };
24917
+ content: {
24918
+ "application/json": components["schemas"]["ErrorMessageDto"];
24919
+ };
24920
+ };
24921
+ };
24922
+ };
24923
+ installEvalPack: {
24924
+ parameters: {
24925
+ query?: never;
24926
+ header?: never;
24927
+ path: {
24928
+ workspaceId: components["parameters"]["WorkspaceId"];
24929
+ /** @description Platform starter pack id (kebab-case), e.g. `pr-review`. Not a UUID. */
24930
+ packId: components["parameters"]["EvalPackId"];
24931
+ };
24932
+ cookie?: never;
24933
+ };
24934
+ requestBody?: never;
24935
+ responses: {
24936
+ /** @description Suite created from pack */
24937
+ 201: {
24938
+ headers: {
24939
+ [name: string]: unknown;
24940
+ };
24941
+ content: {
24942
+ "application/json": components["schemas"]["EvalSuiteDto"];
24943
+ };
24944
+ };
24945
+ 401: components["responses"]["Unauthorized"];
24946
+ /** @description Viewer cannot install packs */
24947
+ 403: {
24948
+ headers: {
24949
+ [name: string]: unknown;
24950
+ };
24951
+ content: {
24952
+ /**
24953
+ * @example {
24954
+ * "error": "Workspace editor role required",
24955
+ * "code": "workspace_editor_required"
24956
+ * }
24957
+ */
24958
+ "application/json": components["schemas"]["ErrorMessageDto"];
24959
+ };
24960
+ };
24961
+ /** @description Unknown pack id or workspace not found */
24962
+ 404: {
24963
+ headers: {
24964
+ [name: string]: unknown;
24965
+ };
24966
+ content: {
24967
+ /**
24968
+ * @example {
24969
+ * "error": "Eval starter pack not found",
24970
+ * "code": "eval_pack_not_found"
24971
+ * }
24972
+ */
24973
+ "application/json": components["schemas"]["ErrorMessageDto"];
24974
+ };
24975
+ };
24976
+ /** @description Workspace already has the maximum number of suites (50) */
24977
+ 409: {
24978
+ headers: {
24979
+ [name: string]: unknown;
24980
+ };
24981
+ content: {
24982
+ /**
24983
+ * @example {
24984
+ * "error": "Maximum of 50 eval suites per workspace",
24985
+ * "code": "eval_suite_limit_reached"
24986
+ * }
24987
+ */
24988
+ "application/json": components["schemas"]["ErrorMessageDto"];
24989
+ };
24990
+ };
24991
+ };
24992
+ };
24681
24993
  listEvalSuites: {
24682
24994
  parameters: {
24683
24995
  query?: never;
@@ -24920,6 +25232,155 @@ export interface operations {
24920
25232
  };
24921
25233
  };
24922
25234
  };
25235
+ compareEvalRuns: {
25236
+ parameters: {
25237
+ query: {
25238
+ baselineRunId: string;
25239
+ candidateRunId: string;
25240
+ };
25241
+ header?: never;
25242
+ path: {
25243
+ workspaceId: components["parameters"]["WorkspaceId"];
25244
+ /** @description Eval suite id (`tai_workspace_eval_suites.id`). */
25245
+ suiteId: components["parameters"]["EvalSuiteId"];
25246
+ };
25247
+ cookie?: never;
25248
+ };
25249
+ requestBody?: never;
25250
+ responses: {
25251
+ /** @description Compare result */
25252
+ 200: {
25253
+ headers: {
25254
+ [name: string]: unknown;
25255
+ };
25256
+ content: {
25257
+ "application/json": components["schemas"]["EvalCompareDto"];
25258
+ };
25259
+ };
25260
+ /** @description Runs not comparable (e.g. not succeeded, same id, or invalid query). Codes: `eval_compare_runs_required`, `eval_compare_runs_not_succeeded`, `eval_compare_same_run`. */
25261
+ 400: {
25262
+ headers: {
25263
+ [name: string]: unknown;
25264
+ };
25265
+ content: {
25266
+ "application/json": components["schemas"]["ErrorMessageDto"];
25267
+ };
25268
+ };
25269
+ 401: components["responses"]["Unauthorized"];
25270
+ 403: components["responses"]["Forbidden"];
25271
+ /** @description Workspace, suite, or run not found */
25272
+ 404: {
25273
+ headers: {
25274
+ [name: string]: unknown;
25275
+ };
25276
+ content: {
25277
+ "application/json": components["schemas"]["ErrorMessageDto"];
25278
+ };
25279
+ };
25280
+ };
25281
+ };
25282
+ listEvalDecisions: {
25283
+ parameters: {
25284
+ query?: never;
25285
+ header?: never;
25286
+ path: {
25287
+ workspaceId: components["parameters"]["WorkspaceId"];
25288
+ /** @description Eval suite id (`tai_workspace_eval_suites.id`). */
25289
+ suiteId: components["parameters"]["EvalSuiteId"];
25290
+ };
25291
+ cookie?: never;
25292
+ };
25293
+ requestBody?: never;
25294
+ responses: {
25295
+ /** @description Decision history */
25296
+ 200: {
25297
+ headers: {
25298
+ [name: string]: unknown;
25299
+ };
25300
+ content: {
25301
+ /**
25302
+ * @example {
25303
+ * "decisions": []
25304
+ * }
25305
+ */
25306
+ "application/json": components["schemas"]["EvalDecisionListDto"];
25307
+ };
25308
+ };
25309
+ 401: components["responses"]["Unauthorized"];
25310
+ 403: components["responses"]["Forbidden"];
25311
+ /** @description Workspace or suite not found */
25312
+ 404: {
25313
+ headers: {
25314
+ [name: string]: unknown;
25315
+ };
25316
+ content: {
25317
+ "application/json": components["schemas"]["ErrorMessageDto"];
25318
+ };
25319
+ };
25320
+ };
25321
+ };
25322
+ createEvalDecision: {
25323
+ parameters: {
25324
+ query?: never;
25325
+ header?: never;
25326
+ path: {
25327
+ workspaceId: components["parameters"]["WorkspaceId"];
25328
+ /** @description Eval suite id (`tai_workspace_eval_suites.id`). */
25329
+ suiteId: components["parameters"]["EvalSuiteId"];
25330
+ };
25331
+ cookie?: never;
25332
+ };
25333
+ requestBody: {
25334
+ content: {
25335
+ "application/json": components["schemas"]["CreateEvalDecisionBodyDto"];
25336
+ };
25337
+ };
25338
+ responses: {
25339
+ /** @description Decision recorded */
25340
+ 201: {
25341
+ headers: {
25342
+ [name: string]: unknown;
25343
+ };
25344
+ content: {
25345
+ "application/json": components["schemas"]["EvalDecisionDto"];
25346
+ };
25347
+ };
25348
+ /** @description Validation failed. Codes: `eval_decision_invalid`, `eval_compare_runs_not_succeeded`, `eval_compare_same_run`, `eval_promote_snapshot_missing`. */
25349
+ 400: {
25350
+ headers: {
25351
+ [name: string]: unknown;
25352
+ };
25353
+ content: {
25354
+ "application/json": components["schemas"]["ErrorMessageDto"];
25355
+ };
25356
+ };
25357
+ 401: components["responses"]["Unauthorized"];
25358
+ /** @description Authenticated but not a workspace editor/admin */
25359
+ 403: {
25360
+ headers: {
25361
+ [name: string]: unknown;
25362
+ };
25363
+ content: {
25364
+ /**
25365
+ * @example {
25366
+ * "error": "Workspace editor role required",
25367
+ * "code": "workspace_editor_required"
25368
+ * }
25369
+ */
25370
+ "application/json": components["schemas"]["ErrorMessageDto"];
25371
+ };
25372
+ };
25373
+ /** @description Workspace, suite, or run not found */
25374
+ 404: {
25375
+ headers: {
25376
+ [name: string]: unknown;
25377
+ };
25378
+ content: {
25379
+ "application/json": components["schemas"]["ErrorMessageDto"];
25380
+ };
25381
+ };
25382
+ };
25383
+ };
24923
25384
  listEvalRuns: {
24924
25385
  parameters: {
24925
25386
  query?: never;