curl --request PUT \
--url https://api.getoneprofile.ai/agent-training/sessions/{session_id}/rows/{row_id}/feedback/ \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '{
"feedback": ""
}'import requests
url = "https://api.getoneprofile.ai/agent-training/sessions/{session_id}/rows/{row_id}/feedback/"
payload = { "feedback": "" }
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({feedback: ''})
};
fetch('https://api.getoneprofile.ai/agent-training/sessions/{session_id}/rows/{row_id}/feedback/', 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.getoneprofile.ai/agent-training/sessions/{session_id}/rows/{row_id}/feedback/",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'feedback' => ''
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: <api-key>"
],
]);
$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.getoneprofile.ai/agent-training/sessions/{session_id}/rows/{row_id}/feedback/"
payload := strings.NewReader("{\n \"feedback\": \"\"\n}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("X-API-Key", "<api-key>")
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.put("https://api.getoneprofile.ai/agent-training/sessions/{session_id}/rows/{row_id}/feedback/")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"feedback\": \"\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.getoneprofile.ai/agent-training/sessions/{session_id}/rows/{row_id}/feedback/")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"feedback\": \"\"\n}"
response = http.request(request)
puts response.read_body{
"created_at": "2023-11-07T05:31:56Z",
"cycle": 123,
"error": "<string>",
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"progress": {
"done": 123,
"failed": 123,
"total": 123
},
"proposal": {
"changed": true,
"current_prompt": "<string>",
"proposed_prompt": "<string>",
"review": {
"summary": "<string>",
"changes": [
"<string>"
],
"example_after": "<string>",
"example_before": "<string>",
"example_label": "<string>"
},
"stale": false
},
"rows": [
{
"confidence": "high",
"credits_charged": 123,
"cycle": 123,
"error": "<string>",
"error_class": "timeout",
"feedback": "<string>",
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"inputs": {},
"outcome": "succeeded",
"position": 123,
"prior_feedback": [
{
"cycle": 123,
"feedback": "<string>",
"verdict": "good"
}
],
"reasoning": "<string>",
"skipped_reason": "<string>",
"sources": [
"<string>"
],
"status": "pending",
"steps": [
{
"action": "search",
"detail": "<string>",
"observation": "<string>",
"duration_ms": 123,
"outcome": "completed",
"thought": "<string>"
}
],
"verdict": "good",
"changed_fields": [
"<string>"
],
"previous_value": "<unknown>",
"previous_verdict": "good",
"value": "<unknown>"
}
],
"saved_agent_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"source_input_mappings": {},
"source_kind": "table",
"source_table_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"status": "running",
"updated_at": "2023-11-07T05:31:56Z"
}{
"detail": "<string>"
}{
"detail": "<string>"
}{
"detail": "<string>"
}{
"detail": "<string>",
"issues": [
{
"input": "<string>",
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>"
}
]
}{
"detail": "<string>"
}{
"detail": "<string>"
}{
"detail": "<string>"
}Save a row's verdict
Record this cycle’s good-or-bad verdict on one row’s output. A bad verdict must carry a note saying what to change; a good one carries none. A null verdict withdraws whatever was recorded.
curl --request PUT \
--url https://api.getoneprofile.ai/agent-training/sessions/{session_id}/rows/{row_id}/feedback/ \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '{
"feedback": ""
}'import requests
url = "https://api.getoneprofile.ai/agent-training/sessions/{session_id}/rows/{row_id}/feedback/"
payload = { "feedback": "" }
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({feedback: ''})
};
fetch('https://api.getoneprofile.ai/agent-training/sessions/{session_id}/rows/{row_id}/feedback/', 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.getoneprofile.ai/agent-training/sessions/{session_id}/rows/{row_id}/feedback/",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'feedback' => ''
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: <api-key>"
],
]);
$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.getoneprofile.ai/agent-training/sessions/{session_id}/rows/{row_id}/feedback/"
payload := strings.NewReader("{\n \"feedback\": \"\"\n}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("X-API-Key", "<api-key>")
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.put("https://api.getoneprofile.ai/agent-training/sessions/{session_id}/rows/{row_id}/feedback/")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"feedback\": \"\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.getoneprofile.ai/agent-training/sessions/{session_id}/rows/{row_id}/feedback/")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"feedback\": \"\"\n}"
response = http.request(request)
puts response.read_body{
"created_at": "2023-11-07T05:31:56Z",
"cycle": 123,
"error": "<string>",
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"progress": {
"done": 123,
"failed": 123,
"total": 123
},
"proposal": {
"changed": true,
"current_prompt": "<string>",
"proposed_prompt": "<string>",
"review": {
"summary": "<string>",
"changes": [
"<string>"
],
"example_after": "<string>",
"example_before": "<string>",
"example_label": "<string>"
},
"stale": false
},
"rows": [
{
"confidence": "high",
"credits_charged": 123,
"cycle": 123,
"error": "<string>",
"error_class": "timeout",
"feedback": "<string>",
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"inputs": {},
"outcome": "succeeded",
"position": 123,
"prior_feedback": [
{
"cycle": 123,
"feedback": "<string>",
"verdict": "good"
}
],
"reasoning": "<string>",
"skipped_reason": "<string>",
"sources": [
"<string>"
],
"status": "pending",
"steps": [
{
"action": "search",
"detail": "<string>",
"observation": "<string>",
"duration_ms": 123,
"outcome": "completed",
"thought": "<string>"
}
],
"verdict": "good",
"changed_fields": [
"<string>"
],
"previous_value": "<unknown>",
"previous_verdict": "good",
"value": "<unknown>"
}
],
"saved_agent_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"source_input_mappings": {},
"source_kind": "table",
"source_table_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"status": "running",
"updated_at": "2023-11-07T05:31:56Z"
}{
"detail": "<string>"
}{
"detail": "<string>"
}{
"detail": "<string>"
}{
"detail": "<string>",
"issues": [
{
"input": "<string>",
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>"
}
]
}{
"detail": "<string>"
}{
"detail": "<string>"
}{
"detail": "<string>"
}Authorizations
Body
One row's verdict, and the note a bad verdict has to carry.
What was wrong and how to change it. Required when the verdict is bad.
4000The reviewer's call on this row. Null withdraws it: an empty note no longer clears anything, because a good row is recorded without one.
good, bad Response
Successful Response
A whole training session, as the reviewer's page polls it.
Everything the page needs in one payload: the phase (status), the
cycle, the rows with their results and critiques, and the pending proposal
when there is one.
How far the current cycle's run has got.
Show child attributes
Show child attributes
A pending prompt revision, alongside what it would replace.
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Where a session's training inputs came from.
table, manual Where a training session stands: the state the reviewer's screen shows.
One enum rather than a separate lifecycle flag and phase, because the
phase IS the state: a session is either waiting on the machine
(RUNNING), waiting on the reviewer (REVIEWING, PROPOSED), or
finished. Callers never derive the screen from row counts.
running, reviewing, proposed, completed, abandoned Was this page helpful?