import { type Pipeable } from "../../Pipeable.ts";
import * as Schema from "../../Schema.ts";
import type * as Response from "./Response.ts";
/**
 * Schema for provider-specific options that can be attached to content parts
 * and messages.
 *
 * **Details**
 *
 * Provider-specific options are keyed by provider-specific names, and each
 * value is JSON or `null`.
 *
 * @category options
 * @since 4.0.0
 */
export declare const ProviderOptions: Schema.$Record<Schema.String, Schema.NullOr<Schema.Codec<Schema.Json>>>;
/**
 * Type of provider-specific options that can be attached to prompt messages
 * and content parts.
 *
 * @category options
 * @since 4.0.0
 */
export type ProviderOptions = typeof ProviderOptions.Type;
declare const PartTypeId: "~effect/ai/Prompt/Part";
/**
 * Type guard to check if a value is a Part.
 *
 * @category guards
 * @since 4.0.0
 */
export declare const isPart: (u: unknown) => u is Part;
/**
 * Union type representing all possible content parts within messages.
 *
 * **Details**
 *
 * Parts are the building blocks of message content, supporting text, files,
 * reasoning, tool calls, tool results, tool approval responses, and tool
 * approval requests.
 *
 * @category models
 * @since 4.0.0
 */
export type Part = TextPart | ReasoningPart | FilePart | ToolCallPart | ToolResultPart | ToolApprovalResponsePart | ToolApprovalRequestPart;
/**
 * Encoded representation of a Part.
 *
 * @category models
 * @since 4.0.0
 */
export type PartEncoded = TextPartEncoded | ReasoningPartEncoded | FilePartEncoded | ToolCallPartEncoded | ToolResultPartEncoded | ToolApprovalResponsePartEncoded | ToolApprovalRequestPartEncoded;
/**
 * Base interface for all content parts.
 *
 * **Details**
 *
 * It provides the common structure shared by all content parts, including the
 * part type and provider options.
 *
 * @category models
 * @since 4.0.0
 */
export interface BasePart<Type extends string, Options extends ProviderOptions> {
    readonly [PartTypeId]: typeof PartTypeId;
    /**
     * The type of this content part.
     */
    readonly type: Type;
    /**
     * Provider-specific options for this part.
     */
    readonly options: Options;
}
/**
 * Base interface for encoded content parts.
 *
 * @category models
 * @since 4.0.0
 */
export interface BasePartEncoded<Type extends string, Options extends ProviderOptions> {
    /**
     * The type of this content part.
     */
    readonly type: Type;
    /**
     * Provider-specific options for this part.
     */
    readonly options?: Options | undefined;
}
/**
 * Creates a new content part of the specified type.
 *
 * **Example** (Creating content parts)
 *
 * ```ts
 * import { Prompt } from "effect/unstable/ai"
 *
 * const textPart = Prompt.makePart("text", {
 *   text: "Hello, world!"
 * })
 *
 * const filePart = Prompt.makePart("file", {
 *   mediaType: "image/png",
 *   fileName: "screenshot.png",
 *   data: new Uint8Array([1, 2, 3])
 * })
 * ```
 *
 * @category constructors
 * @since 4.0.0
 */
export declare const makePart: <const Type extends Part["type"]>(
/**
 * The type of part to create.
 */
type: Type, 
/**
 * Parameters specific to the part type being created.
 */
params: Omit<Extract<Part, {
    type: Type;
}>, typeof PartTypeId | "type" | "options"> & {
    /**
     * Optional provider-specific options for this part.
     */
    readonly options?: Extract<Part, {
        type: Type;
    }>["options"] | undefined;
}) => Extract<Part, {
    type: Type;
}>;
/**
 * A utility type for specifying the parameters required to construct a
 * specific part of a prompt.
 *
 * @category utility types
 * @since 4.0.0
 */
export type PartConstructorParams<P extends Part> = Omit<P, typeof PartTypeId | "type" | "options"> & {
    /**
     * Optional provider-specific options for this part.
     */
    readonly options?: Part["options"] | undefined;
};
/**
 * Content part representing plain text.
 *
 * **Details**
 *
 * Text parts are the basic content type used for textual information in
 * messages.
 *
 * **Example** (Creating text parts)
 *
 * ```ts
 * import { Prompt } from "effect/unstable/ai"
 *
 * const textPart: Prompt.TextPart = Prompt.makePart("text", {
 *   text: "Hello, how can I help you today?"
 * })
 * ```
 *
 * @category models
 * @since 4.0.0
 */
export interface TextPart extends BasePart<"text", TextPartOptions> {
    /**
     * The text content.
     */
    readonly text: string;
}
/**
 * Encoded representation of text parts for serialization.
 *
 * @category models
 * @since 4.0.0
 */
export interface TextPartEncoded extends BasePartEncoded<"text", TextPartOptions> {
    /**
     * The text content.
     */
    readonly text: string;
}
/**
 * Represents provider-specific options that can be associated with a
 * `TextPart` through module augmentation.
 *
 * @category options
 * @since 4.0.0
 */
export interface TextPartOptions extends ProviderOptions {
}
/**
 * Schema for validation and encoding of text parts.
 *
 * @category schemas
 * @since 4.0.0
 */
export declare const TextPart: Schema.Struct<{
    readonly type: Schema.Literal<"text">;
    readonly text: Schema.String;
    readonly "~effect/ai/Prompt/Part": Schema.withDecodingDefaultKey<Schema.Literal<"~effect/ai/Prompt/Part">>;
    readonly options: Schema.withDecodingDefault<Schema.$Record<Schema.String, Schema.NullOr<Schema.Codec<Schema.Json>>>>;
}>;
/**
 * Constructs a new text part.
 *
 * @category constructors
 * @since 4.0.0
 */
export declare const textPart: (params: PartConstructorParams<TextPart>) => TextPart;
/**
 * Content part carrying reasoning text in an assistant message, such as a
 * provider-supplied reasoning summary or explanation.
 *
 * **Example** (Creating reasoning parts)
 *
 * ```ts
 * import { Prompt } from "effect/unstable/ai"
 *
 * const reasoningPart: Prompt.ReasoningPart = Prompt.makePart("reasoning", {
 *   text:
 *     "Summary: the response compares the requested options by price and availability."
 * })
 * ```
 *
 * @category models
 * @since 4.0.0
 */
export interface ReasoningPart extends BasePart<"reasoning", ReasoningPartOptions> {
    /**
     * The reasoning or thought process text.
     */
    readonly text: string;
}
/**
 * Encoded representation of reasoning parts for serialization.
 *
 * @category models
 * @since 4.0.0
 */
export interface ReasoningPartEncoded extends BasePartEncoded<"reasoning", ReasoningPartOptions> {
    /**
     * The reasoning or thought process text.
     */
    readonly text: string;
}
/**
 * Represents provider-specific options that can be associated with a
 * `ReasoningPart` through module augmentation.
 *
 * @category options
 * @since 4.0.0
 */
