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

import * as z from "zod/v4";
import { remap as remap$ } from "../../lib/primitives.js";
import { smartUnion } from "../../types/smartUnion.js";
import {
  AssistantMessage,
  AssistantMessage$Outbound,
  AssistantMessage$outboundSchema,
} from "./assistantmessage.js";
import {
  CodeInterpreterTool,
  CodeInterpreterTool$Outbound,
  CodeInterpreterTool$outboundSchema,
} from "./codeinterpretertool.js";
import {
  CustomConnector,
  CustomConnector$Outbound,
  CustomConnector$outboundSchema,
} from "./customconnector.js";
import {
  DocumentLibraryTool,
  DocumentLibraryTool$Outbound,
  DocumentLibraryTool$outboundSchema,
} from "./documentlibrarytool.js";
import {
  GuardrailConfig,
  GuardrailConfig$Outbound,
  GuardrailConfig$outboundSchema,
} from "./guardrailconfig.js";
import {
  ImageGenerationTool,
  ImageGenerationTool$Outbound,
  ImageGenerationTool$outboundSchema,
} from "./imagegenerationtool.js";
import {
  MistralPromptMode,
  MistralPromptMode$outboundSchema,
} from "./mistralpromptmode.js";
import {
  Prediction,
  Prediction$Outbound,
  Prediction$outboundSchema,
} from "./prediction.js";
import {
  ReasoningEffort,
  ReasoningEffort$outboundSchema,
} from "./reasoningeffort.js";
import {
  ResponseFormat,
  ResponseFormat$Outbound,
  ResponseFormat$outboundSchema,
} from "./responseformat.js";
import {
  SystemMessage,
  SystemMessage$Outbound,
  SystemMessage$outboundSchema,
} from "./systemmessage.js";
import { Tool, Tool$Outbound, Tool$outboundSchema } from "./tool.js";
import {
  ToolChoice,
  ToolChoice$Outbound,
  ToolChoice$outboundSchema,
} from "./toolchoice.js";
import {
  ToolChoiceEnum,
  ToolChoiceEnum$outboundSchema,
} from "./toolchoiceenum.js";
import {
  ToolMessage,
  ToolMessage$Outbound,
  ToolMessage$outboundSchema,
} from "./toolmessage.js";
import {
  UserMessage,
  UserMessage$Outbound,
  UserMessage$outboundSchema,
} from "./usermessage.js";
import {
  WebSearchPremiumTool,
  WebSearchPremiumTool$Outbound,
  WebSearchPremiumTool$outboundSchema,
} from "./websearchpremiumtool.js";
import {
  WebSearchTool,
  WebSearchTool$Outbound,
  WebSearchTool$outboundSchema,
} from "./websearchtool.js";

/**
 * Stop generation if this token is detected. Or if one of these tokens is detected when providing an array
 */
export type AgentsCompletionRequestStop = string | Array<string>;

export type AgentsCompletionRequestMessage =
  | (AssistantMessage & { role: "assistant" })
  | SystemMessage
  | ToolMessage
  | UserMessage;

export type AgentsCompletionRequestTool =
  | Tool
  | WebSearchTool
  | WebSearchPremiumTool
  | CodeInterpreterTool
  | ImageGenerationTool
  | DocumentLibraryTool
  | CustomConnector;

export type AgentsCompletionRequestToolChoice = ToolChoice | ToolChoiceEnum;

