Integrations
Anthropic Messages API & Claude Code
An Anthropic Messages-compatible endpoint on DEVUP AI. Existing Anthropic clients, tools, and workflows connect by updating a single base URL.
DEVUP AI exposes a dedicated endpoint implementing the Anthropic Messages protocol. All calls are billed in Algerian Dinars (DZD) in line with standard DEVUP AI token rates.
Endpoint & Authentication
The endpoint accepts your DEVUP AI API key in either of two standard header formats:
| x-api-key | sk-devup-... |
| Authorization | Bearer sk-devup-... |
The anthropic-version: 2023-06-01 header is accepted and ignored — send it or omit it, the response is identical.
Verified Feature Support
| Feature | Status |
|---|---|
| Non-streaming messages | Supported (HTTP 200) |
Streaming (stream: true) | Supported (Full event lifecycle) |
| Tool use (non-streaming) | Supported (tool_use blocks, stop_reason: "tool_use") |
| Tool use (streaming) | Supported (input_json_delta with partial_json) |
| Multi-turn conversations | Supported (Verified via Claude Code) |
Basic Request
Construct a standard Messages API payload specifying the target model, max token budget, and message history:
curl https://api.devupai.com/anthropic/v1/messages \
-H "Content-Type: application/json" \
-H "x-api-key: $DEVUP_API_KEY" \
-d '{
"model": "claude-opus-5",
"max_tokens": 1024,
"messages": [
{
"role": "user",
"content": "What is the capital of Algeria?"
}
]
}'Response Shape
The API returns a standard Anthropic message structure:
{
"id": "msg_01X9b8Cd3Ef7Gh2Jk4Lm5Np6",
"type": "message",
"role": "assistant",
"model": "claude-opus-5",
"content": [
{
"type": "text",
"text": "The capital of Algeria is Algiers."
}
],
"stop_reason": "end_turn",
"stop_sequence": null,
"usage": {
"input_tokens": 16,
"output_tokens": 8
}
}Streaming
Pass stream: true to receive a Server-Sent Events (SSE) stream.
curl https://api.devupai.com/anthropic/v1/messages \
-H "Content-Type: application/json" \
-H "x-api-key: $DEVUP_API_KEY" \
-d '{
"model": "claude-opus-5",
"max_tokens": 1024,
"stream": true,
"messages": [
{
"role": "user",
"content": "Count from 1 to 3."
}
]
}'Event Lifecycle
A streaming response delivers events in the following sequential order:
message_start— Initial message envelope with message ID and model metadata.content_block_start— Starts a new content block index.content_block_delta— Incremental text deltas (text_delta).content_block_stop— Closes the active content block index.message_delta— Final stop reason and usage statistics.message_stop— Stream completion marker.
input_tokens arrives in message_delta at the end of the stream, not in message_start. Usage metrics are finalized once generation completes.Complete wire format of a streaming exchange:
event: message_start
data: {"type":"message_start","message":{"id":"msg_01X9b8Cd3Ef7Gh2Jk4Lm5Np6","type":"message","role":"assistant","model":"claude-opus-5","content":[],"stop_reason":null,"stop_sequence":null,"usage":{"input_tokens":0,"output_tokens":0}}}
event: content_block_start
data: {"type":"content_block_start","index":0,"content_block":{"type":"text","text":""}}
event: content_block_delta
data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"1, 2, 3."}}
event: content_block_stop
data: {"type":"content_block_stop","index":0}
event: message_delta
data: {"type":"message_delta","delta":{"stop_reason":"end_turn","stop_sequence":null},"usage":{"input_tokens":14,"output_tokens":6}}
event: message_stop
data: {"type":"message_stop"}Tool Use
Supply a tools array defining JSON Schema parameters. When the model invokes a tool, the response contains a tool_use block and sets stop_reason: "tool_use".
Request with Tools
{
"model": "claude-opus-5",
"max_tokens": 1024,
"tools": [
{
"name": "get_weather",
"description": "Get the current weather for a location.",
"input_schema": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "The city and country, e.g. Algiers, Algeria"
}
},
"required": ["location"]
}
}
],
"messages": [
{
"role": "user",
"content": "What is the weather in Algiers?"
}
]
}Tool Call Response
{
"id": "msg_01Y8kLm3N2P4Qr5St6Uv7Wx8",
"type": "message",
"role": "assistant",
"model": "claude-opus-5",
"content": [
{
"type": "tool_use",
"id": "call_9a8b7c6d",
"name": "get_weather",
"input": {
"location": "Algiers, Algeria"
}
}
],
"stop_reason": "tool_use",
"stop_sequence": null,
"usage": {
"input_tokens": 78,
"output_tokens": 22
}
}For streaming requests with tool execution, arguments stream incrementally via content_block_delta events carrying input_json_delta payloads with partial_json fragments.
Models
The endpoint is model-agnostic: it accepts any model identifier from the DEVUP catalogue, not only claude-* names. Pass the model name exactly as listed in the catalogue:
| Model Identifier | Role |
|---|---|
| claude-opus-5 | Flagship reasoning and complex coding |
| claude-sonnet-5 | High capability balanced execution |
| claude-fable-5 | Creative and structured generation |
| claude-opus-4-8 | Deep analysis and multi-step reasoning |
| claude-opus-4-7 | High-precision analytical synthesis |
| claude-sonnet-4-6 | Balanced reasoning and generation |
| claude-haiku-4-5 | Low latency and fast utility tasks |
Verified Models
| Model Identifier | Verified Capabilities |
|---|---|
| claude-opus-5 | text |
| deepseek-ai/DeepSeek-V4-Pro | text, streaming, tool use, full tool cycle, and end-to-end via Claude Code v2.1.238 |
verified 2026-08-26. Models not listed are expected to work but have not been tested on this endpoint.
Agent Requirement
Claude Code is an agent and requires a model that supports tool calling. A model without tool support will return text and the agent will not complete its loop.
404 not_found_error. The endpoint never approximates or maps unknown names to another model. A typo in a request fails immediately with an error rather than silently billing for an unintended model.{
"type": "error",
"error": {
"type": "not_found_error",
"message": "The requested model was not found or is unavailable."
}
}Limits
The ceiling for max_tokens is 32,768.
max_tokens: 32768returns HTTP 200.- Values exceeding 32,768 return HTTP 400 with an
invalid_request_error.
{
"type": "error",
"error": {
"type": "invalid_request_error",
"message": "max_tokens must be between 1 and 32,768."
}
}This token limit requires explicit configuration in clients like Claude Code, which default to higher ceilings and fail until restricted to 32,000.
Claude Code
Configure Claude Code to route requests to DEVUP AI by setting environment variables in your active shell:
export ANTHROPIC_BASE_URL="https://api.devupai.com/anthropic"
export ANTHROPIC_API_KEY="sk-devup-..."
export ANTHROPIC_MODEL="deepseek-ai/DeepSeek-V4-Pro"
export CLAUDE_CODE_MAX_OUTPUT_TOKENS="32000"Execution Modes
Run Claude Code with the configured environment:
claude --bare # interactive session
claude -p "your prompt" # single prompt, non-interactiveUnrecognized Model Notice
Every invocation prints:
[claude-code:unrecognized_model] {"model":"...","query_source":"generate_session_title"}This is emitted by the client, not by DEVUP AI, and is expected when the model name is not one the client ships with.
The --bare Requirement
Tested on Claude Code v2.1.238:
| Command | Result |
|---|---|
| claude -p "..." | Works (Non-interactive prompt) |
| claude --bare | Works (Interactive session) |
| claude | Not logged in · Please run /login |
Tested on Claude Code v2.1.246:
| Command | Result |
|---|---|
| claude -p "..." | Works (Non-interactive prompt) |
| claude --bare | Works (Interactive session) |
| claude | Works (Interactive session, no login prompt) |
The login behaviour changed between these two client versions, with both results measured on 2026-08-26, and the --bare guidance below still applies to clients that require it.
Claude Code documentation states that under --bare, authentication is strictly resolved via ANTHROPIC_API_KEY or apiKeyHelper, bypassing OAuth and system keychain lookups. Default interactive mode checks OAuth and the keychain first, prompting for a login rather than reading the environment variable.
--bare flag disables hooks, Language Server Protocol (LSP), plugin synchronization, automatic CLAUDE.md discovery, and keychain access. For automated or scripted tasks needing these capabilities, use claude -p. Note that this is client behaviour and may change across Claude Code releases.Troubleshooting
If Claude Code was previously used in the same directory with another account, cached credentials in the local .claude folder take precedence over environment variables. Remove the local .claude directory and retry.
Anthropic SDK
Initialize official Anthropic SDKs by pointing the base URL parameter to https://api.devupai.com/anthropic:
import os
import anthropic
client = anthropic.Anthropic(
base_url="https://api.devupai.com/anthropic",
api_key=os.environ["DEVUP_API_KEY"],
)
message = client.messages.create(
model="claude-opus-5",
max_tokens=1024,
messages=[
{"role": "user", "content": "Hello!"}
],
)
print(message.content[0].text)