export interface ReasoningPartOptions extends ProviderOptions {
}
/**
 * Schema for validation and encoding of reasoning parts.
 *
 * @category schemas
 * @since 4.0.0
 */
export declare const ReasoningPart: Schema.Struct<{
    readonly type: Schema.Literal<"reasoning">;
    readonly text: Schema.String;
    readonly "~effect/ai/Prompt/Part": Schema.withDecodingDefaultKey<Schema.Literal<"~effect/ai/Prompt/Part">>;
    readonly options: Schema.withDecodingDefault<Schema.$Record<Schema.String, Schema.NullOr<Schema.Codec<Schema.Json>>>>;
}>;
/**
 * Constructs a new reasoning part.
 *
 * @category constructors
 * @since 4.0.0
 */
export declare const reasoningPart: (params: PartConstructorParams<ReasoningPart>) => ReasoningPart;
/**
 * Content part representing a file attachment.
 *
 * **Details**
 *
 * Files can be provided as base64 data strings, byte arrays, or URLs, and can
 * represent images, documents, or other binary data.
 *
 * **Example** (Creating file parts)
 *
 * ```ts
 * import { Prompt } from "effect/unstable/ai"
 *
 * const imagePart: Prompt.FilePart = Prompt.makePart("file", {
 *   mediaType: "image/jpeg",
 *   fileName: "photo.jpg",
 *   data: "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQ..."
 * })
 *
 * const documentPart: Prompt.FilePart = Prompt.makePart("file", {
 *   mediaType: "application/pdf",
 *   fileName: "report.pdf",
 *   data: new Uint8Array([1, 2, 3])
 * })
 * ```
 *
 * @category models
 * @since 4.0.0
 */
export interface FilePart extends BasePart<"file", FilePartOptions> {
    /**
     * MIME type of the file (e.g., "image/jpeg", "application/pdf").
     */
    readonly mediaType: string;
    /**
     * Optional filename for the file.
     */
    readonly fileName?: string | undefined;
    /**
     * File data as base64 string of data, a byte array, or a URL.
     */
    readonly data: string | Uint8Array | URL;
}
/**
 * Encoded representation of file parts for serialization.
 *
 * @category models
 * @since 4.0.0
 */
export interface FilePartEncoded extends BasePartEncoded<"file", FilePartOptions> {
    /**
     * MIME type of the file (e.g., "image/jpeg", "application/pdf").
     */
    readonly mediaType: string;
    /**
     * Optional filename for the file.
     */
    readonly fileName?: string | undefined;
    /**
     * File data as base64 string of data, a byte array, or a URL.
     */
    readonly data: string | Uint8Array | URL;
}
/**
 * Represents provider-specific options that can be associated with a
 * `FilePart` through module augmentation.
 *
 * @category options
 * @since 4.0.0
 */
export interface FilePartOptions extends ProviderOptions {
}
/**
 * Schema for validation and encoding of file parts.
 *
 * @category schemas
 * @since 4.0.0
 */
export declare const FilePart: Schema.Struct<{
    readonly type: Schema.Literal<"file">;
    readonly mediaType: Schema.String;
    readonly fileName: Schema.optional<Schema.String>;
    readonly data: Schema.Union<readonly [Schema.String, Schema.Uint8Array, Schema.URL]>;
    readonly "~effect/ai/Prompt/Part": Schema.withDecodingDefaultKey<Schema.Literal<"~effect/ai/Prompt/Part">>;
    readonly options: Schema.withDecodingDefault<Schema.$Record<Schema.String, Schema.NullOr<Schema.Codec<Schema.Json>>>>;
}>;
/**
 * Constructs a `FilePart` for prompt file attachments.
 *
 * **When to use**
 *
 * Use to create the file-attachment part of a prompt from typed file part
 * parameters.
 *
 * @see {@link makePart} for the generic part constructor
 *
 * @category constructors
 * @since 4.0.0
 */
export declare const filePart: (params: PartConstructorParams<FilePart>) => FilePart;
/**
 * Content part representing a tool call request.
 *
 * **Example** (Creating tool call parts)
 *
 * ```ts
 * import { Prompt } from "effect/unstable/ai"
 *
 * const toolCallPart: Prompt.ToolCallPart = Prompt.makePart("tool-call", {
 *   id: "call_123",
 *   name: "get_weather",
 *   params: { city: "San Francisco", units: "celsius" },
 *   providerExecuted: false
 * })
 * ```
 *
 * @category models
 * @since 4.0.0
 */
export interface ToolCallPart extends BasePart<"tool-call", ToolCallPartOptions> {
    /**
     * Unique identifier for this tool call.
     */
    readonly id: string;
    /**
     * Name of the tool to invoke.
     */
    readonly name: string;
    /**
     * Parameters to pass to the tool.
     */
    readonly params: unknown;
    /**
     * Whether the tool was executed by the provider (true) or framework (false).
     */
    readonly providerExecuted: boolean;
}
/**
 * Encoded representation of tool call parts for serialization.
 *
 * @category models
 * @since 4.0.0
 */
export interface ToolCallPartEncoded extends BasePartEncoded<"tool-call", ToolCallPartOptions> {
    /**
     * Unique identifier for this tool call.
     */
    readonly id: string;
    /**
     * Name of the tool to invoke.
     */
    readonly name: string;
    /**
     * Parameters to pass to the tool.
     */
    readonly params: unknown;
    /**
     * Whether the tool was executed by the provider (true) or framework (false).
     */
    readonly providerExecuted?: boolean | undefined;
}
/**
 * Represents provider-specific options that can be associated with a
 * `ToolCallPart` through module augmentation.
 *
 * @category options
 * @since 4.0.0
 */
export interface ToolCallPartOptions extends ProviderOptions {
}
/**
 * Schema for validation and encoding of tool call parts.
 *
 * @category schemas
 * @since 4.0.0
 */
export declare const ToolCallPart: Schema.Struct<{
    readonly type: Schema.Literal<"tool-call">;
    readonly id: Schema.String;
    readonly name: Schema.String;
    readonly params: Schema.Unknown;
    readonly providerExecuted: Schema.withDecodingDefault<Schema.Boolean>;
    readonly "~effect/ai/Prompt/Part": Schema.withDecodingDefaultKey<Schema.Literal<"~effect/ai/Prompt/Part">>;
    readonly options: Schema.withDecodingDefault<Schema.$Record<Schema.String, Schema.NullOr<Schema.Codec<Schema.Json>>>>;
}>;
/**
 * Constructs a new tool call part.
 *
 * @category constructors
 * @since 4.0.0
 */