export type AgentsCompletionRequest = {
  /**
   * The maximum number of tokens to generate in the completion. The token count of your prompt plus `max_tokens` cannot exceed the model's context length.
   */
  maxTokens?: number | null | undefined;
  /**
   * Whether to stream back partial progress. If set, tokens will be sent as data-only server-side events as they become available, with the stream terminated by a data: [DONE] message. Otherwise, the server will hold the request open until the timeout or until completion, with the response containing the full result as JSON.
   */
  stream?: boolean | undefined;
  /**
   * Stop generation if this token is detected. Or if one of these tokens is detected when providing an array
   */
  stop?: string | Array<string> | null | undefined;
  /**
   * The seed to use for random sampling. If set, different calls will generate deterministic results.
   */
  randomSeed?: number | null | undefined;
  metadata?: { [k: string]: any } | null | undefined;
  /**
   * The prompt(s) to generate completions for, encoded as a list of dict with role and content.
   */
  messages: Array<
    | (AssistantMessage & { role: "assistant" })
    | SystemMessage
    | ToolMessage
    | UserMessage
  >;
  /**
   * Specify the format that the model must output. By default it will use `{ "type": "text" }`. Setting to `{ "type": "json_object" }` enables JSON mode, which guarantees the message the model generates is in JSON. When using JSON mode you MUST also instruct the model to produce JSON yourself with a system or a user message. Setting to `{ "type": "json_schema" }` enables JSON schema mode, which guarantees the message the model generates is in JSON and follows the schema you provide.
   */
  responseFormat?: ResponseFormat | undefined;
  tools?:
    | Array<
      | Tool
      | WebSearchTool
      | WebSearchPremiumTool
      | CodeInterpreterTool
      | ImageGenerationTool
      | DocumentLibraryTool
      | CustomConnector
    >
    | null
    | undefined;
  toolChoice?: ToolChoice | ToolChoiceEnum | undefined;
  /**
   * The `presence_penalty` determines how much the model penalizes the repetition of words or phrases. A higher presence penalty encourages the model to use a wider variety of words and phrases, making the output more diverse and creative.
   */
  presencePenalty?: number | null | undefined;
  /**
   * The `frequency_penalty` penalizes the repetition of words based on their frequency in the generated text. A higher frequency penalty discourages the model from repeating words that have already appeared frequently in the output, promoting diversity and reducing repetition.
   */
  frequencyPenalty?: number | null | undefined;
  /**
   * Number of completions to return for each request, input tokens are only billed once.
   */
  n?: number | null | undefined;
  /**
   * Enable users to specify an expected completion, optimizing response times by leveraging known or predictable content.
   */
  prediction?: Prediction | undefined;
  parallelToolCalls?: boolean | undefined;
  reasoningEffort?: ReasoningEffort | null | undefined;
  /**
   * Allows toggling between the reasoning mode and no system prompt. When set to `reasoning` the system prompt for reasoning models will be used.
   */
  promptMode?: MistralPromptMode | null | undefined;
  guardrails?: Array<GuardrailConfig> | null | undefined;
  promptCacheKey?: string | null | undefined;
  /**
   * The ID of the agent to use for this completion.
   */
  agentId: string;
};

/** @internal */
export type AgentsCompletionRequestStop$Outbound = string | Array<string>;

/** @internal */
export const AgentsCompletionRequestStop$outboundSchema: z.ZodType<
  AgentsCompletionRequestStop$Outbound,
  AgentsCompletionRequestStop
> = smartUnion([z.string(), z.array(z.string())]);

export function agentsCompletionRequestStopToJSON(
  agentsCompletionRequestStop: AgentsCompletionRequestStop,
): string {
  return JSON.stringify(
    AgentsCompletionRequestStop$outboundSchema.parse(
      agentsCompletionRequestStop,
    ),
  );
}

/** @internal */
export type AgentsCompletionRequestMessage$Outbound =
  | (AssistantMessage$Outbound & { role: "assistant" })
  | SystemMessage$Outbound
  | ToolMessage$Outbound
  | UserMessage$Outbound;

/** @internal */
export const AgentsCompletionRequestMessage$outboundSchema: z.ZodType<
  AgentsCompletionRequestMessage$Outbound,
  AgentsCompletionRequestMessage
> = z.union([
  AssistantMessage$outboundSchema.and(
    z.object({ role: z.literal("assistant") }),
  ),
  SystemMessage$outboundSchema,
  ToolMessage$outboundSchema,
  UserMessage$outboundSchema,
]);

export function agentsCompletionRequestMessageToJSON(
  agentsCompletionRequestMessage: AgentsCompletionRequestMessage,
): string {
  return JSON.stringify(
    AgentsCompletionRequestMessage$outboundSchema.parse(
      agentsCompletionRequestMessage,
    ),
  );
}

/** @internal */
export type AgentsCompletionRequestTool$Outbound =
  | Tool$Outbound
  | WebSearchTool$Outbound
  | WebSearchPremiumTool$Outbound
  | CodeInterpreterTool$Outbound
  | ImageGenerationTool$Outbound
  | DocumentLibraryTool$Outbound
  | CustomConnector$Outbound;

/** @internal */
export const AgentsCompletionRequestTool$outboundSchema: z.ZodType<
  AgentsCompletionRequestTool$Outbound,
  AgentsCompletionRequestTool
> = z.union([
  Tool$outboundSchema,
  WebSearchTool$outboundSchema,
  WebSearchPremiumTool$outboundSchema,
  CodeInterpreterTool$outboundSchema,
  ImageGenerationTool$outboundSchema,
  DocumentLibraryTool$outboundSchema,
  CustomConnector$outboundSchema,
]);

export function agentsCompletionRequestToolToJSON(
  agentsCompletionRequestTool: AgentsCompletionRequestTool,
): string {
  return JSON.stringify(
    AgentsCompletionRequestTool$outboundSchema.parse(
      agentsCompletionRequestTool,
    ),
  );
}

/** @internal */
export type AgentsCompletionRequestToolChoice$Outbound =
  | ToolChoice$Outbound
  | string;

/** @internal */
export const AgentsCompletionRequestToolChoice$outboundSchema: z.ZodType<
  AgentsCompletionRequestToolChoice$Outbound,
  AgentsCompletionRequestToolChoice
