/*
 * Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.
 */

import * as z from "zod/v3";
import { remap as remap$ } from "../../lib/primitives.js";
import { safeParse } from "../../lib/schemas.js";
import { ClosedEnum } from "../../types/enums.js";
import { Result as SafeParseResult } from "../../types/fp.js";
import { SDKValidationError } from "../errors/sdkvalidationerror.js";
import {
  Classifier,
  Classifier$inboundSchema,
  Classifier$Outbound,
  Classifier$outboundSchema,
} from "./classifier.js";
import {
  JudgeConfiguration,
  JudgeConfiguration$inboundSchema,
  JudgeConfiguration$Outbound,
  JudgeConfiguration$outboundSchema,
} from "./judgeconfiguration.js";
import {
  Message,
  Message$inboundSchema,
  Message$Outbound,
  Message$outboundSchema,
} from "./message.js";
import {
  ParentLink,
  ParentLink$inboundSchema,
  ParentLink$Outbound,
  ParentLink$outboundSchema,
} from "./parentlink.js";
import {
  VariationSkill,
  VariationSkill$inboundSchema,
  VariationSkill$Outbound,
  VariationSkill$outboundSchema,
} from "./variationskill.js";
import {
  VariationTool,
  VariationTool$inboundSchema,
  VariationTool$Outbound,
  VariationTool$outboundSchema,
} from "./variationtool.js";

/**
 * Freeform JSON object. LaunchDarkly does not validate the keys. In a model config, `params` and `customParams` hold parameters that the provider's API accepts, for example `{"temperature": 0.7, "maxTokens": 4096}`.
 */
export type AIConfigVariationModel = {};

/**
 * The state of the variation.
 *
 * @remarks
 * - `archived`: The variation is archived. To restore it, update the variation with `state` set to `published`.
 * - `published`: The variation is active.
 */
export const AIConfigVariationState = {
  Archived: "archived",
  Published: "published",
} as const;
/**
 * The state of the variation.
 *
 * @remarks
 * - `archived`: The variation is archived. To restore it, update the variation with `state` set to `published`.
 * - `published`: The variation is active.
 */
export type AIConfigVariationState = ClosedEnum<typeof AIConfigVariationState>;

export type AIConfigVariation = {
  links?: ParentLink | undefined;
  /**
   * The color used for this variation in the UI
   */
  color?: string | undefined;
  /**
   * Classifier rules for a judge variation. When this array is non-empty, messages must be empty.
   *
   * @remarks
   */
  classifiers?: Array<Classifier> | undefined;
  /**
   * A comment describing this version of the variation
   */
  comment?: string | undefined;
  /**
   * Returns the description for the agent. This is only returned for agent variations.
   */
  description?: string | undefined;
  /**
   * Returns the instructions for the agent. This is only returned for agent variations.
   */
  instructions?: string | undefined;
  /**
   * The variation key
   */
  key: string;
  /**
   * The variation ID
   */
  id: string;
  /**
   * The prompt messages for this variation
   */
  messages?: Array<Message> | undefined;
  /**
   * Freeform JSON object. LaunchDarkly does not validate the keys. In a model config, `params` and `customParams` hold parameters that the provider's API accepts, for example `{"temperature": 0.7, "maxTokens": 4096}`.
   */
  model: AIConfigVariationModel;
  /**
   * The key of the model config that this variation uses, not the provider model ID. Absent
   *
   * @remarks
   * when the variation does not use a model config.
   */
  modelConfigKey?: string | undefined;
  /**
   * The version of the model config that this variation is pinned to, when it references a
   *
   * @remarks
   * custom model config. Absent when the variation does not reference a model config, when
   * the variation is not pinned to a specific version, or when custom model config versioning
   * is not enabled for the project.
   */
  modelConfigVersion?: number | undefined;
  /**
   * The variation name
   */
  name: string;
  /**
   * JSON Schema defining the structured output format for the variation.
   */
  outputFormat?: { [k: string]: any } | undefined;
  createdAt: number;
  /**
   * The version number of this resource
   */
  version: number;
  /**
   * The state of the variation.
   *
   * @remarks
   * - `archived`: The variation is archived. To restore it, update the variation with `state` set to `published`.
   * - `published`: The variation is active.
   */
  state?: AIConfigVariationState | undefined;
  archivedAt?: number | undefined;
  publishedAt?: number | undefined;
  /**
   * The tools this variation can use
   */
  tools?: Array<VariationTool> | undefined;
  /**
   * The agent skills this variation can use
   */
  skills?: Array<VariationSkill> | undefined;
  judgeConfiguration?: JudgeConfiguration | undefined;
  /**
   * Keys of the judge AI Configs attached to this variation
   */
  judgingConfigKeys?: Array<string> | undefined;
};

/** @internal */
export const AIConfigVariationModel$inboundSchema: z.ZodType<
  AIConfigVariationModel,
  z.ZodTypeDef,
  unknown
> = z.object({});
/** @internal */
export type AIConfigVariationModel$Outbound = {};

/** @internal */
export const AIConfigVariationModel$outboundSchema: z.ZodType<
  AIConfigVariationModel$Outbound,
  z.ZodTypeDef,
  AIConfigVariationModel
> = z.object({});