export declare const toolCallPart: (params: PartConstructorParams<ToolCallPart>) => ToolCallPart;
/**
 * Content part representing the result of a tool call.
 *
 * **Example** (Creating tool result parts)
 *
 * ```ts
 * import { Prompt } from "effect/unstable/ai"
 *
 * const toolResultPart: Prompt.ToolResultPart = Prompt.makePart("tool-result", {
 *   id: "call_123",
 *   name: "get_weather",
 *   isFailure: false,
 *   result: {
 *     temperature: 22,
 *     condition: "sunny",
 *     humidity: 65
 *   }
 * })
 * ```
 *
 * @category models
 * @since 4.0.0
 */
export interface ToolResultPart extends BasePart<"tool-result", ToolResultPartOptions> {
    /**
     * Unique identifier matching the original tool call.
     */
    readonly id: string;
    /**
     * Name of the tool that was executed.
     */
    readonly name: string;
    /**
     * Whether or not the result of executing the tool call handler was an error.
     */
    readonly isFailure: boolean;
    /**
     * The result returned by the tool execution.
     */
    readonly result: unknown;
}
/**
 * Encoded representation of tool result parts for serialization.
 *
 * @category models
 * @since 4.0.0
 */
export interface ToolResultPartEncoded extends BasePartEncoded<"tool-result", ToolResultPartOptions> {
    /**
     * Unique identifier matching the original tool call.
     */
    readonly id: string;
    /**
     * Name of the tool that was executed.
     */
    readonly name: string;
    /**
     * Whether or not the result of executing the tool call handler was an error.
     */
    readonly isFailure: boolean;
    /**
     * The result returned by the tool execution.
     */
    readonly result: unknown;
}
/**
 * Represents provider-specific options that can be associated with a
 * `ToolResultPart` through module augmentation.
 *
 * @category options
 * @since 4.0.0
 */
export interface ToolResultPartOptions extends ProviderOptions {
}
/**
 * Schema for validation and encoding of tool result parts.
 *
 * @category schemas
 * @since 4.0.0
 */
export declare const ToolResultPart: Schema.Struct<{
    readonly type: Schema.Literal<"tool-result">;
    readonly id: Schema.String;
    readonly name: Schema.String;
    readonly isFailure: Schema.Boolean;
    readonly result: Schema.Unknown;
    readonly "~effect/ai/Prompt/Part": Schema.withDecodingDefaultKey<Schema.Literal<"~effect/ai/Prompt/Part">>;
    readonly options: Schema.withDecodingDefault<Schema.$Record<Schema.String, Schema.NullOr<Schema.Codec<Schema.Json>>>>;
}>;
/**
 * Constructs a new tool result part.
 *
 * @category constructors
 * @since 4.0.0
 */
export declare const toolResultPart: (params: PartConstructorParams<ToolResultPart>) => ToolResultPart;
/**
 * Content part representing a user's response to a tool approval request.
 *
 * **When to use**
 *
 * Use when you use this part in tool messages to approve or deny tool execution when tools
 * have the `needsApproval` property set.
 *
 * **Example** (Creating tool approval responses)
 *
 * ```ts
 * import { Prompt } from "effect/unstable/ai"
 *
 * const approvalResponse: Prompt.ToolApprovalResponsePart = Prompt.makePart(
 *   "tool-approval-response",
 *   {
 *     approvalId: "approval_123",
 *     approved: true
 *   }
 * )
 *
 * const denialResponse: Prompt.ToolApprovalResponsePart = Prompt.makePart(
 *   "tool-approval-response",
 *   {
 *     approvalId: "approval_456",
 *     approved: false,
 *     reason: "Operation not allowed"
 *   }
 * )
 * ```
 *
 * @category models
 * @since 4.0.0
 */
export interface ToolApprovalResponsePart extends BasePart<"tool-approval-response", ToolApprovalResponsePartOptions> {
    /**
     * References the original approval request.
     */
    readonly approvalId: string;
    /**
     * User's decision to approve or deny the tool execution.
     */
    readonly approved: boolean;
    /**
     * Optional justification for the decision.
     */
    readonly reason?: string | undefined;
}
/**
 * Encoded representation of tool approval response parts for serialization.
 *
 * @category models
 * @since 4.0.0
 */
export interface ToolApprovalResponsePartEncoded extends BasePartEncoded<"tool-approval-response", ToolApprovalResponsePartOptions> {
    /**
     * References the original approval request.
     */
    readonly approvalId: string;
    /**
     * User's decision to approve or deny the tool execution.
     */
    readonly approved: boolean;
    /**
     * Optional justification for the decision.
     */
    readonly reason?: string | undefined;
}
/**
 * Represents provider-specific options that can be associated with a
 * `ToolApprovalResponsePart` through module augmentation.
 *
 * @category options
 * @since 4.0.0
 */
export interface ToolApprovalResponsePartOptions extends ProviderOptions {
}
/**
 * Schema for validation and encoding of tool approval response parts.
 *
 * @category schemas
 * @since 4.0.0
 */
export declare const ToolApprovalResponsePart: Schema.Struct<{
    readonly type: Schema.Literal<"tool-approval-response">;
    readonly approvalId: Schema.String;
    readonly approved: Schema.Boolean;
    readonly reason: Schema.optional<Schema.String>;
    readonly "~effect/ai/Prompt/Part": Schema.withDecodingDefaultKey<Schema.Literal<"~effect/ai/Prompt/Part">>;
    readonly options: Schema.withDecodingDefault<Schema.$Record<Schema.String, Schema.NullOr<Schema.Codec<Schema.Json>>>>;
}>;
/**
 * Constructs a new tool approval response part.
 *
 * @category constructors
 * @since 4.0.0
 */
export declare const toolApprovalResponsePart: (params: PartConstructorParams<ToolApprovalResponsePart>) => ToolApprovalResponsePart;
/**
 * Content part representing a tool approval request from the framework.
 *
 * **Details**
 *
 * Tool approval request parts are stored in assistant messages when a tool
 * requires user approval before execution. The user responds with a
 * `ToolApprovalResponsePart` in a tool message.
 *
 * **Example** (Creating tool approval requests)
 *
 * ```ts
 * import { Prompt } from "effect/unstable/ai"
 *
 * const approvalRequest: Prompt.ToolApprovalRequestPart = Prompt.makePart(
 *   "tool-approval-request",
 *   {
 *     approvalId: "approval_123",
 *     toolCallId: "call_456"
 *   }
 * )
 * ```
 *
 * @category models
 * @since 4.0.0
 */
export interface ToolApprovalRequestPart extends BasePart<"tool-approval-request", ToolApprovalRequestPartOptions> {
    /**
     * Unique identifier for this approval flow.
     */
    readonly approvalId: string;
    /**
     * The tool call ID requiring approval.
     */
    readonly toolCallId: string;
}
/**
 * Encoded representation of tool approval request parts for serialization.
 *
 * @category models
 * @since 4.0.0
 */
