import {z} from 'zod' export type ExperimentsPatchProtocolAnalysisPlanInput = {compute_cuped?: (boolean | null) | undefined, confidence_interval_method?: (string | null) | undefined, confidence_level?: (number | null) | undefined, multiple_testing_correction_method?: (string | null) | undefined} | null; export type ExperimentsPublicProtocolResponseDataAttributesAssignmentSourceDefaultPropertiesItems = {column_name?: string | undefined, column_type?: string | undefined, name?: string | undefined}; export type ExperimentsPatchProtocolEnforcementInput = {confidence_interval_method?: (string | null) | undefined, confidence_level?: (string | null) | undefined, cuped_calculation?: (string | null) | undefined, default_duration?: (string | null) | undefined, environment?: (string | null) | undefined, flag_source?: (string | null) | undefined, multiple_testing_correction?: (string | null) | undefined, notifications?: (string | null) | undefined, primary_metric?: (string | null) | undefined, secondary_metrics?: (string | null) | undefined, split_by_exploration_dimensions?: (string | null) | undefined, subject_type?: (string | null) | undefined, targeting_rules?: (string | null) | undefined, traffic_exposure?: (string | null) | undefined, warehouse_exposure_source?: (string | null) | undefined} | null; export type ExperimentsProtocolExposureStepInput = {exposure_ratio?: number | undefined, grouped_step_index?: (number | null) | undefined, interval_ms?: (number | null) | undefined, is_pause_record?: boolean | undefined, order_position?: number | undefined}; export type ExperimentsPatchProtocolExposureScheduleInput = {autostart?: (boolean | null) | undefined, guardrail_triggered_action?: (string | null) | undefined, rollout_steps?: (Array | null) | undefined, selection_interval_ms?: (number | null) | undefined, strategy?: (string | null) | undefined} | null; export type ExperimentsProtocolMetricInput = {metric_id: string}; export type ExperimentsProtocolMetricGroupInput = {is_decision?: boolean | undefined, metrics?: (Array | null) | undefined, name?: string | undefined}; export type ExperimentsProtocolConditionInput = {attribute?: string | undefined, operator?: string | undefined, order_position?: number | undefined, saved_filter_id?: (string | null) | undefined, value?: (Array | null) | undefined}; export type ExperimentsProtocolTargetingRuleInput = {conditions?: (Array | null) | undefined}; export type ExperimentsPatchExperimentProtocolRequestDataAttributes = {analysis_plan?: ExperimentsPatchProtocolAnalysisPlanInput | undefined, assignment_source_default_properties?: (Array | null) | undefined, assignment_source_id?: (string | null) | undefined, default_duration_days?: (number | null) | undefined, description?: (string | null) | undefined, enforcement?: ExperimentsPatchProtocolEnforcementInput | undefined, environment_id?: (string | null) | undefined, exposure_schedule?: ExperimentsPatchProtocolExposureScheduleInput | undefined, is_duration_required_to_start?: (boolean | null) | undefined, is_equal_split_enforced?: (boolean | null) | undefined, is_metric_limit_enabled?: (boolean | null) | undefined, is_minimum_duration_enabled?: (boolean | null) | undefined, metric_groups?: (Array | null) | undefined, metric_limit?: (number | null) | undefined, migration_metadata?: ({[key: string]: unknown} | null) | undefined, minimum_duration_unit?: (string | null) | undefined, minimum_duration_value?: (number | null) | undefined, name?: (string | null) | undefined, primary_metric_id?: (string | null) | undefined, subject_type_id?: (string | null) | undefined, targeting_rules?: (Array | null) | undefined}; export type ExperimentsPublicProtocolResponseDataType = 'protocols'; export type ExperimentsPatchExperimentProtocolRequestData = {attributes?: ExperimentsPatchExperimentProtocolRequestDataAttributes | undefined, id?: string | undefined, type: ExperimentsPublicProtocolResponseDataType}; export type ExperimentsPatchExperimentProtocolRequest = {data: ExperimentsPatchExperimentProtocolRequestData}; export type PatchApiApiV2ExperimentsProtocolsProtocolIdArgs = {protocol_id: string, body: ExperimentsPatchExperimentProtocolRequest}; export type PatchApiApiV2ExperimentsProtocolsProtocolIdOptions = {baseUrl?: string | undefined, apiKeyAuth?: string | undefined, appKeyAuth?: string | undefined, fetch?: typeof fetch | undefined}; export const experimentsPublicProtocolResponseDataAttributesAnalysisPlan = z.object({compute_cuped: z.boolean().optional(), confidence_interval_method: z.string().optional(), confidence_level: z.number().optional(), multiple_testing_correction_method: z.string().optional()}); export const experimentsPublicProtocolResponseDataAttributesAssignmentSourceDefaultPropertiesItems = z.object({column_name: z.string().optional(), column_type: z.string().optional(), name: z.string().optional()}); export const experimentsPublicProtocolResponseDataAttributesEnforcement = z.object({confidence_interval_method: z.string().optional(), confidence_level: z.string().optional(), cuped_calculation: z.string().optional(), default_duration: z.string().optional(), environment: z.string().optional(), flag_source: z.string().optional(), multiple_testing_correction: z.string().optional(), notifications: z.string().optional(), primary_metric: z.string().optional(), secondary_metrics: z.string().optional(), split_by_exploration_dimensions: z.string().optional(), subject_type: z.string().optional(), targeting_rules: z.string().optional(), traffic_exposure: z.string().optional(), warehouse_exposure_source: z.string().optional()}); export const experimentsPublicProtocolResponseDataAttributesExposureScheduleRolloutStepsItems = z.object({exposure_ratio: z.number().optional(), grouped_step_index: z.number().int().optional(), interval_ms: z.number().int().optional(), is_pause_record: z.boolean().optional(), order_position: z.number().int().optional()}); export const experimentsPublicProtocolResponseDataAttributesExposureSchedule = z.object({autostart: z.boolean().optional(), guardrail_triggered_action: z.string().optional(), rollout_steps: z.array(experimentsPublicProtocolResponseDataAttributesExposureScheduleRolloutStepsItems).optional(), selection_interval_ms: z.number().int().optional(), strategy: z.string().optional()}); export const experimentsCreateMetricCollectionV2RequestDataAttributesMetricsItems = z.object({metric_id: z.string()}); export const experimentsPublicProtocolResponseDataAttributesMetricGroupsItems = z.object({is_decision: z.boolean().optional(), metrics: z.array(experimentsCreateMetricCollectionV2RequestDataAttributesMetricsItems).optional(), name: z.string().optional()}); export const experimentsPublicProtocolResponseDataAttributesSubjectType = z.object({id: z.string().optional(), name: z.string().optional()}); export const experimentsPublicProtocolResponseDataAttributesStatus = z.enum(["DRAFT", "PUBLISHED", "ARCHIVED"]); export const experimentsPublicProtocolResponseDataAttributesTargetingRulesItemsConditionsItems = z.object({attribute: z.string().optional(), operator: z.string().optional(), order_position: z.number().int().optional(), saved_filter_id: z.string().optional(), value: z.array(z.string()).optional()}); export const experimentsPublicProtocolResponseDataAttributesTargetingRulesItems = z.object({conditions: z.array(experimentsPublicProtocolResponseDataAttributesTargetingRulesItemsConditionsItems).optional()}); export const experimentsPublicProtocolResponseDataAttributes = z.object({analysis_plan: experimentsPublicProtocolResponseDataAttributesAnalysisPlan.optional(), archived_at: z.string().optional(), assignment_source_default_properties: z.array(experimentsPublicProtocolResponseDataAttributesAssignmentSourceDefaultPropertiesItems).optional(), assignment_source_id: z.string().optional(), created_at: z.string(), default_duration_days: z.number().int().optional(), description: z.string().optional(), enforcement: experimentsPublicProtocolResponseDataAttributesEnforcement.optional(), environment_id: z.string().optional(), experiment_count: z.number().int().gte(0).optional(), exposure_schedule: experimentsPublicProtocolResponseDataAttributesExposureSchedule.optional(), is_duration_required_to_start: z.boolean(), is_equal_split_enforced: z.boolean(), is_metric_limit_enabled: z.boolean(), is_minimum_duration_enabled: z.boolean(), metric_groups: z.array(experimentsPublicProtocolResponseDataAttributesMetricGroupsItems), metric_limit: z.number().int().optional(), migration_metadata: z.unknown(), minimum_duration_unit: z.string().optional(), minimum_duration_value: z.number().int().optional(), name: z.string(), primary_metric: experimentsPublicProtocolResponseDataAttributesSubjectType.optional(), primary_metric_id: z.string().optional(), published_at: z.string().optional(), status: experimentsPublicProtocolResponseDataAttributesStatus, subject_type: experimentsPublicProtocolResponseDataAttributesSubjectType.optional(), subject_type_id: z.string().optional(), targeting_rules: z.array(experimentsPublicProtocolResponseDataAttributesTargetingRulesItems).optional(), updated_at: z.string()}); export const experimentsPublicProtocolResponseDataType = z.literal("protocols"); export const experimentsPublicProtocolResponseData = z.object({attributes: experimentsPublicProtocolResponseDataAttributes.optional(), id: z.string(), type: experimentsPublicProtocolResponseDataType}); export const experimentsPublicProtocolResponse = z.object({data: experimentsPublicProtocolResponseData}); 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 experiment protocol * * PATCH /api/v2/experiments/protocols/{protocol_id} * * Also accepts auth: AuthZ */ export const patchApiApiV2ExperimentsProtocolsProtocolId = async (args: PatchApiApiV2ExperimentsProtocolsProtocolIdArgs, options?: PatchApiApiV2ExperimentsProtocolsProtocolIdOptions) => { const {baseUrl = "https://api.datadoghq.com", fetch: fetchFn = fetch, apiKeyAuth, appKeyAuth} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('content-type', "application/json") headers.set('accept', "application/json") if (apiKeyAuth !== undefined) headers.set("DD-API-KEY", apiKeyAuth) if (appKeyAuth !== undefined) headers.set("DD-APPLICATION-KEY", appKeyAuth) const url = `${baseUrl.replace(/\/+$/, '')}/api/v2/experiments/protocols/${encodeURIComponent(String(args.protocol_id))}${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "PATCH", 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(experimentsPublicProtocolResponse, await res.json()) };