API guides
GPT-6.1 Sol vs Opus 5.5: Native API Examples on SJolt
The two models use different native protocols on SJolt. Use these minimal requests and parsing rules to implement a model switch without losing the contract differences.

On SJolt, use openai/gpt-6.1-sol with Chat Completions or Responses, and anthropic/claude-opus-5-5 with Anthropic Messages. The shared LLM base URL is https://llm.sjolt.ai/v1. Switching between these models requires changing the protocol and parsing logic, not just the model string.
This guide focuses on integration. For task selection, evaluation criteria, and a worked cost example, use the companion model-selection article. The requests below follow SJolt’s current contracts and use placeholder credentials; they are not records of paid test calls.
Map the routes before writing a generic client
| Concern | GPT-6.1 Sol | Claude Opus 5.5 |
|---|---|---|
| Simple text endpoint | /v1/chat/completions | /v1/messages |
| Application tool workflow | /v1/responses | /v1/messages with native tool blocks |
| System instructions | system message, or Responses instructions | Top-level system field |
| Reasoning control | reasoning_effort or reasoning.effort | thinking plus output_config.effort |
| Final text location | choices[].message.content or Responses output items | Text blocks inside content[] |
Keep a small adapter for each protocol. The rest of your application can ask for a task result, but the adapter should preserve native request and response fields. Flattening everything to one message shape too early can discard reasoning state, tool calls, or completion status that a later turn needs.
Submit a simple Sol Chat Completions request
curl --request POST 'https://llm.sjolt.ai/v1/chat/completions' \
--header "Authorization: Bearer $SJOLT_API_KEY" \
--header 'Content-Type: application/json' \
--data '{
"model": "openai/gpt-6.1-sol",
"messages": [
{"role": "system", "content": "Use only supplied product facts. Mark missing information."},
{"role": "user", "content": "Draft three shot ideas for a blue ceramic mug. Do not invent dimensions or performance claims."}
],
"reasoning_effort": "medium",
"stream": false
}'For this SJolt route, omit max_tokens, max_completion_tokens, max_output_tokens, temperature, top_p, and top_k. They are rejected rather than silently applied. Reasoning remains enabled, with low, medium, high, xhigh, and max accepted. Read the assistant’s final content from the Chat Completions response and check the completion status before displaying it as complete.
Use this form for a simple text exchange. If the application needs tool calling with Sol, select Responses instead. The direct OpenAI documentation also distinguishes tool-enabled Responses from Sol Chat Completions; SJolt’s route documentation remains the reference for the fields shown here.
Use Responses for the Sol tool-workflow foundation
curl --request POST 'https://llm.sjolt.ai/v1/responses' \
--header "Authorization: Bearer $SJOLT_API_KEY" \
--header 'Content-Type: application/json' \
--data '{
"model": "openai/gpt-6.1-sol",
"instructions": "Return a concise brief and identify any missing product facts.",
"input": "Plan a single tabletop shot for a blue ceramic mug.",
"reasoning": {"effort": "medium"},
"stream": false
}'This is a minimal text request on the Responses route; it does not execute any application tool. When adding tools, implement the tool-result loop in the native format. Preserve prior response items and reasoning.encrypted_content unchanged when continuing the conversation according to SJolt’s documentation.
Raw Responses JSON contains typed output items. Collect output_text content from message items rather than assuming the first output item is the final answer. A reasoning item or tool call can appear before text. Retain the original response alongside any text you extract for the user interface.
Submit an Opus Messages request
curl --request POST 'https://llm.sjolt.ai/v1/messages' \
--header "x-api-key: $SJOLT_API_KEY" \
--header 'anthropic-version: 2023-06-01' \
--header 'Content-Type: application/json' \
--data '{
"model": "anthropic/claude-opus-5-5",
"max_tokens": 4096,
"system": "Use only supplied product facts. Mark missing information.",
"messages": [
{"role": "user", "content": "Draft three shot ideas for a blue ceramic mug. Do not invent dimensions or performance claims."}
],
"thinking": {"type": "adaptive"},
"output_config": {"effort": "medium"},
"stream": false
}'Opus requires max_tokens and accepts a positive value up to 128,000 on this route. That allowance includes thinking and final output. Adaptive thinking stays enabled; select its effort through output_config.effort. Put the system instruction outside the messages array.
Read final prose from blocks with type text inside content. Do not assume content is a single string or display a thinking block as the final answer. For continuing tool conversations, preserve the provider’s native blocks, including signed thinking blocks, and supply tool results in Messages format.
Handle differences at the adapter boundary
- Validate the model/protocol pair before submission; Opus is not exposed through SJolt Chat Completions or Responses.
- Keep each model’s reasoning controls separate instead of forwarding a universal settings object.
- Check HTTP errors and the provider completion status before accepting a response.
- For streaming, parse the protocol’s native event types rather than reusing one stream parser for both.
- Keep credentials on the server and preserve the conversation state needed by the selected protocol.
A response that stops at its output limit should be marked incomplete and handled deliberately. Avoid using a generic automatic retry for every failure: first determine whether the request is invalid, the service is unavailable, or the application simply needs a different output budget. Repeating an invalid request will not repair it.
Pass an approved brief to the media API
SJolt’s LLM calls return language-model responses. Image and video generation use the separate task API under https://sjolt.ai/sjolt-ai/v1. After a person approves the brief, your application can translate it into the selected media model’s input fields and submit that task.
Do not poll an LLM response ID through the media task endpoint. Maintain separate records for the planning exchange and the media generation task, then connect them in your own job record. That makes it possible to review which brief produced an asset without mixing two different API lifecycles.
Sources & further reading
Take the next idea into production.
Explore the models, test a workflow in the playground, and use the same request in your application.