export interface ToolApprovalRequestPartEncoded extends BasePartEncoded<"tool-approval-request", ToolApprovalRequestPartOptions> {
    /**
     * Unique identifier for this approval flow.
     */
    readonly approvalId: string;
    /**
     * The tool call ID requiring approval.
     */
    readonly toolCallId: string;
}
/**
 * Represents provider-specific options that can be associated with a
 * `ToolApprovalRequestPart` through module augmentation.
 *
 * @category options
 * @since 4.0.0
 */
export interface ToolApprovalRequestPartOptions extends ProviderOptions {
}
/**
 * Schema for validation and encoding of tool approval request parts.
 *
 * @category schemas
 * @since 4.0.0
 */
export declare const ToolApprovalRequestPart: Schema.Struct<{
    readonly type: Schema.Literal<"tool-approval-request">;
    readonly approvalId: Schema.String;
    readonly toolCallId: Schema.String;
    readonly "~effect/ai/Prompt/Part": Schema.withDecodingDefaultKey<Schema.Literal<"~effect/ai/Prompt/Part">>;
    readonly options: Schema.withDecodingDefault<Schema.$Record<Schema.String, Schema.NullOr<Schema.Codec<Schema.Json>>>>;
}>;
/**
 * Constructs a new tool approval request part.
 *
 * @category constructors
 * @since 4.0.0
 */
export declare const toolApprovalRequestPart: (params: PartConstructorParams<ToolApprovalRequestPart>) => ToolApprovalRequestPart;
declare const MessageTypeId: "~effect/ai/Prompt/Message";
/**
 * Type guard to check if a value is a Message.
 *
 * @category guards
 * @since 4.0.0
 */
export declare const isMessage: (u: unknown) => u is Message;
/**
 * Base interface for all message types.
 *
 * **Details**
 *
 * It provides the common structure shared by all messages, including the role
 * and provider options.
 *
 * @category models
 * @since 4.0.0
 */
export interface BaseMessage<Role extends string, Options extends ProviderOptions> {
    readonly [MessageTypeId]: typeof MessageTypeId;
    /**
     * The role of the message participant.
     */
    readonly role: Role;
    /**
     * Provider-specific options for this message.
     */
    readonly options: Options;
}
/**
 * Base interface for encoded message types.
 *
 * @category models
 * @since 4.0.0
 */
export interface BaseMessageEncoded<Role extends string, Options extends ProviderOptions> {
    /**
     * The role of the message participant.
     */
    readonly role: Role;
    /**
     * Provider-specific options for this message.
     */
    readonly options?: Options | undefined;
}
/**
 * Creates a new message with the specified role.
 *
 * **Example** (Creating messages)
 *
 * ```ts
 * import { Prompt } from "effect/unstable/ai"
 *
 * const textPart = Prompt.makePart("text", {
 *   text: "Hello, world!"
 * })
 *
 * const userMessage = Prompt.makeMessage("user", {
 *   content: [textPart]
 * })
 * ```
 *
 * @category constructors
 * @since 4.0.0
 */
export declare const makeMessage: <const Role extends Message["role"]>(role: Role, params: Omit<Extract<Message, {
    role: Role;
}>, typeof MessageTypeId | "role" | "options"> & {
    readonly options?: Extract<Message, {
        role: Role;
    }>["options"] | undefined;
}) => Extract<Message, {
    role: Role;
}>;
/**
 * A utility type for specifying the parameters required to construct a
 * specific message for a prompt.
 *
 * @category utility types
 * @since 4.0.0
 */
export type MessageConstructorParams<M extends Message> = Omit<M, typeof MessageTypeId | "role" | "options"> & {
    /**
     * Optional provider-specific options for this message.
     */
    readonly options?: Part["options"] | undefined;
};
/**
 * Schema that decodes a string into content containing a single `TextPart` and,
 * when encoding, emits the `text` value of the first part.
 *
 * @category schemas
 * @since 4.0.0
 */
export declare const ContentFromString: Schema.decodeTo<Schema.NonEmptyArray<Schema.toType<Schema.Struct<{
    readonly type: Schema.Literal<"text">;
    readonly text: Schema.String;
    readonly "~effect/ai/Prompt/Part": Schema.withDecodingDefaultKey<Schema.Literal<"~effect/ai/Prompt/Part">>;
    readonly options: Schema.withDecodingDefault<Schema.$Record<Schema.String, Schema.NullOr<Schema.Codec<Schema.Json>>>>;
}>>>, Schema.String>;
/**
 * Message representing system instructions or context.
 *
 * **Example** (Creating system messages)
 *
 * ```ts
 * import { Prompt } from "effect/unstable/ai"
 *
 * const systemMessage: Prompt.SystemMessage = Prompt.makeMessage("system", {
 *   content: "You are a helpful assistant specialized in mathematics. " +
 *     "Always show your work step by step."
 * })
 * ```
 *
 * @category models
 * @since 4.0.0
 */
export interface SystemMessage extends BaseMessage<"system", SystemMessageOptions> {
    /**
     * The system instruction or context as plain text.
     */
    readonly content: string;
}
/**
 * Encoded representation of system messages for serialization.
 *
 * @category models
 * @since 4.0.0
 */
export interface SystemMessageEncoded extends BaseMessageEncoded<"system", SystemMessageOptions> {
    /**
     * The system instruction or context as plain text.
     */
    readonly content: string;
}
/**
 * Represents provider-specific options that can be associated with a
 * `SystemMessage` through module augmentation.
 *
 * @category options
 * @since 4.0.0
 */
export interface SystemMessageOptions extends ProviderOptions {
}
/**
 * Schema for validation and encoding of system messages.
 *
 * @category schemas
 * @since 4.0.0
 */
export declare const SystemMessage: Schema.Struct<{
    readonly role: Schema.Literal<"system">;
    readonly content: Schema.String;
    readonly "~effect/ai/Prompt/Message": Schema.withDecodingDefaultKey<Schema.Literal<"~effect/ai/Prompt/Message">>;
    readonly options: Schema.withDecodingDefault<Schema.$Record<Schema.String, Schema.NullOr<Schema.Codec<Schema.Json>>>>;
}>;
/**
 * Constructs a new system message.
 *
 * @category constructors
 * @since 4.0.0
 */