> = smartUnion([ToolChoice$outboundSchema, ToolChoiceEnum$outboundSchema]);

export function agentsCompletionRequestToolChoiceToJSON(
  agentsCompletionRequestToolChoice: AgentsCompletionRequestToolChoice,
): string {
  return JSON.stringify(
    AgentsCompletionRequestToolChoice$outboundSchema.parse(
      agentsCompletionRequestToolChoice,
    ),
  );
}

/** @internal */
export type AgentsCompletionRequest$Outbound = {
  max_tokens?: number | null | undefined;
  stream: boolean;
  stop?: string | Array<string> | null | undefined;
  random_seed?: number | null | undefined;
  metadata?: { [k: string]: any } | null | undefined;
  messages: Array<
    | (AssistantMessage$Outbound & { role: "assistant" })
    | SystemMessage$Outbound
    | ToolMessage$Outbound
    | UserMessage$Outbound
  >;
  response_format?: ResponseFormat$Outbound | undefined;
  tools?:
    | Array<
      | Tool$Outbound
      | WebSearchTool$Outbound
      | WebSearchPremiumTool$Outbound
      | CodeInterpreterTool$Outbound
      | ImageGenerationTool$Outbound
      | DocumentLibraryTool$Outbound
      | CustomConnector$Outbound
    >
    | null
    | undefined;
  tool_choice?: ToolChoice$Outbound | string | undefined;
  presence_penalty?: number | null | undefined;
  frequency_penalty?: number | null | undefined;
  n?: number | null | undefined;
  prediction?: Prediction$Outbound | undefined;
  parallel_tool_calls?: boolean | undefined;
  reasoning_effort?: string | null | undefined;
  prompt_mode?: string | null | undefined;
  guardrails?: Array<GuardrailConfig$Outbound> | null | undefined;
  prompt_cache_key?: string | null | undefined;
  agent_id: string;
};

/** @internal */
export const AgentsCompletionRequest$outboundSchema: z.ZodType<
  AgentsCompletionRequest$Outbound,
  AgentsCompletionRequest
> = z.object({
  maxTokens: z.nullable(z.int()).optional(),
  stream: z.boolean().default(false),
  stop: z.nullable(smartUnion([z.string(), z.array(z.string())])).optional(),
  randomSeed: z.nullable(z.int()).optional(),
  metadata: z.nullable(z.record(z.string(), z.any())).optional(),
  messages: z.array(
    z.union([
      AssistantMessage$outboundSchema.and(
        z.object({ role: z.literal("assistant") }),
      ),
      SystemMessage$outboundSchema,
      ToolMessage$outboundSchema,
      UserMessage$outboundSchema,
    ]),
  ),
  responseFormat: ResponseFormat$outboundSchema.optional(),
  tools: z.nullable(
    z.array(
      z.union([
        Tool$outboundSchema,
        WebSearchTool$outboundSchema,
        WebSearchPremiumTool$outboundSchema,
        CodeInterpreterTool$outboundSchema,
        ImageGenerationTool$outboundSchema,
        DocumentLibraryTool$outboundSchema,
        CustomConnector$outboundSchema,
      ]),
    ),
  ).optional(),
  toolChoice: smartUnion([
    ToolChoice$outboundSchema,
    ToolChoiceEnum$outboundSchema,
  ]).optional(),
  presencePenalty: z.nullable(z.number()).optional(),
  frequencyPenalty: z.nullable(z.number()).optional(),
  n: z.nullable(z.int()).optional(),
  prediction: Prediction$outboundSchema.optional(),
  parallelToolCalls: z.boolean().optional(),
  reasoningEffort: z.nullable(ReasoningEffort$outboundSchema).optional(),
  promptMode: z.nullable(MistralPromptMode$outboundSchema).optional(),
  guardrails: z.nullable(z.array(GuardrailConfig$outboundSchema)).optional(),
  promptCacheKey: z.nullable(z.string()).optional(),
  agentId: z.string(),
}).transform((v) => {
  return remap$(v, {
    maxTokens: "max_tokens",
    randomSeed: "random_seed",
    responseFormat: "response_format",
    toolChoice: "tool_choice",
    presencePenalty: "presence_penalty",
    frequencyPenalty: "frequency_penalty",
    parallelToolCalls: "parallel_tool_calls",
    reasoningEffort: "reasoning_effort",
    promptMode: "prompt_mode",
    promptCacheKey: "prompt_cache_key",
    agentId: "agent_id",
  });
});

export function agentsCompletionRequestToJSON(
  agentsCompletionRequest: AgentsCompletionRequest,
): string {
  return JSON.stringify(
    AgentsCompletionRequest$outboundSchema.parse(agentsCompletionRequest),
  );
}
