import {z} from 'zod' export type JsonNode = {string?: boolean | undefined, valueNode?: boolean | undefined, missingNode?: boolean | undefined, short?: boolean | undefined, double?: boolean | undefined, bigDecimal?: boolean | undefined, bigInteger?: boolean | undefined, textual?: boolean | undefined, boolean?: boolean | undefined, container?: boolean | undefined, object?: boolean | undefined, binary?: boolean | undefined, number?: boolean | undefined, nodeType?: ('ARRAY' | 'BINARY' | 'BOOLEAN' | 'MISSING' | 'NULL' | 'NUMBER' | 'OBJECT' | 'POJO' | 'STRING') | undefined, long?: boolean | undefined, pojo?: boolean | undefined, int?: boolean | undefined, integralNumber?: boolean | undefined, floatingPointNumber?: boolean | undefined, array?: boolean | undefined, empty?: boolean | undefined, ''?: boolean | undefined, float?: boolean | undefined, embeddedValue?: boolean | undefined}; export type TestActionDTO = {id?: string | undefined, type?: string | undefined, name?: string | undefined, transactionBoundary?: string | undefined, valueType?: string | undefined, value?: JsonNode | undefined, contextValues?: JsonNode | undefined, actionCounter?: number | undefined, ignoreActionCounter?: boolean | undefined, editable?: boolean | undefined, deletable?: boolean | undefined}; export type TestStepDTO = {id?: string | undefined, scopeId?: string | undefined, subScopeId?: string | undefined, scopeDefinitionId?: string | undefined, scopeDefinitionKey?: string | undefined, scopeType?: string | undefined, activityId?: string | undefined, activityName?: string | undefined, activityType?: string | undefined, childScopeId?: string | undefined, childScopeType?: string | undefined, taskId?: string | undefined, transactionOrder?: number | undefined, userId?: string | undefined, active?: boolean | undefined, enabled?: boolean | undefined, available?: boolean | undefined, completed?: boolean | undefined, breakpointId?: string | undefined, breakpointType?: string | undefined, actions?: Array | undefined, hasErrors?: boolean | undefined, errorMessage?: string | undefined, instanceIndex?: number | undefined}; export type ServiceMockOverrideDTO = {entryType?: string | undefined, serviceKey?: string | undefined, operationKey?: string | undefined, applyTo?: string | undefined, mode?: string | undefined, mockResponseKey?: string | undefined}; export type MultiInstanceMetaDTO = {activityId?: string | undefined, iterations?: number | undefined, type?: string | undefined}; export type ScopeTestDefinitionDTO = {name?: string | undefined, key?: string | undefined, operationKey?: string | undefined, inputParameters?: {[key: string]: Record} | undefined, guardrailInputParameters?: {[key: string]: {[key: string]: Record}} | undefined, serviceMockOverrides?: Array | undefined, expectedOutputParameters?: JsonNode | undefined, steps?: Array | undefined, multiInstance?: Array | undefined, skip?: boolean | undefined}; export type TestSetDTO = {name?: string | undefined, key?: string | undefined, operationKey?: string | undefined, testDefinitions?: Array | undefined}; export type SecurityScopeDTO = {userId?: string | undefined, userDefinitionKey?: string | undefined, groupKeys?: Array | undefined, tenantId?: string | undefined}; export type TestModelDTO = {id?: string | undefined, name?: string | undefined, scopeId?: string | undefined, scopeType?: string | undefined, scopeName?: string | undefined, scopeDefinitionId?: string | undefined, scopeDefinitionKey?: string | undefined, scopeDefinitionName?: string | undefined, parentScopeId?: string | undefined, parentScopeType?: string | undefined, tenantId?: string | undefined, hasScopeInstance?: boolean | undefined, creationTime?: string | undefined, creatorId?: string | undefined, creatorUserName?: string | undefined, endTime?: string | undefined, steps?: Array | undefined, testSets?: Array | undefined, securityScopes?: {[key: string]: SecurityScopeDTO} | undefined, actionCounter?: number | undefined}; export type CreateApiExecuteTestModelContentArgs = {body: TestModelDTO}; export type CreateApiExecuteTestModelContentOptions = {baseUrl?: string | undefined, basicAuth?: {username: string, password: string} | undefined, fetch?: typeof fetch | undefined}; export const testRunLogEntryDTO = z.object({message: z.string().optional(), stepId: z.string().optional(), logLevel: z.string().optional()}); export const jsonNode = z.object({string: z.boolean().optional(), valueNode: z.boolean().optional(), missingNode: z.boolean().optional(), short: z.boolean().optional(), double: z.boolean().optional(), bigDecimal: z.boolean().optional(), bigInteger: z.boolean().optional(), textual: z.boolean().optional(), boolean: z.boolean().optional(), container: z.boolean().optional(), object: z.boolean().optional(), binary: z.boolean().optional(), number: z.boolean().optional(), nodeType: z.enum(["ARRAY", "BINARY", "BOOLEAN", "MISSING", "NULL", "NUMBER", "OBJECT", "POJO", "STRING"]).optional(), long: z.boolean().optional(), pojo: z.boolean().optional(), int: z.boolean().optional(), integralNumber: z.boolean().optional(), floatingPointNumber: z.boolean().optional(), array: z.boolean().optional(), empty: z.boolean().optional(), : z.boolean().optional(), float: z.boolean().optional(), embeddedValue: z.boolean().optional()}); export const testActionDTO = z.object({id: z.string().optional(), type: z.string().optional(), name: z.string().optional(), transactionBoundary: z.string().optional(), valueType: z.string().optional(), value: jsonNode.optional(), contextValues: jsonNode.optional(), actionCounter: z.number().int().optional(), ignoreActionCounter: z.boolean().optional(), editable: z.boolean().optional(), deletable: z.boolean().optional()}); export const testStepDTO = z.object({id: z.string().optional(), scopeId: z.string().optional(), subScopeId: z.string().optional(), scopeDefinitionId: z.string().optional(), scopeDefinitionKey: z.string().optional(), scopeType: z.string().optional(), activityId: z.string().optional(), activityName: z.string().optional(), activityType: z.string().optional(), childScopeId: z.string().optional(), childScopeType: z.string().optional(), taskId: z.string().optional(), transactionOrder: z.number().int().optional(), userId: z.string().optional(), active: z.boolean().optional(), enabled: z.boolean().optional(), available: z.boolean().optional(), completed: z.boolean().optional(), breakpointId: z.string().optional(), breakpointType: z.string().optional(), actions: z.array(testActionDTO).optional(), hasErrors: z.boolean().optional(), errorMessage: z.string().optional(), instanceIndex: z.number().int().optional()}); export const serviceMockOverrideDTO = z.object({entryType: z.string().optional(), serviceKey: z.string().optional(), operationKey: z.string().optional(), applyTo: z.string().optional(), mode: z.string().optional(), mockResponseKey: z.string().optional()}); export const multiInstanceMetaDTO = z.object({activityId: z.string().optional(), iterations: z.number().int().optional(), type: z.string().optional()}); export const scopeTestDefinitionDTO = z.object({name: z.string().optional(), key: z.string().optional(), operationKey: z.string().optional(), inputParameters: z.record(z.string(), z.object({})).optional(), guardrailInputParameters: z.record(z.string(), z.record(z.string(), z.object({}))).optional(), serviceMockOverrides: z.array(serviceMockOverrideDTO).optional(), expectedOutputParameters: jsonNode.optional(), steps: z.array(testStepDTO).optional(), multiInstance: z.array(multiInstanceMetaDTO).optional(), skip: z.boolean().optional()}); export const testSetDTO = z.object({name: z.string().optional(), key: z.string().optional(), operationKey: z.string().optional(), testDefinitions: z.array(scopeTestDefinitionDTO).optional()}); export const securityScopeDTO = z.object({userId: z.string().optional(), userDefinitionKey: z.string().optional(), groupKeys: z.array(z.string()).optional(), tenantId: z.string().optional()}); export const testModelDTO = z.object({id: z.string().optional(), name: z.string().optional(), scopeId: z.string().optional(), scopeType: z.string().optional(), scopeName: z.string().optional(), scopeDefinitionId: z.string().optional(), scopeDefinitionKey: z.string().optional(), scopeDefinitionName: z.string().optional(), parentScopeId: z.string().optional(), parentScopeType: z.string().optional(), tenantId: z.string().optional(), hasScopeInstance: z.boolean().optional(), creationTime: z.string().optional(), creatorId: z.string().optional(), creatorUserName: z.string().optional(), endTime: z.string().optional(), steps: z.array(testStepDTO).optional(), testSets: z.array(testSetDTO).optional(), securityScopes: z.record(z.string(), securityScopeDTO).optional(), actionCounter: z.number().int().optional()}); export const testFailureDTO = z.object({actual: jsonNode.optional(), expected: jsonNode.optional(), exceptionMessage: z.string().optional()}); export const assertionResultDTO = z.object({name: z.string().optional(), operator: z.string().optional(), expectedValue: z.object({}).optional(), actualValue: z.object({}).optional(), passed: z.boolean().optional(), missingField: z.boolean().optional(), actualFallback: z.object({}).optional()}); export const evaluatorResultDTO = z.object({evaluatorKey: z.string().optional(), score: z.number().optional(), passed: z.boolean().optional(), reason: z.string().optional(), scoreMin: z.number().optional(), scoreMax: z.number().optional()}); export const testStepResultDTO = z.object({activityId: z.string().optional(), status: z.string().optional(), errorMessage: z.string().optional(), scopeDefinitionKey: z.string().optional()}); export const testResultDTO = z.object({testSetKey: z.string().optional(), key: z.string().optional(), status: z.string().optional(), failure: testFailureDTO.optional(), assertionResults: z.array(assertionResultDTO).optional(), evaluatorResults: z.array(evaluatorResultDTO).optional(), actualOutput: z.string().optional(), durationMs: z.number().int().optional(), promptTokenCount: z.number().int().optional(), outputTokenCount: z.number().int().optional(), stepResults: z.array(testStepResultDTO).optional(), scopeId: z.string().optional(), scopeType: z.string().optional()}); export const testRunInfoDTO = z.object({testName: z.string().optional(), scopeId: z.string().optional(), scopeType: z.string().optional(), scopeDefinitionId: z.string().optional(), scopeDefinitionKey: z.string().optional(), scopeDefinitionName: z.string().optional(), tenantId: z.string().optional(), testRunMessages: z.array(testRunLogEntryDTO).optional(), testModel: testModelDTO.optional(), hasErrors: z.boolean().optional(), testInstanceId: z.string().optional(), testResults: z.array(testResultDTO).optional(), skippedCount: z.number().int().optional(), setCount: z.number().int().optional(), definitionCount: z.number().int().optional(), passedDefinitionCount: z.number().int().optional()}); 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 }; /** * Execute a test model from content * * POST /execute-test-model-content */ export const createApiExecuteTestModelContent = async (args: CreateApiExecuteTestModelContentArgs, options?: CreateApiExecuteTestModelContentOptions) => { const {baseUrl = "http://localhost:8090/inspect-api", fetch: fetchFn = fetch, basicAuth} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('content-type', "application/json") headers.set('accept', "application/json") if (basicAuth !== undefined) headers.set('authorization', `Basic ${btoa(`${basicAuth.username}:${basicAuth.password}`)}`) const url = `${baseUrl.replace(/\/+$/, '')}/execute-test-model-content${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "POST", headers, body: JSON.stringify(args.body)}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(testRunInfoDTO, await res.json()) };