export declare const systemMessage: (params: MessageConstructorParams<SystemMessage>) => SystemMessage;
/**
 * Message representing user input or questions.
 *
 * **Example** (Creating user messages)
 *
 * ```ts
 * import { Prompt } from "effect/unstable/ai"
 *
 * const textUserMessage: Prompt.UserMessage = Prompt.makeMessage("user", {
 *   content: [
 *     Prompt.makePart("text", {
 *       text: "Can you analyze this image for me?"
 *     })
 *   ]
 * })
 *
 * const multimodalUserMessage: Prompt.UserMessage = Prompt.makeMessage("user", {
 *   content: [
 *     Prompt.makePart("text", {
 *       text: "What do you see in this image?"
 *     }),
 *     Prompt.makePart("file", {
 *       mediaType: "image/jpeg",
 *       fileName: "vacation.jpg",
 *       data: "data:image/jpeg;base64,..."
 *     })
 *   ]
 * })
 * ```
 *
 * @category models
 * @since 4.0.0
 */
export interface UserMessage extends BaseMessage<"user", UserMessageOptions> {
    /**
     * Array of content parts that make up the user's message.
     */
    readonly content: ReadonlyArray<UserMessagePart>;
}
/**
 * Union type of content parts allowed in user messages.
 *
 * @category models
 * @since 4.0.0
 */
export type UserMessagePart = TextPart | FilePart;
/**
 * Encoded representation of user messages for serialization.
 *
 * @category models
 * @since 4.0.0
 */
export interface UserMessageEncoded extends BaseMessageEncoded<"user", UserMessageOptions> {
    /**
     * Array of content parts that make up the user's message.
     */
    readonly content: string | ReadonlyArray<UserMessagePartEncoded>;
}
/**
 * Union type of encoded content parts for user messages.
 *
 * @category models
 * @since 4.0.0
 */
export type UserMessagePartEncoded = TextPartEncoded | FilePartEncoded;
/**
 * Represents provider-specific options that can be associated with a
 * `UserMessage` through module augmentation.
 *
 * @category options
 * @since 4.0.0
 */
export interface UserMessageOptions extends ProviderOptions {
}
/**
 * Schema for validation and encoding of user messages.
 *
 * @category schemas
 * @since 4.0.0
 */
export declare const UserMessage: Schema.Struct<{
    readonly role: Schema.Literal<"user">;
    readonly content: Schema.Union<readonly [
        Schema.decodeTo<Schema.NonEmptyArray<Schema.toType<Schema.Struct<{
            readonly type: Schema.Literal<"text">;
            readonly text: Schema.String;
            readonly "~effect/ai/Prompt/Part": Schema.withDecodingDefaultKey<Schema.Literal<"~effect/ai/Prompt/Part">>;
            readonly options: Schema.withDecodingDefault<Schema.$Record<Schema.String, Schema.NullOr<Schema.Codec<Schema.Json>>>>;
        }>>>, Schema.String, never, never>,
        Schema.$Array<Schema.Union<readonly [
            Schema.Struct<{
                readonly type: Schema.Literal<"text">;
                readonly text: Schema.String;
                readonly "~effect/ai/Prompt/Part": Schema.withDecodingDefaultKey<Schema.Literal<"~effect/ai/Prompt/Part">>;
                readonly options: Schema.withDecodingDefault<Schema.$Record<Schema.String, Schema.NullOr<Schema.Codec<Schema.Json>>>>;
            }>,
            Schema.Struct<{
                readonly type: Schema.Literal<"file">;
                readonly mediaType: Schema.String;
                readonly fileName: Schema.optional<Schema.String>;
                readonly data: Schema.Union<readonly [Schema.String, Schema.Uint8Array, Schema.URL]>;
                readonly "~effect/ai/Prompt/Part": Schema.withDecodingDefaultKey<Schema.Literal<"~effect/ai/Prompt/Part">>;
                readonly options: Schema.withDecodingDefault<Schema.$Record<Schema.String, Schema.NullOr<Schema.Codec<Schema.Json>>>>;
            }>
        ]>>
    ]>;
    readonly "~effect/ai/Prompt/Message": Schema.withDecodingDefaultKey<Schema.Literal<"~effect/ai/Prompt/Message">>;
    readonly options: Schema.withDecodingDefault<Schema.$Record<Schema.String, Schema.NullOr<Schema.Codec<Schema.Json>>>>;
}>;
/**
 * Constructs a new user message.
 *
 * @category constructors
 * @since 4.0.0
 */
export declare const userMessage: (params: MessageConstructorParams<UserMessage>) => UserMessage;
/**
 * Message representing large language model assistant responses.
 *
 * **Example** (Creating assistant messages)
 *
 * ```ts
 * import { Prompt } from "effect/unstable/ai"
 *
 * const assistantMessage: Prompt.AssistantMessage = Prompt.makeMessage(
 *   "assistant",
 *   {
 *     content: [
 *       Prompt.makePart("text", {
 *         text:
 *           "I can check the current weather for San Francisco."
 *       }),
 *       Prompt.makePart("tool-call", {
 *         id: "call_123",
 *         name: "get_weather",
 *         params: { city: "San Francisco" },
 *         providerExecuted: false
 *       }),
 *       Prompt.makePart("tool-result", {
 *         id: "call_123",
 *         name: "get_weather",
 *         isFailure: false,
 *         result: {
 *           temperature: 72,
 *           condition: "sunny"
 *         }
 *       }),
 *       Prompt.makePart("text", {
 *         text: "The weather in San Francisco is currently 72°F and sunny."
 *       })
 *     ]
 *   }
 * )
 * ```
 *
 * @category models
 * @since 4.0.0
 */
export interface AssistantMessage extends BaseMessage<"assistant", AssistantMessageOptions> {
    /**
     * Array of content parts that make up the assistant's response.
     */
    readonly content: ReadonlyArray<AssistantMessagePart>;
}
/**
 * Union type of content parts allowed in assistant messages.
 *
 * @category models
 * @since 4.0.0
 */
export type AssistantMessagePart = TextPart | FilePart | ReasoningPart | ToolCallPart | ToolResultPart | ToolApprovalRequestPart;
/**
 * Encoded representation of assistant messages for serialization.
 *
 * @category models
 * @since 4.0.0
 */
export interface AssistantMessageEncoded extends BaseMessageEncoded<"assistant", AssistantMessageOptions> {
    readonly content: string | ReadonlyArray<AssistantMessagePartEncoded>;
}
/**
 * Union type of encoded content parts for assistant messages.
 *
 * @category models
 * @since 4.0.0
 */
export type AssistantMessagePartEncoded = TextPartEncoded | FilePartEncoded | ReasoningPartEncoded | ToolCallPartEncoded | ToolResultPartEncoded | ToolApprovalRequestPartEncoded;
/**
 * Represents provider-specific options that can be associated with a
 * `AssistantMessage` through module augmentation.
 *
 * @category options
 * @since 4.0.0
 */
export interface AssistantMessageOptions extends ProviderOptions {
}
/**
 * Schema for validation and encoding of assistant messages.
 *
 * **Details**
 *
 * Assistant content can be a string decoded through `ContentFromString` or an
 * array of text, file, reasoning, tool-call, tool-result, and
 * tool-approval-request parts.
 *
 * @category schemas
 * @since 4.0.0
 */
