import { BaseAnthropic } from '@anthropic-ai/sdk/client';
import * as Resources from '@anthropic-ai/sdk/resources/index';
import { getAuthHeaders } from "./core/auth.mjs";
import { Stream } from "./core/streaming.mjs";
import { readEnv } from "./internal/utils/env.mjs";
import { isObj } from "./internal/utils/values.mjs";
import { buildHeaders } from "./internal/headers.mjs";
import { path } from "./internal/utils/path.mjs";
export { BaseAnthropic } from '@anthropic-ai/sdk/client';
const DEFAULT_VERSION = 'bedrock-2023-05-31';
const MODEL_ENDPOINTS = new Set(['/v1/complete', '/v1/messages', '/v1/messages?beta=true']);
/** API Client for interfacing with the Anthropic Bedrock API. */
export class AnthropicBedrock extends BaseAnthropic {
    /**
     * API Client for interfacing with the Anthropic Bedrock API.
     *
     * @param {string | null | undefined} [opts.awsSecretKey]
     * @param {string | null | undefined} [opts.awsAccessKey]
     * @param {string | undefined} [opts.awsRegion=process.env['AWS_REGION'] ?? us-east-1]
     * @param {string | null | undefined} [opts.awsSessionToken]
     * @param {(() => Promise<AwsCredentialIdentityProvider>) | null} [opts.providerChainResolver] - Custom provider chain resolver for AWS credentials. Useful for non-Node environments.
     * @param {string} [opts.baseURL=process.env['ANTHROPIC_BEDROCK_BASE_URL'] ?? https://bedrock-runtime.${this.awsRegion}.amazonaws.com] - Override the default base URL for the API.
     * @param {number} [opts.timeout=10 minutes] - The maximum amount of time (in milliseconds) the client will wait for a response before timing out.
     * @param {MergedRequestInit} [opts.fetchOptions] - Additional `RequestInit` options to be passed to `fetch` calls.
     * @param {Fetch} [opts.fetch] - Specify a custom `fetch` function implementation.
     * @param {number} [opts.maxRetries=2] - The maximum number of times the client will retry a request.
     * @param {HeadersLike} opts.defaultHeaders - Default headers to include with every request to the API.
     * @param {Record<string, string | undefined>} opts.defaultQuery - Default query parameters to include with every request to the API.
     * @param {boolean} [opts.dangerouslyAllowBrowser=false] - By default, client-side use of this library is not allowed, as it risks exposing your secret API credentials to attackers.
     * @param {boolean} [opts.skipAuth=false] - Skip authentication for this request. This is useful if you have an internal proxy that handles authentication for you.
     */
    constructor({ awsRegion = readEnv('AWS_REGION') ?? 'us-east-1', baseURL = readEnv('ANTHROPIC_BEDROCK_BASE_URL') ?? `https://bedrock-runtime.${awsRegion}.amazonaws.com`, awsSecretKey = null, awsAccessKey = null, awsSessionToken = null, providerChainResolver = null, ...opts } = {}) {
        super({
            baseURL,
            ...opts,
        });
        this.skipAuth = false;
        this.messages = makeMessagesResource(this);
        this.completions = new Resources.Completions(this);
        this.beta = makeBetaResource(this);
        this.awsSecretKey = awsSecretKey;
        this.awsAccessKey = awsAccessKey;
        this.awsRegion = awsRegion;
        this.awsSessionToken = awsSessionToken;
        this.skipAuth = opts.skipAuth ?? false;
        this.providerChainResolver = providerChainResolver;
    }
    validateHeaders() {
        // auth validation is handled in prepareRequest since it needs to be async
    }
    async prepareRequest(request, { url, options }) {
        if (this.skipAuth) {
            return;
        }
        const regionName = this.awsRegion;
        if (!regionName) {
            throw new Error('Expected `awsRegion` option to be passed to the client or the `AWS_REGION` environment variable to be present');
        }
        const headers = await getAuthHeaders(request, {
            url,
            regionName,
            awsAccessKey: this.awsAccessKey,
            awsSecretKey: this.awsSecretKey,
            awsSessionToken: this.awsSessionToken,
            fetchOptions: this.fetchOptions,
            providerChainResolver: this.providerChainResolver,
        });
        request.headers = buildHeaders([headers, request.headers]).values;
    }
    async buildRequest(options) {
        options.__streamClass = Stream;
        if (isObj(options.body)) {
            // create a shallow copy of the request body so that code that mutates it later
            // doesn't mutate the original user-provided object
            options.body = { ...options.body };
        }
        if (isObj(options.body)) {
            if (!options.body['anthropic_version']) {
                options.body['anthropic_version'] = DEFAULT_VERSION;
            }
            if (options.headers && !options.body['anthropic_beta']) {
                const betas = buildHeaders([options.headers]).values.get('anthropic-beta');
                if (betas != null) {
                    options.body['anthropic_beta'] = betas.split(',');
                }
            }
        }
        if (MODEL_ENDPOINTS.has(options.path) && options.method === 'post') {
            if (!isObj(options.body)) {
                throw new Error('Expected request body to be an object for post /v1/messages');
            }
            const model = options.body['model'];
            options.body['model'] = undefined;
            const stream = options.body['stream'];
            options.body['stream'] = undefined;
            if (stream) {
                options.path = path `/model/${model}/invoke-with-response-stream`;
            }
            else {
                options.path = path `/model/${model}/invoke`;
            }
        }
        return super.buildRequest(options);
    }
}
function makeMessagesResource(client) {
    const resource = new Resources.Messages(client);
    // @ts-expect-error we're deleting non-optional properties
    delete resource.batches;
    // @ts-expect-error we're deleting non-optional properties
    delete resource.countTokens;
    return resource;
}
function makeBetaResource(client) {
    const resource = new Resources.Beta(client);
    // @ts-expect-error we're deleting non-optional properties
    delete resource.promptCaching;
    // @ts-expect-error we're deleting non-optional properties
    delete resource.messages.batches;
    // @ts-expect-error we're deleting non-optional properties
    delete resource.messages.countTokens;
    return resource;
}
//# sourceMappingURL=client.mjs.map