export function aiConfigVariationModelToJSON(
  aiConfigVariationModel: AIConfigVariationModel,
): string {
  return JSON.stringify(
    AIConfigVariationModel$outboundSchema.parse(aiConfigVariationModel),
  );
}
export function aiConfigVariationModelFromJSON(
  jsonString: string,
): SafeParseResult<AIConfigVariationModel, SDKValidationError> {
  return safeParse(
    jsonString,
    (x) => AIConfigVariationModel$inboundSchema.parse(JSON.parse(x)),
    `Failed to parse 'AIConfigVariationModel' from JSON`,
  );
}

/** @internal */
export const AIConfigVariationState$inboundSchema: z.ZodNativeEnum<
  typeof AIConfigVariationState
> = z.nativeEnum(AIConfigVariationState);
/** @internal */
export const AIConfigVariationState$outboundSchema: z.ZodNativeEnum<
  typeof AIConfigVariationState
> = AIConfigVariationState$inboundSchema;

/** @internal */
export const AIConfigVariation$inboundSchema: z.ZodType<
  AIConfigVariation,
  z.ZodTypeDef,
  unknown
> = z.object({
  _links: ParentLink$inboundSchema.optional(),
  color: z.string().optional(),
  classifiers: z.array(Classifier$inboundSchema).optional(),
  comment: z.string().optional(),
  description: z.string().optional(),
  instructions: z.string().optional(),
  key: z.string(),
  _id: z.string(),
  messages: z.array(Message$inboundSchema).optional(),
  model: z.lazy(() => AIConfigVariationModel$inboundSchema),
  modelConfigKey: z.string().optional(),
  modelConfigVersion: z.number().int().optional(),
  name: z.string(),
  outputFormat: z.record(z.any()).optional(),
  createdAt: z.number().int(),
  version: z.number().int(),
  state: AIConfigVariationState$inboundSchema.optional(),
  _archivedAt: z.number().int().optional(),
  _publishedAt: z.number().int().optional(),
  tools: z.array(VariationTool$inboundSchema).optional(),
  skills: z.array(VariationSkill$inboundSchema).optional(),
  judgeConfiguration: JudgeConfiguration$inboundSchema.optional(),
  judgingConfigKeys: z.array(z.string()).optional(),
}).transform((v) => {
  return remap$(v, {
    "_links": "links",
    "_id": "id",
    "_archivedAt": "archivedAt",
    "_publishedAt": "publishedAt",
  });
});
/** @internal */
export type AIConfigVariation$Outbound = {
  _links?: ParentLink$Outbound | undefined;
  color?: string | undefined;
  classifiers?: Array<Classifier$Outbound> | undefined;
  comment?: string | undefined;
  description?: string | undefined;
  instructions?: string | undefined;
  key: string;
  _id: string;
  messages?: Array<Message$Outbound> | undefined;
  model: AIConfigVariationModel$Outbound;
  modelConfigKey?: string | undefined;
  modelConfigVersion?: number | undefined;
  name: string;
  outputFormat?: { [k: string]: any } | undefined;
  createdAt: number;
  version: number;
  state?: string | undefined;
  _archivedAt?: number | undefined;
  _publishedAt?: number | undefined;
  tools?: Array<VariationTool$Outbound> | undefined;
  skills?: Array<VariationSkill$Outbound> | undefined;
  judgeConfiguration?: JudgeConfiguration$Outbound | undefined;
  judgingConfigKeys?: Array<string> | undefined;
};

/** @internal */
export const AIConfigVariation$outboundSchema: z.ZodType<
  AIConfigVariation$Outbound,
  z.ZodTypeDef,
  AIConfigVariation
> = z.object({
  links: ParentLink$outboundSchema.optional(),
  color: z.string().optional(),
  classifiers: z.array(Classifier$outboundSchema).optional(),
  comment: z.string().optional(),
  description: z.string().optional(),
  instructions: z.string().optional(),
  key: z.string(),
  id: z.string(),
  messages: z.array(Message$outboundSchema).optional(),
  model: z.lazy(() => AIConfigVariationModel$outboundSchema),
  modelConfigKey: z.string().optional(),
  modelConfigVersion: z.number().int().optional(),
  name: z.string(),
  outputFormat: z.record(z.any()).optional(),
  createdAt: z.number().int(),
  version: z.number().int(),
  state: AIConfigVariationState$outboundSchema.optional(),
  archivedAt: z.number().int().optional(),
  publishedAt: z.number().int().optional(),
  tools: z.array(VariationTool$outboundSchema).optional(),
  skills: z.array(VariationSkill$outboundSchema).optional(),
  judgeConfiguration: JudgeConfiguration$outboundSchema.optional(),
  judgingConfigKeys: z.array(z.string()).optional(),
}).transform((v) => {
  return remap$(v, {
    links: "_links",
    id: "_id",
    archivedAt: "_archivedAt",
    publishedAt: "_publishedAt",
  });
});

export function aiConfigVariationToJSON(
  aiConfigVariation: AIConfigVariation,
): string {
  return JSON.stringify(
    AIConfigVariation$outboundSchema.parse(aiConfigVariation),
  );
}
export function aiConfigVariationFromJSON(
  jsonString: string,
): SafeParseResult<AIConfigVariation, SDKValidationError> {
  return safeParse(
    jsonString,
    (x) => AIConfigVariation$inboundSchema.parse(JSON.parse(x)),
    `Failed to parse 'AIConfigVariation' from JSON`,
  );
}