export declare const AssistantMessage: Schema.Struct<{
    readonly role: Schema.Literal<"assistant">;
    readonly content: Schema.Union<readonly [
        Schema.decodeTo<Schema.NonEmptyArray<Schema.toType<Schema.Struct<{
            readonly type: Schema.Literal<"text">;
            readonly text: Schema.String;
            readonly "~effect/ai/Prompt/Part": Schema.withDecodingDefaultKey<Schema.Literal<"~effect/ai/Prompt/Part">>;
            readonly options: Schema.withDecodingDefault<Schema.$Record<Schema.String, Schema.NullOr<Schema.Codec<Schema.Json>>>>;
        }>>>, Schema.String, never, never>,
        Schema.$Array<Schema.Union<readonly [
            typeof TextPart,
            typeof FilePart,
            typeof ReasoningPart,
            typeof ToolCallPart,
            typeof ToolResultPart,
            typeof ToolApprovalRequestPart
        ]>>
    ]>;
    readonly "~effect/ai/Prompt/Message": Schema.withDecodingDefaultKey<Schema.Literal<"~effect/ai/Prompt/Message">>;
    readonly options: Schema.withDecodingDefault<Schema.$Record<Schema.String, Schema.NullOr<Schema.Codec<Schema.Json>>>>;
}>;
/**
 * Constructs a new assistant message.
 *
 * **When to use**
 *
 * Use to add assistant-role prompt history or model responses.
 *
 * **Details**
 *
 * This is the role-specific wrapper around `makeMessage("assistant", params)`.
 *
 * @category constructors
 * @since 4.0.0
 */
export declare const assistantMessage: (params: MessageConstructorParams<AssistantMessage>) => AssistantMessage;
/**
 * Message carrying tool-side content, including tool execution results and
 * responses to tool approval requests.
 *
 * **Example** (Creating tool messages)
 *
 * ```ts
 * import { Prompt } from "effect/unstable/ai"
 *
 * const toolMessage: Prompt.ToolMessage = Prompt.makeMessage("tool", {
 *   content: [
 *     Prompt.makePart("tool-result", {
 *       id: "call_123",
 *       name: "search_web",
 *       isFailure: false,
 *       result: {
 *         query: "TypeScript best practices",
 *         results: [
 *           { title: "TypeScript Handbook", url: "https://..." },
 *           { title: "Effective TypeScript", url: "https://..." }
 *         ]
 *       }
 *     })
 *   ]
 * })
 * ```
 *
 * @category models
 * @since 4.0.0
 */
export interface ToolMessage extends BaseMessage<"tool", ToolMessageOptions> {
    /**
     * Array of tool result parts.
     */
    readonly content: ReadonlyArray<ToolMessagePart>;
}
/**
 * Union type of content parts allowed in tool messages.
 *
 * @category models
 * @since 4.0.0
 */
export type ToolMessagePart = ToolResultPart | ToolApprovalResponsePart;
/**
 * Encoded representation of tool messages for serialization.
 *
 * @category models
 * @since 4.0.0
 */
export interface ToolMessageEncoded extends BaseMessageEncoded<"tool", ToolMessageOptions> {
    /**
     * Array of tool result parts.
     */
    readonly content: ReadonlyArray<ToolMessagePartEncoded>;
}
/**
 * Union type of encoded content parts for tool messages.
 *
 * @category models
 * @since 4.0.0
 */
export type ToolMessagePartEncoded = ToolResultPartEncoded | ToolApprovalResponsePartEncoded;
/**
 * Represents provider-specific options that can be associated with a
 * `ToolMessage` through module augmentation.
 *
 * @category options
 * @since 4.0.0
 */
export interface ToolMessageOptions extends ProviderOptions {
}
/**
 * Schema for validation and encoding of tool messages.
 *
 * @category schemas
 * @since 4.0.0
 */
export declare const ToolMessage: Schema.Struct<{
    readonly role: Schema.Literal<"tool">;
    readonly content: Schema.$Array<Schema.Union<readonly [typeof ToolResultPart, typeof ToolApprovalResponsePart]>>;
    readonly "~effect/ai/Prompt/Message": Schema.withDecodingDefaultKey<Schema.Literal<"~effect/ai/Prompt/Message">>;
    readonly options: Schema.withDecodingDefault<Schema.$Record<Schema.String, Schema.NullOr<Schema.Codec<Schema.Json>>>>;
}>;
/**
 * Constructs a new tool message.
 *
 * @category constructors
 * @since 4.0.0
 */
export declare const toolMessage: (params: MessageConstructorParams<ToolMessage>) => ToolMessage;
/**
 * A type representing all possible message types in a conversation.
 *
 * @category models
 * @since 4.0.0
 */
export type Message = SystemMessage | UserMessage | AssistantMessage | ToolMessage;
/**
 * A type representing all possible encoded message types for serialization.
 *
 * @category models
 * @since 4.0.0
 */
export type MessageEncoded = SystemMessageEncoded | UserMessageEncoded | AssistantMessageEncoded | ToolMessageEncoded;
/**
 * Schema for validation and encoding of messages.
 *
 * @category schemas
 * @since 4.0.0
 */
export declare const Message: Schema.Codec<Message, MessageEncoded>;
declare const TypeId: "~effect/unstable/ai/Prompt";
/**
 * Type guard to check if a value is a Prompt.
 *
 * @category guards
 * @since 4.0.0
 */
export declare const isPrompt: (u: unknown) => u is Prompt;
/**
 * A Prompt contains a sequence of messages that form the context of a
 * conversation with a large language model.
 *
 * @category models
 * @since 4.0.0
 */
export interface Prompt extends Pipeable {
    readonly [TypeId]: typeof TypeId;
    /**
     * Array of messages that make up the conversation.
     */
    readonly content: ReadonlyArray<Message>;
}
/**
 * Encoded representation of prompts for serialization.
 *
 * @category models
 * @since 4.0.0
 */
export interface PromptEncoded {
    /**
     * Array of messages that make up the conversation.
     */
    readonly content: ReadonlyArray<MessageEncoded>;
}
/**
 * Schema for AI prompt instances.
 *
 * @category schemas
 * @since 4.0.0
 */
export declare const Prompt: Schema.Codec<Prompt, PromptEncoded>;
/**
 * Raw input accepted by `make`: a string, an iterable of encoded messages, or
 * an existing `Prompt`.
 *
 * **Example** (Accepting raw prompt input)
 *
 * ```ts
 * import type { Prompt } from "effect/unstable/ai"
 *
 * // String input - creates a user message
 * const stringInput: Prompt.RawInput = "Hello, world!"
 *
 * // Message array input
 * const messagesInput: Prompt.RawInput = [
 *   { role: "system", content: "You are helpful." },
 *   { role: "user", content: [{ type: "text", text: "Hi!" }] }
 * ]
 *
 * // Existing prompt
 * declare const existingPrompt: Prompt.Prompt
 * const promptInput: Prompt.RawInput = existingPrompt
 * ```
 *
 * @category models
 * @since 4.0.0
 */
