Anbinden · Weg C
Node-SDK
Für Node ≥ 18: ein fetch-Ersatz, den Sie dem Anthropic- oder OpenAI-Client geben, eine Lauf-Klammer über AsyncLocalStorage und eine benannte Ausnahme bei einem Stopp.
Installation
# Das SDK liegt im Tokenwacht-Repository unter sdk/node (keine Abhängigkeiten, TypeScript-Typen enthalten). npm install ./sdk/node # Veröffentlichung auf npm als „tokenwacht-sdk" ist vorbereitet; bis dahin aus dem Repository installieren.
Anthropic-Client
const Anthropic = require("@anthropic-ai/sdk");
const { Wacht, BudgetUeberschritten } = require("tokenwacht-sdk");
const wacht = new Wacht({ schluessel: process.env.TOKENWACHT_KEY, agent: "liv-connector", kunde: "kunde-0815" });
const client = new Anthropic({ baseURL: wacht.anthropicUrl(), fetch: wacht.fetch });
await wacht.lauf("RL-0815", { budgetEur: 2.5 }, async (lauf) => {
try {
await client.messages.create({ model: "claude-sonnet-5", max_tokens: 800, messages: [{ role: "user", content: "…" }] });
lauf.schritt("leadliste_erzeugen");
} catch (e) {
if (e instanceof BudgetUeberschritten) console.log("gestoppt:", e.hinweis, e.cockpitUrl);
else throw e;
}
});
OpenAI, Gemini, Bedrock
const openai = new OpenAI({ baseURL: wacht.openaiUrl(), fetch: wacht.fetch });
// Gemini und Bedrock: wacht.geminiUrl(), wacht.bedrockUrl() als Basis-URL, wacht.fetch als fetch
Vercel AI SDK, LangChain.js
import { createAnthropic } from "@ai-sdk/anthropic";
const anthropic = createAnthropic({ baseURL: wacht.anthropicUrl(), fetch: wacht.fetch });
// LangChain.js: new ChatAnthropic({ anthropicApiUrl: wacht.anthropicUrl(), clientOptions: { fetch: wacht.fetch } })
Eigene Zählwerte
await wacht.melden({ anbieter: "anthropic", modell: "claude-sonnet-5", eingabe_token: 1200, ausgabe_token: 57 });
Prüfen:
npm test im SDK-Ordner läuft ohne Netz; die echte Anbindung prüfen Sie mit curl https://tokenwacht.de/v1/anbindung/pruefen -H "Authorization: Bearer $TOKENWACHT_KEY".