import {z} from 'zod' export type ModelAggregationMethod = 'sum' | 'min' | 'max' | 'avg' | 'median' | 'percentage'; export type ModelMetricsAggregation = {aggregation?: ModelAggregationMethod | undefined, group_by?: (Array<'dimension' | 'instance' | 'percentage-of-instance' | 'label' | 'node' | 'context' | 'units' | 'selected'>) | undefined, group_by_label?: Array | undefined}; export type ModelTimeAggregation = {time_group?: ('min' | 'max' | 'avg' | 'average' | 'median' | 'stddev' | 'sum' | 'incremental-sum' | 'ses' | 'des' | 'cv' | 'countif' | 'percentile' | 'percentile25' | 'percentile50' | 'percentile75' | 'percentile80' | 'percentile90' | 'percentile95' | 'percentile97' | 'percentile98' | 'percentile99' | 'trimmed-mean' | 'trimmed-mean1' | 'trimmed-mean2' | 'trimmed-mean3' | 'trimmed-mean5' | 'trimmed-mean10' | 'trimmed-mean15' | 'trimmed-mean20' | 'trimmed-mean25' | 'trimmed-median' | 'trimmed-median1' | 'trimmed-median2' | 'trimmed-median3' | 'trimmed-median5' | 'trimmed-median10' | 'trimmed-median15' | 'trimmed-median20' | 'trimmed-median25') | undefined, time_group_options?: ('countif' | 'trimmed-mean' | 'trimmed-median' | 'percentile') | undefined, time_resampling?: number | undefined}; export type ModelAggregations = {metrics?: Array | undefined, time?: ModelTimeAggregation | undefined}; export type ModelScope = {contexts?: Array | undefined, dimensions?: Array | undefined, instances?: Array | undefined, labels?: Array | undefined, nodes?: Array | undefined}; export type ModelSelectors = {alerts?: Array | undefined, contexts?: Array | undefined, dimensions?: Array | undefined, instances?: Array | undefined, labels?: Array | undefined, nodes?: Array | undefined}; export type ModelWindowSpan = {after?: number | undefined, before?: number | undefined, duration?: number | undefined, points?: number | undefined}; export type ModelWindow = {after?: number | undefined, baseline?: ModelWindowSpan | undefined, before?: number | undefined, duration?: number | undefined, points?: number | undefined, tier?: number | undefined}; export type ModelScopeWeightsRequest = {aggregations?: ModelAggregations | undefined, cardinality_limit?: number | undefined, limit?: number | undefined, method?: string | undefined, options?: Array | undefined, scope?: ModelScope | undefined, selectors?: ModelSelectors | undefined, timeout?: number | undefined, window?: ModelWindow | undefined}; export type CreateApiApiV3SpacesSpaceIDRoomsRoomIDWeightsArgs = {spaceID: string, roomID: string, body: ModelScopeWeightsRequest}; export type CreateApiApiV3SpacesSpaceIDRoomsRoomIDWeightsOptions = {baseUrl: string, Bearer?: string | undefined, fetch?: typeof fetch | undefined}; export const modelTimings = z.object({adc_ms: z.number().optional(), adc_queue_wait_ms: z.number().optional(), cloud_ms: z.number().optional(), node_max_ms: z.number().optional(), output_ms: z.number().optional(), prep_ms: z.number().optional(), query_ms: z.number().optional(), routing_ms: z.number().optional(), total_ms: z.number().optional()}); export const modelAgentSummary = z.object({ai: z.number().int().optional(), claim_id: z.string().optional(), mg: z.string().optional(), nd: z.string().optional(), nm: z.string().optional(), timings: modelTimings.optional()}); export const modelWeightsDB = z.object({binary_searches: z.number().int().optional(), db_points_per_tier: z.array(z.number().int()).optional(), db_points_read: z.number().int().optional(), db_queries: z.number().int().optional(), query_result_points: z.number().int().optional(), query_time_ms: z.number().optional()}); export const modelWeightsContextSummary = z.object({ci: z.number().int().optional(), id: z.string().optional(), units: z.string().optional()}); export const modelWeightsDimensionSummary = z.object({di: z.number().int().optional(), id: z.string().optional()}); export const modelWeightsInstanceSummary = z.object({id: z.string().optional(), ii: z.number().int().optional()}); export const modelNodeStatus = z.object({ai: z.number().int().optional(), code: z.number().int().optional(), ms: z.number().optional(), msg: z.string().optional()}); export const modelWeightsNodeSummary = z.object({mg: z.string().optional(), nd: z.string().optional(), ni: z.number().int().optional(), nm: z.string().optional(), st: modelNodeStatus.optional()}); export const modelWeightsDictionaries = z.object({contexts: z.array(modelWeightsContextSummary).optional(), dimensions: z.array(modelWeightsDimensionSummary).optional(), instances: z.array(modelWeightsInstanceSummary).optional(), nodes: z.array(modelWeightsNodeSummary).optional()}); export const modelWeightsResultLimit = z.object({limit: z.number().int().optional(), returned: z.number().int().optional(), summary_scope: z.literal("all").optional(), total: z.number().int().optional(), truncated: z.boolean().optional(), unit: z.enum(["dimensions", "groups"]).optional()}); export const modelWeightsSchemaItem = z.object({calculations: z.record(z.string(), z.string()).optional(), dictionary: z.string().optional(), labels: z.array(z.string()).optional(), name: z.string().optional(), type: z.string().optional(), value: z.array(z.string()).optional()}); export const modelWeightsSchema = z.object({items: z.array(modelWeightsSchemaItem).optional(), type: z.string().optional()}); export const modelVersions = z.object({alerts_hard_hash: z.number().int().optional(), alerts_soft_hash: z.number().int().optional(), contexts_hard_hash: z.number().int().optional(), contexts_soft_hash: z.number().int().optional(), nodes_hard_hash: z.number().int().optional(), routing_hard_hash: z.number().int().optional()}); export const modelWindowSpan = z.object({after: z.number().int().optional(), before: z.number().int().optional(), duration: z.number().int().optional(), points: z.number().int().optional()}); export const modelWeightsView = z.object({baseline: modelWindowSpan.optional(), format: z.string().optional(), time_group: z.string().optional(), window: modelWindowSpan.optional()}); export const modelScopeWeightsResponse = z.object({agents: z.array(modelAgentSummary).optional(), api: z.number().int().optional(), correlated_dimensions: z.number().int().optional(), db: modelWeightsDB.optional(), dictionaries: modelWeightsDictionaries.optional(), request: z.array(z.number().int()).optional(), result: z.array(z.number().int()).optional(), result_limit: modelWeightsResultLimit.optional(), schema: modelWeightsSchema.optional(), total_dimensions_count: z.number().int().optional(), v_schema: modelWeightsSchema.optional(), versions: modelVersions.optional(), view: modelWeightsView.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 }; /** * Metric weights queries * * POST /api/v3/spaces/{spaceID}/rooms/{roomID}/weights */ export const createApiApiV3SpacesSpaceIDRoomsRoomIDWeights = async (args: CreateApiApiV3SpacesSpaceIDRoomsRoomIDWeightsArgs, options: CreateApiApiV3SpacesSpaceIDRoomsRoomIDWeightsOptions) => { const {baseUrl, fetch: fetchFn = fetch, Bearer} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('content-type', "application/json") headers.set('accept', "application/json") if (Bearer !== undefined) headers.set("Authorization", Bearer) const url = `${baseUrl.replace(/\/+$/, '')}/api/v3/spaces/${encodeURIComponent(String(args.spaceID))}/rooms/${encodeURIComponent(String(args.roomID))}/weights${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(modelScopeWeightsResponse, await res.json()) };