export type RawInput = string | Iterable<MessageEncoded> | Prompt;
/**
 * An empty prompt with no messages.
 *
 * **Example** (Creating an empty prompt)
 *
 * ```ts
 * import { Prompt } from "effect/unstable/ai"
 *
 * const emptyPrompt = Prompt.empty
 * console.log(emptyPrompt.content) // []
 * ```
 *
 * @category constructors
 * @since 4.0.0
 */
export declare const empty: Prompt;
/**
 * Creates a `Prompt` from an input.
 *
 * **Details**
 *
 * This is the primary constructor for creating prompts, supporting multiple
 * input formats for convenience and flexibility.
 *
 * **Example** (Creating prompts from inputs)
 *
 * ```ts
 * import { Prompt } from "effect/unstable/ai"
 *
 * // From string - creates a user message
 * const textPrompt = Prompt.make("Hello, how are you?")
 *
 * // From messages array
 * const structuredPrompt = Prompt.make([
 *   { role: "system", content: "You are a helpful assistant." },
 *   { role: "user", content: [{ type: "text", text: "Hi!" }] }
 * ])
 *
 * // From existing prompt
 * declare const existingPrompt: Prompt.Prompt
 * const copiedPrompt = Prompt.make(existingPrompt)
 * ```
 *
 * @category constructors
 * @since 4.0.0
 */
export declare const make: (input: RawInput) => Prompt;
/**
 * Creates a Prompt from an array of messages.
 *
 * **Example** (Creating prompts from messages)
 *
 * ```ts
 * import { Prompt } from "effect/unstable/ai"
 *
 * const messages: ReadonlyArray<Prompt.Message> = [
 *   Prompt.makeMessage("system", {
 *     content: "You are a coding assistant."
 *   }),
 *   Prompt.makeMessage("user", {
 *     content: [Prompt.makePart("text", { text: "Help me with TypeScript" })]
 *   })
 * ]
 *
 * const prompt = Prompt.fromMessages(messages)
 * ```
 *
 * @category constructors
 * @since 4.0.0
 */
export declare const fromMessages: (messages: ReadonlyArray<Message>) => Prompt;
/**
 * Creates a `Prompt` from response parts by folding completed text and
 * reasoning streams into assistant parts, placing tool calls and approval
 * requests in an assistant message, and placing non-preliminary tool results
 * in a tool message using their encoded results.
 *
 * **Example** (Creating prompts from response parts)
 *
 * ```ts
 * import { Prompt, Response } from "effect/unstable/ai"
 *
 * const responseParts: ReadonlyArray<Response.AnyPart> = [
 *   Response.makePart("text", {
 *     text: "Hello there!"
 *   }),
 *   Response.makePart("tool-call", {
 *     id: "call_1",
 *     name: "get_time",
 *     params: {},
 *     providerExecuted: false
 *   }),
 *   Response.makePart("tool-result", {
 *     id: "call_1",
 *     name: "get_time",
 *     isFailure: false,
 *     result: "10:30 AM",
 *     encodedResult: "10:30 AM",
 *     providerExecuted: false,
 *     preliminary: false
 *   })
 * ]
 *
 * const prompt = Prompt.fromResponseParts(responseParts)
 * // Creates an assistant message with the response content
 * ```
 *
 * @category constructors
 * @since 4.0.0
 */
export declare const fromResponseParts: (parts: ReadonlyArray<Response.AnyPart>) => Prompt;
/**
 * Concatenates a prompt with additional raw input by concatenating messages.
 *
 * **Details**
 *
 * The returned prompt contains all messages from the original prompt followed
 * by the provided raw input, preserving message order.
 *
 * **Example** (Concatenating prompts)
 *
 * ```ts
 * import { Prompt } from "effect/unstable/ai"
 *
 * const systemPrompt = Prompt.make([{
 *   role: "system",
 *   content: "You are a helpful assistant."
 * }])
 *
 * const merged = Prompt.concat(systemPrompt, "Hello, world!")
 * ```
 *
 * @category combinators
 * @since 4.0.0
 */
export declare const concat: {
    /**
     * Concatenates a prompt with additional raw input by concatenating messages.
     *
     * **Details**
     *
     * The returned prompt contains all messages from the original prompt followed
     * by the provided raw input, preserving message order.
     *
     * **Example** (Concatenating prompts)
     *
     * ```ts
     * import { Prompt } from "effect/unstable/ai"
     *
     * const systemPrompt = Prompt.make([{
     *   role: "system",
     *   content: "You are a helpful assistant."
     * }])
     *
     * const merged = Prompt.concat(systemPrompt, "Hello, world!")
     * ```
     *
     * @category combinators
     * @since 4.0.0
     */
    (input: RawInput): (self: Prompt) => Prompt;
    /**
     * Concatenates a prompt with additional raw input by concatenating messages.
     *
     * **Details**
     *
     * The returned prompt contains all messages from the original prompt followed
     * by the provided raw input, preserving message order.
     *
     * **Example** (Concatenating prompts)
     *
     * ```ts
     * import { Prompt } from "effect/unstable/ai"
     *
     * const systemPrompt = Prompt.make([{
     *   role: "system",
     *   content: "You are a helpful assistant."
     * }])
     *
     * const merged = Prompt.concat(systemPrompt, "Hello, world!")
     * ```
     *
     * @category combinators
     * @since 4.0.0
     */
    (self: Prompt, input: RawInput): Prompt;
};
/**
 * Creates a new prompt from the specified prompt with the system message set
 * to the specified text content.
 *
 * **Gotchas**
 *
 * This method removes and replaces any previous system message from the
 * prompt.
 *
 * **Example** (Replacing system instructions)
 *
 * ```ts
 * import { Prompt } from "effect/unstable/ai"
 *
 * const systemPrompt = Prompt.make([{
 *   role: "system",
 *   content: "You are a helpful assistant."
 * }])
 *
 * const userPrompt = Prompt.make("Hello, world!")
 *
 * const prompt = Prompt.concat(systemPrompt, userPrompt)
 *
 * const replaced = Prompt.setSystem(
 *   prompt,
 *   "You are an expert in programming"
 * )
 * ```
 *
 * @category combinators
 * @since 4.0.0
 */
