@anthropic-ai/sdk
Version:
The official TypeScript library for the Anthropic API
1,906 lines (1,583 loc) • 56.1 kB
text/typescript
// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
import { APIPromise } from '../../core/api-promise';
import { APIResource } from '../../core/resource';
import { Stream } from '../../core/streaming';
import { buildHeaders } from '../../internal/headers';
import { RequestOptions } from '../../internal/request-options';
import { stainlessHelperHeader } from '../../lib/stainless-helper-header';
import { MessageStream } from '../../lib/MessageStream';
import {
parseMessage,
type ExtractParsedContentFromParams,
type ParseableMessageCreateParams,
type ParsedMessage,
} from '../../lib/parser';
import * as BatchesAPI from './batches';
import {
BatchCreateParams,
BatchListParams,
Batches,
DeletedMessageBatch,
MessageBatch,
MessageBatchCanceledResult,
MessageBatchErroredResult,
MessageBatchExpiredResult,
MessageBatchIndividualResponse,
MessageBatchRequestCounts,
MessageBatchResult,
MessageBatchSucceededResult,
MessageBatchesPage,
} from './batches';
import * as MessagesAPI from './messages';
import { MODEL_NONSTREAMING_TOKENS } from '../../internal/constants';
export class Messages extends APIResource {
batches: BatchesAPI.Batches = new BatchesAPI.Batches(this._client);
/**
* Send a structured list of input messages with text and/or image content, and the
* model will generate the next message in the conversation.
*
* The Messages API can be used for either single queries or stateless multi-turn
* conversations.
*
* Learn more about the Messages API in our
* [user guide](https://docs.claude.com/en/docs/initial-setup)
*
* @example
* ```ts
* const message = await client.messages.create({
* max_tokens: 1024,
* messages: [{ content: 'Hello, world', role: 'user' }],
* model: 'claude-sonnet-4-5-20250929',
* });
* ```
*/
create(body: MessageCreateParamsNonStreaming, options?: RequestOptions): APIPromise<Message>;
create(
body: MessageCreateParamsStreaming,
options?: RequestOptions,
): APIPromise<Stream<RawMessageStreamEvent>>;
create(
body: MessageCreateParamsBase,
options?: RequestOptions,
): APIPromise<Stream<RawMessageStreamEvent> | Message>;
create(
body: MessageCreateParams,
options?: RequestOptions,
): APIPromise<Message> | APIPromise<Stream<RawMessageStreamEvent>> {
if (body.model in DEPRECATED_MODELS) {
console.warn(
`The model '${body.model}' is deprecated and will reach end-of-life on ${
DEPRECATED_MODELS[body.model]
}\nPlease migrate to a newer model. Visit https://docs.anthropic.com/en/docs/resources/model-deprecations for more information.`,
);
}
let timeout = (this._client as any)._options.timeout as number | null;
if (!body.stream && timeout == null) {
const maxNonstreamingTokens = MODEL_NONSTREAMING_TOKENS[body.model] ?? undefined;
timeout = this._client.calculateNonstreamingTimeout(body.max_tokens, maxNonstreamingTokens);
}
// Collect helper info from tools and messages
const helperHeader = stainlessHelperHeader(body.tools, body.messages);
return this._client.post('/v1/messages', {
body,
timeout: timeout ?? 600000,
...options,
headers: buildHeaders([helperHeader, options?.headers]),
stream: body.stream ?? false,
}) as APIPromise<Message> | APIPromise<Stream<RawMessageStreamEvent>>;
}
/**
* Send a structured list of input messages with text and/or image content, along with an expected `output_config.format` and
* the response will be automatically parsed and available in the `parsed_output` property of the message.
*
* @example
* ```ts
* const message = await client.messages.parse({
* model: 'claude-sonnet-4-5-20250929',
* max_tokens: 1024,
* messages: [{ role: 'user', content: 'What is 2+2?' }],
* output_config: {
* format: zodOutputFormat(z.object({ answer: z.number() })),
* },
* });
*
* console.log(message.parsed_output?.answer); // 4
* ```
*/
parse<Params extends MessageCreateParamsNonStreaming>(
params: Params,
options?: RequestOptions,
): APIPromise<ParsedMessage<ExtractParsedContentFromParams<Params>>> {
return this.create(params, options).then((message) =>
parseMessage(message, params, { logger: this._client.logger ?? console }),
) as APIPromise<ParsedMessage<ExtractParsedContentFromParams<Params>>>;
}
/**
* Create a Message stream.
*
* If `output_config.format` is provided with a parseable format (like `zodOutputFormat()`),
* the final message will include a `parsed_output` property with the parsed content.
*
* @example
* ```ts
* const stream = client.messages.stream({
* model: 'claude-sonnet-4-5-20250929',
* max_tokens: 1024,
* messages: [{ role: 'user', content: 'What is 2+2?' }],
* output_config: {
* format: zodOutputFormat(z.object({ answer: z.number() })),
* },
* });
*
* const message = await stream.finalMessage();
* console.log(message.parsed_output?.answer); // 4
* ```
*/
stream<Params extends MessageStreamParams>(
body: Params,
options?: RequestOptions,
): MessageStream<ExtractParsedContentFromParams<Params>> {
return MessageStream.createMessage<ExtractParsedContentFromParams<Params>>(
this,
body as MessageCreateParamsBase,
options,
{ logger: this._client.logger ?? console },
);
}
/**
* Count the number of tokens in a Message.
*
* The Token Count API can be used to count the number of tokens in a Message,
* including tools, images, and documents, without creating it.
*
* Learn more about token counting in our
* [user guide](https://docs.claude.com/en/docs/build-with-claude/token-counting)
*
* @example
* ```ts
* const messageTokensCount =
* await client.messages.countTokens({
* messages: [{ content: 'string', role: 'user' }],
* model: 'claude-opus-4-5-20251101',
* });
* ```
*/
countTokens(body: MessageCountTokensParams, options?: RequestOptions): APIPromise<MessageTokensCount> {
return this._client.post('/v1/messages/count_tokens', { body, ...options });
}
}
export interface Base64ImageSource {
data: string;
media_type: 'image/jpeg' | 'image/png' | 'image/gif' | 'image/webp';
type: 'base64';
}
export interface Base64PDFSource {
data: string;
media_type: 'application/pdf';
type: 'base64';
}
export interface CacheControlEphemeral {
type: 'ephemeral';
/**
* The time-to-live for the cache control breakpoint.
*
* This may be one the following values:
*
* - `5m`: 5 minutes
* - `1h`: 1 hour
*
* Defaults to `5m`.
*/
ttl?: '5m' | '1h';
}
export interface CacheCreation {
/**
* The number of input tokens used to create the 1 hour cache entry.
*/
ephemeral_1h_input_tokens: number;
/**
* The number of input tokens used to create the 5 minute cache entry.
*/
ephemeral_5m_input_tokens: number;
}
export interface CitationCharLocation {
cited_text: string;
document_index: number;
document_title: string | null;
end_char_index: number;
file_id: string | null;
start_char_index: number;
type: 'char_location';
}
export interface CitationCharLocationParam {
cited_text: string;
document_index: number;
document_title: string | null;
end_char_index: number;
start_char_index: number;
type: 'char_location';
}
export interface CitationContentBlockLocation {
cited_text: string;
document_index: number;
document_title: string | null;
end_block_index: number;
file_id: string | null;
start_block_index: number;
type: 'content_block_location';
}
export interface CitationContentBlockLocationParam {
cited_text: string;
document_index: number;
document_title: string | null;
end_block_index: number;
start_block_index: number;
type: 'content_block_location';
}
export interface CitationPageLocation {
cited_text: string;
document_index: number;
document_title: string | null;
end_page_number: number;
file_id: string | null;
start_page_number: number;
type: 'page_location';
}
export interface CitationPageLocationParam {
cited_text: string;
document_index: number;
document_title: string | null;
end_page_number: number;
start_page_number: number;
type: 'page_location';
}
export interface CitationSearchResultLocationParam {
cited_text: string;
end_block_index: number;
search_result_index: number;
source: string;
start_block_index: number;
title: string | null;
type: 'search_result_location';
}
export interface CitationWebSearchResultLocationParam {
cited_text: string;
encrypted_index: string;
title: string | null;
type: 'web_search_result_location';
url: string;
}
export interface CitationsConfigParam {
enabled?: boolean;
}
export interface CitationsDelta {
citation:
| CitationCharLocation
| CitationPageLocation
| CitationContentBlockLocation
| CitationsWebSearchResultLocation
| CitationsSearchResultLocation;
type: 'citations_delta';
}
export interface CitationsSearchResultLocation {
cited_text: string;
end_block_index: number;
search_result_index: number;
source: string;
start_block_index: number;
title: string | null;
type: 'search_result_location';
}
export interface CitationsWebSearchResultLocation {
cited_text: string;
encrypted_index: string;
title: string | null;
type: 'web_search_result_location';
url: string;
}
export type ContentBlock =
| TextBlock
| ThinkingBlock
| RedactedThinkingBlock
| ToolUseBlock
| ServerToolUseBlock
| WebSearchToolResultBlock;
/**
* Regular text content.
*/
export type ContentBlockParam =
| TextBlockParam
| ImageBlockParam
| DocumentBlockParam
| SearchResultBlockParam
| ThinkingBlockParam
| RedactedThinkingBlockParam
| ToolUseBlockParam
| ToolResultBlockParam
| ServerToolUseBlockParam
| WebSearchToolResultBlockParam;
export interface ContentBlockSource {
content: string | Array<ContentBlockSourceContent>;
type: 'content';
}
export type ContentBlockSourceContent = TextBlockParam | ImageBlockParam;
export interface DocumentBlockParam {
source: Base64PDFSource | PlainTextSource | ContentBlockSource | URLPDFSource;
type: 'document';
/**
* Create a cache control breakpoint at this content block.
*/
cache_control?: CacheControlEphemeral | null;
citations?: CitationsConfigParam | null;
context?: string | null;
title?: string | null;
}
export interface ImageBlockParam {
source: Base64ImageSource | URLImageSource;
type: 'image';
/**
* Create a cache control breakpoint at this content block.
*/
cache_control?: CacheControlEphemeral | null;
}
export interface InputJSONDelta {
partial_json: string;
type: 'input_json_delta';
}
export interface JSONOutputFormat {
/**
* The JSON schema of the format
*/
schema: { [key: string]: unknown };
type: 'json_schema';
}
export interface Message {
/**
* Unique object identifier.
*
* The format and length of IDs may change over time.
*/
id: string;
/**
* Content generated by the model.
*
* This is an array of content blocks, each of which has a `type` that determines
* its shape.
*
* Example:
*
* ```json
* [{ "type": "text", "text": "Hi, I'm Claude." }]
* ```
*
* If the request input `messages` ended with an `assistant` turn, then the
* response `content` will continue directly from that last turn. You can use this
* to constrain the model's output.
*
* For example, if the input `messages` were:
*
* ```json
* [
* {
* "role": "user",
* "content": "What's the Greek name for Sun? (A) Sol (B) Helios (C) Sun"
* },
* { "role": "assistant", "content": "The best answer is (" }
* ]
* ```
*
* Then the response `content` might be:
*
* ```json
* [{ "type": "text", "text": "B)" }]
* ```
*/
content: Array<ContentBlock>;
/**
* The model that will complete your prompt.\n\nSee
* [models](https://docs.anthropic.com/en/docs/models-overview) for additional
* details and options.
*/
model: Model;
/**
* Conversational role of the generated message.
*
* This will always be `"assistant"`.
*/
role: 'assistant';
/**
* The reason that we stopped.
*
* This may be one the following values:
*
* - `"end_turn"`: the model reached a natural stopping point
* - `"max_tokens"`: we exceeded the requested `max_tokens` or the model's maximum
* - `"stop_sequence"`: one of your provided custom `stop_sequences` was generated
* - `"tool_use"`: the model invoked one or more tools
* - `"pause_turn"`: we paused a long-running turn. You may provide the response
* back as-is in a subsequent request to let the model continue.
* - `"refusal"`: when streaming classifiers intervene to handle potential policy
* violations
*
* In non-streaming mode this value is always non-null. In streaming mode, it is
* null in the `message_start` event and non-null otherwise.
*/
stop_reason: StopReason | null;
/**
* Which custom stop sequence was generated, if any.
*
* This value will be a non-null string if one of your custom stop sequences was
* generated.
*/
stop_sequence: string | null;
/**
* Object type.
*
* For Messages, this is always `"message"`.
*/
type: 'message';
/**
* Billing and rate-limit usage.
*
* Anthropic's API bills and rate-limits by token counts, as tokens represent the
* underlying cost to our systems.
*
* Under the hood, the API transforms requests into a format suitable for the
* model. The model's output then goes through a parsing stage before becoming an
* API response. As a result, the token counts in `usage` will not match one-to-one
* with the exact visible content of an API request or response.
*
* For example, `output_tokens` will be non-zero, even for an empty string response
* from Claude.
*
* Total input tokens in a request is the summation of `input_tokens`,
* `cache_creation_input_tokens`, and `cache_read_input_tokens`.
*/
usage: Usage;
}
export type MessageCountTokensTool =
| Tool
| ToolBash20250124
| ToolTextEditor20250124
| ToolTextEditor20250429
| ToolTextEditor20250728
| WebSearchTool20250305;
export interface MessageDeltaUsage {
/**
* The cumulative number of input tokens used to create the cache entry.
*/
cache_creation_input_tokens: number | null;
/**
* The cumulative number of input tokens read from the cache.
*/
cache_read_input_tokens: number | null;
/**
* The cumulative number of input tokens which were used.
*/
input_tokens: number | null;
/**
* The cumulative number of output tokens which were used.
*/
output_tokens: number;
/**
* The number of server tool requests.
*/
server_tool_use: ServerToolUsage | null;
}
export interface MessageParam {
content: string | Array<ContentBlockParam>;
role: 'user' | 'assistant';
}
export interface MessageTokensCount {
/**
* The total number of tokens across the provided list of messages, system prompt,
* and tools.
*/
input_tokens: number;
}
export interface Metadata {
/**
* An external identifier for the user who is associated with the request.
*
* This should be a uuid, hash value, or other opaque identifier. Anthropic may use
* this id to help detect abuse. Do not include any identifying information such as
* name, email address, or phone number.
*/
user_id?: string | null;
}
/**
* The model that will complete your prompt.\n\nSee
* [models](https://docs.anthropic.com/en/docs/models-overview) for additional
* details and options.
*/
export type Model =
| 'claude-opus-4-5-20251101'
| 'claude-opus-4-5'
| 'claude-3-7-sonnet-latest'
| 'claude-3-7-sonnet-20250219'
| 'claude-3-5-haiku-latest'
| 'claude-3-5-haiku-20241022'
| 'claude-haiku-4-5'
| 'claude-haiku-4-5-20251001'
| 'claude-sonnet-4-20250514'
| 'claude-sonnet-4-0'
| 'claude-4-sonnet-20250514'
| 'claude-sonnet-4-5'
| 'claude-sonnet-4-5-20250929'
| 'claude-opus-4-0'
| 'claude-opus-4-20250514'
| 'claude-4-opus-20250514'
| 'claude-opus-4-1-20250805'
| 'claude-3-opus-latest'
| 'claude-3-opus-20240229'
| 'claude-3-haiku-20240307'
| (string & {});
export interface OutputConfig {
/**
* A schema to specify Claude's output format in responses. See
* [structured outputs](https://platform.claude.com/docs/en/build-with-claude/structured-outputs)
*/
format?: JSONOutputFormat | null;
}
const DEPRECATED_MODELS: {
[K in Model]?: string;
} = {
'claude-1.3': 'November 6th, 2024',
'claude-1.3-100k': 'November 6th, 2024',
'claude-instant-1.1': 'November 6th, 2024',
'claude-instant-1.1-100k': 'November 6th, 2024',
'claude-instant-1.2': 'November 6th, 2024',
'claude-3-sonnet-20240229': 'July 21st, 2025',
'claude-3-opus-20240229': 'January 5th, 2026',
'claude-2.1': 'July 21st, 2025',
'claude-2.0': 'July 21st, 2025',
'claude-3-7-sonnet-latest': 'February 19th, 2026',
'claude-3-7-sonnet-20250219': 'February 19th, 2026',
'claude-3-5-haiku-latest': 'February 19th, 2026',
'claude-3-5-haiku-20241022': 'February 19th, 2026',
};
export interface PlainTextSource {
data: string;
media_type: 'text/plain';
type: 'text';
}
export type RawContentBlockDelta =
| TextDelta
| InputJSONDelta
| CitationsDelta
| ThinkingDelta
| SignatureDelta;
export interface RawContentBlockDeltaEvent {
delta: RawContentBlockDelta;
index: number;
type: 'content_block_delta';
}
export interface RawContentBlockStartEvent {
content_block:
| TextBlock
| ThinkingBlock
| RedactedThinkingBlock
| ToolUseBlock
| ServerToolUseBlock
| WebSearchToolResultBlock;
index: number;
type: 'content_block_start';
}
export interface RawContentBlockStopEvent {
index: number;
type: 'content_block_stop';
}
export interface RawMessageDeltaEvent {
delta: RawMessageDeltaEvent.Delta;
type: 'message_delta';
/**
* Billing and rate-limit usage.
*
* Anthropic's API bills and rate-limits by token counts, as tokens represent the
* underlying cost to our systems.
*
* Under the hood, the API transforms requests into a format suitable for the
* model. The model's output then goes through a parsing stage before becoming an
* API response. As a result, the token counts in `usage` will not match one-to-one
* with the exact visible content of an API request or response.
*
* For example, `output_tokens` will be non-zero, even for an empty string response
* from Claude.
*
* Total input tokens in a request is the summation of `input_tokens`,
* `cache_creation_input_tokens`, and `cache_read_input_tokens`.
*/
usage: MessageDeltaUsage;
}
export namespace RawMessageDeltaEvent {
export interface Delta {
stop_reason: MessagesAPI.StopReason | null;
stop_sequence: string | null;
}
}
export interface RawMessageStartEvent {
message: Message;
type: 'message_start';
}
export interface RawMessageStopEvent {
type: 'message_stop';
}
export type RawMessageStreamEvent =
| RawMessageStartEvent
| RawMessageDeltaEvent
| RawMessageStopEvent
| RawContentBlockStartEvent
| RawContentBlockDeltaEvent
| RawContentBlockStopEvent;
export interface RedactedThinkingBlock {
data: string;
type: 'redacted_thinking';
}
export interface RedactedThinkingBlockParam {
data: string;
type: 'redacted_thinking';
}
export interface SearchResultBlockParam {
content: Array<TextBlockParam>;
source: string;
title: string;
type: 'search_result';
/**
* Create a cache control breakpoint at this content block.
*/
cache_control?: CacheControlEphemeral | null;
citations?: CitationsConfigParam;
}
export interface ServerToolUsage {
/**
* The number of web search tool requests.
*/
web_search_requests: number;
}
export interface ServerToolUseBlock {
id: string;
input: unknown;
name: 'web_search';
type: 'server_tool_use';
}
export interface ServerToolUseBlockParam {
id: string;
input: unknown;
name: 'web_search';
type: 'server_tool_use';
/**
* Create a cache control breakpoint at this content block.
*/
cache_control?: CacheControlEphemeral | null;
}
export interface SignatureDelta {
signature: string;
type: 'signature_delta';
}
export type StopReason = 'end_turn' | 'max_tokens' | 'stop_sequence' | 'tool_use' | 'pause_turn' | 'refusal';
export interface TextBlock {
/**
* Citations supporting the text block.
*
* The type of citation returned will depend on the type of document being cited.
* Citing a PDF results in `page_location`, plain text results in `char_location`,
* and content document results in `content_block_location`.
*/
citations: Array<TextCitation> | null;
text: string;
type: 'text';
}
export interface TextBlockParam {
text: string;
type: 'text';
/**
* Create a cache control breakpoint at this content block.
*/
cache_control?: CacheControlEphemeral | null;
citations?: Array<TextCitationParam> | null;
}
export type TextCitation =
| CitationCharLocation
| CitationPageLocation
| CitationContentBlockLocation
| CitationsWebSearchResultLocation
| CitationsSearchResultLocation;
export type TextCitationParam =
| CitationCharLocationParam
| CitationPageLocationParam
| CitationContentBlockLocationParam
| CitationWebSearchResultLocationParam
| CitationSearchResultLocationParam;
export interface TextDelta {
text: string;
type: 'text_delta';
}
export interface ThinkingBlock {
signature: string;
thinking: string;
type: 'thinking';
}
export interface ThinkingBlockParam {
signature: string;
thinking: string;
type: 'thinking';
}
export interface ThinkingConfigDisabled {
type: 'disabled';
}
export interface ThinkingConfigEnabled {
/**
* Determines how many tokens Claude can use for its internal reasoning process.
* Larger budgets can enable more thorough analysis for complex problems, improving
* response quality.
*
* Must be ≥1024 and less than `max_tokens`.
*
* See
* [extended thinking](https://docs.claude.com/en/docs/build-with-claude/extended-thinking)
* for details.
*/
budget_tokens: number;
type: 'enabled';
}
/**
* Configuration for enabling Claude's extended thinking.
*
* When enabled, responses include `thinking` content blocks showing Claude's
* thinking process before the final answer. Requires a minimum budget of 1,024
* tokens and counts towards your `max_tokens` limit.
*
* See
* [extended thinking](https://docs.claude.com/en/docs/build-with-claude/extended-thinking)
* for details.
*/
export type ThinkingConfigParam = ThinkingConfigEnabled | ThinkingConfigDisabled;
export interface ThinkingDelta {
thinking: string;
type: 'thinking_delta';
}
export interface Tool {
/**
* [JSON schema](https://json-schema.org/draft/2020-12) for this tool's input.
*
* This defines the shape of the `input` that your tool accepts and that the model
* will produce.
*/
input_schema: Tool.InputSchema;
/**
* Name of the tool.
*
* This is how the tool will be called by the model and in `tool_use` blocks.
*/
name: string;
/**
* Create a cache control breakpoint at this content block.
*/
cache_control?: CacheControlEphemeral | null;
/**
* Description of what this tool does.
*
* Tool descriptions should be as detailed as possible. The more information that
* the model has about what the tool is and how to use it, the better it will
* perform. You can use natural language descriptions to reinforce important
* aspects of the tool input JSON schema.
*/
description?: string;
/**
* When true, guarantees schema validation on tool names and inputs
*/
strict?: boolean;
type?: 'custom' | null;
}
export namespace Tool {
/**
* [JSON schema](https://json-schema.org/draft/2020-12) for this tool's input.
*
* This defines the shape of the `input` that your tool accepts and that the model
* will produce.
*/
export interface InputSchema {
type: 'object';
properties?: unknown | null;
required?: Array<string> | null;
[k: string]: unknown;
}
}
export interface ToolBash20250124 {
/**
* Name of the tool.
*
* This is how the tool will be called by the model and in `tool_use` blocks.
*/
name: 'bash';
type: 'bash_20250124';
/**
* Create a cache control breakpoint at this content block.
*/
cache_control?: CacheControlEphemeral | null;
/**
* When true, guarantees schema validation on tool names and inputs
*/
strict?: boolean;
}
/**
* How the model should use the provided tools. The model can use a specific tool,
* any available tool, decide by itself, or not use tools at all.
*/
export type ToolChoice = ToolChoiceAuto | ToolChoiceAny | ToolChoiceTool | ToolChoiceNone;
/**
* The model will use any available tools.
*/
export interface ToolChoiceAny {
type: 'any';
/**
* Whether to disable parallel tool use.
*
* Defaults to `false`. If set to `true`, the model will output exactly one tool
* use.
*/
disable_parallel_tool_use?: boolean;
}
/**
* The model will automatically decide whether to use tools.
*/
export interface ToolChoiceAuto {
type: 'auto';
/**
* Whether to disable parallel tool use.
*
* Defaults to `false`. If set to `true`, the model will output at most one tool
* use.
*/
disable_parallel_tool_use?: boolean;
}
/**
* The model will not be allowed to use tools.
*/
export interface ToolChoiceNone {
type: 'none';
}
/**
* The model will use the specified tool with `tool_choice.name`.
*/
export interface ToolChoiceTool {
/**
* The name of the tool to use.
*/
name: string;
type: 'tool';
/**
* Whether to disable parallel tool use.
*
* Defaults to `false`. If set to `true`, the model will output exactly one tool
* use.
*/
disable_parallel_tool_use?: boolean;
}
export interface ToolResultBlockParam {
tool_use_id: string;
type: 'tool_result';
/**
* Create a cache control breakpoint at this content block.
*/
cache_control?: CacheControlEphemeral | null;
content?: string | Array<TextBlockParam | ImageBlockParam | SearchResultBlockParam | DocumentBlockParam>;
is_error?: boolean;
}
export interface ToolTextEditor20250124 {
/**
* Name of the tool.
*
* This is how the tool will be called by the model and in `tool_use` blocks.
*/
name: 'str_replace_editor';
type: 'text_editor_20250124';
/**
* Create a cache control breakpoint at this content block.
*/
cache_control?: CacheControlEphemeral | null;
/**
* When true, guarantees schema validation on tool names and inputs
*/
strict?: boolean;
}
export interface ToolTextEditor20250429 {
/**
* Name of the tool.
*
* This is how the tool will be called by the model and in `tool_use` blocks.
*/
name: 'str_replace_based_edit_tool';
type: 'text_editor_20250429';
/**
* Create a cache control breakpoint at this content block.
*/
cache_control?: CacheControlEphemeral | null;
/**
* When true, guarantees schema validation on tool names and inputs
*/
strict?: boolean;
}
export interface ToolTextEditor20250728 {
/**
* Name of the tool.
*
* This is how the tool will be called by the model and in `tool_use` blocks.
*/
name: 'str_replace_based_edit_tool';
type: 'text_editor_20250728';
/**
* Create a cache control breakpoint at this content block.
*/
cache_control?: CacheControlEphemeral | null;
/**
* Maximum number of characters to display when viewing a file. If not specified,
* defaults to displaying the full file.
*/
max_characters?: number | null;
/**
* When true, guarantees schema validation on tool names and inputs
*/
strict?: boolean;
}
export type ToolUnion =
| Tool
| ToolBash20250124
| ToolTextEditor20250124
| ToolTextEditor20250429
| ToolTextEditor20250728
| WebSearchTool20250305;
export interface ToolUseBlock {
id: string;
input: unknown;
name: string;
type: 'tool_use';
}
export interface ToolUseBlockParam {
id: string;
input: unknown;
name: string;
type: 'tool_use';
/**
* Create a cache control breakpoint at this content block.
*/
cache_control?: CacheControlEphemeral | null;
}
export interface URLImageSource {
type: 'url';
url: string;
}
export interface URLPDFSource {
type: 'url';
url: string;
}
export interface Usage {
/**
* Breakdown of cached tokens by TTL
*/
cache_creation: CacheCreation | null;
/**
* The number of input tokens used to create the cache entry.
*/
cache_creation_input_tokens: number | null;
/**
* The number of input tokens read from the cache.
*/
cache_read_input_tokens: number | null;
/**
* The number of input tokens which were used.
*/
input_tokens: number;
/**
* The number of output tokens which were used.
*/
output_tokens: number;
/**
* The number of server tool requests.
*/
server_tool_use: ServerToolUsage | null;
/**
* If the request used the priority, standard, or batch tier.
*/
service_tier: 'standard' | 'priority' | 'batch' | null;
}
export interface WebSearchResultBlock {
encrypted_content: string;
page_age: string | null;
title: string;
type: 'web_search_result';
url: string;
}
export interface WebSearchResultBlockParam {
encrypted_content: string;
title: string;
type: 'web_search_result';
url: string;
page_age?: string | null;
}
export interface WebSearchTool20250305 {
/**
* Name of the tool.
*
* This is how the tool will be called by the model and in `tool_use` blocks.
*/
name: 'web_search';
type: 'web_search_20250305';
/**
* If provided, only these domains will be included in results. Cannot be used
* alongside `blocked_domains`.
*/
allowed_domains?: Array<string> | null;
/**
* If provided, these domains will never appear in results. Cannot be used
* alongside `allowed_domains`.
*/
blocked_domains?: Array<string> | null;
/**
* Create a cache control breakpoint at this content block.
*/
cache_control?: CacheControlEphemeral | null;
/**
* Maximum number of times the tool can be used in the API request.
*/
max_uses?: number | null;
/**
* When true, guarantees schema validation on tool names and inputs
*/
strict?: boolean;
/**
* Parameters for the user's location. Used to provide more relevant search
* results.
*/
user_location?: WebSearchTool20250305.UserLocation | null;
}
export namespace WebSearchTool20250305 {
/**
* Parameters for the user's location. Used to provide more relevant search
* results.
*/
export interface UserLocation {
type: 'approximate';
/**
* The city of the user.
*/
city?: string | null;
/**
* The two letter
* [ISO country code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) of the
* user.
*/
country?: string | null;
/**
* The region of the user.
*/
region?: string | null;
/**
* The [IANA timezone](https://nodatime.org/TimeZones) of the user.
*/
timezone?: string | null;
}
}
export interface WebSearchToolRequestError {
error_code:
| 'invalid_tool_input'
| 'unavailable'
| 'max_uses_exceeded'
| 'too_many_requests'
| 'query_too_long'
| 'request_too_large';
type: 'web_search_tool_result_error';
}
export interface WebSearchToolResultBlock {
content: WebSearchToolResultBlockContent;
tool_use_id: string;
type: 'web_search_tool_result';
}
export type WebSearchToolResultBlockContent = WebSearchToolResultError | Array<WebSearchResultBlock>;
export interface WebSearchToolResultBlockParam {
content: WebSearchToolResultBlockParamContent;
tool_use_id: string;
type: 'web_search_tool_result';
/**
* Create a cache control breakpoint at this content block.
*/
cache_control?: CacheControlEphemeral | null;
}
export type WebSearchToolResultBlockParamContent =
| Array<WebSearchResultBlockParam>
| WebSearchToolRequestError;
export interface WebSearchToolResultError {
error_code:
| 'invalid_tool_input'
| 'unavailable'
| 'max_uses_exceeded'
| 'too_many_requests'
| 'query_too_long'
| 'request_too_large';
type: 'web_search_tool_result_error';
}
export type MessageStreamEvent = RawMessageStreamEvent;
export type MessageStartEvent = RawMessageStartEvent;
export type MessageDeltaEvent = RawMessageDeltaEvent;
export type MessageStopEvent = RawMessageStopEvent;
export type ContentBlockStartEvent = RawContentBlockStartEvent;
export type ContentBlockDeltaEvent = RawContentBlockDeltaEvent;
export type ContentBlockStopEvent = RawContentBlockStopEvent;
export type MessageCreateParams = MessageCreateParamsNonStreaming | MessageCreateParamsStreaming;
export interface MessageCreateParamsBase {
/**
* The maximum number of tokens to generate before stopping.
*
* Note that our models may stop _before_ reaching this maximum. This parameter
* only specifies the absolute maximum number of tokens to generate.
*
* Different models have different maximum values for this parameter. See
* [models](https://docs.claude.com/en/docs/models-overview) for details.
*/
max_tokens: number;
/**
* Input messages.
*
* Our models are trained to operate on alternating `user` and `assistant`
* conversational turns. When creating a new `Message`, you specify the prior
* conversational turns with the `messages` parameter, and the model then generates
* the next `Message` in the conversation. Consecutive `user` or `assistant` turns
* in your request will be combined into a single turn.
*
* Each input message must be an object with a `role` and `content`. You can
* specify a single `user`-role message, or you can include multiple `user` and
* `assistant` messages.
*
* If the final message uses the `assistant` role, the response content will
* continue immediately from the content in that message. This can be used to
* constrain part of the model's response.
*
* Example with a single `user` message:
*
* ```json
* [{ "role": "user", "content": "Hello, Claude" }]
* ```
*
* Example with multiple conversational turns:
*
* ```json
* [
* { "role": "user", "content": "Hello there." },
* { "role": "assistant", "content": "Hi, I'm Claude. How can I help you?" },
* { "role": "user", "content": "Can you explain LLMs in plain English?" }
* ]
* ```
*
* Example with a partially-filled response from Claude:
*
* ```json
* [
* {
* "role": "user",
* "content": "What's the Greek name for Sun? (A) Sol (B) Helios (C) Sun"
* },
* { "role": "assistant", "content": "The best answer is (" }
* ]
* ```
*
* Each input message `content` may be either a single `string` or an array of
* content blocks, where each block has a specific `type`. Using a `string` for
* `content` is shorthand for an array of one content block of type `"text"`. The
* following input messages are equivalent:
*
* ```json
* { "role": "user", "content": "Hello, Claude" }
* ```
*
* ```json
* { "role": "user", "content": [{ "type": "text", "text": "Hello, Claude" }] }
* ```
*
* See [input examples](https://docs.claude.com/en/api/messages-examples).
*
* Note that if you want to include a
* [system prompt](https://docs.claude.com/en/docs/system-prompts), you can use the
* top-level `system` parameter — there is no `"system"` role for input messages in
* the Messages API.
*
* There is a limit of 100,000 messages in a single request.
*/
messages: Array<MessageParam>;
/**
* The model that will complete your prompt.\n\nSee
* [models](https://docs.anthropic.com/en/docs/models-overview) for additional
* details and options.
*/
model: Model;
/**
* An object describing metadata about the request.
*/
metadata?: Metadata;
/**
* Configuration options for the model's output, such as the output format.
*/
output_config?: OutputConfig;
/**
* Determines whether to use priority capacity (if available) or standard capacity
* for this request.
*
* Anthropic offers different levels of service for your API requests. See
* [service-tiers](https://docs.claude.com/en/api/service-tiers) for details.
*/
service_tier?: 'auto' | 'standard_only';
/**
* Custom text sequences that will cause the model to stop generating.
*
* Our models will normally stop when they have naturally completed their turn,
* which will result in a response `stop_reason` of `"end_turn"`.
*
* If you want the model to stop generating when it encounters custom strings of
* text, you can use the `stop_sequences` parameter. If the model encounters one of
* the custom sequences, the response `stop_reason` value will be `"stop_sequence"`
* and the response `stop_sequence` value will contain the matched stop sequence.
*/
stop_sequences?: Array<string>;
/**
* Whether to incrementally stream the response using server-sent events.
*
* See [streaming](https://docs.claude.com/en/api/messages-streaming) for details.
*/
stream?: boolean;
/**
* System prompt.
*
* A system prompt is a way of providing context and instructions to Claude, such
* as specifying a particular goal or role. See our
* [guide to system prompts](https://docs.claude.com/en/docs/system-prompts).
*/
system?: string | Array<TextBlockParam>;
/**
* Amount of randomness injected into the response.
*
* Defaults to `1.0`. Ranges from `0.0` to `1.0`. Use `temperature` closer to `0.0`
* for analytical / multiple choice, and closer to `1.0` for creative and
* generative tasks.
*
* Note that even with `temperature` of `0.0`, the results will not be fully
* deterministic.
*/
temperature?: number;
/**
* Configuration for enabling Claude's extended thinking.
*
* When enabled, responses include `thinking` content blocks showing Claude's
* thinking process before the final answer. Requires a minimum budget of 1,024
* tokens and counts towards your `max_tokens` limit.
*
* See
* [extended thinking](https://docs.claude.com/en/docs/build-with-claude/extended-thinking)
* for details.
*/
thinking?: ThinkingConfigParam;
/**
* How the model should use the provided tools. The model can use a specific tool,
* any available tool, decide by itself, or not use tools at all.
*/
tool_choice?: ToolChoice;
/**
* Definitions of tools that the model may use.
*
* If you include `tools` in your API request, the model may return `tool_use`
* content blocks that represent the model's use of those tools. You can then run
* those tools using the tool input generated by the model and then optionally
* return results back to the model using `tool_result` content blocks.
*
* There are two types of tools: **client tools** and **server tools**. The
* behavior described below applies to client tools. For
* [server tools](https://docs.claude.com/en/docs/agents-and-tools/tool-use/overview#server-tools),
* see their individual documentation as each has its own behavior (e.g., the
* [web search tool](https://docs.claude.com/en/docs/agents-and-tools/tool-use/web-search-tool)).
*
* Each tool definition includes:
*
* - `name`: Name of the tool.
* - `description`: Optional, but strongly-recommended description of the tool.
* - `input_schema`: [JSON schema](https://json-schema.org/draft/2020-12) for the
* tool `input` shape that the model will produce in `tool_use` output content
* blocks.
*
* For example, if you defined `tools` as:
*
* ```json
* [
* {
* "name": "get_stock_price",
* "description": "Get the current stock price for a given ticker symbol.",
* "input_schema": {
* "type": "object",
* "properties": {
* "ticker": {
* "type": "string",
* "description": "The stock ticker symbol, e.g. AAPL for Apple Inc."
* }
* },
* "required": ["ticker"]
* }
* }
* ]
* ```
*
* And then asked the model "What's the S&P 500 at today?", the model might produce
* `tool_use` content blocks in the response like this:
*
* ```json
* [
* {
* "type": "tool_use",
* "id": "toolu_01D7FLrfh4GYq7yT1ULFeyMV",
* "name": "get_stock_price",
* "input": { "ticker": "^GSPC" }
* }
* ]
* ```
*
* You might then run your `get_stock_price` tool with `{"ticker": "^GSPC"}` as an
* input, and return the following back to the model in a subsequent `user`
* message:
*
* ```json
* [
* {
* "type": "tool_result",
* "tool_use_id": "toolu_01D7FLrfh4GYq7yT1ULFeyMV",
* "content": "259.75 USD"
* }
* ]
* ```
*
* Tools can be used for workflows that include running client-side tools and
* functions, or more generally whenever you want the model to produce a particular
* JSON structure of output.
*
* See our [guide](https://docs.claude.com/en/docs/tool-use) for more details.
*/
tools?: Array<ToolUnion>;
/**
* Only sample from the top K options for each subsequent token.
*
* Used to remove "long tail" low probability responses.
* [Learn more technical details here](https://towardsdatascience.com/how-to-sample-from-language-models-682bceb97277).
*
* Recommended for advanced use cases only. You usually only need to use
* `temperature`.
*/
top_k?: number;
/**
* Use nucleus sampling.
*
* In nucleus sampling, we compute the cumulative distribution over all the options
* for each subsequent token in decreasing probability order and cut it off once it
* reaches a particular probability specified by `top_p`. You should either alter
* `temperature` or `top_p`, but not both.
*
* Recommended for advanced use cases only. You usually only need to use
* `temperature`.
*/
top_p?: number;
}
export namespace MessageCreateParams {
export type MessageCreateParamsNonStreaming = MessagesAPI.MessageCreateParamsNonStreaming;
export type MessageCreateParamsStreaming = MessagesAPI.MessageCreateParamsStreaming;
}
export interface MessageCreateParamsNonStreaming extends MessageCreateParamsBase {
/**
* Whether to incrementally stream the response using server-sent events.
*
* See [streaming](https://docs.claude.com/en/api/messages-streaming) for details.
*/
stream?: false;
}
export interface MessageCreateParamsStreaming extends MessageCreateParamsBase {
/**
* Whether to incrementally stream the response using server-sent events.
*
* See [streaming](https://docs.claude.com/en/api/messages-streaming) for details.
*/
stream: true;
}
export type MessageStreamParams = ParseableMessageCreateParams;
export interface MessageCountTokensParams {
/**
* Input messages.
*
* Our models are trained to operate on alternating `user` and `assistant`
* conversational turns. When creating a new `Message`, you specify the prior
* conversational turns with the `messages` parameter, and the model then generates
* the next `Message` in the conversation. Consecutive `user` or `assistant` turns
* in your request will be combined into a single turn.
*
* Each input message must be an object with a `role` and `content`. You can
* specify a single `user`-role message, or you can include multiple `user` and
* `assistant` messages.
*
* If the final message uses the `assistant` role, the response content will
* continue immediately from the content in that message. This can be used to
* constrain part of the model's response.
*
* Example with a single `user` message:
*
* ```json
* [{ "role": "user", "content": "Hello, Claude" }]
* ```
*
* Example with multiple conversational turns:
*
* ```json
* [
* { "role": "user", "content": "Hello there." },
* { "role": "assistant", "content": "Hi, I'm Claude. How can I help you?" },
* { "role": "user", "content": "Can you explain LLMs in plain English?" }
* ]
* ```
*
* Example with a partially-filled response from Claude:
*
* ```json
* [
* {
* "role": "user",
* "content": "What's the Greek name for Sun? (A) Sol (B) Helios (C) Sun"
* },
* { "role": "assistant", "content": "The best answer is (" }
* ]
* ```
*
* Each input message `content` may be either a single `string` or an array of
* content blocks, where each block has a specific `type`. Using a `string` for
* `content` is shorthand for an array of one content block of type `"text"`. The
* following input messages are equivalent:
*
* ```json
* { "role": "user", "content": "Hello, Claude" }
* ```
*
* ```json
* { "role": "user", "content": [{ "type": "text", "text": "Hello, Claude" }] }
* ```
*
* See [input examples](https://docs.claude.com/en/api/messages-examples).
*
* Note that if you want to include a
* [system prompt](https://docs.claude.com/en/docs/system-prompts), you can use the
* top-level `system` parameter — there is no `"system"` role for input messages in
* the Messages API.
*
* There is a limit of 100,000 messages in a single request.
*/
messages: Array<MessageParam>;
/**
* The model that will complete your prompt.\n\nSee
* [models](https://docs.anthropic.com/en/docs/models-overview) for additional
* details and options.
*/
model: Model;
/**
* Configuration options for the model's output, such as the output format.
*/
output_config?: OutputConfig;
/**
* System prompt.
*
* A system prompt is a way of providing context and instructions to Claude, such
* as specifying a particular goal or role. See our
* [guide to system prompts](https://docs.claude.com/en/docs/system-prompts).
*/
system?: string | Array<TextBlockParam>;
/**
* Configuration for enabling Claude's extended thinking.
*
* When enabled, responses include `thinking` content blocks showing Claude's
* thinking process before the final answer. Requires a minimum budget of 1,024
* tokens and counts towards your `max_tokens` limit.
*
* See
* [extended thinking](https://docs.claude.com/en/docs/build-with-claude/extended-thinking)
* for details.
*/
thinking?: ThinkingConfigParam;
/**
* How the model should use the provided tools. The model can use a specific tool,
* any available tool, decide by itself, or not use tools at all.
*/
tool_choice?: ToolChoice;
/**
* Definitions of tools that the model may use.
*
* If you include `tools` in your API request, the model may return `tool_use`
* content blocks that represent the model's use of those tools. You can then run
* those tools using the tool input generated by the model and then optionally
* return results back to the model using `tool_result` content blocks.
*
* There are two types of tools: **client tools** and **server tools**. The
* behavior described below applies to client tools. For
* [server tools](https://docs.claude.com/en/docs/agents-and-tools/tool-use/overview#server-tools),
* see their individual documentation as each has its own behavior (e.g., the
* [web search tool](https://docs.claude.com/en/docs/agents-and-tools/tool-use/web-search-tool)).
*
* Each tool definition includes:
*
* - `name`: Name of the tool.
* - `description`: Optional, but strongly-recommended description of the tool.
* - `input_schema`: [JSON schema](https://json-schema.org/draft/2020-12) for the
* tool `input` shape that the model will produce in `tool_use` output content
* blocks.
*
* For example, if you defined `tools` as:
*
* ```json
* [
* {
* "name": "get_stock_price",
* "description": "Get the current stock price for a given ticker symbol.",
* "input_schema": {
* "type": "object",
* "properties": {
* "ticker": {
* "type": "string",
* "description": "The stock ticker symbol, e.g. AAPL for Apple Inc."
* }
* },
* "required": ["ticker"]
* }
* }
* ]
* ```
*
* And then asked the model "What's the S&P 500 at today?", the model might produce
* `tool_use` content blocks in the response like this:
*
* ```json
* [
* {
* "type": "tool_use",
* "id": "toolu_01D7FLrfh4GYq7yT1ULFeyMV",
* "name": "get_stock_price",
* "input": { "ticker": "^GSPC" }
* }
* ]
* ```
*
* You might then run your `get_stock_price` tool with `{"ticker": "^GSPC"}` as an
* input, and return the following back to the model in a subsequent `user`
* message:
*
* ```json
* [
* {
* "type": "tool_result",
* "tool_use_id": "toolu_01D7FLrfh4GYq7yT1ULFeyMV",
* "content": "259.75 USD"
* }
* ]
* ```
*
* Tools can be used for workflows that include running client-side tools and
* functions, or more generally whenever you want the model to produce a particular
* JSON structure of output.
*
*