PUNKthe adaptive runtime

//DOCS Anthropic SDK

Use Punk's Anthropic-compatible Messages endpoint with the official Anthropic SDK.

Anthropic SDK Integration

Punk exposes an Anthropic-compatible Messages endpoint at /v1/messages. Point the official Anthropic TypeScript SDK at the Punk gateway origin and keep using messages.create(...) and streaming with Anthropic-shaped requests and responses.

Use this path when an app already uses Claude models or the Anthropic SDK and you want Punk to observe, govern, cache, explain, and learn from that traffic.

Install

npm install @anthropic-ai/sdk @punktechnologies/sdk

Create a Punk tenant API key in the hosted dashboard:

export PUNK_BASE_URL=https://app.punktechnologies.com
export PUNK_API_KEY=pk_...

Provider keys and BYOK credentials live in Punk's hosted control plane, not in this app.

Messages Setup

import Anthropic from "@anthropic-ai/sdk";
import { createPunkAnthropicConfig } from "@punktechnologies/sdk/anthropic";

const client = new Anthropic(createPunkAnthropicConfig({
  app: "claude-app",
  agent: "support-agent",
  subject: "user-123"
}));

const message = await client.messages.create({
  model: "claude-sonnet-4-6",
  max_tokens: 256,
  system: "You are a terse assistant.",
  messages: [{ role: "user", content: "What is a deterministic artifact?" }]
});

console.log(message.content);

Add the Anthropic provider key in Punk's hosted dashboard or BYOK vault for live Claude pass-through.

For a zero-adapter SDK call, use the native Punk helper:

import { Punk } from "@punktechnologies/sdk";

const punk = new Punk({ app: "claude-app", agent: "support-agent", subject: "user-123" });

const message = await punk.anthropic.messages({
  model: "claude-sonnet-4-6",
  max_tokens: 256,
  messages: [{ role: "user", content: "What is a deterministic artifact?" }]
});

console.log(message.content, message.route, message.runId, message.usage);

Read The Route

The Anthropic SDK exposes raw headers through .withResponse():

const { data, response } = await client.messages
  .create({
    model: "claude-sonnet-4-6",
    max_tokens: 256,
    messages: [{ role: "user", content: "Say hello." }]
  })
  .withResponse();

console.log(response.headers.get("x-punk-route"));
console.log(response.headers.get("x-punk-run-id"));

The first request normally routes live. Send a second new request through the same app and agent to complete activation. An exact cached retry does not complete activation. The copied example in examples/anthropic-sdk.ts sends two distinct tickets and prints the observed second route, whether it remained live, what evidence is still required, and the second dashboard run URL.

Inspect the route explanation in the dashboard or API:

curl -H "Authorization: Bearer $PUNK_API_KEY" \
  https://app.punktechnologies.com/api/v1/runs/<runId> \
  | jq .run.routeExplanation

Streaming

Anthropic streaming works through the same gateway origin:

const stream = client.messages.stream({
  model: "claude-sonnet-4-6",
  max_tokens: 256,
  messages: [{ role: "user", content: "Stream a short haiku about caching." }]
});

for await (const event of stream) {
  if (event.type === "content_block_delta" && event.delta.type === "text_delta") {
    process.stdout.write(event.delta.text);
  }
}

Punk preserves Anthropic-shaped event sequences for live, cached, and artifact-served responses.

The Punk SDK also exposes parsed text deltas:

for await (const chunk of punk.streamMessages({
  model: "claude-sonnet-4-6",
  max_tokens: 256,
  messages: [{ role: "user", content: "Stream a short haiku about caching." }]
})) {
  if (chunk.type === "delta") process.stdout.write(chunk.content);
}

Read next: OpenAI-Compatible AI Gateway, Claude Code, SDK.