Installation
code
npm install @anthropic-ai/sdk
or
code
yarn add @anthropic-ai/sdk
Initializing the Client
code
import Anthropic from "@anthropic-ai/sdk";
const anthropic = new Anthropic({
apiKey: "your-shopaikey-api-key",
baseURL: "https://api.shopaikey.com",
});
Messages API
Basic API Call
code
const message = await anthropic.messages.create({
model: "claude-3-5-sonnet-20241022",
max_tokens: 1024,
messages: [{ role: "user", content: "Hello!" }],
});
console.log(message.content[0].text);
Using System Prompt
code
const message = await anthropic.messages.create({
model: "claude-3-5-sonnet-20241022",
system: "You are an AI assistant specialized in programming.",
max_tokens: 1024,
messages: [
{ role: "user", content: "Explain async/await in JavaScript" },
],
});
console.log(message.content[0].text);
Streaming Response
code
const stream = await anthropic.messages.stream({
model: "claude-3-5-sonnet-20241022",
max_tokens: 1024,
messages: [{ role: "user", content: "Tell me a long story" }],
});
for await (const chunk of stream) {
if (chunk.type === "content_block_delta") {
process.stdout.write(chunk.delta.text);
}
}
Streaming with Event Handlers
code
const stream = await anthropic.messages.stream({
model: "claude-3-5-sonnet-20241022",
max_tokens: 1024,
messages: [{ role: "user", content: "Write a poem" }],
});
stream.on("text", (text) => {
process.stdout.write(text);
});
const message = await stream.finalMessage();
console.log("\n\nUsage:", message.usage);
Vision API (Image Recognition)
code
const message = await anthropic.messages.create({
model: "claude-3-5-sonnet-20241022",
max_tokens: 1024,
messages: [
{
role: "user",
content: [
{
type: "image",
source: {
type: "url",
url: "https://example.com/image.png",
},
},
{
type: "text",
text: "What is in this image? Please describe in detail.",
},
],
},
],
});
console.log(message.content[0].text);
Vision with Base64 Image
code
const fs = require("fs");
const imageBuffer = fs.readFileSync("./image.jpg");
const base64Image = imageBuffer.toString("base64");
const message = await anthropic.messages.create({
model: "claude-3-5-sonnet-20241022",
max_tokens: 1024,
messages: [
{
role: "user",
content: [
{
type: "image",
source: {
type: "base64",
media_type: "image/jpeg",
data: base64Image,
},
},
{
type: "text",
text: "Describe this image",
},
],
},
],
});
Multi-turn Conversation
code
const messages = [{ role: "user", content: "My name is Huy" }];
let message = await anthropic.messages.create({
model: "claude-3-5-sonnet-20241022",
max_tokens: 1024,
messages: messages,
});
messages.push({
role: "assistant",
content: message.content[0].text,
});
messages.push({
role: "user",
content: "What's my name?",
});
message = await anthropic.messages.create({
model: "claude-3-5-sonnet-20241022",
max_tokens: 1024,
messages: messages,
});
console.log(message.content[0].text);
Tool Use (Function Calling)
code
const message = await anthropic.messages.create({
model: "claude-3-5-sonnet-20241022",
max_tokens: 1024,
tools: [
{
name: "get_weather",
description: "Get weather information for a location",
input_schema: {
type: "object",
properties: {
location: {
type: "string",
description: "City or location name",
},
unit: {
type: "string",
enum: ["celsius", "fahrenheit"],
},
},
required: ["location"],
},
},
],
messages: [
{ role: "user", content: "What's the weather like in Hanoi today?" },
],
});
if (message.stop_reason === "tool_use") {
const toolUse = message.content.find((block) => block.type === "tool_use");
console.log("Tool to call:", toolUse.name);
console.log("Parameters:", toolUse.input);
}
Error Handling
code
try {
const message = await anthropic.messages.create({
model: "claude-3-5-sonnet-20241022",
max_tokens: 1024,
messages: [{ role: "user", content: "Hello" }],
});
} catch (error) {
if (error instanceof Anthropic.APIError) {
console.error("API Error:", error.status);
console.error("Message:", error.message);
} else {
console.error("Unexpected error:", error);
}
}
TypeScript Support
code
import Anthropic from "@anthropic-ai/sdk";
const anthropic = new Anthropic({
apiKey: process.env.SHOPAIKEY_API_KEY!,
baseURL: "https://api.shopaikey.com",
});
async function chat(message: string): Promise<string> {
const response = await anthropic.messages.create({
model: "claude-3-5-sonnet-20241022",
max_tokens: 1024,
messages: [{ role: "user", content: message }],
});
return response.content[0].type === "text" ? response.content[0].text : "";
}
API Detail: Create Chat Completion (Native Stream)
(Create Chat Completion - Native Format)
This API allows sending messages to Claude models using the native format (/v1/messages).
- Method:
POST - URL:
https://api.shopaikey.com/v1/messages
Request
Headers
Body (application/json)
Unlike the OpenAI format, the Anthropic format allows the system parameter at the top level instead of inside the messages array.
code
{
"model": "claude-3-5-sonnet-20241022",
"system": "You are a helpful AI assistant.",
"messages": [
{
"role": "user",
"content": "Who are you?!"
}
],
"max_tokens": 4096,
"stream": true
}
Key parameters:
model(string): Claude model ID (e.g.,claude-3-5-sonnet-20241022,claude-3-opus-20240229).system(string): System prompt to shape the AI's behavior.messages(array): List of conversation messages.role:userorassistant.content: Message content.
max_tokens(integer): Maximum number of tokens for the response.stream(boolean):trueto receive real-time data.
API Call Example (cURL)
code
curl --location --request POST 'https://api.shopaikey.com/v1/messages' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer <YOUR_TOKEN_HERE>' \
--header 'Content-Type: application/json' \
--data-raw '{
"model": "claude-3-5-sonnet-20241022",
"system": "You are a helpful AI assistant.",
"messages": [
{
"role": "user",
"content": "Hello, please introduce yourself."
}
],
"max_tokens": 1024,
"stream": true
}'
Response
Status: 200 OK
code
{
"id": "msg_01X...",
"type": "message",
"role": "assistant",
"content": [
{
"type": "text",
"text": "Hello! I'm Claude, an AI language model created by Anthropic."
}
],
"model": "claude-3-5-sonnet-20241022",
"stop_reason": "end_turn",
"stop_sequence": null,
"usage": {
"input_tokens": 15,
"output_tokens": 25
}
}
API Detail: Vision
The Anthropic Messages API supports sending images in the content of a message as an array of blocks.
- Method:
POST - URL:
https://api.shopaikey.com/v1/messages
Content Structure with Images
Instead of content as a string, pass an array of image and text blocks:
code
{
"role": "user",
"content": [
{
"type": "image",
"source": {
"type": "url",
"url": "https://example.com/image.png"
}
},
{
"type": "text",
"text": "What is in this image?"
}
]
}
With Base64 images:
code
{
"type": "image",
"source": {
"type": "base64",
"media_type": "image/jpeg",
"data": "<base64-encoded-data>"
}
}
cURL Example
code
curl --location --request POST 'https://api.shopaikey.com/v1/messages' \
--header 'anthropic-version: 2023-06-01' \
--header 'Authorization: Bearer <YOUR_TOKEN_HERE>' \
--header 'Content-Type: application/json' \
--data-raw '{
"model": "claude-opus-4-5-20251101",
"max_tokens": 1024,
"messages": [
{
"role": "user",
"content": [
{
"type": "image",
"source": {
"type": "url",
"url": "https://example.com/image.png"
}
},
{
"type": "text",
"text": "What is in this image? Please describe in detail."
}
]
}
]
}'
Response
Status: 200 OK
code
{
"id": "msg_01X...",
"type": "message",
"role": "assistant",
"content": [
{
"type": "text",
"text": "The image shows a beautiful natural landscape..."
}
],
"model": "claude-opus-4-5-20251101",
"stop_reason": "end_turn",
"usage": {
"input_tokens": 85,
"output_tokens": 120
}
}
Count Tokens
Count the input tokens for a Claude Messages API request.
- Method:
POST - URL:
https://api.shopaikey.com/v1/messages/count_tokens
Headers
Request Body
Example
code
const result = await anthropic.messages.countTokens({
model: "claude-sonnet-4-20250514",
messages: [{ role: "user", content: "Hello!" }],
});
console.log(result.input_tokens);
cURL Example
code
curl --location --request POST 'https://api.shopaikey.com/v1/messages/count_tokens' \
--header 'anthropic-version: 2023-06-01' \
--header 'x-api-key: <YOUR_API_KEY>' \
--header 'Content-Type: application/json' \
--data-raw '{
"model": "claude-sonnet-4-20250514",
"messages": [
{"role": "user", "content": "Hello!"}
]
}'
Response
code
{
"input_tokens": 12
}