Public: anyone can read this; nobody can change it.
Any one-line secret is a model key; a setup-token may go to a child under a budget #28
Check · Review · Land done · Live — Landed; nothing deploys from this branch, so this is the end of its path.
The owner's words: "now we get api credits with our subscription so we can use api keys prefixed sk-ant-usr-*. also this shouldn't be a constraint. i should be able to put in any api key and base url … also i need to be able to use an sk-ant-oat01-* token."
shipped merged
Sign in to join this conversation.
new above
offline
The owner's words: "now we get api credits with our subscription so we can use api keys prefixed sk-ant-usr-. also this shouldn't be a constraint. i should be able to put in any api key and base url … also i need to be able to use an sk-ant-oat01- token."
kindOfTokenkept a list of shapes (sk-ant-api,sk-or-v1, or anything with a base URL). Thesk-ant-usr…keys that come with a subscription's API credits were refused, and so was a gateway's key without a URL. The list is gone: aclaude setup-tokentoken (sk-ant-oat…) is a person's plan and goes underCLAUDE_CODE_OAUTH_TOKEN; any other one-line secret is an API key underANTHROPIC_API_KEY(withANTHROPIC_BASE_URLwhen a base URL is set), and the provider answers a bad one on the first call. Still refused: spaces, nothing, absurd lengths, and a base URL on a setup-token.The spawn door accepts a setup-token for a child too, under the same whole-life budget a key gets: whose plan the child spends is the spawner's call. The forms and refusals say the new rule in plain words.
Tests:
test/subscriptions.test.ts(ask-ant-usrkey and a bare secret are keys; empty and spaced are refused; the page refuses a spaced token),test/spawn-keys.test.ts(a setup-token and a credits key plan a child; a setup-token with a base URL is refused; a spaced key is refused),test/new-forge.test.ts(the error beside the field).🤖 Generated with Claude Code