Anthropic TypeScript API Library
The Anthropic TypeScript library provides convenient access to the Anthropic REST API from applications written in server-side JavaScript.
It includes TypeScript definitions for all request params and response fields.
Migration from v0.4.x and below
In v0.5.0
, we introduced a fully rewritten SDK. The new version offers better error handling, a more robust and intuitive streaming implementation, and more.
Key interface changes:
new Client(apiKey)
→ new Anthropic({ apiKey })
client.complete()
→ client.completions.create()
client.completeStream()
→ client.completions.create({ stream: true })
onUpdate
callback → for await (const x of stream)
- full message in stream → delta of message in stream
Example diff
// Import "Anthropic" instead of "Client":
- import { Client, HUMAN_PROMPT, AI_PROMPT } from '@anthropic-ai/sdk';
+ import Anthropic, { HUMAN_PROMPT, AI_PROMPT } from '@anthropic-ai/sdk';
// Instantiate with "apiKey" as an object property:
- const client = new Client(apiKey);
+ const client = new Anthropic({ apiKey });
// or, simply provide an ANTHROPIC_API_KEY environment variable:
+ const client = new Anthropic();
async function main() {
// Request & response types are the same as before, but better-typed.
const params = {
prompt: `${HUMAN_PROMPT} How many toes do dogs have?${AI_PROMPT}`,
max_tokens_to_sample: 200,
model: "claude-1",
};
// Instead of "client.complete()", you now call "client.completions.create()":
- await client.complete(params);
+ await client.completions.create(params);
// Streaming requests now use async iterators instead of callbacks:
- client.completeStream(params, {
- onUpdate: (completion) => {
- console.log(completion.completion); // full text
- },
- });
+ const stream = await client.completions.create({ ...params, stream: true });
+ for await (const completion of stream) {
+ process.stdout.write(completion.completion); // incremental text
+ }
// And, since this library uses `Anthropic-Version: 2023-06-01`,
// completion streams are now incremental diffs of text
// rather than sending the whole message every time:
let text = '';
- await client.completeStream(params, {
- onUpdate: (completion) => {
- const diff = completion.completion.replace(text, "");
- text = completion.completion;
- process.stdout.write(diff);
- },
- });
+ const stream = await client.completions.create({ ...params, stream: true });
+ for await (const completion of stream) {
+ const diff = completion.completion;
+ text += diff;
+ process.stdout.write(diff);
+ }
console.log('Done; final text is:')
console.log(text)
}
main();
Documentation
The API documentation can be found here.
Installation
npm install --save @anthropic-ai/sdk
yarn add @anthropic-ai/sdk
Usage
import Anthropic from '@anthropic-ai/sdk';
const anthropic = new Anthropic({
apiKey: 'my api key',
});
async function main() {
const completion = await anthropic.completions.create({
model: 'claude-2',
max_tokens_to_sample: 300,
prompt: `${Anthropic.HUMAN_PROMPT} how does a court case get to the Supreme Court? ${Anthropic.AI_PROMPT}`,
});
}
main();
Streaming Responses
We provide support for streaming responses using Server Side Events (SSE).
import Anthropic from '@anthropic-ai/sdk';
const anthropic = new Anthropic();
const stream = await anthropic.completions.create({
prompt: `${Anthropic.HUMAN_PROMPT} Your prompt here ${Anthropic.AI_PROMPT}`,
model: 'claude-2',
stream: true,
max_tokens_to_sample: 300,
});
for await (const completion of stream) {
console.log(completion.completion);
}
If you need to cancel a stream, you can break
from the loop
or call stream.controller.abort()
.
Usage with TypeScript
Importing, instantiating, and interacting with the library are the same as above.
If you like, you may reference our types directly:
import Anthropic from '@anthropic-ai/sdk';
const anthropic = new Anthropic({
apiKey: 'my api key',
});
async function main() {
const params: Anthropic.CompletionCreateParams = {
prompt: `${Anthropic.HUMAN_PROMPT} how does a court case get to the Supreme Court? ${Anthropic.AI_PROMPT}`,
max_tokens_to_sample: 300,
model: 'claude-2',
};
const completion: Anthropic.Completion = await anthropic.completions.create(params);
}
main();
Documentation for each method, request param, and response field are available in docstrings and will appear on hover in most modern editors.
Counting Tokens
We provide a separate package for counting how many tokens a given piece of text contains.
See the repository documentation for more details.
Handling errors
When the library is unable to connect to the API,
or if the API returns a non-success status code (i.e., 4xx or 5xx response),
a subclass of APIError
will be thrown:
async function main() {
const completion = await anthropic.completions
.create({
prompt: `${Anthropic.HUMAN_PROMPT} Your prompt here ${Anthropic.AI_PROMPT}`,
max_tokens_to_sample: 300,
model: 'claude-2',
})
.catch((err) => {
if (err instanceof Anthropic.APIError) {
console.log(err.status);
console.log(err.name);
console.log(err.headers);
} else {
throw err;
}
});
}
main();
Error codes are as followed:
Status Code | Error Type |
---|
400 | BadRequestError |
401 | AuthenticationError |
403 | PermissionDeniedError |
404 | NotFoundError |
422 | UnprocessableEntityError |
429 | RateLimitError |
>=500 | InternalServerError |
N/A | APIConnectionError |
Retries
Certain errors will be automatically retried 2 times by default, with a short exponential backoff.
Connection errors (for example, due to a network connectivity problem), 409 Conflict, 429 Rate Limit,
and >=500 Internal errors will all be retried by default.
You can use the maxRetries
option to configure or disable this:
const anthropic = new Anthropic({
maxRetries: 0,
});
await anthropic.completions.create(
{
prompt: `${Anthropic.HUMAN_PROMPT} Can you help me effectively ask for a raise at work? ${Anthropic.AI_PROMPT}`,
max_tokens_to_sample: 300,
model: 'claude-2',
},
{
maxRetries: 5,
},
);
Timeouts
Requests time out after 10 minutes by default. You can configure this with a timeout
option:
const anthropic = new Anthropic({
timeout: 20 * 1000,
});
await anthropic.completions.create(
{
prompt: `${Anthropic.HUMAN_PROMPT} Where can I get a good coffee in my neighbourhood? ${Anthropic.AI_PROMPT}`,
max_tokens_to_sample: 300,
model: 'claude-2',
},
{
timeout: 5 * 1000,
},
);
On timeout, an APIConnectionTimeoutError
is thrown.
Note that requests which time out will be retried twice by default.
Configuring an HTTP(S) Agent (e.g., for proxies)
By default, this library uses a stable agent for all http/https requests to reuse TCP connections, eliminating many TCP & TLS handshakes and shaving around 100ms off most requests.
If you would like to disable or customize this behavior, for example to use the API behind a proxy, you can pass an httpAgent
which is used for all requests (be they http or https), for example:
import http from 'http';
import Anthropic from '@anthropic-ai/sdk';
import HttpsProxyAgent from 'https-proxy-agent';
const anthropic = new Anthropic({
httpAgent: new HttpsProxyAgent(process.env.PROXY_URL),
});
await anthropic.completions.create(
{
prompt: `${Anthropic.HUMAN_PROMPT} How does a court case get to the Supreme Court? ${Anthropic.AI_PROMPT}`,
max_tokens_to_sample: 300,
model: 'claude-2',
},
{
baseURL: 'http://localhost:8080/test-api',
httpAgent: new http.Agent({ keepAlive: false }),
},
);
Status
This package is in beta. Its internals and interfaces are not stable
and subject to change without a major semver bump;
please reach out if you rely on any undocumented behavior.
We are keen for your feedback; please open an issue with questions, bugs, or suggestions.
Requirements
The following runtimes are supported:
- Node.js 16 LTS or later (non-EOL) versions.
- Deno v1.28.0 or higher (experimental).
Use
import Anthropic from "npm:@anthropic-ai/sdk"
.
If you are interested in other runtime environments, please open or upvote an issue on GitHub.