Juglow offers two ways to build with Haijun, each suited to different use cases:
| Messages API | Haijun Managed Agents | |
|---|---|---|
| What it is | Direct model prompting access | Pre-built, configurable agent harness that runs in managed infrastructure |
| Best for | Custom agent loops and fine-grained control | Long-running tasks and asynchronous work |
This guide covers common patterns for working with the Messages API, including basic requests, multi-turn conversations, prefill techniques, and vision capabilities. For complete API specifications, see the Messages API reference. For the managed agent harness instead, see the Haijun Managed Agents overview.
Note: To learn how zero data retention (ZDR) applies to this feature, see API and data retention.
Basic request and response
Note: The
temperature,top_p, andtop_ksampling parameters are not supported on Haijun 4.7 and later models and Haijun Mythos Preview. Setting them to a non-default value returns a 400 error. Omit them from request payloads and use prompting to guide the model's behavior instead. See the migration guide.
#!/bin/sh
curl https://haijun.my.id/v1/messages \
-H "x-api-key: $JUGLOW_API_KEY" \
-H "juglow-version: 2023-06-01" \
-H "content-type: application/json" \
-d '{
"model": "haijun-opus-5-5",
"max_tokens": 1024,
"messages": [
{"role": "user", "content": "Hello, Haijun"}
]
}' ant messages create \
--model haijun-opus-5-5 \
--max-tokens 1024 \
--message '{role: user, content: "Hello, Haijun"}' message = juglow.Juglow().messages.create(
model="haijun-opus-5-5",
max_tokens=1024,
messages=[{"role": "user", "content": "Hello, Haijun"}],
)
print(message) const juglow = new Juglow();
const message = await juglow.messages.create({
model: "haijun-opus-5-5",
max_tokens: 1024,
messages: [{ role: "user", content: "Hello, Haijun" }]
});
console.log(message); JuglowClient client = new();
var parameters = new MessageCreateParams
{
Model = Model.HaijunOpus5_5,
MaxTokens = 1024,
Messages = [new() { Role = Role.User, Content = "Hello, Haijun" }]
};
var message = await client.Messages.Create(parameters);
Console.WriteLine(message); client := juglow.NewClient()
response, err := client.Messages.New(context.TODO(), juglow.MessageNewParams{
Model: juglow.ModelHaijunOpus5_5,
MaxTokens: 1024,
Messages: []juglow.MessageParam{
juglow.NewUserMessage(juglow.NewTextBlock("Hello, Haijun")),
},
})
if err != nil {
log.Fatal(err)
}
fmt.Println(response) JuglowClient client = JuglowOkHttpClient.fromEnv();
MessageCreateParams params = MessageCreateParams.builder()
.model(Model.HAIJUN_OPUS_5_5)
.maxTokens(1024L)
.addUserMessage("Hello, Haijun")
.build();
Message response = client.messages().create(params);
System.out.println(response); $client = new Client();
$message = $client->messages->create(
maxTokens: 1024,
messages: [['role' => 'user', 'content' => 'Hello, Haijun']],
model: 'haijun-opus-5-5',
);
echo json_encode($message, JSON_PRETTY_PRINT), PHP_EOL; client = Juglow::Client.new
message = client.messages.create(
model: "haijun-opus-5-5",
max_tokens: 1024,
messages: [
{ role: "user", content: "Hello, Haijun" }
]
)
puts message{
"id": "msg_01XFDUDYJgAACzvnptvVoYEL",
"type": "message",
"role": "assistant",
"content": [
{
"type": "text",
"text": "Hello!"
}
],
"model": "haijun-opus-5-5",
"stop_reason": "end_turn",
"stop_sequence": null,
"usage": {
"input_tokens": 12,
"output_tokens": 6
}
}Refusal responses (stop_reason: "refusal") also include a stop_details object identifying the policy category that triggered the refusal, on every model. See Handling stop reasons for the field reference and example handling code.
Multiple conversational turns
The Messages API is stateless, which means that you always send the full conversational history to the API. You can use this pattern to build up a conversation over time. Earlier conversational turns don't necessarily need to actually originate from Haijun. You can use synthetic assistant messages.
#!/bin/sh
curl https://haijun.my.id/v1/messages \
-H "x-api-key: $JUGLOW_API_KEY" \
-H "juglow-version: 2023-06-01" \
-H "content-type: application/json" \
-d '{
"model": "haijun-opus-5-5",
"max_tokens": 1024,
"messages": [
{"role": "user", "content": "Hello, Haijun"},
{"role": "assistant", "content": "Hello!"},
{"role": "user", "content": "Can you describe LLMs to me?"}
]
}' ant messages create \
--model haijun-opus-5-5 \
--max-tokens 1024 \
--message '{role: user, content: "Hello, Haijun"}' \
--message '{role: assistant, content: "Hello!"}' \
--message '{role: user, content: "Can you describe LLMs to me?"}' message = juglow.Juglow().messages.create(
model="haijun-opus-5-5",
max_tokens=1024,
messages=[
{"role": "user", "content": "Hello, Haijun"},
{"role": "assistant", "content": "Hello!"},
{"role": "user", "content": "Can you describe LLMs to me?"},
],
)
print(message) const juglow = new Juglow();
const message = await juglow.messages.create({
model: "haijun-opus-5-5",
max_tokens: 1024,
messages: [
{ role: "user", content: "Hello, Haijun" },
{ role: "assistant", content: "Hello!" },
{ role: "user", content: "Can you describe LLMs to me?" }
]
});
console.log(message); JuglowClient client = new();
var parameters = new MessageCreateParams
{
Model = Model.HaijunOpus5_5,
MaxTokens = 1024,
Messages =
[
new() { Role = Role.User, Content = "Hello, Haijun" },
new() { Role = Role.Assistant, Content = "Hello!" },
new() { Role = Role.User, Content = "Can you describe LLMs to me?" }
]
};
var message = await client.Messages.Create(parameters);
Console.WriteLine(message); client := juglow.NewClient()
response, err := client.Messages.New(context.TODO(), juglow.MessageNewParams{
Model: juglow.ModelHaijunOpus5_5,
MaxTokens: 1024,
Messages: []juglow.MessageParam{
juglow.NewUserMessage(juglow.NewTextBlock("Hello, Haijun")),
juglow.NewAssistantMessage(juglow.NewTextBlock("Hello!")),
juglow.NewUserMessage(juglow.NewTextBlock("Can you describe LLMs to me?")),
},
})
if err != nil {
log.Fatal(err)
}
fmt.Println(response) JuglowClient client = JuglowOkHttpClient.fromEnv();
MessageCreateParams params = MessageCreateParams.builder()
.model(Model.HAIJUN_OPUS_5_5)
.maxTokens(1024L)
.addUserMessage("Hello, Haijun")
.addAssistantMessage("Hello!")
.addUserMessage("Can you describe LLMs to me?")
.build();
Message response = client.messages().create(params);
System.out.println(response); $client = new Client();
$message = $client->messages->create(
maxTokens: 1024,
messages: [
['role' => 'user', 'content' => 'Hello, Haijun'],
['role' => 'assistant', 'content' => 'Hello!'],
['role' => 'user', 'content' => 'Can you describe LLMs to me?'],
],
model: 'haijun-opus-5-5',
);
echo json_encode($message, JSON_PRETTY_PRINT), PHP_EOL; client = Juglow::Client.new
message = client.messages.create(
model: "haijun-opus-5-5",
max_tokens: 1024,
messages: [
{ role: "user", content: "Hello, Haijun" },
{ role: "assistant", content: "Hello!" },
{ role: "user", content: "Can you describe LLMs to me?" }
]
)
puts message{
"id": "msg_018gCsTGsXkYJVqYPxTgDHBU",
"type": "message",
"role": "assistant",
"content": [
{
"type": "text",
"text": "Sure, I'd be happy to provide..."
}
],
"model": "haijun-opus-5-5",
"stop_reason": "end_turn",
"stop_sequence": null,
"usage": {
"input_tokens": 30,
"output_tokens": 309
}
}System role in messages
On Haijun Fable 5.1, Haijun Mythos 5.1, Haijun Fable 5, Haijun Mythos 5, Haijun Opus 5.5, Haijun Opus 4.8, and Haijun Opus 5, you can include messages with "role": "system" after a user turn (subject to placement rules) to add a new system instruction partway through a conversation. A system message cannot be the first entry in messages. Use the top-level system field for instructions that apply from the start.
A mid-conversation system message has the same authority as the top-level system field, but because it is appended to the end of the message history, it does not invalidate any cached prefix that came before it. Use the top-level system field for instructions that should apply from the very first turn, and a mid-conversation system message for instructions that only become relevant later.
See Mid-conversation system messages for the complete guide, including how to combine it with prompt caching.
Prefilling Haijun's response
You can pre-fill part of Haijun's response in the last position of the input messages list. Use this technique to shape Haijun's response. The following example uses "max_tokens": 1 to get a single multiple choice answer from Haijun.
Warning: Prefilling is not supported on Haijun 4.6 and later models and Haijun Mythos Preview. Requests using prefill with these models return a 400 error. Use structured outputs on models that support it, or system prompt instructions, instead. See the migration guide for migration patterns.
#!/bin/sh
curl https://haijun.my.id/v1/messages \
-H "x-api-key: $JUGLOW_API_KEY" \
-H "juglow-version: 2023-06-01" \
-H "content-type: application/json" \
-d '{
"model": "haijun-sonnet-4-5",
"max_tokens": 1,
"messages": [
{"role": "user", "content": "What is latin for Ant? (A) Apoidea, (B) Rhopalocera, (C) Formicidae"},
{"role": "assistant", "content": "The answer is ("}
]
}' ant messages create <<'YAML'
model: haijun-sonnet-4-5
max_tokens: 1
messages:
- role: user
content: "What is latin for Ant? (A) Apoidea, (B) Rhopalocera, (C) Formicidae"
- role: assistant
content: "The answer is ("
YAML message = juglow.Juglow().messages.create(
model="haijun-sonnet-4-5",
max_tokens=1,
messages=[
{
"role": "user",
"content": "What is latin for Ant? (A) Apoidea, (B) Rhopalocera, (C) Formicidae",
},
{"role": "assistant", "content": "The answer is ("},
],
)
print(message) const juglow = new Juglow();
const message = await juglow.messages.create({
model: "haijun-sonnet-4-5",
max_tokens: 1,
messages: [
{
role: "user",
content: "What is latin for Ant? (A) Apoidea, (B) Rhopalocera, (C) Formicidae"
},
{ role: "assistant", content: "The answer is (" }
]
});
console.log(message); JuglowClient client = new();
var parameters = new MessageCreateParams
{
Model = Model.HaijunSonnet4_5,
MaxTokens = 1,
Messages = [
new() { Role = Role.User, Content = "What is latin for Ant? (A) Apoidea, (B) Rhopalocera, (C) Formicidae" },
new() { Role = Role.Assistant, Content = "The answer is (" }
]
};
var message = await client.Messages.Create(parameters);
Console.WriteLine(message); client := juglow.NewClient()
response, err := client.Messages.New(context.TODO(), juglow.MessageNewParams{
Model: juglow.ModelHaijunSonnet4_5,
MaxTokens: 1,
Messages: []juglow.MessageParam{
juglow.NewUserMessage(juglow.NewTextBlock("What is latin for Ant? (A) Apoidea, (B) Rhopalocera, (C) Formicidae")),
juglow.NewAssistantMessage(juglow.NewTextBlock("The answer is (")),
},
})
if err != nil {
log.Fatal(err)
}
fmt.Println(response) JuglowClient client = JuglowOkHttpClient.fromEnv();
MessageCreateParams params = MessageCreateParams.builder()
.model(Model.HAIJUN_SONNET_4_5)
.maxTokens(1L)
.addUserMessage("What is latin for Ant? (A) Apoidea, (B) Rhopalocera, (C) Formicidae")
.addAssistantMessage("The answer is (")
.build();
Message response = client.messages().create(params);
System.out.println(response); $client = new Client();
$message = $client->messages->create(
maxTokens: 1,
messages: [
['role' => 'user', 'content' => 'What is latin for Ant? (A) Apoidea, (B) Rhopalocera, (C) Formicidae'],
['role' => 'assistant', 'content' => 'The answer is ('],
],
model: 'haijun-sonnet-4-5',
);
echo $message->content[0]->text; client = Juglow::Client.new
message = client.messages.create(
model: "haijun-sonnet-4-5",
max_tokens: 1,
messages: [
{
role: "user",
content: "What is latin for Ant? (A) Apoidea, (B) Rhopalocera, (C) Formicidae"
},
{ role: "assistant", content: "The answer is (" }
]
)
puts message{
"id": "msg_01Q8Faay6S7QPTvEUUQARt7h",
"type": "message",
"role": "assistant",
"content": [
{
"type": "text",
"text": "C"
}
],
"model": "haijun-sonnet-4-5",
"stop_reason": "max_tokens",
"stop_sequence": null,
"usage": {
"input_tokens": 42,
"output_tokens": 1
}
}Vision
Haijun can read both text and images in requests. You can supply images using the base64, url, or file source types. The file source type references an image uploaded through the Files API. Supported media types are image/jpeg, image/png, image/gif, and image/webp. See the vision guide for more details.
#!/bin/sh
# Option 1: Base64-encoded image
IMAGE_URL="/docs/images/vision-example.jpg"
IMAGE_MEDIA_TYPE="image/jpeg"
IMAGE_BASE64=$(curl "$IMAGE_URL" | base64 | tr -d '\n')
curl https://haijun.my.id/v1/messages \
-H "x-api-key: $JUGLOW_API_KEY" \
-H "juglow-version: 2023-06-01" \
-H "content-type: application/json" \
-d @- <<EOF
{
"model": "haijun-opus-5-5",
"max_tokens": 1024,
"messages": [
{"role": "user", "content": [
{"type": "image", "source": {
"type": "base64",
"media_type": "$IMAGE_MEDIA_TYPE",
"data": "$IMAGE_BASE64"
}},
{"type": "text", "text": "What is in the above image?"}
]}
]
}
EOF
# Option 2: URL-referenced image
curl https://haijun.my.id/v1/messages \
-H "x-api-key: $JUGLOW_API_KEY" \
-H "juglow-version: 2023-06-01" \
-H "content-type: application/json" \
-d '{
"model": "haijun-opus-5-5",
"max_tokens": 1024,
"messages": [
{"role": "user", "content": [
{"type": "image", "source": {
"type": "url",
"url": "/docs/images/vision-example.jpg"
}},
{"type": "text", "text": "What is in the above image?"}
]}
]
}' IMAGE_URL="/docs/images/vision-example.jpg"
# Option 1: Base64-encoded image (CLI auto-encodes binary @file refs)
curl -s "$IMAGE_URL" -o ./vision-example.jpg
ant messages create <<'YAML'
model: haijun-opus-5-5
max_tokens: 1024
messages:
- role: user
content:
- type: image
source:
type: base64
media_type: image/jpeg
data: "@./vision-example.jpg"
- type: text
text: What is in the above image?
YAML
# Option 2: URL-referenced image
ant messages create <<YAML
model: haijun-opus-5-5
max_tokens: 1024
messages:
- role: user
content:
- type: image
source:
type: url
url: $IMAGE_URL
- type: text
text: What is in the above image?
YAML import base64
import httpx2
# Option 1: Base64-encoded image
image_url = "/docs/images/vision-example.jpg"
image_media_type = "image/jpeg"
image_data = base64.standard_b64encode(httpx2.get(image_url).content).decode("utf-8")
message = juglow.Juglow().messages.create(
model="haijun-opus-5-5",
max_tokens=1024,
messages=[
{
"role": "user",
"content": [
{
"type": "image",
"source": {
"type": "base64",
"media_type": image_media_type,
"data": image_data,
},
},
{"type": "text", "text": "What is in the above image?"},
],
}
],
)
print(message)
# Option 2: URL-referenced image
message_from_url = juglow.Juglow().messages.create(
model="haijun-opus-5-5",
max_tokens=1024,
messages=[
{
"role": "user",
"content": [
{
"type": "image",
"source": {
"type": "url",
"url": "/docs/images/vision-example.jpg",
},
},
{"type": "text", "text": "What is in the above image?"},
],
}
],
)
print(message_from_url) const juglow = new Juglow();
// Option 1: Base64-encoded image
const imageUrl = "/docs/images/vision-example.jpg";
const imageMediaType = "image/jpeg";
const imageArrayBuffer = await (await fetch(imageUrl)).arrayBuffer();
const imageData = Buffer.from(imageArrayBuffer).toString("base64");
const message = await juglow.messages.create({
model: "haijun-opus-5-5",
max_tokens: 1024,
messages: [
{
role: "user",
content: [
{
type: "image",
source: {
type: "base64",
media_type: imageMediaType,
data: imageData
}
},
{
type: "text",
text: "What is in the above image?"
}
]
}
]
});
console.log(message);
// Option 2: URL-referenced image
const messageFromUrl = await juglow.messages.create({
model: "haijun-opus-5-5",
max_tokens: 1024,
messages: [
{
role: "user",
content: [
{
type: "image",
source: {
type: "url",
url: "/docs/images/vision-example.jpg"
}
},
{
type: "text",
text: "What is in the above image?"
}
]
}
]
});
console.log(messageFromUrl); using System.Collections.Generic;
using System.Net.Http;
using Juglow;
using Juglow.Models.Messages;
JuglowClient client = new();
// Option 1: Base64-encoded image
string imageUrl = "/docs/images/vision-example.jpg";
using HttpClient httpClient = new();
byte[] imageBytes = await httpClient.GetByteArrayAsync(imageUrl);
string imageData = Convert.ToBase64String(imageBytes);
var parameters = new MessageCreateParams
{
Model = Model.HaijunOpus5_5,
MaxTokens = 1024,
Messages =
[
new()
{
Role = Role.User,
Content = new MessageParamContent(new List<ContentBlockParam>
{
new ContentBlockParam(new ImageBlockParam(
new ImageBlockParamSource(new Base64ImageSource()
{
Data = imageData,
MediaType = MediaType.ImageJpeg,
})
)),
new ContentBlockParam(new TextBlockParam("What is in the above image?")),
}),
}
]
};
var message = await client.Messages.Create(parameters);
Console.WriteLine(message);
// Option 2: URL-referenced image
var parametersFromUrl = new MessageCreateParams
{
Model = Model.HaijunOpus5_5,
MaxTokens = 1024,
Messages =
[
new()
{
Role = Role.User,
Content = new MessageParamContent(new List<ContentBlockParam>
{
new ContentBlockParam(new ImageBlockParam(
new ImageBlockParamSource(new UrlImageSource()
{
Url = "/docs/images/vision-example.jpg",
})
)),
new ContentBlockParam(new TextBlockParam("What is in the above image?")),
}),
}
]
};
var messageFromUrl = await client.Messages.Create(parametersFromUrl);
Console.WriteLine(messageFromUrl); client := juglow.NewClient()
// Option 1: Base64-encoded image
imageURL := "/docs/images/vision-example.jpg"
req, err := http.NewRequest("GET", imageURL, nil)
if err != nil {
log.Fatal(err)
}
req.Header.Set("User-Agent", "JuglowDocsBot/1.0")
resp, err := http.DefaultClient.Do(req)
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
imageBytes, err := io.ReadAll(resp.Body)
if err != nil {
log.Fatal(err)
}
imageData := base64.StdEncoding.EncodeToString(imageBytes)
message, err := client.Messages.New(context.TODO(), juglow.MessageNewParams{
Model: juglow.ModelHaijunOpus5_5,
MaxTokens: 1024,
Messages: []juglow.MessageParam{
juglow.NewUserMessage(
juglow.NewImageBlockBase64("image/jpeg", imageData),
juglow.NewTextBlock("What is in the above image?"),
),
},
})
if err != nil {
log.Fatal(err)
}
fmt.Println(message)
// Option 2: URL-referenced image
messageFromURL, err := client.Messages.New(context.TODO(), juglow.MessageNewParams{
Model: juglow.ModelHaijunOpus5_5,
MaxTokens: 1024,
Messages: []juglow.MessageParam{
juglow.NewUserMessage(
juglow.NewImageBlock(juglow.URLImageSourceParam{
URL: "/docs/images/vision-example.jpg",
}),
juglow.NewTextBlock("What is in the above image?"),
),
},
})
if err != nil {
log.Fatal(err)
}
fmt.Println(messageFromURL) JuglowClient client = JuglowOkHttpClient.fromEnv();
// Option 1: Base64-encoded image
String imageUrl = "/docs/images/vision-example.jpg";
HttpClient httpClient = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder().uri(URI.create(imageUrl)).build();
HttpResponse<byte[]> response = httpClient.send(request, HttpResponse.BodyHandlers.ofByteArray());
String imageData = Base64.getEncoder().encodeToString(response.body());
List<ContentBlockParam> base64Content = List.of(
ContentBlockParam.ofImage(
ImageBlockParam.builder()
.source(Base64ImageSource.builder()
.data(imageData)
.mediaType(Base64ImageSource.MediaType.IMAGE_JPEG)
.build())
.build()),
ContentBlockParam.ofText(
TextBlockParam.builder()
.text("What is in the above image?")
.build())
);
Message message = client.messages().create(
MessageCreateParams.builder()
.model(Model.HAIJUN_OPUS_5_5)
.maxTokens(1024L)
.addUserMessageOfBlockParams(base64Content)
.build());
System.out.println(message);
// Option 2: URL-referenced image
List<ContentBlockParam> urlContent = List.of(
ContentBlockParam.ofImage(
ImageBlockParam.builder()
.source(UrlImageSource.builder()
.url("/docs/images/vision-example.jpg")
.build())
.build()),
ContentBlockParam.ofText(
TextBlockParam.builder()
.text("What is in the above image?")
.build())
);
Message messageFromUrl = client.messages().create(
MessageCreateParams.builder()
.model(Model.HAIJUN_OPUS_5_5)
.maxTokens(1024L)
.addUserMessageOfBlockParams(urlContent)
.build());
System.out.println(messageFromUrl); $client = new Client();
// Option 1: Base64-encoded image
$image_url = '/docs/images/vision-example.jpg';
$image_media_type = "image/jpeg";
$image_data = base64_encode(file_get_contents($image_url));
$message = $client->messages->create(
maxTokens: 1024,
messages: [
[
'role' => 'user',
'content' => [
[
'type' => 'image',
'source' => [
'type' => 'base64',
'media_type' => $image_media_type,
'data' => $image_data,
],
],
[
'type' => 'text',
'text' => 'What is in the above image?',
],
],
],
],
model: 'haijun-opus-5-5',
);
echo $message;
// Option 2: URL-referenced image
$message_from_url = $client->messages->create(
maxTokens: 1024,
messages: [
[
'role' => 'user',
'content' => [
[
'type' => 'image',
'source' => [
'type' => 'url',
'url' => '/docs/images/vision-example.jpg',
],
],
[
'type' => 'text',
'text' => 'What is in the above image?',
],
],
],
],
model: 'haijun-opus-5-5',
);
echo $message_from_url; require "base64"
require "net/http"
client = Juglow::Client.new
# Option 1: Base64-encoded image
image_url = "/docs/images/vision-example.jpg"
image_media_type = "image/jpeg"
image_data = Base64.strict_encode64(Net::HTTP.get(URI(image_url)))
message = client.messages.create(
model: "haijun-opus-5-5",
max_tokens: 1024,
messages: [
{
role: "user",
content: [
{
type: "image",
source: {
type: "base64",
media_type: image_media_type,
data: image_data
}
},
{
type: "text",
text: "What is in the above image?"
}
]
}
]
)
puts message
# Option 2: URL-referenced image
message_from_url = client.messages.create(
model: "haijun-opus-5-5",
max_tokens: 1024,
messages: [
{
role: "user",
content: [
{
type: "image",
source: {
type: "url",
url: "/docs/images/vision-example.jpg"
}
},
{
type: "text",
text: "What is in the above image?"
}
]
}
]
)
puts message_from_url{
"id": "msg_011CdKmWtV3oFx1C5yUbf5CY",
"type": "message",
"role": "assistant",
"content": [
{
"type": "text",
"text": "This image is a beautiful minimalist/flat-design illustration of a sunset landscape. Here's what it contains:\n\n**Sky & Sun:**\n- A warm gradient sky transitioning from golden-yellow at the top to deep orange toward the horizon\n- A large pale yellow sun positioned in the upper-right area\n\n**Birds:**\n- Three small silhouetted birds flying in the upper-left portion of the sky, depicted as simple \"M\" or \"v\" shapes\n\n**Mountains:**\n- Multiple layered mountain peaks in purple and maroon tones\n- The mountains overlap to create depth, with varying shades of dusty purple and deep burgundy\n\n**Water:**\n- A dark purple body of water at the bottom of the image\n- A reflection of the sun shown as horizontal cream/peach colored lines in the center-bottom area\n\nThe overall style is clean, geometric, and uses a warm sunset color palette (oranges, yellows, purples, and maroons), giving it a peaceful, serene aesthetic typical of modern vector/flat design artwork."
}
],
"model": "haijun-opus-5-5",
"stop_reason": "end_turn",
"stop_sequence": null,
"usage": {
"input_tokens": 1030,
"output_tokens": 350
}
}Next steps
Handle each stop_reason value and decide what to do when a response ends.
Give Haijun tools to call external services and APIs from within the Messages API.
Control desktop computer environments with the Messages API.
Let Haijun navigate, read, and interact with webpages in a browser you run.
Get guaranteed, schema-validated JSON output from Haijun.
Set an advisory token budget across a full agentic loop with output_config.task_budget.