API Format

Anthropic Format

How to look up and call a modelFind models by price group, read the input/output pricing table, then configure Claude Code or the OpenAI SDK to call them.

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

NameValueRequiredDescription
AuthorizationBearer <Token>YesYour API authentication token.
Content-Typeapplication/jsonYesFormat of the request data.
x-api-key<API Key>OptionalSome SDKs require this header (when using a proxy, typically only Authorization is needed).
Acceptapplication/jsonNo

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: user or assistant.
    • content: Message content.
  • max_tokens (integer): Maximum number of tokens for the response.
  • stream (boolean): true to 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

NameValueRequired
anthropic-version2023-06-01Yes
x-api-keyAPI KeyYes (or Authorization: Bearer)
Content-Typeapplication/jsonYes

Request Body

ParameterTypeDescription
modelstringRequired. Claude model ID
messagesarrayRequired. List of messages
systemstringSystem prompt
toolsarrayList of tools

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
}

In this section · API Format