import {z} from 'zod' export type SourceKind = 'span' | 'log' | 'metric'; export type PipelineConfigSelector = {source_kind: SourceKind, filter?: (string | null) | undefined}; export type ProbabilisticSampling = {type?: 'probabilistic' | undefined, percentage: number}; export type AttributeHashSampling = {type?: 'attribute_hash' | undefined, attribute: string, percentage: number}; export type PipelineConfigSampling = ProbabilisticSampling | AttributeHashSampling; export type LlmJudgeReference = {slug: string, mapping?: {[key: string]: string} | undefined, sampling?: (PipelineConfigSampling | null) | undefined}; export type UpdatePipelineRequest = {name?: string | undefined, description?: (string | null) | undefined, selectors?: Array | undefined, definitions?: Array | undefined, enabled?: boolean | undefined}; export type UpdateApiV1ObservabilityPipelinesPipelineIdArgs = {pipeline_id: string, body: UpdatePipelineRequest}; export type UpdateApiV1ObservabilityPipelinesPipelineIdOptions = {baseUrl?: string | undefined, ApiKey?: string | undefined, fetch?: typeof fetch | undefined}; export const sourceKind = z.enum(["span", "log", "metric"]); export const pipelineConfigSelector = z.object({source_kind: sourceKind, filter: z.string().nullable().optional()}); export const pipelineConfigScope = z.enum(["workspace", "shared"]); export const pipelineKind = z.enum(["detection-v1", "moderation-v1", "judge-v1", "export-v1"]); export const probabilisticSampling = z.object({type: z.literal("probabilistic").optional(), percentage: z.number().gt(0).lte(100)}); export const attributeHashSampling = z.object({type: z.literal("attribute_hash").optional(), attribute: z.string().min(1).max(500), percentage: z.number().gt(0).lte(100)}); export const pipelineConfigSampling = z.discriminatedUnion("type", [probabilisticSampling, attributeHashSampling]); export const detectionPattern = z.object({name: z.string().min(1).max(200), regex: z.string().min(1), category: z.string().min(1).max(200), confidence: z.string().min(1).max(50)}); export const detectionDefinitionV1 = z.object({target_attributes: z.array(z.string()), patterns: z.array(detectionPattern)}); export const moderationDefinitionV1 = z.object({model: z.string().min(1).max(500).optional(), target_attributes: z.array(z.string()).optional()}); export const evaluationBooleanResultSpec = z.object({type: z.literal("boolean").optional()}); export const evaluationCategoricalResultSpec = z.object({type: z.literal("categorical").optional(), labels: z.array(z.string())}); export const evaluationNumericResultSpec = z.object({type: z.literal("numeric").optional(), min: z.number(), max: z.number()}); export const evaluationResultSpec = z.discriminatedUnion("type", [evaluationBooleanResultSpec, evaluationCategoricalResultSpec, evaluationNumericResultSpec]); export const judgeDefinitionV1 = z.object({model: z.string().min(1).max(500), prompt: z.string().min(1).max(20000), temperature: z.number().gte(0).lte(1.5).nullable().optional(), top_p: z.number().gt(0).lte(1).nullable().optional(), max_tokens: z.number().int().gte(0).nullable().optional(), random_seed: z.number().int().gte(0).nullable().optional(), result_spec: evaluationResultSpec, mapping: z.record(z.string(), z.string()).optional(), use_cache: z.boolean().optional()}); export const pipelineConfigHeader = z.object({value: z.string().min(1).nullable().optional()}); export const oTLPDestination = z.object({protocol: z.string().min(1).max(50), endpoint: z.string().min(1).max(1000), insecure: z.boolean().optional(), headers: z.record(z.string(), pipelineConfigHeader).optional()}); export const exportDefinitionV1 = z.object({destination: oTLPDestination}); export const pipelineConfigDefinition = z.union([detectionDefinitionV1, moderationDefinitionV1, judgeDefinitionV1, exportDefinitionV1]); export const pipelineConfig = z.object({id: z.string(), created_at: z.string(), updated_at: z.string(), deleted_at: z.string().nullable(), scope: pipelineConfigScope, workspace_id: z.string(), name: z.string(), slug: z.string(), pipeline_kind: pipelineKind, selectors: z.array(pipelineConfigSelector), sampling: pipelineConfigSampling.nullable().optional(), enabled: z.boolean(), definition: pipelineConfigDefinition, scorer_slug: z.string().nullable().optional(), scorer_version: z.number().int().nullable().optional()}); export const pipeline = z.object({id: z.string(), created_at: z.string(), updated_at: z.string(), workspace_id: z.string(), name: z.string(), slug: z.string(), description: z.string().nullable(), selectors: z.array(pipelineConfigSelector), enabled: z.boolean(), creator_id: z.string().nullable(), pipeline_configs: z.array(pipelineConfig)}); 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 }; /** * Update a pipeline * * PUT /v1/observability/pipelines/{pipeline_id} */ export const updateApiV1ObservabilityPipelinesPipelineId = async (args: UpdateApiV1ObservabilityPipelinesPipelineIdArgs, options?: UpdateApiV1ObservabilityPipelinesPipelineIdOptions) => { const {baseUrl = "https://api.mistral.ai", fetch: fetchFn = fetch, ApiKey} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('content-type', "application/json") headers.set('accept', "application/json") if (ApiKey !== undefined) headers.set('authorization', `Bearer ${ApiKey}`) const url = `${baseUrl.replace(/\/+$/, '')}/v1/observability/pipelines/${encodeURIComponent(String(args.pipeline_id))}${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "PUT", 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(pipeline, await res.json()) };