export declare const setSystem: {
    /**
     * Creates a new prompt from the specified prompt with the system message set
     * to the specified text content.
     *
     * **Gotchas**
     *
     * This method removes and replaces any previous system message from the
     * prompt.
     *
     * **Example** (Replacing system instructions)
     *
     * ```ts
     * import { Prompt } from "effect/unstable/ai"
     *
     * const systemPrompt = Prompt.make([{
     *   role: "system",
     *   content: "You are a helpful assistant."
     * }])
     *
     * const userPrompt = Prompt.make("Hello, world!")
     *
     * const prompt = Prompt.concat(systemPrompt, userPrompt)
     *
     * const replaced = Prompt.setSystem(
     *   prompt,
     *   "You are an expert in programming"
     * )
     * ```
     *
     * @category combinators
     * @since 4.0.0
     */
    (content: string): (self: Prompt) => Prompt;
    /**
     * Creates a new prompt from the specified prompt with the system message set
     * to the specified text content.
     *
     * **Gotchas**
     *
     * This method removes and replaces any previous system message from the
     * prompt.
     *
     * **Example** (Replacing system instructions)
     *
     * ```ts
     * import { Prompt } from "effect/unstable/ai"
     *
     * const systemPrompt = Prompt.make([{
     *   role: "system",
     *   content: "You are a helpful assistant."
     * }])
     *
     * const userPrompt = Prompt.make("Hello, world!")
     *
     * const prompt = Prompt.concat(systemPrompt, userPrompt)
     *
     * const replaced = Prompt.setSystem(
     *   prompt,
     *   "You are an expert in programming"
     * )
     * ```
     *
     * @category combinators
     * @since 4.0.0
     */
    (self: Prompt, content: string): Prompt;
};
/**
 * Creates a new prompt with a leading system message. If the prompt already has
 * a system message, the new message uses the provided content prepended to the
 * first existing system message's content; the original messages remain after
 * it.
 *
 * **Example** (Prepending system instructions)
 *
 * ```ts
 * import { Prompt } from "effect/unstable/ai"
 *
 * const systemPrompt = Prompt.make([{
 *   role: "system",
 *   content: "You are an expert in programming."
 * }])
 *
 * const userPrompt = Prompt.make("Hello, world!")
 *
 * const prompt = Prompt.concat(systemPrompt, userPrompt)
 *
 * const replaced = Prompt.prependSystem(
 *   prompt,
 *   "You are a helpful assistant. "
 * )
 * // result content: "You are a helpful assistant. You are an expert in programming."
 * ```
 *
 * @category combinators
 * @since 4.0.0
 */
export declare const prependSystem: {
    /**
     * Creates a new prompt with a leading system message. If the prompt already has
     * a system message, the new message uses the provided content prepended to the
     * first existing system message's content; the original messages remain after
     * it.
     *
     * **Example** (Prepending system instructions)
     *
     * ```ts
     * import { Prompt } from "effect/unstable/ai"
     *
     * const systemPrompt = Prompt.make([{
     *   role: "system",
     *   content: "You are an expert in programming."
     * }])
     *
     * const userPrompt = Prompt.make("Hello, world!")
     *
     * const prompt = Prompt.concat(systemPrompt, userPrompt)
     *
     * const replaced = Prompt.prependSystem(
     *   prompt,
     *   "You are a helpful assistant. "
     * )
     * // result content: "You are a helpful assistant. You are an expert in programming."
     * ```
     *
     * @category combinators
     * @since 4.0.0
     */
    (content: string): (self: Prompt) => Prompt;
    /**
     * Creates a new prompt with a leading system message. If the prompt already has
     * a system message, the new message uses the provided content prepended to the
     * first existing system message's content; the original messages remain after
     * it.
     *
     * **Example** (Prepending system instructions)
     *
     * ```ts
     * import { Prompt } from "effect/unstable/ai"
     *
     * const systemPrompt = Prompt.make([{
     *   role: "system",
     *   content: "You are an expert in programming."
     * }])
     *
     * const userPrompt = Prompt.make("Hello, world!")
     *
     * const prompt = Prompt.concat(systemPrompt, userPrompt)
     *
     * const replaced = Prompt.prependSystem(
     *   prompt,
     *   "You are a helpful assistant. "
     * )
     * // result content: "You are a helpful assistant. You are an expert in programming."
     * ```
     *
     * @category combinators
     * @since 4.0.0
     */
    (self: Prompt, content: string): Prompt;
};
/**
 * Creates a new prompt with a leading system message. If the prompt already has
 * a system message, the new message uses the provided content appended to the
 * first existing system message's content; the original messages remain after
 * it.
 *
 * **Example** (Appending system instructions)
 *
 * ```ts
 * import { Prompt } from "effect/unstable/ai"
 *
 * const systemPrompt = Prompt.make([{
 *   role: "system",
 *   content: "You are an expert in programming."
 * }])
 *
 * const userPrompt = Prompt.make("Hello, world!")
 *
 * const prompt = Prompt.concat(systemPrompt, userPrompt)
 *
 * const replaced = Prompt.appendSystem(
 *   prompt,
 *   " You are a helpful assistant."
 * )
 * // result content: "You are an expert in programming. You are a helpful assistant."
 * ```
 *
 * @category combinators
 * @since 4.0.0
 */
export declare const appendSystem: {
    /**
     * Creates a new prompt with a leading system message. If the prompt already has
     * a system message, the new message uses the provided content appended to the
     * first existing system message's content; the original messages remain after
     * it.
     *
     * **Example** (Appending system instructions)
     *
     * ```ts
     * import { Prompt } from "effect/unstable/ai"
     *
     * const systemPrompt = Prompt.make([{
     *   role: "system",
     *   content: "You are an expert in programming."
     * }])
     *
     * const userPrompt = Prompt.make("Hello, world!")
     *
     * const prompt = Prompt.concat(systemPrompt, userPrompt)
     *
     * const replaced = Prompt.appendSystem(
     *   prompt,
     *   " You are a helpful assistant."
     * )
     * // result content: "You are an expert in programming. You are a helpful assistant."
     * ```
     *
     * @category combinators
     * @since 4.0.0
     */
    (content: string): (self: Prompt) => Prompt;
    /**
     * Creates a new prompt with a leading system message. If the prompt already has
     * a system message, the new message uses the provided content appended to the
     * first existing system message's content; the original messages remain after
     * it.
     *
     * **Example** (Appending system instructions)
     *
     * ```ts
     * import { Prompt } from "effect/unstable/ai"
     *
     * const systemPrompt = Prompt.make([{
     *   role: "system",
     *   content: "You are an expert in programming."
     * }])
     *
     * const userPrompt = Prompt.make("Hello, world!")
     *
     * const prompt = Prompt.concat(systemPrompt, userPrompt)
     *
     * const replaced = Prompt.appendSystem(
     *   prompt,
     *   " You are a helpful assistant."
     * )
     * // result content: "You are an expert in programming. You are a helpful assistant."
     * ```
     *
     * @category combinators
     * @since 4.0.0
     */
    (self: Prompt, content: string): Prompt;
};
export {};
//# sourceMappingURL=Prompt.d.ts.map