The ORYKSA model (OpenAI compatible)
Use ORYKSA as the AI model of any automation, in place of OpenAI or OpenRouter. Your n8n nodes talk to YouTube, Instagram, LinkedIn, Google Drive or Google Sheets with your own accounts; ORYKSA writes, summarises, classifies, extracts and decides which tool to call. The usage comes out of the interactions of your plan.
Two models
| Model | What it is |
|---|---|
oryksa | The general model. It follows your system prompt and your messages exactly as you send them. It supports tools, JSON output and streaming. It knows nothing about your account and never acts on it. This is the one that replaces OpenAI. |
oryksa-assistant | Your own ORYKSA assistant, with the knowledge and the data of your business. It only answers. Tools are ignored. |
Any other model name (for example gpt-4o, already written in a flow) is answered by oryksa, so existing flows keep working.
curl https://api.oryksa.com/v1/chat/completions \
-H "Authorization: Bearer oryk_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "oryksa",
"messages": [
{"role": "system", "content": "You write LinkedIn posts. Short, one idea, no hashtags."},
{"role": "user", "content": "New video: 5 mistakes when pricing your services."}
]
}'import os
from openai import OpenAI
client = OpenAI(api_key=os.environ["ORYKSA_API_KEY"], base_url="https://api.oryksa.com/v1")
out = client.chat.completions.create(
model="oryksa",
messages=[
{"role": "system", "content": "You write LinkedIn posts. Short, one idea, no hashtags."},
{"role": "user", "content": "New video: 5 mistakes when pricing your services."},
],
)
print(out.choices[0].message.content, out.usage.total_tokens)What is supported
| Feature | Support |
|---|---|
messages | system, developer, user, assistant and tool, whole and in order. Text and images (image_url with https or data:image, up to 4). |
tools, tool_choice | Function calling in the OpenAI format: the reply brings tool_calls and finish_reason: "tool_calls". |
response_format | json_object and json_schema. |
stream | Real server-sent events, piece by piece, tool calls included, ending with [DONE]. stream_options.include_usage is supported. |
usage | Real token counts. Your interactions come in the extra field oryksa. |
temperature, top_p, stop, seed, max_tokens, max_completion_tokens | Supported. |
n | Only 1. |
functions, function_call | Not supported: use tools. |
Tools
Send the tools your flow has. When the model wants one, it answers with the call; your flow runs it and sends the result back in a tool message. Each reply of the model uses one interaction, so an agent that takes 4 turns uses 4.
{
"model": "oryksa",
"messages": [{"role": "user", "content": "Add Ana with 3 units to the sheet"}],
"tools": [{
"type": "function",
"function": {
"name": "sheets_append",
"description": "Append a row to the sheet",
"parameters": {"type": "object", "properties": {"row": {"type": "array", "items": {"type": "string"}}}, "required": ["row"]}
}
}]
}{
"id": "chatcmpl-8f1c2a7e5b9d4c3fa1e0b6d2c4f7a9e1",
"object": "chat.completion",
"created": 1791072000,
"model": "oryksa",
"choices": [{
"index": 0,
"message": {
"role": "assistant",
"content": null,
"tool_calls": [{"id": "call_1", "type": "function", "function": {"name": "sheets_append", "arguments": "{\"row\": [\"Ana\", \"3\"]}"}}]
},
"finish_reason": "tool_calls"
}],
"usage": {"prompt_tokens": 96, "completion_tokens": 18, "total_tokens": 114},
"oryksa": {"interactions_spent": 1, "interactions_remaining": 2873, "interactions_limit": 3000}
}JSON output
For extraction and classification, ask for a fixed shape:
"response_format": {
"type": "json_schema",
"json_schema": {
"name": "lead",
"strict": true,
"schema": {
"type": "object",
"properties": {"name": {"type": "string"}, "email": {"type": "string"}},
"required": ["name", "email"],
"additionalProperties": false
}
}
}Limits
| Limit | Value |
|---|---|
| Text in one request (messages, tool definitions, tool arguments) | 32 000 characters |
| Reply | 2 000 tokens (a higher max_tokens is limited to this; a reply that does not fit ends with finish_reason: "length") |
| Requests | 60 per minute per account |
| Images | 4 per request |
Above a limit the API answers 400 and names the field in param. Nothing is ever cut in silence.
Interactions
One interaction for each reply the model generates, the same count as every other channel. When the plan has none left the API answers 402 interaction_limit_reached.
Use it in n8n
- In n8n, create a credential of type OpenAI. In API Key paste your
oryk_live_key and in Base URL writehttps://api.oryksa.com/v1. - In any node that takes a chat model (AI Agent, Basic LLM Chain, Information Extractor, Text Classifier, Summarization Chain), add an OpenAI Chat Model with that credential and choose the model
oryksa. - The Use Responses API option can be on or off: ORYKSA answers in both formats.
- Connect your other nodes (YouTube, Google Sheets, Google Drive, LinkedIn) with your own accounts, as you would with any other model.
Errors
| Code | What it is |
|---|---|
400 invalid_request | The body is not valid. param names the field. |
400 input_too_large | More than 32 000 characters of text. |
400 content_policy | The request was refused by the content safety filter. |
402 interaction_limit_reached | No interactions left in this period. |
429 rate_limited | More than 60 requests per minute. |
503 model_unavailable | The model is not available right now. Try again in a moment. |
Label your requests in the usage statement
In the HTTP Request node, turn on Send Headers and add:
X-Oryksa-Source=n8nX-Oryksa-Workflow={{ encodeURIComponent($workflow.name) }}X-Oryksa-Workflow-Id={{ $workflow.id }}X-Oryksa-Execution-Id={{ $execution.id }}
In the OpenAI node you can only set a fixed header, in the credential: add X-Oryksa-Source = n8n. The statement then shows n8n, without the name of the workflow. To see each workflow, use the HTTP Request node.
Make and Zapier work the same way, with make or zapier in X-Oryksa-Source.
Responses API
POST https://api.oryksa.com/v1/responses is OpenAI's Responses format over the same model as /v1/chat/completions. It is for the nodes and libraries that already use that format: change only the base URL and the key.
What works: input (text or a list of messages), instructions, function tools (tools, tool_choice, and the function_call and function_call_output items in the conversation), JSON output (text.format with json_object or json_schema), max_output_tokens, temperature, top_p and stream.
What does not exist: OpenAI's own tools (web search, file search, code interpreter) and stored conversations. ORYKSA stores nothing: store is always false and previous_response_id returns a 400 error. Send the whole conversation in each request.
Cost: 1 interaction per reply, the same as /v1/chat/completions. Limits: the same (32,000 characters of text per request, a reply of up to 2,000 tokens, 60 requests a minute). Nothing is charged when a request fails.
The models are the same: oryksa (the general model; any other name is treated as oryksa) and oryksa-assistant (your assistant, answer only).
curl https://api.oryksa.com/v1/responses \
-H "Authorization: Bearer oryk_live_..." -H "Content-Type: application/json" \
-d '{"model": "oryksa", "instructions": "Answer in one sentence.", "input": "What is an embedding?"}'Embeddings
POST https://api.oryksa.com/v1/embeddings turns texts into vectors, in OpenAI's format, for search by meaning and knowledge bases (for example the vector nodes of n8n).
Send input (one text or a list of texts; up to 256 texts and 32,000 characters in all per request). Optional: dimensions and encoding_format (float or base64). The model field is accepted and ignored: the model is always oryksa-embeddings.
Cost: 1 interaction per request, whatever the number of texts. Nothing is charged when a request fails.
Important: vectors can only be compared with vectors made by the same model. Do not mix, in the same store, ORYKSA vectors with vectors from another provider.
curl https://api.oryksa.com/v1/embeddings \
-H "Authorization: Bearer oryk_live_..." -H "Content-Type: application/json" \
-d '{"input": ["first text", "second text"]}'
