curl --request POST \
--url https://api.example.com/v1/reasoning_jobs \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"dataframe": {
"plan": {},
"columns": [
{
"name": "<string>",
"datatype": {
"kind": "string"
}
}
],
"version": 1
},
"job_tags": {},
"task": {
"label_column": "<string>",
"task_kind": "regression"
},
"metrics": [
"<string>"
],
"hpo_space": {
"models": [
{
"family": "<string>",
"search": {},
"fixed": {}
}
]
},
"optimizer": {
"kind": "tpe",
"n_trials_per_step": 2,
"n_steps": 2
},
"random_state": 42
}
'import requests
url = "https://api.example.com/v1/reasoning_jobs"
payload = {
"dataframe": {
"plan": {},
"columns": [
{
"name": "<string>",
"datatype": { "kind": "string" }
}
],
"version": 1
},
"job_tags": {},
"task": {
"label_column": "<string>",
"task_kind": "regression"
},
"metrics": ["<string>"],
"hpo_space": { "models": [
{
"family": "<string>",
"search": {},
"fixed": {}
}
] },
"optimizer": {
"kind": "tpe",
"n_trials_per_step": 2,
"n_steps": 2
},
"random_state": 42
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
dataframe: {
plan: {},
columns: [{name: '<string>', datatype: {kind: 'string'}}],
version: 1
},
job_tags: {},
task: {label_column: '<string>', task_kind: 'regression'},
metrics: ['<string>'],
hpo_space: {models: [{family: '<string>', search: {}, fixed: {}}]},
optimizer: {kind: 'tpe', n_trials_per_step: 2, n_steps: 2},
random_state: 42
})
};
fetch('https://api.example.com/v1/reasoning_jobs', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.example.com/v1/reasoning_jobs",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'dataframe' => [
'plan' => [
],
'columns' => [
[
'name' => '<string>',
'datatype' => [
'kind' => 'string'
]
]
],
'version' => 1
],
'job_tags' => [
],
'task' => [
'label_column' => '<string>',
'task_kind' => 'regression'
],
'metrics' => [
'<string>'
],
'hpo_space' => [
'models' => [
[
'family' => '<string>',
'search' => [
],
'fixed' => [
]
]
]
],
'optimizer' => [
'kind' => 'tpe',
'n_trials_per_step' => 2,
'n_steps' => 2
],
'random_state' => 42
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.example.com/v1/reasoning_jobs"
payload := strings.NewReader("{\n \"dataframe\": {\n \"plan\": {},\n \"columns\": [\n {\n \"name\": \"<string>\",\n \"datatype\": {\n \"kind\": \"string\"\n }\n }\n ],\n \"version\": 1\n },\n \"job_tags\": {},\n \"task\": {\n \"label_column\": \"<string>\",\n \"task_kind\": \"regression\"\n },\n \"metrics\": [\n \"<string>\"\n ],\n \"hpo_space\": {\n \"models\": [\n {\n \"family\": \"<string>\",\n \"search\": {},\n \"fixed\": {}\n }\n ]\n },\n \"optimizer\": {\n \"kind\": \"tpe\",\n \"n_trials_per_step\": 2,\n \"n_steps\": 2\n },\n \"random_state\": 42\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.example.com/v1/reasoning_jobs")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"dataframe\": {\n \"plan\": {},\n \"columns\": [\n {\n \"name\": \"<string>\",\n \"datatype\": {\n \"kind\": \"string\"\n }\n }\n ],\n \"version\": 1\n },\n \"job_tags\": {},\n \"task\": {\n \"label_column\": \"<string>\",\n \"task_kind\": \"regression\"\n },\n \"metrics\": [\n \"<string>\"\n ],\n \"hpo_space\": {\n \"models\": [\n {\n \"family\": \"<string>\",\n \"search\": {},\n \"fixed\": {}\n }\n ]\n },\n \"optimizer\": {\n \"kind\": \"tpe\",\n \"n_trials_per_step\": 2,\n \"n_steps\": 2\n },\n \"random_state\": 42\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/v1/reasoning_jobs")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"dataframe\": {\n \"plan\": {},\n \"columns\": [\n {\n \"name\": \"<string>\",\n \"datatype\": {\n \"kind\": \"string\"\n }\n }\n ],\n \"version\": 1\n },\n \"job_tags\": {},\n \"task\": {\n \"label_column\": \"<string>\",\n \"task_kind\": \"regression\"\n },\n \"metrics\": [\n \"<string>\"\n ],\n \"hpo_space\": {\n \"models\": [\n {\n \"family\": \"<string>\",\n \"search\": {},\n \"fixed\": {}\n }\n ]\n },\n \"optimizer\": {\n \"kind\": \"tpe\",\n \"n_trials_per_step\": 2,\n \"n_steps\": 2\n },\n \"random_state\": 42\n}"
response = http.request(request)
puts response.read_body{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}Create reasoning job
Submit a reasoning fit job and return its resource id.
Reasoning reuses the training optimize loop over the surrogate search
space: build the OptimizationContext + bootstrap the optimizer, emit round 0 of
a training/fit ×(n_trials_per_step) → training/reduce graph (run for
n_steps rounds), pickle the context (+ flat finalize plan, + the terminal
reasoning/finalize spec) to S3, and put a
:class:RequestToComputeGraph on the scheduler’s in-process inbox. The
terminal reduce appends reasoning/finalize once the optimizer is done.
The router never touches jobs or computation_node — it only builds +
ships. Synthetic-data generation and teacher distillation were removed from
the API server.
curl --request POST \
--url https://api.example.com/v1/reasoning_jobs \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"dataframe": {
"plan": {},
"columns": [
{
"name": "<string>",
"datatype": {
"kind": "string"
}
}
],
"version": 1
},
"job_tags": {},
"task": {
"label_column": "<string>",
"task_kind": "regression"
},
"metrics": [
"<string>"
],
"hpo_space": {
"models": [
{
"family": "<string>",
"search": {},
"fixed": {}
}
]
},
"optimizer": {
"kind": "tpe",
"n_trials_per_step": 2,
"n_steps": 2
},
"random_state": 42
}
'import requests
url = "https://api.example.com/v1/reasoning_jobs"
payload = {
"dataframe": {
"plan": {},
"columns": [
{
"name": "<string>",
"datatype": { "kind": "string" }
}
],
"version": 1
},
"job_tags": {},
"task": {
"label_column": "<string>",
"task_kind": "regression"
},
"metrics": ["<string>"],
"hpo_space": { "models": [
{
"family": "<string>",
"search": {},
"fixed": {}
}
] },
"optimizer": {
"kind": "tpe",
"n_trials_per_step": 2,
"n_steps": 2
},
"random_state": 42
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
dataframe: {
plan: {},
columns: [{name: '<string>', datatype: {kind: 'string'}}],
version: 1
},
job_tags: {},
task: {label_column: '<string>', task_kind: 'regression'},
metrics: ['<string>'],
hpo_space: {models: [{family: '<string>', search: {}, fixed: {}}]},
optimizer: {kind: 'tpe', n_trials_per_step: 2, n_steps: 2},
random_state: 42
})
};
fetch('https://api.example.com/v1/reasoning_jobs', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.example.com/v1/reasoning_jobs",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'dataframe' => [
'plan' => [
],
'columns' => [
[
'name' => '<string>',
'datatype' => [
'kind' => 'string'
]
]
],
'version' => 1
],
'job_tags' => [
],
'task' => [
'label_column' => '<string>',
'task_kind' => 'regression'
],
'metrics' => [
'<string>'
],
'hpo_space' => [
'models' => [
[
'family' => '<string>',
'search' => [
],
'fixed' => [
]
]
]
],
'optimizer' => [
'kind' => 'tpe',
'n_trials_per_step' => 2,
'n_steps' => 2
],
'random_state' => 42
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.example.com/v1/reasoning_jobs"
payload := strings.NewReader("{\n \"dataframe\": {\n \"plan\": {},\n \"columns\": [\n {\n \"name\": \"<string>\",\n \"datatype\": {\n \"kind\": \"string\"\n }\n }\n ],\n \"version\": 1\n },\n \"job_tags\": {},\n \"task\": {\n \"label_column\": \"<string>\",\n \"task_kind\": \"regression\"\n },\n \"metrics\": [\n \"<string>\"\n ],\n \"hpo_space\": {\n \"models\": [\n {\n \"family\": \"<string>\",\n \"search\": {},\n \"fixed\": {}\n }\n ]\n },\n \"optimizer\": {\n \"kind\": \"tpe\",\n \"n_trials_per_step\": 2,\n \"n_steps\": 2\n },\n \"random_state\": 42\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.example.com/v1/reasoning_jobs")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"dataframe\": {\n \"plan\": {},\n \"columns\": [\n {\n \"name\": \"<string>\",\n \"datatype\": {\n \"kind\": \"string\"\n }\n }\n ],\n \"version\": 1\n },\n \"job_tags\": {},\n \"task\": {\n \"label_column\": \"<string>\",\n \"task_kind\": \"regression\"\n },\n \"metrics\": [\n \"<string>\"\n ],\n \"hpo_space\": {\n \"models\": [\n {\n \"family\": \"<string>\",\n \"search\": {},\n \"fixed\": {}\n }\n ]\n },\n \"optimizer\": {\n \"kind\": \"tpe\",\n \"n_trials_per_step\": 2,\n \"n_steps\": 2\n },\n \"random_state\": 42\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/v1/reasoning_jobs")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"dataframe\": {\n \"plan\": {},\n \"columns\": [\n {\n \"name\": \"<string>\",\n \"datatype\": {\n \"kind\": \"string\"\n }\n }\n ],\n \"version\": 1\n },\n \"job_tags\": {},\n \"task\": {\n \"label_column\": \"<string>\",\n \"task_kind\": \"regression\"\n },\n \"metrics\": [\n \"<string>\"\n ],\n \"hpo_space\": {\n \"models\": [\n {\n \"family\": \"<string>\",\n \"search\": {},\n \"fixed\": {}\n }\n ]\n },\n \"optimizer\": {\n \"kind\": \"tpe\",\n \"n_trials_per_step\": 2,\n \"n_steps\": 2\n },\n \"random_state\": 42\n}"
response = http.request(request)
puts response.read_body{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}Authorizations
An API key or OAuth2/OIDC access token sent as Authorization: Bearer <token>.
Body
Serialized DataFrame plan over the org's registered sources. The server rebuilds the org's Context, deserializes this against it, and materializes the (possibly filtered/derived) fit rows. The leaf source must be a registered source_table.
Show child attributes
Show child attributes
Caller-supplied tags echoed on the reasoning job resource.
Show child attributes
Show child attributes
Learning task and its target columns (a discriminated union on task_kind). Required.
- Regression
- Binclass
- Multiclass
- Forecasting
- SequenceRegression
- SequenceBinclass
- SequenceMulticlass
Show child attributes
Show child attributes
HPO objective metric names (e.g. 'neg_rmse', 'neg_class_error', 'auc'). Order is objective order; passing more than one runs multi-objective (Pareto) search. If omitted, the server uses the task default (neg_rmse for regression, neg_class_error otherwise).
The surrogate search space, which also selects the model families to search over. May contain multiple families; HPO returns the single best surrogate (reasoning does not build ensembles). Each family must be one of ['tabm', 'tabicl', 'xrfm']. If omitted, the server fits tabm.
Show child attributes
Show child attributes
How to search the surrogate space: sampler ('tpe'/'random'/'cmaes') and a round-structured trial budget (n_trials_per_step x n_steps). If omitted, the server uses a default.
Show child attributes
Show child attributes
Response
Successful Response