/**
 * Defines the provider-neutral service for structured decisions.
 * `decide` encodes one input as JSON, sends its named decisions in one provider
 * call, and validates the answers. Failures are reported as `AiError` values.
 * @stability unstable
 * @since 4.0.0
 */
import * as Context from "../Context.ts";
import * as Effect from "../Effect.ts";
import * as Schema from "../Schema.ts";
import * as AiError from "./AiError.ts";
import type * as Decision from "./Decision.ts";
/**
 * Service key for answering decisions about an input. Create implementations
 * with `make`.
 *
 * @see {@link decide} for answering a definition through the current service
 *
 * @stability unstable
 * @category services
 * @since 4.0.0
 */
export declare const DecisionModel: Context.Service<DecisionModel, DecisionModel>;
/**
 * Brand type for `DecisionModel`.
 *
 * @stability unstable
 * @category type IDs
 * @since 4.0.0
 */
export type TypeId = "~effect/ai/DecisionModel";
/**
 * Brand for `DecisionModel` implementations.
 *
 * @stability unstable
 * @category type IDs
 * @since 4.0.0
 */
export declare const TypeId: TypeId;
declare const DecisionUsage_base: Schema.Class<DecisionUsage, Schema.Struct<{
    readonly inputTokens: Schema.optional<Schema.Finite>;
    readonly outputTokens: Schema.optional<Schema.Finite>;
}>, {}>;
/**
 * Provider-reported token usage. Unreported counts are `undefined`.
 *
 * @stability unstable
 * @category models
 * @since 4.0.0
 */
export declare class DecisionUsage extends DecisionUsage_base {
}
/**
 * Options for answering a decision definition.
 *
 * @stability unstable
 * @category options
 * @since 4.0.0
 */
export interface DecideOptions<Input extends Schema.Constraint> {
    readonly input: Input["Type"];
    /**
     * Images to include with the input.
     */
    readonly images?: ReadonlyArray<Image> | undefined;
}
/**
 * An image sent to the provider with the encoded input.
 * `data` is a base64 string, a byte array, or a URL.
 *
 * @stability unstable
 * @category models
 * @since 4.0.1
 */
export interface Image {
    readonly mediaType: string;
    readonly data: string | Uint8Array | URL;
}
/**
 * Answers for every decision in a definition together with usage metadata.
 *
 * @see {@link DecisionUsage} for token usage metadata
 *
 * @stability unstable
 * @category models
 * @since 4.0.0
 */
export interface DecideResponse<Decisions extends Record<string, Decision.Any>> {
    readonly answers: Decision.Answers<Decisions>;
    readonly usage: DecisionUsage;
}
/**
 * Provider input options for a decision request.
 * `state` is encoded with `Schema.toCodecJson`, not stringified.
 * All `decisions` must be answered in one call.
 * `images` is omitted when no images are supplied.
 *
 * @stability unstable
 * @category options
 * @since 4.0.0
 */
export interface ProviderOptions {
    readonly state: Schema.Json;
    readonly decisions: Record<string, Decision.Any>;
    readonly images?: ReadonlyArray<Image> | undefined;
}
/**
 * Provider answer for a classify decision.
 *
 * @stability unstable
 * @category models
 * @since 4.0.0
 */
export interface ProviderClassifyAnswer {
    readonly _tag: "Classify";
    readonly label: string;
    readonly probabilities: Readonly<Record<string, number>>;
    readonly confidence?: number | undefined;
}
/**
 * Provider answer for a rate decision.
 * The core derives the label from the highest probability, choosing the
 * first criteria entry on ties.
 *
 * @stability unstable
 * @category models
 * @since 4.0.0
 */
export interface ProviderRateAnswer {
    readonly _tag: "Rate";
    readonly rating: number;
    readonly probabilities: Readonly<Record<string, number>>;
    readonly confidence?: number | undefined;
}
/**
 * Provider answer for a probability decision.
 *
 * @stability unstable
 * @category models
 * @since 4.0.0
 */
export interface ProviderProbabilityAnswer {
    readonly _tag: "Probability";
    readonly probability: number;
}
/**
 * Provider answer for any decision kind.
 *
 * @stability unstable
 * @category models
 * @since 4.0.0
 */
