dev.toJuly 23, 2026NEW AFFECTS EXAM
API

3 Assumptions That Broke Before I Got gpt-oss-120b Working Through the Anthropic SDK

A free-tier, OpenAI-compatible reasoning model broke 3 assumptions before I got one Anthropic SDK call working. Exact errors and one-line fi

---

title: 3 Assumptions That Broke Before I Got gpt-oss-120b Working Through the Anthropic SDK

published: true

tags: python, api, llm, anthropic

description: A free-tier, OpenAI-compatible reasoning model broke 3 assumptions before I got one Anthropic SDK call working. Exact errors and one-line fi

---

I signed up for a free-tier LLM API, hit a credit-card prompt before I'd made a single call, and assumed it meant I was about to get billed. I was wrong about that one. I was not wrong that the SDK code I wrote next would break twice before I got a real response back.

**TL;DR: Sakura AI Engine's free tier (3,000 chat completions/month, hosting OpenAI's open-weight `gpt-oss-120b`) broke 3 assumptions in a row: that a credit-card prompt on a free plan means billing, that Anthropic's Python SDK authenticates the same way against every compatible endpoint, and that `content[0]` in a response is always the text you asked for. Only the last two are real bugs. Both have a one-line fix once you know they exist.**

Quick answer

  • **Free tier billing**: Sakura AI Engine's free "foundation model" plan only rate-limits past 3,000 chat completions/month. It does not bill for overage — only a separate, independent pay-as-you-go plan meters and charges. The credit-card prompt at sign-up is identity verification, not a billing trigger.
  • **Anthropic SDK `401 - Unauthorized`**: use `auth_token="<key>"` instead of `api_key="<key>"` when the endpoint expects Bearer auth instead of an `x-api-key` header. Same mechanism as Claude Code's `ANTHROPIC_AUTH_TOKEN`.
  • **`'ThinkingBlock' object has no attribute 'text'`**: don't index `resp.content[0]`. Filter instead: `[b.text for b in resp.content if b.type == "text"]`.

What actually happened

Sakura Internet, a Japanese cloud provider, opened a free tier for an API called "AI Engine": 3,000 chat completions and 50 audio-related requests per month, hosting `gpt-oss-120b` (OpenAI's open-weight model) behind both an OpenAI-compatible endpoint and an Anthropic-Messages-API-compatible endpoint. Sign-up asked for 5 things in order: a member ID, a project, a phone number verified by SMS, a credit card, and finally an account token in the form `<UUID>:<secret>`, shown exactly once.

The credit card step made me stop. A "free" plan asking for a card reads like a billing trap. It isn't, in this case — the free "foundation model" plan only rate-limits you past 3,000 requests/month, and a separate pay-as-you-go plan is the only one that meters and bills overage. The two plans don't auto-convert into each other; the card is identity verification, not a billing trigger. That part turned out to be a non-issue. What actually blocked me was the code.

The OpenAI-compatible endpoint worked on the first try:

python
from openai import OpenAI

client = OpenAI(
    api_key="<UUID>:<secret>",
    base_url="https://api.ai.sakura.ad.jp/v1",
)
resp = client.chat.completions.create(
    model="gpt-oss-120b",
    messages=[{"role": "user
Read full article on dev.to