Skip to content

Claude Code

Claude Code talks to the Anthropic Messages API. ai& exposes an Anthropic-compatible /v1/messages endpoint, so any tool-calling model in our catalog can drive the agent loop.

Two ways to wire it up:

  • Session — export the env vars into your current shell. Lost when you close the terminal. Good for a one-off try.
  • Permanent — drop the same config into settings.json. Persists across sessions, can be scoped per project or globally.

1. Install Claude Code

Prerequisite: Node.js 18 or newer.

Terminal window
npm install -g @anthropic-ai/claude-code

Confirm the install — claude --version should print a version number:

Terminal window
claude --version

2. Set the env vars in this terminal

Terminal window
export ANTHROPIC_BASE_URL="https://api.aiand.com"
export ANTHROPIC_AUTH_TOKEN="sk-your-aiand-api-key"
export ANTHROPIC_API_KEY=""
export ANTHROPIC_DEFAULT_OPUS_MODEL="moonshotai/kimi-k3"
export ANTHROPIC_DEFAULT_SONNET_MODEL="moonshotai/kimi-k3"
export ANTHROPIC_DEFAULT_HAIKU_MODEL="deepseek-ai/deepseek-v4-flash"
export CLAUDE_CODE_SUBAGENT_MODEL="moonshotai/kimi-k3"

3. Run Claude Code

Terminal window
claude

Claude Code reads its config from a settings.json file on startup. Drop the same env block in and you never have to re-export:

{
"env": {
"ANTHROPIC_BASE_URL": "https://api.aiand.com",
"ANTHROPIC_AUTH_TOKEN": "sk-your-aiand-api-key",
"ANTHROPIC_API_KEY": "",
"ANTHROPIC_DEFAULT_OPUS_MODEL": "moonshotai/kimi-k3",
"ANTHROPIC_DEFAULT_SONNET_MODEL": "moonshotai/kimi-k3",
"ANTHROPIC_DEFAULT_HAIKU_MODEL": "deepseek-ai/deepseek-v4-flash",
"CLAUDE_CODE_SUBAGENT_MODEL": "moonshotai/kimi-k3"
}
}

Two scopes — pick one:

  • Project (.claude/settings.local.json in your repo) — applies only when you run claude from this repo. Git ignores *.local.json by Claude Code convention, so the key never gets committed. Recommended for trying ai& without touching your global setup.
  • Global (~/.claude/settings.json) — applies machine-wide. Every Claude Code surface on your machine picks up the same ai& backend: the claude CLI in any terminal session, the Claude Code VS Code extension (the extension and CLI share this file by design), and the Claude Desktop app. Use this once ai& is your default everywhere.

The commands below safely merge the env block into the file — any existing keys you have (permissions, hooks, etc.) are preserved. They use Node, which is already on your machine since step 1 installed Claude Code via npm. Replace sk-your-aiand-api-key with your real key before running.

Run from the root of your project:

Terminal window
mkdir -p .claude && node -e '
const fs = require("fs"), p = ".claude/settings.local.json";
const d = fs.existsSync(p) ? JSON.parse(fs.readFileSync(p, "utf8")) : {};
d.env = Object.assign(d.env || {}, {
ANTHROPIC_BASE_URL: "https://api.aiand.com",
ANTHROPIC_AUTH_TOKEN: "sk-your-aiand-api-key",
ANTHROPIC_API_KEY: "",
ANTHROPIC_DEFAULT_OPUS_MODEL: "moonshotai/kimi-k3",
ANTHROPIC_DEFAULT_SONNET_MODEL: "moonshotai/kimi-k3",
ANTHROPIC_DEFAULT_HAIKU_MODEL: "deepseek-ai/deepseek-v4-flash",
CLAUDE_CODE_SUBAGENT_MODEL: "moonshotai/kimi-k3"
});
fs.writeFileSync(p, JSON.stringify(d, null, 2));
'
Terminal window
mkdir -p ~/.claude && node -e '
const fs = require("fs"), os = require("os"), path = require("path");
const p = path.join(os.homedir(), ".claude", "settings.json");
const d = fs.existsSync(p) ? JSON.parse(fs.readFileSync(p, "utf8")) : {};
d.env = Object.assign(d.env || {}, {
ANTHROPIC_BASE_URL: "https://api.aiand.com",
ANTHROPIC_AUTH_TOKEN: "sk-your-aiand-api-key",
ANTHROPIC_API_KEY: "",
ANTHROPIC_DEFAULT_OPUS_MODEL: "moonshotai/kimi-k3",
ANTHROPIC_DEFAULT_SONNET_MODEL: "moonshotai/kimi-k3",
ANTHROPIC_DEFAULT_HAIKU_MODEL: "deepseek-ai/deepseek-v4-flash",
CLAUDE_CODE_SUBAGENT_MODEL: "moonshotai/kimi-k3"
});
fs.writeFileSync(p, JSON.stringify(d, null, 2));
'

Inside Claude Code, run:

/status

The panel shows the active base URL and model. You should see https://api.aiand.com and moonshotai/kimi-k3.

You can also probe the wire-level path from the shell:

Terminal window
curl -sS https://api.aiand.com/v1/models \
-H "Authorization: Bearer sk-your-aiand-api-key" \
| grep -o 'moonshotai/kimi-k3'

A match means the key authenticates and the model is on your org.

  • Effort. /effort and CLAUDE_CODE_EFFORT_LEVEL are honoured: Claude Code sends the level as output_config.effort, and ai& applies it as the model’s reasoning_effort. A level the model does not publish is rejected with a 400 that names the supported ones — moonshotai/kimi-k3 takes low, high and max. When no level is sent, ai& forwards none and the model runs at its own default, which for Kimi is max, so set one deliberately.
  • Context limit. When a conversation outgrows the model’s window, ai& answers with Anthropic’s own “prompt is too long” wording, so Claude Code compacts and retries on its own. Claude Code assumes a 200K window for model names it does not recognise; that is within every model recommended here.
  • Thinking. Claude Code asks for adaptive thinking on gateway models; ai& streams the model’s reasoning back as thinking blocks. The level of reasoning is set by effort, not by the thinking block.
  • WebSearch and other server-side tools. Anthropic’s server-side tools (web search, web fetch, code execution) run inside Anthropic’s API and are not available through ai&. A request that includes one is refused with a 400 naming the tool, so Claude Code’s WebSearch tool reports an error rather than a made-up result. Use an MCP web-search server instead.
  • Screenshots. Images inside tool results (the Read tool on a PNG, for example) reach the model on vision-capable models and are replaced by a short placeholder on text-only ones.