From 11304cafb551653e77be34336810dbbc7055b8e3 Mon Sep 17 00:00:00 2001 From: Stainless Bot <107565488+stainless-bot@users.noreply.github.com> Date: Thu, 2 May 2024 04:14:46 -0400 Subject: [PATCH] chore(internal): move client class to separate file (#408) --- src/client.ts | 241 +++++++++++++++++++++++++++++++++++++++++++++++++ src/index.ts | 245 ++------------------------------------------------ 2 files changed, 247 insertions(+), 239 deletions(-) create mode 100644 src/client.ts diff --git a/src/client.ts b/src/client.ts new file mode 100644 index 00000000..9c45035e --- /dev/null +++ b/src/client.ts @@ -0,0 +1,241 @@ +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +import * as Core from './core'; +import * as Errors from './error'; +import { type Agent } from './_shims/index'; +import * as Uploads from './uploads'; +import * as API from '@anthropic-ai/sdk/resources/index'; + +export interface ClientOptions { + /** + * Defaults to process.env['ANTHROPIC_API_KEY']. + */ + apiKey?: string | null | undefined; + + /** + * Defaults to process.env['ANTHROPIC_AUTH_TOKEN']. + */ + authToken?: string | null | undefined; + + /** + * Override the default base URL for the API, e.g., "https://api.example.com/v2/" + * + * Defaults to process.env['ANTHROPIC_BASE_URL']. + */ + baseURL?: string | null | undefined; + + /** + * The maximum amount of time (in milliseconds) that the client should wait for a response + * from the server before timing out a single request. + * + * Note that request timeouts are retried by default, so in a worst-case scenario you may wait + * much longer than this timeout before the promise succeeds or fails. + */ + timeout?: number; + + /** + * An HTTP agent used to manage HTTP(S) connections. + * + * If not provided, an agent will be constructed by default in the Node.js environment, + * otherwise no agent is used. + */ + httpAgent?: Agent; + + /** + * Specify a custom `fetch` function implementation. + * + * If not provided, we use `node-fetch` on Node.js and otherwise expect that `fetch` is + * defined globally. + */ + fetch?: Core.Fetch | undefined; + + /** + * The maximum number of times that the client will retry a request in case of a + * temporary failure, like a network error or a 5XX error from the server. + * + * @default 2 + */ + maxRetries?: number; + + /** + * Default headers to include with every request to the API. + * + * These can be removed in individual requests by explicitly setting the + * header to `undefined` or `null` in request options. + */ + defaultHeaders?: Core.Headers; + + /** + * Default query parameters to include with every request to the API. + * + * These can be removed in individual requests by explicitly setting the + * param to `undefined` in request options. + */ + defaultQuery?: Core.DefaultQuery; +} + +/** API Client for interfacing with the Anthropic API. */ +export class Anthropic extends Core.APIClient { + apiKey: string | null; + authToken: string | null; + + private _options: ClientOptions; + + /** + * API Client for interfacing with the Anthropic API. + * + * @param {string | null | undefined} [opts.apiKey=process.env['ANTHROPIC_API_KEY'] ?? null] + * @param {string | null | undefined} [opts.authToken=process.env['ANTHROPIC_AUTH_TOKEN'] ?? null] + * @param {string} [opts.baseURL=process.env['ANTHROPIC_BASE_URL'] ?? https://api.anthropic.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 {number} [opts.httpAgent] - An HTTP agent used to manage HTTP(s) connections. + * @param {Core.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 {Core.Headers} opts.defaultHeaders - Default headers to include with every request to the API. + * @param {Core.DefaultQuery} opts.defaultQuery - Default query parameters to include with every request to the API. + */ + constructor({ + baseURL = Core.readEnv('ANTHROPIC_BASE_URL'), + apiKey = Core.readEnv('ANTHROPIC_API_KEY') ?? null, + authToken = Core.readEnv('ANTHROPIC_AUTH_TOKEN') ?? null, + ...opts + }: ClientOptions = {}) { + const options: ClientOptions = { + apiKey, + authToken, + ...opts, + baseURL: baseURL || `https://api.anthropic.com`, + }; + + super({ + baseURL: options.baseURL!, + timeout: options.timeout ?? 600000 /* 10 minutes */, + httpAgent: options.httpAgent, + maxRetries: options.maxRetries, + fetch: options.fetch, + }); + this._options = options; + + this.apiKey = apiKey; + this.authToken = authToken; + } + + completions: API.Completions = new API.Completions(this); + messages: API.Messages = new API.Messages(this); + beta: API.Beta = new API.Beta(this); + + protected override defaultQuery(): Core.DefaultQuery | undefined { + return this._options.defaultQuery; + } + + protected override defaultHeaders(opts: Core.FinalRequestOptions): Core.Headers { + return { + ...super.defaultHeaders(opts), + 'anthropic-version': '2023-06-01', + ...this._options.defaultHeaders, + }; + } + + protected override validateHeaders(headers: Core.Headers, customHeaders: Core.Headers) { + if (this.apiKey && headers['x-api-key']) { + return; + } + if (customHeaders['x-api-key'] === null) { + return; + } + + if (this.authToken && headers['authorization']) { + return; + } + if (customHeaders['authorization'] === null) { + return; + } + + throw new Error( + 'Could not resolve authentication method. Expected either apiKey or authToken to be set. Or for one of the "X-Api-Key" or "Authorization" headers to be explicitly omitted', + ); + } + + protected override authHeaders(opts: Core.FinalRequestOptions): Core.Headers { + const apiKeyAuth = this.apiKeyAuth(opts); + const bearerAuth = this.bearerAuth(opts); + + if (apiKeyAuth != null && !Core.isEmptyObj(apiKeyAuth)) { + return apiKeyAuth; + } + + if (bearerAuth != null && !Core.isEmptyObj(bearerAuth)) { + return bearerAuth; + } + return {}; + } + + protected apiKeyAuth(opts: Core.FinalRequestOptions): Core.Headers { + if (this.apiKey == null) { + return {}; + } + return { 'X-Api-Key': this.apiKey }; + } + + protected bearerAuth(opts: Core.FinalRequestOptions): Core.Headers { + if (this.authToken == null) { + return {}; + } + return { Authorization: `Bearer ${this.authToken}` }; + } + + static Anthropic = this; + static HUMAN_PROMPT = '\n\nHuman:'; + static AI_PROMPT = '\n\nAssistant:'; + + static AnthropicError = Errors.AnthropicError; + static APIError = Errors.APIError; + static APIConnectionError = Errors.APIConnectionError; + static APIConnectionTimeoutError = Errors.APIConnectionTimeoutError; + static APIUserAbortError = Errors.APIUserAbortError; + static NotFoundError = Errors.NotFoundError; + static ConflictError = Errors.ConflictError; + static RateLimitError = Errors.RateLimitError; + static BadRequestError = Errors.BadRequestError; + static AuthenticationError = Errors.AuthenticationError; + static InternalServerError = Errors.InternalServerError; + static PermissionDeniedError = Errors.PermissionDeniedError; + static UnprocessableEntityError = Errors.UnprocessableEntityError; + + static toFile = Uploads.toFile; + static fileFromPath = Uploads.fileFromPath; +} + +export namespace Anthropic { + export import RequestOptions = Core.RequestOptions; + + export import Completions = API.Completions; + export import Completion = API.Completion; + export import CompletionCreateParams = API.CompletionCreateParams; + export import CompletionCreateParamsNonStreaming = API.CompletionCreateParamsNonStreaming; + export import CompletionCreateParamsStreaming = API.CompletionCreateParamsStreaming; + + export import Messages = API.Messages; + export import ContentBlock = API.ContentBlock; + export import ContentBlockDeltaEvent = API.ContentBlockDeltaEvent; + export import ContentBlockStartEvent = API.ContentBlockStartEvent; + export import ContentBlockStopEvent = API.ContentBlockStopEvent; + export import ImageBlockParam = API.ImageBlockParam; + export import Message = API.Message; + export import MessageDeltaEvent = API.MessageDeltaEvent; + export import MessageDeltaUsage = API.MessageDeltaUsage; + export import MessageParam = API.MessageParam; + export import MessageStartEvent = API.MessageStartEvent; + export import MessageStopEvent = API.MessageStopEvent; + export import MessageStreamEvent = API.MessageStreamEvent; + export import TextBlock = API.TextBlock; + export import TextBlockParam = API.TextBlockParam; + export import TextDelta = API.TextDelta; + export import Usage = API.Usage; + export import MessageCreateParams = API.MessageCreateParams; + export import MessageCreateParamsNonStreaming = API.MessageCreateParamsNonStreaming; + export import MessageCreateParamsStreaming = API.MessageCreateParamsStreaming; + export import MessageStreamParams = API.MessageStreamParams; + + export import Beta = API.Beta; +} diff --git a/src/index.ts b/src/index.ts index 481f800f..bc73f87f 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,210 +1,14 @@ // File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. -import * as Core from './core'; import * as Errors from './error'; -import { type Agent } from './_shims/index'; import * as Uploads from './uploads'; -import * as API from '@anthropic-ai/sdk/resources/index'; +import { Anthropic } from './client'; -export interface ClientOptions { - /** - * Defaults to process.env['ANTHROPIC_API_KEY']. - */ - apiKey?: string | null | undefined; - - /** - * Defaults to process.env['ANTHROPIC_AUTH_TOKEN']. - */ - authToken?: string | null | undefined; - - /** - * Override the default base URL for the API, e.g., "https://api.example.com/v2/" - * - * Defaults to process.env['ANTHROPIC_BASE_URL']. - */ - baseURL?: string | null | undefined; - - /** - * The maximum amount of time (in milliseconds) that the client should wait for a response - * from the server before timing out a single request. - * - * Note that request timeouts are retried by default, so in a worst-case scenario you may wait - * much longer than this timeout before the promise succeeds or fails. - */ - timeout?: number; - - /** - * An HTTP agent used to manage HTTP(S) connections. - * - * If not provided, an agent will be constructed by default in the Node.js environment, - * otherwise no agent is used. - */ - httpAgent?: Agent; - - /** - * Specify a custom `fetch` function implementation. - * - * If not provided, we use `node-fetch` on Node.js and otherwise expect that `fetch` is - * defined globally. - */ - fetch?: Core.Fetch | undefined; - - /** - * The maximum number of times that the client will retry a request in case of a - * temporary failure, like a network error or a 5XX error from the server. - * - * @default 2 - */ - maxRetries?: number; - - /** - * Default headers to include with every request to the API. - * - * These can be removed in individual requests by explicitly setting the - * header to `undefined` or `null` in request options. - */ - defaultHeaders?: Core.Headers; - - /** - * Default query parameters to include with every request to the API. - * - * These can be removed in individual requests by explicitly setting the - * param to `undefined` in request options. - */ - defaultQuery?: Core.DefaultQuery; -} - -/** API Client for interfacing with the Anthropic API. */ -export class Anthropic extends Core.APIClient { - apiKey: string | null; - authToken: string | null; - - private _options: ClientOptions; - - /** - * API Client for interfacing with the Anthropic API. - * - * @param {string | null | undefined} [opts.apiKey=process.env['ANTHROPIC_API_KEY'] ?? null] - * @param {string | null | undefined} [opts.authToken=process.env['ANTHROPIC_AUTH_TOKEN'] ?? null] - * @param {string} [opts.baseURL=process.env['ANTHROPIC_BASE_URL'] ?? https://api.anthropic.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 {number} [opts.httpAgent] - An HTTP agent used to manage HTTP(s) connections. - * @param {Core.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 {Core.Headers} opts.defaultHeaders - Default headers to include with every request to the API. - * @param {Core.DefaultQuery} opts.defaultQuery - Default query parameters to include with every request to the API. - */ - constructor({ - baseURL = Core.readEnv('ANTHROPIC_BASE_URL'), - apiKey = Core.readEnv('ANTHROPIC_API_KEY') ?? null, - authToken = Core.readEnv('ANTHROPIC_AUTH_TOKEN') ?? null, - ...opts - }: ClientOptions = {}) { - const options: ClientOptions = { - apiKey, - authToken, - ...opts, - baseURL: baseURL || `https://api.anthropic.com`, - }; - - super({ - baseURL: options.baseURL!, - timeout: options.timeout ?? 600000 /* 10 minutes */, - httpAgent: options.httpAgent, - maxRetries: options.maxRetries, - fetch: options.fetch, - }); - this._options = options; - - this.apiKey = apiKey; - this.authToken = authToken; - } - - completions: API.Completions = new API.Completions(this); - messages: API.Messages = new API.Messages(this); - beta: API.Beta = new API.Beta(this); - - protected override defaultQuery(): Core.DefaultQuery | undefined { - return this._options.defaultQuery; - } - - protected override defaultHeaders(opts: Core.FinalRequestOptions): Core.Headers { - return { - ...super.defaultHeaders(opts), - 'anthropic-version': '2023-06-01', - ...this._options.defaultHeaders, - }; - } - - protected override validateHeaders(headers: Core.Headers, customHeaders: Core.Headers) { - if (this.apiKey && headers['x-api-key']) { - return; - } - if (customHeaders['x-api-key'] === null) { - return; - } - - if (this.authToken && headers['authorization']) { - return; - } - if (customHeaders['authorization'] === null) { - return; - } - - throw new Error( - 'Could not resolve authentication method. Expected either apiKey or authToken to be set. Or for one of the "X-Api-Key" or "Authorization" headers to be explicitly omitted', - ); - } - - protected override authHeaders(opts: Core.FinalRequestOptions): Core.Headers { - const apiKeyAuth = this.apiKeyAuth(opts); - const bearerAuth = this.bearerAuth(opts); - - if (apiKeyAuth != null && !Core.isEmptyObj(apiKeyAuth)) { - return apiKeyAuth; - } - - if (bearerAuth != null && !Core.isEmptyObj(bearerAuth)) { - return bearerAuth; - } - return {}; - } - - protected apiKeyAuth(opts: Core.FinalRequestOptions): Core.Headers { - if (this.apiKey == null) { - return {}; - } - return { 'X-Api-Key': this.apiKey }; - } - - protected bearerAuth(opts: Core.FinalRequestOptions): Core.Headers { - if (this.authToken == null) { - return {}; - } - return { Authorization: `Bearer ${this.authToken}` }; - } - - static Anthropic = this; - static HUMAN_PROMPT = '\n\nHuman:'; - static AI_PROMPT = '\n\nAssistant:'; - - static AnthropicError = Errors.AnthropicError; - static APIError = Errors.APIError; - static APIConnectionError = Errors.APIConnectionError; - static APIConnectionTimeoutError = Errors.APIConnectionTimeoutError; - static APIUserAbortError = Errors.APIUserAbortError; - static NotFoundError = Errors.NotFoundError; - static ConflictError = Errors.ConflictError; - static RateLimitError = Errors.RateLimitError; - static BadRequestError = Errors.BadRequestError; - static AuthenticationError = Errors.AuthenticationError; - static InternalServerError = Errors.InternalServerError; - static PermissionDeniedError = Errors.PermissionDeniedError; - static UnprocessableEntityError = Errors.UnprocessableEntityError; +export { Anthropic }; +export default Anthropic; - static toFile = Uploads.toFile; - static fileFromPath = Uploads.fileFromPath; -} +export import toFile = Uploads.toFile; +export import fileFromPath = Uploads.fileFromPath; export const { HUMAN_PROMPT, AI_PROMPT } = Anthropic; @@ -224,41 +28,4 @@ export const { UnprocessableEntityError, } = Errors; -export import toFile = Uploads.toFile; -export import fileFromPath = Uploads.fileFromPath; - -export namespace Anthropic { - export import RequestOptions = Core.RequestOptions; - - export import Completions = API.Completions; - export import Completion = API.Completion; - export import CompletionCreateParams = API.CompletionCreateParams; - export import CompletionCreateParamsNonStreaming = API.CompletionCreateParamsNonStreaming; - export import CompletionCreateParamsStreaming = API.CompletionCreateParamsStreaming; - - export import Messages = API.Messages; - export import ContentBlock = API.ContentBlock; - export import ContentBlockDeltaEvent = API.ContentBlockDeltaEvent; - export import ContentBlockStartEvent = API.ContentBlockStartEvent; - export import ContentBlockStopEvent = API.ContentBlockStopEvent; - export import ImageBlockParam = API.ImageBlockParam; - export import Message = API.Message; - export import MessageDeltaEvent = API.MessageDeltaEvent; - export import MessageDeltaUsage = API.MessageDeltaUsage; - export import MessageParam = API.MessageParam; - export import MessageStartEvent = API.MessageStartEvent; - export import MessageStopEvent = API.MessageStopEvent; - export import MessageStreamEvent = API.MessageStreamEvent; - export import TextBlock = API.TextBlock; - export import TextBlockParam = API.TextBlockParam; - export import TextDelta = API.TextDelta; - export import Usage = API.Usage; - export import MessageCreateParams = API.MessageCreateParams; - export import MessageCreateParamsNonStreaming = API.MessageCreateParamsNonStreaming; - export import MessageCreateParamsStreaming = API.MessageCreateParamsStreaming; - export import MessageStreamParams = API.MessageStreamParams; - - export import Beta = API.Beta; -} - -export default Anthropic; +export * from './client';