import {z} from 'zod' export type GetApiV1TilesWorkspaceNameTileNameVersionsVersionEvalSuiteArgs = {workspaceName: string, tileName: string, version: string}; export type GetApiV1TilesWorkspaceNameTileNameVersionsVersionEvalSuiteOptions = {baseUrl?: string | undefined, fetch?: typeof fetch | undefined}; export const getApiV1TilesWorkspaceNameTileNameVersionsVersionEvalSuiteResponse = z.object({links: z.object({self: z.string()}), data: z.object({id: z.string(), type: z.literal("eval-suite"), attributes: z.object({status: z.union([z.literal("pending"), z.literal("completed"), z.literal("failed")]), evalRunId: z.string(), scenarios: z.array(z.object({id: z.string(), fingerprint: z.string(), task: z.string(), path: z.string().optional(), shortDescription: z.string().optional(), rubric: z.object({context: z.string().min(1), type: z.literal("weighted_checklist"), checklist: z.array(z.object({name: z.string().min(1), description: z.string().min(1), max_score: z.number().gte(0)}))}), qualityAssessment: z.object({feasibility: z.union([z.literal("FEASIBLE"), z.literal("NOT_FEASIBLE")]), feasibility_notes: z.string(), leakage: z.union([z.literal("NO_LEAKAGE"), z.literal("LOW_LEAKAGE"), z.literal("MEDIUM_LEAKAGE"), z.literal("HIGH_LEAKAGE")]), leakage_evidence: z.array(z.object({scenario_statement: z.string(), criteria_rubric: z.string()})), scenario_value: z.union([z.literal("LOW"), z.literal("MEDIUM"), z.literal("HIGH")]), scenario_value_notes: z.string(), assessed_at: z.string(), model: z.string()}).optional(), qualityFilterStatus: z.union([z.literal("included"), z.literal("rejected")]).optional(), createdAt: z.string(), updatedAt: z.string(), solutions: z.array(z.object({id: z.string(), variant: z.union([z.literal("baseline"), z.literal("usage-spec")]), solutionTarGZS3Key: z.string().nullable(), solutionMetadata: z.object({totalTimeMs: z.number().optional(), agentDurationMs: z.number().optional(), costUsd: z.number().optional(), totalTurns: z.number().int().optional(), inputTokens: z.number().optional(), outputTokens: z.number().optional(), cacheReadTokens: z.number().optional(), cacheCreationTokens: z.number().optional()}).and(z.record(z.string(), z.unknown())).nullable(), assessmentResults: z.array(z.object({name: z.string().min(1), score: z.number().gte(0), max_score: z.number().gte(0).optional(), reasoning: z.string().min(1)})).nullable(), assessmentMetadata: z.record(z.string(), z.unknown()).nullable(), createdAt: z.string(), updatedAt: z.string(), reused: z.boolean().optional(), runs: z.array(z.union([z.object({status: z.literal("completed"), solutionId: z.string(), score: z.number().nullable(), createdAt: z.string(), reused: z.boolean().optional(), totalTimeMs: z.number().optional(), totalTurns: z.number().optional(), inputTokens: z.number().optional(), outputTokens: z.number().optional(), cacheReadTokens: z.number().optional(), cacheCreationTokens: z.number().optional(), costUsd: z.number().optional(), agentDurationMs: z.number().optional(), hasSolveLog: z.boolean().optional(), activation: z.object({activatedSkills: z.array(z.string().max(256)), activationMethods: z.array(z.object({skill: z.string().max(256), via: z.union([z.literal("skill-tool"), z.literal("read")])})).optional(), mcpTools: z.array(z.object({server: z.string().max(256), tool: z.string().max(256), calls: z.number().int().gte(1)})).optional(), skipped: z.boolean().optional(), error: z.boolean().optional(), unavailable: z.boolean().optional()}).optional(), assessmentResults: z.array(z.object({name: z.string().min(1), score: z.number().gte(0), max_score: z.number().gte(0).optional(), reasoning: z.string().min(1)})).optional()}), z.object({status: z.literal("pending")})])).optional(), activation: z.object({activatedSkills: z.array(z.string().max(256)), activationMethods: z.array(z.object({skill: z.string().max(256), via: z.union([z.literal("skill-tool"), z.literal("read")])})).optional(), mcpTools: z.array(z.object({server: z.string().max(256), tool: z.string().max(256), calls: z.number().int().gte(1)})).optional(), skipped: z.boolean().optional(), error: z.boolean().optional(), unavailable: z.boolean().optional()}).optional()}))})), createdAt: z.string(), updatedAt: z.string(), expectedVariants: z.array(z.union([z.literal("baseline"), z.literal("usage-spec")])), lastScoredAt: z.string().nullable(), runs: z.array(z.object({id: z.string(), label: z.string().nullable(), createdAt: z.string(), variants: z.array(z.object({label: z.string(), agent: z.string(), model: z.string(), runFixtureNames: z.array(z.string()), agentMustRead: z.array(z.string())})), isClassicPair: z.boolean(), arms: z.array(z.object({label: z.string(), agent: z.string(), model: z.string(), includeContext: z.boolean(), forceContextActivation: z.boolean(), fixtureNames: z.array(z.string()), addedFixtureNames: z.array(z.string()), deletedFixtureNames: z.array(z.string())})), variedDimensionKeys: z.array(z.string()), armHeadlines: z.array(z.object({label: z.string(), agent: z.string(), model: z.string(), meanScore: z.number().optional(), scoreStdDev: z.number().optional()})), statusIngredients: z.object({status: z.union([z.literal("pending"), z.literal("completed"), z.literal("failed")]), expectedSlotCount: z.number(), completedSlotCount: z.number()})}))})})}); export const validateResponse = async ( schema: { readonly '~standard': { readonly validate: (value: unknown) => ({ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }) | Promise<{ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }> } }, value: unknown ): Promise => { const result = await schema['~standard'].validate(value) if (result.issues !== undefined) { const detail = result.issues .map(({ message, path }) => path?.length ? `${path.map((segment) => String(typeof segment === 'object' ? segment.key : segment)).join('.')}: ${message}` : message ) .join('; ') throw new Error(`Response does not match the schema: ${detail}`, { cause: { issues: result.issues } }) } return result.value }; /** * Returns the eval suite (scenarios + latest run status) for a tile version. * * GET /v1/tiles/{workspaceName}/{tileName}/versions/{version}/eval-suite */ export const getApiV1TilesWorkspaceNameTileNameVersionsVersionEvalSuite = async (args: GetApiV1TilesWorkspaceNameTileNameVersionsVersionEvalSuiteArgs, options?: GetApiV1TilesWorkspaceNameTileNameVersionsVersionEvalSuiteOptions) => { const {baseUrl = "https://api.tessl.io", fetch: fetchFn = fetch} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") const url = `${baseUrl.replace(/\/+$/, '')}/v1/tiles/${encodeURIComponent(String(args.workspaceName))}/${encodeURIComponent(String(args.tileName))}/versions/${encodeURIComponent(String(args.version))}/eval-suite${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "GET", headers}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(getApiV1TilesWorkspaceNameTileNameVersionsVersionEvalSuiteResponse, await res.json()) };