export type ProviderAnswer = ProviderClassifyAnswer | ProviderRateAnswer | ProviderProbabilityAnswer;
/**
 * Provider response for a decision request.
 * `answers` is keyed like the requested decisions. Each answer is validated
 * against its decision before it is returned to the caller.
 *
 * @stability unstable
 * @category models
 * @since 4.0.0
 */
export interface ProviderResponse {
    readonly answers: Readonly<Record<string, ProviderAnswer>>;
    readonly usage: {
        readonly inputTokens: number | undefined;
        readonly outputTokens: number | undefined;
    };
}
/**
 * Decision operations over a definition.
 *
 * @stability unstable
 * @category models
 * @since 4.0.0
 */
export interface DecisionModel {
    readonly [TypeId]: TypeId;
    readonly decide: <Input extends Schema.Constraint, Decisions extends Record<string, Decision.Any>>(definition: Decision.Definition<Input, Decisions>, options: DecideOptions<Input>) => Effect.Effect<DecideResponse<Decisions>, AiError.AiError, Input["EncodingServices"]>;
}
/**
 * Creates a `DecisionModel` that encodes inputs as JSON and validates provider answers.
 * Answers must cover every decision and use its labels. Distributions must
 * sum to 1 within `1e-6`, optional confidence must be in `[0, 1]`, and ratings must be
 * in `[0, criteria.length - 1]`. Invalid answers fail with
 * `AiError.InvalidOutputError`; encoding failures use `AiError.InvalidUserInputError`.
 *
 * **Details**
 *
 * Set `supportsImages: true` to accept images. Otherwise, nonempty image input
 * fails with `AiError.InvalidUserInputError`.
 *
 * Providers that round each probability to `probabilityPrecision` decimal
 * places may return distributions whose sum drifts from 1 by up to half a unit
 * of the last place per label. Setting `probabilityPrecision` accepts that
 * drift and rescales the distribution to sum to 1; larger drift still fails.
 *
 * @see {@link DecisionModel} for the service shape returned by this constructor
 * @see {@link ProviderOptions} for the input passed to the provider implementation
 * @see {@link ProviderResponse} for the provider response contract consumed by this constructor
 *
 * @stability unstable
 * @category constructors
 * @since 4.0.0
 */
export declare const make: (params: {
    readonly decide: (options: ProviderOptions) => Effect.Effect<ProviderResponse, AiError.AiError>;
    readonly probabilityPrecision?: number | undefined;
    readonly supportsImages?: boolean | undefined;
}) => Effect.Effect<DecisionModel>;
/**
 * Answers a decision definition using the current `DecisionModel` service.
 * Encodes the input with `Schema.toCodecJson`, requiring the schema's encoding services.
 * Explicit `undefined` fields become `null`; absent fields stay absent.
 * Custom declarations need a JSON codec annotation or encoding fails.
 * Returned answers and probability dictionaries have null prototypes.
 *
 * **Example** (Triaging a ticket)
 *
 * ```ts
 * import { Effect, Schema } from "effect"
 * import { Decision, DecisionModel } from "effect/ai"
 *
 * const TicketTriage = Decision.make({
 *   input: Schema.String,
 *   decisions: {
 *     urgent: Decision.probability({
 *       instructions: "The message is time-sensitive",
 *       criteria: { false: "No time pressure", true: "Needs action now" }
 *     })
 *   }
 * })
 *
 * const program = Effect.gen(function*() {
 *   const { answers, usage } = yield* DecisionModel.decide(TicketTriage, {
 *     input: "My card was charged twice, please fix this today"
 *   })
 *   return { probability: answers.urgent.probability, usage }
 * })
 * ```
 *
 * @see {@link DecisionModel} for the service this function requires
 *
 * @stability unstable
 * @category decisions
 * @since 4.0.0
 */
export declare const decide: <Input extends Schema.Constraint, Decisions extends Record<string, Decision.Any>>(definition: Decision.Definition<Input, Decisions>, options: DecideOptions<Input>) => Effect.Effect<DecideResponse<Decisions>, AiError.AiError, DecisionModel | Input["EncodingServices"]>;
export {};
//# sourceMappingURL=DecisionModel.d.ts.map