diff --git a/packages/back-end/generated/spec.yaml b/packages/back-end/generated/spec.yaml index 6879c0d47afe..99032f6f96dd 100644 --- a/packages/back-end/generated/spec.yaml +++ b/packages/back-end/generated/spec.yaml @@ -1204,6 +1204,21 @@ paths: type: string excludeFromPayload: type: boolean + inProgressConversions: + type: string + enum: + - loose + - strict + attributionModel: + type: string + enum: + - firstExposure + - experimentDuration + statsEngine: + type: string + enum: + - bayesian + - frequentist variations: type: array minItems: 2 diff --git a/packages/back-end/src/api/openapi/payload-schemas/UpdateExperimentPayload.yaml b/packages/back-end/src/api/openapi/payload-schemas/UpdateExperimentPayload.yaml index f31825ba96e1..b8ff3de44822 100644 --- a/packages/back-end/src/api/openapi/payload-schemas/UpdateExperimentPayload.yaml +++ b/packages/back-end/src/api/openapi/payload-schemas/UpdateExperimentPayload.yaml @@ -58,6 +58,21 @@ properties: type: string excludeFromPayload: type: boolean + inProgressConversions: + type: string + enum: + - loose + - strict + attributionModel: + type: string + enum: + - firstExposure + - experimentDuration + statsEngine: + type: string + enum: + - bayesian + - frequentist variations: type: array minItems: 2 diff --git a/packages/back-end/src/services/experiments.ts b/packages/back-end/src/services/experiments.ts index aab0ea0dd94e..a8d6eca40863 100644 --- a/packages/back-end/src/services/experiments.ts +++ b/packages/back-end/src/services/experiments.ts @@ -1853,6 +1853,9 @@ export function updateExperimentApiPayloadToInterface( variations, releasedVariationId, excludeFromPayload, + inProgressConversions, + attributionModel, + statsEngine, } = payload; return { ...(trackingKey ? { trackingKey } : {}), @@ -1871,6 +1874,11 @@ export function updateExperimentApiPayloadToInterface( ...(status ? { status } : {}), ...(releasedVariationId !== undefined ? { releasedVariationId } : {}), ...(excludeFromPayload !== undefined ? { excludeFromPayload } : {}), + ...(inProgressConversions !== undefined + ? { skipPartialData: inProgressConversions === "strict" } + : {}), + ...(attributionModel !== undefined ? { attributionModel } : {}), + ...(statsEngine !== undefined ? { statsEngine } : {}), ...(variations ? { variations: variations?.map((v) => ({ diff --git a/packages/back-end/src/validators/openapi.ts b/packages/back-end/src/validators/openapi.ts index 91b005c5d321..3b544485cb69 100644 --- a/packages/back-end/src/validators/openapi.ts +++ b/packages/back-end/src/validators/openapi.ts @@ -121,7 +121,7 @@ export const getExperimentValidator = { }; export const updateExperimentValidator = { - bodySchema: z.object({"assignmentQueryId":z.string().optional(),"trackingKey":z.string().optional(),"name":z.string().describe("Name of the experiment").optional(),"project":z.string().describe("Project ID which the experiment belongs to").optional(),"hypothesis":z.string().describe("Hypothesis of the experiment").optional(),"description":z.string().describe("Description of the experiment").optional(),"tags":z.array(z.string()).optional(),"metrics":z.array(z.string()).optional(),"guardrailMetrics":z.array(z.string()).optional(),"owner":z.string().describe("Email of the person who owns this experiment").optional(),"archived":z.boolean().optional(),"status":z.enum(["draft","running","stopped"]).optional(),"autoRefresh":z.boolean().optional(),"hashAttribute":z.string().optional(),"fallbackAttribute":z.string().optional(),"hashVersion":z.union([z.literal(1),z.literal(2)]).optional(),"disableStickyBucketing":z.any().optional(),"bucketVersion":z.number().optional(),"minBucketVersion":z.number().optional(),"releasedVariationId":z.string().optional(),"excludeFromPayload":z.boolean().optional(),"variations":z.array(z.object({"id":z.string().optional(),"key":z.string(),"name":z.string(),"description":z.string().optional(),"screenshots":z.array(z.object({"path":z.string(),"width":z.number().optional(),"height":z.number().optional(),"description":z.string().optional()})).optional()})).min(2).optional(),"phases":z.array(z.object({"name":z.string(),"dateStarted":z.string(),"dateEnded":z.string().optional(),"reasonForStopping":z.string().optional(),"seed":z.string().optional(),"coverage":z.number().optional(),"trafficSplit":z.array(z.object({"variationId":z.string(),"weight":z.number()})).optional(),"namespace":z.object({"namespaceId":z.string(),"range":z.array(z.number()).min(2).max(2),"enabled":z.boolean().optional()}).optional(),"targetingCondition":z.string().optional(),"reason":z.string().optional(),"condition":z.string().optional(),"savedGroupTargeting":z.array(z.object({"matchType":z.enum(["all","any","none"]),"savedGroups":z.array(z.string())})).optional(),"variationWeights":z.array(z.number()).optional()})).optional()}).strict(), + bodySchema: z.object({"assignmentQueryId":z.string().optional(),"trackingKey":z.string().optional(),"name":z.string().describe("Name of the experiment").optional(),"project":z.string().describe("Project ID which the experiment belongs to").optional(),"hypothesis":z.string().describe("Hypothesis of the experiment").optional(),"description":z.string().describe("Description of the experiment").optional(),"tags":z.array(z.string()).optional(),"metrics":z.array(z.string()).optional(),"guardrailMetrics":z.array(z.string()).optional(),"owner":z.string().describe("Email of the person who owns this experiment").optional(),"archived":z.boolean().optional(),"status":z.enum(["draft","running","stopped"]).optional(),"autoRefresh":z.boolean().optional(),"hashAttribute":z.string().optional(),"fallbackAttribute":z.string().optional(),"hashVersion":z.union([z.literal(1),z.literal(2)]).optional(),"disableStickyBucketing":z.any().optional(),"bucketVersion":z.number().optional(),"minBucketVersion":z.number().optional(),"releasedVariationId":z.string().optional(),"excludeFromPayload":z.boolean().optional(),"inProgressConversions":z.enum(["loose","strict"]).optional(),"attributionModel":z.enum(["firstExposure","experimentDuration"]).optional(),"statsEngine":z.enum(["bayesian","frequentist"]).optional(),"variations":z.array(z.object({"id":z.string().optional(),"key":z.string(),"name":z.string(),"description":z.string().optional(),"screenshots":z.array(z.object({"path":z.string(),"width":z.number().optional(),"height":z.number().optional(),"description":z.string().optional()})).optional()})).min(2).optional(),"phases":z.array(z.object({"name":z.string(),"dateStarted":z.string(),"dateEnded":z.string().optional(),"reasonForStopping":z.string().optional(),"seed":z.string().optional(),"coverage":z.number().optional(),"trafficSplit":z.array(z.object({"variationId":z.string(),"weight":z.number()})).optional(),"namespace":z.object({"namespaceId":z.string(),"range":z.array(z.number()).min(2).max(2),"enabled":z.boolean().optional()}).optional(),"targetingCondition":z.string().optional(),"reason":z.string().optional(),"condition":z.string().optional(),"savedGroupTargeting":z.array(z.object({"matchType":z.enum(["all","any","none"]),"savedGroups":z.array(z.string())})).optional(),"variationWeights":z.array(z.number()).optional()})).optional()}).strict(), querySchema: z.never(), paramsSchema: z.object({"id":z.string()}).strict(), }; diff --git a/packages/back-end/types/openapi.d.ts b/packages/back-end/types/openapi.d.ts index 77956e071a1d..cb694d593d9c 100644 --- a/packages/back-end/types/openapi.d.ts +++ b/packages/back-end/types/openapi.d.ts @@ -3472,6 +3472,12 @@ export interface operations { minBucketVersion?: number; releasedVariationId?: string; excludeFromPayload?: boolean; + /** @enum {string} */ + inProgressConversions?: "loose" | "strict"; + /** @enum {string} */ + attributionModel?: "firstExposure" | "experimentDuration"; + /** @enum {string} */ + statsEngine?: "bayesian" | "frequentist"; variations?: ({ id?: string; key: string;